Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有人能帮我理解如何使用pyModbus将字符串数据编码到数字显示板上吗?_Python_Python 3.x_Linux_Ascii_Modbus - Fatal编程技术网

Python 有人能帮我理解如何使用pyModbus将字符串数据编码到数字显示板上吗?

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。我已经建立了一个简单的客户端脚本,可以与电路板通信,但我必须对消息进行编码才能将其发送到寄存器。在

使用: 蟒蛇3, pyModbusTCP, Linux, 树莓皮4, ViewMarq由Automation Direct提供

我有一个数字显示板,可以接收ModBusTCP ascii数据包。下面的信息与我试图发送的测试消息类似

试验

我是python Modbus的新手,正在尝试使用pyModbus客户机通过端口502将数据发送到其持有寄存器411000,我相信通过删除4,该端口仅为11000。我已经建立了一个简单的客户端脚本,可以与电路板通信,但我必须对消息进行编码才能将其发送到寄存器。在可编程逻辑控制器的世界中,这要简单得多,但这不是一个选项

使用windows应用程序填充电路板,检测到我的Wireshark modbus数据,如下所示:

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)