1

我正在使用以下参数从设备读取和写入寄存器波特率 - 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 ,但在这种情况下它也失败了。

4

2 回答 2

0

我从未使用过这个库,但您似乎正在以下列方式调用 write_register 函数:

write_register(4, 5, 0, 6, False)

文档建议第一个数字是地址,所有后续数字都是从指定地址开始写入的值。如果您还没有这样做,请删除“错误”并查看您的写入是否通过。

于 2018-03-01T14:29:20.493 回答
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.
于 2018-08-31T12:53:01.187 回答