TIA PLC-Datentyp (UDT) als Parameter übergeben

Markus

Administrator
Teammitglied
Beiträge
6.324
Reaktionspunkte
2.342
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

kann man bei TIA eigentlich irgendwie einen Datentyp als Parameter übergeben?
Also quasi keinen Parameter vom Typ DES Datentyps, sondern einen Parameter vom Typ Datentyp?

Hintegrund:
Ich spiele gerade mit dem Gedanken ein paar Bausteine etwas universeller zu bauen.

Beispiel Schieberegister:

Deklaration:
Code:
FUNCTION_BLOCK "Schieberegister"

VAR_INPUT
  iTaktSchieben : Bool;
  iEintrag : Int;
 
END_VAR

VAR_OUTPUT
 
 
END_VAR

VAR_IN_OUT
  ioArrayDaten : Array[*] OF Int;
END_VAR

VAR
  vFpTaktSchieben {S7_SETPOINT := 'True'} : R_TRIG;
  Anfang : DInt;
  Ende : DInt;
END_VAR

VAR_TEMP
  i : Int;
END_VAR

VAR CONSTANT
 
END_VAR


Code:
Code:
#Anfang := LOWER_BOUND(ARR := #ioArrayDaten, DIM := 1);
#Ende := UPPER_BOUND(ARR := #ioArrayDaten, DIM := 1);


#vFpTaktSchieben(CLK:=#iTaktSchieben);


IF #vFpTaktSchieben.Q THEN
    FOR #i := #Ende - 1 TO #Anfang BY -1 DO
        #ioArrayDaten[#i + 1] := #ioArrayDaten[#i];
    END_FOR;
    #ioArrayDaten[1] := #iEintrag;
    
END_IF;



Am Parameter wird ein beliebig langes Array of INT angegeben.
Mit dem Bool #iTaktSchieben werden die Werte um je ein Element weitergeschoben.
Schieberegister halt...


Bekomme ich den Baustein so hin, dass er alles Schieben kann?
Also auch ein Array of REAL bzw. ein Array of Struct?


Struct kann auch ein PLC-Datentyp sein.
Entweder der FB erkennt selbst was da an der Schnittstelle hängt, oder man übergibt ihm auch den Datentyp als Parameter.

Oder eine Funktion um die Länge des DB bzw. Array auszulesen und durch die Anzahl der ermittelte Elemente teilen?
Diesen Wert dann zum Schieben in der Schleife nutzen?
Gibts da was?


Danke!
 
Also Sinngemäß etwa so:

VAR_INPUT
iTaktSchieben : Bool;
iEintrag : iElementTyp;
iElementTyp : UDT;
END_VAR

VAR_IN_OUT
ioArrayDaten : Array[*] OF iElementTyp;
END_VAR
 
Hmm das könnte gehen - ich zu sehr auf "Array[*] fixiert.
Hier wurde im Prinzip das selbe Problem diskutiert:

Ich spiel mal damit rum...
 
OK, das sollte klappen, habe mir gerade das Beispiel in der verlinkten LGF Bibliothek angesehen.

Die Zauberwörter sind wohl:

Variant + IS_ARRAY + TypeOf + MOVE_BLK_VARIANT



Code:
IF IS_ARRAY(#buffer) THEN
    #tempBufferSize := CountOfElements(#buffer);
  ELSE
.
.
.


IF (TypeOf(#item) <> TypeOfElements(#buffer)) THEN

.
.
.


FOR #tempCounter := #COUNTER_LOWER_LIMIT TO UDINT_TO_INT(#tempBufferSize - #BUFFER_SIZE_CORRECTION) DO
    
      #tempInternalError := MOVE_BLK_VARIANT(SRC := #initialItem,
                                             COUNT := #COUNT_ELEMENTS,
                                             SRC_INDEX := #INDEX_BEGINNING,
                                             DEST_INDEX := #tempCounter,
                                             DEST => #buffer);
    END_FOR;

.
.
.
 
Zuletzt bearbeitet von einem Moderator:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das reicht vollkommen aus. ioBuffer und ioInitValue sind vom Typ Variant


Code:
// Eins hoch schieben
#tError :=
MOVE_BLK_VARIANT(SRC := #ioBuffer,
                 COUNT := CountOfElements(#ioBuffer) - 1,
                 SRC_INDEX := 0,
                 DEST_INDEX := 1,
                 DEST => #ioBuffer);
// Erstes Element löschen
#tError :=
MOVE_BLK_VARIANT(SRC := #ioInitValue,
                 COUNT := 1,
                 SRC_INDEX := 0,
                 DEST_INDEX := 0,
                 DEST => #ioBuffer);
 
Die Zauberwörter sind wohl:

Variant + IS_ARRAY + TypeOf + MOVE_BLK_VARIANT

Vergiss "Ref_to" in diesem Kontext nicht.
Du kannst im temp Bereich eine variable auch als "ref_to_Datentyp" anlegen.
Per "TypeOf" kannst du rausfinden was für einen Datentyp du an dem Variant rein bekommst & dann per "?=" Die Referenzvariable über den Variant "stülpen".
Funktioniert im Grunde wie eine dynamisch zuweisbare Sicht auf den Variant.

Damit kannst du dir das Kopieren/manipulieren/zurückkopieren mit "Move_BLK_Variant" sparen und direkt aus deinem Baustein raus in den Aktualparameter rein greifen.
 
Zurück
Oben