因此,我想发送以下代码:01 00 14 00 58 over ModBus RTU,利用minimalmodbus到我的虚拟COM端口(COM2)。
因此,我确实得到了“代码”,但在代码之前和之后,我也得到了其他字节,我似乎知道它们来自何处,以及如何解决它。
我确实试过使用另一个名为pymodbus的libary,但是我得到了相同的结果。
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发布于 2022-04-22 17:39:25
我不知道您想要做什么,也不知道通过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十六进制)
0000:第一个寄存器的地址(0000十六进制= 0,+40001偏移量=寄存器#40001)。
0003:要写入的寄存器数量,因为您提供了一个3元素列表。
06:后面的数据字节数(3个寄存器x2个字节=6个字节)。
0001:要写入注册40001的值
0014:要写入注册40002的值
0058:要写入注册40003的值
9ABE:用于错误检查的循环冗余检查( 启联 )。
序列01 00 14 00 58不是有效的Modbus帧,因为没有函数代码00(只允许1到6、15和16之间的值)。
也许你想要的只是通过串口发送那个序列?否则,您应该考虑这些值从何而来。
https://stackoverflow.com/questions/71970874
复制相似问题