首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Modbus读取成功,但modbus写入返回null (使用最小modbus )

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

Stack Overflow用户
提问于 2017-11-06 13:39:32
回答 2查看 879关注 0票数 0

我正在使用以下参数从设备读取和写入寄存器: baudrate - 9600停止位-1 no_of_bits -8奇偶校验

我目前使用的是最小的modbus库。我要读取寄存器的代码粘贴在下面

代码语言:javascript
复制
    # 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在这里失败了。我正在读取我的设备的第五个寄存器。代码如下。

代码语言:javascript
复制
    # 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

代码语言:javascript
复制
    if len(answer) == 0:
        raise IOError('No communication with the instrument (no answer)')

因为答案是b'‘

我可以使用modbus master 8.0.7工具写入设备的寄存器,请求数据包在这两种情况下具有相同的内容。这表明我有写入该端口的权限。此外,由于即使是读操作实际上也会将请求写入端口,因此我认为文件权限可能不是问题。

如果我在这里遗漏了任何设置,请给我建议。

我也尝试了库modbus_tk,它在这种情况下也失败了。

EN

回答 2

Stack Overflow用户

发布于 2018-03-01 22:29:20

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

代码语言:javascript
复制
write_register(4, 5, 0, 6, False)

文档建议第一个数字是地址,所有后续数字都是从指定地址开始写入的值。如果你还没有这样做,去掉'False‘,看看你的写入是否通过了。

票数 0
EN

Stack Overflow用户

发布于 2018-08-31 20:53:01

我想你现在可能已经想出解决办法了吧?但是您需要调用write_register并使用函数代码6将新值发送到寄存器。

代码语言:javascript
复制
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添加到写命令的末尾。

代码语言:javascript
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47130405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档