0

I am attempting to read data from a load cell panel which is configured for Modbus RTU protocol. The goal of the program is to log data, I will link the entire program below, but the setup is where I am having issues. I have gotten the module to respond with data, and it is wired in the only configuration which allows communication over USB, so I assume this is done correctly.

The response, which I am saving as 'load' which is being returned to me is:

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

*The stars represent the parts of the response which look fully incorrect, based on the expected return values.

This seems to be incorrect, the response I expect is characterized by:

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

a total of 9 bytes (72 bits). So, I would expect a response to look more like this:

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

*The stars represent the parts of the response which look fully incorrect, based on the expected return values.

**Expected response taken from: https://www.modbustools.com/modbus.html#function04

I would also expect the values of the Data Bytes to change as I add or remove load from the call, as the panel meter is reading correctly, but the response does not change as the program loops. Does anyone with MinimalModbus experiance have any guesses as to what might be going wrong to get this return?

This is the code of interest:

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

This is the full program, if anyone's interested, but the part that is malfunctioning is what is listed above.:

#@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)))
  • 1
    update: I have solved the issue. The problem was that read_register outputs vales beginning at index 0, and not in the order that the modbus slave returned them to the computer in, but in it's own order, not described in the internal documentation. I am leaving this up here, in the event that someone else runs into this issue. – Jack Martinez Jun 25 '21 at 19:35
  • You can add this as an answer to your own solution. It will be move visible than a comment. – Tagli Jun 26 '21 at 06:03

0 Answers0