我正在使用以下参数从设备读取和写入寄存器: baudrate - 9600停止位-1 no_of_bits -8奇偶校验
我目前使用的是最小的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 library ]
读取寄存器工作正常。
然而,我的write_register在这里失败了。我正在读取我的设备的第五个寄存器。代码如下。
# 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)回溯(最近一次调用):文件代码行17,在mmc.write_register(4,5,0,6,False)文件代码行296,在函数代码中( write_register self._genericCommand,mmc.write_register,self._genericCommand,numberOfDecimals,signed=signed)文件响应行697,in _genericCommand payloadFromSlave =self._performCommand(_genericCommand payloadFromSlave,payloadToSlave)文件响应行795,in _performCommand response = 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",行930,在_communicate raise IOError(‘无与仪器通信(无应答)’) OSError:无与仪器通信(无应答)
我已经检查了请求中的数据包是完美的,甚至是CRC。然而,来自设备的响应是空的,这就是代码失败的地方。
minimalmodbus.py
if len(answer) == 0:
raise IOError('No communication with the instrument (no answer)')因为答案是b'‘
我可以使用modbus master 8.0.7工具写入设备的寄存器,请求数据包在这两种情况下具有相同的内容。这表明我有写入该端口的权限。此外,由于即使是读操作实际上也会将请求写入端口,因此我认为文件权限可能不是问题。
如果我在这里遗漏了任何设置,请给我建议。
我也尝试了库modbus_tk,它在这种情况下也失败了。
发布于 2018-03-01 22:29:20
我从未使用过这个库,但您似乎正在以以下方式调用write_register函数:
write_register(4, 5, 0, 6, False)文档建议第一个数字是地址,所有后续数字都是从指定地址开始写入的值。如果你还没有这样做,去掉'False‘,看看你的写入是否通过了。
发布于 2018-08-31 20:53:01
我想你现在可能已经想出解决办法了吧?但是您需要调用write_register并使用函数代码6将新值发送到寄存器。
mmc.write_register(REGISTER, NEW_VALUE, DECIMALS, functioncode=6)
mmc.write_register(5, 18, 1, 6) <- this would set the value of register 5 to 18.同样,如果您想发送一个负值数字,请将signed=True添加到写命令的末尾。
mmc.write_register(REGISTER, NEW_VALUE, DECIMALS, functioncode=6, signed=True)
mmc.write_register(5, -18, 1, 6, signed=True) <- this would set the value of register 5 to -18.https://stackoverflow.com/questions/47130405
复制相似问题