minimalmodbus:通过串口发送错误消息

minimalmodbus : Wrong Message being sent over Serial

所以我想发送此代码:01 00 14 00 58 通过使用 minimalmodbus 的 ModBus RTU 到我的虚拟 COM 端口 (COM2)。

所以我确实得到了“代码”,但我也得到了代码前后的其他字节,我似乎可以知道它们来自哪里以及如何解决它。

Terminal Output Image

我确实尝试使用另一个名为 pymodbus 的库,但我得到了相同的结果

Python代码:

import serial
import minimalmodbus as mrtu
mrtu.BYTEORDER_BIG = 1
insmrt = mrtu.Instrument('COM2',1 ,mrtu.MODE_RTU,close_port_after_each_call= False,debug=True)
insmrt.precalculate_read_size= False
insmrt.clear_buffers_before_each_transaction= True
insmrt.serial.baudrate = 38400
insmrt.serial.bytesize = 8
insmrt.serial.parity = serial.PARITY_NONE
insmrt.serial.stopbits  =1
insmrt.serial.timeout = 5
insmrt.handle_local_echo = None
def inscommmand():

    #insmrt.write_string = "00140058"
    insmrt.write_registers(0,[0x01,0x14,0x58])
while 1:
    try:
         inscommmand()
    except:
        continue

我真的不知道你想做什么或你的意思 通过 Modbus 发送此代码 但我担心库 (minimalModbus) 是什么做的正是它应该做的。

如果您致电:

insmrt.write_registers(0,[0x01,0x14,0x58])

库将构建以下 Modbus 框架:

01 10 0000 0003 06 0001 0014 0058 9ABE

这是此框架上每个值的含义:

01:从站地址(默认地址1)

10:函数代码 16(写入多个保持寄存器,16 = 10 hex)

0000: 第一个寄存器的地址(0000 hex = 0, +40001 offset = register #40001).

0003:要写入的寄存器数量,因为您给出了一个 3 元素列表

06:后面的数据字节数(3 个寄存器 x 2 个字节,每个 = 6 个字节)。

0001:写入寄存器 40001 的值

0014:写入寄存器 40002 的值

0058:写入寄存器 40003 的值

9ABE: CRC(循环冗余校验)用于错误检查。

序列 01 00 14 00 58 不是有效的 Modbus 帧,因为没有功能代码 00(只允许从 1 到 6、15 和 16 的值)。

也许你想要的只是通过串口发送那个序列?否则,您应该考虑这些值的来源。