Skip to content

Commit 9e7d6e7

Browse files
authored
Merge pull request #26 from Fortiphyd/bugfixes
more Bugfixes
2 parents b3b11c6 + 1f259e0 commit 9e7d6e7

File tree

20 files changed

+573
-470
lines changed

20 files changed

+573
-470
lines changed

plc/active_program

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
690525.st
1+
326339.st

plc/openplc.db

0 Bytes
Binary file not shown.

plc/st_files/326339.st

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
FUNCTION scale_to_real : REAL
2+
VAR_INPUT
3+
raw_input_value : UINT := 0;
4+
END_VAR
5+
VAR_OUTPUT
6+
scaled_real : REAL := 0.0;
7+
END_VAR
8+
VAR_INPUT
9+
real_max : REAL := 0.0;
10+
real_min : REAL := 0.0;
11+
END_VAR
12+
VAR
13+
raw_max : UINT := 65535;
14+
raw_min : UINT := 0;
15+
rate : REAL := 1.0;
16+
offset : REAL := 1.0;
17+
END_VAR
18+
19+
rate := (real_max - real_min) / UINT_TO_REAL(raw_max - raw_min);
20+
offset := real_min - UINT_TO_REAL(raw_min)*rate;
21+
scaled_real := UINT_TO_REAL(raw_input_value)*rate + offset;
22+
scale_to_real := scaled_real;
23+
END_FUNCTION
24+
25+
FUNCTION scale_to_uint : UINT
26+
VAR_INPUT
27+
real_in : REAL := 0.0;
28+
END_VAR
29+
VAR_OUTPUT
30+
uint_out : UINT := 0;
31+
END_VAR
32+
33+
uint_out := REAL_TO_UINT((real_in / 100.0) * 65535.0);
34+
scale_to_uint := uint_out;
35+
END_FUNCTION
36+
37+
FUNCTION control : UINT
38+
VAR
39+
current_value_real : REAL := 0.0;
40+
valve_pos_limited : REAL := 0.0;
41+
setpoint_real : REAL := 0.0;
42+
pos_update_real : REAL := 0.0;
43+
valve_pos_real : REAL := 0.0;
44+
END_VAR
45+
VAR_OUTPUT
46+
valve_pos : UINT := 0;
47+
END_VAR
48+
VAR_INPUT
49+
rmax : REAL := 0.0;
50+
rmin : REAL := 0.0;
51+
k : REAL := 0.0;
52+
current_value : UINT := 0;
53+
setpoint : UINT := 0;
54+
current_pos : UINT := 0;
55+
END_VAR
56+
57+
current_value_real := scale_to_real(raw_input_value := current_value, real_max := rmax, real_min := rmin);
58+
59+
setpoint_real := scale_to_real(raw_input_value := setpoint, real_max := rmax, real_min := rmin);
60+
61+
pos_update_real := (setpoint_real - current_value_real) * k;
62+
63+
valve_pos_real := scale_to_real(raw_input_value := current_pos, real_max := 100.0, real_min := 0.0);
64+
65+
valve_pos_limited := LIMIT(0.0, valve_pos_real + pos_update_real, 100.0);
66+
67+
68+
control := scale_to_uint(real_in:= valve_pos_limited);
69+
END_FUNCTION
70+
71+
FUNCTION pressure_override : UINT
72+
VAR_INPUT
73+
pressure_in : UINT := 0;
74+
END_VAR
75+
VAR
76+
override_sp_real : REAL := 2900.0;
77+
sp_update : REAL := 0.0;
78+
END_VAR
79+
VAR_INPUT
80+
current_sp : UINT := 0;
81+
END_VAR
82+
VAR
83+
product_sp_real : REAL := 0.0;
84+
END_VAR
85+
VAR_OUTPUT
86+
product_sp : UINT := 0;
87+
END_VAR
88+
VAR_INPUT
89+
override_sp : UINT := 0;
90+
END_VAR
91+
VAR
92+
curr_sp_real : REAL := 0.0;
93+
pressure_real : REAL := 0.0;
94+
END_VAR
95+
96+
pressure_real := scale_to_real(raw_input_value := pressure_in, real_max := 3200.0, real_min := 0.0);
97+
98+
sp_update := MAX(0.0, 1.0 * (override_sp_real - pressure_real));
99+
100+
curr_sp_real := scale_to_real(raw_input_value := current_sp, real_max := 500.0, real_min := 0.0);
101+
102+
product_sp_real := curr_sp_real + sp_update;
103+
104+
product_sp := REAL_TO_UINT(65535.0 * (product_sp_real / 500.0));
105+
106+
pressure_override := product_sp;
107+
END_FUNCTION
108+
109+
PROGRAM main1
110+
VAR
111+
product_flow_setpoint AT %MW0 : UINT := 13107;
112+
a_setpoint AT %MW1 : UINT := 30801;
113+
pressure_sp AT %MW2 : UINT := 55295;
114+
override_sp AT %MW3 : UINT := 31675;
115+
level_sp AT %MW4 : UINT := 28835;
116+
f1_valve_pos AT %IW100 : UINT;
117+
f1_flow AT %IW101 : UINT;
118+
f2_valve_pos AT %IW102 : UINT;
119+
f2_flow AT %IW103 : UINT;
120+
purge_valve_pos AT %IW104 : UINT;
121+
purge_flow AT %IW105 : UINT;
122+
product_valve_pos AT %IW106 : UINT;
123+
product_flow AT %IW107 : UINT;
124+
pressure AT %IW108 : UINT;
125+
level AT %IW109 : UINT;
126+
a_in_purge AT %IW110 : UINT;
127+
b_in_purge AT %IW111 : UINT;
128+
c_in_purge AT %IW112 : UINT;
129+
f1_valve_sp AT %QW100 : UINT;
130+
f2_valve_sp AT %QW101 : UINT;
131+
purge_valve_sp AT %QW102 : UINT;
132+
product_valve_sp AT %QW103 : UINT;
133+
END_VAR
134+
VAR
135+
product_valve_safe : UINT := 0;
136+
purge_valve_safe : UINT := 65535;
137+
f1_valve_safe : UINT := 0;
138+
f2_valve_safe : UINT := 0;
139+
END_VAR
140+
VAR
141+
hmi_pressure AT %MW20 : INT;
142+
hmi_level AT %MW21 : INT;
143+
hmi_f1_valve_pos AT %MW22 : INT;
144+
hmi_f1_flow AT %MW23 : INT;
145+
hmi_f2_valve_pos AT %MW24 : INT;
146+
hmi_f2_flow AT %MW25 : INT;
147+
hmi_purge_valve AT %MW26 : INT;
148+
hmi_purge_flow AT %MW27 : INT;
149+
hmi_product_valve AT %MW28 : INT;
150+
hmi_product_flow AT %MW29 : INT;
151+
END_VAR
152+
VAR
153+
test_real : REAL;
154+
END_VAR
155+
VAR
156+
test_int AT %MW30 : UINT;
157+
run_bit AT %QX5.0 : BOOL := TRUE;
158+
END_VAR
159+
160+
161+
162+
f1_valve_sp := control(
163+
current_value := product_flow,
164+
setpoint := product_flow_setpoint,
165+
current_pos := f1_valve_pos,
166+
k := 20.0,
167+
rmax := 500.0,
168+
rmin := 0.0);
169+
170+
purge_valve_sp := control(
171+
current_value := pressure,
172+
setpoint := pressure_sp,
173+
current_pos := purge_valve_pos,
174+
k := -20.0,
175+
rmax := 3200.0,
176+
rmin := 0.0);
177+
178+
f2_valve_sp := control(
179+
current_value := a_in_purge,
180+
setpoint := a_setpoint,
181+
current_pos := f2_valve_pos,
182+
k := 1.0,
183+
rmax := 100.0,
184+
rmin := 0.0);
185+
186+
product_flow_setpoint := pressure_override(
187+
pressure_in := pressure,
188+
current_sp := product_flow_setpoint,
189+
override_sp := override_sp);
190+
191+
product_valve_sp := control(
192+
current_value := level,
193+
setpoint := level_sp,
194+
current_pos := product_valve_pos,
195+
k := -10.0,
196+
rmax := 100.0,
197+
rmin := 0.0);
198+
199+
f1_valve_pos := LIMIT(0, f1_valve_pos, 65535);
200+
f1_flow := LIMIT(0, f1_flow, 65535);
201+
f2_valve_pos := LIMIT(0, f2_valve_pos, 65535);
202+
f2_flow := LIMIT(0, f2_flow, 65535);
203+
purge_valve_pos := LIMIT(0, purge_valve_pos, 65535);
204+
purge_flow := LIMIT(0, purge_flow, 65535);
205+
product_valve_pos := LIMIT(0, product_valve_pos, 65535);
206+
product_flow := LIMIT(0, product_flow, 65535);
207+
a_in_purge := LIMIT(0, a_in_purge, 65535);
208+
b_in_purge := LIMIT(0, b_in_purge, 65535);
209+
c_in_purge := LIMIT(0, c_in_purge, 65535);
210+
a_setpoint := LIMIT(0, a_setpoint, 65535);
211+
level := LIMIT(0, level, 65535);
212+
level_sp := LIMIT(0, level_sp, 65535);
213+
pressure_sp := LIMIT(0, pressure_sp, 65535);
214+
215+
product_flow_setpoint := 30000;
216+
217+
IF NOT run_bit THEN
218+
f1_valve_sp := 0;
219+
f2_valve_sp := 0;
220+
purge_valve_sp := 65535;
221+
product_valve_sp := 65535;
222+
END_IF;
223+
END_PROGRAM
224+
225+
FUNCTION_BLOCK complex
226+
VAR
227+
IN : INT;
228+
N : BYTE;
229+
OUT : INT;
230+
ERR : BYTE;
231+
I : INT;
232+
a : INT;
233+
END_VAR
234+
235+
IF N > 1 AND N < 12 THEN
236+
ERR:=0;
237+
(* IF IN < P[0].X THEN *)
238+
IF IN < a THEN
239+
ERR := 2;
240+
OUT := a;
241+
(* ELSIF IN > P[N-1].X THEN *)
242+
ELSIF IN > a THEN
243+
ERR := 2;
244+
OUT := a;
245+
ELSE
246+
FOR I:=1 TO a-1 DO
247+
(* IF P[I-1].X >= P[I].X THEN *)
248+
IF a >= a THEN
249+
ERR:=1;
250+
EXIT;
251+
END_IF;
252+
(* IF IN <= P[I].X THEN *)
253+
IF IN <= a THEN
254+
EXIT;
255+
END_IF;
256+
END_FOR;
257+
IF ERR = 0 THEN
258+
(* OUT := DINT_TO_INT(P[I].Y - (P[I].X-IN) * (P[I].Y-P[I-1].Y) / (P[I].X-P[I-1].X)); *)
259+
OUT := (a - (a - IN) * (a - a) / (a - a));
260+
ELSE
261+
OUT:=0;
262+
END_IF;
263+
END_IF;
264+
ELSE
265+
ERR := 4;
266+
END_IF;
267+
END_FUNCTION_BLOCK
268+
269+
270+
CONFIGURATION Config0
271+
272+
RESOURCE Res0 ON PLC
273+
TASK task0(INTERVAL := T#20ms,PRIORITY := 0);
274+
PROGRAM instance0 WITH task0 : main1;
275+
END_RESOURCE
276+
END_CONFIGURATION

0 commit comments

Comments
 (0)