Разрабатываем, проектируем, программируем и вводим в эксплуатацию системы управления для насосных станций, термического и криогенного оборудования, систем гарантированного питания.
Полный цикл проектирования систем автоматизации: от разработки структурных и функциональных схем до программирования ПЛК и сдачи объекта. Управление насосными агрегатами, автоматическое регулирование давления и расхода, защиты и блокировки.
Системы управления нагревательными, плавильными и термообрабатывающими установками. Программируемые профили температуры, прецизионное регулирование, ведение архивов технологических параметров.
Специализированные АСУ для криогенных систем: управление испарителями, насосами криопродуктов, системами хранения. Контроль уровня, давления, температуры сжиженных газов. Встроенные системы безопасности и аварийной сигнализации.
Проектирование щитов ГРЩ, АВР, ИБП для промышленных объектов. Автоматизация переключения источников питания, мониторинг состояния аккумуляторных батарей, диагностика и телеметрия.
(* Управление насосным агрегатом НС-2 | Codesys 3.5 *) FUNCTION_BLOCK FB_PumpControl VAR_INPUT bStart : BOOL; (* Команда пуска *) bStop : BOOL; (* Команда останова *) bEmergencyStop : BOOL; (* Аварийный останов *) rPressureOut : REAL; (* Давление, бар *) bMotorFault : BOOL; (* Авария двигателя *) END_VAR VAR_OUTPUT bContactorOn : BOOL; bRunning : BOOL; bFault : BOOL; eState : E_PumpState; END_VAR VAR tonStartDelay : TON; rPressureMin : REAL := 1.5; rPressureMax : REAL := 6.0; END_VAR CASE eState OF E_PumpState.STOPPED: bContactorOn := FALSE; IF bStart AND NOT bMotorFault AND (rPressureOut > rPressureMin) THEN tonStartDelay(IN:=TRUE, PT:=T#3S); IF tonStartDelay.Q THEN eState := E_PumpState.RUNNING; END_IF END_IF E_PumpState.RUNNING: bContactorOn := TRUE; bRunning := TRUE; IF bStop OR bEmergencyStop THEN eState := E_PumpState.STOPPING; ELSIF bMotorFault OR (rPressureOut > rPressureMax) THEN eState := E_PumpState.FAULT; END_IF E_PumpState.FAULT: bContactorOn := FALSE; bFault := TRUE; bRunning := FALSE; END_CASE
(* ПИД-управление зоной нагрева · Печь ПО-1600 · Owen PR200 *) FUNCTION_BLOCK FB_ThermalZone VAR_INPUT rSetpoint : REAL; (* Уставка °C *) rThermocouple : REAL; (* ТС К-тип, °C *) bEnable : BOOL; eProfilePhase : E_ProfilePhase; END_VAR VAR_OUTPUT rOutputPower : REAL; (* Тиристор 0–100% *) bOverTemp : BOOL; bTCFault : BOOL; (* Обрыв термопары *) END_VAR VAR fbPID : FB_PID; rKp : REAL := 2.4; rTi : REAL := 120.0; rTd : REAL := 15.0; rRampSetpoint : REAL; rRampRate : REAL := 5.0; (* °C/мин *) END_VAR (* Обрыв ТС: T > 1300 или T < -200 *) bTCFault := (rThermocouple > 1300.0) OR (rThermocouple < -200.0); IF bTCFault THEN rOutputPower := 0.0; RETURN; END_IF CASE eProfilePhase OF E_ProfilePhase.HEATING: rRampSetpoint := LIMIT(20.0, rRampSetpoint + rRampRate/60.0, rSetpoint); E_ProfilePhase.HOLD: rRampSetpoint := rSetpoint; E_ProfilePhase.COOLING: rRampSetpoint := LIMIT(50.0, rRampSetpoint - 2.0/60.0, rSetpoint); END_CASE fbPID( fSetpointValue := rRampSetpoint, fActualValue := rThermocouple, fKp := rKp, fTn := rTi, fTv := rTd, bEnable := bEnable ); rOutputPower := LIMIT(0.0, fbPID.fOut, 100.0); bOverTemp := rThermocouple > 950.0;
(* ESD-защита · Загазованность + аварийный останов КЗС-ЛН2 · Codesys 3.5 Safety · SIL-2 *) FUNCTION_BLOCK FB_ESD_GasDetection VAR_INPUT rGasSensor_1 : REAL; (* % НПВ *) rGasSensor_2 : REAL; (* Резервный датчик *) rTankPressure : REAL; (* МПа *) rTankLevel : REAL; (* % *) bManualESD : BOOL; (* Кнопка аварийного останова *) END_VAR VAR_OUTPUT bESD_Active : BOOL; bAlarm_Gas_L1 : BOOL; (* Предупреждение 10% НПВ *) bAlarm_Gas_L2 : BOOL; (* Авария 20% НПВ *) bEV_Close_All : BOOL; bPumpStop : BOOL; bVentilationOn: BOOL; eESDCause : E_ESDCause; END_VAR VAR rGasL1 : REAL := 10.0; rGasL2 : REAL := 20.0; rPressMax: REAL := 0.7; rLevelMin: REAL := 5.0; rGasMax : REAL; END_VAR (* Голосование 1oo2: выбор худшего показания *) rGasMax := MAX(rGasSensor_1, rGasSensor_2); bAlarm_Gas_L1 := rGasMax >= rGasL1; bAlarm_Gas_L2 := rGasMax >= rGasL2; bESD_Active := bAlarm_Gas_L2 OR (rTankPressure > rPressMax) OR (rTankLevel < rLevelMin) OR bManualESD; IF bESD_Active THEN bEV_Close_All := TRUE; bPumpStop := TRUE; bVentilationOn := TRUE; IF bAlarm_Gas_L2 THEN eESDCause := E_ESDCause.GAS_DETECTION; ELSIF rTankPressure > rPressMax THEN eESDCause := E_ESDCause.OVERPRESSURE; ELSIF rTankLevel < rLevelMin THEN eESDCause := E_ESDCause.LOW_LEVEL; ELSE eESDCause := E_ESDCause.MANUAL; END_IF END_IF
(* АВР · ЩАВ-400 · ЦОД · Время переключения < 50 мс *) FUNCTION_BLOCK FB_AutomaticTransfer VAR_INPUT rVoltage_L1_1 : REAL; (* Напряжение ввода 1, фаза L1 *) rVoltage_L2_1 : REAL; rVoltage_L3_1 : REAL; rFreq_1 : REAL; (* Частота ввода 1, Гц *) bQF1_On : BOOL; bQF2_On : BOOL; END_VAR VAR_OUTPUT bCmd_QF1_On : BOOL; bCmd_QF2_On : BOOL; bSrc1_OK : BOOL; bSrc2_Active : BOOL; eAVRState : E_AVRState; END_VAR VAR tonFaultDelay : TON; tonRestDelay : TON; rVoltMin : REAL := 340.0; rFreqMin : REAL := 48.5; rFreqMax : REAL := 51.5; END_VAR (* Контроль качества ввода 1 *) bSrc1_OK := (rVoltage_L1_1 > rVoltMin) AND (rVoltage_L2_1 > rVoltMin) AND (rVoltage_L3_1 > rVoltMin) AND (rFreq_1 > rFreqMin) AND (rFreq_1 < rFreqMax); CASE eAVRState OF E_AVRState.SRC1_NORMAL: bCmd_QF1_On := TRUE; bCmd_QF2_On := FALSE; IF NOT bSrc1_OK THEN tonFaultDelay(IN:=TRUE, PT:=T#50MS); IF tonFaultDelay.Q THEN bCmd_QF1_On := FALSE; eAVRState := E_AVRState.SWITCHING; END_IF END_IF E_AVRState.SWITCHING: bCmd_QF2_On := TRUE; bSrc2_Active := TRUE; IF bQF2_On THEN eAVRState := E_AVRState.SRC2_ACTIVE; END_IF E_AVRState.SRC2_ACTIVE: IF bSrc1_OK THEN tonRestDelay(IN:=TRUE, PT:=T#10S); IF tonRestDelay.Q THEN eAVRState := E_AVRState.SRC1_NORMAL; bCmd_QF2_On := FALSE; END_IF END_IF END_CASE
Готовы рассмотреть задачи любой сложности. Свяжитесь с нами — оценим проект и предложим техническое решение.