Читать сообщения с устройства RS-485, подключенного к Raspberry PiPython

Программы на Python
Anonymous
Читать сообщения с устройства RS-485, подключенного к Raspberry Pi

Сообщение Anonymous »

У меня есть устройство RS-485, подключенное к моему raspi без адаптера USB. В его таблице данных указано, что все данные можно прочитать через регистры временного хранения, поэтому я использую ModbusSerialClient из библиотеки pymodbus. Но, насколько я понимаю, мне нужно вручную переключить переключатель rx-tx на raspi, а функция read_holding_registers, конечно, этого не делает. Каков правильный подход?
В целях тестирования я пытаюсь отправить сообщение с запросом вручную, но, похоже, оно не работает, и устройство не обменивается данными, хотя оно находится в сети и настроен правильно. Что я делаю не так? Этот код возвращает пустые сообщения, как если бы я использовал функцию read_holding_registers()
import time
import RPi.GPIO as GPIO
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

# GPIO configuration
EN_485 = 6 # GPIO pin to control RS-485 direction
unit_id = 4
start_address = 1003 # Register to read
register_count = 1

GPIO.setmode(GPIO.BCM)
GPIO.setup(EN_485, GPIO.OUT)
GPIO.output(EN_485, GPIO.LOW) # Start with receive mode

ser = ModbusClient(method='rtu', port='/dev/ttyAMA0', baudrate=9600, stopbits=1, timeout=5, bytesize=8, parity='N', retry_on_empty=True)
print(ser )

def enable_tx():
GPIO.output(EN_485, GPIO.HIGH)
time.sleep(0.01)

def enable_rx():
GPIO.output(EN_485, GPIO.LOW)
time.sleep(0.01)

def send_modbus_rtu_message(ser, message):

enable_tx() #transmit data

ser.socket.write(bytearray(message))
time.sleep(0.1)

enable_rx()#receive data

# Wait and read the response
time.sleep(1)
response=ser.socket.read(8)
print(f"Received: {response}")

def main():

if not ser.connect():
print("Failed to connect to the Modbus server")
else:

print(f'port name: {ser.is_socket_open()}')
ser.debug_enabled()

try:

message = [0x4, 0x3, 0x3, 0xeb, 0x0, 0x1, 0xf4, 0x2f]

while True:
send_modbus_rtu_message(ser, message)

finally:
ser.close()
GPIO.cleanup()

main()


Подробнее здесь: https://stackoverflow.com/questions/785 ... spberry-pi

Вернуться в «Python»