TIA Word zerlegen

Marcus 1988

Level-2
Beiträge
26
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Folgende Situation bzw. Problem,

ich hab eine Array of Word für HMI Meldungen angelegt und bräuchte nun aus all ganzen Wörtern alle 0 bis 7 Bits Meldungsbits zusätzlich für ein PLS System. Bit 8 bis 15 soll ignoriert werden.
Gibt es da die Möglichkeit alles auf einmal zu kopieren, kann auch "Wordweise" dann sein. Bin schon auf die Funktion Scatter gestoßen. Allerdings möcht ich die Variablen auf den DB wo ich sie ablege nicht als Array of Bool anlegegen sondern einfach 300 Bool und die Variblen dann auch Beschriften. (DB Daten Heizung)
Hab den Meldungs DB jetzt auf Nicht optimiert gestellt damit auch Zeiger gehen.
Hier wär mein Beispielcode mit den DB Daten Heizungs wie er sein Soll und dem Meldungs DB auf den die HMI greift.
BlkMove.PNG
funktioniert das so wie ich mir das Vorgestellt hab ? Der Code lässt sich nur vor Ort testen, da ich auf die PLC Sim nicht laden kann (Fehler beim laden in Baugruppe CPUcommon ) (Evtl brauch ich auch die ungeraden Bytes 1.0, 3.0 statt 0.0, 2.0 usw. )
Im Beispiel sind nur drei Wörter jetzt, aber werden schon noch mehrere.


Sonst bliebe mir nur noch die Möglichkeit alle Bits im Programm nochmal hinzuzufügen wie in Programm.png, was allerdings Aufwendig ist. Programm.PNG
 
Hmm, was treibst du da mit deiner S7-1x00? Zum kopieren von einzelnen Bytes BLKMOV verwenden, aber Bits nochmal einzeln extrahieren ist zuviel Arbeit? :unsure:

ich hab eine Array of Word für HMI Meldungen angelegt und bräuchte nun aus all ganzen Wörtern alle 0 bis 7 Bits Meldungsbits zusätzlich für ein PLS System. Bit 8 bis 15 soll ignoriert werden.
Gibt es da die Möglichkeit alles auf einmal zu kopieren
Ja, old-S5-Style Bytes im Speicher 'rumkopieren geht. Sollte man bei einer S7-1x00 aber nicht mehr nötig haben. Da kann man das verständlich programmieren.

Indirekt adressieren (z.B. in Schleifen) kann man nur Arrays (symbolisch) oder Adressen.
Also entweder musst du die Ziel-Bits als ARRAY of BOOL anlegen oder auf Standard-Zugriff stellen, damit die Bits Adressen haben.

Wenn du sowieso schon auf Standard-Zugriff umgestellt hast, dann kannst du Speicher mit z.B. 320 Bits mit einem BOOL-Array per AT überlagern, dann sind die Bits ohne Pointer über Index adressierbar. Bits in Words kann man extrahieren, indem man das Word mit einer Bitmaske verUNDet, in der nur ein Bit=1 ist, und schaut, ob dabei <> 0 'raus kommt. Die Bitmaske verschiebt oder rotiert man dann so, daß die 1 über das gewünschte Bit zu liegen kommt. So kann man das Extrahieren in eine Schleife packen (z.B. in SCL): Bool[ x ] := (Word[ i ] AND Bitmaske) <>0;

Etwa so (ungetestet, Syntax ist nicht TIA):
Code:
b := 0;   //Index der Ziel-Bools z.B. Boolarray[0..319]

FOR i := 1 TO 40 DO    //Index der Words z.B. Meldungen[1..40]
  Bitmaske := 1;       //Bitmaske auf niedrigstens Bit .%X0
  FOR j := 1 TO 8 DO   //8 Bits je Word
    Boolarray[b] := (Meldungen[i] AND Bitmaske) <>0;
    b += 1;
    Bitmaske *= 2;     //Bitmaske um ein Bit nach links schieben
  END_FOR;
END_FOR;

Zum Schluss kannst du das BOOL-Array als gesamter Block auf die Ziel-Bits kopieren.
 
Zurück
Oben