Конвертирование IL в ST

Автоматизация технологических процессов, системы управления, АСУ ТП, АСКУЭ, программирование ПЛК, человеко-машинный интерфейс, сетевое оборудование, протоколы

Конвертирование IL в ST

Сообщение kobrik » 15 янв 2018, 15:40

Здравствуйте,

у меня такой вопрос. Есть ли возможность конвертирования языка программирования IL в ST в среде программирования Кодесис?
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 15 янв 2018, 16:44

Точно нет, язык ST более высокоуровневый. Только если в обратную сторону.
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 15 янв 2018, 16:54

И еще один вопрос. Как вы бы посоветовали программный код, написанный на Кодесисе (IL,ST) перенять в S7 Simatic Manager?
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 15 янв 2018, 17:10

Смотря что там, зависит от состава используемых инструкций и функций. Пиши прямо сюда, попытаемся расшифровать.
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 15 янв 2018, 17:15

там не так уж и сложно. думал, что имеется какой то механизм.
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение kobrik » 16 янв 2018, 10:36

LD FALSE
ST MoveHoodUp
ST MoveHoodDown
ST MoveHoodFast

CAL TInProfileTop1Delay(IN:=InProfileTop1, PT:=T#800ms)
CAL TInProfileTop2Delay(IN:=InProfileTop2, PT:=T#4s)

(*********************** Start the Manual Movement for the Hood *************************************)

LD InHoodisUp
ANDN PBHoodDown
ST LpHoodisUp

LD HoodInCoolPos
ANDN PBHoodUp
ST LpHoodisDown

LD PBHoodUp
ANDN PBHoodDown
AND LPManual
AND ReleaseHoodUp
ST ManualHoodUp

LD PBHoodDown
ANDN PBHoodUp
AND LPManual
AND ReleaseHoodDown
AND (InpExtH1RelDown
OR (LPEmergencyMode
AND InpH1PosS4Down
)
)
ST ManualHoodDown

(*********************** Start the Automatic Movement for the Hood *************************************)


LD LPAutoOn
AND ReleaseHoodUp
AND InExtHoodUp
(* AND FALSE WEGEN FEHLENDER SICHERHEITSABSPERRUNG *)
ST AutoHoodUp

LD LPAutoOn
AND InpExtH1RelDown
AND InExtHoodDown
AND InProfileTop1
AND InProfileTop2
AND TInProfileTop1Delay.Q
AND TInProfileTop2Delay.Q
AND InpH1PosS4Down
AND ( Medium
GT 0
)
(* AND FALSE WEGEN FEHLENDER SICHERHEITSABSPERRUNG *)
(*AND InpExtQuenching*)


AND (InpH1PosS3
OR (InpExtQuenching
ANDN InpH1PosS3
)
)
ANDN RelH1DieChange (* Damit sich die Haube beim Ausziehen des Profils nach dem Abscheren nicht senkt *)
ST AutoHoodDown

(* When in Automatic and the upper Profile Detector becomes activ, the hood had to dodge the Profile *)

LDN InProfileTop1
ANDN TInProfileTop1Delay.Q
AND InpExtH1RelDown (* Versuch*)
AND LPAutoOn (* Dodge only in Automatik/Extern Mode *)
AND HoodInCoolPos
(*AND FALSE WEGEN FEHLENDER SICHERHEITSABSPERRUNG *)
ST AutoHoodDodgeUp

(*** Automatic move dodge up position and speed ***)

LD AutoHoodDodgeUp
JMPCN autocheckup

LD TRUE
ST MoveHoodUp
LD FALSE
ST MoveHoodFast
JMP movethehood

autocheckup:
(*** Automatic move up position and speed ***)

LD AutoHoodUp
JMPCN autocheckdown

LD TRUE
ST MoveHoodUp
LD TRUE
ST MoveHoodFast

JMP movethehood

autocheckdown:
(*** Automatic move up position and speed ***)

LD AutoHoodDown
JMPCN checkmanualup

LD TRUE
ST MoveHoodDown
LDN HoodInCoolPos
ST MoveHoodFast

JMP movethehood

checkmanualup:
(*** Manual move up position and speed ***)
LD ManualHoodUp
JMPCN manualcheckdown

LD TRUE
ST MoveHoodUp

LDN HoodInCoolPos
ANDN LPEmergencyMode
ST MoveHoodFast
JMP movethehood

manualcheckdown:
(*** Manual move down position and speed ***)

LD ManualHoodDown
JMPCN movethehood

LD TRUE
ST MoveHoodDown

LDN HoodInCoolPos
ANDN LPEmergencyMode
ST MoveHoodFast
JMP movethehood

movethehood:


(************************ Move the Security Loks out *******************************)

LD FALSE
OR ( InExtHoodUp
AND PreReleaseHoodUp
OR ( InExtHoodDown
AND PreReleaseHoodDown
)
AND LPAutoOn
)
OR ( PBHoodUp
AND PreReleaseHoodUp
OR ( PBHoodDown
AND PreReleaseHoodDown
)
AND LPManual
)
AND LPPower
ST RelHoodLoks

(******************** Avoid quick hood direction change ********************)

CAL TReverseDelay1(IN:=MoveHoodUp, PT:=T#1200ms)
CAL TReverseDelay2(IN:=MoveHoodDown, PT:=T#1200ms)


LD MoveHoodDown
AND TReverseDelay1.Q
R MoveHoodDown

LD MoveHoodUp
AND TReverseDelay2.Q
R MoveHoodUp


(*********************** Start the Manual Movement for the Hood Side Protector *************************************)

LD PBProtectorUp
ANDN PBProtectorDown
AND (LPManual
OR ( PQD.FlagLWA
EQ 1
)
)
AND ReleaseProtectorTop
ST ManualProtectorTop

LD PBProtectorDown
ANDN PBProtectorUp
AND (LPManual
OR ( PQD.FlagLWA
EQ 1
)
)
AND ReleaseProtectorBottom
ST ManualProtectorBottom

(*********************** Start the Automatic Movement for the Hood Protector *************************************)

LD AutoHoodUp
AND LPAutoOn
AND ReleaseProtectorTop
(*AND FALSE WEGEN FEHLENDER SICHERHEITSABSPERRUNG *)
ST AutoHoodProtectorTop

LD ReleaseQuenching
AND LPAutoOn
AND HoodInCoolPos
AND ReleaseProtectorBottom
AND ( Medium (* Close only with water the front Protector *)
EQ 2
)
(*AND FALSE WEGEN FEHLENDER SICHERHEITSABSPERRUNG *)
ST AutoHoodProtectorBottom (* Close always the front Protector *)

LD ReleaseQuenching
AND LPAutoOn
AND HoodInCoolPos
AND ReleaseProtectorTop
AND ( Medium (* Open only with air the front Protector *)
EQ 1
)
(*AND FALSE WEGEN FEHLENDER SICHERHEITSABSPERRUNG *)
ST AutoHoodProtectorTop (* Close always the front Protector *)

(*** Set the Outputs of the Side Protector 1-4 ***)

LD ManualProtectorTop
OR (AutoHoodProtectorTop
AND ( PQD.FlagLWA
EQ 0
)
)
AND ReleaseProtectorTop
ANDN MoveProtectorDown
ST MoveProtectorUp

LD ManualProtectorBottom
OR AutoHoodProtectorBottom
ANDN MoveProtectorUp
ANDN InHoodisUp
ST MoveProtectorDown


(* LD ManualProtectorTop
OR AutoHoodProtectorTop
ANDN MoveProtectorDown
ANDN InHoodisUp
ST MoveProtectorUp

LD ManualProtectorBottom
OR AutoHoodProtectorBottom
ANDN MoveProtectorUp
ANDN InHoodisUp
ST MoveProtectorDown

LD InHoodisUp
AND ReleaseProtectorTop
S MoveProtectorUp
*)

LD TRUE
R OutMoveProtectorUp
R OutMoveProtectorDown

LD MoveProtectorDown
R OutMoveProtectorUp
S OutMoveProtectorDown

LD MoveProtectorUp
S OutMoveProtectorUp
R OutMoveProtectorDown

(**** If the Cylinder whasn't in use for a longer time, we had to fill the lift side before we move it downwards. *)

LD MoveProtectorDown
ST TFillProt.IN
CAL TFillProt(PT:=T#700ms)
LD TFillProt.Q
S OutMoveProtectorUp
R OutMoveProtectorDown


(*** Release the Airbreak of the Cylinder ***)

LD MoveProtectorUp
OR MoveProtectorDown
ANDN TFillProt.Q
ST RelProtectorBreak
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение kobrik » 16 янв 2018, 10:40

вот это программa, которую надо написать в S7 Simatic Manager и желательно на немецком. так вроде понятно, но с с функциями JUMP все наверное будет выглядеть иначе.

вот переменные :

FUNCTION_BLOCK Hood


VAR
ManualHoodUp: BOOL; (* Manual Hood Moving Up *)
ManualHoodDown: BOOL; (* Manual Hood Moving Down *)
AutoHoodUp: BOOL; (* Automatic Hood Moving Up *)
AutoHoodDodgeUp: BOOL; (* Automatic Hood Moving Up *)
AutoHoodDown: BOOL; (* Automatic Hood Moving Down *)
ManualProtectorTop: BOOL; (* Manual Hood Protector Rear Moving to the Top *)
ManualProtectorBottom: BOOL; (* Manual Hood Protector Rear Moving to the Bottom *)
AutoHoodProtectorTop: BOOL; (* Autom. Hood Protector Rear Moving to the Top *)
AutoHoodProtectorBottom: BOOL; (* Autom. Hood Protector Rear Moving to the Bottom *)
MoveProtectorUp: BOOL; (* Move the Spray Protector up *)
MoveProtectorDown: BOOL; (* Move the Spray Protector down *)
TFillProt: TP; (* Fill front protector cylinder *)
TInProfileTop1Delay:TOF; (* Light Gate Delay *)
TInProfileTop2Delay:TON; (* Light Gate Delay *)
TReverseDelay1: TP; (* Delay the Hood Direction change *)
TReverseDelay2: TP; (* Delay the Hood Direction change *)
END_VAR
VAR_INPUT
Medium: DINT; (* 2 = Water 1 = Air *)
ReleaseQuenching: BOOL; (* Release Cooling / Quenching *)
PreReleaseHoodUp: BOOL; (* Release for Moving up *)
PreReleaseHoodDown: BOOL; (* Release for Moving down *)
ReleaseHoodUp: BOOL; (* Release for Moving up *)
ReleaseHoodDown: BOOL; (* Release for Moving down *)
InHoodisUp: BOOL; (* Hood is in the upper position *)
InHoodisDown: BOOL; (* Hood is in the lowest position *)
HoodInCoolPos: BOOL; (* Hood is in Coolingposition now *)
PBHoodUp: BOOL; (* Push Button move the Hood Up *)
PBHoodDown: BOOL; (* Push Button move the Hood Down *)
InExtHoodUp: BOOL; (* External Command Hood Moving Up *)
InExtHoodDown: BOOL; (* External Command Hood Moving Down *)
InProfileTop1: BOOL; (* Light Gate Profile Detection the upper one *)
InProfileTop2: BOOL; (* Light Gate Profile Detection the lower one *)
ReleaseProtectorTop: BOOL; (* Release Spray Protector Up *)
ReleaseProtectorBottom: BOOL; (* Release Spray Protector Down *)
PBProtectorUp: BOOL; (* Push Button move the Spray Protector Up *)
PBProtectorDown: BOOL; (* Push Button move the Spray Protector Down *)
END_VAR
VAR_OUTPUT
LpHoodisUp: BOOL; (* Lamp Hood is up *)
LpHoodisDown: BOOL; (* Lamp Hood is down *)
MoveHoodUp: BOOL; (* Move the Hood up *)
MoveHoodDown: BOOL; (* Move the Hood down *)
MoveHoodFast: BOOL; (* Move the Hood fast *)
RelHoodLoks: BOOL; (* Release the Loks *)
OutMoveProtectorUp: BOOL; (* Move the Spray Protector up *)
OutMoveProtectorDown: BOOL; (* Move the Spray Protector down *)
RelProtectorBreak: BOOL; (* Release the Rod Break of the Spray Cylinder *)
END_VAR
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 16 янв 2018, 16:18

Ну в общем-то тут в основном одни LD, AND, OR, вызовы таймеров CAL. Очень похоже на то, что данный IL можно транслировать в LD/FBD, а оттуда проще перенести в Step 7. Но в принципе можно и сразу напрямую в Step.
Мне только не ясен смысл инструкции EQ, а на счёт инструкции ST кажется, что это обычная операция присваивания (у Сименса она соответствует команде "=").
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 16 янв 2018, 17:10

надо написать на IL
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 16 янв 2018, 17:59

Добрую часть этого кода можно конвертнуть так:
LD -> A
LDN -> AN
AND -> A
ANDN -> AN
OR -> O
ORN -> ON
ST -> =
S -> S
R -> R

Скобки ( ) также можно применять в Степ.

Остались непереведëнными: переходы JMP, JMPCN, вызовы таймеров CAL, операция сравнения EQ и некая GT.
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 17 янв 2018, 11:31

как выглядят операторы JMP, JMPCN в степ ?
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 17 янв 2018, 12:07

Скорее всего так:
JUMP -> JU
JMPCN -> JCN
EQ -> ==D
GT -> >D
CAL -> SD или SF или SP (в зависимости от типа таймера TON или TOF или TP)
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение Михайло » 17 янв 2018, 12:10

Примечание: обнаружил код в скобках комментария (* *), внутри этих скобок код не работает.
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 17 янв 2018, 12:28

определил таймеры и счетчики в статических переменных, теперь не знаю как их в программе вызвать )
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 17 янв 2018, 16:10

Вместо
Код: Выделить всё
LD   MoveProtectorDown
ST   TFillProt.IN
CAL   TFillProt(PT:=T#700ms)
LD   TFillProt.Q


вот так (если таймер TON):
Код: Выделить всё
A   MoveProtectorDown
LD   S5T#700ms
SD   TFillProt
A   TFillProt.Q
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 17 янв 2018, 16:21

я так сделал, надеюсь правильно

CALL #FillTimer
IN:="OutWaterFillTank"
PT:=T#1H
Q :=#FillTimer.Q
ET:=#FillTimer.ET
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

Re: Конвертирование IL в ST

Сообщение Михайло » 17 янв 2018, 16:23

Ты на языке SCL/ST пишешь? Ой, точно, тема ведь так и называется!
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение Михайло » 17 янв 2018, 16:37

Тогда с самого начала на языке ST(SCL):
Код: Выделить всё
MoveHoodUp:=FALSE;
MoveHoodDown:=FALSE;
MoveHoodFast:=FALSE;


Пропускаю таймеры. Далее пачка:
Код: Выделить всё
LpHoodisUp:=InHoodisUp AND NOT PBHoodDown;

LpHoodisDown:=HoodInCoolPos AND NOT PBHoodUp;

ManualHoodUp:=PBHoodUp AND NOT   PBHoodDown AND LPManual AND ReleaseHoodUp;
ManualHoodDown:=PBHoodDown AND NOT PBHoodUp AND LPManual AND ReleaseHoodDown AND (InpExtH1RelDown OR (LPEmergencyMode AND InpH1PosS4Down));
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение Михайло » 17 янв 2018, 16:41

Остальное по аналогии.

JMP -> GOTO
JMPCN -> IF NOT () THEN GOTO
Михайло
Администратор
 
Сообщения: 3568
Зарегистрирован: 19 сен 2012, 19:16

Re: Конвертирование IL в ST

Сообщение kobrik » 17 янв 2018, 18:14

короче, вот что получилось, можете грубо пробежаться глазами.

********************** Switch the Fill Valve On/Off ************
U "WaterReservoirCONST".WITH_ANALOG_TANK_CONTROL
SPBN NSIG

L "WaterReservoirCONST".MAX_LEVEL_VALUE
L "WaterReservoirCONST".MIN_LEVEL_VALUE
-R
T #Dif_Level_Value // save the difference

L "InpWaterLevel"
ITD
DTR
L 2.764800e+004
/R
L "WaterReservoirCONST".MIN_LEVEL_VALUE // 2000 - 6000 Liter bar for 4-20mA 2000 + Inp / 27648 * 4000
+R
L 1.000000e-002 // Filter the quick changes
*R

T #NewWaterLevel

L #OldWaterLevel
L 9.900000e-001
*R
L #NewWaterLevel
+R
T #OldWaterLevel

L #OldWaterLevel // Save to old value
L 1.000000e+001
/R
RND
DTR
L 1.000000e+001 // The precition of analog input is not good enough to show
*R // in liters
T #ActWaterLevel // Here is the new value you can use

L #ActWaterLevel // Minimum reached -> then precondition
L "WaterReservoirCONST".MinWaterLevel
<R
= "Diagnose".DIAG_WATER_LEVEL

L #ActWaterLevel
L "WaterReservoirCONST".MaxWaterLevel
>=R
S "Diagnose".DIAG_MaxWaterLevel

// Switch On level reached
L #ActWaterLevel
L "WaterReservoirCONST".OnWaterLevel
<=R
S #TankFillFlag

// Switch Off level reached
L #ActWaterLevel
L "WaterReservoirCONST".OffWaterLevel
>=R
O "Diagnose".DIAG_FILLVALVE_ERROR
R #TankFillFlag
SPA FILL


//*** Work only with Limit switches for the tank ***
NSIG: L 0.000000e+000
T #ActWaterLevel // Here is the new value you can use

U "InpTankLevelOK"
SPBN FULL
L 3.500000e+003
T #ActWaterLevel // Here is the new value you can use

FULL: U "InpTankLevelOK"
NOT
UN "InpTankLevelMax"
S #TankFillFlag

UN "InpTankLevelOK"
O "InpTankLevelMax"
O "Diagnose".DIAG_FILLVALVE_ERROR
R #TankFillFlag

UN "InpTankLevelMin"
U(
L "Globale_Variablen".PQD.Boxes[1].Medium
L 2
==D
)
S "Diagnose".DIAG_WATER_LEVEL

UN "InpTankLevelMin"
U(
L "Globale_Variablen".PQD.Boxes[1].Medium
L 2
<>D
)
= "Diagnose".DIAG_WATER_LEVEL

FILL: U "LPPower"
U(
L "Globale_Variablen".PQD.Boxes[1].Medium
L 2
==D
)
= #Wasserbetrieb

U "LPPower"
U(
L "Globale_Variablen".PQD.FlagLWA
L 1
==D
)
= #LWAbetrieb

U "LPPower"
U #TankFillFlag
= "OutWaterFillTank"


//3600 If the Filling Valve is opened longer then 10 Min. something is wrong
CALL #FillTimer
IN:="OutWaterFillTank"
PT:=T#1H
Q :=#FillTimer.Q
ET:=#FillTimer.ET
// Original Alarm, zu testzwecken allerdings PRECOND

*************** Umwälzung regelmäßig laufen lassen ***********
U "Taktmerker 0.8s"
FP #Flash800ms
= #CounterUmwaelzung.CU

CALL #CounterUmwaelzung
CU:=#CounterUmwaelzung.CU
R :=#MerkerUmwaelzung
PV:=1125
Q :=#CounterUmwaelzung.Q
CV:=#CounterUmwaelzung.CV

U #CounterUmwaelzung.Q
S #MerkerUmwaelzung

U #MerkerUmwaelzung
U #MerkerUmwaelzung2
R #MerkerUmwaelzung

UN #MerkerUmwaelzung
= #NichtMerkerUmwaelzung

CALL #CounterUmwaelzung2
CU:=#CounterUmwaelzung.CU
R :=#NichtMerkerUmwaelzung
PV:=200
Q :=#CounterUmwaelzung2.Q
CV:=#CounterUmwaelzung2.CV

****Cooling Filter Pump is running 20Min longer then quench*****
U "LPPower"
U(
O "Globale_Variablen".RelH1WaterQZ[1]
O "Globale_Variablen".RelH1WaterQZ[2]
O "Globale_Variablen".RelH1WaterQZ[3]
O "Globale_Variablen".RelH2WaterQZ[1]
O "Globale_Variablen".RelH2WaterQZ[2]
O "Globale_Variablen".RelH2WaterQZ[3]
)
U(
L #ActWaterTemp
L "WaterReservoirCONST".MaxWaterTemp
>=R
)
= #FilterPumpOnFlag


// Let the Water Cooling run 20 Min. longer
CALL #FilterTimer
IN:=#FilterPumpOnFlag
PT:=T#5M
Q :=#FilterTimer.Q
ET:=#FilterTimer.ET

U "LPPower"
UN "LPPumpService"
U "InpFilterPumpSO" // Shutt-Off Cock must be open
U "InpFilterPumpFA" // No Filter Alarm
UN "Diagnose".DIAG_WATER_LEVEL
U(
O #FilterTimer.Q
O #MerkerUmwaelzung
)
= "OutFilterPump"

***************** Switch the cool / filter pump on *************
// AWW empirisch 20°c = 2840 / 100°C = 13960
// Hueck (-20) - 150 °C for 4-20mA Inp * 170.0 / 2048 - 20

L "InpWaterTemp"
ITD
DTR
L 1.396000e+002
/R
L 1.000000e+000
*R
L 0.000000e+000
-R
T #ActWaterTemp


// (-20) - 150 °C for 4-20mA Inp * 170.0 / 2048 + 20
L "InpWaterCoolerExitTemp"
ITD
DTR
L 1.396000e+002
/R
L 1.000000e+000
*R
L 0.000000e+000
-R
T #ActWaterCoolerExitTemp



// Is the Temperature too high
U(
L #ActWaterTemp
L "WaterReservoirCONST".MaxWaterTemp
>=R
)
U "LPPower" // And the Power On
U "InpFilterPumpFA" // And the Pump Filter Alarm off
U "OutFilterPump" // And the Filter Circuite is activ
UN "Diagnose".DIAG_WATER_LEVEL
S "OutWaterCooler"


U(
L #ActWaterTemp
L "WaterReservoirCONST".MinWaterTemp
<=R
)
ON "LPPower"
O "LPPumpService"
ON "OutFilterPump"
O "Diagnose".DIAG_COOLVALVE_ERROR
O "Diagnose".DIAG_WATER_LEVEL
R "OutWaterCooler"

U(
L #ActWaterTemp
L "WaterReservoirCONST".AlarmWaterTemp
>=R
)
U(
L "Globale_Variablen".PQD.Boxes[1].Medium
L 2
==D
)
S "Diagnose".DIAG_WATER_TEMP

U(
L #ActWaterTemp
L "WaterReservoirCONST".AlarmWaterTemp
>=R
)
U(
L "Globale_Variablen".PQD.Boxes[1].Medium
L 2
<>D
)
= "Diagnose".DIAG_WATER_TEMP

CALL #CoolTimer
IN:="OutWaterCooler"
PT:=T#2H
Q :=#CoolTimer.Q
ET:=#CoolTimer.ET


// If the Cooling Valve is opened longer then 2 Hour something is wrong
U #CoolTimer.Q
UN "InpCoolingPumpOn"
U "Diagnose".WITH_COOLING_PUMP
S "Diagnose".DIAG_COOLVALVE_ERROR


******* Control the cool water volume *********
U "WaterReservoirCONST".WITH_PLATEN_COOLER
SPBN NOPL
U "OutWaterCooler"
= #WaterCoolTempEN
L #ActWaterCoolerExitTemp
T #WaterCoolTempAct
L "WaterReservoirCONST".SetpointCoolTemp
T #WaterCoolTempSet

CALL "WaterCoolerTemp" , DB19
EnableControl:=#WaterCoolTempEN
SetTemp :=#WaterCoolTempSet
ActTemp :=#WaterCoolTempAct
MoreWater :=#WaterCoolTempMoreWater
LessWater :=#WaterCoolTempLessWater

U #WaterCoolTempMoreWater
= "OutWaterCoolerOpen"
U #WaterCoolTempLessWater
ON "OutWaterCooler"
= "OutWaterCoolerClose"
kobrik
Профессионал
 
Сообщения: 648
Зарегистрирован: 04 ноя 2012, 19:23

След.

Вернуться в АВТОМАТИЗАЦИЯ

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1