我正在使用以下参数从设备读取和写入寄存器 波特率 - 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在这里失败了。我正在阅读我设备的第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)
追踪(最近一次通话): 文件“C:/Users/Admin/PycharmProjects/weight_calibrate/weight_calibrate.py”,第17行,in mmc.write_register(4,5,0,6,False) 在write_register中的文件“C:\ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py”,第296行 self._genericCommand(functioncode,registeraddress,value,numberOfDecimals,signed = signed) _genericCommand中的文件“C:\ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py”,第697行 payloadFromSlave = self._performCommand(functioncode,payloadToSlave) _performCommand中的文件“C:\ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py”,第795行 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中 提高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库,在这种情况下也失败了。
答案 0 :(得分:0)
我从来没有使用过这个库,但看起来你是按照以下方式调用write_register函数的:
write_register(4, 5, 0, 6, False)
文档建议第一个数字是地址,所有后续数字都是从指定地址开始写入的值。如果你还没有这样做,请删除'False',看看你的写作是否通过。
答案 1 :(得分:0)
我确定您现在可能已经制定了解决方案?但是您需要调用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.