Код:
(*Функциональный блок инициализации ком порта, запускается один раз*)
FUNCTION_BLOCK ComConn
VAR_INPUT
(*разрешение на работу*) enable:BOOL;
(*номер порта на ПЛК, для 485 на 304м это номер 2*) PortNum: COM_PORTS:=2;
(*скорость, по умолчанию 115200*) PortBaudrate:COM_Baudrate:=115200;
(*четность 0- нет 1-нечет 2-чет, по умолчанию 0-нет*) PortParity:COM_Parity:=0 ;
(*стопбит 1-1бит, 2-1.5бита, 3-2бита, по умолчанию1-1бит*) PortStopBits:COM_StopBits:=1 ;
(*размер посылки, кажется, по умолчанию 8 бит*) PortByteSize:BYTE:=8;
END_VAR
VAR_OUTPUT
(*идентификатор открытого порта, если ошибка то все F*) Handle:SysCom.RTS_IEC_HANDLE;
(*флаг завершения операции*) Done:BOOL:=FALSE;
(*код ошибки*) ErrCode:SysCom.RTS_IEC_RESULT;
END_VAR
VAR
settings:SysCom.COM_Settings;
settings2:SysCom.COM_SettingsEx;
res:SysCom.RTS_IEC_RESULT;
rtrig:R_TRIG;
trig:rs;
END_VAR
(*---------------------------------------------------------------*)
rtrig(clk:=(Enable AND NOT done));
trig(set:=rtrig.Q,RESET1:=FALSE);
IF trig.Q1 THEN
Settings.sPort:=PortNum; (*номер COM-порта*)
Settings.ulBaudrate:=PortBaudrate; (*скорость*)
Settings.byParity:=PortParity;
Settings.ulTimeout:=0;
Settings.byStopBits:=PortStopBits;
Settings.ulBufferSize:=0;
settings2.byByteSize:=PortByteSize;
(*settings2.bBinary := TRUE; //полный набор параметров для открытия ком порта в принцепе не обязательно
settings2.bDtrControl := FALSE; // поэтому можно закоментировать обратно
settings2.bRtsControl := FALSE;
settings2.bOutxCtsFlow := FALSE;
settings2.bOutxDsrFlow := FALSE;
settings2.bDsrSensitivity := FALSE;*)
handle:=SysCom.SysComOpen2( ADR(Settings),ADR(Settings2),ADR(ErrCode));// непосредственно открытие порта
(*res:=SysComGetSettings(handle, ADR(Settings),ADR(Settings2));
res:=SysComSetSettings(handle, ADR(Settings),ADR(Settings2));*)
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF (handle <> 16#FFFFFFFF ) THEN //если условие не выполняется то порт занят
done:=TRUE;
trig(RESET1:=true);
ELSE
done:=FALSE;
END_IF
END_IF