IF NOT port_opened_scan THEN (* если порт не открыт *)
com_handle_scan := SysComOpen( com_num_scan ); (* открываем его *)
IF com_handle_scan <> 16#FFFFFFFF THEN (* если порт открыт удачно - ставим флаг *)
port_init_scan := TRUE;
ELSE
SysComClose( com_num_scan ); (* иначе закрываем порт *)
com_handle_scan := SysComOpen( com_num_scan ); (* и открываем его повторно *)
port_init_scan := TRUE; (* ставим флаг открытия *)
END_IF
(* настраиваем порт *)
com_set_scan.Port := com_num_scan;
com_set_scan.dwBaudRate := 19200; (* 9600; 38400; 57600 *)
com_set_scan.byParity := 0;
com_set_scan.dwTimeout := 0;
com_set_scan.byStopBits := 0;
com_set_scan.dwBufferSize := 1024;
com_set_scan.dwScan := 0;
res_scan := SysComSetSettings( com_num_scan, ADR( com_set_scan ) ); (* применить настройки порта *)
IF NOT res_scan THEN
port_opened_scan := TRUE; (* порт успешно открыт *)
END_IF
SCANTIME := T#45MS;
END_IF

COM_SERVICE внутри себя ведет счетчик циклов ПЛК и собственно выполняется на сотом, зачем это сделано совершенно не понятно, а учитывая, что у многих цикл ПЛК выставлен много больше 1 мс -> порты открываются (и закрываются) минутами!!