Pymodbus преобразовывает ввод в неправильный адрес

Я пытаюсь записать на контроллер PCON с Raspberry Pi 3b с помощью pymodbus. У меня есть питон 3.5 и pymodbus 1.4. Я проверил канал связи через аппаратное обеспечение, подключив ноутбук, на котором запущен инструмент программирования Modbus (это для приложения, которое будет управлять электрическим цилиндром для зажима детали), и я смог включить / выключить сервопривод, и я смог толкать цилиндр.

Я создал очень простой скрипт для проверки разговора с контроллером и включения сервопривода. #! / usr / bin / env python3 # -- кодировка: utf-8 --

import pymodbus
import serial
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging

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

client = ModbusClient(method="rtu", port="/dev/serial0", stopbits=1, 
bytesize=8, parity='N', bauderate = 38400, timeout=.5)
connection=client.connect()

#read/write to coils
client.write_coil(260,1,unit=0x00) #address, value, unit

Это вывод отладки

DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:send: 0x3a 0x30 0x30 0x30 0x36 0x30 0x31 0x30 
0x34 0x30 0x30 0x30 0x31 0x46 0x34 0xd 0xa
DEBUG:pymodbus.transaction:recv: 
DEBUG:pymodbus.transaction:getting transaction 1

Адрес к катушке 260 (от поставщика), единица измерения #0, а значение данных равно 1 (катушка в бите). Когда вы посмотрите на шестнадцатеричные значения в DEBUG и запустите их через преобразователь Hex в ascii, вы получите:00050104FF00F7. первое "00" - это номер устройства, и это правильно, 05 - это код функции, который добавляется pymodbus, следующие четыре символа - это адрес - это 0104 и должно быть 0260, а следующие четыре - это значение - в этот случай FF00 представляет ON, который является правильным. Я использую целые числа для адреса, но очевидно, что это неправильно. Я не могу найти какую-либо информацию о формате адреса - все примеры являются целыми числами. Если у кого-то есть опыт работы с pymodbus, или если вы думаете, что я должен отказаться от pymodbus и перейти на minimalmodbus или modbus-tk, я был бы признателен за любую помощь / совет.

2 ответа

Похоже, что адрес в шестнадцатеричном формате: 0x0104 = 256 + 4 = 260

Я добавил это в качестве другого ответа, чтобы я мог корректировать форматирование.

На основании вашего заявления "То, что я показываю здесь, это ascii". Выходные данные отладки выглядят как пакет ASCII Modbus с шестнадцатеричным 0–9, A–F (в кодировке ASCII). Расшифровав его ниже, все выглядит правильно, вы хотели написать адрес 260, и это то, что он сделал.

:           start
00          device address = 0 (broadcast)
05          write single coil function (5)
0104        address 0104 (hex) = 1x256 + 4 = 260 (this is what you wanted)
FF00        output value FF00 (hex) = ON
F7          LRC (longitudinal redundancy check)

Для меня все выглядит правильно.

Другие вопросы по тегам