вот кому интересно функция на паскале подсчета CRC16 для ModBus:
function CRC16(Msg: string) :Word;
var
i, j :Integer;
begin
Result := $FFFF;
for i := 1 to Length(Msg)
do
begin
Result := Ord(Msg[i]) xor Result;
for j := 1 to 8
do
begin
if (Result and 1) = 1
then
Result := (Result shr 1) xor $A001
else
Result := Result shr 1;
end;
end;
end;
пример формирования посылки для запроса состояний дискретных входов на ModBus RTU для прибора с адресом 16:
Здравствуйте, товарищи специалисты!
Требуется помощь по подключению устройства Modbus с проверкой контрольной суммы.
Находимся в командировке на второй ветке БАМа, Новый Ургал.
Имеется система водоподготовки с экипировочными колонками на тепловозы.
В данных колонках имеются платы ввода/вывода на микроконтроллере STM (вх.-пуск/стоп, вых.-индикация).
Общаться с платами нужно запросом с контрольной суммой. Ранее с формированием такой связи не сталкивался. (Привычно конечно стандартным решением задания адреса и регистра)
Нужен пример для ПЛК110.60М v2 (или др.) Испробовал на примерах с форума, не выходит. Не всё значит понятно.
Понятен принцип, следующий:
1. Используем библиотеку работы с портом.
2. Составляем запрос в байтах
3. Открываем порт
4. Посылаем байтовый запрос
5. Закрываемся и слушаем ответ
6. Принимаем данные и оцениваем значение.
Производитель описывает запрос из 6 байт.
За основу брал пример с форума, где описан опрос МВВ аналоговых сигналов из 8 байтов.
Из примера снимал 2 байта, указал адрес, запрос состояний, контрольную сумм, порт(1 или 2 пробовал), скорость 19200.
Смущает длина запроса 8 байт, в описании ведь 6, поменял на 6. Ошибка отсутствия связи №81 так и не уходит не уходит.
ST код смотрел, в основном всё понятно
Кто может откликнуться, навести на цель?
Мне бы зацепиться по адресу с платой, а дальше сам.