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
4. На выходе Rezultat будут или правильные значения или 0 пока мазут не прогрелся.
Это значение (Rezultat) используете в программе вместо iRD
5. Дополнительно получаете коды ошибок.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Почему "Cod_Err: BYTE; (*Код ошибки измерения*)" сделан BYTE, а не WORD или INT?
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
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
Последний раз редактировалось petera; 16.08.2016 в 04:25.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Да, уж...
Неужели самому семь строчек добавить сложно?
Код: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;
Последний раз редактировалось petera; 02.09.2016 в 12:57.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо.
В ST не очень понимаю, полдня экспериментировал.Неужели самому семь строчек добавить сложно?
оказалось так просто.
Последний раз редактировалось Эдуард_Н; 02.09.2016 в 13:25.
Не ужели ни с каким языком программирования не сталкивались? Например с Бэйсиком?
В примере, для выражения
Err2:=Cod_Err = 2;
У переменной "Err2" тип BOOL, т.е. она может принимать только два значения TRUE или FALSE.
Часть, которая "Cod_Err = 2" не что иное, как логическая операция сравнения на равенство двух величин. Результатом ее будет
TRUE, если Cod_Err равен 2
FALSE, если Cod_Err неравен 2
Вот этот результат и прививается (операнд :=) переменной Err2
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg