Код:
FUNCTION_BLOCK WriteParamsToModules
VAR_INPUT
ModuleAddr:WORD; (*Адрес модуля*)
ChanelAddr:WORD; (*Номер канала*)
Settings:POINTER TO COMSETTINGS; (*Настройки порта*)
in_t: WORD; (*Тип датчика*)
in_Fd:WORD; (*Постоянная времени цифрового фильтра*)
Itrl:REAL; (*Период опроса датчика*)
in_SH: REAL; (*Сдвиг характеристики датчика*)
in_SL:REAL; (*Наклон характеристики датчика*)
in_FG:REAL; (*Полоса цифрового фильтра*)
Ain_L:REAL; (*Нижнее значение параметра, измеряемое активным датчиком*)
Ain_H:REAL; (*Верхнее значение параметра, измеряемое активным датчиком*)
dP: WORD ; (*Смещение десятичной точки*)
END_VAR
VAR_OUTPUT
Done:BOOL; (*Запись завершена*)
END_VAR
VAR_IN_OUT
paramNum:INT;
END_VAR
VAR
Se:COMSETTINGS;
TimeOut:TIME:= t#50ms;
set_di_owen_type:OWEN_SET_DINT; (*Тип датчика*)
set_di_owen_Fd:OWEN_SET_DINT; (*Постоянная времени цифрового фильтра*)
set_fl_owen_Itrl:OWEN_SET_REAL; (*Период опроса датчика*)
set_fl_owen_SH:OWEN_SET_REAL; (*Сдвиг характеристики датчика*)
set_fl_owen_SL:OWEN_SET_REAL; (*Наклон характеристики датчика*)
set_fl_owen_FG:OWEN_SET_REAL; (*Полоса цифрового фильтра*)
set_fl_owen_L:OWEN_SET_REAL; (*Нижнее значение параметра, измеряемое активным датчиком*)
set_fl_owen_H:OWEN_SET_REAL; (*Верхнее значение параметра, измеряемое активным датчиком*)
set_di_owen_dP:OWEN_SET_DINT; (*Смещение десятичной точки*)
cmpl: BOOL; (* признак завершения операции 1*)
err: INT; (*номер ошибки 1*)
Enable:BOOL:=TRUE;
tempValInt:DINT;
tempValReal:REAL;
END_VAR
Done:= FALSE;
CASE paramNum OF
(*Тип датчика*)
0:
set_di_owen_type(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'in-t',
Index:= ChanelAddr,
IntType:= UINT_FRM,
Value:= in_t,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err=0) THEN
paramNum:=1;
cmpl:= FALSE;
ELSE
Enable:= FALSE;
END_IF
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Постоянная времени цифрового фильтра*)
1:
set_di_owen_Fd(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'in.Fd',
Index:= ChanelAddr,
IntType:= UINT_FRM,
Value:= in_Fd,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=2;
cmpl:= FALSE;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Период опроса датчика*)
2:
set_fl_owen_Itrl(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'Itrl',
Index:= ChanelAddr,
RealType:=3, (*FIX_BIN,*)
Value:= Itrl,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=3;
cmpl:= FALSE;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Сдвиг характеристики датчика*)
3:
set_fl_owen_SH(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:='in.SH',
Index:= ChanelAddr,
RealType:= FIX_BIN,
Value:= in_SH,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=4; (*paramNum:=4;*)
cmpl:= FALSE;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Наклон характеристики датчика*)
4:
set_fl_owen_SL(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'in.SL',
Index:= ChanelAddr,
RealType:= 3, (*FIX_BIN*)
Value:=in_SL, (*in_SL*)
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=5;
cmpl:= FALSE;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Полоса цифрового фильтра*)
5:
set_fl_owen_FG(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'in.FG',
Index:= ChanelAddr,
RealType:= FIX_BIN,
Value:= in_FG,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=6;
cmpl:= FALSE;
err:= -1;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Нижнее значение параметра, измеряемое активным датчиком*)
6:
set_fl_owen_L(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'Ain.L',
Index:= ChanelAddr,
RealType:= FIX_BIN,
Value:= Ain_L,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=7;
cmpl:= FALSE;
err:= -1;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Верхнее значение параметра, измеряемое активным датчиком*)
7:
set_fl_owen_H(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'Ain.H',
Index:= ChanelAddr,
RealType:= FIX_BIN,
Value:= Ain_H,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=8;
cmpl:= FALSE;
err:= -1;
END_IF
(*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
(*Смещение десятичной точки*)
8:
set_di_owen_dP(
Enable:= Enable,
Addr:= ModuleAddr,
AddrLen:= A8BIT,
Name:= 'dP',
Index:= ChanelAddr,
IntType:= UINT_FRM,
Value:= dP,
ComHandle:= Settings^.Port,
TimeOut:= TimeOut,
Complete=> cmpl,
Error=> err);
(*если установлен признак завершения операции, то *)
IF Enable = FALSE THEN
Enable := TRUE;
END_IF
(*Если завершен обмен и нет ошибок*)
IF cmpl THEN
IF (err<>0) THEN
Enable:= FALSE;
END_IF
END_IF
IF cmpl = TRUE AND err=0 THEN
paramNum:=9;
END_IF
ELSE
(*Если все прошло успешно, снимаем команду на чтение и ставим в очередь на 0*)
IF paramNum = 9 THEN ReadWriteOwen:= 0; paramNum:= 0; Done:= TRUE; END_IF;
;
END_CASE
в RealType пробовал ставить FIX_BIN, FLOAT32, FIX_BCD. Результат не меняется. Может кто-нибудь сталкивался с таким?