Победил.
Если кто столкнётся:
Код:
PROGRAM POU
VAR
sendBuffer: ARRAY[0..8] OF BYTE;
port_opened: INT;
Settings: ComSerice.COM_Settings;
SendPeriod: TON;
b_timerIN: BOOL;
b_timerOUT: BOOL;
estTime: TIME;
b_SendCommand: BOOL;
sendByte: UDINT;
readByte: UDINT;
receivedData: ARRAY[0..99] OF BYTE;
readBuffer: ARRAY[0..99] OF BYTE;
i: INT;
COM_SERVICE1: COM_SERVICE;
SettingsEx: ComSerice.COM_SettingsEx;
END_VAR
VAR RETAIN
readTimeout: INT;
readByteNumber: INT;
END_VAR
IF port_opened=0 THEN
Settings.sPort:=3; (* номер COM-порта 2 – Порт1, 3 - Порт2, 4 - Порт3, 5 - Порт4 *) //у нас в ПЛК304, порт Р2
Settings.ulBaudrate:=9600;
Settings.byParity:=0;
Settings.ulTimeout:=0;
Settings.byStopBits:=1;
Settings.ulBufferSize:=0;
SettingsEx.byByteSize:=8;//вроде как без этого не работал приём данных - размер байта в битах
END_IF
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0), Settings:=Settings , sets_ex:=Setting****
Task:=OPEN_TSK);
(*Если COM-порт открыт, то переходим к приему и передаче
данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
//------------------Приём--------------------------------
readByte:=ComSerice.SysComRead(COM_SERVICE1.handle,ADR(readBuffer[0]),readByteNumber,readTimeout,0);
//readByteNumber - число байт ожидаемых функцией.
//readTimeout - время ожидания данных, по истечении которого, не дождавшись readByteNumber байт,
//функция возвратит в readBuffer всё, что получила
IF readByte>0 THEN
i:=0;
WHILE readByte>0 DO
receivedData[i]:=readBuffer[i];
readByte:=readByte-1;
i:=i+1;
END_WHILE
END_IF
//--------------Отправка----------------------------------
IF b_SendCommand=TRUE THEN
sendBuffer[0]:=48;
sendBuffer[1]:=49;
sendBuffer[2]:=50;
sendBuffer[3]:=51;
sendBuffer[4]:=52;
sendBuffer[5]:=53;
sendBuffer[6]:=54;
sendBuffer[7]:=55;
sendByte:=ComSerice.SysComWrite(COM_SERVICE1.handle,ADR(sendBuffer[0]),8,50,0);
//-------------------------------------------------------
b_SendCommand:=FALSE;
END_IF
END_IF
//------------------таймер 1с на отправку----------------
SendPeriod(IN:=b_timerIN , PT:=T#1S , Q=>b_timerOUT , ET=>estTime );
IF b_timerIN=FALSE THEN
b_timerIN:=TRUE;
END_IF
IF b_timerOUT=TRUE THEN
b_timerIN:=FALSE;
b_SendCommand:=TRUE;
END_IF