TIA Variant teilweise umkopieren

Zuviel Werbung?
-> Hier kostenlos registrieren

siehe Beispiel 2. So ungefähr hab ich mir das vorgestellt. Nur das hier Quell und Zieldatenstruktur unterschiedlich sind und bei halt die Datenstruktur zum Zeitpunkt der Programmierung noch unbekannt ist...
 

Beispiel 2.

Unterschied: Hier sind Quell und Zieldatenstruktur unterschiedlich. Bei Dir ist die Datenstruktur zum Zeitpunkt der Implementierung nicht bekannt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alle Parameter sind in einer Struktur (natürlich PLCD) gespeichert.
Dann macht man da übicherweise ein ARRAY OF xxx und kann dann mit einer simplen indirekten Adressierung umeinanderkopieren, egal wie die Struktur intern genau aussieht. Das ist in SCL dann ein Einzeiler. Nicht so kompliziert denken und programmieren!
 
Sind die zu kopierenden Daten jedes mal von einem anderen PLC-Datentyp oder Struktur?

Wenn ja, und Du es so allgemein wie möglich halten willst, sehe ich nur die Möglichkeit die Daten per Variant zu übergeben und dann per Serialize ein Array of Byte zu erzeugen. Dieses Array deklarierst Du als temp. Die Länge solltest Du so groß wählen, wie die Daten sind. Ist das Array zu groß, werden die Quelldaten trotzdem kopiert. Musst halt abwägen wie groß die Daten max sind. Wenn 1. Element der Datenstruktur ein String ist, steht aktuelle Stringlänge im Byte 0 des tem Array of Byte. Dann weisst ja, wie viele Bytes davon Du als String auswerten musst.... Um dann alle Daten komplett in die Zieldatenstruktur zu kopieren, kann mittels Deserialize das Array of Byte in die Zieldaten kopiert werden.... Serialize und Deserialzebesitzen zusätzlich Diagnosestatus. Damit kannst entsprechend reagieren, wenn Daten zu klein oder zu groß sind. Prinzipiell solltest aber das temp Array of Byte zu groß wählen, dann sollte Alles so klappen wie Du es willst.

Weitere Kriterien wären:

Soll symbolisch rein programmiert werden, optimiert?
Ist AWL / Any Pointer "erlaubt"?
Sonstige Vorgaben, Styleguides etc...?

Sollte es rein symbolisch, optimiert, SCL, ohne Any etc. sein, ist obige Beschreibung die einzigste mir bekannte Möglichkeit. Mir wäre auch nicht bekannt, dass es der Variant Poiunter hergibt, auf dessen Elemente einzeln zuzugreifen....

Ist immer die Frage, ob sowas Sinn macht? Ansonsten, wenn die Anzahl der Datestrukturen nicht allzu groß ist, wäre vlt. eine Ausimplementierung mit den einzelenen Datentypen sinnvoller. Wie gesagt, diese Serialize und Deserialize Anweisungen sind laufzeittechnisch mehr als nicht optimal.
Danke für die ausführliche Antwort.
Langsam zweifle ich daran, ob nicht bereits die optimalste Lösung umgesetzt wurde.
Ich schaue mir noch den Link an, dann entscheide ich, wie ich weiter vorgehe.
Dann macht man da übicherweise ein ARRAY OF xxx und kann dann mit einer simplen indirekten Adressierung umeinanderkopieren, egal wie die Struktur intern genau aussieht. Das ist in SCL dann ein Einzeiler. Nicht so kompliziert denken und programmieren!
Den Vorschlag hab ich nicht verstanden. Wenn ich am Eingang ein Array [0..100] of Byte anlege, kann ich doch nicht eine Struktur "PLCD_Parameter" übergeben, auch wenn dieser nur 50 Byte groß sein sollte. Oder wie sollte ich deinen Vorschlag verstehen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Den Vorschlag hab ich nicht verstanden. Wenn ich am Eingang ein Array [0..100] of Byte anlege, kann ich doch nicht eine Struktur "PLCD_Parameter" übergeben, auch wenn dieser nur 50 Byte groß sein sollte. Oder wie sollte ich deinen Vorschlag verstehen?
Nen Array of UDT...
und das UDT passt dann der jeweilige Projektbearbeiter an. So macht man das üblicherweise...
 
Richtig, im jeweiligen Projekt schon, aber nicht mir, der jetzt gerade den Baustein dazu vorbereitet. Verstehe nicht ganz, worauf du hinaus willst.
PLCD bedeutet, wie @hucki schon sagte, PLC-Datentyp. Hier zu finden:

Anhang anzeigen 58238
Wenn Ihr dann doch in jedem Projekt dem UDT den gleichen Namen gebt “Artikel“, dann steht da in einem Projekt Name:String(30), Artikelnummer:Byte drin, im nächsten dann Name:String(50), Artikel:Int, Typ:INT. Zum Beispiel. Jetzt programmierst Du mit Artikel.Name Deine Funktion aus und forderst am Baustein den UDT an.
Sobald jetzt für ein Projekt der UDT individualisiert wurde, wird ja Dein Baustein mit übersetzt und in dem Moment weiß er, ob er mit String(30) oder String(50) arbeiten muß. Du mußt das im Moment nicht wissen, da Du rein symbolisch programmierst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist natürlich die einfachste Möglichkeit. Allerdings hatte ich gedacht, die Datenstruktur soll kopiert werden, wobei Quell- und Zieldaten unterschiedliche Datenstrukturen sind. Aber ja, so geht es in Deinem Fall dann....
 
Zurück
Oben