Array Elemente benennen

hicom500

Level-1
Beiträge
47
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
ich habe hier ein Array um per Modbus Variablen im HMI zu Lesen und zu Schreiben.
Gibt es eine praktikable Möglichkeit die Elemente des Arraya mit einem symbolischen
Namen zu versehen und anzusprechen? Also nicht per "mbReadCoil[132]" sondern z.B. mit "Schalter_1"


Gruß
Jürgen
 
Es gibt leider keine associative arrays gem. IEC 61131-3. Was du aber theoretisch machen könntest, wäre den Wert "mbReadCoil[132]" in eine Variable zu schreiben. Oder ein zweites Array anlegen, wo du die Namen an die entsprechenden, identischen Positionen einschreibst. Dass dann "sReadCoil[132]" den String "Schalter_1" enthält.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Du könntest zum Indizieren eine Enumeration verwenden. Ist schon wesentlich schöner als nur mit der Zahl.

Code:
TYPE SchalterEnum:(
  first := 0,
  schalter1 := first,
  schalter2, 
  schalter3,
  last := schalter3
);
END_TYPE

Das angenehme hier ist, du kannst mit der neuen Codesys Version (genaue kann ich nicht sagen) bestimmte Warnungen ausnehmen. Es gibt nämlich eine die meldet, dass der selbe Enum Wert zweimal zugewiesen wird. Was ja eigentlich Sinn macht aber hier müsste ich einmal ein Index und einmal ein Intervall Enum anlegen, falls ich einmal nur indizieren und einmal über alle Schalter iterieren möchte.

Der Zugriff sieht jetzt so aus:

Code:
sReadCoil[SchalterEnum.schalter2]

Im Fall von einer Schleife würde das dann so aussehen:

Code:
FOR count:=SchalterEnum.first TO SchalterEnum.last BY 1 DO
sReadCoil[count] := TRUE;
END_FOR

Sg
seehma
 
Erstmal vielen Dank für alle Antworten... obwohl ich noch nicht alles verstanden habe.:confused:

Bin hier mit TwinCat 2 unterwegs, glaube da geht das nicht mit der UNION Geschichte.

#Jürgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
also Unions gehen bei twincat 2.

Das mit der Union ist eigentlich recht einfach, hier ein Beispiel:

Du legst ein Union an z.B.:
Code:
TYPE myUnion :
UNION
  diagCode : WORD;
  diagStruct : MyDiagStruct;
END_UNION
END_TYPE

dann brauchst du noch die Struktur:

Code:
TYPE MyDiagStruct :
STRUCT
  diagByte1 : BYTE;
  diagByte2 : BYTE;
END_STRUCT
END_TYPE

Du kannst dann in das Word (oder auch eben in das Byte Array) etwas reinschreiben und dann gemütlich über die Struktur als einzelne Bytes auslesen.
Gleiches eben mit einem Struct aus Bits.

Code:
myUnionVar : myUnion;
dummyByte : BYTE;

myUnionVar.diagCode := 156;

dummyByte := myUnionVar.diagByte1;

Ich hoffe das ist so verständlich

Sg

seehma
 
Ich habs grad selbst mit erschrecken festgestellt, es gibt keine Unions in Twincat 2. --> Sorry for that
War mir ganz sicher, dass wir das bei unseren alten Maschinen auch schon verwendet haben...
 
Das is ja mal geil...kannt ich noch gar nicht. Damn, jetzt muss ich mich mal in Enumerationen und Union einlesen und damit experimentieren...
Das lohnt sich auf jeden Fall, vor allem wenn man mit Unions Bit-Structs auf Bytes, Words usw. legt. Ich habe das in meinem aktuellen Projekt konsequent durchgezogen und nicht bereut. Schon beim Programmieren ist es ganz angenehm, wenn nach Eingabe von "Variablenname.Bits." das Auswahlfenster mit den einzelnen Bitvariablen erscheint. Noch mehr Zeit spart man aber bei der IBN, weil man Bitwerte nicht mehr aus Hex- oder Binärzahlenwerten heraussuchen muss. Da holt man die Zeit für das Deklarieren der Bit-Structs und Unions locker wieder raus.
 
Zurück
Oben