Вход

Просмотр полной версии : Ошибка при записи параметра с помощью библиотеки OwenNet.lib



Серджиус
23.01.2025, 08:57
Добрый день. Имеется контроллер ПЛК 110-24 [М02] и модуль аналогового ввода МВ110-8А. Пытаюсь записать параметры модуля с помощью библиотеки OwenNet.lib. Паписывает нормально любые числа (в пределах допустимых) с плавающей точкой в параметр "Itrl", кроме 1.0. Операция записи возращается с ошибкой Error = 5.
Вот код:


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. Результат не меняется. Может кто-нибудь сталкивался с таким?

Евгений Кислов
23.01.2025, 09:48
Добрый день.
Один из наших клиентов сталкивался с такой ситуацией и предложил вариант решения:
https://owen.ru/forum/showthread.php?t=23897&p=351697&viewfull=1#post351697

Серджиус
24.01.2025, 06:50
Благодарю за помощь. С параметром "Itrl" всё получилось, а вот с параметром "in.SL" этот фокус не проходит. всё равно возвращается Error = 5. Вообще в параметр "in.SL" не пишется никакое число (0,9; 0,95; 1,0; 1,1) даже функцией OWEN_SET_REAL. Всегда возвращается Error = 5. Вы случайно не знаете что ему нужно засунуть, чтобы он проглотил?

Евгений Кислов
24.01.2025, 07:04
Вы случайно не знаете что ему нужно засунуть, чтобы он проглотил?

К сожалению, нет. Судя по документации - разницы в обработке "Itrl" и "in.SL" быть не должно (типы данных одинаковые, отличаются только диапазоны).
Напишите, пожалуйста, на support@owen.ru - тогда сформируется официальная заявка и будет возможность привлечь сотрудника техподдержки для проведения исследования по этому вопросу.

Серджиус
24.01.2025, 07:44
Спасибо за помощь.