我的公司已经购买了几个具有modbus功能的房间温控器。那些来自中国。当我在Modbus RTU上与他们交流时,会发生有趣的事情。设备有时不会回应我。然后在接下来的民意调查中,他们有时会回应但最后,在一段时间之后,不管一小时还是两天,他们完全停止响应,并且我从modbus master获得一些错误。我使用串口分析器来查看发生了什么。我做了所有的硬件检查点(端接电阻等)。我尝试了许多modbus大师。但即使只连接了一个恒温器,也会发生问题。具体到这个问题,我用Python开发了自己的modbus master。最好的部分是,我使用最小的modbus库,每次调查后我都有机会关闭端口。但是,即使我的modbus主程序继续轮询,恒温器也会完全停止响应。不知何故,我必须通过编程来解决这个问题。我不能总是重新启动恒温器来解决通信问题。Modbus设备无故停止通讯
这里是我的代码:
import os
import sys
import sqlite3
import time
import datetime
import minimalmodbus
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True
PORT_NAME = '/com5'
SLAVE1_ADDRESS = 1
SLAVE2_ADDRESS = 2
SLAVE3_ADDRESS = 3
BAUDRATE = 9600 # baud (pretty much bits/s). Use 2400 or 38400 bits/s.
TIMEOUT = 0.4 # seconds. At least 0.2 seconds required for 2400 bits/s.
MODE = minimalmodbus.MODE_RTU
sqlite_file = 'ModbusTable.db'
instrument1 = minimalmodbus.Instrument(PORT_NAME, SLAVE1_ADDRESS, MODE)
instrument1.serial.baudrate = BAUDRATE
instrument1.serial.timeout = TIMEOUT
instrument1.debug = False
instrument1.precalculate_read_size = True
instrument2 = minimalmodbus.Instrument(PORT_NAME, SLAVE2_ADDRESS, MODE)
instrument2.serial.baudrate = BAUDRATE
instrument2.serial.timeout = TIMEOUT
instrument2.debug = False
instrument2.precalculate_read_size = True
instrument3 = minimalmodbus.Instrument(PORT_NAME, SLAVE3_ADDRESS, MODE)
instrument3.serial.baudrate = BAUDRATE
instrument3.serial.timeout = TIMEOUT
instrument3.debug = False
instrument3.precalculate_read_size = True
print ('Okuyor')
while 1:
# Connecting to the database file
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
try:
values1 = instrument1.read_registers(40005, 2)
except IOError:
print ('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())+"Failed to read from instrument1")
# C) Updates the pre-existing entry
c.execute("""UPDATE ModbusData SET SetPoint = ? ,ActualTemp = ? WHERE ID= ? """,
(values1[0],values1[1],1))
time.sleep(0.5)
try:
values2 = instrument2.read_registers(40005, 2)
except IOError:
print ('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())+"Failed to read from instrument2")
# C) Updates the pre-existing entry
c.execute("""UPDATE ModbusData SET SetPoint = ? ,ActualTemp = ? WHERE ID= ? """,
(values2[0],values2[1],2))
time.sleep(0.5)
try:
values3 = instrument3.read_registers(40005, 2)
except IOError:
print ('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())+"Failed to read from instrument3")
# C) Updates the pre-existing entry
c.execute("""UPDATE ModbusData SET SetPoint = ? ,ActualTemp = ? WHERE ID= ? """,
(values3[0],values3[1],3))
time.sleep(0.5)
# Committing changes and closing the connection to the database file
conn.commit()
conn.close()
这里是恒温如何执行:
因此,我将感激这么多,如果你拿出你的想法。
你说:“我用串口分析器看看发生了什么事情”。您能否提供分析仪获得的结果的副本? –