首页 > 解决方案 > Minimalmodbus 响应出现不当,不会更新

问题描述

我正在尝试从为 Modbus RTU 协议配置的称重传感器面板读取数据。该程序的目标是记录数据,我将在下面链接整个程序,但设置是我遇到问题的地方。我已经让模块响应数据,并且它是在唯一允许通过 USB 通信的配置中连接的,所以我认为这是正确完成的。

我保存为返回给我的“加载”的响应是:

[[   0*    2*   3245    0  -28   -1 1000    0]]

*星号代表根据预期返回值看起来完全不正确的响应部分。

这似乎是不正确的,我期望的响应的特点是:

[Slave Address, Function, Byte Count, Data Hi, Data Lo, Data Hi, Data Lo, Error Check Lo, Error Check Hi]

总共 9 个字节(72 位)。所以,我希望回复看起来更像这样:

[1*, 4*, 4, 00, 06, 00, 05, DB, 86]

*星号代表根据预期返回值看起来完全不正确的响应部分。

**预期回复来自:https ://www.modbustools.com/modbus.html#function04

我还希望数据字节的值随着我在调用中添加或删除负载而改变,因为面板仪表读数正确,但响应不会随着程序循环而改变。有 MinimalModbus 经验的人是否对获得此回报可能出现的问题有任何猜测?

这是感兴趣的代码:

import minimalmodbus
import serial          
import numpy as np

units = "lb."
comPort = "COM6"
baudRate = 9600
functionImplemented = 4

minimalmodbus.slaveaddress = 1
minimalmodbus.registeraddress = 3  #1, 2, 3 for this application
instrument = minimalmodbus.Instrument(comPort, minimalmodbus.slaveaddress)
instrument.serial.port = comPort
instrument.serial.baudrate = baudRate
instrument.serial.parity = serial.PARITY_EVEN
instrument.serial.bytesize = 8
instrument.serial.stopbits = 1
instrument.mode = minimalmodbus.MODE_RTU
instrument.serial.timeout = 2

n=0

run=True

while run is True: 
    #record new temperature values WHEN UPDATED?
    
    load=np.array([[1,1,1,1,1,1,1,1]])
    for x in range(8):
        i=x+1
        minimalmodbus.registeraddress=i
        load[0,x]=instrument.read_register(minimalmodbus.registeraddress, 
number_of_decimals=0, functioncode=functionImplemented, signed=True)
    print("load ("+str(n)+"): " + str(load))

    n = n + 1

这是完整的程序,如果有人感兴趣的话,但出现故障的部分是上面列出的:

#@author: Jack M

import time
import minimalmodbus
import serial          
import numpy as np
import matplotlib.pyplot as plt

units = "lb."
comPort = "COM6"
baudRate = 9600
functionImplemented = 4

minimalmodbus.slaveaddress = 1
minimalmodbus.registeraddress = 3  #1, 2, 3 for this application
instrument = minimalmodbus.Instrument(comPort, minimalmodbus.slaveaddress)
instrument.serial.port = comPort
instrument.serial.baudrate = baudRate
instrument.serial.parity = serial.PARITY_EVEN
instrument.serial.bytesize = 8
instrument.serial.stopbits = 1
instrument.mode = minimalmodbus.MODE_RTU
instrument.serial.timeout = 2

stime = np.array([[0]])
sload = np.array([[1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2]])
print("sload: " + str(sload))
n=0
run=True

while run is True: 
    #record new temperature values WHEN UPDATED?
    
    load=np.array([[1,1,1,1,1,1,1,1]])
    for x in range(8):
        i=x+1
        minimalmodbus.registeraddress=i
        load[0,x]=instrument.read_register(minimalmodbus.registeraddress,                 
number_of_decimals=0, functioncode=functionImplemented, signed=True)
    print("load ("+str(n)+"): " + str(load))

    sload=np.append(sload,load,axis=0)

    n = n + 1

    newTime = [[time.time()]]

    #store the input values
    stime=np.append(stime,newTime, axis=0)

plt.plot(stime,sload,'ro')
plt.title("Load (lbf) vs. Time (s)")
plt.xlabel("Time (s)")
plt.ylabel("Load (Lbf)")
plt.show()

print("Max: "+ str(np.max(sload)))

标签: pythonmodbusminimalmodbus

解决方案


推荐阅读