我正在使用以下参数从设备读取和写入寄存器波特率 - 9600 stopbit-1 no_of_bits - 8 parity - 奇数
我目前正在使用最小的 modbus 库。我的读取寄存器的代码粘贴在下面
# serial line
import traceback
import minimalmodbus as mmRtu
regsSp = 6
portName = 'com4'
baudrate = 9600
timeoutSp = 0.5 + regsSp * 0
mmc = mmRtu.Instrument(portName,5,mode=mmRtu.MODE_RTU)
mmc.serial.baudrate = baudrate
mmc.serial.timeout = timeoutSp
mmc.serial.parity = 'O'
tb = None
errCnt = 0
mmc.address = 5
try:
data = mmc.read_registers(3, 6)
except:
tb = traceback.format_exc()
errCnt += 1
mmc.serial.close()
print(errCnt)
print(data)
【参考线程Python modbus库】
读取寄存器工作正常。
但是我的 write_register 在这里失败了。我正在读取设备的第 5 个寄存器。代码如下。
# serial line
import traceback
import minimalmodbus as mmRtu
regsSp = 6
portName = 'com4'
baudrate = 9600
timeoutSp = 0.5 + regsSp * 0
mmc = mmRtu.Instrument(portName,5,mode=mmRtu.MODE_RTU)
mmc.serial.baudrate = baudrate
mmc.serial.timeout = timeoutSp
mmc.serial.parity = 'O'
tb = None
errCnt = 0
mmc.address = 5
try:
data = mmc.read_registers(3, 6)
except:
tb = traceback.format_exc()
errCnt += 1
mmc.serial.close()
print(errCnt)
print(data)
Traceback(最近一次调用最后一次):文件“C:/Users/Admin/PycharmProjects/weight_calibrate/weight_calibrate.py”,第 17 行,在 mmc.write_register(4, 5, 0, 6, False) 文件“C:\Users \Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\minimalmodbus-0.7-py3.6.egg\minimalmodbus.py",第 296 行,在 write_register self._genericCommand(functioncode, registeraddress, value, numberOfDecimals , signed=signed) 文件“C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\minimalmodbus-0.7-py3.6.egg\minimalmodbus.py”,第 697 行,在 _genericCommand payloadFromSlave = self._performCommand(functioncode, payloadToSlave) 文件 "C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\minimalmodbus-0.7-py3.6.egg\minimalmodbus.py",第 795 行,在 _performCommand 响应 = self._communicate(request, number_of_bytes_to_read) 文件“C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\minimalmodbus-0.7-py3.6.egg\minimalmodbus.py ", line 930, in _communicate raise IOError('No communication with the instrument (no answer)') OSError: No communication with the instrument (no answer)
我检查了请求中的数据包是完美的,甚至是CRC。然而,设备的响应为空,这就是代码失败的地方。
最小的modbus.py
if len(answer) == 0:
raise IOError('No communication with the instrument (no answer)')
因为答案是 b''
我可以使用工具简单地使用 modbus master 8.0.7 写入设备的寄存器,并且请求数据包在两种情况下都具有相同的内容。这表明我有权写入端口。此外,由于即使读取实际上也会将请求写入端口,所以文件权限可能不是我假设的问题。
请建议我是否在这里遗漏任何设置..
我还尝试了库 modbus_tk ,但在这种情况下它也失败了。