Json 如何处理while 1循环中的值错误,并使用计时器类对其进行调度

Json 如何处理while 1循环中的值错误,并使用计时器类对其进行调度,json,python-2.7,raspberry-pi,modbus,Json,Python 2.7,Raspberry Pi,Modbus,我写了一个代码来读取modbus通信协议的寄存器。我也附上了下面的代码。。我能够通过异常处理方法克服i/o错误,其中作为我得到的值错误,我不能抛出该错误并继续。 基本上,我所做的是读取寄存器中的数据并发送到服务器。但我的要求是我必须在24小时内每秒读取一次数值。因此,我需要构建一个健壮的系统来克服这些值错误,并继续执行我创建的线程。 读取寄存器的代码如下所示: import minimalmodbus import serial from ctypes import * import struc

我写了一个代码来读取modbus通信协议的寄存器。我也附上了下面的代码。。我能够通过异常处理方法克服i/o错误,其中作为我得到的值错误,我不能抛出该错误并继续。 基本上,我所做的是读取寄存器中的数据并发送到服务器。但我的要求是我必须在24小时内每秒读取一次数值。因此,我需要构建一个健壮的系统来克服这些值错误,并继续执行我创建的线程。 读取寄存器的代码如下所示:

import minimalmodbus
import serial
from ctypes import *
import struct
import time

minimalmodbus.BAUDRATE = 9600
minimalmodbus.PARITY = serial.PARITY_NONE
minimalmodbus.BYTESIZE = 8
minimalmodbus.TIMEOUT=5
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL = True
energy_meter = serial.Serial("/dev/ttyUSB0", baudrate=9600,
                            parity=serial.PARITY_NONE,
                            stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=5)
energy_meter = minimalmodbus.Instrument('/dev/ttyUSB0', 2, mode='rtu')
#energy_meter.debug = True


def convert_in_float(value1, value2):
    raw = struct.pack('>HH',value1,value2)
    ans = struct.unpack('>f', raw)[0]
    return ans

def sdm630():
    parameter_list1 = [ 0 ] * 0x12
    parameter_list2 = [ 0 ] * 3
    parameter_list3 = [ 0 ] * 6
    #print energy_meter
    error = 0
    try:
            index = 0
            read_values1  = energy_meter.read_registers( 0 , 0x24, 4)
            for i in range ( 0, 0x24, 2):
                    parameter_list1[index] = convert_in_float( read_values1[i], read_values1[i+1])
                    #print "Parameter read from register : ", hex(index), "is : ", parameter_list1[index] ,"\n"
                    index = index + 1
   #read parameter list 2 & 3 in a similar way
            error = 0
            return error, parameter_list1, parameter_list2, parameter_list3, int(time.time())
    except IOError or ValueError:
            print "got error"
            error = 1
            return error, parameter_list1, parameter_list2, parameter_list3, int(time.time())
  import time
  from threading import Thread
  from threading import Timer
  from Queue import Queue
  from modbus import sdm630
  from dumpInDB import pushData
  from processData import process_the_data

  DELAY_SEC = 1
  DELAY_MIN = 60
  LOOP_LIMIT = 60


  def getData(q):
    error, parameter_list1, parameter_list2 , parameter_list3, parameter_list4= sdm630()
    print "In getData - data:", parameter_list1, parameter_list2
    q.put([error, parameter_list1, parameter_list2, parameter_list3, parameter_list4])

  def processData(q1,q2):
    sec_data = q1.get()
    min_data =  process_the_data(sec_data)
    print "In processData - data:", sec_data, min_data
    q2.put(min_data)
    print "queue:", q2.qsize()

 def putData(q):
    #print "In putData - data:", value[0], value[1], value[2]
    for i in range(0, q.qsize()):
            value = q.get()
            print "In putData - data:", value[0], value[1], value[2], value[3]
            pushData( value[0], value[1] , value[2], value[3] , value[4])

 def thread1(threadName, q):
    i = 0
    while 1:
            t = Timer( DELAY_SEC, getData, args = (q,))
            t.start()
            time.sleep(DELAY_SEC)

 def thread2( threadName, q1,q2):
    i = 0
    print "in thread2"
    while 1:
    t = Timer( DELAY_SEC, processData,  args = (q1,q2,))
            t.start()
            time.sleep(DELAY_SEC)

 def thread3( threadName, q):
    i = 0
    print "in thread3"
    while 1:
            t = Timer( DELAY_MIN, putData, args =  (q,))
            t.start()
            print "schedule time - min"
            time.sleep(DELAY_MIN)


  queue_second = Queue()
  queue_minute = Queue()
  thread1 = Thread( target=thread1, args=("Thread-1", queue_second) )
  thread2 = Thread( target=thread2, args=("Thread-2", queue_second,      queue_minute) )
  thread3 = Thread( target=thread3, args=("Thread-3", queue_minute) )

  thread1.start()
  thread2.start()
  thread3.start()
  thread1.join()
  thread2.join()
  thread3.join()
此外,我还编写了一个单独的代码将所有数据转储到服务器,如下所示:

import time
from pymongo import MongoClient

client = MongoClient('mongodb://10.32.36.40:27017')
db = client.clytics
collection = db['raspberry_pi']



 def pushData(error, value1, value2, value3, value4):
    if error == 0 :
            temp_js = {
            #variable assignment
            }
            temp_js_id = collection.insert(temp_js)
  minimalmodbus.Instrument<id=0xb6b2d9b8, address=2, mode=rtu,          close_port_after_each_call=True, precalculate_read_size=True, debug=False, serial=Serial<id=0xb6b482f0, open=False>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=5, xonxoff=False, rtscts=False, dsrdtr=False)>
  Traceback (most recent call last):
  File "topScript.py", line 7, in <module>
  from modbus import sdm630
  File "/home/pi/scripts/modbus.py", line 60, in <module>
sdm630()
 File "/home/pi/scripts/modbus.py", line 32, in sdm630
 read_values1  = energy_meter.read_registers( 0 , 0x24, 4)
   File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 498, in read_registers
   numberOfRegisters=numberOfRegisters, payloadformat='registers')
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 697, in _genericCommand
    payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 798, in _performCommand
    payloadFromSlave = _extractPayload(response, self.address, self.mode, functioncode)
   File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 1075, in _extractPayload
   raise ValueError(text)
   ValueError: Checksum error in rtu mode: '\xa6\xe6' instead of '\xf7[' .    The response is: '\xff\xf7HCeN\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x80\x00\x00?\x80\x00\x00?\x80\x00\x00\xa6\xe6' (plain response: '\xff\xf7HCeN\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
使用以上两个代码,我为每个函数创建了线程。我只执行这段代码,在执行20分钟后,我得到了值错误,程序不再执行。主要程序如下所示:

import minimalmodbus
import serial
from ctypes import *
import struct
import time

minimalmodbus.BAUDRATE = 9600
minimalmodbus.PARITY = serial.PARITY_NONE
minimalmodbus.BYTESIZE = 8
minimalmodbus.TIMEOUT=5
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL = True
energy_meter = serial.Serial("/dev/ttyUSB0", baudrate=9600,
                            parity=serial.PARITY_NONE,
                            stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=5)
energy_meter = minimalmodbus.Instrument('/dev/ttyUSB0', 2, mode='rtu')
#energy_meter.debug = True


def convert_in_float(value1, value2):
    raw = struct.pack('>HH',value1,value2)
    ans = struct.unpack('>f', raw)[0]
    return ans

def sdm630():
    parameter_list1 = [ 0 ] * 0x12
    parameter_list2 = [ 0 ] * 3
    parameter_list3 = [ 0 ] * 6
    #print energy_meter
    error = 0
    try:
            index = 0
            read_values1  = energy_meter.read_registers( 0 , 0x24, 4)
            for i in range ( 0, 0x24, 2):
                    parameter_list1[index] = convert_in_float( read_values1[i], read_values1[i+1])
                    #print "Parameter read from register : ", hex(index), "is : ", parameter_list1[index] ,"\n"
                    index = index + 1
   #read parameter list 2 & 3 in a similar way
            error = 0
            return error, parameter_list1, parameter_list2, parameter_list3, int(time.time())
    except IOError or ValueError:
            print "got error"
            error = 1
            return error, parameter_list1, parameter_list2, parameter_list3, int(time.time())
  import time
  from threading import Thread
  from threading import Timer
  from Queue import Queue
  from modbus import sdm630
  from dumpInDB import pushData
  from processData import process_the_data

  DELAY_SEC = 1
  DELAY_MIN = 60
  LOOP_LIMIT = 60


  def getData(q):
    error, parameter_list1, parameter_list2 , parameter_list3, parameter_list4= sdm630()
    print "In getData - data:", parameter_list1, parameter_list2
    q.put([error, parameter_list1, parameter_list2, parameter_list3, parameter_list4])

  def processData(q1,q2):
    sec_data = q1.get()
    min_data =  process_the_data(sec_data)
    print "In processData - data:", sec_data, min_data
    q2.put(min_data)
    print "queue:", q2.qsize()

 def putData(q):
    #print "In putData - data:", value[0], value[1], value[2]
    for i in range(0, q.qsize()):
            value = q.get()
            print "In putData - data:", value[0], value[1], value[2], value[3]
            pushData( value[0], value[1] , value[2], value[3] , value[4])

 def thread1(threadName, q):
    i = 0
    while 1:
            t = Timer( DELAY_SEC, getData, args = (q,))
            t.start()
            time.sleep(DELAY_SEC)

 def thread2( threadName, q1,q2):
    i = 0
    print "in thread2"
    while 1:
    t = Timer( DELAY_SEC, processData,  args = (q1,q2,))
            t.start()
            time.sleep(DELAY_SEC)

 def thread3( threadName, q):
    i = 0
    print "in thread3"
    while 1:
            t = Timer( DELAY_MIN, putData, args =  (q,))
            t.start()
            print "schedule time - min"
            time.sleep(DELAY_MIN)


  queue_second = Queue()
  queue_minute = Queue()
  thread1 = Thread( target=thread1, args=("Thread-1", queue_second) )
  thread2 = Thread( target=thread2, args=("Thread-2", queue_second,      queue_minute) )
  thread3 = Thread( target=thread3, args=("Thread-3", queue_minute) )

  thread1.start()
  thread2.start()
  thread3.start()
  thread1.join()
  thread2.join()
  thread3.join()
我被这个错误缠住了。如下所示:

import time
from pymongo import MongoClient

client = MongoClient('mongodb://10.32.36.40:27017')
db = client.clytics
collection = db['raspberry_pi']



 def pushData(error, value1, value2, value3, value4):
    if error == 0 :
            temp_js = {
            #variable assignment
            }
            temp_js_id = collection.insert(temp_js)
  minimalmodbus.Instrument<id=0xb6b2d9b8, address=2, mode=rtu,          close_port_after_each_call=True, precalculate_read_size=True, debug=False, serial=Serial<id=0xb6b482f0, open=False>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=5, xonxoff=False, rtscts=False, dsrdtr=False)>
  Traceback (most recent call last):
  File "topScript.py", line 7, in <module>
  from modbus import sdm630
  File "/home/pi/scripts/modbus.py", line 60, in <module>
sdm630()
 File "/home/pi/scripts/modbus.py", line 32, in sdm630
 read_values1  = energy_meter.read_registers( 0 , 0x24, 4)
   File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 498, in read_registers
   numberOfRegisters=numberOfRegisters, payloadformat='registers')
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 697, in _genericCommand
    payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
    File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 798, in _performCommand
    payloadFromSlave = _extractPayload(response, self.address, self.mode, functioncode)
   File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 1075, in _extractPayload
   raise ValueError(text)
   ValueError: Checksum error in rtu mode: '\xa6\xe6' instead of '\xf7[' .    The response is: '\xff\xf7HCeN\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x80\x00\x00?\x80\x00\x00?\x80\x00\x00\xa6\xe6' (plain response: '\xff\xf7HCeN\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
modbus.仪器
回溯(最近一次呼叫最后一次):
文件“topScript.py”,第7行,在
从modbus导入sdm630
文件“/home/pi/scripts/modbus.py”,第60行,输入
sdm630()
sdm630中第32行的文件“/home/pi/scripts/modbus.py”
读取值1=电能表。读取寄存器(0,0x24,4)
文件“/usr/local/lib/python2.7/dist packages/minimamodbus.py”,第498行,在读_寄存器中
numberOfRegisters=numberOfRegisters,payloadformat='registers')
文件“/usr/local/lib/python2.7/dist packages/minimamodbus.py”,第697行,在_generic命令中
payloadFromSlave=self.\u性能命令(功能代码,payloadToSlave)
文件“/usr/local/lib/python2.7/dist packages/minimamodbus.py”,第798行,在performCommand中
payloadFromSlave=\u提取有效负载(响应、self.address、self.mode、函数代码)
文件“/usr/local/lib/python2.7/dist packages/minimamodbus.py”,第1075行,在
提升值错误(文本)
ValueError:rtu模式下的校验和错误:'\xa6\xe6'而不是'\xf7'该公司的反应是:“\xf\xf\xf\xf\xf\xf\xf\xf7 HC7 7 7 HCen\XC\X7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0\x00\x00?\x80\x00\x00?\x80\x00\x00\xa6\xe6'(简单回答:'\xff\xf7HCeN\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\

有时值错误会持续弹出一段时间,最终失败,并给出一条消息,说明无法创建更多线程。(已达到最大级别)

处理多个异常的语法错误。请使用以下方法:

除了(ValueError,IOError):


有关更多详细信息,请参阅Python教程

谢谢,先生。它工作正常。但现在我遇到了另一个问题。一旦出现值错误,我想重置modbus rtu并继续新的循环。另外,在正确操作20-30分钟后,我会得到值错误。在我得到值错误后,它会继续打印错误,但我想要modbus rtu重置并重新开始读取正确的值。如何执行此操作?