在这里跳一个人可以帮助您。 我正在与Modbus设备通信并按预期方式取回数据,对此还很陌生,因此我需要一些建议,我试图读取设备(Eaton SC200)上所有自定义HMI的位寄存器。 如果我尝试进行下一个循环或什至按照发布的代码,则com端口会失去通信。
#!/usr/bin/env python
import minimalmodbus
import time
instrument = minimalmodbus.Instrument('COM11', 1)
minimalmodbus.TIMEOUT = 1
DO =[]
instrument.address # this is the slave address number
instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode
#port name, slave address (in decimal)#0 = instrument.read_bit(1,1)
#digital = instrument.read_registers(1,32,4)
Version =instrument.read_registers(3001,3,4)
serialupper = instrument.read_registers(6001,1,4)
serialLower = instrument.read_registers(6002,1,4)
busvolt= instrument.read_registers(7001,4,4)
print type(serialupper[0])
print(serialupper, serialLower)
upper = serialupper[0] << 16 # shift upper left 16 bits
Snumber = upper + serialLower[0]
print ('Serial no: = ' + str(Snumber))
print(busvolt)
print ('Getting i-o')
print instrument.read_bit(1001,2)
print instrument.read_bit(1002,2)
print instrument.read_bit(1003,2)
print instrument.read_bit(1004,2)
print instrument.read_bit(1101,2)
print instrument.read_bit(1102,2)
print instrument.read_bit(1201,2)
print instrument.read_bit(1202,2)
print instrument.read_bit(1203,2)
print instrument.read_bit(1204,2)
print instrument.read_bit(1201,2)
print instrument.read_bit(1201,2)
我得到的答复是:
<type 'int'>
([3754], [53255])
Serial no: = 246075399
[16989, 42144, 32704, 0]
Getting i-o
0
0
Traceback (most recent call last):
File "modbusRTU.py", line 29, in <module>
print instrument.read_bit(1003,2)
File "C:\Python27\lib\site-packages\minimalmodbus.py", line 193, in read_bit
return self._genericCommand(functioncode, registeraddress)
File "C:\Python27\lib\site-packages\minimalmodbus.py", line 697, in _genericCommand
payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
File "C:\Python27\lib\site-packages\minimalmodbus.py", line 795, in _performCommand
response = self._communicate(request, number_of_bytes_to_read)
File "C:\Python27\lib\site-packages\minimalmodbus.py", line 930, in _communicate
raise IOError('No communication with the instrument (no answer)')
IOError: No communication with the instrument (no answer)
我将Timeout的值从0.5更改为2,以查看是否是问题所在,有时我得到了完整的数据运行,而其他时候却什么也没得到。 任何帮助将不胜感激。
答案 0 :(得分:0)
最有可能是物理通讯问题。检查电缆的端接,检查端接电阻器(对于RS-485),检查RFI / EMI干扰源,然后尝试降低波特率。电缆越长,您应使用的波特率越低。
如果这是RS-485,总线两端的终端电阻器吗?它们是正确的尺寸吗?这在高速网络上更为重要。在较慢的网络(9600及以下)上,我已经看到RS-485在没有终端电阻或超大终端的情况下都能正常工作。通常,如果我不轮询太多数据,则将RS-485波特率设置为9600。