Может быть кому пригодится, получилось как то так:
С буфером не понял, иногда по размеру переполнение.
Не стал упрощать для частного случая.

Код:
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