Код:
(*****************************************************
Ïðèìåð ðàáîòû ñ áèáëèîòåêîé SysLibCom
ôîðìèðîâàíèå êîìàíäû â äâîè÷íîì âèäå
*****************************************************)
(*******************************************************
Îòêðûâàåì ïîðò
*******************************************************)
(*Îòêðûâàåì ïåðâûé ïîðò*)
IF NOT com_ready1 THEN
(*
Íîìåð ïîðòà (com_number):
0 - RS-485
1 - RS-232
4 - RS-232 DEBUG
*)
com_num1 := 0;
(*
Íàñòðîéêè ïîðòà (com_settings):
byParity - Ðåæèì ïðîâåðêè ÷åòíîñòè 0 = íåò, 1 = íå÷åò, 2 = ÷åò
byStopBits - Êîë-âî ñòîïîâûõ áèò 0 =îäèí, 1=ïîëòîðà , 2=äâà
dwBaudRate - Ñêîðîñòü îáìåíà 4800, 9600, 19200, 38400, 57600, 115200 áèò/ñ.
dwBufferSize - Íå èñïîëüçóåòñÿ äîëæíî áûòü =0
dwScan - Íå èñïîëüçóåòñÿ äîëæíî áûòü =0
dwTimeout - Íå èñïîëüçóåòñÿ äîëæíî áûòü =0
Port - Íîìåð ïîðòà â ôîðìàòå ïåðå÷èñëåíèÿ PORTS (com_number)
*)
Settings1.Port:=com_num1;
Settings1.dwBaudRate:=115200;
Settings1.byParity:=0;
Settings1.dwTimeout:=0;
Settings1.byStopBits:=0;
Settings1.dwBufferSize:=0;
Settings1.dwScan:=0;
(*
Íàñòðîéêà è îòêðûòèå ïîðòà (COM_SERVICE)
Ïîêà íà âûõîäå Ready íå áóäåò ñèãíàë TRUE, ñòó÷èìñÿ â ïîðò
Ïîðò îòêðûâàåòñÿ ñ íàñòðîéêàìè, óêàçàííûìè â com_settings,
à íà âõîä Task ïîäàþòñÿ ñëåäóþùèå çíà÷åíèÿ:
0 - Îòêðûòèå è íàñòðîéêà ïîðòà â ñîîòâåòñòâèè ñ íàñòðîéêàìè â ñòðóêòóðå Settings
1 - Èçìåíåíèå íàñòðîåê óæå îòêðûòîãî ïîðòà íà íàñòðîéêè óêàçàííûå â Settings
2 - Çàêðûòèå ïîðòà, íîìåð ïîðòà áåðåòñÿ èç Settings.Port
*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings1 , Task:=OPEN_TSK );
IF COM_SERVICE1.Ready THEN
COM_SERVICE1.Enable := FALSE;
com_ready1:=TRUE;
END_IF
END_IF
(*******************************************************
Ðàáîòà ñ ïîðòîì
*******************************************************)
IF (com_ready1=TRUE )THEN
CASE mtype OF
0:
IF NOT UNI.Active THEN
buffer[0] := 1;
buffer[1] := 101;
buffer[2] := 12;
buffer[3] := 0;
buffer[4] := 1;
buffer[5] := 0;
buffer[6] := 0;
buffer[7] := 0;
buffer[8] := 0;
buffer[9] := 0;
buffer[10] := 16#F4;
buffer[11] := 16#1;
buffer[12] := 0;
buffer[13] := 0;
buffer[14] := 0;
crc := MB_CRC(ADR(buffer[0]), 15);
SysMemCpy(ADR(buffer[15]), ADR(crc), 2);
(* buffer[15] := 145;
buffer[16] := 185; *)
data_size := 17;
END_IF
UNI(
Mode:=mode ,
ComHandle:=com_num1,
TimeOut:=t_zad,
DataBuf := buffer,
DataSize := data_size,
Complete := compl,
Exception := except
);
RT(CLK:=compl);
IF rt.Q THEN
MB_MOVED(ADR(result[0]), ADR(buffer[0]), data_size+2);
IF result[3] = 0 THEN
mtype :=1;
END_IF
END_IF
1:
IF NOT UNI.Active THEN
buffer[0] := 1;
buffer[1] := 16#67;
buffer[2] := 0;
crc1 := MB_CRC(ADR(buffer[0]), 3);
SysMemCpy(ADR(buffer[3]), ADR(crc1), 2);
(* buffer[15] := 145;
buffer[16] := 185; *)
data_size := 5;
END_IF
UNI(
Mode:=mode ,
ComHandle:=com_num1,
TimeOut:=t_zad,
DataBuf := buffer,
DataSize := data_size,
Complete := compl,
Exception := except
);
RT(CLK:=compl);
IF rt.Q THEN
MB_MOVED(ADR(id[0]), ADR(buffer[0]), data_size+2);
mtype :=2;
END_IF
2:
IF NOT UNI.Active THEN
buffer[0] := 1;
buffer[1] := 16#6B;
buffer[2] := 0;
crc := MB_CRC(ADR(buffer[0]), 3);
SysMemCpy(ADR(buffer[3]), ADR(crc), 2);
(* buffer[3] := 16#0A;
buffer[4] := 16#30;*)
data_size := 5;
END_IF
UNI(
Mode:=mode ,
ComHandle:=com_num1,
TimeOut:=t_zad,
DataBuf := buffer,
DataSize := data_size,
Complete := compl,
Exception := except
);
RT(CLK:=compl);
IF rt.Q THEN
MB_MOVED(ADR(result[0]), ADR(buffer[0]), data_size+2);
SysMemCpy(ADR(Torque), ADR(result[11]), 4);
SysMemCpy(ADR(Speed), ADR(result[19]), 4);
SysMemCpy(ADR(Temper), ADR(result[15]), 4);
ELSE
IF except <> 0 THEN
Torque := 0;
Speed := 0;
Temper := 0;
END_IF
END_IF
END_CASE
END_IF
В принципе, в Тилкомовской документации приводятся примеры посылаемых команд даже с контрольной суммой, но я посчитал, что будет правильнее считать её. В коде специально оставил закомментированной контрольную сумму из документации.