Не могу разобраться с протоколом передачи данных
- Войдите на сайт для отправки комментариев
Чт, 20/04/2017 - 19:44
У меня есть прибор и к нему подключаются различные датчики по RS485, для программирования адреса датчика и других параметров есть специальная программа, я хотел бы сделать небольшой прибор, чтобы не таскать с собой ноутбук постоянно. Протокол похож на modbus rtu, но у меня не сходится контрольная сумма. И для отправки команды неизвестному датчику используется адрес FF, а не 00.
Вот примеры посылок и принятых пакетов
https://www.google.com/search?q=как+сделать+скриншот
Вот пример посылки FF 03 00 00 00 14 EA
FF - это адрес датчика
03 - чтение значений из нескольких регистров хранения
00 00 - start address
00 14 - num of coils
EA - CRC, как я понял
Щас читал про Modbus, и похоже это не rtu, а
Modbus ASCII — для обмена используются только ASCII символы. Для проверки целостности используется однобайтовая контрольная сумма. Начало и конец сообщения помечаются специальными символами (начало сообщения ":", конец сообщения CR/LF).
контрольную сумму пробовал многими калькуляторами подобрать и в итоге нашел CheckSum8 2s Complement
Осталось все это в ардуино как-то реализовать..
Вот так сделал отправку:
проверил, в Symply Modbus Slave работает.
Теперь самое сложное для меня это обработать ответ от датчика в ардуино, подскажите каким образом можно это сделать?
А как же google? Вот первая же ссылка https://github.com/pepsilla/Arduino/tree/master/MODBUS/ASCII.
А как же google? Вот первая же ссылка https://github.com/pepsilla/Arduino/tree/master/MODBUS/ASCII.
Там пример для двух ардуин, я пробовал отправлять с ее помощью, и там отправляется CRC 16 bit, а в моем случае должно быть 8 бит
Да и не совсем понятная мне библиотека
Для просветления читаем http://modbus.org/docs/PI_MBUS_300.pdf . (Особенно стр. 8 рис.3, 110,111)
В вашем случае полный фрейм :FF 03 00 00 00 14 EA CR LF - в нем EA это не CRC , а LRC - appendix C мануала модбус. Это два HEX charters от 8 битной LRC. Пример расчета LRC дан на си.
Совершенно понятная библиотека. Использовать просто как грабли. Заряжаешь пакет и отправляешь. Судя по тексту библиотеки в отправку вствляется именно LRC. https://github.com/pepsilla/Arduino/blob/master/MODBUS/ASCII/libraries/AsciiModbusMaster/AsciiModbusMaster.cpp (строки 614-628).
А вообще (строка 590) void sendPacket(unsigned char bufferSize) можно взять себе и после маленькой замены способа отправки использовать для отправки запроса к слейву. Но тогда логику приёма ответа придётся писать самому.