TIA "Array-VARIANT" schreiben lesen, index Zugriff

Gerri3d

Level-1
Beiträge
127
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin neu in der Variant Welt und versuche gerade über ein ByteArray (kommt über in/out in einen SCL FB rein) diesen vorerst mit 0 zu befüllen.
Hier stehe ich erstmals vor der Frage welche eine bewerte Methode ist.

Am Ende will ich diese Array wieder mit Werten befüllen.

Ich habe mir die Anzahl der Elemente bereits mit CountOfElements ermittelt.

Hat jemand einen Tipp.
=================================

Lösungen wie zB man kennt ja die Arraygröße usw sind nicht hilfreich. Ich über gebe den Array öfter mal und will den nicht an jeder Schnittstelle oder im Code dauernd angreifen wenn sich nochmal was ändert. Es wäre also auch eine Sicherheit um nicht in einen ungültigen Speicherbereich zu schreiben wenn das Programm sich selbst um die Arraygröße kümmert.
 
Hat jemand einen Tipp.

ja: gib die Programmierumgebung bekannt

ich impliziere TIAnn?

CountOfElements ist auf jeden Fall schon einmal nicht verkehrt.
Mit "IS_ARRAY" könntest Du noch prüfen, ob es sich um ein Array handelt.
Mit "TypeOfElements" bekommst Du den Datentyp der Elemente.

VG

MFreiberger
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das CountOfElements Thema hatte ich schon. TIA V14.

Ich habe nur Verständnisprobleme mit VARIANT selbst.

Eine Variable vom Typ Variant kann nur auf einen Übergabeparameter zeigen (stimmt das?)
Wie kann ich dann zB in einem FB den Wert lesen und schreiben der Variable auf die ich zeige (also den Variant dereferenzieren und den Wert dann in einen Int weiter verarbeiten)
 
Moin Gerri3d,

also, wenn Du das Array als IO-Variant an eine FC oder einen FB übergibst, dann kannst Du intern genau die Abfragen verwenden. Wenn Du ein Array an ein Variant übergibst, ist das Array in dem Variant immer nullbasiert.

Mit "CountOfElements" - 1 kannst Du also die obere Indexgrenze ermitteln.
Code:
FOR i := 0 TO AnzahlDerElemente - 1
    ;
END_FOR;

VG

MFreiberger
 
Das CountOfElements Thema hatte ich schon. TIA V14.

Ich habe nur Verständnisprobleme mit VARIANT selbst.

Eine Variable vom Typ Variant kann nur auf einen Übergabeparameter zeigen (stimmt das?)
Wie kann ich dann zB in einem FB den Wert lesen und schreiben der Variable auf die ich zeige (also den Variant dereferenzieren und den Wert dann in einen Int weiter verarbeiten)
dafür gibt es "VariantGet" und "VariantPut".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
was meinst du mit IO-Variant - ich denke als InOut deklariert
ja, genau das meinte ich.
wie mienst du nun ein Array in ein Variant übergeben?
beim Aufruf des Bausteins an einen Variant-Formalparameter vom Typ InOut ein Array übergeben.
Ich kenne das von CodeSys mit Reference. Hier ist das alles etwas einfacher aufgebaut
CoDeSys kenne ich nicht. Einfach ist nach meiner Erfahrung immer das, was man kennt ;). Wobei das natürlich nicht bedeutet, dass CoDeSys da nicht wirklich einfacher aufgebaut ist.
 
dazu benötige ich ja weiteres Varaint. Angenommen ich will auf ein "Array-Variant" in index 1 den wert 0 schreiben, dann benötige ich ein weiteres Variant in der mit dem Typ des Array Elements. Das würde meine FB Schnittstelle verkomplizieren.
nein, Du kannst direkt eine Variable mit dem Typ des ArrayIndizes antragen. An einen Variant-Eingang kannst Du alles dranschreiben, was Du willst.

Du solltest aber mit "TypeOfElements" prüfen, ob der Datentyp des ArrayElements mit dem Datentyp, den Du hineinschreiben oder herauslesen willst übereinstimmt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du willst ja ein ByteArray unbestimmter Größe übergeben. Das geht auch mit Array[*] of Byte als Datentyp.
Mit "LOWER_BOUND" und "UPPER_BOUND" kannst Du die Arraygrenzen (z.B. für den Einsatz einer FOR-Schleife) ermitteln.
 
Das Mit dem ARRAY[*] of war genau was ich gesucht habe. Nun fehlt mir nur noch eine Möglichkeit symbolisch einen BLKMOV zu machen (innerhalb eines FC) da ich ein ARRAY aus Byte habe und hier einige Daten vom TYP Word versteckt sind.

Unter Step7 gabe es den SFC20 denke ich, jedoch hat dieser mit Adressen gearbeitet.
Beckhoff hat hierfür eine Pointeroperation"varPtr := ADR(Tag)"
Wie löst man das bei TIA in SCL?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Gerri3d,

wenn Du die Array-Grenzen hast, kannst Du über eine FOR-Schleife gehen:
Beispiel:

Code:
FOR i := #limitLow TO #limitHigh BY 2 DO
    varWord[#i].%b0 := varByte[#i];
    varWord[#i].%b1 := varByte[#i + 1];
END_FOR;

VG
 
...wenn Du ein ByteArray hast und das in eine andere Struktur schreiben oder aus einer anderen Struktur lesen willst, guck Dir mal serialize und deserialize an...
 
var x : word;
var y : array[0..1] of byte;
==================
wie kann ich nun 1. aus den beiden bytes ein word schmieden (früher mit AT befehl)
und 2. im word lo und hi tauschen.

ohne pointer fällt mir das etwas schwieig
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hinweis: Variablennamen nicht mit Leerzeichen anlegen.

Das geht mit dem Slice-Zugriff:

"var x".%b0 ==> bezeichnet das Highbyte im Word
"var x".%b1 ==> bezeichnet das Lowbyte im Word

Code:
"var x".%b0 := "var y"[0];
"var x".%b1 := "var y"[1];
getauscht:
"var x".%b0 := "var y"[1];
"var x".%b1 := "var y"[0];

Für das Tauschen der Bytes kann man noch die Funktion "SWAP" verwenden. Es gibt auch noch andere Möglichkeiten, aber das führt hier wohl zu weit.

Slice:
bool ==> .%x0
byte ==> .%b0
word ==> .%w0

VG
 
Zuletzt bearbeitet:
Zurück
Oben