|
1 (* |
|
2 * (c) 2005 Mario de Sousa |
|
3 * |
|
4 * Offered to the public under the terms of the GNU General Public License |
|
5 * as published by the Free Software Foundation; either version 2 of the |
|
6 * License, or (at your option) any later version. |
|
7 * |
|
8 * This program is distributed in the hope that it will be useful, but |
|
9 * WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
|
11 * Public License for more details. |
|
12 * |
|
13 * This code is made available on the understanding that it will not be |
|
14 * used in safety-critical situations without a full and competent review. |
|
15 *) |
|
16 |
|
17 (* |
|
18 * An IEC 61131-3 IL and ST compiler. |
|
19 * |
|
20 * Based on the |
|
21 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) |
|
22 * |
|
23 *) |
|
24 |
|
25 (* |
|
26 * This is part of the library conatining the functions |
|
27 * and function blocks defined in the standard. |
|
28 * |
|
29 * Math functions on Time and Date data types. |
|
30 * ------------------------------------------- |
|
31 * |
|
32 * We also include the two data type conversions defined in table 30 of the IEC 61131-3 standard (version |
|
33 *) |
|
34 |
|
35 |
|
36 (* NOTE: The IEC 61131-3 standard library includes overloaded functions, which are not |
|
37 * allowed in user code. Since our compiler does not yet support overloaded functions, these |
|
38 * are commented out in the following library for the moment... |
|
39 *) |
|
40 |
|
41 (***************) |
|
42 (* TIME + TIME *) |
|
43 (***************) |
|
44 |
|
45 FUNCTION ADD : TIME |
|
46 VAR_INPUT |
|
47 IN1 : TIME; |
|
48 IN2 : TIME; |
|
49 END_VAR |
|
50 |
|
51 ADD := IN1 + IN2; |
|
52 END_FUNCTION |
|
53 |
|
54 |
|
55 FUNCTION ADD_TIME : TIME |
|
56 VAR_INPUT |
|
57 IN1 : TIME; |
|
58 IN2 : TIME; |
|
59 END_VAR |
|
60 |
|
61 ADD_TIME := IN1 + IN2; |
|
62 END_FUNCTION |
|
63 |
|
64 |
|
65 FUNCTION SUB : TIME |
|
66 VAR_INPUT |
|
67 IN1 : TIME; |
|
68 IN2 : TIME; |
|
69 END_VAR |
|
70 |
|
71 SUB := IN1 - IN2; |
|
72 END_FUNCTION |
|
73 |
|
74 |
|
75 FUNCTION SUB_TIME : TIME |
|
76 VAR_INPUT |
|
77 IN1 : TIME; |
|
78 IN2 : TIME; |
|
79 END_VAR |
|
80 |
|
81 SUB_TIME := IN1 - IN2; |
|
82 END_FUNCTION |
|
83 |
|
84 |
|
85 |
|
86 (**************) |
|
87 (* TIME + TOD *) |
|
88 (**************) |
|
89 |
|
90 FUNCTION ADD : TOD |
|
91 VAR_INPUT |
|
92 IN1 : TOD; |
|
93 IN2 : TIME; |
|
94 END_VAR |
|
95 |
|
96 ADD := IN1 + IN2; |
|
97 END_FUNCTION |
|
98 |
|
99 |
|
100 (* The following function is not defined in the standard, but its existance makes sense. *) |
|
101 FUNCTION ADD : TOD |
|
102 VAR_INPUT |
|
103 IN1 : TIME; |
|
104 IN2 : TOD; |
|
105 END_VAR |
|
106 |
|
107 ADD := IN1 + IN2; |
|
108 END_FUNCTION |
|
109 |
|
110 |
|
111 FUNCTION ADD_TOD_TIME : TOD |
|
112 VAR_INPUT |
|
113 IN1 : TOD; |
|
114 IN2 : TIME; |
|
115 END_VAR |
|
116 |
|
117 ADD_TOD_TIME := IN1 + IN2; |
|
118 END_FUNCTION |
|
119 |
|
120 |
|
121 FUNCTION SUB : TOD |
|
122 VAR_INPUT |
|
123 IN1 : TOD; |
|
124 IN2 : TIME; |
|
125 END_VAR |
|
126 |
|
127 SUB := IN1 - IN2; |
|
128 END_FUNCTION |
|
129 |
|
130 |
|
131 FUNCTION SUB_TOD_TIME : TOD |
|
132 VAR_INPUT |
|
133 IN1 : TOD; |
|
134 IN2 : TIME; |
|
135 END_VAR |
|
136 |
|
137 SUB_TOD_TIME := IN1 - IN2; |
|
138 END_FUNCTION |
|
139 |
|
140 |
|
141 |
|
142 (*************) |
|
143 (* TIME + DT *) |
|
144 (*************) |
|
145 |
|
146 FUNCTION ADD : DT |
|
147 VAR_INPUT |
|
148 IN1 : DT; |
|
149 IN2 : TIME; |
|
150 END_VAR |
|
151 |
|
152 ADD := IN1 + IN2; |
|
153 END_FUNCTION |
|
154 |
|
155 |
|
156 (* The following function is not defined in the standard, but its existance makes sense. *) |
|
157 FUNCTION ADD : DT |
|
158 VAR_INPUT |
|
159 IN1 : TIME; |
|
160 IN2 : DT; |
|
161 END_VAR |
|
162 |
|
163 ADD := IN1 + IN2; |
|
164 END_FUNCTION |
|
165 |
|
166 |
|
167 FUNCTION ADD_DT_TIME : DT |
|
168 VAR_INPUT |
|
169 IN1 : DT; |
|
170 IN2 : TIME; |
|
171 END_VAR |
|
172 |
|
173 ADD_DT_TIME := IN1 + IN2; |
|
174 END_FUNCTION |
|
175 |
|
176 |
|
177 |
|
178 (***************) |
|
179 (* DATE + DATE *) |
|
180 (***************) |
|
181 |
|
182 FUNCTION SUB : TIME |
|
183 VAR_INPUT |
|
184 IN1 : DATE; |
|
185 IN2 : DATE; |
|
186 END_VAR |
|
187 |
|
188 SUB := IN1 - IN2; |
|
189 END_FUNCTION |
|
190 |
|
191 |
|
192 FUNCTION SUB_DATE_DATE : TIME |
|
193 VAR_INPUT |
|
194 IN1 : DATE; |
|
195 IN2 : DATE; |
|
196 END_VAR |
|
197 |
|
198 SUB_DATE_DATE := IN1 - IN2; |
|
199 END_FUNCTION |
|
200 |
|
201 |
|
202 |
|
203 (*************) |
|
204 (* TOD + TOD *) |
|
205 (*************) |
|
206 |
|
207 FUNCTION SUB : TIME |
|
208 VAR_INPUT |
|
209 IN1 : TOD; |
|
210 IN2 : TOD; |
|
211 END_VAR |
|
212 |
|
213 SUB := IN1 - IN2; |
|
214 END_FUNCTION |
|
215 |
|
216 |
|
217 FUNCTION SUB_TOD_TOD : TIME |
|
218 VAR_INPUT |
|
219 IN1 : TOD; |
|
220 IN2 : TOD; |
|
221 END_VAR |
|
222 |
|
223 SUB_TOD_TOD := IN1 - IN2; |
|
224 END_FUNCTION |
|
225 |
|
226 |
|
227 |
|
228 (*************) |
|
229 (* TIME + DT *) |
|
230 (*************) |
|
231 |
|
232 FUNCTION SUB : DT |
|
233 VAR_INPUT |
|
234 IN1 : DT; |
|
235 IN2 : TIME; |
|
236 END_VAR |
|
237 |
|
238 SUB := IN1 - IN2; |
|
239 END_FUNCTION |
|
240 |
|
241 |
|
242 FUNCTION SUB_DT_TIME : DT |
|
243 VAR_INPUT |
|
244 IN1 : DT; |
|
245 IN2 : TIME; |
|
246 END_VAR |
|
247 |
|
248 SUB_DT_TIME := IN1 - IN2; |
|
249 END_FUNCTION |
|
250 |
|
251 |
|
252 |
|
253 (***********) |
|
254 (* DT + DT *) |
|
255 (***********) |
|
256 |
|
257 FUNCTION SUB : TIME |
|
258 VAR_INPUT |
|
259 IN1 : DT; |
|
260 IN2 : DT; |
|
261 END_VAR |
|
262 |
|
263 SUB := IN1 - IN2; |
|
264 END_FUNCTION |
|
265 |
|
266 |
|
267 FUNCTION SUB_DT_DT : TIME |
|
268 VAR_INPUT |
|
269 IN1 : DT; |
|
270 IN2 : DT; |
|
271 END_VAR |
|
272 |
|
273 SUB_DT_DT := IN1 - IN2; |
|
274 END_FUNCTION |
|
275 |
|
276 |
|
277 |
|
278 (******************) |
|
279 (* TIME * ANY_NUM *) |
|
280 (******************) |
|
281 |
|
282 FUNCTION MUL : TIME |
|
283 VAR_INPUT |
|
284 IN1 : TIME; |
|
285 IN2 : LREAL; |
|
286 END_VAR |
|
287 |
|
288 MUL := IN1 * IN2; |
|
289 END_FUNCTION |
|
290 |
|
291 |
|
292 FUNCTION MULTIME : TIME |
|
293 VAR_INPUT |
|
294 IN1 : TIME; |
|
295 IN2 : LREAL; |
|
296 END_VAR |
|
297 |
|
298 MULTIME := IN1 * IN2; |
|
299 END_FUNCTION |
|
300 |
|
301 |
|
302 FUNCTION DIV : TIME |
|
303 VAR_INPUT |
|
304 IN1 : TIME; |
|
305 IN2 : LREAL; |
|
306 END_VAR |
|
307 |
|
308 DIV := IN1 / IN2; |
|
309 END_FUNCTION |
|
310 |
|
311 |
|
312 FUNCTION DIVTIME : TIME |
|
313 VAR_INPUT |
|
314 IN1 : TIME; |
|
315 IN2 : LREAL; |
|
316 END_VAR |
|
317 |
|
318 DIVTIME := IN1 / IN2; |
|
319 END_FUNCTION |
|
320 |
|
321 |
|
322 |
|
323 (*************) |
|
324 (* DATE + DT *) |
|
325 (*************) |
|
326 |
|
327 FUNCTION CONCAT_DATE_TOD : DT |
|
328 VAR_INPUT |
|
329 IN1 : DATE; |
|
330 IN2 : TOD; |
|
331 END_VAR |
|
332 |
|
333 CONCAT_DATE_TOD := IN1 + IN2; |
|
334 END_FUNCTION |
|
335 |
|
336 |
|
337 |
|
338 (*************************) |
|
339 (* Data Type Conversions *) |
|
340 (*************************) |
|
341 |
|
342 FUNCTION DT_TO_DATE : DATE |
|
343 VAR_INPUT |
|
344 IN1 : DT; |
|
345 END_VAR |
|
346 |
|
347 {DT_TO_DATE = IN1.__to_DATE();} |
|
348 END_FUNCTION |
|
349 |
|
350 |
|
351 |
|
352 FUNCTION DT_TO_TOD : TOD |
|
353 VAR_INPUT |
|
354 IN1 : DT; |
|
355 END_VAR |
|
356 |
|
357 {DT_TO_TOD = IN1.__to_TOD();} |
|
358 END_FUNCTION |
|
359 |
|
360 |