TIA Variant teilweise umkopieren

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

Ich sitze gerade vor einem Problem.
An einen Baustein möchte ich eine ungekannte Struktur (Ansammlung von mehreren Datentypen) übergeben. Dieser wird dort umkopiert etc. Dafür habe ich am Bausteineingang ein InOut Variant angelegt.
Einzig, was ich von der Struktur weiß, ist, dass ein String am Anfang steht. Diesen möchte ich gern separat auslesen und ändern.
Meine erste spontane Idee war, einfach eine AT,-Struktur drüber zu legen, geht bei Variant aber leider nicht.
Da ich die Datenlänge der Struktur nicht kenne, kann ich auch kein Array anlegen, worein ich den Inhalt kopieren kann. Hier wäre eine Funktion hilfreich, die so weit kopiert, wie der Zielspeicher groß ist. Ist der zu klein, gehen Daten eben verloren... (in diesem Fall für mich egal).
Eine weitere Idee wäre der Slice-Zugriff, da bin ich mir aber nicht sicher wie jnd ob das funktioniert...
Am Ende habe ich zur Zeit keine passende Idee, vielleicht gibt es ja noch einen ganz anderen, besseren Weg. Vorgabe ist nur, dass dieser String nicht nochmal zusätzlich als Input angelegt wird.

Zu meiner Umgebung:
Ich benutze TIA V17.

Ich hoffe, ich hab es halbwegs verständlich erklärt und alle Infos aufgeführt. Ansonsten gerne nochmal anmerken ;-)

Vielen Dank schonmal und vor allem:
FROHE WEIHNACHTEN!! 😉
 

ssppss

Member
Beiträge
13
Punkte Reaktionen
0
Handelt es sich lediglich um einen String, dann nutze Move_String unter erweiterte Anweisungen.

Handelt es sich um weitere Daten, deren Datenstruktur erst zur Laufzeit bekannt ist, nutze SERIALIZE und DESERIALIZE in Reihe.
 

ssppss

Member
Beiträge
13
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Sorry 1. mal lesen war im Schnelldurchgang.

Detailiertere Antwort:

Serialize um Byte Strom zu erzeugen.
1. Byte des Byte Stroms enthält Stringlänge.
Deserialize um Byte Strom in Zieldatenstruktur zu kopieren.

Achtung wegen Laufzeit. Liegt i.d.R. im einstelligen ms Bereich.

Sollten zum Zeitpunkt der Implementierung detailliertere Kenntnisse zur Datenstruktur bekannt sein, können u.U. diverse weitere Systemanweisungen zur Laufzeitoptimierung eingesetzt werden....
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
Top danke schonmal, werd ich testen.
Hatte Serialize schon im Blick, aber die Beschreibung in der Hilfe anders verstanden.
 

NBerger

Well-known member
Beiträge
878
Punkte Reaktionen
231
Wenn die Struktur bekannt ist dann kannst du doch eine Referenz auf das Variant machen.

Dann kannst du auf alle Elemente des Variant einzeln zugreifen.
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Wer macht denn die Vorgaben? Ist das eine Hausaufgabe wo der Lehrer eine fertige Lösung hat und es auf diese hinauslaufen soll, oder woher kommt sowas?
:ROFLMAO::ROFLMAO: ne Hausaufgabe nicht ganz.
Geht um eine Umsetzung in unseren Maschinen. Die Vorgabe habe ich mir selbst gemacht, weil ich es meinen Kollegen so leicht wie möglich machen möchte.
Wenn die Struktur bekannt ist dann kannst du doch eine Referenz auf das Variant machen.

Dann kannst du auf alle Elemente des Variant einzeln zugreifen.
Die ist mir nicht bekannt, von Maschine zu Maschine ist die immer anders.
Ich werde es morgen früh mit Serialize probieren, klingt gut.


Vielen Dank für Eure Hilfe.
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
Guten Morgen,
habs mir gerade angeschaut, entweder hab ich nen Denkfehler oder Serialize bringt mich auch nicht weiter.
Muss man für Serialize ein mindestens genauso so großes Array bereitstellen?
Das wird in meinem Fall schwer, da ich die Struktur und damit die Länge ja nicht kenne.
 

NBerger

Well-known member
Beiträge
878
Punkte Reaktionen
231
Was ist denn bekannt?
- Byte 0 aktuelle Länge des Strings ?
- Byte 1 maximale Länge des Strings?
- Byte 2 bis Byte 0/Byte 1: String?
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
bekannt ist nur, dass am anfang der string steht. Die Länge hätte ich mir dann aus dem Header ausgelesen.
Ich brauch quasi einen FILL-Baustein für Variant. Kopiere die Daten an IN, bis OUT voll ist oder von mir aus auch, wenn IN komplett kopiert wurde.
Dann könnte ich aus dem Array alles rausholen, was ich brauche.
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
eine Sache hätte ich noch:
Den Datentyp Variant benutze ich nur, weil ich gelesen habe, dass er schneller sein soll. Würde ich das mit Any machen, könnte ich den Pointer verlegen und manipulieren...
Falls es also eine bessere Möglichkeit als Variant gibt, ist das auch super (performanceschonend)
 

ducati

Well-known member
Beiträge
6.662
Punkte Reaktionen
1.391
Den Datentyp Variant benutze ich nur, weil ich gelesen habe, dass er schneller sein soll.
Hast Du den extrem zeitkritische Anwendungen? In der Regel ist es bei einer SPS sinnvoller, einen Programmierstil zu verwenden, den auch noch Dein Nachfolger in 5 Jahren ohne Probleme nachvollziehen kann.
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Hast Du den extrem zeitkritische Anwendungen? In der Regel ist es bei einer SPS sinnvoller, einen Programmierstil zu verwenden, den auch noch Dein Nachfolger in 5 Jahren ohne Probleme nachvollziehen kann.
Gebe ich dir Recht, bin auch kein Fan davon immer das Neuste vom Neusten zu benutzen.

Mein Baustein ist eine Artikelverwaltung. Dieser kopiert aus einem Array von sagen wir 0..100, je nach Auswahl, eine Struktur um. Diese Struktur kann schnell mal 1000 Byte groß sein. Genauso wird die ausgewählte Struktur immer wieder in dem Array gesichert.

Aktuell ist es mit BLKMOVE gemacht. Damit geht kein optimierter Baustein. Denke schon, dass es Sinn macht, den Baustein zu optimieren...
 
Zuletzt bearbeitet:

JSEngineering

Well-known member
Beiträge
1.429
Punkte Reaktionen
399
Um nochmal auf die Frage von @PN/DP zurückzukehren:
Wenn Du nicht weißt, was in der Struktur drin steht, ist der Rest hinter dem String doch für Dich nur Datenmüll, den Du entsorgst, oder nicht? Oder schickst Du den rest unverarbeitet weiter?
Wenn der Rest doch Datenmüll ist, warum sollte man das verschicen, wenn Du von 1kB Daten sprichst...
Du möchtest es Deinem Kollegen einfach machen, machst selbst aber Klimmzüge... Was ist für ihn so schwierig, nur den String zu schicken? Entlastet den Bus, entlastet das Programm, entlastet Dich....
Kläre uns doch noch etwas mehr über die Hintergründe auf....
 
OP
F

Fragsau

Member
Beiträge
24
Punkte Reaktionen
1
HI, sorry, wenn ich es noch nicht deutlich genug erklärt hatte.
Es ist ein Baustein, der Artikelparameter umkopiert, je nachdem welcher gerade angewählt wurde.
Alle Parameter sind in einer Struktur (natürlich PLCD) gespeichert. Diese ist aber immer unterschiedlich zu jedem Projekt.
Eine weitere Aufgabe des Bausteines ist, den Namen des ausgewählten Artikels anzuzeigen.
Dazu muss ich auf jeden Eintrag in dem Array zu greifen können und eben die, sagen wir, ersten 50 Byte rauskopieren.

Hoffe nun wird es etwas klarer :)

Das bedeutet aber auch, dass ich das komplette Array mit der "großen" Struktur am Baustein benötige.
 

JSEngineering

Well-known member
Beiträge
1.429
Punkte Reaktionen
399
Zuviel Werbung?
->Hier kostenlos registrieren
Es ist ein Baustein, der Artikelparameter umkopiert, je nachdem welcher gerade angewählt wurde.
Alle Parameter sind in einer Struktur (natürlich PLCD) gespeichert. Diese ist aber immer unterschiedlich zu jedem Projekt.
Dann sind aber doch die Artikelparameter im Projekt bekannt... Oder kopierst Du die anonym um? Was ist PLCD?
 

ssppss

Member
Beiträge
13
Punkte Reaktionen
0
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.
 
Oben