"========НАЧАЛО БЛОКА==========
"Проверяем макс. ПС пересечение со вторым пороговым значением
ФУНКЦИЯ (FLTCMP)
входные параметры ( МАС_Р_ВХ[3], МАС_Р_ВХ[4], МАС_Р_ВХ[13], МАС_Р_ВХ[14] ),
выходные параметры ( ВРЕМЕННЫЙ[0] );
"выставляем выше ПС
ЕСЛИ (ВРЕМЕННЫЙ[0] == 1), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] | 8H;
}
"Если параметр вышел из пересечения со вторым пороговым значением
"определяем пересечение с первым пороговым значением (полосу гистерезиса)
ИНАЧЕ {
ФУНКЦИЯ (SUBF)
входные параметры ( МАС_Р_ВХ[13], МАС_Р_ВХ[14], МАС_Р_ВХ[17], МАС_Р_ВХ[18] ),
выходные параметры ( ВРЕМЕННЫЙ[1], ВРЕМЕННЫЙ[2], ОШИБКА );
ФУНКЦИЯ (FLTCMP)
входные параметры ( МАС_Р_ВХ[3], МАС_Р_ВХ[4], ВРЕМЕННЫЙ[1], ВРЕМЕННЫЙ[2] ),
выходные параметры ( ВРЕМЕННЫЙ[0] );
"сбрасываем выше ПС
ЕСЛИ (ВРЕМЕННЫЙ[0] == -1), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] & FFF7H;
}
"сбрасываем выше ПС
ЕСЛИ (ВРЕМЕННЫЙ[0] == 0), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] & FFF7H;
}
}
"========НАЧАЛО БЛОКА==========
"Проверяем макс. АС пересечение со вторым пороговым значением
ФУНКЦИЯ (FLTCMP)
входные параметры ( МАС_Р_ВХ[3], МАС_Р_ВХ[4], МАС_Р_ВХ[15], МАС_Р_ВХ[16] ),
выходные параметры ( ВРЕМЕННЫЙ[0] );
"выставляем выше АС
ЕСЛИ (ВРЕМЕННЫЙ[0] == 1), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] | 10H;
}
"Если параметр вышел из пересечения со вторым пороговым значением
"определяем пересечение с первым пороговым значением (полосу гистерезиса)
ИНАЧЕ {
ФУНКЦИЯ (SUBF)
входные параметры ( МАС_Р_ВХ[15], МАС_Р_ВХ[16], МАС_Р_ВХ[17], МАС_Р_ВХ[18] ),
выходные параметры ( ВРЕМЕННЫЙ[1], ВРЕМЕННЫЙ[2], ОШИБКА );
ФУНКЦИЯ (FLTCMP)
входные параметры ( МАС_Р_ВХ[3], МАС_Р_ВХ[4], ВРЕМЕННЫЙ[1], ВРЕМЕННЫЙ[2] ),
выходные параметры ( ВРЕМЕННЫЙ[0] );
"сбрасываем выше АС
ЕСЛИ (ВРЕМЕННЫЙ[0] == -1), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] & FFEFH;
}
"сбрасываем выше АС
ЕСЛИ (ВРЕМЕННЫЙ[0] == 0), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] & FFEFH;
}
}
"========НАЧАЛО БЛОКА==========
"Выставляем или снимаем признак общей аварии параметра
"это необходимо для мерцания полей АС/ПС в СП300
ЕСЛИ ( СООБЩЕНИЯ[0] & 03FH ), то {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] | 40H;
}
ИНАЧЕ {
СООБЩЕНИЯ[0] = СООБЩЕНИЯ[0] & FF00H;"снимаем все аварии
}
БИБЛИОТЕКА (Lib\MATH.LIB);
"ФОРМИРОВАНИЕ ПС/АС ДЛЯ ПАНЕЛИ ОПЕРАТОРА
/*====== СООБЩЕНИЯ АНАЛОГОВЫХ ПАРАМЕТРОВ =======*/
ПРОЦЕДУРА (SMS)
{
"========== обнуление АОС ГРС ==========================
ЕСЛИ (ZAGAZOVANNAST == 0H) & (ZAGAZOVANNAST == 1H) & (POJAR == 0), то {_GRS = 0H;
}
"============ открытие свечи при АОС ГРС =================
ЕСЛИ (КРАН_ВХ[0] & 2H) & (КРАН_ВЫХ[0] & 2H), то {_KRAN = 1H;
}
ЕСЛИ (КРАН_ВХ[0] != 2H) & (КРАН_ВЫХ[0] != 2H), то {
AOS_KRAN = 0H;
}
ЕСЛИ (AOS_GRS == 1H) & (AOS_KRAN == 1H), то {
КРАН_НА_СВЕЧУ[1] = 1H;
}
ЕСЛИ (КРАН_НА_СВЕЧУ[0] == 202H) | (КРАН_НА_СВЕЧУ[0] == 800H) | (КРАН_НА_СВЕЧУ[0] == 403H), то{
КРАН_НА_СВЕЧУ[1] = 00H;
}
"============= алгоритм при загаз. 2 порог ===================
ЕСЛИ (OPTIONS & 400H), то {
ЕСЛИ ((MAS_DI[3] & 4000H) == 0), то {= 0;
СТОП (TIMER_ZAGAZ);
}
ЕСЛИ (@TIMER_ZAGAZ@ == 1), то{
ВЫЗВАТЬ процедуру (AOS_GRS);
}
ЕСЛИ (((MAS_DI[3] & 4000H) != 0) & (@TIMER_ZAGAZ == 0)) & (ZAGAZ == 0), то {
СТАРТ (TIMER_ZAGAZ);= 1;
}
}
"============ Алгоритм пожар ============================
ЕСЛИ (OPTIONS & 800H), то {
ЕСЛИ ((MAS_DI[3] & 2H ) == 0) & ((MAS_DI[3] & 4H ) == 0) & ((MAS_DI[3] & 8H ) == 0) , то {= 0;
СТОП (TIMER_SIGNAL_POJAR);
}
ЕСЛИ (@TIMER_SIGNAL_POJAR@ == 1), то{
ВЫЗВАТЬ процедуру (AOS_GRS);
}
ЕСЛИ ((((MAS_DI[3] & 2H ) != 0) | ((MAS_DI[3] & 4H ) != 0) | ((MAS_DI[3] & 8H ) != 0)) & (POJAR == 0)), то {= 1;
СТАРТ (TIMER_SIGNAL_POJAR);
}
}
"=========== Алгоритм P на вх. MIN ========================
ЕСЛИ (OPTIONS & 1H), то {
ЕСЛИ (МАС_Р_ВХ[4] > МАС_Р_ВХ[12]), то {
PVH_MIN = 0;
СТОП (TIMER_PVH_MIN);
}
ЕСЛИ (@TIMER_PVH_MIN@ == 1), то{
ВЫЗВАТЬ процедуру (AOB_GRS);
}
ЕСЛИ (МАС_Р_ВХ[4] <= МАС_Р_ВХ[12]) & (@TIMER_PVH_MIN == 0) & (PVH_MIN == 0), то {
СТАРТ (TIMER_PVH_MIN);_MIN = 1;
}
}
"================= Алгоритм P на вых. MIN =================
ЕСЛИ (МАС_Р_РЕД1[4] > МАС_Р_РЕД1[12]), то {
PVIH_MIN = 0;
СТОП (TIMER_PVIH_MIN);
}
ЕСЛИ (@TIMER_PVIH_MIN@ == 1), то{
КРАН_РЕД1[1] = 2H;
КРАН_ВЫХ[1] = 2H;
}
ЕСЛИ (МАС_Р_РЕД1[4] <= МАС_Р_РЕД1[12]) & (@TIMER_PVIH_MIN == 0) & (PVIH_MIN == 0), то {
СТАРТ (TIMER_PVIH_MIN);_MIN = 1;
}
}
"=========== Алгоритм P на вых. MAX ПРЕДУПРЕДИТЕЛЬНОЕ ==
ЕСЛИ (OPTIONS & 8H), то {
ЕСЛИ (REDUCIR == 1), то {
ЕСЛИ (МАС_Р_ВЫХ[4] < МАС_Р_ВЫХ[14]), то {
PVIH_MAX = 0;
СТОП (TIMER_PVIH_MAX);
}
ЕСЛИ (@TIMER_PVIH_MAX@ == 1), то {
КРАН_РЕД1[1] = 2H;
}
ЕСЛИ (МАС_Р_ВЫХ[4] >= МАС_Р_ВЫХ[14]) & (@TIMER_PVIH_MAX == 0) & (PVIH_MAX == 0), то {
СТАРТ (TIMER_PVIH_MAX);_MAX = 1;
}
}
"===== Алгоритм P на вых. MAX аварийное ====================
ЕСЛИ (REDUCIR == 2), то {
ЕСЛИ (МАС_Р_ВЫХ[4] < МАС_Р_ВЫХ[16]), то {
PVIH11_MAX = 0;
СТОП (TIMER_PVIH11_MAX);
}
ЕСЛИ (@TIMER_PVIH11_MAX@ == 1), то {
КРАН_РЕД1[1] = 2H;
КРАН_ВЫХ[1] = 2H;
}
ЕСЛИ (МАС_Р_ВЫХ[4] >= МАС_Р_ВЫХ[16]) & (@TIMER_PVIH11_MAX == 0) & (PVIH11_MAX == 0), то {
СТАРТ (TIMER_PVIH11_MAX);_MAX = 1;
}
}
"======= аналоги для телемех =============================[500] = МАС_Р_ВХ[3];[501] = МАС_Р_ВХ[4];[502] = МАС_Р_ВЫХ[3];[503] = МАС_Р_ВЫХ[4];[506] = МАС_Р_РЕД1[3];[507] = МАС_Р_РЕД1[4];[508] = МАС_Р_РЕД2[3];[509] = МАС_Р_РЕД2[4];[512] = МАС_Т_ВХ[3];[513] = МАС_Т_ВХ[4];[514] = МАС_Т_ВЫХ[3];[515] = МАС_Т_ВЫХ[4];
" КОНТРОЛЬ И УПРАВЛЕНИЕ КРАНАМИ
ПРОЦЕДУРА (VALVE)
{
/*======== КРАН_ВХ ==================================*/
[КРАН_ВХ]
"Выделяем биты состояния кран открыт/закрыт
ВРЕМЕННЫЙ[0] = MAS_DI[0];
ВРЕМЕННЫЙ[0] = ВРЕМЕННЫЙ[0] & 3;
"========НАЧАЛО БЛОКА==========
"Проверяем самопроизвольный сход крана, смотрим предыдущее состояние
ВРЕМЕННЫЙ[1] = КРАН_ВХ[0];
ВРЕМЕННЫЙ[1] = ВРЕМЕННЫЙ[1] & 3;
"Проверяем, если текущее состояние и предыдущее состояние разные, а команда не подавалась,
"кран не в ремонте, не в аварии и не находился в промежутке или неисправности (двойное замыкание)
"тогда возвращаем кран назад
ЕСЛИ ( (ВРЕМЕННЫЙ[0] != ВРЕМЕННЫЙ[1]) & ( (КРАН_ВХ[1] & 3) == 0 ) & ( (КРАН_ВХ[1] & 100H) == 0 ) &
((КРАН_ВХ[0] & 7F00H) == 0) & (ВРЕМЕННЫЙ[1] != 3) & (ВРЕМЕННЫЙ[1] != 0)), то {
"Отправляем кран назад в соответствии с состоянием
КРАН_ВХ[1] = ВРЕМЕННЫЙ[1]; "!!!Кран не в ремонте!!!
"Выставляем признак схода с концевика
ПЕРЕЙТИ, если переменной (ВРЕМЕННЫЙ[1]) соответсвует {
ЗНАЧЕНИЕ (1):"Сход с КО
ВРЕМЕННЫЙ[2] = 2000H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[2];
ВЫХОД;
ЗНАЧЕНИЕ (2):"Сход с КЗ
ВРЕМЕННЫЙ[2] = 4000H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[2];
}
}
"========НАЧАЛО БЛОКА==========
"Заносим новое состояние крана при этом сохраняем аварийные биты и биты схода с концевика
ВРЕМЕННЫЙ[1] = КРАН_ВХ[0];
ВРЕМЕННЫЙ[1] = ВРЕМЕННЫЙ[1] & 7F00H;
КРАН_ВХ[0] = ВРЕМЕННЫЙ[0] | ВРЕМЕННЫЙ[1];
"========НАЧАЛО БЛОКА==========
"Проверяем отключение (ремонт) крана, если кран отключен снимаем команды, сигналы аварии крана,
"сигнал сход с концевика и выходим из процедуры
ЕСЛИ ( (КРАН_ВХ[1] & 100H) != 0 ), то{
ВРЕМЕННЫЙ[2] = MAS_OUT_DIO[0];
"Пишем 00 в команды управления краном
ВРЕМЕННЫЙ[2] = ВРЕМЕННЫЙ[2] & FFFCH;_OUT_DIO[0] = ВРЕМЕННЫЙ[2];
КРАН_ВХ[1] = КРАН_ВХ[1] & 100H; "Снимаем команды, сохраняем бит ремонта
КРАН_ВХ[0] = КРАН_ВХ[0] & 3; "Снимаем сигналы аварии, сохраняя текущее состояние
ИДТИ на метку (КРАН_НА_СВЕЧУ);
}
"========НАЧАЛО БЛОКА==========
"Проверяем отработал ли кран команду управления, если отработал снимаем команду и
"останавливаем таймер
ЕСЛИ ( (КРАН_ВХ[1] & 3) == (КРАН_ВХ[0] & 3) ), то{
ВРЕМЕННЫЙ[2] = MAS_OUT_DIO[0];
ВРЕМЕННЫЙ[2] = ВРЕМЕННЫЙ[2] & FFFCH;_OUT_DIO[0] = ВРЕМЕННЫЙ[2];
КРАН_ВХ[1] = 0;
СТОП таймер (TIMER_VALVE_IN);
ИДТИ на метку (КРАН_НА_СВЕЧУ);
}
"========НАЧАЛО БЛОКА==========
"Если таймер отработал выставляем признак аварии сбрасываем команду
ЕСЛИ (@TIMER_VALVE_IN@ == 1), то{
"Сбрасываем старые аварии, сохраняя текущее состояние, далее запишем новые
КРАН_ВХ[0] = КРАН_ВХ[0] & 3;
"Проверяем в каком состоянии остановился кран, если в промежутке, тогда
"определяем до какого концевика не дошёл кран
ЕСЛИ ( (КРАН_ВХ[0] & 3) == 0 ), то {
ВРЕМЕННЫЙ[0] = КРАН_ВХ[1] & 3; "Определяем текущее команду управления
ПЕРЕЙТИ, если переменной (ВРЕМЕННЫЙ[0]) соответсвует {
ЗНАЧЕНИЕ (1):"не дошёл до КО
ВРЕМЕННЫЙ[1] = 800H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[1];
ВЫХОД;
ЗНАЧЕНИЕ (2):"не дошёл до КЗ
ВРЕМЕННЫЙ[1] = 1000H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[1];
}
}
"Если кран не сошёл с концевика определяем с какого концевика
ЕСЛИ ( (КРАН_ВХ[0] & 3) != 0 ), то {
ВРЕМЕННЫЙ[0] = КРАН_ВХ[0] & 3; "Определяем текущее состояние крана
ПЕРЕЙТИ, если переменной (ВРЕМЕННЫЙ[0]) соответсвует {
ЗНАЧЕНИЕ (1):"не сошёл с КО
ВРЕМЕННЫЙ[1] = 100H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[1];
ВЫХОД;
ЗНАЧЕНИЕ (2):"не сошёл с КЗ
ВРЕМЕННЫЙ[1] = 200H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[1];
ВЫХОД;
ЗНАЧЕНИЕ (3):"двойное замыкание
ВРЕМЕННЫЙ[1] = 400H;
КРАН_ВХ[0] = КРАН_ВХ[0] | ВРЕМЕННЫЙ[1];
}
}
"Снимаем команду
ВРЕМЕННЫЙ[0] = MAS_OUT_DIO[0];
ВРЕМЕННЫЙ[0] = ВРЕМЕННЫЙ[0] & FFFCH;_OUT_DIO[0] = ВРЕМЕННЫЙ[0];
КРАН_ВХ[1] = 0;
"Отправляем через MAILBOX в СП-300Р команду о смене уставок управления
"текущую (отк(1) или зак(2)) меняем на сброс(0), это необходимо сделать
"так как если команда отработана с аварией в текущих уставках остаётся
"последняя команда[3] = 1; "номер уставки[2] = 2; "номер страницы[1] = 4; "команда[0] = 1; "начать выполнение
ИДТИ на метку (КРАН_НА_СВЕЧУ);
}
"========НАЧАЛО БЛОКА==========
"Проверяем: (1)подана и команда управления на кран,(2)запущен таймер,
"(3)в ремонте кран, если нет подаём команду и запускаем таймер
ЕСЛИ ( ((КРАН_ВХ[1] & 3) != 0) & (@TIMER_VALVE_IN == 0) & ( (КРАН_ВХ[1] & 100H) == 0 ) ), то {
ВРЕМЕННЫЙ[0] = КРАН_ВХ[1];
ВРЕМЕННЫЙ[1] = MAS_OUT_DIO[0];
ВРЕМЕННЫЙ[1] = ВРЕМЕННЫЙ[1] & FFFCH;
ВРЕМЕННЫЙ[1] = ВРЕМЕННЫЙ[0] | ВРЕМЕННЫЙ[1];_OUT_DIO[0] = ВРЕМЕННЫЙ[1];
"Запускаем таймер удержания (отк/зак) крана под командой
СТАРТ (TIMER_VALVE_IN);
}