Hier mal ein Ansatz ZaehlerUdt = dein UDT01
CounterAddition addiert immer eine Counter UDT auf eine Andere. Es wird davon ausgeganegen, das in der Zähler UDT nur DINT Werte liegen und wenn die UDT von Projekt zu Projekt angepasst wird muss "CounterAddition".counterMax angepasst werden (Der Compiler wird meckern, wenn es nicht stimmt.
FB:
FUNCTION_BLOCK "CounterAddition"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT DB_SPECIFIC
CounterX { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "ZaehlerUdt";
nextCounter { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} AT CounterX : Array[0..#counterMax] of UDInt;
END_VAR
VAR_IN_OUT
CounterGes : "ZaehlerUdt";
END_VAR
VAR DB_SPECIFIC
CounterGesTemp { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "ZaehlerUdt";
CounterGesArray { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} AT CounterGesTemp : Array[0..#counterMax] of UDInt;
END_VAR
VAR_TEMP
i : Int;
END_VAR
VAR CONSTANT
counterMax : Int := 5;
END_VAR
BEGIN
// Addieren eines Counterblocks zu einem Anderen
#CounterGesTemp := #CounterGes; // Daten in Lokadatan laden
FOR #i := 0 TO #counterMax DO
#CounterGesArray[#i] := #CounterGesArray[#i] + #nextCounter[#i];
END_FOR;
#CounterGes := #CounterGesTemp; // Summenzähler zurückgeben
END_FUNCTION_BLOCK
BEGIN
// Addieren eines Counterblocks zu einem Anderen
#CounterGesTemp := #CounterGes; // Daten in Lokadatan laden
FOR #i := 0 TO #counterMax DO
#CounterGesArray[#i] := #CounterGesArray[#i] + #nextCounter[#i];
END_FOR;
#CounterGes := #CounterGesTemp; // Summenzähler zurückgeben
END_FUNCTION_BLOCK
BEGIN
// Addieren eines Counterblocks zu einem Anderen
#CounterGesTemp := #CounterGes; // Daten in Lokadatan laden
FOR #i := 0 TO #counterMax DO
#CounterGesArray[#i] := #CounterGesArray[#i] + #nextCounter[#i];
END_FOR;
END_FUNCTION_BLOCK
BEGIN
// Addieren eines Counterblocks zu einem Anderen
#CounterGesTemp := #CounterGes; // Daten in Lokadatan laden
FOR #i := 0 TO #counterMax DO
#CounterGesArray[#i] := #CounterGesArray[#i] + #nextCounter[#i];
END_FOR;
END_FUNCTION_BLOCK
Viel Spaß beim Testen
Thomas