Modbus读取成功,但modbus写入返回null(使用最小modbus)

时间:2017-11-06 05:39:32

标签: modbus minimalmodbus

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

2 个答案:

答案 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.