Может быть кому пригодится, получилось как то так:
С буфером не понял, иногда по размеру переполнение.
Не стал упрощать для частного случая.
Код:
PROGRAM pReadAddr
VAR
state:BYTE:=0;
handle:DWORD:=0;
res: ASYNC_RET_VALUE;
result:DWORD;
bufin:STRING(15);
counter: DWORD;
pos:WORD:=27;
i: BYTE;
IP: ARRAY [1..4] OF WORD;
END_VAR
Код:
CASE state OF
0:
res:=OwenFileOpenAsync('local_addres.dat','r',ADR(handle));
IF res=ASYNC_WORKING THEN
state:=1;
END_IF
1:
res:=OwenFileOpenAsync('local_addres.dat','r',ADR(handle));
IF res=ASYNC_DONE THEN
IF handle<>0 THEN
state:=2;
ELSE
state:=0;
END_IF
ELSIF res<0 THEN
state:=0;
END_IF
2:
res:=OwenFileSetPosAsync(handle,pos,ADR(result));
IF res=ASYNC_WORKING THEN
state:=3;
ELSE
state:=6;
END_IF
3:
res:=OwenFileSetPosAsync(handle,pos,ADR(result));
IF res=ASYNC_DONE THEN
state:=4;
ELSIF res<0 THEN
state:=6;
END_IF
4:
res:=OwenFileReadAsync(handle,ADR(bufin),SIZEOF(bufin),ADR(result));
IF res=ASYNC_WORKING THEN
state:=5;
ELSE
state:=6;
END_IF
5:
res:=OwenFileReadAsync(handle,ADR(bufin),SIZEOF(bufin),ADR(result));
IF res=ASYNC_DONE THEN
IF result>=0 THEN
state:=6;
counter:=counter+1;
ELSE
state:=6;
END_IF
ELSIF res<0 THEN
state:=6;
END_IF
6:
res:=OwenFileCloseAsync(handle,ADR(result));
IF res=ASYNC_WORKING THEN
state:=7;
ELSE
state:=0;
END_IF
7:
res:=OwenFileCloseAsync(handle,ADR(result));
IF res=ASYNC_DONE THEN
IF result=0 THEN
state:=8;
ELSE
state:=8;
END_IF
ELSIF res<0 THEN
state:=8;
END_IF
8:
FOR i:=1 TO 4 BY 1 DO
IP[i]:= STRING_TO_WORD(CONCAT('16#',LEFT(bufin,2)));
bufin:=DELETE(bufin,3,1);
END_FOR;
state:=9;
ELSE
state:=9;
END_CASE