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)
Для меня все выглядит правильно.