Step 7 Bits aus einem Byte setzen in scl

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich fürchte aber, dass das dein Problem nicht wirklich löst. Dein Problem, wahrscheinlich auch bei dem WORD ist, dass du bei Perepherie nicht den aktuellen Inhalt laden kannst. Es gibt hier dann also nur die Möglichkeit, dass du von Anfang an mit einer statischen Variable arbeitest (z.B. Merker), die manipulierst und die dann am Ende auf dein QB bzw. QW schreibst ...
 
Byte to bits gibt es doch Bausteine?in der Oscat Bibliothek.
Die Ausgangsbits kannst du dann beliebig manipulieren.
Byte geht rein->8 Bit kommen raus.
 
Ich fürchte aber, dass das dein Problem nicht wirklich löst. Dein Problem, wahrscheinlich auch bei dem WORD ist, dass du bei Perepherie nicht den aktuellen Inhalt laden kannst. Es gibt hier dann also nur die Möglichkeit, dass du von Anfang an mit einer statischen Variable arbeitest (z.B. Merker), die manipulierst und die dann am Ende auf dein QB bzw. QW schreibst ...
Hat doch funktioniert, also es passiert genau das was es soll . Aber wofür steht jetzt die 2
 
Wenn es das so dann ja tut ist es ja gut - die Frage ist halt nur (nach wie vor) : was hat nicht gut funktioniert (also konkret : wie hat sich das ausgewirkt und wie hast du das konkret programmiert) ?
 
1) Was genau willst du steuern? Einen Ausgang in einer Analogausgangskarte, ein Byte oder Word in einem Profibus-Gerät oder in einem Frequenzumrichter? Was bedeutet dieses Byte oder Word? Wie ist die Ausgangsadresse PQB/PQW... in HW Konfig projektiert?
Meist ist es nicht egal, ob man auf ein Peripherie-Ausgangsbyte oder -word ausgibt. Da schreibt das Gerät oder Modul vor, ob das ein Byte- oder Wordzugriff sein muss. Rumprobieren ist eher kein gezieltes Programmieren.

2) In Peripherie-Ausgangs-Bytes/Words kann man nicht einzelne Bits manipulieren. Man muss das Bitmuster in einer Byte/Word-Variablen (Merker, DB, TEMP, STAT) zusammenbasteln und dann gesamt als Byte oder Word an das Peripherie-Ausgangs-Byte/Word ausgeben (z.B. MOVE).

3) Du schreibst, wenn I0.0 = TRUE ist, dann soll ein bestimmtes Bit gesetzt weden. Dieses Bit soll dann für alle Ewigkeit gesetzt bleiben? Oder wann soll es rückgesetzt werden?

4) Gundwissen Programmieren: Was in jeder Programmiersprache und auch in jeder SPS geht:
- Bits in Variablen setzen kann man durch OR-Verknüpfung mit einer Bitmaske
- Bits in Variablen rücksetzen kann man durch AND-Verknüpfung mit einer Bitmaske
- Bits in Variablen invertieren kann man durch XOR-Verknüpfung mit einer Bitmaske
- den Zustand von Bits in Variablen lesen kann man durch AND-Verknüpfung mit einer Bitmaske

Die Bitmaske darf ein oder mehrere Bits = 1 haben, je nachdem, ob man nur ein einzelnes Bit oder gleich mehrere Bits bearbeiten will. Die 1-Bits in der Bitmaske bestimmen, welche Bits in der Variable bearbeitet werden - die Bitmaske "maskiert" die Ziel-Bits.

Code:
#wBitMask := 1; //Bitmaske für Bit 0 (%X0)

#wMyVar := #wMyVar OR #wBitMask;          //setzt Bit 0
#wMyVar := #wMyVar AND NOT (#wBitMask);   //rücksetzt Bit 0
#wMyVar := #wMyVar XOR #wBitMask;         //invertiert Bit 0
#xMyBool := (#wMyVar AND #wBitMask) <> 0; //Bit 0 lesen/kopieren
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man eine allgemeingültige Lsg. will kann man den Baustein
BytetoBit nehmen.
Der Code muss bedingt umgeändert werden in dem Fall. Der Eingang der peripherie muss 1 sein.
das der Code ausgeführt wird(Freigabe im Baustein)
Am Ausgang erscheinen 8 Bits die man auf ein Merkerbyte legt.(als Bsp.)
Danach setzt bzw. rücksetzt man diese Bits auch wieder auf diese Bedingung.
Das kann man sogar in AWL in einem Netzwerk machen.
Als letzter Akt kommt dann der bedingte Move befehl vom MB auf das PAB.
 
1726119916410.png

Ist das nicht genau das, was der TE sucht?
Das sollte auch für Eingänge und Ausgänge bitweise funktionieren.... Hat es zumindest damals in Step7 mal mit eckigen Klammern E[B,X]...
 
Er muss alles im Peripheriebereich machen.
Er muss Einzelbits im PB setzen bzw. rücksetzen in abhängigkeit eines peripheren EingangsBits.

Wenn es nicht viel ist würde ich es mit einer Maske machen wie DPDP es vorschlägt.
mit den Masken L2#00000001 oder L2#11111110.

Die eine maske setzt mit Oderword die andere rücksetzt mit UndWord.Ich weiss es jetzt nur nicht ob das mit Bytes geht in S7 Klassik.
 
Das geht auch mit Bytes - hat er ja nach meinem Vorschlag umgesetzt. Das Problem dabei ist in dem Fall ja nur, dass durch diese Zuweisung alle anderen Bits dann automatisch FALSE werden ...
Ich denke mal, dass das auch das Problem ist weshalb er bei einer WORD-Behandlung dann Probleme bekommt ...
 
Zurück
Oben