Python 有人能帮我理解如何使用pyModbus将字符串数据编码到数字显示板上吗?
使用: 蟒蛇3, pyModbusTCP, Linux, 树莓皮4, ViewMarq由Automation Direct提供 我有一个数字显示板,可以接收ModBusTCP ascii数据包。下面的信息与我试图发送的测试消息类似 试验 我是python Modbus的新手,正在尝试使用pyModbus客户机通过端口502将数据发送到其持有寄存器411000,我相信通过删除4,该端口仅为11000。我已经建立了一个简单的客户端脚本,可以与电路板通信,但我必须对消息进行编码才能将其发送到寄存器。在可编程逻辑控制器的世界中,这要简单得多,但这不是一个选项 使用windows应用程序填充电路板,检测到我的Wireshark modbus数据,如下所示:Python 有人能帮我理解如何使用pyModbus将字符串数据编码到数字显示板上吗?,python,python-3.x,linux,ascii,modbus,Python,Python 3.x,Linux,Ascii,Modbus,使用: 蟒蛇3, pyModbusTCP, Linux, 树莓皮4, ViewMarq由Automation Direct提供 我有一个数字显示板,可以接收ModBusTCP ascii数据包。下面的信息与我试图发送的测试消息类似 试验 我是python Modbus的新手,正在尝试使用pyModbus客户机通过端口502将数据发送到其持有寄存器411000,我相信通过删除4,该端口仅为11000。我已经建立了一个简单的客户端脚本,可以与电路板通信,但我必须对消息进行编码才能将其发送到寄存器。在
Ethernet II, Src: Dell_63:da:e2 (34:48:ed:63:da:e2), Dst: FACTSEng_06:6c:fc (60:52:d0:06:6c:fc)
Internet Protocol Version 4, Src: 169.254.108.210, Dst: 169.254.108.223
Transmission Control Protocol, Src Port: 55053, Dst Port: 502, Seq: 1, Ack: 1, Len: 85
Modbus/TCP
Transaction Identifier: 256
Protocol Identifier: 0
Length: 79
Unit Identifier: 1
Modbus
.001 0000 = Function Code: Write Multiple Registers (16)<nl>
Reference Number: 10999
Word Count: 36
Byte Count: 72
Register 10999 (UINT16): 18748
Register 11000 (UINT16): 8260
Register 11001 (UINT16): 12339
Register 11002 (UINT16): 15422
Register 11003 (UINT16): 19523
Register 11004 (UINT16): 15954
Register 11005 (UINT16): 22332
Register 11006 (UINT16): 20041
Register 11007 (UINT16): 12320
Register 11008 (UINT16): 12320
Register 11009 (UINT16): 12832
Register 11010 (UINT16): 14136
Register 11011 (UINT16): 13088
Register 11012 (UINT16): 15921
Register 11013 (UINT16): 20540
Register 11014 (UINT16): 21327
Register 11015 (UINT16): 12320
Register 11016 (UINT16): 12320
Register 11017 (UINT16): 15422
Register 11018 (UINT16): 19020
Register 11019 (UINT16): 15422
Register 11020 (UINT16): 19522
Register 11021 (UINT16): 20000
Register 11022 (UINT16): 15422
Register 11023 (UINT16): 21315
Register 11024 (UINT16): 12320
Register 11025 (UINT16): 15422
Register 11026 (UINT16): 21063
Register 11027 (UINT16): 15950
Register 11028 (UINT16): 21564
Register 11029 (UINT16): 21566
Register 11030 (UINT16): 29541
Register 11031 (UINT16): 15476
Register 11032 (UINT16): 21551
Register 11033 (UINT16): 3390
Register 11034 (UINT16): 52237
收到
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,..... <all 100 zeros>]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,…]
有人能帮我理解我是否朝着正确的方向前进,我下一步该怎么做吗?我尽量让这件事尽可能简单,我感谢你的帮助
先谢谢你
更新:
在提出建议后,我深入研究了文档。当执行完成时,这些寄存器是否立即返回到0。从文件中
*
c) 假设
ViewMarq显示中的选择处于关闭状态(默认)。
d) 从Modbus存储器起始地址是命令块的位置
在ViewMarq显示屏内(400000+11000=411000)。
e) 功能代码应设置为16–写入多个寄存器
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.payload import BinaryPayloadBuilder
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.compat import iteritems
from collections import OrderedDict
client = ModbusClient('169.254.108.223', port=502)
client.connect()
builder = BinaryPayloadBuilder(byteorder=Endian.Little, wordorder=Endian.Little)
builder.add_string("<ID 30><CLR>""$0D") #$0D is the termination code in the docs
payload = builder.build()
client.write_registers(10999, payload, skip_encode=True, unit=1)
从pymodbus.constants导入Endian
从pymodbus.payload导入二进制PayloadDecoder
从pymodbus.payload导入二进制PayloadBuilder
从pymodbus.client.sync导入modbuscpclient作为ModbusClient
从pymodbus.compat导入iteritems
从集合导入订单
客户端=ModbusClient('169.254.108.223',端口=502)
client.connect()
builder=BinaryPayloadBuilder(byteorder=Endian.Little,wordorder=Endian.Little)
builder.add_字符串(“$0D”)35;$0D是文档中的终止代码
payload=builder.build()
client.write_寄存器(10999,有效负载,skip_encode=True,单位=1)
这不管用。它运行了,但董事会没有更新。非常欢迎您提出建议。这不是您问题的完整解决方案,只是建议下一步该怎么做
- 阅读显示器的文档
- 也许命令缓冲区寄存器是只写的
- 或者,当显示器处理完命令后,您可能会读取所有0
- 尝试读取响应缓冲区寄存器
- 将Wireshark日志中的数据转换为十六进制:
=18748
->0x493c
=0x49
'I'
=0x3c
=
'这并不是解决您问题的完整方案,只是建议下一步怎么做
- 阅读显示器的文档
- 也许命令缓冲区寄存器是只写的
- 或者,当显示器处理完命令后,您可能会读取所有0
- 尝试读取响应缓冲区寄存器
- 将Wireshark日志中的数据转换为十六进制:
=18748
->0x493c
=0x49
'I'
=0x3c
'Bobo,这非常有用。我编辑了上面的内容以显示我改变了方向。它没有产生预期的结果,所以我将创建一个服务器,看看寄存器是什么样子。Bobo,用pyModbus构建的有效负载不能按预期工作。这似乎是一个错误。在查看wireshark中的有效负载后,我能够编写自己的小Endian函数并将其发送到设备。很好,波波,这很有帮助。我编辑了上面的内容以显示我改变了方向。它没有产生预期的结果,所以我将创建一个服务器,看看寄存器是什么样子。Bobo,用pyModbus构建的有效负载不能按预期工作。这似乎是一个错误。在查看wireshark中的有效负载后,我能够编写自己的小Endian函数并将其发送到设备。这样做效果很好。在写完答案后更改问题不是一个好主意,因为答案不再与问题匹配。最好写一个新问题。我在我的答案中添加了一条注释。谢谢你提供的信息。我把它称为“更新”,并列举了原因。我觉得没关系。我希望任何有类似问题的人都能看到问题的整个范围,就像海报上的我一样,对结果感到满意。此外,我认为新的重复问题是不可取的。在写下答案后更改问题不是一个好主意,因为答案不再与问题匹配。最好写一个新问题。我在我的答案中添加了一条注释。谢谢你提供的信息。我把它称为“更新”,并列举了原因。我觉得没关系。我希望任何有类似问题的人都能看到问题的整个范围,就像海报上的我一样,对结果感到满意。此外,我认为新的重复问题是不受欢迎的。
from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder from pymodbus.payload import BinaryPayloadBuilder from pymodbus.client.sync import ModbusTcpClient as ModbusClient from pymodbus.compat import iteritems from collections import OrderedDict client = ModbusClient('169.254.108.223', port=502) client.connect() builder = BinaryPayloadBuilder(byteorder=Endian.Little, wordorder=Endian.Little) builder.add_string("<ID 30><CLR>""$0D") #$0D is the termination code in the docs payload = builder.build() client.write_registers(10999, payload, skip_encode=True, unit=1)
- 阅读显示器的文档