вторник, 12 мая 2015 г.

Работа с M-Link протоколом...

 

Протокол M-Link, пожалуй, один из самых простых существующих протоколов, был разработан компанией Adastra для поддержки обмена по последовательным каналам RS-232, RS-422, RS-485, Dial-Up, GSM/SMS между узлами и для связи с устройствами, поддерживающими данный протокол, в своей SCADA TraceMODE. Протокол является открытым для использования. Разберем вкратце формат обмена...

Структура запроса (HOST)

Длина запроса составляет всегда 14 байт. Формат запроса:
01234567890123
@FAannqqttttS*
где: F – код операции (в ответе этот байт равен операции логического сложения кода операции с числом 8); А – адрес узла; a – атрибут канала; nn – номер канала; qq – число запрашиваемых каналов; tttt – значение или время (зависит от кода операции); S – контрольная сумма по исключающему ИЛИ (XOR), начиная с 1 байта (т.е. @ не входит) по 11 байт включительно.

Описание операций

F=1 – запрос атрибута канала. Формат ответа (длина = 8+qq*4 байт):
012345 6789 01
@FAann DDDD S*
где: DDDD – значение в виде числа FLOAT. Если DDDD=0xffffffff, формируется признак недостоверности.

F=7 – запрос атрибута канала со временем вычисления реального значения канала. Формат ответа (длина = 8+qq*8 байт):
012345 6789 0123 01
@FAann DDDD TTTT S*
где: DDDD – значение в виде числа FLOAT. Если DDDD=0xffffffff, формируется признак недостоверности; TTTT – время в секундах (функция языка C time()).

F=2 – запрос изменения атрибута канала. Параметры запроса:
tttt – значение атрибута;
qq = 0.
Формат ответа (длина = 12 байт):
012345 6789 01
@FAann xx00 S*
где: xx - не определен.

F=6 – запрос изменения атрибута канала. Параметры запроса:
tttt – значение атрибута;
qq = 0.
Формат ответа (длина = 14 байт):
012345 6789 0123
@FAann xx00 xxS*
где: xx – не определен.

Использование на верхнем уровне

Приведу выдержку из своего проекта обмена по OPC-каналам с применением M-Link протокола (в терминах Delphi):
//================================
//MLink-
//================================

// получение данных-
procedure GetParms(seAddr,seFrom,seCount: integer);
var i: integer;
    s: string;
begin
 mlnBuf[0] := $40;        //код операции
 mlnBuf[1] := 1;          //запрос атрибута канала / длина = 8+qq*4 байт
 mlnBuf[2] := seAddr;     //адрес узла
 mlnBuf[3] := 0;          //атрибут канала
 mlnBuf[4] := Lo(seFrom); //канал
 mlnBuf[5] := Hi(seFrom); //канал
 mlnBuf[6] := Lo(seCount);//число каналов
 mlnBuf[7] := Hi(seCount);//число каналов
 mlnBuf[8] := 0;          //значение
 mlnBuf[9] := 0;          //значение
 mlnBuf[10]:= 0;          //значение
 mlnBuf[11]:= 0;          //значение
 mlnBuf[12]:= 0;          //значение
 For i:=1 to 11 do
  mlnBuf[12]:= mlnBuf[12] Xor mlnBuf[i];
 mlnBuf[13]:=$2A;

 s:= ''; for i:= 0 to 13 do s:= s + chr(mlnBuf[i]);
 if en_com then
  mf.com.WriteCommData(pchar(s),length(s))
end;

// запись параметров-
procedure SendParms(seAddr,seRight,seLeft: integer);
var i:Integer;
    s: string;
begin
 mlnBuf[0] := $40;         //код операции
 mlnBuf[1] := 2;           //запрос изменения атрибута канала
 mlnBuf[2] := seAddr;      //адрес узла
 mlnBuf[3] := 0;           //атрибут канала
 mlnBuf[4] := Lo(seRight); //канал
 mlnBuf[5] := Hi(seRight); //канал
 mlnBuf[6] := 1;           //число каналов
 mlnBuf[7] := 0;           //число каналов
 mlnBuf[8] := Byte(PChar(@seLeft)[0]); //значение
 mlnBuf[9] := Byte(PChar(@seLeft)[1]); //значение
 mlnBuf[10]:= Byte(PChar(@seLeft)[2]); //значение
 mlnBuf[11]:= Byte(PChar(@seLeft)[3]); //значение
 mlnBuf[12]:= 0;
 for i:=1 to 11 do
  mlnBuf[12]:= mlnBuf[12] Xor mlnBuf[i];
 mlnBuf[13]:=$2A;

 s:= ''; for i:= 0 to 13 do s:= s + chr(mlnBuf[i]);
 if en_com then
  mf.com.WriteCommData(pchar(s),length(s))
end;
//end MLink-
//================================



Примеры реального использования M-Link
  1. Собственно, далеко ходить не нужно: загляните на сайт Адастры.
  2. Система удаленного мониторинга котла на мобилке.
 



Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.