Как я могу прочитать ответ на запрос чтения Modbus?
Для проекта, использующего Raspberry Pi 4 со специальным экраном в качестве ведущего устройства Modbus, я успешно записал данные в регистр, но у меня возникли проблемы с чтением данных из регистра. Я использую программу Simply Modbus Slave для тестирования и вижу, что запрос, похоже, проходит успешно, но мне не удалось распечатать какие-либо данные на моем Raspberry Pi.
В настоящее время я подозреваю, что команда, которую я использую из modbus-tk (cst.READ_INPUT_REGISTERS), отправляет команду чтения входных регистров, но на самом деле не получает ответа.
Поэтому я ищу помощи в захвате этих значений или, в качестве альтернативы, сохраняю все, полученное от ведомого устройства, и нахожу значения среди этих данных.
Кроме того, было бы неплохо, возможно, распечатать все отправленные и полученные, чтобы я мог видеть, что происходит в общении.
Это текущий код, который я использую:
## To install dependencies:
## sudo pip3 install modbus-tk
##################################################################################################
import serial
import fcntl
import os
import struct
import termios
import array
import time
#import modbus lib
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
#import modbus_tk.modbus_rtu as modbus_rtu
from modbus_tk import modbus_rtu
# RS485 ioctls define
TIOCGRS485 = 0x542E
TIOCSRS485 = 0x542F
SER_RS485_ENABLED = 0b00000001
SER_RS485_RTS_ON_SEND = 0b00000010
SER_RS485_RTS_AFTER_SEND = 0b00000100
SER_RS485_RX_DURING_TX = 0b00010000
# rs 485 port
ser1 = serial.Serial("/dev/ttySC0",19200)
#ser1 = serial.Serial("/dev/ttySC0",9600)
ser2 = serial.Serial("/dev/ttySC1",9600)
def rs485_enable():
buf = array.array('i', [0] * 8) # flags, delaytx, delayrx, padding
#enable 485 chanel 1
fcntl.ioctl(ser1, TIOCGRS485, buf)
buf[0] |= SER_RS485_ENABLED|SER_RS485_RTS_AFTER_SEND
buf[1] = 0
buf[2] = 0
fcntl.ioctl(ser1, TIOCSRS485, buf)
#enable 485 chanel 2
fcntl.ioctl(ser2, TIOCGRS485, buf)
buf[0] |= SER_RS485_ENABLED|SER_RS485_RTS_AFTER_SEND
buf[1] = 0
buf[2] = 0
fcntl.ioctl(ser2, TIOCSRS485, buf)
#end of rs485_enable():
if __name__ == '__main__':
logger = modbus_tk.utils.create_logger("console")
rs485_enable()
#set modbus master
master = modbus_rtu.RtuMaster(
serial.Serial(port= '/dev/ttySC0',
baudrate=9600,
bytesize=8,
parity='N',
stopbits=1,
xonxoff=0)
)
master.set_timeout(5.0)
master.set_verbose(True)
logger.info("connected")
read = logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 4, 1))
print(read)
Мой код представляет собой отредактированную версию демонстрационного кода моего щита (rtumaster.py), который можно найти здесь (Программное обеспечение / Тестовые коды / MODBUS).
заранее спасибо