Tag Archives: Modbus

Опрос МВА 8 ПЛК с программной средой CoDeSys 3.5

Пример на языке ST реализует работу по интерфейсу RS-485: чтение 8 входов из прибора МВА8 с адресом 16. Для работы примера в PLC Configuration должны быть подключены библиотеки SisLibCom, OwenNet, ComService.

PROGRAM PLC_PRG

VAR

get_fl_owen:OWEN_GET_REAL; (*Чтение параметра типа Real*)

COM_SERVICE1: COM_SERVICE;

cmpl: BOOL; (* признак завершения операции *)

err: INT; (*номер ошибки*)

port_opened: BYTE := 0; (*состояние порта*)

Settings: COMSETTINGS;(* настройки последовательного порта *)

com_num: PORTS:=0 (*0 — RS-485, 1 — RS-232*);

TimeOut: TIME:=T#50ms;(*таймаут*)

Enabl: BOOL:=TRUE; (*состояние работы блока*)

wTime: WORD; (*значение времени для измери-теля*)

A: REAL; (*считанное значение*)

addres: INT:=16; (*адрес МВА8*)

B: ARRAY [0..7] OF REAL; (*массив для хранения значений входов МВА8*)

i: INT; (*номер входа МВА**)

END_VAR

(*Устанавливаем настройки COM-порта*)

IF port_opened=0 THEN

Settings.Port:=com_num; (*номер COM-порта*)

Settings.dwBaudRate:=115200; (*скорость*)

Settings.byParity:=0;

Settings.dwTimeout:=0;

Settings.byStopBits:=0;

Settings.dwBufferSize:=0;

Settings.dwScan:=0;

END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)

IF COM_SERVICE1.ready THEN

port_opened:=2;

END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

(*чтение 8 входов из прибора МВА8 с адресом 16 *)

get_fl_owen(

Enable:=Enabl , (* разрешение работы блока *)

Addr:=addres , (*адрес прибора*)

AddrLen:=A8BIT , (*длина адреса*)

Name:=’read’ , (*имя параметра, значение которого считываем*)

Index:=65535 , (*индекс параметра*)

RealType:=FLOAT32T , (*тип параметра, значение которого считываем*)

ComHandle:= Settings.Port, (*номер COM-порта*)

TimeOut:=TimeOut , (*Таймаут T#50ms*)

Complete=>cmpl , (* скопировать признак завершения операции *)

Value=>a , (*считанное значение*)

wTime=>wTime , (*значение времени для измерителя*)

Error=> err ); (* скопировать регистр ошибок *)

(*если установлен признак завершения операции, то *)

IF Enabl = FALSE THEN

Enabl := TRUE;

END_IF

(*Если завершен обмен и нет ошибок*)

IF cmpl THEN

IF (err=0) THEN

B[i]:=a; (*присваиваем массиву значение на входе*)

ELSE

Enabl := FALSE;

END_IF;

i:=i+1; (*увеличиваем номер входа*)

addres:=16+i; (*увеличиваем адрес*)

IF (i=8) THEN (*если номер входа меньше 8*)

addres:=16;

i:=0;

END_IF

END_IF

END_IF

Опрос ТРМ 201 по сети RS-485 с использованием ПЛК со средой программирования CoDeSys 3.5

Пример на языке ST реализует работу по интерфейсу RS-485: Чтение и за-пись двух параметров с одного прибора ТРМ201. Для работы примера в PLC Con-figuration должны быть подключены библиотеки SisLibCom, OwenNet, ComService.

PROGRAM PLC_PRG

VAR

get_fl_owen:OWEN_GET_REAL; (*Чтение параметра типа Real*)

send_fl_owen:OWEN_SET_REAL; (*Запись параметра типа Real*)

COM_SERVICE1: COM_SERVICE; (*открытие COM-порта*)

cmpl: BOOL; (* признак завершения операции *)

err: INT; (*номер ошибки*)

port_opened: BYTE := 0; (*состояние порта*)

Settings: COMSETTINGS; (* настройки последова-тельного порта *)

com_num: PORTS:=0; (*0 — RS-485, 1 — RS-232*)

TimeOut: TIME:=T#50ms; (*таймаут*)

Enabl: BOOL:=TRUE; (*состояние работы блока*)

wTime: WORD; (*значение времени для измери-теля*)

master1: BYTE := 0;

A: REAL; (*считанное значение из ТРМ201*)

b: REAL:=30;

END_VAR

(*Устанавливаем настройки COM-порта*)

IF port_opened=0 THEN

Settings.Port:=com_num; (*номер COM-порта*)

Settings.dwBaudRate:=115200; (*скорость*)

Settings.byParity:=0;

Settings.dwTimeout:=0;

Settings.byStopBits:=0;

Settings.dwBufferSize:=0;

Settings.dwScan:=0;

END_IF Описание интерфейса библиотек ФБ для работы с протоколом ОВЕН 19

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)

IF COM_SERVICE1.ready THEN

port_opened:=2;

END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

CASE master1 OF

(*чтение параметра типа Real из прибора ТРМ201 с адресом 8 из параметр с именем PV и индексом 0*)

0: get_fl_owen(

Enable:=Enabl , (* разрешение работы блока *)

Addr:=8 , (*адрес прибора*)

AddrLen:=A8BIT , (*длина адреса*)

Name:=’pv’ , (*имя параметра, значение которого считываем*)

Index:=65535 , (*индекс параметра*)

RealType:=FLOAT24 , (*тип параметра, значение которого считываем*)

ComHandle:= Settings.Port, (*номер COM-порта*)

TimeOut:=TimeOut , (*Таймаут T#50ms*)

Complete=>cmpl , (* скопировать признак готовности результата *)

Value=>a , (*считанное значение*)

wTime=>wTime , (*значение времени для измерителя*)

Error=> err ); (* скопировать регистр ошибок *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=1;(*переходим к выполнению следующего блока*)

END_IF

1:(*Запись параметра типа Real в прибор ТРМ201 с адресом 8 в параметр с именем SP и индексом 0*)

send_fl_owen(

Enable:=Enabl , (* разрешение работы блока *)

Addr:= 8, (*адрес прибора*)

AddrLen:=A8BIT, (*длина адреса*)

Name:= ‘sp’, (*имя параметра, значение которого записываем в ТРМ201*)

Index:= 0, (*индекс параметра*) Описание интерфейса библиотек ФБ для работы с протоколом ОВЕН 20

RealType:= FLOAT24, (*тип параметра, значение которого записываем*)

Value:=b , (*параметр, значение значение которого записываем в TPM201*)

ComHandle:=Settings.Port, (*номер COM-порта*)

TimeOut:=TimeOut , (* время тайм-аута [мс] — макс. за-держка на обработку запроса *)

Complete=>cmpl , (* скопировать признак готовности результата *)

Error=> err); (* скопировать регистр ошибок *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=0;(*переходим к выполнению следующего блока*)

END_IF

END_CASE

IF Enabl = FALSE THEN

Enabl := TRUE;

END_IF

IF err <> 0 THEN

Enabl := FALSE;

END_IF

END_IF

Пример записи переменных по Modbus для CoDeSys 3

Пример на языке ST реализует работу по интерфейсу RS-485: запись параметров типа Int (функция Modbus 06 — MB_WR_SNG_REG) и записи параметра типа Float (функция Modbus 16 — MB_WR_REGS). Для работы примера в PLC Configuration должны быть подключены библиотеки SisLibCom, Modbus, ComService.

PROGRAM PLC_PRG

VAR

send1_modbus:MB_WR_SNG_REG; (*функция 06 — запись параметра*)

send2_modbus: MB_WR_REGS; (*функция 16 — запись параметров*)

COM_SERVICE1: COM_SERVICE; (*ФБ открытия порта*)

Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)

cmpl: BOOL; (* признак завершения операции *)

port_opened: BYTE := 0; (*состояние порта*)

Init: BOOL; (* признак инициализации пользовательской программы *)

Settings:COMSETTINGS; (* настройки последовательного порта *)

com_num: PORTS:=1; (*0 — RS-485, 1 — RS-232*)

enabl: BOOL; (*состояние работы блока*)

err: INT; (*номер ошибки*)

TimeOut: TIME:=T#50ms; (*таймаут*)

Exception: BYTE;

DataSize: WORD;

master1: BYTE;

t: DWORD; (*переменная для организации счетчика*)

A: WORD := 0; (*счетчик*)

f1:DINT:=65; (*Записываемый параметр типа DINT*)

f2:REAL:=12.7; (*Записываемый параметр типа REAL*)

ptr_f2:POINTER TO BYTE;

END_VAR

(*Организуем счетчик, что бы передавать эти данные по сети*)

t:=t+1;

IF (t MOD 1000)=0 THEN

A := A + 1;

IF A > 9999 THEN

A := 0;

END_IF

(*Устанавливаем настройки COM-порта*)

IF port_opened=0 THEN

Settings.Port:=com_num; (*номер COM-порта*) Описание интерфейса библиотеки ФБ для работы с протоколом Modbus

Settings.dwBaudRate:=115200; (*скорость*)

Settings.byParity:=0;

Settings.dwTimeout:=0;

Settings.byStopBits:=0;

Settings.dwBufferSize:=0;

Settings.dwScan:=0;

END_IF

(*Открываем COM-порт*)

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)

IF COM_SERVICE1.ready THEN

port_opened:=2;

END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

CASE master1 OF

0: (* функция 06 — запись параметра типа Int в прибор с адресом 1 в регистр 0*)

send1_modbus(

Enable:=enabl , (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=1 , (*адрес*)

RegAddr:=0 , (*регистр*)

Value:=A, (*значение переменной, которое надо передать*)

ComHandle:= Settings.Port, (*номер сом-порта*)

TimeOut:=TimeOut , (*таймаут T#50ms*)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err ); (* скопировать регистр ошибок *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=1; (*переходим к выполнению следующего блока*)

END_IF

1: (* функция 16 — запись параметров типа Int (регистр 4) и Real (регистр 6) в прибор с адресом 2 *)

(*запись в буффер параметра типа INT*)

Buffer[1] := DINT_TO_BYTE(f1);

Buffer[0] := DINT_TO_BYTE( SHR(f1,8));

Buffer[3] := DINT_TO_BYTE( SHR(f1,16));

Buffer[2] := DINT_TO_BYTE( SHR(f1,24));

(*запись в буффер параметра типа Float*)

ptr_f2:=ADR(f2);

buffer[5] := ptr_f2^;

ptr_f2:=ptr_f2+1;

21 Описание интерфейса библиотеки ФБ для работы с протоколом Modbus 22

buffer[4] := ptr_f2^;

ptr_f2:=ptr_f2+1;

buffer[7] := ptr_f2^;

ptr_f2:=ptr_f2+1;

buffer[6] := ptr_f2^;

send2_modbus(

Enable:= enabl, (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=2 , (*адрес*)

FirstAddr:= 4, (*номер регистра*)

Quantity:= 4, (*количество записываемых регистров*)

ComHandle:=Settings.Port ,(*номер сом-порта*)

TimeOut:=TimeOut , (*таймаут T#50ms*)

Buffer:=Buffer , (* буфер данных *)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err , (* скопировать регистр ошибок *)

RegCnt=> DataSize); (*кол-во считанных байтов *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=0;(*переходим к выполнению следующего блока*)

END_IF

END_CASE

IF enabl = FALSE THEN

enabl := TRUE;

END_IF

IF err <> 0 THEN

enabl := FALSE;

END_IF

END_IF

Пример опроса параметров по RS-485

Пример на языке ST реализует работу по интерфейсу RS-485: чтение параметров типа Int и типа Real (Float) (функция Modbus 03 — MB_RD_HOLD_REGS), а также считывания трех параметров типа Int (функция Modbus 04 — MB_RD_INP_REGS). Для работы примера в PLC Configuration должны быть подключены библиотеки SisLibCom, Modbus, ComService.

PROGRAM PLC_PRG

VAR

get1_modbus: MB_RD_HOLD_REGS; (*функция 03 — чтение параметра типа INT*)

get2_modbus: MB_RD_INP_REGS; (*функция 04 — чтение трех параметров типа INT*)

get3_modbus: MB_RD_HOLD_REGS; (*функция 03 — чтение параметра типа Float*)

Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)

cmpl: BOOL;

port_opened: BYTE := 0;

Init: BOOL; (* признак инициализации пользовательской программы *)

Settings:COMSETTINGS;(* настройки последовательного порта *)

com_num: PORTS:=0; (*0 — RS-485, 1 — RS-232*)

enabl: BOOL; (*состояние работы блока*)

err: INT; (*номер ошибки*)

TimeOut: TIME:=T#50ms;(*таймаут*)

Exception: BYTE;

DataSize: WORD;

master1: BYTE:= 1;

t: DWORD; (*переменная для организации счетчика*)

A: WORD := 0; (*счетчик*)

x:WORD; (*считанное значение*)

x1: WORD; (*переменная для записи по сети*)

x2: WORD; (*переменная для записи по сети*)

x3: WORD; (*переменная для записи по сети*)

d: REAL; (*считанное значение*)

ptr_D:POINTER TO BYTE;

COM_SERVICE1: COM_SERVICE;

END_VAR

(*Организуем счетчик, что бы передавать эти данные по сети*)

t:=t+1;

IF (t MOD 1000)=0 THEN

A := A + 1;

IF A > 9999 THEN

A := 0;

END_IF

(*Устанавливаем настройки COM-порта*)

IF port_opened=0 THEN

Settings.Port:=com_num; (*номер COM-порта*)

Settings.dwBaudRate:=115200; (*скорость*)

Settings.byParity:=0;

Settings.dwTimeout:=0;

Settings.byStopBits:=0;

Settings.dwBufferSize:=0;

Settings.dwScan:=0;

END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)

IF COM_SERVICE1.ready THEN

port_opened:=2;

END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

CASE master1 OF

0: (* функция 03 инт — ФБ считывает значение параметра типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)

get1_modbus(

Enable:=enabl , (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=2 , (*адрес*)

FirstAddr:=8 , (*номер регистра*)

Quantity:=1, (*количество регистров*)

ComHandle:=Settings.Port ,(*номер COM-порта*)

TimeOut:=TimeOut , (*Таймаут T#50ms*)

Buffer:=Buffer , (* буфер данных *)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err , (* скопировать регистр ошибок *)

ByteCnt=>DataSize ); (*кол-во считанных байтов *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)

x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);

END_IF

master1:=1; (*переходим к выполнению следующего ФБ*)

END_IF

1: (* функция 03 флоат — ФБ считывает значение параметра типа

int из прибора с адресом 2 в регистр с номаром 10 по протоколу Modbus-ASCII *)

get3_modbus(

Enable:=enabl , (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=2 , (*адрес*)

FirstAddr:=10 , (*номер регистра*)

Quantity:=2, (*количество регистров*)

ComHandle:=Settings.Port ,(*номер COM-порта*)

TimeOut:=TimeOut , (*Таймаут T#50ms*)

Buffer:=Buffer , (* буфер данных *)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err , (* скопировать регистр ошибок *)

ByteCnt=>DataSize ); (*кол-во считанных байтов *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

master1:=2;(*переходим к выполнению следующего ФБ*)

IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа FLOAT*)

ptr_D:=ADR(d);

ptr_D^:=buffer[1];

ptr_D:=ptr_D+1;

ptr_D^:=buffer[0];

ptr_D:=ptr_D+1;

ptr_D^:=buffer[3];

ptr_D:=ptr_D+1;

ptr_D^:=buffer[2];

END_IF

END_IF

2: (* функция 04 инт — ФБ считывает значения трех параметров типа Int из прибора с адресом 2 начиная с регистра с номeром 12*)

get2_modbus(

Enable:= enabl, (* разрешение работы блока *)

Mode:=MB_ASCII , (*режим передачи*)

DevAddr:=2 , (*адрес*)

FirstAddr:=12 , (*номер регистра*)

Quantity:=6 , (*количество регистров*)

ComHandle:= Settings.Port,(*номер COM-порта*)

TimeOut:=TimeOut , (*Таймаут T#50ms*)

Buffer:=Buffer , (* буфер данных *)

Complete=>cmpl , (* скопировать признак завершения операции *)

Exception=>err , (* скопировать регистр ошибок *)

ByteCnt=> DataSize); (*кол-во считанных байтов *)

(*если установлен признак завершения операции, то *)

IF cmpl THEN

IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)

x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);

x2:=BYTE_TO_WORD(BUFFER[5]) OR SHL(BYTE_TO_WORD(BUFFER[4]),8);

x3:=BYTE_TO_WORD(BUFFER[9]) OR SHL(BYTE_TO_WORD(BUFFER[8]),8);

END_IF

master1:=0;(*переходим к выполнению следующего ФБ*)

END_IF

END_CASE

IF enabl = FALSE THEN

enabl := TRUE;

END_IF

IF err <> 0 THEN

enabl := FALSE;

END_IF

END_IF

Подключение ПЧ Delta к MasterSCADA

Данный пример демонстрирует работу с частотным преобразователем Delta Eclectronics VFD-E. Частотный преобразователь должен быть настроен на протокол Modbus RTU, также необходимо сделать несколько дополнительных настроек.

Настройки частотного преобразователя.

Необходимо задать настройки следующих параметров.

Аналогичные настройки в MasterLink (в SCADA).

Настройки группы параметр 02.xx нужны для управления частотным преобразователем со SCADA системы (пуск/стоп, вперед/назад, реверс, задание частоты). Если нужен только мониторинг состояния частотного преобразователя, то нужно задать только параметры из групп 09.xx – в этом случае в SCADA будут заблокированы кнопки управления.

Настройки MasterSCADA.

Необходимо в режиме разработки задать номер COM порта, через который будет осуществляться работа с преобразователем частоты.

Остальные параметры менять не нужно.

ГЕНЕРАЦИЯ LRC/CRC в сообщении ModBUS

ГЕНЕРАЦИЯ LRC/CRC

Генерация LRC

Longitudinal Redundancy Check(LRC) это один байт. LRC вычисляется передающим устройством и добавляется к концу сообщения. Принимающее устройство также вычисляет LRC в процессе приема и сравнивает вычисленную величину с полем контрольной суммы пришедшего сообщения. Если суммы не совпали — то имеет место ошибка.

LRC вычисляется сложением последовательности байтов сообщения, отбрасывая все переносы, и затем двойным дополнением результата. LRC — это 8-ми битовое поле, где каждое новое прибавление символа, приводящее к результату более чем 255, приводит к простому перескакиванию через 0. Так как это поле не является 9-ти битовым, перенос отбрасывается автоматически.

Алгоритм генерации LRC:

1. Сложить все байты сообщения, исключая стартовый символ ‘:’ и конечные CRLF, складывая их так, чтобы перенос отбрасывался.

2. Отнять получившееся значение от числа FF(Hex) — это является первым дополнением.

3. Прибавить к получившемуся значению 1 — это второе дополнение.

РАЗМЕЩЕНИЕ LRC В СООБЩЕНИИ

Когда 8-ми битовое поле LRC (2 ASCII символа) передается в сообщении, то старший символ будет передан первым, а за ним — младший. Например, если значение LRC 61 hex(0110 0001):

 

‘:’ Адрес Функ ция Сч-к байт Байт Байт Байт Байт LRC Ст. LRC Мл. CR LF
6 1

 

Пример функции на языке C реализующей генерацию LRC приведен ниже. Функция принимает два аргумента:

unsigned char *auchMsg; Указатель на буфер данных

unsigned short usDataLen; Количество байт в буфере

Функция возвращает LRC как тип unsigned char.

ПРИМЕР

static unsigned char LRC(auchMsg, usDataLen)

unsigned char *auchMsg;/* Сообщение над которым */

/* вычисляется LRC */

unsigned char usDataLen; /* Количество байт в сообщении */

{

unsigned char uchLRC=0; /* Инициализация LRC */

while(usDataLen)

uchLRC+=*auchMsg++;

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

}

Генерация CRC

CRC это 16-ти разрядная величина т.е. два байта. CRC вычисляется передающим устройством и добавляется к сообщению.Принимающее устройство также вычисляет CRC в процессе приема и сравнивает вычисленную величину с полем контрольной суммы пришедшего сообщения. Если суммы не совпали — то имеет место ошибка.

16-ти битовый регистр CRC предварительно загружается числом FF hex. Процесс начинается с добавления байтов сообщения к текущему содержимому регистра. Для генерации CRC используются только 8 бит данных. Старт и стоп биты, бит паритета, если он используется, не учитываются в CRC.

В процессе генерации CRC, каждый 8-ми битовый символ складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра. Результата сдвигается в направлении младшего бита, с заполнением 0 старшего бита. Младший бит извлекается и проверяется. Если младший бит равен 1, то содержимое регистра складывается с определенной ранее, фиксированной величиной, по ИСКЛЮЧАЮЩЕМУ ИЛИ. Если младший бит равен 0, то ИСКЛЮЧАЮЩЕЕ ИЛИ не делается.

Этот процесс повторяется пока не будет сделано 8 сдвигов. После последнего (восьмого) сдвига, следующий байт складывается с содержимым регистра и процесс повторяется снова. Финальное содержание регистра, после обработки всех байтов сообщения и есть контрольная сумма CRC.

Алгоритм генерации CRC:

1. 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC.

2. Первый байт сообщения складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра CRC. Результат помещается в регистр CRC.

3. Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0.

4. (Если младший бит 0): Повторяется шаг 3 (сдвиг)

(Если младший бит 1): Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex.

5. Шаги 3 и 4 повторяются восемь раз.

6. Повторяются шаги со 2 по 5 для следующего сообщения. Это повторяется до тех пор пока все байты сообщения не будут обработаны.

7. Финальное содержание регистра CRC и есть контрольная сумма.

РАЗМЕЩЕНИЕ CRC В СООБЩЕНИИ

При передаче 16 бит контрольной суммы CRC в сообщении, сначала передается младший байт, затем старший. Например, если CRC равна 1241 hex :

 

Адрес Функция Счетчикк байт Данные Данные Данные Данные CRC Ст. CRC Мл.
41 12

ПРИМЕР

Пример функции на языке C реализующей генерацию CRC приведен ниже. Все возможные величины CRC загружены в два массива. Один массив содержит все 256 возможных комбинаций CRC для старшего байта поля CRC, другой массив содержит данные для младшего байта. Идексация CRC в этом случая обеспечивает быстрое выполнение вычислений новой величины CRC для каждого нового байта из буфера сообщения.

Функция принимает два аргумента:

unsigned char *puchMsg; /* Указатель на буфер */

unsigned short usDataLen; /* Количество байтов в буфере */

Функция возвращает CRC как тип unsigned short.

static unsigned char auchCRCHi[] = { 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80, 0x22,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1, 0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x00,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40

}

static char auchCRCLo[] = { 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05, 0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA, 0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA, 0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15, 0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,0xF0, 0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35, 0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B, 0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA, 0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27, 0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60, 0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64, 0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB, 0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE, 0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,0x77,0xB7, 0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91, 0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54, 0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99, 0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E, 0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44,0x84,0x85,0x45,0x87,0x47,0x46, 0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40

}

unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg;

unsigned short usDataLen;

{

unsigned char uchCRCHi = 0xFF;

unsigned char uchCRCLo = 0xFF;

while (usDataLen—)

{

uIndex = uchCRCHi

*puchMsg++;

uchCRCHi = uchCRCLo

auchCRCHi[uIndex];

uchCRCLo = auchCRCLo[uIndex];

}

return (uchCRCHi << 8 | uchCRCLo);

}

 

    ОЦЕНКА ВРЕМЕНИ ПОСЛЕДОВАТЕЛЬНОЙ ПЕРЕДАЧИ ModBUS

    ПОСЛЕДОВАТЕЛЬНОСТЬ ПЕРЕДАЧИ

    Ниже приведена действий при последовательной передаче Modbus. Символы указанные в скобках ссылаются на примечания, перечисленные после списка действий.

    1. Главное устройство Modbus Формирует сообщение.

    2. Проверяются статусы RTS и CTS модема главного. (A)

    3. Сообщение запроса передается подчиненному.(B)

    4. Подчиненный принимает сообщение запроса. (C)(D)

    5. Подчиненный вычисляет контрольную сумму. (E)

    6. Проверяются статусы RTS и CTS модема подчиненного. (F)

    7. Ответное сообщение передается главному. (B)

    8. Главный производит необходимые действия над принятым отве-

    том и данными.

    ПРИМЕЧАНИЯ

    (A) Если выводы RTS и CTS соединены вместе, то это время незначительно. Для модема J478, это время около 5 мс.

    (B) Следующая формула оценивает время передачи:

    1000 Х (счетчик символов) Х (битов в символе)

    Время = —————————————————

    Скорость передачи

    (C) Modbus сообщение обрабатывается в конце скана контроллера. В худшем случае задержка будет равна времени одного скана. В среднем задержка составляет 0.5 скана.

    Время, выделяемое для обслуживания портов Modbus в конце каждого скана контроллера(перед началом нового), зависит от модели контроллера. Время для каждой модели описано ниже.Для 484 контроллера это время составляет приблизительно 1.5 мс.

    Для 584 и 984 контроллера время составляет приблизительно 1.5 мс. Порты обслуживаются последовательно, начиная с порта 1.

    Для 184/384 контроллеров время зависит от количества принимаемых данных. Это время варьируется от минимального 0.5 мс до максимального около 6.0 мс (для 100 регистров), или 7.0 мс (для 800 выходов).Если с контроллером используется программная панель, то Modbus порт отключается.

    (D) Modbus Функции с 1 по 4, 15 и 16 позволяет главному устройству запросить больше данных чем то количество, которое может обработать контроллер в течении времени выделяемого на обслуживание портов. Если подчиненный не успел обработать все данные, он может буферизировать их и обработать позже.

    Ниже приведены данные, которые могут быть обработаны за один цикл обслуживания Modbus порта.

    Дискреты Регистры
    Micro 84 16 4
    184/384 800 100
    484 32 16
    584 64 32
    984A/B/X 64 32
    984-X8X 1000 125

    Примечание: ‘984-X8X’ ссылается на slot-mount модели(984-385, -685 и т.д.).

    Для 884, время обработки множественных данных следующее: Чтение 700 выходов: 14 сканов             Установка единич. выхода: 3 скана Чтение 256 входов: 7 сканов               Установка регистра: 3 скана Чтение 125 вых. рег-ов: 5 сканов Установка 768 выходов: 18 сканов Чтение 125 вх. рег-ов: 8 сканов Установка 100 рег.: 10 сканов

    (E) Вычисление контрольной суммы LRC — около 1 мс. Вычисление контрольной суммы CRC — около 0.3 мс для каждых 8-ми бит данных возвращаемых в ответе.

    ПРИМЕЧАНИЯ ДЛЯ 584 И 984A/B/X

    Это примечание касается только 584 и 984A/B/X контроллеров.

    СКОРОСТЬ ПЕРЕДАЧИ: Когда используются оба Modbus порта 1 и 2, максимальная доступная скорость передачи — 19 200 бод.

    БЛОКИРОВКА ПОРТА: Когда вы используете ASCII режим, избегайте посылки сообщений с ‘нулевой длиной данных’, или сообщений без адреса устройства. Например, это неправильное сообщение:

    : CR LF

    При использовании такого рода сообщений может иметь место случайная блокировка порта.

    ПРИЗНАК КОНЦА ASCII СООБЩЕНИЯ: Нормальное ASCII сообщение должно заканчиваться парой CRLF. При использовании контроллеров 584 и 984A/B/X, ASCII сообщение может заканчиваться после поля контрольной суммы LRC (без установки символов CRLF), если после поля LRC имеет место интервал по крайней мере 1 сек. Если это случилось, контроллер считает что сообщение закончилось нормально.

     

      МАКСИМАЛЬНЫЕ ПАРАМЕТРЫ ДЛЯ ЗАПРОСА/ОТВЕТА ModBUS

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

      184/384  Функция Описание Запрос Ответ
      1 Read Coil Status 800 Выходов 800 Выходов
      2 Read Input Status 800 Входов 800 Входов
      3 Read Holding Registers 100 Регистров 100 Регистров
      4 Read Input Registers 100 Регистров 100 Регистров
      5 Force Single Coil 1 Выход 1 Выход
      6 Preset Single Register 1 Регистр 1 Регистр
      7 Read Exeption Status Не доступна 8 Выходов
      8 Diagnostics Не доступна Не доступна
      9 Program 484 Не поддерживается Не поддерживается
      10 Poll 484 Не поддерживается Не поддерживается
      11 Fetch. Comm. Event Ctr. Не доступна Не доступна
      12 Fetch. Comm. Event Log Не доступна 70 байтов данных
      13 Program Controller 32 байта данных 32 байта данных
      14 Poll Controller Не доступна 32 байта данных
      15 Force Multiply Coils 800 Выходов 800 Выходов
      16 Preset Multiply Regs 100 Регистров 100 Регистров
      17 Report Slave ID Не доступна Не доступна
      18 Program 884/M84 Не поддерживается Не поддерживается
      19 Preset Comm. Link Не поддерживается Не поддерживается
      20 Read General Reference Не поддерживается Не поддерживается
      21 Write General Reference Не поддерживается Не поддерживается
      484 Функция Описание Запрос Ответ
      1 Read Coil Status 512 Выходов 512 Выходов
      2 Read Input Status 512 Входов 512 Входов
      3 Read Holding Registers 254 Регистра 254 Регистра
      4 Read Input Registers 32 Регистра 32 Регистра
      5 Force Single Coil 1 Выход 1 Выход
      6 Preset Single Register 1 Регистр 1 Регистр
      7 Read Exeption Status Не доступна 8 Выходов
      8 Diagnostics Не доступна Не доступна
      9 Program 484 16 байтов данных 16 байтов данных
      10 Poll 484 Не доступна 16 байтов данных
      11 Fetch. Comm. Event Ctr. Не поддерживается Не поддерживается
      12 Fetch. Comm. Event Log Не поддерживается Не поддерживается
      13 Program Controller Не поддерживается Не поддерживается
      14 Poll Controller Не поддерживается Не поддерживается
      15 Force Multiply Coils 800 Выходов 800 Выходов
      16 Preset Multiply Regs 60 Регистров 60 Регистров
      17 Report Slave ID Не доступна Не доступна
      18 Program 884/M84 Не поддерживается Не поддерживается
      19 Preset Comm. Link Не поддерживается Не поддерживается
      20 Read General Reference Не поддерживается Не поддерживается
      21 Write General Reference Не поддерживается Не поддерживается
      584 Функция Описание Запрос Ответ
      1 Read Coil Status 2000 Выходов 2000 Выходов
      2 Read Input Status 2000 Входов 2000 Входов
      3 Read Holding Registers 125 Регистров 125 Регистров
      4 Read Input Registers 125 Регистров 125 Регистров
      5 Force Single Coil 1 Выход 1 Выход
      6 Preset Single Register 1 Регистр 1 Регистр
      7 Read Exeption Status Не доступна 8 Выходов
      8 Diagnostics Не доступна Не доступна
      9 Program 484 Не поддерживается Не поддерживается
      10 Poll 484 Не поддерживается Не поддерживается
      11 Fetch. Comm. Event Ctr. Не доступна Не доступна
      12 Fetch. Comm. Event Log Не доступна 70 байтов данных
      13 Program Controller 33 байта данных 33 байта данных
      14 Poll Controller Не доступна 33 байта данных
      15 Force Multiply Coils 800 Выходов 800 Выходов
      16 Preset Multiply Regs 100 Регистров 100 Регистров
      17 Report Slave ID Не доступна Не доступна
      18 Program 884/M84 Не поддерживается Не поддерживается
      19 Preset Comm. Link Не поддерживается Не поддерживается
      20 Read General Reference (1) (1)
      21 Write General Reference (1) (1)

      Примечание:

      (1) Максимальная длина сообщения не должна превышать 256.

      884 Функция Описание Запрос Ответ
      1 Read Coil Status 2000 Выходов 2000 Выходов
      2 Read Input Status 2000 Входов 2000 Входов
      3 Read Holding Registers 125 Регистров 125 Регистров
      4 Read Input Registers 125 Регистров 125 Регистров
      5 Force Single Coil 1 Выход 1 Выход
      6 Preset Single Register 1 Регистр 1 Регистр
      7 Read Exeption Status Не доступна 8 Выходов
      8 Diagnostics Не доступна Не доступна
      9 Program 484 Не поддерживается Не поддерживается
      10 Poll 484 Не поддерживается Не поддерживается
      11 Fetch. Comm. Event Ctr. Не поддерживается Не поддерживается
      12 Fetch. Comm. Event Log Не поддерживается Не поддерживается
      13 Program Controller Не поддерживается Не поддерживается
      14 Poll Controller Не поддерживается Не поддерживается
      15 Force Multiply Coils 800 Выходов 800 Выходов
      16 Preset Multiply Regs 100 Регистров 100 Регистров
      17 Report Slave ID Не доступна Не доступна
      18 Program 884/M84 (1) (1)
      19 Preset Comm. Link (1) (1)
      20 Read General Reference Не поддерживается Не поддерживается
      21 Write General Reference Не поддерживается Не поддерживается

      Примечание:

      (1) Максимальная длина сообщения не должна превышать 256.

      M84 Функция Описание Запрос Ответ
      1 Read Coil Status 64 Выхода 64 Выхода
      2 Read Input Status 64 Входа 64 Входа
      3 Read Holding Registers 32 Регистра 32 Регистра
      4 Read Input Registers 4 Регистров 4 Регистров
      5 Force Single Coil 1 Выход 1 Выход
      6 Preset Single Register 1 Регистр 1 Регистр
      7 Read Exeption Status Не доступна 8 Выходов
      8 Diagnostics Не доступна Не доступна
      9 Program 484 Не поддерживается Не поддерживается
      10 Poll 484 Не поддерживается Не поддерживается
      11 Fetch. Comm. Event Ctr. Не поддерживается Не поддерживается
      12 Fetch. Comm. Event Log Не поддерживается Не поддерживается
      13 Program Controller Не поддерживается Не поддерживается
      14 Poll Controller Не поддерживается Не поддерживается
      15 Force Multiply Coils 64 Выхода 64 Выхода
      16 Preset Multiply Regs 32 Регистра 64 Регистра
      17 Report Slave ID Не доступна Не доступна
      18 Program 884/M84 (1) (1)
      19 Preset Comm. Link Не доступна Не доступна
      20 Read General Reference Не поддерживается Не поддерживается
      21 Write General Reference Не поддерживается Не поддерживается

      Примечание:

      (1) Максимальная длина сообщения не должна превышать 256.

      984 Функция Описание Запрос Ответ
      1 Read Coil Status 2000 Выходов 2000 Выходов
      2 Read Input Status 2000 Входов 2000 Входов
      3 Read Holding Registers 125 Регистров 125 Регистров
      4 Read Input Registers 125 Регистров 125 Регистров
      5 Force Single Coil 1 Выход 1 Выход
      6 Preset Single Register 1 Регистр 1 Регистр
      7 Read Exeption Status Не доступна 8 Выходов
      8 Diagnostics Не доступна Не доступна
      9 Program 484 Не поддерживается Не поддерживается
      10 Poll 484 Не поддерживается Не поддерживается
      11 Fetch. Comm. Event Ctr. Не доступна Не доступна
      12 Fetch. Comm. Event Log Не доступна 70 байтов данных
      13 Program Controller 33 байта данных 33 байта данных
      14 Poll Controller Не доступна 33 байта данных
      15 Force Multiply Coils 800 Выходов 800 Выходов
      16 Preset Multiply Regs 100 Регистров 100 Регистров
      17 Report Slave ID Не доступна Не доступна
      18 Program 884/M84 Не поддерживается Не поддерживается
      19 Preset Comm. Link Не поддерживается Не поддерживается
      20 Read General Reference (1) (1)
      21 Write General Reference (1) (1)

      Примечание:

      (1) Максимальная длина сообщения не должна превышать 256.

       

      P.S. Нужно помнить, что техническое обслуживание пластиковых окон, ремонт заключается не столько в щадящей очистке профильных систем, фурнитуры и стеклопакета от пыли и грязи, сколько в регулярном смазывании подвижных деталей фурнитурных узлов.

        СООБЩЕНИЯ ОБ ОШИБКАХ ModBUS

        Одна из четырех ситуаций может иметь место при запросе главного к подчиненному:

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

        — Если подчиненное устройство не приняло запрос, ответ не возвращается. Главный ожидает ответа на запрос в течении определенного таймаута.

        — Если подчиненный принял запрос, но обнаружил коммуникационную ошибку(паритет, ошибка контрольной суммы), то ответ не возвращается. Главный ожидает ответа на запрос в течении определенного таймаута.

        — Если подчиненный принял запрос без коммуникационной ошибки, но не может выполнить затребованную функцию(например, чтение несуществующих выходов или регистров), подчиненный возвращает сообщение об ошибке и ее причинах.

        Сообщение об ошибке имеет два поля которые отличаются от полей нормального ответа:

        ПОЛЕ КОДА ФУНКЦИИ: В нормальном ответе, подчиненный повторяет код функции содержащийся в поле кода функции запроса. Во всех кодах функций старший значащий бит установлен в 0. При возврате сообщения об ошибке подчиненный устанавливает этот бит в 1.

        При установленному старшему биту в коде функции главный распознает сообщение об ошибке, и может проанализировать поле данных сообщения.

        ПОЛЕ ДАННЫХ: В нормальном ответе, подчиненный может может возвращать данные или статистику в поле данных(любую информацию которая затребована в запросе). В сообщении об ошибке, подчиненный возвращает код ошибки в поле данных.

        Ниже показан пример запроса главного и сообщения об ошибке подчиненного:

        ЗАПРОС

        Имя поля                                                                                             Пример

        (Hex)

        Адрес подчиненного                                                                           0A

        Функция                                                                                              01

        Начальный адрес ст.                                                                            04

        Начальный адрес мл.                                                                           A1

        Кол-во входов ст.                                                                 00

        Кол-во входов мл.                                                                               01

        Контрольная сумма (LRC)                                                  4F

        СООБЩЕНИЕ ОБ ОШИБКЕ

        Адрес подчиненного                                                                           0A

        Функция                                                                                              81

        Код ошибки                                                                                          02

        Контрольная сумма (LRC)                                                  73

        Вданном примере главный адресует подчиненное устройство 10. Код функции (01) — Read Coil Status. В запросе требуется прочитать выход с адресом 1245.

        Если указанный выход не существует подчиненный возвращает сообщение об ошибке с кодом ошибки (02). Этот код специфицирует несуществующий адрес данных в подчиненном. Например если подчиненный это 984-385 с 512 выходами, то этот код ошибки будет возвращаться при обращении к несуществующим выходам.

        Список кодов ошибок представлен ниже.

        Код Название Описание
        01 ILLEGAL FUNCTION Принятый код функции не может быть обработан на подчиненном.
        02 ILLEGAL DATA ADDRESS Адрес данных указанный в запросе не доступен данному подчиненному.
        03 ILLEGAL DATA VALUE Величина содержащаяся в поле данных запроса является не допустимой величиной для подчиненного.
        04 SLAVE DEVICE FAILURE Невосстанавливаемая ошибка имела место пока подчиненный пытался выполнить затребованное действие.
        05 ACKNOWLEDGE Подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки таймаута. Главный может выдать команду Poll Program Complete для обнаружения завершения обработки команды.
        06 SLAVE DEVICE BUSY Подчиненный занят обработкой команды. Главный должен повторить сообщение позже, когда подчиненный освободится.
        07 NEGATIVE ACKNOWLEDGE Подчиненный не может выполнить программную функцию, принятую в запросе. Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14. Главный должен запросить диагностическую информацию или информацию обошибках с подчиненного.
        08 MEMORY PARITY ERROR Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. Главный может повторить запрос, но обычно в таких случаях требуется ремонт.

         

          ФУНКЦИЯ ДИАГНОСТИКИ 08

          Функция 08 — Диагностическая

          ОПИСАНИЕ

          Функция 08 обеспечивает серию тестов для проверки системы коммуникации между главным и подчиненным, или проверку на различные внутренние ошибки в подчиненном. Широкое вещание не поддерживается.

          Функция использует два байта кода подфункции в запросе для определения типа теста который необходимо провести. Подчиненный возвращает оба кода функции и подфункции в нормальном ответе.

          Большинство диагностических запросов используют два байта поля данных для посылки диагностических данных или контрольной информации подчиненному. Некоторые результаты диагностики могут возвращаться подчиненным в поле данных нормального ответа.

          ЭФФЕКТ ДИАГНОСТИКИ НА ПОДЧИНЕННОМ

          В общем, работа диагностической функции в подчиненном устройстве не влияет на работу пользовательской программы. Пользовательская логика, такая как дискретные выходы и регистры, не доступна для диагностики. Определенные функции могут выборочно сбросить счетчик ошибок в подчиненном.

          КАК ОРГАНИЗОВАНА ИНФОРМАЦИЯ В ДАННОМ РУКОВОДСТВЕ

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

          Список кодов подфункций поддерживаемых различными контроллерами приведен ниже после примера ответа на запрос.

          ЗАПРОС

          Это пример запроса подчиненному устройству на возврат данных переданных в запросе. Здесь используется код подфункции 0.

          Запрос

          Имя поля                                                                                              Пример (Hex)

          Адрес подчиненного                                                                           11

          Функция                                                                                              08

          Подфункция ст.                                                                                  00

          Подфункция мл.                                                                                 00

          Данные ст.                                                                                            A5

          Данные мл.                                                                                           37

          Контрольная сумма                                                                             —

           

          ОТВЕТ

          Нормальный ответ возвращает те же данные.

          Имя поля                                                                                              Пример (Hex)

          Адрес подчиненного                                                                           11

          Функция                                                                                              08

          Подфункция ст.                                                                                  00

          Подфункция мл.                                                                                 00

          Данные ст.                                                                                            A5

          Данные мл.                                                                                           37

          Контрольная сумма                                                                             —

           

          ДИАГНОСТИЧЕСКИЕ КОДЫ ПОДДЕРЖИВАЕМЫЕ КОНТРОЛЛЕРАМИ

          Код Имя                                                               383          484          584         884         M84       984

          00            Return Query Data                                               Y             Y             Y             Y             Y             Y

          01            Restart Comm Option                                           Y             Y             Y             Y             Y             Y

          02            Return Diagnostic Register                                   Y             Y             Y             Y             Y             Y

          03            Change ASCII Input Delimiter                              Y             Y             Y             N                            Y

          04            Force Listen Only Mode                                       Y             Y             Y             Y             Y             Y

          05-09      Зарезервированы

          10            Clear Ctrs and Diagnostic Reg.                             Y             Y             (1)           N             N             (1)

          11            Return Bus Message Count                   Y             Y             Y             N             N             Y

          12            Return Bus Comm. Error Count                           Y             Y             Y             N             N             Y

          13            Return Bus Exeption Error Count                        Y             Y             Y             N             N             Y

          14            Return Slave Message Count                 Y             Y             Y             N             N             Y

          15            Return Slave No Response Cnt                             Y             Y             Y             N             N             Y

          16            Return Slave NAK Count                                     Y             Y             Y             N             N             Y

          17            Return Slave Busy Count                                      Y             Y             Y             N             N             Y

          18            Return Bus Char. Overrun Cnt                             Y             Y             Y             N             N             Y

          19            Return Overrun Error Count                 N             N             N             Y             N             N

          20            Clear Overrun Counter and Flag                            N             N             N             Y             N             N

          21            Get/Clear Modbus Plus Statistic                           N             N             N             N             N             Y

          22 и далее Зарезервированы

          Примечание:

          (1) Только очистка счетчиков.

          ДИАГНОСТИЧЕСКИЕ ПОДФУНКЦИИ

          00 Return Query Data

          Данные расположенные в поле данных запроса должны быть возвращены в ответе. Ответ должен быть идентичен запросу.

          Подфункция         Поле данных(Запрос)           Поле данных(Ответ)

          00 00                      Любое значение                    Повтор данных запроса

          01 Restart Communication Option

          Периферийный порт подчиненного инициализируется и перезапускается, все коммуникационные счетчики очищаются. Если порт находится в режиме ‘Listen Only Mode’, ответ не возвращается. Если порт не находится в данном режиме, то возвращается нормальный ответ. Это делается перед рестартом.

          Когда подчиненный принимает запрос, он делает рестарт и запускает тесты, которые проводятся при включении питания. После удачного прохождения тестов порт переходит в режим готовности.

          Поле данных запроса содержит FF 00 Hex для очистки Коммуникационного Журнала Событий. Содержимое поля данных 00 00 оставляет журнал без изменений.

          Подфункция         Поле данных(Запрос)          Поле данных(Ответ)

          00 01                      00 00                                       Повтор данных запроса

          00 01                      FF 00                                      Повтор данных запроса

          02 Return Diagnostic Register

          Содержимое регистра диагностики подчиненного возвращается в ответе.

          Подфункция         Поле данных(Запрос)           Поле данных(Ответ)

          00 02                      00 00                                      Содержимое регистра диагностики

          КАК ОРГАНИЗОВАНЫ ДАННЫЕ РЕГИСТРА

          Назначение битов регистра диагностики показано ниже.

          184/384 Регистр диагностики

          Бит                         Описание

          0                             Continue on Error

          1                             Run Light Filed

          2                             T-Bus Test Filed

          3                             Asynchronous Bus Test Failed

          4                             Force Listen Only Mode

          5                             Не используется

          6                             Не используется

          7                             ROM Chip 0 Test Failed

          8                             Continuos ROM Cheksum Test in Execution

          9                             ROM Chip 1 Test Failed

          10                           ROM Chip 2 Test Failed

          11                           ROM Chip 3 Test Failed

          12                           RAM Chip 5000-53FF Test Failed

          13                           RAM Chip 6000-67FF Test Failed, Even Adresess

          14                           RAM Chip 6000-67FF Test Failed, Odd Adresess

          15                           Timer Chip Test Filed

          484 Регистр диагностики

          Бит                         Описание

          0                             Continue on Error

          1                             CPU Test or Run Light Failed

          2                             Parallel Port Test Failed

          3                             Asynchronous Bus Test Failed

          4                             Timer 0 Test Filed

          5                             Timer 1 Test Filed

          6                             Timer 2 Test Filed

          7                             ROM Chip 0000-07FF Test Failed

          8                             Continuous ROM Checksum Test in Execution

          9                             ROM Chip 0800-0FFF Test Failed

          10                           ROM Chip 1000-17FF Test Failed

          11                           ROM Chip 1800-1FFF Test Failed

          12                           RAM Chip 4000-40FF Test Failed

          13                           RAM Chip 4100-41FF Test Failed

          14                           RAM Chip 4200-42FF Test Failed

          15                           RAM Chip 4300-43FF Test Failed

          584/984 Регистр диагностики

          Бит                         Описание

          0                             Illegal Configuration

          1                             Backup Cheksum Error in High-Speed RAM

          2                             Logic Checksum Error

          3                             Invalid Node Type

          4                             Invalid Traffic Cop Type

          5                             CPU/Solve Diagnostic Failed

          6                             Real Time Clock Failed

          7                             Watchdog Timer Failed-Scan Time exeeded 250ms

          8                             No End of Logic Node detected, or quantity of end of segment words (DOIO) does not match quantity

          of segments configured

          9                             Sate RAM Test Failed

          10                            Start of Network (SON) did not begin network

          11                           Bad Order of Solve Table

          12                           Illegal Peripherial Intervention

          13                           Dim Awareness Flag

          14                           Не используется

          15                           Peripherial Port Stop Executed, not an error

          884 Регистр диагностики

          Бит                         Описание

          0                             Modbus IOP Overrun Errors Flag

          1                             Modbus Option Overrun Errors Flag

          2                             Modbus IOP Failed

          3                             Modbus Option Failed

          4                             Ourbus IOP Failed

          5                             Remote IO Failed

          6                             Main CPU Failed

          7                             Table RAM Checksum Failed

          8                             Scan Task exceeded its time limit-too much user logic

          9                             Не используется

          10                           Не используется

          11                           Не используется

          12                           Не используется

          13                           Не используется

          14                           Не используется

          15                           Не используется

          03 Change ASCII Input Delimeter

          Символ ‘CHAR’ Размещенный в поле данных запроса становится признаком конца сообщения в последующих обменах (заменяя символ LF).

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 03                      CHAR 00                               Повтор данных запроса

          04 Force Listen Only Mode

          Установка адресуемого подчиненного в режим Listen Only Mode. Это изолирует его от других устройств сети, позволяя иметь связь без прерывания с адресуемого подчиненного.

          Когда подчиненный введен в данный режим, весь активный коммуникационный контроль выключается. Пока устройство находится в данном режиме, любые сообщения адресуемые подчиненному или широковещательная передача отслеживаются, но не выполняется никаких действий и ответы не возвращаются.

          Только одна функция может быть выполнена — это функция Restart Communication Option (код функции 8, подфункция 1).

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 04                      00 00                                       Ответ не возвращается

          10 (0A Hex) Clear Counters and Diagnostic Register

          Для контроллеров кроме 584 или 984, очищаются все счетчики и регистр диагностики. Для 584 или 984 очищаются только счетчики. Счетчики также очищаются при включении питания.

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 0A                     00 00                                       Повтор данных запроса

          11 (0B Hex) Return Bus Message Count

          Поле данных ответного сообщения содержит количество сообщений обнаруженных коммуникационной системой после последнего рестарта, операции очистки счетчиков, или включения питания.

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 0B                      00 00                                      Повтор данных запроса

          12 (0C Hex) Return Bus Communication Error Count

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

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 0C                      00 00                                      Счетчик ошибок контр. суммы

          13 (0D Hex) Return Bus Exeption Error Count

          Поле данных ответного сообщения содержит количество сообщений об ошибках насчитанных подчиненным после последнего рестарта, операции очистки счетчиков, или включения питания.

          Сообщения об ошибках описаны в приложении А.

          Подфункция         Поле данных (Запрос)         Поле данных (Ответ)

          00 0D                     00 00                                      Счетчик ошибок

          14 (0E Hex) Return Slave Message Count

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

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 0E                      00 00                                      Счетчик сообщений подчиненного

          15 (0F Hex) Return Slave No Response Count

          Поле данных ответного сообщения содержит количество сообщений адресованных подчиненному которые остались без ответа после последнего рестарта, операции очистки счетчиков, или включения питания.

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 0F                      00 00                                      Счетчик сообщений подчиненного

          16 (10 Hex) Return Slave NAK Count

          Поле данных ответного сообщения содержит количество сообщений адресованных подчиненному, для которых был возвращен ответ с сообщением об ошибке типа Negative Acknowledge (NAK), после последнего рестарта, операции очистки счетчиков, или включения питания.

          Подфункция         Поле данных (Запрос)         Поле данных (Ответ)

          00 10                      00 00                                       Счетчик NAK сообщений

          17 (11 Hex) Return Slave Busy Count

          Поле данных ответного сообщения содержит количество сообщений адресованных подчиненному, для которых был возвращен ответ с сообщением об ошибке типа Slave Device Busy, после последнего рестарта, операции очистки счетчиков, или включения питания.

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 11                      00 00 Счетчик ответов »      Устройство занято»

          18 (12 Hex) Return Bus Character Overrun Count

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

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 12                      00 00                                      Счетчик Slave Overrun

          19 (13 Hex) Return IOP Overrun Count (884)

          Поле данных ответного сообщения содержит количество сообщений адресованных подчиненному, в которых был обнаружен пропуск символа (для 884 IOP), после последнего рестарта, операции очистки счетчиков, или включения питания. Пропуск символа может возникать в случае если данные поступают в порт слишком быстро, или в случае аппаратных сбоев. Эта функция специфична для 884.

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 13                      00 00                                       Счетчик Slave IOP Overrun

          20 (14 Hex) Clear Overrun Counter and Flag (884)

          Очищает счетчик 884-го Overrun Counter и сбрасывает флаг ошибки. Текущее значение флага располагается в бите 0 регистра диагностики (смотри подфункцию 02). Эта функция специфична для 884.

          Подфункция         Поле данных (Запрос)          Поле данных (Ответ)

          00 14                      00 00                                      Повтор данных запроса

          21 (15 Hex) Get/Clear Modbus Statistic

          Возвращает последовательность из 54 слов (108 байтов) в поле данных ответа. Данные содержат статистику Modbus Plus процессора подчиненного.

          В добавление к коду функции (08) и коду подфункции (00 15 Hex) следующие два байта в запросе специфицируют тип операции: ‘Взять статистику’ или ‘Очистить статистику’. Статистика может бать также очищена выключением питания.

          Поле типа операции:

          — 00 03 специфицирует операцию ‘Взять Статистику’

          — 00 04 специфицирует операцию ‘Очистить Статистику’

          ЗАПРОС: Это последовательность полей в запросе:

          Функция                Подфункция         Операция

          08                           00 15                      00 03       (Get Statistic)

          08                           00 15                      00 04       (Clear Statistic)

          ОТВЕТ НА ОПЕРАЦИЮ ВЗЯТЬ СТАТИСТИКУ: Это последовательность полей нормального ответа на операцию ‘Взять статистику’:

          Функция                Подфункция         Операция               Данные(108 байт)

          08                           00 15                      00 03                      Слова 00-53

          ОТВЕТ НА ОПЕРАЦИЮ ОЧИСТИТЬ СТАТИСТИКУ: Нормальный ответ на эту операцию повторяет запрос.

          Функция                Подфункция         Операция

          08                           00 15                      00 04

          Сетевая статистика Modbus Plus

          Слово     Биты                       начение

          00                                           Тип Узла

          0                             Незнакомый тип узла

          1                             Программируемый контроллер

          2                             Modbus Brige

          3                             Host — компьютер

          4                             Brige Plus

          5                             I/O узел

          01            0..11                       Номер версии программного обеспечения

          12..14                     Зарезервировано

          15                           Определяет значение слова 15

          (см. слово 15)

          02                                           Сетевой адрес для данной станции

          03                                           Установки MAC переменных

          0                             Состояние питания

          1                             Monitor offline state

          2                             Duplicate offline state

          3                             Состояние простоя

          4                             Use token state

          5                             Work response state

          6                             Pass token state

          7                             Solicit response state

          8                             Check pass state

          9                             Claim token state

          10                           Claim response state

          04                                           Peer status(LED code); определяет статус  данного блока относительно сети.

          0                             Monitor link operation

          32                           Normal link operation

          64                           Never getting token

          96                           Sole station

          128                         Duplicate station

          05                                           Счетчик символов; инкрементируется каждый раз когда станция принимает символ.

          06                                           Token rotation time in ms.

          07            Мл                         Data master failed during token owership bit map

          Ст                           Program master failed during token owership bit map

          08            Мл                         Data master token owner work bit map

          Ст                           Program master token owner work bit map

          09            Мл                         Data slave token owner work bit map

          Ст                           Program slave token owner work bit map

          10            Ст                           Data slave/get slave command transfer request bit map

          11            Мл                         Program master/get master rsp transfer request bit map

          Ст                           Program slave/get slave command transfer request bit map

          12            Мл                         Program master connect status bit map

          Ст                           Program slave automatic logout request bit map

          13            Мл                         Pretransmit deferral error counter

          Ст                           Receive buffer DMA overrun error counter

          14            Мл                         Repeated command received counter

          Ст                           Frame size error counter

          15            Если бит 15 слова 1 не установлен, содержание слова 15 следующее:

          Мл                         Receiver collision-abort error counter.

          Ст                           Receiver alignment error counter

          Если бит 15 слова 1 установлен, содержание слова 15 следующее:

          Мл                         Cable A framing error

          Ст                           Cable B framing error

          16            Мл                         Receiver CRC error counter

          Ст                           Bad packet-lenght error counter

          17            Мл                         Bad link-address error counter

          Ст                           Transmit buffer DMA-underrun error counter

          18            Мл                         Bad internal packet lenght error counter

          Ст                           Bad MAC function error counter

          19            Мл                         Communication retry counter

          Ст                           Communication failed error counter

          20            Мл                         Good receive packet error counter

          Ст                           No response received error counter

          21            Мл                         Exeption response received error counter

          Ст                           Unexpected path error counter

          22            Мл                         Unexpected response error counter

          Ст                           Forgotten transaction error counter

          23            Мл                         Active station table bit map, nodes 1..8

          Ст                           Active station table bit map, nodes 9..16

          24            Мл                         Active station table bit map, nodes 17..24

          Ст                           Active station table bit map, nodes 25..32

          25            Мл                         Active station table bit map, nodes 33..40

          Ст                           Active station table bit map, nodes 41..48

          26            Мл                         Active station table bit map, nodes 49..56

          Ст                           Active station table bit map, nodes 57..64

          27            Мл                         Token station table bit map, nodes 1..8

          Ст                           Token station table bit map, nodes 9..16

          28            Мл                         Token station table bit map, nodes 27..24

          Ст                           Token station table bit map, nodes 25..32

          29            Мл                         Token station table bit map, nodes 33..40

          Ст                           Token station table bit map, nodes 41..48

          30            Мл                         Token station table bit map, nodes

          Ст                           Token station table bit map, nodes 49..56

          31            Мл                         Global data present table bit map, nodes 1..8

          Ст                           Global data present table bit map, nodes 9..16

          32            Мл                         Global data present table bit map, nodes 17..24

          Ст                           Global data present table bit map, nodes 25..32

          33            Мл                         Global data present table bit map, nodes 33..40

          Ст                           Global data present table bit map, nodes 41..48

          34            Мл                         Global data present table bit map, nodes 49..56

          Ст                           Global data present table bit map, nodes 57..64

          35            Мл                         Receive buffer in use bit map, buffer 1..8

          Ст                           Receive buffer in use bit map, buffer 9..16

          36            Мл                         Receive buffer in use bit map, buffer 17..24

          Ст                           Receive buffer in use bit map, buffer 25..32

          37            Мл                         Receive buffer in use bit map, buffer 33..40

          Ст                           Station managment command processed initiation counter

          38            Мл                         Data master output path 1 command initiation counter

          Ст                           Data master output path 2 command initiation counter

          39            Мл                         Data master output path 3 command initiation counter

          Ст                           Data master output path 4 command initiation counter

          40            Мл                         Data master output path 5 command initiation counter

          Ст                           Data master output path 6 command initiation counter

          41            Мл                         Data master output path 7 command initiation counter

          Ст                           Data master output path 8 command initiation counter

          42            Мл                         Data slave input path 41 command processed counter

          Ст                           Data slave input path 42 command processed counter

          43            Мл                         Data slave input path 43 command processed counter

          Ст                           Data slave input path 44 command processed counter

          44            Мл                         Data slave input path 45 command processed counter

          Ст                           Data slave input path 46command processed counter

          45            Мл                         Data slave input path 47 command processed counter

          Ст                           Data slave input path 48 command processed counter

          46            Мл                         Program master output path 81 command initiation counter

          Ст                           Program master output path 82 command initiation counter

          47            Мл                         Program master output path 83 command initiation counter

          Ст                           Program master output path 84 command initiation counter

          48            Мл                         Program master output path 85 command initiation counter

          Ст                           Program master output path 86 command initiation counter

          49            Мл                         Program master output path 87 command initiation counter

          Ст                           Program master output path 88 command initiation counter

          50            Мл                         Program slave input path C1 command processed counter

          Ст                           Program slave input path C2 command processed counter

          51            Мл                         Program slave input path C3 command processed counter

          Ст                           Program slave input path C4 command processed counter

          52            Мл                         Program slave input path C5 command processed counter

          Ст                           Program slave input path C6 command processed counter

          53            Мл                         Program slave input path C7 command processed counter

          Ст                           Program slave input path C8 command processed counter