Материал: Система автоматизированного управления мобильной газораспределительной станцией

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

"========НАЧАЛО БЛОКА==========

"Проверяем макс. ПС пересечение со вторым пороговым значением

ФУНКЦИЯ (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);

}