0

对于使用 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)

我的代码是在这里 (Software/Test Codes/MODBUS)找到的我的 shield 的演示代码 (rtumaster.py) 的编辑版本。

先感谢您

4

0 回答 0