Beckhoff SCL - Dynamicshe Bitadressierung

fabianpru

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Ich bin seit einiger Zeit stiller Mitleser und habe mir nun vor einigen Tagen endlich meinen Account erstellt.
Mein Name ist Fabian, 25, aus dem schönen Österrreich.
Kleine Grundlagenfrage:
Ich will die Bits eines Bytes auf einzelne Bits ummappen, da ich das Byte leider nicht direkt mit den IOs verlinken kann (oder gibts hier auch einen Weg).
Ich hab also einen UDT mit einem Array[0..7] OF BOOL, welche ich einfach nur gerne durch eine for-Schleife jagen würde.
Auf die Bits des Bytes wollte ich mittels Byte.Bitnummer zugreifen, was auch funktioniert, wenn ich die Bitnummer direkt eingebe. Nehme ich dafür aber eine Variable her, also im Sinne von Byte.i spuckt mir TwinCAT direkt einen Fehler.

Funktioniert mein Plan so einfach nicht, oder habe ich einen Denkfehler?

LG und danke schon im Vorhinein
Fabian
 
Ich bin mir bei twincat nicht sicher, aber bei Jetter geht das auch nicht. Ich hab das über eine case Anweisung gelöst.

Code:
for i := 0 to 7 by 1 do
  case i of
   0: ... break;
   etc
  end_case;
end_for;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort!
Leider trifft das nicht ganz meinen Fall, ich poste hier einfach mal das Snippet:

Die Variable Bits ist der UDT, der ua auch das Array[0..7] enthält.

FOR i = 0 TO 7 DO
GVL.S7 Bits.B := GVL.S7_IB_00.i;
END_FOR

Wenn ich das i beim S7_IB_00 durch eine absolute Zahl ersetzte habe ich kein Problem, dynamisch funktionierts leider nicht. Wenns nicht geht mach ichs einfach per C&P, sind ja nur acht Zeilen :)
 
Das i wird halt kein konstanter Wert sein. Ich denke mal, dass das für den Zugriff auf das Bit benötigt wird.
Es sollte aber vielleicht einer Union gehen. Schau mal hier :)
 
Ein Bit-Struct ist schon elegant, vor allem auch später für die Online-Anzeige. Falls Du in Deinem Programm auch auf das ganze Byte zugreifen musst, kannst Du eine Union aus einem Byte und einem Bit-Struct nehmen.
Daneben gibt es aber auch die Möglichkeit, einzelne Bits eines Bytes auf Ausgänge zu mappen. Du musst dazu im Mapping-Dialog bei "Zeige Variablentypen" statt "Passende Grösse" "Alle Typen" anwählen und nach dem Mappen des ersten Bits bei "Zeige Variablen" "Nur unbenutzte" abwählen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Jetter kannst du aber mit den Befehlen Bitset und Bitclear und einer Variablen die einzelnen Bits lesen bzw. beschreiben. Funktioniert prima.
Code:
nlBitnr := 5;
Bitset(Byte, nlBitnr);
Hallo Drain,

Ja die Befehle kenn ich. Wo man allerdings aufpassen muss, die Befehle verwenden tasklock bzw. Taskunlock, was je nach Konstellation auch zu einem tasklock Fehler auf der CPU führen kann.
 
Ich schließe mich meinen Vorredner an,
ich habe bei der Hardwareverlinkung mit einer Ventilinsel aehnliches gemacht mit einer Union.
Einmal die Hardware Addressierung ueber die vorgebenen 3 Bytes verlinkt.
Hat auch den Vorteil, das bei spaeteren Aenderungen keine Aenderung an der Hardwareverlinkung notwendig ist.
Dann eine Structur mit Namen als Bits. Diese greifen durch die Union auf die richtige Hardware Adresse bzw.
aendern die verlinkten Bytes entsprechend ab.
1652782626822.png
Schaut so aus und funktioniert.
Die Bytes einfach per Multilink mit Hardware verbinden.
Als Nachtrag, das ist die Union
1652782605954.png

Vielleicht hilfts

Gruß
Roman
 
Zurück
Oben