Größe UDT in SCL

Larry Laffer

Super-Moderator , User des Jahres 2008-2009
Teammitglied
Beiträge
14.468
Reaktionspunkte
3.305
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich würde gerne in SCL die Größe eines UDT in Bytes (oder WORD) ermitteln.
In AWL wüßte ich eine Lösung (Pointer subtrahieren), aber die kann ich in dieser Form in SCL nicht einsetzen. Vielleicht hat ja jemand noch eine gute Idee. Ich würde ungern eine AWL-Function in mein SCL-Script zusätzlich einbinden ...
 
Hallo,
ich würde gerne in SCL die Größe eines UDT in Bytes (oder WORD) ermitteln.
In AWL wüßte ich eine Lösung (Pointer subtrahieren), aber die kann ich in dieser Form in SCL nicht einsetzen. Vielleicht hat ja jemand noch eine gute Idee. Ich würde ungern eine AWL-Function in mein SCL-Script zusätzlich einbinden ...

Genau so etwas suche ich auch gerade. hast Du mittlerweile eine Lösung gefunden?


Gruß Schumi91
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Möglichkeit wäre denn UDT in die Temporären bzw. Statischen Variablen einzubinden und die Beschaltung von außen als ANY zu deklarieren somit kann die Länge abgefragt werden. Der UDT müsste dann allerdings noch umkopiert werden auf TEMP bzw. STAT.
 
Und die Fußgängervariante wäre es im UDT als Kopf die Byte/Word Länge in einen INT zu legen und da einen entsprechenden Initialisierungswert einzutragen. Wo bei mir die Lösung selbst nicht gefällt.
In ST (CoDeSys) würde ich einfach mit SIZEOF die Länge ermitteln.

SiemensWunschliste := SiemensWunschliste + SIZEOF;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist der UDT direkt in der Struktur des FB bzw. FC eingebunden z.B. IN, OUT usw... ? MfG Daniel

Ja, ist als Temp Variable und als in_out deklariert. Folgendes habe ich vor. Es soll ein Mux gebaut werden, der aus einem DB mit Datensätzen einer Struktur in einen Mux DB kopiert. Da ich nicht jedes mal den Baustein ändern will, wenn die Structur sich ändert, wollte ich die Länge wie unter AWL (Pointer sub.) berechnen. Da ich noch nicht mit Pointer unter SCL gearbeitet habe, fällt mir keine Lösung ein.


Gruß Schumi91
 
Du musst die AnyVariable mit der AT Zuweisung zerpflücken!

AnyPointer
AT Adresse : STRUCT // Adresse (Any-Pointer siehe Any-Aufbau)
Id : BYTE; // Id
Datentyp : BYTE; // Datentyp
Laenge : WORD; // Laenge
DbNr : WORD; // Nummer
Adresse : DWORD; // Adresse
END_STRUCT;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, ist als Temp Variable und als in_out deklariert. Folgendes habe ich vor. Es soll ein Mux gebaut werden, der aus einem DB mit Datensätzen einer Struktur in einen Mux DB kopiert. Da ich nicht jedes mal den Baustein ändern will, wenn die Structur sich ändert, wollte ich die Länge wie unter AWL (Pointer sub.) berechnen. Da ich noch nicht mit Pointer unter SCL gearbeitet habe, fällt mir keine Lösung ein.

Hallo Schumi,
da fällt mir schon noch etwas schönes dazu ein :
Du baust dir einen FB, der dein ARRAY_of_myUDT verwaltet. Dieser FB hat (unter Anderem) einen IN_Parameter "Index_ausgeben" und einen IN_OUT_Parameter vom Typ myUDT.
Wenn du nun einen bestimmten Block benötigst, dann sagst du einfach über den FB, das er den UDT übergeben bzw. wieder zurücklesen soll. Das wäre von der Programmierung etwas eleganter.
Falls du das im Programm öfters machen möchtest, so kannst du den FB mit dem gleichen I-DB ja öfter aufrufen. Ist kein Problem und spart sogar Bearbeitungszeit gegenüber dem Lade-Transferiere-FC.

Vielleicht ist das ja was für dich ...

Gruß
LL
 
Bleibt noch zu erwähnen, dass man nach dem Vorschlag von xhasx und Daniel die UDTs nicht als Parameter "UDT" verwendet, sondern einen Pointer als ANY darauf setzt. Dann kann man mit dem AT-Struct die ANY-Pointer verändern und beispielsweise adressierte Strukturen mittels SFC20 kopieren.

Falls jedoch mit UDTs als Parameter-UDT gearbeitet wird, kann man die kompletten Strukturen ganz einfach zuweisen, wie z.Bsp. UDT_OUT:=UDT_IN. Auf die Adressen hat man dann allerdings keinen Zugriff, wüsste jedenfalls nicht wie. Wahrscheinlich liegt hier das Problem. Verwendet einfach ANY als Parametertyp.


Gruß, Onkel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mit den Any's ist recht und gut - wenn man die nicht zwei Ebenen tiefer weitergeben will... Da wird's dann wieder tricky!!! Ich sag nur Temporaere Any. Das ist ech noch ne Siemens Lücke.
 
Zurück
Oben