Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство для пользователей по применению приборов Термодат.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Mб
Скачать

4.3. Протокол обмена modbus

В протоколе MODBUS обмен производится при помощи последовательностей байт, каждый из байтов представляет собой код ASCII – символа. В последовательности байт закодирована передаваемая или принимаемая информация. Формат запросов и ответов следующий:

  • первый символ – заголовок команды, двоеточие «:» (ASCII код 3Ah);

  • далее идут два символа, задающие сетевой идентификатор прибора (адрес) который задается в виде целого шестнадцатеричного числа от 00 до FF, что в десятичной записи соответствует адресам от 0 до 255;

  • следующие два символа задают код выполняемой функции в виде шестнадцатеричного числа;

  • далее следуют данные, содержащие необходимую информацию и заданные в виде последовательности шестнадцатеричных цифр 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, B, C, D, E, F (вместо заглавных букв допустимы строчные);

  • далее в посылке идут два символа контрольной суммы передаваемой строки, заданной в виде шестнадцатеричного числа от 00 до FF (алгоритм вычислении контрольной суммы будет показан ниже);

  • завершают посылку два символа с кодами 0Dh и 0Ah («возврат каретки» и «перевод строки»).

В подсчете контрольной суммы передаваемой строки не участвуют заголовок (символ двоеточие) и последние два символа («возврат каретки» и «перевод строки»). Контрольная сумма – это сумма кодов символов, входящих в строку. При переполнении байта суммы бит переполнения отбрасывается. Остальные детали алгоритма понятны из приведенных ниже фрагментов программ подсчета контрольной суммы.

Реализация алгоритма контрольной суммы на языке программирования Delphi (Pascal)

Function LRC (s : string) : string;

var uLRC : byte;

sLRC : SmallInt;

i : integer;

begin

uLRC := 0;

for i:=2 to length(s) do uLRC:= uLRC + ORD(s[i]);

sLRC := - uLRC;

uLRC := sLRC;

result := IntToHex(uLRC,2);

end;

Реализация алгоритма контрольной суммы на языке C выглядит следующим образом:

static unsigned char LRC(auchMsg, usDataLen)

unsigned char *auchMsg ; /* sassage to calculate LRC upon */

unsigned short usDataLen ; /* quantity of bytes in message */

{

unsigned char uchLRC = 0 ; /* LRC char initialized */

while (usDataLen--) /* pass through message buffer */

uchLRC += *auchMsg++ ; /* add buffer byte without carry */

return ((unsigned char)(-((signed char)uchLRC))) ;

/* return twos complement */

}

Форматы запросов и ответов, адреса и коды параметров прибора

В следующей таблице приведены формы запросов и ответов для выполняемых функций

Функция

Код функции

Форма запроса:

Обозначение и количество передаваемых байт

Форма ответа:

Обозначение и количество получаемых байт

Читать несколько параметров

03h либо 04h

:

1

Adr

2

Fc

2

PAdr

4

PNum

4

LRC

2

CRLF

2

:

1

Adr

2

Fc

2

BNum

2

PVal1

4

PValN

4

LRC

2

CRLF

2

Записать один параметр

06h

:

1

Adr

2

Fc

2

PAdr

4

PVal1

4

LRC

2

CRLF

2

:

1

Adr

2

Fc

2

PAdr

4

PVal1

4

LRC

2

CRLF

2

Записать несколько параметров

10h

:

1

Adr

2

Fc

2

PAdr

4

PNum

4

BNum

2

PVal1

4

PValN

4

LRC

2

CRLF

2

:

1

Adr

2

Fc

2

PAdr

4

PNum

4

LRC

2

CRLF

2

Условные обозначения:

  1. Adr – сетевой адрес устройства, 2 символа

  2. Fc – код функции, 2 символа

  3. PAdr – адрес параметра, 4 символа

  4. PNum – количество запрашиваемых (передаваемых) параметров от PAdr включительно, 4 символа

  5. PVal1 .. PValN – значения параметров с адресами PAdr .. PAdr+(PValN-1), по 4 символа каждое значение

  6. BNum – количество полезных байт BNum = 2PNum, 2 символа

  7. LRC – контрольная сумма, 2 символа

  8. CRLF – символы c кодами 0Dh и 0Ah, 2 символа

Основные особенности:

  1. Если Adr = 00h («мастер-адрес»), то все приборы воспринимают данные, но ответа не следует

  2. Все параметры передаются и принимаются как двухбайтовые шестнадцатеричные числа в текстовом формате ASCII (на каждый байт по 2 символа), в языке программирования C этот тип называется unsigned int

  3. Если не существует параметра по запрашиваемому адресу (либо в случае ошибки), то вместо значения параметра посылается число 7FFFh

  4. Если проверка LRC в запросе не увенчалась успехом, то запрос не воспринимается и ответа не следует

  5. Если значение температуры 7D00h, то на данном канале обрыв, либо датчик отсутствует; если значение температуры 7D64h, то по каким-либо причинам нет (не было) данных от измерительного модуля

Адреса параметров:

Адрес параметра представляет собой двухбайтовое число, записанное в виде двух символов. Адрес параметра содержит код параметра (9 бит) и номер канала (7 бит). Структура адреса параметра представлена ниже в виде битовой диаграммы. Здесь же указаны диапазоны для кода параметра и номера канала. Нумерация битов справа налево.

В следующей таблице приведены соответствия кодов параметров различным параметрам прибора. Для удобства указаны значения кодов в шестнадцатеричной системе счисления в виде двух байтов, поэтому первые биты этих чисел нулевые.

Код параметра

(или диапазон кодов)

Название параметра

Единицы измерения

(если есть)

0000h

Сетевой адрес устройства

0001h .. 000Ch

Текущая температура

(подряд все 12 каналов)

0,1 0C

0041h .. 004Ch

Аварийная уставка для первого реле

(подряд все 12 каналов)

0,1 0C

0081h .. 008Ch

Аварийная уставка для второго реле

(подряд все 12 каналов)

0,1 0C

00C9h

Текущая температура на запрашиваемом канале (см. структуру адреса параметра)

0,1 0C

00Cah

Аварийная уставка для первого реле на запрашиваемом канале

0,1 0C

00CBh

Аварийная уставка для второго реле на запрашиваемом канале

0,1 0C

00CDh

Нормальный период архива

Секунды

00CEh

Аварийный период архива

Секунды

00D0h .. 00D5h

Регистры для работы с архивом

00D0h .. 00D2h

Запрашиваемые из архива дата и время

00D0h

Старший байт – год (0 .. 99), младший – месяц (1 .. 12)

00D1h

Старший байт – день месяца, младший – количество часов (0 .. 23)

00D2h

Старший байт – количество минут (0 .. 59), младший – количество секунд (0 .. 59)

00D3h

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

0,1 0C

00D4h

Интервал получения записей

Секунды

00D5h

При чтении этого регистра происходит увеличение запрашиваемых даты и времени на заданный в регистре 00D4h интервал. Далее происходит поиск, и посылается найденное значение температуры на заданном канале (поиск занимает некоторое время). Регистры 00D0h .. 00D2h при этом не изменяются

0,1 0C

00F0h

Идентификатор прибора: старший байт – серия 26h, младший – версия прошивки (01 .. FF)

00F1h

Количество каналов (12) для совместимости с другими моделями

Примеры обмена c приборами в протоколе MODBUS

Читать параметры с адресами 0001h .. 000Ch (значения температуры на всех 12 каналах) на приборе с сетевым идентификатором (адресом) 05h.

Строка-запрос:

:05030001000CA4<CRLF> 

Ответ: :05031800B07D007D007D007D007D0000AF7D007D007D007D0000AF7C<CRLF> 

На каналах от 1 до 12 получены следующие значения: 17,6 0C; Обрыв; Обрыв; Обрыв; Обрыв; Обрыв; 17,5 0C; Обрыв; Обрыв; Обрыв; Обрыв; 17,5 0C

Установить (записать) значение нормального периода архива 5 секунд.

Строка-запрос:

:050602CD000587<CRLF> - 

Примечание: адрес параметра 02CDh содержит номер канала 2. Этот номер игнорируется, т.к. период архива один на все каналы

Ответ:

:050602CD000587<CRLF> 

Установить в архиве запрашиваемые дату и время 06.12.04 19:10:05.

Строка-запрос:

:051000D0000306040C06130A05C6<CRLF> 

Ответ:

:051000D00003A3<CRLF>

Найти в архиве по запрашиваемым в предыдущем примере данным значение температуры на седьмом канале прибора с адресом 05h.

Строка-запрос:

:05040CD300018C<CRLF> 

Ответ:

:05040200B300<CRLF> 

Найдено значение 17,9 0C

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]