PDA

Просмотр полной версии : ПЛК304. ComService. Приём данных по RS232.



arsenius
25.01.2016, 09:34
Всем привет!
Пытаюсь принять данные в порт по RS232. Данные шлю с ПК средствами терминала. Лампочка порта моргает. Пробовал разные настройки и варианты кода, но хоть бы байт в буфере :)
Передача работает чётко.
Буду благодарен если поделитесь опытом.
Вот код одной попытки.


IF port_opened=0 THEN
Settings.sPort:=3; (* номер COM-порта 2 – Порт1, 3 - Порт2, 4 - Порт3, 5 - Порт4 *)
Settings.ulBaudrate:=9600;
Settings.byParity:=0;
Settings.ulTimeout:=0;
Settings.byStopBits:=0;
Settings.ulBufferSize:=256;
END_IF
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0), Settings:=Settings ,
Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передаче
данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
//------------------Приём--------------------------------
readByte:=ComSerice.SysComRead(COM_SERVICE1.handle ,ADR(readBuffer[0]),8,250,0);
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.handl e,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

arsenius
27.01.2016, 08:46
Актуально!

arsenius
29.01.2016, 15:09
Победил.
Если кто столкнётся:


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.handl e,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

Evgenich93
19.03.2020, 11:07
Реально заработало после указания длинны кадра в дополнительных параметрах. s e t s _ e x : = S e t t i n g s E x ,