TIA Variant-Serialize Größe ermitteln

Lucky0815

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

ich möchte einen Lib-Baustein erstellen. Welcher eine Jobliste verwaltet. In dieser Jobliste sind einzig die Daten immer unterschiedlich für die Stationen. Somit habe ich einen FB-Angelegt und einen In/Out die JobDaten als Variant angelegt. Es gibt Aktuelle-Jobdaten,Nächste Jobdaten und eine Warteschlange mit Jobdaten, welche in einem Array gespeichert sind. Diese werden von außen mit einem UDT Verschalten.

In dem Baustein verschiebe ich diese Daten nur oder lösche sie komplett. Somit ist mir der Inhalt prinzipiell egal.

Ich habe bereits mit Serialize und Deserialize die Daten in ein Array of Bytes umkopiert. Und habe die Daten Kopieren und Löschen können. Ich habe jedoch im Baustein ein Array [0-50] of Bytes angelegt. Ich würde dieses jedoch gerne Universell gestalten, sodass ich den Baustein nicht mehr anfassen muss, wenn sich die Daten erhöhen.

Hat jemand eine Idee wie ich das lösen könnte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es in den Bibliotheken bei Siemens Parameter?
Dann könnte man die Arraygröße über diesen etwas dynamischer festlegen.
Arraygrößen können nur mit Konstanten festgelegt, diese aber nicht als Parameter an den Baustein übergeben werden.
😞 🤷‍♂️


PS:
Bei Classic konnte man mit Konstanten für die Arraygröße noch rechnen, geht bei TIA (zumindest mit S7-1x00) auch nicht mehr.
 
Arraygrößen können nur mit Konstanten festgelegt, diese aber nicht als Parameter an den Baustein übergeben werden.
😞 🤷‍♂️
OK, dann geht das bei Siemens leider nicht.
Im Codesys Universum ist sowas möglich.
Da wird in der Bibliothek ein Parameter angelegt und dieser dann bei der Deklaration des Arrays verwendet. Im Projekt, wo die Bibliothek verwendet wird, kann der Wert des Parameters dann angepasst werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Arraygrößen können nur mit Konstanten festgelegt, diese aber nicht als Parameter an den Baustein übergeben werden.
😞 🤷‍♂️
Also entweder beschreibt man eine Variable mit dem Wert der Konstanten und übergibt diese dann an den Baustein oder man verwendet direkt im Baustein die Konstante.
 
Ich habe bereits mit Serialize und Deserialize die Daten in ein Array of Bytes umkopiert. Und habe die Daten Kopieren und Löschen können. Ich habe jedoch im Baustein ein Array [0-50] of Bytes angelegt. Ich würde dieses jedoch gerne Universell gestalten, sodass ich den Baustein nicht mehr anfassen muss, wenn sich die Daten erhöhen.

Hat jemand eine Idee wie ich das lösen könnte?
Was spricht dagegen das Array als Undef [*] an INOUT des Bausteins zu übergeben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei einer SPS habe zumindest ich bei so einem Konstrukt erhebliche Bauchschmerzen. Was passiert, wenn der Speicher für die Arraygröße nicht mehr ausreicht?
Ich stehe dynamischer Speicherzuweisung bei einer SPS sehr kritisch gegenüber.
Die Zuweisung erfolgt nicht dynamisch sondern zum Zeitpunkt der Programmierung.
 
Die Zuweisung erfolgt nicht dynamisch sondern zum Zeitpunkt der Programmierung.
So kenne ich das beim großen S eigentlich auch.
Du hälst den eigentlichen Speicher extern, übergibst ihn als InOut & veranstaltest im Baustein ausschließlich das Daten schubsen.
Also so wie es z.B. der LGF_FIFO macht.
@Lucky0815 schau dir mal den Baustein an.
Vllt reicht der schon für deine Zwecke oder kann ohne großen Aufwand aufgebohrt werden.
PS:
Bei Classic konnte man mit Konstanten für die Arraygröße noch rechnen, geht bei TIA (zumindest mit S7-1x00) auch nicht mehr.
Das verstehe ich jetzt nicht ganz...
Wenn du ein per Konstante definiertes Array hast, kannst du mir der Konstante rechnen.
Für variable Arrays stehen Upper/Lower_Bound & CountOfElements zur Verfügung.
Was ging im Classic was jetzt nicht mehr geht?
 
Bei einer SPS habe zumindest ich bei so einem Konstrukt erhebliche Bauchschmerzen. Was passiert, wenn der Speicher für die Arraygröße nicht mehr ausreicht?
Ich stehe dynamischer Speicherzuweisung bei einer SPS sehr kritisch gegenüber.
Bei Undefiniterten Array Eingängen muss man ja trotzdem ein definiertes Array anhängen, man muss nur den Baustein nicht umbauen um eine andere Arraylänge anzuhängen.
Aber ich gehe davon aus dass er zum Zeitpunkt der Programmerstellung weiss, wie lange das Array sein muss und das nicht tatsächlich erst zur Laufzeit generiert werden muss. Da hätte ich auch erhebliche Bauchschmerzen.
Ich mach mir schon ins Hemd wenn ich Daten zur Laufzeit auf die Speicherkarte auslagern muss.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Classic konnte man mit Konstanten für die Arraygröße noch rechnen, geht bei TIA (zumindest mit S7-1x00) auch nicht mehr.
Das verstehe ich jetzt nicht ganz...
Wenn du ein per Konstante definiertes Array hast, kannst du mir der Konstante rechnen.
Bei Classic konnte ich z.B. 2 Konstanten für ein Spielfeld festlegen: Länge l=6 und Breite b=7 und konnte damit zum Einen ein 2-dimensionales Array Spielfeld daraus festlegen und zum Anderen ebenso eine Dimension vom Array Spielzüge [1..l*b] berechnen, jetzt muss ich 3 Konstanten deklarieren: Länge, Breite, Anzahl=Produkt von beidem, aber halt selbst berechnet.

Als konkretes Beispiel dazu ein Auszug der Array-Deklaration aus "4 gewinnt" in Classic (war im alten Forum mal online, scheint aber beim Umzug untergegangen zu sein):
Code:
CONST
    SPALTEN:= 7;                                                // Anzahl Spalten
    ZEILEN := 6;                                                // Anzahl Zeilen
END_CONST

VAR_IN_OUT
    Spielfeld:  ARRAY [1 .. SPALTEN, 1 .. ZEILEN] OF INT;       // Spielfeld
    Spielzuege: ARRAY [1 .. SPALTEN * ZEILEN, 0 .. 3] OF INT;   // Speicher Spielzüge (max. Spalten x Zeilen,
                                                                //                          0 Ablauf Spielzug
                                                                //                                  0 = Spaltenwahl
                                                                //                                  1 = Zugausführung für HMI
                                                                //                                  2 = Auswertung
                                                                //                                  3 = Zug komplett
                                                                //                                  4 = Spielgewinn
                                                                //                          1 enthält Spalte
                                                                //                          2 enthält Zeile
                                                                //                          3 enthält Spieler)
END_VAR
 
Zuletzt bearbeitet:
Bei einer SPS habe zumindest ich bei so einem Konstrukt erhebliche Bauchschmerzen. Was passiert, wenn der Speicher für die Arraygröße nicht mehr ausreicht?
Ich stehe dynamischer Speicherzuweisung bei einer SPS sehr kritisch gegenüber.

Ich wüsste jetzt auf Anhieb nicht, welche SPS das Feature hat, mit dynamische Arrays zu arbeiten? Wünschen würde ich sowas schon manchmal ;)

Werden Arrays an der Bauabschnitstelle als Arrays mit undefinierter Größe als übergabeparameter definiert, so muss trotzdem an dem Übergabeparameter eine Array mit fest definierter Größe verschaltet werden. Über UpperBound und LowerBound lassen sich dann die Arraygrößen auslesen.
 
:unsure:
Sprechen die nicht wieder gegen Bibliotheksbausteine?

Nicht, wenn man das Array als Bausteinparameter übergibt. Entweder bei optimierter Programmierung mit dem [*], wie in #10 vorgeschlagen wurde. Oder bei nichtoptimierter Programmierung mit festen Grenzen. Ich übergebe in einem wahrscheinlich ähnlichem Fall ein Array von 64kB. Der versionierte FB muss dabei nicht geändert werden.

Je nach Anwendung wäre eventuell auch ein DB vom Typ "ARRAY_DB" ganz interessant.
 
Zurück
Oben