Здравствуйте! Прошу помощи в опросе МВ110-8АС с ПЛК63 по модбус. Связь с модулями есть - лампочки RS-485 мигают. из кучи примеров найденных на форуме слепил это, но никак не могу разобраться с указателями и буфером МВ110-8АС и МУ110-8И. С дискретными входами/выходами МК110 разобрался - все работает, но никак не удается получить значения с аналоговых входов.

PHP код:
VAR
    
get1_modbusMB_RD_HOLD_REGS;                    (*МВ110.8АС*) (*функция 04 чтение параметров float*)
    
send2_modbusMB_WR_REGS;                   (*МУ110.8И*)  (*функция 16 запись параметров float*)
    
get3_modbusMB_RD_HOLD_REGS;                   (*МК110.8ДН.4Р*)    (*функция 04 чтение параметров типа int*)
    
send4_modbusMB_WR_REGS;                     (*МК110.8ДН.4Р*) (*функция 16 запись параметров int*)
    
Buffer: ARRAY[0..255OF BYTE;                    (* байтовый буфер данных *)




         
cmplBOOL;
    
port_opened:  BYTE := 0;
    
InitBOOL;                                (* признак инициализации пользовательской программы *)
    
Settings:COMSETTINGS;                (* настройки последовательного порта *)
          
com_numPORTS:=0;                (*RS-485RS-232*)
    
enablBOOL;                            (*состояние работы блока*)
    
errINT;                                (*номер ошибки*)
    
TimeOutTIME:=T#50ms;                (*таймаут*)
    
ExceptionBYTE;
    
DataSizeWORD;
    
master1BYTE:= 1;

    
COM_SERVICE1COM_SERVICE;
    
ptr_D:POINTER TO BYTE;


                (* 
Каналы модуля МВ110 8АС *)
    
i                    :     BYTE;
    
pAI                    :    POINTER TO BYTE;
    
pDiag                :    POINTER TO BYTE;
    
x: ARRAY[1..8OF REAL;
    
ReciveBuffer            :    ARRAY[0..255OF BYTE;                            (* Буфер ответов*)
    
SendBuffer            :    ARRAY[0..255OF BYTE;                            (* Буфер посылок *)
    
AI                    :    ARRAY[1..8OF INT;                        (* Данные с каналов модуля*)
    
Diag                :    ARRAY[1..8OF INT;                        (* Диагностические данные с каналов модуля*)


                (* 
Каналы модуля МУ110 8И *)
    
pAO                    :    POINTER TO BYTE;
    
y: ARRAY[1..8OF REAL;

                (* 
Каналы модуля  МК110.8ДН.4Р *)
    
dwDI                :    WORD;                                    (* Данные с входов модуля в формате word*)
    
DI                    :    ARRAY[1..8OF BOOL;                    (* Данные с входов модуля*)
    
DICntr                :    ARRAY[1..16OF WORD;                    (* Счетчики входов модуля *)
    
pData                :    POINTER TO BYTE;
END_VAR


(*Устанавливаем настройки COM-порта*)
IF 
port_opened=0 THEN
        Settings
.Port:=com_num;               (*номер COM-порта*)
        
Settings.dwBaudRate:=115200;    (*скорость*)
        
Settings.byParity:=0;
        
Settings.dwTimeout:=0;
        
Settings.byStopBits:=0;
        
Settings.dwBufferSize:=0;
        
Settings.dwScan:=0;
END_IF

COM_SERVICE1
(Enable:=(port_opened=0) , Settings:=Settings Task:=OPEN_TSK  );
(*
Если COM-порт открытто переходим к приему и передачи данных *)
IF 
COM_SERVICE1.ready THEN
    port_opened
:=2;
END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

CASE 
master1 OF
0
:

get1_modbus(
    
Enable:=enabl ,            (* разрешение работы блока *)
    
Mode:=MB_RTU ,        (*режим передачи*)
    
DevAddr:=adr1 ,                (*адрес*)
    
FirstAddr:=100 ,                (*номер регистра*)
    
Quantity:=1,                (*количество регистров*)
    
ComHandle:=Settings.Port ,(*номер COM-порта*)
    
TimeOut:=TimeOut ,         (*Таймаут T#50ms*)
    
Buffer:=Buffer ,            (* буфер данных *)
    
Complete=>cmpl ,        (* скопировать признак завершения операции *)
    
Exception=>err ,            (* скопировать регистр ошибок *)
    
ByteCnt=>DataSize );        (*кол-во считанных байтов *)
(*
если установлен признак завершения операциито *)
IF 
cmpl THEN
    master1
:=1;(*переходим к выполнению следующего ФБ*)
    IF 
err=0 THEN (*Если нет ошибокто получаем  данные из буфера типа FLOAT*)
        FOR 
:= 1 TO 8 DO
                    
pAI := ADR(AI[i]);
                    
pAI^ := Buffer[(i-1)*1];
                    
pAI := pAI 1;
                    
pAI^ := Buffer[(i-1)*4];

                    
pDiag := ADR(Diag[i]);
                    
pDiag^ := ReciveBuffer[(i-1)*33];
                    
pDiag := pDiag 1;
                    
pDiag^ := ReciveBuffer[(i-1)*32];
                
END_FOR;
    
END_IF
END_IF

1
:
(*
запись в буффер параметра типа Float*)
pAO:=ADR(y);
     
buffer[5] := pAO^;
     
pAO:=pAO+1;
     
buffer[4] := pAO^;
     
pAO:=pAO+1;
     
buffer[7] := pAO^;
     
pAO:=pAO+1;
     
buffer[6] := pAO^;

send2_modbus(
       
Enable:= enabl,            (* разрешение работы блока *)
    
Mode:=MB_RTU ,        (*режим передачи*)
    
DevAddr:=adr2 ,                 (*адрес*)
    
FirstAddr:= 0,                 (*номер регистра*)
    
Quantity:= 6,                   (*количество записываемых регистров*)
    
ComHandle:=Settings.Port ,(*номер сом-порта*)
    
TimeOut:=TimeOut ,        (*таймаут T#50ms*)
    
Buffer:=Buffer ,            (* буфер данных *)
    
Complete=>cmpl ,        (* скопировать признак завершения операции *)
    
Exception=>err ,            (* скопировать регистр ошибок *)
    
RegCnt=> DataSize);        (*кол-во считанных байтов *)
(*
если установлен признак завершения операциито *)
IF 
cmpl THEN
    master1
:=2;(*переходим к выполнению следующего блока*)
END_IF


2
:

get3_modbus(
    
Enable:= enabl,            (* разрешение работы блока *)
    
Mode:=MB_RTU ,        (*режим передачи*)
    
DevAddr:=adr3 ,                (*адрес*)
    
FirstAddr:=51 ,                (*номер регистра*)
    
Quantity:=,                (*количество регистров*)
    
ComHandle:= Settings.Port,(*номер COM-порта*)
    
TimeOut:=TimeOut  ,         (*Таймаут T#50ms*)
    
Buffer:=Buffer ,            (* буфер данных *)
    
Complete=>cmpl ,        (* скопировать признак завершения операции *)
    
Exception=>err ,            (* скопировать регистр ошибок *)
    
ByteCnt=> DataSize);        (*кол-во считанных байтов *)
(*
если установлен признак завершения операциито *)

IF 
cmpl THEN
    
IF err=0 THEN (*Если нет ошибокто получаем данные из буфера типа INT*)
        
dwDI:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    
END_IF
master1
:=3;
        
END_IF

3
:

        (*
Пишем в буфер отправки битовую маску*)
        
ptr_D:=ADR(mk_mask_in);
        
Buffer[1]:=ptr_D^;
        
ptr_D:=ptr_D+1;
        
Buffer[0]:=ptr_D^;
        (*
Выполняем отправку*)
        
send4_modbus(
            
Enable:= enabl,            (* разрешение работы блока *)
            
Mode:=MB_RTU ,        (*режим передачи*)
            
DevAddr:=adr3 ,                (*адрес*)
            
FirstAddr:=50 ,                (*номер регистра*)
            
Quantity:=,                (*количество регистров*)
            
ComHandle:= Settings.Port,(*номер COM-порта*)
            
TimeOut:=TimeOut  ,         (*Таймаут T#50ms*)
            
Buffer:=Buffer ,            (* буфер данных *)
            
Complete=>cmpl ,        (* скопировать признак завершения операции *)
            
Exception=>err ,            (* скопировать регистр ошибок *)
            
RegCnt=> DataSize);        (*кол-во считанных байтов *)
        (*
если установлен признак завершения операциито *)
IF 
cmpl THEN
    master1
:=0;(*переходим к выполнению следующего блока*)
END_IF
END_CASE

IF  enabl FALSE THEN
     enabl 
:= TRUE;
END_IF

IF  err <> 0 THEN
     enabl 
:= FALSE;
END_IF
(*Разбираем битовую маску входов МК110.8ДН.4Р*)
    
A4_in1:=dwDI.0;
    
A4_in2:=dwDI.1;
    
A4_in3:=dwDI.2;
    
A4_in4:=dwDI.3;
    
A4_in5:=dwDI.4;
    
A4_in6:=dwDI.5;
    
A4_in7:=dwDI.6;
    
A4_in8:=dwDI.7;
END_IF