Со значениями переменных разобрался
теперь другая проблема:
VAR_GLOBAL
I1 AT %QD7.0:REAL;
I2 AT %QD8.0:REAL;
di0 AT %IX0.0:BOOL;
di1 AT %IX0.1:BOOL;

do0 AT %QX1.0:BOOL;
do1 AT %QX1.1:BOOL;
do2 AT %QX1.2:BOOL;
do3 AT %QX1.3:BOOL;

beg:BOOL:=TRUE;
comPort:PORTS:=1;
popytka:INT:=0;
vI:REAL:=0.0;

END_VAR
PROGRAM PLC_PRG
VAR
openComPortWORD;
closeComPort:BOOL;
inp:BOOL;
outp:BOOL;
xOutput:fOutput;
ok:BOOL;
ComSet:comsettings;
ComSetEx:comsettingsEx;
bytesReadWORD;
buf,bufold: REAL;
END_VAR
(*программа принимает число через COM порт (с компьютера) и выдаёт его на аналоговый выход 1*)
IF di0 THEN
(*завершение*)
closeComPort:=SysComClose(opencomport);
do0:=FALSE;
do1:=FALSE;
do2:=FALSE;
do3:=FALSE;
i1:=4.1;
ELSE
IF beg THEN
(*инициализация*)

bufold:=0;
comPort:=0;(*RS-485*)
openComPort:=SysComOpen(comPort); (*выдаёт openComPort=0 *)
IF openComPort=INVALID_HANDLE THEN
i1:=5.1;
closeComPort:=SysComClose(comPort);
popytka:=(popytka+1) MOD 500;
IF popytka=0 THEN
do0:=NOT do0;
END_IF;
ELSE
i1:=10.1;

ComSet.dwBaudRate:=(*9600;*) 115200;
ComSet.byParity:=0;
ComSet.byStopBits:=0; (*1,5*)
ComSet.dwBufferSize:=5;
ComSet.dwScan:=0;
ComSet.dwTimeout :=100;
ComSet.Port:=comPort;

ok:=SysComSetSettings(openComPort,ADR(ComSet)); (*выдаёт ok=FALSE *)
IF ok THEN
do3:=TRUE;
vI:=0.001;

END_IF;
beg:=FALSE;

END_IF;

ELSE
(*цикл пока не нажата кнопка di0*)

bytesread:=SysComRead(opencomport,ADR(buf),4,300);
IF bytesread=4 THEN
I1:=buf;
I2:=4;
bufold:=buf;
END_IF;
IF bytesread>0 THEN
do0:=((bytesread MOD 2)=1);
do1:=(((bytesread/2) MOD 2)=1);
do2:=(((bytesread/4) MOD 2)=1);
END_IF;

END_IF; (* IF beg ELSE*)
END_IF; (*IF di0 ELSE*)
Если функция SysComOpen выдаёт значение 0, означает ли это, что порт открыт?
Почему SysComSetSettings выдаёт FALSE?