представлены описания функций и примеры запросов. В данном случае мне нужна функция 0x05 write Coil. Запрос в HEX-формате выглядит следующим образом: 01 05 00 00 FF 00 8C 3A.
Где 01-(адрес прибора - 1байт); 05-(функция - 1байт); 00 00-номер реле (2 байта(слово)); FF 00-состояние (2 байта(слово)); 8C 3A-контрольная сумма (2 байта (слово)
В поле состояние возможно два варианта: 0xFF00 или 0x0000 (вкл. или выкл. соответственно)
Программой COMPump или ModBus Tester посылаю запрос:
Request
00:07 01 05 00 00 FF 00 8C 3A
получаю ответ:
Response
00:07 01 05 00 00 FF 00 8C 3A
Прибор выполняет команду.
Связь компьютера с прибором реализована через преобразователь интерфейса USB->RS485.
В сети нашел готовый пример на PIC16F877. В нем контроллер передает через UART сообщение "Hello World!"
Через MPLAB заменил его на команду "01 05 00 00 FF 00 8C 3A"
Запускаю Proteus с моделью собранной схемы. Виртуальный контроллер через COMPIM шлет этот запрос на включение реле,
но прибор не реагирует на команду. Пробовал садится на этот COM-порт терминалом. В нем отображаются переданные данные.
После прочтения описания на стандарт RS485, я так понимаю нужно не просто передать в порт данные, а еще и предварительно формировать их в определенном формате?
Если можно простой пример кода для любого контроллера. По аналогии сам дальше попробую разобраться и построить более сложную конструкцию.
Из руководства по эксплуатации на прибор:
Спойлер
На поле адреса выделяется 1 байт – что позволяет теоретически на однойшине данных находиться не более 255 приборов одновременно, соответственно
байт может принимать значение от 1 до 255, 0 служит для обращения ко всем сер-
верам одновременно. На практике число одновременно подключенных приборов не
более 32. Сообщения разделяются между собой паузами. По спецификации Modbus
RTU пауза составляет не менее интервала, необходимого на передачу 3 байт.
В приборах данный интервал равен 40 ms. Общее время, необходимое на
обмен запрос + ответ составляет 100ms
Кодирование передаваемых данных
Данные передаются байтами и словами (2 байта). Слова передаются
старшим байтом вперед, т.е. если передается слово 0x1234, то 0x12 в PDU идет
раньше 0x34.
Далее по тексту в поле контрольная сумма CRC16, которая служит для об-
наружения ошибок при передаче битов данных. У контрольной суммы младшее сло-
во приводится впереди, т.е. настоящая контрольная сумма перевернута (например:
0xBDCB для PC будет 0xCBBD).

