minimalmodbus:错误的消息正在通过串行发送



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

所以我得到了"code"但是我也在代码之前和之后得到其他字节,我似乎可以知道它们来自哪里以及如何解决它。

终端输出图像

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

PythonCode:

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 = "$0100140058"
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: Slave Address(默认为地址1)

10:函数码16(写多个保持寄存器,16 = 10十六进制)

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)。

也许你想要的只是通过串行端口发送该序列?否则,您应该考虑这些值是从哪里来的。

相关内容

  • 没有找到相关文章

最新更新