Skip to content

Commit 9b68392

Browse files
Draft/WIP: Weighted Aggregation Support for Sum/Avg
* Fix: Rounding Needed for Weighted Sum * Refactor: getParamInputWeight
1 parent ac66349 commit 9b68392

7 files changed

+141
-22
lines changed

doc/Applikationsbeschreibung-FunctionBlocks.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,17 @@ Legt fest, wie der Ausgangswert aus den Werten der aktiven Eingänge berechnet w
278278
Liefert ein einfaches Maß dafür, wie weit sich die Eingangs-Werte voneinander unterscheiden.
279279
Das Ergebnis kann außerhalb des Eingangs-Wertebereichs liegen, wenn vorzeichenbehaftet ist!
280280
281+
<!-- DOC -->
282+
### Gewichtung der Eingänge
283+
284+
<!-- DOC Skip="2" -->
285+
> Nur für *Summe* und *Mittelwert*
286+
287+
**Individuelle Gewichte** erlaubt eine Berechnung bei der die Eingänge unterschiedlich stark in der Ergebnis einfließen.
288+
Dazu kann je aktivem Eingang ein individuelles Gewicht (Standardwert 1) angegeben werden.
289+
Mindestens ein Gewicht muss von 0 abweichen, sonst wird kein Ergebnis ausgegeben!
290+
291+
281292
<!-- DOC HelpContext="DptEingang" -->
282293
### Wertetyp / DPT (Eingänge)
283294
@@ -288,6 +299,17 @@ Definiert den DPT der Eingänge. Zur Auswahl stehen gängige numerische DPTs mit
288299
289300
Legt fest, ob der Eingang verwendet wird.
290301
302+
<!-- DOC HelpContext="AggrEingangGewicht" -->
303+
### Gewicht Eingang 1-9
304+
305+
Definiert wie stark dieser Eingang in das Ergebnis einfließt.
306+
307+
Bei 0 hat dieser Eingang keinen Einfluss auf das Resultat der Berechnung,
308+
wird aber verhindern dass ein Ergebnis entsteht so lange der Eingang noch keinen Wert hat,
309+
oder kann abhängig vom Sendeverhalten ein Senden auf de Bus auslösen.
310+
311+
Ein negativer Wert ändert das Vorzeichen des Eingangswertes. Bei der Gewichtssumme fließt der Betrag ein.
312+
291313
<!-- DOC HelpContext="DptAusgang" -->
292314
### Wertetyp / DPT (Ausgang)
293315
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
### Gewicht Eingang 1-9
2+
3+
Definiert wie stark dieser Eingang in das Ergebnis einfließt.
4+
5+
Bei 0 hat dieser Eingang keinen Einfluss auf das Resultat der Berechnung,
6+
wird aber verhindern dass ein Ergebnis entsteht so lange der Eingang noch keinen Wert hat,
7+
oder kann abhängig vom Sendeverhalten ein Senden auf de Bus auslösen.
8+
9+
Ein negativer Wert ändert das Vorzeichen des Eingangswertes. Bei der Gewichtssumme fließt der Betrag ein.
10+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### Gewichtung der Eingänge
2+
3+
**Individuelle Gewichte** erlaubt eine Berechnung bei der die Eingänge unterschiedlich stark in der Ergebnis einfließen.
4+
Dazu kann je aktivem Eingang ein individuelles Gewicht (Standardwert 1) angegeben werden.
5+
Mindestens ein Gewicht muss von 0 abweichen, sonst wird kein Ergebnis ausgegeben!
6+
7+

src/FunctionBlocks.share.xml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@
139139
</TypeRestriction>
140140
</ParameterType>
141141

142-
<ParameterType Id="%AID%_PT-FCBSimpleStatAggTyp" Name="FCBSimpleStatAggTyp" >
143-
<TypeRestriction Base="Value" SizeInBit="8" >
142+
<ParameterType Id="%AID%_PT-FCBSimpleStatAggType" Name="FCBSimpleStatAggType" >
143+
<TypeRestriction Base="Value" SizeInBit="7" >
144144
<Enumeration Id="%ENID%" Value="0" Text="Summe" />
145145
<Enumeration Id="%ENID%" Value="1" Text="Mittelwert" />
146146
<Enumeration Id="%ENID%" Value="2" Text="Minimum" />
@@ -155,6 +155,17 @@
155155
</TypeRestriction>
156156
</ParameterType>
157157

158+
<ParameterType Id="%AID%_PT-FCBSimpleStatAggWeighted" Name="FCBSimpleStatAggWeighted" >
159+
<TypeRestriction Base="Value" SizeInBit="1" >
160+
<Enumeration Id="%ENID%" Value="0" Text="Ungewichtet (alle 1)" />
161+
<Enumeration Id="%ENID%" Value="1" Text="Individuelle Gewichte" />
162+
</TypeRestriction>
163+
</ParameterType>
164+
165+
<ParameterType Id="%AID%_PT-FCBInputWeight" Name="FCBInputWeight" >
166+
<TypeNumber SizeInBit="8" Type="signedInt" minInclusive="-100" maxInclusive="100" />
167+
</ParameterType>
168+
158169
</ParameterTypes>
159170
<Parameters>
160171
<!-- Base Settings -->

src/FunctionBlocks.templ.xml

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,13 @@
169169
</Union>
170170

171171
<!-- Simple Statistic Aggregation -->
172-
<Union SizeInBit="64">
172+
<Union SizeInBit="120">
173173
<Memory CodeSegment="%MID%" Offset="2" BitOffset="0" />
174174

175+
<!-- Weighed -->
176+
<Parameter Id="%AID%_UP-%TT%%CC%187" Name="CH%C%AggWeight" ParameterType="%AID%_PT-FCBSimpleStatAggWeighted" Offset="0" BitOffset="0" Text="Gewichtung der Eingänge" Value="0" />
175177
<!-- Subtype -->
176-
<Parameter Id="%AID%_UP-%TT%%CC%171" Name="CH%C%AggType" ParameterType="%AID%_PT-FCBSimpleStatAggTyp" Offset="0" BitOffset="0" Text="Funktion" Value="1" />
178+
<Parameter Id="%AID%_UP-%TT%%CC%171" Name="CH%C%AggType" ParameterType="%AID%_PT-FCBSimpleStatAggType" Offset="0" BitOffset="1" Text="Funktion" Value="1" />
177179

178180
<!-- KO 0 Deactivatable-->
179181
<Parameter Id="%AID%_UP-%TT%%CC%172" Name="CH%C%AggKo0D" ParameterType="%AID%_PT-FCBNumericInputKoUsage" Offset="1" BitOffset="0" Text="Eingang 1" Value="1" />
@@ -207,11 +209,21 @@
207209
<!-- Output Value Type (Effective) -->
208210
<Parameter Id="%AID%_UP-%TT%%CC%183" Name="CH%C%AggOutputDptEff" ParameterType="%AID%_PT-FCBNumericDpt" Offset="5" BitOffset="0" Text="DPT Ausgang" Value="90" Access="None" />
209211

212+
<!-- KO 0 Weight --><Parameter Id="%AID%_UP-%TT%%CC%188" Name="CH%C%AggKo0W" ParameterType="%AID%_PT-FCBInputWeight" Offset="6" BitOffset="0" Text="Gewicht Eingang 1" Value="1" />
213+
<!-- KO 1 Weight --><Parameter Id="%AID%_UP-%TT%%CC%189" Name="CH%C%AggKo1W" ParameterType="%AID%_PT-FCBInputWeight" Offset="7" BitOffset="0" Text="Gewicht Eingang 2" Value="1" />
214+
<!-- KO 2 Weight --><Parameter Id="%AID%_UP-%TT%%CC%190" Name="CH%C%AggKo2W" ParameterType="%AID%_PT-FCBInputWeight" Offset="8" BitOffset="0" Text="Gewicht Eingang 3" Value="1" />
215+
<!-- KO 3 Weight --><Parameter Id="%AID%_UP-%TT%%CC%191" Name="CH%C%AggKo3W" ParameterType="%AID%_PT-FCBInputWeight" Offset="9" BitOffset="0" Text="Gewicht Eingang 4" Value="1" />
216+
<!-- KO 4 Weight --><Parameter Id="%AID%_UP-%TT%%CC%192" Name="CH%C%AggKo4W" ParameterType="%AID%_PT-FCBInputWeight" Offset="10" BitOffset="0" Text="Gewicht Eingang 5" Value="1" />
217+
<!-- KO 5 Weight --><Parameter Id="%AID%_UP-%TT%%CC%193" Name="CH%C%AggKo5W" ParameterType="%AID%_PT-FCBInputWeight" Offset="11" BitOffset="0" Text="Gewicht Eingang 6" Value="1" />
218+
<!-- KO 6 Weight --><Parameter Id="%AID%_UP-%TT%%CC%194" Name="CH%C%AggKo6W" ParameterType="%AID%_PT-FCBInputWeight" Offset="12" BitOffset="0" Text="Gewicht Eingang 7" Value="1" />
219+
<!-- KO 7 Weight --><Parameter Id="%AID%_UP-%TT%%CC%195" Name="CH%C%AggKo7W" ParameterType="%AID%_PT-FCBInputWeight" Offset="13" BitOffset="0" Text="Gewicht Eingang 8" Value="1" />
220+
<!-- KO 8 Weight --><Parameter Id="%AID%_UP-%TT%%CC%196" Name="CH%C%AggKo8W" ParameterType="%AID%_PT-FCBInputWeight" Offset="14" BitOffset="0" Text="Gewicht Eingang 9" Value="1" />
221+
210222
</Union>
211223
<!-- Output Value Type -->
212224
<Parameter Id="%AID%_P-%TT%%CC%186" Name="CH%C%AggOutputDpt" ParameterType="%AID%_PT-FCBNumericOutputDpt" Text="Wertetype / DPT" Value="255" />
213225

214-
<!-- Next Id: %AID%_UP-%TT%%CC%187 -->
226+
<!-- Next Id: %AID%_UP-%TT%%CC%197 -->
215227

216228
</Parameters>
217229
<ParameterRefs>
@@ -389,6 +401,18 @@
389401

390402
<!-- Output Value Type (ETS Input) -->
391403
<ParameterRef Id="%AID%_P-%TT%%CC%186_R-%TT%%CC%18601" RefId="%AID%_P-%TT%%CC%186" />
404+
<!-- Input Weight -->
405+
<ParameterRef Id="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701" RefId="%AID%_UP-%TT%%CC%187" />
406+
407+
<!-- KO 0 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%188_R-%TT%%CC%18801" RefId="%AID%_UP-%TT%%CC%188"/>
408+
<!-- KO 1 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%189_R-%TT%%CC%18901" RefId="%AID%_UP-%TT%%CC%189"/>
409+
<!-- KO 2 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%190_R-%TT%%CC%19001" RefId="%AID%_UP-%TT%%CC%190"/>
410+
<!-- KO 3 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%191_R-%TT%%CC%19101" RefId="%AID%_UP-%TT%%CC%191"/>
411+
<!-- KO 4 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%192_R-%TT%%CC%19201" RefId="%AID%_UP-%TT%%CC%192"/>
412+
<!-- KO 5 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%193_R-%TT%%CC%19301" RefId="%AID%_UP-%TT%%CC%193"/>
413+
<!-- KO 6 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%194_R-%TT%%CC%19401" RefId="%AID%_UP-%TT%%CC%194"/>
414+
<!-- KO 7 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%195_R-%TT%%CC%19501" RefId="%AID%_UP-%TT%%CC%195"/>
415+
<!-- KO 8 Weight --><ParameterRef Id="%AID%_UP-%TT%%CC%196_R-%TT%%CC%19601" RefId="%AID%_UP-%TT%%CC%196"/>
392416

393417
</ParameterRefs>
394418
<ComObjectTable>
@@ -1274,6 +1298,12 @@
12741298

12751299
<!-- Aggregation Function -->
12761300
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%171_R-%TT%%CC%17101" HelpContext="FCB-AggrFunction" />
1301+
<choose ParamRefId="%AID%_UP-%TT%%CC%171_R-%TT%%CC%17101">
1302+
<when test="0 1"><!-- SUM + AVG -->
1303+
<!-- Weight -->
1304+
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701" IndentLevel="1" HelpContext="FCB-Gewichtung-der-Eingaenge" />
1305+
</when>
1306+
</choose>
12771307

12781308
<ParameterSeparator Id="%AID%_PS-nnn" Text="Eingänge" UIHint="Headline" />
12791309
<!-- Input Value Type -->
@@ -1284,6 +1314,9 @@
12841314
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%172_R-%TT%%CC%17201" HelpContext="FCB-AggrEingang" />
12851315
<choose ParamRefId="%AID%_UP-%TT%%CC%172_R-%TT%%CC%17201" >
12861316
<when test="&gt;0">
1317+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1318+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%188_R-%TT%%CC%18801" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1319+
</choose>
12871320
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
12881321
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%000_R-%TT%%CC%00005" /></when>
12891322
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%000_R-%TT%%CC%00051" /></when>
@@ -1302,6 +1335,9 @@
13021335
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%173_R-%TT%%CC%17301" HelpContext="FCB-AggrEingang" />
13031336
<choose ParamRefId="%AID%_UP-%TT%%CC%173_R-%TT%%CC%17301" >
13041337
<when test="&gt;0">
1338+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1339+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%189_R-%TT%%CC%18901" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1340+
</choose>
13051341
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
13061342
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%001_R-%TT%%CC%00105" /></when>
13071343
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%001_R-%TT%%CC%00151" /></when>
@@ -1320,6 +1356,9 @@
13201356
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%174_R-%TT%%CC%17401" HelpContext="FCB-AggrEingang" />
13211357
<choose ParamRefId="%AID%_UP-%TT%%CC%174_R-%TT%%CC%17401" >
13221358
<when test="&gt;0">
1359+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1360+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%190_R-%TT%%CC%19001" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1361+
</choose>
13231362
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
13241363
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%002_R-%TT%%CC%00205" /></when>
13251364
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%002_R-%TT%%CC%00251" /></when>
@@ -1338,6 +1377,9 @@
13381377
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%175_R-%TT%%CC%17501" HelpContext="FCB-AggrEingang" />
13391378
<choose ParamRefId="%AID%_UP-%TT%%CC%175_R-%TT%%CC%17501" >
13401379
<when test="&gt;0">
1380+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1381+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%191_R-%TT%%CC%19101" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1382+
</choose>
13411383
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
13421384
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%003_R-%TT%%CC%00305" /></when>
13431385
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%003_R-%TT%%CC%00351" /></when>
@@ -1356,6 +1398,9 @@
13561398
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%176_R-%TT%%CC%17601" HelpContext="FCB-AggrEingang" />
13571399
<choose ParamRefId="%AID%_UP-%TT%%CC%176_R-%TT%%CC%17601" >
13581400
<when test="&gt;0">
1401+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1402+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%192_R-%TT%%CC%19201" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1403+
</choose>
13591404
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
13601405
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%004_R-%TT%%CC%00405" /></when>
13611406
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%004_R-%TT%%CC%00451" /></when>
@@ -1374,6 +1419,9 @@
13741419
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%177_R-%TT%%CC%17701" HelpContext="FCB-AggrEingang" />
13751420
<choose ParamRefId="%AID%_UP-%TT%%CC%177_R-%TT%%CC%17701" >
13761421
<when test="&gt;0">
1422+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1423+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%193_R-%TT%%CC%19301" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1424+
</choose>
13771425
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
13781426
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%005_R-%TT%%CC%00505" /></when>
13791427
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%005_R-%TT%%CC%00551" /></when>
@@ -1392,6 +1440,9 @@
13921440
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%178_R-%TT%%CC%17801" HelpContext="FCB-AggrEingang" />
13931441
<choose ParamRefId="%AID%_UP-%TT%%CC%178_R-%TT%%CC%17801" >
13941442
<when test="&gt;0">
1443+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1444+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%194_R-%TT%%CC%19401" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1445+
</choose>
13951446
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
13961447
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%006_R-%TT%%CC%00605" /></when>
13971448
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%006_R-%TT%%CC%00651" /></when>
@@ -1410,6 +1461,9 @@
14101461
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%179_R-%TT%%CC%17901" HelpContext="FCB-AggrEingang" />
14111462
<choose ParamRefId="%AID%_UP-%TT%%CC%179_R-%TT%%CC%17901" >
14121463
<when test="&gt;0">
1464+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1465+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%195_R-%TT%%CC%19501" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1466+
</choose>
14131467
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
14141468
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%007_R-%TT%%CC%00705" /></when>
14151469
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%007_R-%TT%%CC%00751" /></when>
@@ -1428,6 +1482,9 @@
14281482
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%180_R-%TT%%CC%18001" HelpContext="FCB-AggrEingang" />
14291483
<choose ParamRefId="%AID%_UP-%TT%%CC%180_R-%TT%%CC%18001" >
14301484
<when test="&gt;0">
1485+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1486+
<when test="1"><ParameterRefRef RefId="%AID%_UP-%TT%%CC%196_R-%TT%%CC%19601" IndentLevel="1" HelpContext="FCB-AggrEingangGewicht" /></when>
1487+
</choose>
14311488
<choose ParamRefId="%AID%_UP-%TT%%CC%182_R-%TT%%CC%18201">
14321489
<when test="50"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%008_R-%TT%%CC%00805" /></when>
14331490
<when test="51"><ComObjectRefRef RefId="%AID%_O-%TT%%CC%008_R-%TT%%CC%00851" /></when>
@@ -1486,6 +1543,14 @@
14861543
<when test="1"><!-- avg of int inputs is non int -->
14871544
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%184_R-%TT%%CC%18401" IndentLevel="1" HelpContext="FCB-Rundungsmodus" />
14881545
</when>
1546+
<when test="0">
1547+
<choose ParamRefId="%AID%_UP-%TT%%CC%187_R-%TT%%CC%18701">
1548+
<when test="1">
1549+
<!-- weighted sum of int inputs is non int -->
1550+
<ParameterRefRef RefId="%AID%_UP-%TT%%CC%184_R-%TT%%CC%18401" IndentLevel="1" HelpContext="FCB-Rundungsmodus" />
1551+
</when>
1552+
</choose>
1553+
</when>
14891554
</choose>
14901555
</when>
14911556
</choose>

0 commit comments

Comments
 (0)