Страница 2 из 3

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

Добавлено: 17 янв 2018, 18:17
kobrik
SCL мне нужен был чтобne переписывать все. а раз уж переписываю то все написал на AWL.

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

Добавлено: 17 янв 2018, 19:05
Михайло
kobrik писал(а):короче, вот что получилось, можете грубо пробежаться глазами.
Что с чём сравнивать? Поверхностно всё вроде вполне прилично.

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

Добавлено: 18 янв 2018, 09:52
kobrik
то что я в самом начале выкладывал написано было на кодесисе, а вчерашний код я написал на степ 7. я в начале не тот блок выложил )))

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

Добавлено: 18 янв 2018, 10:00
kobrik
вот код на кодесисе который я переписал в степ 7.

FUNCTION_BLOCK WaterReservoir

VAR CONSTANT
WITH_PLATEN_COOLER: BOOL := TRUE; (* Heat exchange with Platen cooler and fresh water *)
WITH_COOL_TOWER: BOOL := FALSE; (* Heat exchange with Cooling Tower *)
WITH_ANALOG_TANK_CONTROL: BOOL := TRUE; (* Analog Tank Volume control *)
MinWaterLevel: REAL := 4000; (* Minimum Water Level *)
OnWaterLevel: REAL :=7200; (* Water level to open valve *)
OffWaterLevel: REAL := 7400; (* Water level to close valve *)
MIN_LEVEL_VALUE: REAL := 2400; (* Minimum sensor level *)
MAX_LEVEL_VALUE: REAL := 8400; (* Maximum sensor level *)
MinWaterTemp: REAL := 28; (* Minimum Water Temperature *)
MaxWaterTemp: REAL := 30; (* Maximum Water Temperature *)
Max2WaterTemp: REAL := 32; (* Maximum Water Temperature *)
AlarmWaterTemp: REAL := 45; (* Maximum Water Temperature *)
SetpointCoolTemp: REAL := 25; (* Exit Temperature of the Platen Cooler *)
MaxWaterLevel: REAL:= 8200;(*Maximale Wasserhöhe bei LWA*)
END_VAR
VAR
ActWaterLevel: REAL; (* Liter Actual Tank Level *)
NewWaterLevel: REAL; (* Liter Help Variable to filter *)
OldWaterLevel: REAL; (* Liter Help Variable to filter *)
Dif_Level_Value: REAL; (* Help Value for the analog in scaling *)
TankFillFlag: BOOL; (* Tank Fill Flag *)
ActWaterCoolerExitTemp: REAL; (* °C *)
ActWaterTemp: REAL; (* °C *)
Coot_Tower_OnHS: BOOL; (* Cool Tower On with high speed *)
Coot_Tower_OnLS: BOOL; (* Cool Tower On with low speed *)
FilterTimer: TOF;
FilterPumpOnFlag: BOOL;
CoolTimer: TON;
FillTimer: TON;
wct: WaterCoolerTemp; (* Control of the fresh water valve from the platen cooler *)
Wasserbetrieb: BOOL;
LWAbetrieb: BOOL;
FlashTimerUmwaelzung: TON;
Flash60min: BOOL;
CounterUmwaelzung: CTU;
MerkerUmwaelzung: BOOL;
CounterUmwaelzung2: CTU;
MerkerUmwaelzung2: BOOL;
NichtMerkerUmwaelzung: BOOL;
END_VAR




(********************** Switch the Fill Valve On/Off *********************)

LD WITH_ANALOG_TANK_CONTROL
JMPCN noanalogsignal

LD MAX_LEVEL_VALUE
SUB MIN_LEVEL_VALUE
ST Dif_Level_Value (* save the difference *)

LD InpWaterLevel
INT_TO_REAL
DIV 27648
MUL Dif_Level_Value
ADD MIN_LEVEL_VALUE (* 2000 - 6000 Liter bar for 4-20mA 2000 + Inp / 27648 * 4000 *)
MUL 0.01 (* Filter the quick changes *)
ST NewWaterLevel
LD OldWaterLevel
MUL 0.99
ADD NewWaterLevel
ST OldWaterLevel (* Save to old value *)
DIV 10 (* The precition of analog input is not good enough to show *)
TRUNC (* in liters *)
MUL 10
ST ActWaterLevel (* Here is the new value you can use *)


LD ActWaterLevel (* Minimum reached -> then precondition*)
LT MinWaterLevel
ST Diagnosis.Precond[DIAG_WATER_LEVEL]

LD ActWaterLevel
GE MaxWaterLevel
S Diagnosis.Alarm[DIAG_MaxWaterLevel]

LD ActWaterLevel (* Switch On level reached *)
LE OnWaterLevel
S TankFillFlag

LD ActWaterLevel (* Switch Off level reached *)
GE OffWaterLevel
OR Diagnosis.Precond[DIAG_FILLVALVE_ERROR]
R TankFillFlag
JMP setfillsignal

(**** Work only with Limit switches for the tank ****)
noanalogsignal:

LD 0
ST ActWaterLevel (* Here is the new value you can use *)

LD InpTankLevelOK
JMPCN tankisfull
LD 35000
ST ActWaterLevel (* Here is the new value you can use *)
tankisfull:


LD InpTankLevelOK
NOT
ANDN InpTankLevelMax
S TankFillFlag

LD InpTankLevelOK
OR InpTankLevelMax
OR Diagnosis.Alarm[DIAG_FILLVALVE_ERROR]
R TankFillFlag

LDN InpTankLevelMin
AND (PQD.Boxes[1].Medium
EQ 2
)
S Diagnosis.Alarm[DIAG_WATER_LEVEL]

LDN InpTankLevelMin
AND (PQD.Boxes[1].Medium
NE 2
)
ST Diagnosis.Precond[DIAG_WATER_LEVEL]

setfillsignal:
LD LPPower
AND (PQD.Boxes[1].Medium
EQ 2
)
ST Wasserbetrieb

LD LPPower
AND (PQD.FlagLWA
EQ 1
)
ST LWAbetrieb


LD LPPower
AND TankFillFlag
(*
AND (Wasserbetrieb
OR LWAbetrieb Tank immer nachfüllen!! *)
ST OutWaterFillTank

CAL FillTimer(IN := OutWaterFillTank, PT := T#60m) (*3600 If the Filling Valve is opened longer then 10 Min. something is wrong *)
LD FillTimer.Q
S Diagnosis.Precond[DIAG_FILLVALVE_ERROR]
(* Original Alarm, zu testzwecken allerdings PRECOND *)

(*************** Umwälzung regelmäßig laufen lassen ****************)

CAL CounterUmwaelzung(CU:= Flash800ms, RESET:= MerkerUmwaelzung, PV:= 1125)
LD CounterUmwaelzung.Q
S MerkerUmwaelzung

LD MerkerUmwaelzung
AND MerkerUmwaelzung2
R MerkerUmwaelzung

LDN MerkerUmwaelzung
ST NichtMerkerUmwaelzung


CAL CounterUmwaelzung2(CU:= Flash800ms, RESET:= NichtMerkerUmwaelzung, PV:= 200)
LD CounterUmwaelzung2.Q
ST MerkerUmwaelzung2


(**************** Cooling Filter Pump is running 20Min longer then quench *****************)

LD LPPower
AND ( RelH1WaterQZ[1]
OR RelH1WaterQZ[2]
OR RelH1WaterQZ[3]
OR RelH2WaterQZ[1]
OR RelH2WaterQZ[2]
OR RelH2WaterQZ[3]
OR TRUE
)
AND ( ActWaterTemp
GE MaxWaterTemp
)
ST FilterPumpOnFlag

CAL FilterTimer(IN := FilterPumpOnFlag, PT := T#300s) (* Let the Water Cooling run 20 Min. longer *)

LD LPPower
ANDN LPPumpService
AND InpFilterPumpSO (* Shutt-Off Cock must be open *)
AND InpFilterPumpFA (* No Filter Alarm *)
ANDN Diagnosis.Alarm[DIAG_WATER_LEVEL]
AND ( FilterTimer.Q
OR MerkerUmwaelzung
)
ST 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 *)
LD InpWaterTemp
INT_TO_REAL
DIV 139.6
MUL 1
SUB 0
ST ActWaterTemp

LD InpWaterCoolerExitTemp
INT_TO_REAL
DIV 139.6
MUL 1
SUB 0 (* (-20) - 150 °C for 4-20mA Inp * 170.0 / 2048 + 20 *)
ST ActWaterCoolerExitTemp

LD ActWaterTemp (* Is the Temperature too high *)
GE MaxWaterTemp
AND LPPower (* And the Power On *)
AND InpFilterPumpFA (* And the Pump Filter Alarm off *)
AND OutFilterPump (* And the Filter Circuite is activ *)
ANDN Diagnosis.Alarm[DIAG_WATER_LEVEL]
S OutWaterCooler

LD ActWaterTemp
LE MinWaterTemp
ORN LPPower
OR LPPumpService
ORN OutFilterPump
OR Diagnosis.Alarm[DIAG_COOLVALVE_ERROR]
OR Diagnosis.Alarm[DIAG_WATER_LEVEL]
R OutWaterCooler

LD ActWaterTemp
GE AlarmWaterTemp
AND (PQD.Boxes[1].Medium
EQ 2
)
S Diagnosis.Alarm[DIAG_WATER_TEMP]

LD ActWaterTemp
GE AlarmWaterTemp
AND (PQD.Boxes[1].Medium
NE 2
)
ST Diagnosis.Precond[DIAG_WATER_TEMP]

CAL CoolTimer(IN := OutWaterCooler, PT := T#7200s) (* If the Cooling Valve is opened longer then 2 Hour something is wrong *)
LD CoolTimer.Q
ANDN InpCoolingPumpOn
AND WITH_COOLING_PUMP
S Diagnosis.Alarm[DIAG_COOLVALVE_ERROR]

(********************** Control the cool water volume ***********************)

LD WITH_PLATEN_COOLER
JMPCN noplatencooler

LD OutWaterCooler
ST wct.EnableControl

LD ActWaterCoolerExitTemp
ST wct.ActTemp

LD SetpointCoolTemp
ST wct.SetTemp

CAL wct

LD wct.MoreWater
ST OutWaterCoolerOpen

LD wct.LessWater
ORN OutWaterCooler
ST OutWaterCoolerClose
noplatencooler:

(********************** Control the cool tower volume ***********************)

LD WITH_COOL_TOWER
JMPCN nocooltower

LD OutWaterCooler
AND LPPower (* And the Power On *)
AND ( ActWaterTemp (* Temperature reached for low speed *)
GE MinWaterTemp
)
ST Coot_Tower_OnLS (* Low speed temperatures reached *)

LD OutWaterCooler
AND LPPower (* And the Power On *)
AND ( ActWaterTemp (* Temperature reached for high speed *)
GE Max2WaterTemp
)
ST Coot_Tower_OnHS (* High speed temperatures reached *)


LD Coot_Tower_OnHS
ANDN InpCoolTowerOnLS (* Don't switch both together *)
ST OutCoolTowerOnHS

LD Coot_Tower_OnLS
ANDN OutCoolTowerOnHS (* Don't switch both together *)
ANDN InpCoolTowerOnHS
ST OutCoolTowerOnLS

nocooltower:

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

Добавлено: 18 янв 2018, 13:12
kobrik
меня смущают две вещи:

1. в глобальных переменных кодесиса обозначена только одна переменная DIAG_WATER_LEVEL INT, а в программе : Diagnosis.Precond[DIAG_WATER_LEVEL] Diagnosis.Alarm[DIAG_WATER_LEVEL].


2. измерение уровня InpWaterLevel делится на значение 27648, но сам уровень обозначен типом INT у которого диапазон -32768 до 32767. Получается очень маленькое значение.

LD InpWaterLevel
INT_TO_REAL
DIV 27648
MUL Dif_Level_Value
ADD MIN_LEVEL_VALUE (* 2000 - 6000 Liter bar for 4-20mA 2000 + Inp / 27648 * 4000 *)
MUL 0.01 (* Filter the quick changes *)
ST NewWaterLevel
LD OldWaterLevel
MUL 0.99
ADD NewWaterLevel
ST OldWaterLevel (* Save to old value *)
DIV 10 (* The precition of analog input is not good enough to show *)
TRUNC (* in liters *)
MUL 10
ST ActWaterLevel (* Here is the new value you can use *)

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

Добавлено: 24 янв 2018, 11:43
kobrik
вот код в Кодесисе, кто сможет расшифровать ? я в общем конечно понял, но не знаю как это должно выглядеть в Step 7 IL. тип данных всех переменных WORD.

LD OutPositecW[1]
AND 16#8000
XOR 16#8000
OR CommandW1 (* Toggle the Send Flag *)
ST OutPositecW[1]
JMP end

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

Добавлено: 24 янв 2018, 17:11
Михайло
Типичные хитрости ассемблера (языка IL).

16#8000 = 2#1000 0000 0000 0000
То есть включен один старший бит.

Инструкция AND 16#8000 обнуляет все биты, кроме старшего.
Инструкция XOR 16#8000 инвертирует старший бит.
Инструкция OR CommandW1 вставляет старший бит в слово CommandW1 (там наверняка старший бит предварительно обнулён).
Инструкция ST OutPositecW[1] загружает результат обратно в OutPositecW[1].

В Step7 замена такая: AND -> ANDW, XOR -> XORW, OR -> ORW.

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

Добавлено: 24 янв 2018, 18:25
kobrik
я написал вот так, проверьте пожалуйста

// Toggle the Send Flag
O(
L "Globale_Variablen".OutPositecW[1]
L W#16#8000
==I
)
O(
L "Globale_Variablen".OutPositecW[1]
L W#16#0
==I
)
SPBN END
L #CommandW1 // Toggle the Send Flag
T "Globale_Variablen".OutPositecW[1]

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

Добавлено: 25 янв 2018, 11:12
kobrik
вот как выглядит код окончательно


// Toggle the Send Flag
L "Globale_Variablen".OutPositecW[1]
UW W#16#8000
XOW W#16#8000
T #help

L #help
L #CommandW1
OW
T "Globale_Variablen".OutPositecW[1]
SPA END

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

Добавлено: 26 янв 2018, 12:04
kobrik
есть ли у кого то пример проекта миктомастера в Step7?

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

Добавлено: 26 янв 2018, 15:52
kobrik
kobrik писал(а):есть ли у кого то пример проекта миктомастера в Step7?
меня интересует следующий вопрос:

обмен данными будет производиться по переменным PIW PQW. Меняются ли байты старший/младший местами в таком случае?

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

Добавлено: 26 янв 2018, 17:22
Михайло
Меняются местами, неудобно немного.
Пример проекта здесь.

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

Добавлено: 26 янв 2018, 17:33
kobrik
а если с отдельными битами работать?

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

Добавлено: 26 янв 2018, 17:39
Михайло
При обращении к битам указывается номер байта, поэтому тоже обратный порядок будет.

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

Добавлено: 29 янв 2018, 10:50
kobrik
вся проблема в том что в программном коде, написанном на кодесисе, они обращаются к отдельным витам первого байта и похоже их не поменяли местами.

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

Добавлено: 30 янв 2018, 14:50
kobrik
По идее если байты меняются местами то в кодесисе они работают с ресервными битами.

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

Добавлено: 14 фев 2018, 13:35
kobrik
кто нибудь знает ответ ?

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

Добавлено: 14 фев 2018, 14:32
Михайло
Не вижу вопрос. Этот?
kobrik писал(а):По идее если байты меняются местами то в кодесисе они работают с ресервными битами.
С резервными битами или с реверсными?

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

Добавлено: 14 фев 2018, 16:39
kobrik
да

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

Добавлено: 14 фев 2018, 19:28
Михайло
Какие биты-то?