Может быть кому пригодится, получилось как то так:
С буфером не понял, иногда по размеру переполнение.
Не стал упрощать для частного случая.
Код: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




Ответить с цитированием
