LINUX.ORG.RU

Опрос устройства по RS485

 ,


1

3

Накидал программку для опроса Proxy-H1000 по RS485. Протокол свой.

Опрос делаю просто(pyserial):

wt = time.time() - self.last_query
if wt < self.minimum_silent_period:
      time.sleep(self.minimum_silent_period - wt)
self.write(data_to_send)
response = self.read(read_size)  
self.last_query = time.time()

Успешный ответ от устройства определяется по размеру принятых данных и ошибка при превышение времени ожидания.

Насколько это правильно?

PS. Этот код работает через USB-RS485 конвертер и на OrangePI (UART).


Успешный ответ от устройства определяется по размеру принятых данных и ошибка при превышение времени ожидания.

Насколько это правильно?

Подобная схема применяется в протоколе Modbus RTU, который как раз использует RS-485. Посылки идут одна за другой с интервалом минимум 3.5T (T - длительность символа). Если молчание больше, то следующие данные считаются новой посылкой. В процессе приема считается число байтов в посылке (содержит адрес устройства, команду, данные и контрольную сумму CRC-16). Расстояние между символами в посылке не должно превышать 1.5T.

Если говорить в общем, то лучше взять стандартные протоколы и морочить голову себе выдумыванием.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Если говорить в общем, то лучше взять стандартные протоколы и морочить голову себе выдумыванием.

Это готовое устройство. Производитель Bolid. Протокол похож на Modbus — содержит адрес устройства, команду, данные и контрольную сумму.

Расстояние между символами в посылке не должно превышать 1.5T.

Не очень понимаю, как в pyserial можно определить или задать расстояние между символами при чтении/записи. Сделал только интервал между посылками минимум 3.5T.

isdv
() автор топика

python, rs485

Посмотри, как тут сделано.

$ aptitude search modbus
libmodbus-dev                  development files for the Modbus protocol library
libmodbus5                     library for the Modbus protocol
python-pymodbus                full Modbus protocol implementation
python-pymodbus-doc            full Modbus protocol implementation, documentation
python2.7-pymodbus
python3-pymodbus               full Modbus protocol implementation for Python 3
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от isdv

Не очень понимаю, как в pyserial можно определить или задать расстояние между символами при чтении/записи. Сделал только интервал между посылками минимум 3.5T.

Не могу сказать, я не знаю ничего про pyserial. Но таймауты между каждым байтом там по идее должны быть реализованы. Но опять же: если у тебя протокол похож на modbus, но не modbus, то посмотри спецификацию. Может. там и нет такого требования.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от isdv

Это не то?

 class serial.Serial

    __init__(port=None, baudrate=9600, bytesize=EIGHTBITS,
 parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, 
xonxoff=False, rtscts=False, write_timeout=None, 
dsrdtr=False, inter_byte_timeout=None, exclusive=None)

timeout (float) – Set a read timeout value.

write_timeout (float) – Set a write timeout value.

inter_byte_timeout (float) – Inter-character timeout, None to disable (default).

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

inter_byte_timeout (float) – Inter-character timeout, None to disable (default).

То что нужно.

Пропустил в документации (. А в найденных примерах и в minimal modbus этот параметр не использовался.

Спасибо!

isdv
() автор топика
Ответ на: комментарий от Zubok

Они по запросу на PH-1000 протокол отдают, но про modbus там ничего нет. Надо будет попробовать с pymodbus подключиться.

Насколько я знаю, народ пытался разобраться с их протоколом, но там ,похоже, шифрование используется. Штатный способ получить modbus — это преобразователь интерфейса, что-то вроде C2000-ПП.

isdv
() автор топика
Ответ на: комментарий от isdv

Насколько я знаю, народ пытался разобраться с их протоколом, но там ,похоже, шифрование используется. Штатный способ получить modbus — это преобразователь интерфейса, что-то вроде C2000-ПП.

Ну, можно покопаться, конечно. Но раз там шифрование используется, то для чего же ты протокол пишешь? У тебя есть документация по нему? Мы тут как-то раз расковыривали протокол тоже таких перцев, которые любят доморощенные протоколы изобретать. Но там, правда, не сильно запутанно сделали. В целом расковыряли.

Они по запросу на PH-1000 протокол отдают,

Надо запросить. На расстрел не поведут из-за вопроса.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Насколько я знаю, народ пытался разобраться с их протоколом, но там ,похоже, шифрование используется. Штатный способ получить modbus — это преобразователь интерфейса, что-то вроде C2000-ПП.

Они по запросу на PH-1000 протокол отдают,

В общем, там все плохо. Но оно понятно - область такая, типа, безопасность.

Я являюсь представителем компании ЗАО НВП Болид. Протокол Орион\Орион Про нелегально использовать, без соответствующего разрешения от компании ни в коммерческом, ни в бесплатном ПО.

В случае нарушения руководство компании, скорее всего, подаст на Вас в суд. Протокол является интеллектуальной собственностью компании.

Более того, клиенты, которые используют данное ПО, автоматически лишаются гарантии на все устройства ЗАО НВП Болид.

Для интеграции с устройствами необходимо использовать ПО Модуль управления(с устройствами), Модуль Интеграции. Для «железной интеграции»-протокольной С2000-ПП.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Вот еще с этого же форума: http://forum-bolid.ru/viewtopic.php?f=82&t=3416 Но я так понимаю, что это актуально только для интеграторов. А для конечного потребителя уже не имеет смысла. То есть можно ломать и не париться. Вы же не распространяете решения, правильно?

Писать можете на генерального директора компании-Бабанов Игорь Александрович Протоколом является не последовательность байт, определение CRC и т.д., протоколом является интерпретация байт, т.е. описание команд и ответов, вот это является собственностью компании. Компания не может контролировать работу вашего ПО и устройств, а значит не может дать гарантий перед потребителем в работоспособности системы. Единственным правильным способом для «легальных» интеграторов является использование устройства С2000-ПП. При обнаружении посторонних устройств мы вынуждены требовать от клиентов немедленного отключения таких устройств и удаления их из общей линии связи. Мы разрабатываем устройство, где будет высокоуровневый протокол обмена, который позволит конфигурировать СКУД из своего ПО или других устройств, такое устройство должно обладать данным функционалом к концу 2017 года.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

То есть можно ломать и не париться.

Ломать не требуется. Это устройство с открытым протоколом -- Контроллер со встроенным считывателем Proxy-H1000

Вы же не распространяете решения, правильно?

Решения не распространяю. Да и не решение это, а костыль к СКУД, которая уже не поддерживается. Но работать должно стабильно.

PS. pymodbus по другому с портом работает. У меня неправильно.

isdv
() автор топика
Ответ на: комментарий от isdv

Просто pymodbus - вылизанное за годы решение, там учли ошибки молодости.

Кстати, оно может работать через асинки, не знаю, насколько Вам это будет полезно.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от isdv

PS. pymodbus по другому с портом работает. У меня неправильно.

Я не смотрел, но полагаю, что таймауты 1.5T (inter_byte_timeout) там не используются, так как VTIME (см. termios) в POSIX в десятых долях секунды измеряется. VTIME=1 - это 0.1 секунды. Меньше задать нельзя.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Забудьте про межсимвольное расстояние. Для его настройки нет никакого стандартного способа в Linux и сейчас уже сложно найти порты/конвертеры, которые позволяли бы его точно регулировать.

Modbus RTU устарел ещё лет 10 назад, лучше его не использовать.

anonymous
()
Ответ на: комментарий от anonymous

Забудьте про межсимвольное расстояние. Для его настройки нет никакого стандартного способа в Linux и сейчас уже сложно найти порты/конвертеры, которые позволяли бы его точно регулировать.

Я про это и написал.

Modbus RTU устарел ещё лет 10 назад, лучше его не использовать.

С чего это он устарел? Промышленные устройства с Modbus как выпускались, так и выпускаются. Модели Modbus вполне хватает для датчиков, измерительных устройств и пр. Для Modbus полно готовых решений для интеграции. Как аппаратных, так и программных. Он прост и легко реализуется.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok
  • передача с обязательной тишиной на линии
  • модель опроса Modbus подразумевает только поллинг и только запрос/ответ
  • значения кроме uint16_t не регламентированы

Думаю, этого достаточно, чтобы отправить Modbus в музей.

anonymous
()
Ответ на: комментарий от anonymous

Ну, не хотелось бы встревать в дискуссию, потому что, боюсь, она ни к чему не приведет. Тем более, что тут никто протокол не выбирает, а он уже задан в устройстве, что не было ясно из самого топика, а потом разъяснили. Да и не modbus там, скорее всего (не ясно что там, в спецификации только написано, что открытый протокол).

Я не вижу больших проблем с этими пунктами. В той области, где применяется этот протокол, изменение этих особенностей не принесет решительного выигрыша.

передача с обязательной тишиной на линии

Если мы заменим обязательную тишину на символ начала кадра, то не получим сильного выигрыша в чем-то. Ну, сообщения могут идти чуть-чуть поплотнее, процедура определения начала кадра будет попроще, да. Кстати, в Modbus ASCII так и сделано: есть ":" в начале и CR LF в конце, обязательная тишина не используется.

модель опроса Modbus подразумевает только поллинг и только запрос/ответ

Шли запрос часто — получишь часто и ответ. Никакого заумного арбитража не нужно, чтобы разруливать устройства, которым одновременно хочется что-то сказать.

значения кроме uint16_t не регламентированы

Обычно комбинируют соседние регистры, чтобы 32 бита получить или float. Это не регламентировано в стандарте, но это гибко конфигурируется в софте, контроллерах и в самих промышленных устройствах. И есть уже сложившиеся практики (например, использование IEEE 754 для float).

Зато:

1) Протокол открытый и никакие роялти платить не надо.

2) Протокол простой, его можно реализовать в самом минимальном и дешевом микроконтроллере с UART.

3) Его поддержка есть практически везде, в любой системе SCADA.

Я бы не отправлял в музей. И в целом я не вижу пока признаков отказа от протокола. В разряде fieldbus он занимает значительную долю, хотя и меньшую, чем Profibus. В области Ethernet уже другие расклады, но и там он в варианте Modbus TCP широко распространен. Свежая аналитика по этому вопросу есть в интернете у разных источников.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.