Да читаю я ее с первого же дня, только из за остывания топлива создается вакум, который и уносит показания ниже 4 мА, мне сказали что можно изменить показ обрыва при изменении на меньший ток. Вот об этом то я и спрашиваю, а руководство уже выучил)
Вид для печати
1. Берёте из модуля оба значения iRD и SRD
2. Делаете ФБ
3. На вход ФБ подаёте оба сигналаКод:UNCTION_BLOCK DECODE_Err
VAR_INPUT
iRD: INT; (*Датчик*)
SRD: WORD;
END_VAR
VAR_OUTPUT
Rezultat: INT; (*Результат*)
Cod_Err: BYTE; (*Код ошибки измерения*)
Err: BOOL; (*Наличее ошибки измерения*)
END_VAR
VAR
END_VAR
IF SRD <>0 THEN
Err:=TRUE; (*Установить ошибку измерений*)
CASE SRD OF
16#F000: Cod_Err:=1; (*Результаты измерения не верны*)
16#F006: Cod_Err:=2; (*Данные не готовы*)
16#F007: Cod_Err:=3; (*Датчик отключен*)
16#F00A: Cod_Err:=4; (*Измеренное значение слишком велико*)
16#F00B: Cod_Err:=5; (*Измеренное значение слишком мало*)
16#F00D: Cod_Err:=6; (*Обрыв датчика*)
16#F00F: Cod_Err:=7; (*Некорректный калибровочный коэффициент *)
END_CASE
ELSE
Err:=FALSE;
Cod_Err:=0; (*Нет ошибок измерений*)
END_IF
IF iRD<0 OR Err THEN Rezultat:=0;
ELSE Rezultat:=iRD;
END_IF
Вложение 25813
4. На выходе Rezultat будут или правильные значения или 0 пока мазут не прогрелся.
Это значение (Rezultat) используете в программе вместо iRD
5. Дополнительно получаете коды ошибок.
Почему "Cod_Err: BYTE; (*Код ошибки измерения*)" сделан BYTE, а не WORD или INT?
petera, спасибо большое, примерно так сейчас и сделано. Думал можно решить до захода в скаду или плк, на уровне настройки конфигуратора мв110. Единственное что в вашем и моем исполнение не нравится, это то что статус дает динамизацию на мнемосхеме, что то типа мигания значения, когда с датчиком не лады. Понимаю что это все обходится программно ( например не определять, пока не прогреется), просто левой пяткой правое ухо... А за помощь всем спасибо.
Тогда попробуйте вариант
в момент ошибки измерения выход Rezultat имеет последнее правильное(достоверное) значение, а не фиксированное =0. Т.е. ФБ замораживает последнее достоверное значение.Код:FUNCTION_BLOCK DECODE_Err
VAR_INPUT
iRD: INT; (*Датчик*)
SRD: WORD;
END_VAR
VAR_OUTPUT
Rezultat: INT; (*Результат*)
Cod_Err: BYTE; (*Код ошибки измерения*)
Err: BOOL; (*Наличие ошибки измерения*)
END_VAR
VAR
TMP: INT; (*Значение до ошибки*)
END_VAR
IF SRD <>0 THEN
Err:=TRUE; (*Установить ошибку измерений*)
CASE SRD OF
16#F000: Cod_Err:=1; (*Результаты измерения не верны*)
16#F006: Cod_Err:=2; (*Данные не готовы*)
16#F007: Cod_Err:=3; (*Датчик отключен*)
16#F00A: Cod_Err:=4; (*Измеренное значение слишком велико*)
16#F00B: Cod_Err:=5; (*Измеренное значение слишком мало*)
16#F00D: Cod_Err:=6; (*Обрыв датчика*)
16#F00F: Cod_Err:=7; (*Некорректный калибровочный коэффициент *)
END_CASE
ELSE
Err:=FALSE;
Cod_Err:=0; (*Нет ошибок измерений*)
END_IF
IF NOT (iRD<0 OR Err) THEN TMP:=iRD;
END_IF
Rezultat:=TMP;
Это позволяет игнорировать одиночные ошибки измерения, не "мельтешить" цифрами на HMI и не бросать PID в крайние положения.
Ну а факт действительного отказа датчика можно сделать через разумную задержку сигнала "Err" с выхода данного ФБ и предпринять нужные действия (вкл. сигнализацию, перевести механизмы в безопасное состояние, и т.д.)
Аналогичный ФБ для аналогового входа ПЛК http://www.owen.ru/forum/showthread....l=1#post183061
http://www.owen.ru/forum/attachment....5&d=1425224217
Да, уж...
Неужели самому семь строчек добавить сложно?
http://www.owen.ru/forum/attachment....2&d=1392751544
Вложение 26136Код:FUNCTION_BLOCK DECODE_ErrExt
VAR_INPUT
iRD: INT; (*Датчик*)
SRD: WORD;
END_VAR
VAR_OUTPUT
Rezultat: INT; (*Результат*)
Cod_Err: BYTE; (*Код ошибки измерения*)
Err: BOOL; (*Наличие ошибки измерения*)
Err1: BOOL;
Err2: BOOL;
Err3: BOOL;
Err4: BOOL;
Err5: BOOL;
Err6: BOOL;
Err7: BOOL;
END_VAR
VAR
TMP: INT; (*Значение до ошибки*)
END_VAR
IF SRD <>0 THEN
Err:=TRUE; (*Установить ошибку измерений*)
CASE SRD OF
16#F000: Cod_Err:=1; (*Результаты измерения не верны*)
16#F006: Cod_Err:=2; (*Данные не готовы*)
16#F007: Cod_Err:=3; (*Датчик отключен*)
16#F00A: Cod_Err:=4; (*Измеренное значение слишком велико*)
16#F00B: Cod_Err:=5; (*Измеренное значение слишком мало*)
16#F00D: Cod_Err:=6; (*Обрыв датчика*)
16#F00F: Cod_Err:=7; (*Некорректный калибровочный коэффициент *)
END_CASE
ELSE
Err:=FALSE;
Cod_Err:=0; (*Нет ошибок измерений*)
END_IF
Err1:=Cod_Err = 1;
Err2:=Cod_Err = 2;
Err3:=Cod_Err = 3;
Err4:=Cod_Err = 4;
Err5:=Cod_Err = 5;
Err6:=Cod_Err = 6;
Err7:=Cod_Err = 7;
Спасибо.
В ST не очень понимаю, полдня экспериментировал.:confused:Цитата:
Неужели самому семь строчек добавить сложно?
оказалось так просто.
Не ужели ни с каким языком программирования не сталкивались? Например с Бэйсиком?
В примере, для выражения
Err2:=Cod_Err = 2;
У переменной "Err2" тип BOOL, т.е. она может принимать только два значения TRUE или FALSE.
Часть, которая "Cod_Err = 2" не что иное, как логическая операция сравнения на равенство двух величин. Результатом ее будет
TRUE, если Cod_Err равен 2
FALSE, если Cod_Err неравен 2
Вот этот результат и прививается (операнд :=) переменной Err2