Код:
IF Conn1.Done = FALSE THEN //если порт закрыт откроем его
Conn1(enable:=TRUE ,PortNum:=3); // откроем первый физический порт Р1,
//все остальные настройки оставим по умолчанию
IF Conn1.Done = TRUE THEN
SysComPurge (Conn1.Handle); // очистим его буфер
TimeOut:=100; //время для функций Read и Write
END_IF
END_IF
blinker.TIMEHIGH:=T#4S;
blinker.TIMELOW:=T#1S;
blinker(ENABLE:=TRUE);// блинк нужен для организации переодичности работы программы, период 5 секунд
rtrig(CLK:=blinker.OUT);
CASE stat OF
1: BufBR[1]:=1; //запись данных в первый порт, данные придут соответственно в 4й порт
BufBR[2]:=2;// отсылаем 8 байт одним куском
BufBR[3]:=3;
BufBR[4]:=4;
BufBR[5]:=5;
BufBR[6]:=6;
BufBR[7]:=7;
BufBR[8]:=7;
IF Conn1.Done = TRUE THEN
bWrite:=SysComWrite(Conn1.Handle, ADR(BufBW), 8, TimeOut, ADR(Err)); // то что одним куском видно здесь
// цифра "8" означает записать в порт 8байт
IF bWrite>0 THEN
WCount:=WCount+1;
counter:=counter+UDINT_TO_BYTE(bWrite);
END_IF
IF counter>=8 THEN stat:=1;counter:=0; END_IF
END_IF
2: BufBW[1]:=8; // после этого отправим что нибудь в порт Р1
BufBW[2]:=7;// это что нибудь - значения присвоенные переменной BuffW
BufBW[3]:=6;
BufBW[4]:=5;
BufBW[5]:=4;
BufBW[6]:=3;
BufBW[7]:=2;
BufBW[8]:=1;
3: //как отправим прочтем
IF Conn1.Done = TRUE THEN
bRead:=SysComRead(Conn1.Handle, ADR(BufBR), 8, TimeOut, ADR(Err));
IF bRead>0 THEN
//RCount2:=RCount2+1;
FOR i:=1 TO bRead DO
BuffIn[8+counter+i]:=BufBR[i];
END_FOR
counter:=counter+UDINT_TO_BYTE(bRead);
IF counter>=8 THEN
stat:=4;
counter:=0;
(*FOR i:=1 TO bRead DO
IF BufBR[i]<>BufBW[i] THEN
ErrCnt:=ErrCnt+1;
END_IF
END_FOR*)
END_IF
END_IF
END_IF
4: IF rtrig.Q THEN // по таймеру обнулим переменные отображающее состояние и начнем все с начала
stat:=0;
RCount:=0;
WCount:=0;
END_IF
END_CASE