В итоге написал такой ФБ:
Надеюсь будет работать...Код:FUNCTION_BLOCK avar_pch_dc1 VAR_INPUT alarm_pch :BOOL; (*Вход аварийного состояния*) stat_pch :WORD; (*Слово состояния с преобрзователя*) END_VAR VAR_OUTPUT ovr_cur, ovr_dr, err_phase, ovr_heat :BOOL; (*Выходы аварий*) END_VAR VAR (*pt :POINTER TO WORD; (*Адрес входной переменной*)*) avar_pch :BYTE; (*Переменная в байтах*) code_err :WORD; (*Код аварии*) err :BOOL; (*Наличие аварии*) END_VAR (* Коды аварий (hex) 00 Остановлен, готов к работе 01 Избыточный ток тормозного прерывателя 02 Перегрузка тормозного резистора 03 • Перегрузка по току на выходе преобразователя частоты • Перегрузка двигателя • Перегрев радиатора преобразователя частоты 04 Перегрев двигателя 05 Внутренняя неисправность (силовая схема) 06 Перенапряжение в звене постоянного тока 07 Недостаточное напряжение в звене постоянного тока 08 Перегрев радиатора охлаждения 09 Перегрев радиатора охлаждения 0A Настройки по умолчанию (параметры загружены) C0 сообщение о внешней ошибке 0C Ошибка магистральной шины 0D Зарезервирован 0E Неисправность фазы (со стороны электрической сети) 0F Неисправность функции управления приемистостью двигателя (для подхвата вращающегося двигателя) 10 Неисправность встроенного термистора (радиатор) 11 Неисправность контрольной суммы EEPROM 12 Аналоговый вход: • значение вне диапазона • разрыв провода (контроль 4 мА) *) IF alarm_pch THEN err:=TRUE; (*Установить признак аварии*) (*pt:=ADR(stat_pch);*) (*avar_pch:=WORD_TO_BYTE(SHR(pt^,8)); (*Смещаемся на 8 бит (или не 8??) вправо и остальное заполняем нулями*)*) avar_pch:=WORD_TO_BYTE(SHR(stat_pch,8)); (*Смещаемся на 8 бит (или не 8??) вправо и остальное заполняем нулями*) (*Коды ошибок, полученные с датчика*) CASE avar_pch OF 16#00: code_err:=1; (*Остановлен, готов к работе*) 16#01: code_err:=2; (*Избыточный ток тормозного прерывателя*) 16#02: code_err:=3; (*Перегрузка тормозного резистора*) 16#03: code_err:=4; (*Перегрузка по току ПЧ, ЭД или перегрев радиатора преобразователя частоты*) 16#04: code_err:=5; (*Перегрев двигателя*) 16#05: code_err:=6; (*Внутренняя неисправность (силовая схема)*) 16#06: code_err:=7; (*Перенапряжение в звене постоянного тока*) 16#07: code_err:=8; (*Недостаточное напряжение в звене постоянного тока*) 16#08: code_err:=9; (*Перегрев радиатора охлаждения*) 16#09: code_err:=10; (*Перегрев радиатора охлаждения*) 16#C0: code_err:=11; (*сообщение о внешней ошибке*) 16#0C: code_err:=12; (*Ошибка магистральной шины*) 16#0E: code_err:=13; (*Неисправность фазы (со стороны электрической сети)*) 16#0F: code_err:=14; (*Неисправность функции управления приемистостью двигателя (для подхвата вращающегося двигателя)*) 16#10: code_err:=15; (*Неисправность встроенного термистора (радиатор)*) 16#11: code_err:=16; (*Неисправность контрольной суммы EEPROM*) 16#12: code_err:=17; (*Неисправность аналогового входа (вне диапазона или разрыв провода)*) ELSE err:=FALSE; code_err:=0; (*Нет аварии ПЧ*) END_CASE IF code_err=4 THEN ovr_cur:=TRUE; ELSE ovr_cur:=FALSE; END_IF; IF code_err=5 THEN ovr_dr:=TRUE; ELSE ovr_dr:=FALSE; END_IF; IF code_err=13 THEN err_phase:=TRUE; ELSE err_phase:=FALSE; END_IF; IF (code_err=9 OR code_err=10) THEN ovr_heat:=TRUE; ELSE ovr_heat:=FALSE; END_IF; END_IF;




Ответить с цитированием