In der SPS 32 Bits zu einem Doppelword zum Panel zusammenfassen und am Panel wieder ausmaskieren
Code:
myBit1 = myDWord and 1
...
myBit31 = myDWord and &H40000000
' kann man auch so schreiben:
SmartTags("myBit32") = SmartTags("myDWord") and &H80000000
ist eine gute Idee zum Sparen von Powertags. Ich würde mich aber nicht darauf verlassen, daß dann
eine "BeiWertänderung"-Aktion an den Panel-lokalen Einzelbits immer korrekt ausgeführt wird bzw.
die Doppelword-Variable muß dann auf ständig lesen stehen. Oder man muß dafür sorgen, daß überall
da, wo die Einzelbits benötigt werden, die Doppelword-Variable aus der SPS gelesen wird.
Beim Zusammenfassen von Einzelbits, die vom Panel zur SPS
geschrieben werden sollen, da habe ich
leichte Bauchschmerzen, da kann es durch die Kommunikations-Laufzeit haarig werden.
Wenn die SPS auch in das empfangene Doppelword schreibt (z.B. Rücksetzen von Tastenbits), dann
kann das Bit in der SPS durch die Panel-Zugriffe kurz danach unerwartet wieder gesetzt sein.
Wenn die SPS nicht auf das empfangene Doppelword schreibt, dann gibt es weniger Probleme.
Einzelne Bits in der Doppelwort-Schreibvariable setzen oder löschen kann man z.B. in einem Skript
durch verknüpfen mit einer Bitmaske (hinein-ORen oder heraus-ANDen), wie der Perfektionist gezeigt
hat. Oder gleich einen Wert 1, 2, 4, 8, 16, 32, ... zuweisen.
Dies kann aber einen Skript-Stau verursachen, wenn in schneller Folge mehrere Bits in dem Schreib-
Doppelwort verändert werden.
Mehrere unabhängige Bits im Schreib-Doppelwort gleichzeitig ändern geht nur in einem Skript.
Oder man nutzt die Systemfunktionen
* SetzeBitInVariable
* RuecksetzeBitInVariable
* InvertiereBitInVariable
Wegen der Probleme die aus der Kommunikations-Laufzeit resultieren können, schreibt die WCCflex-Onlinehilfe:
Die Systemfunktion überträgt nach der Änderung des angegebenen Bits die gesamte Variable wieder an die Steuerung. Es wird nicht geprüft, ob sich zwischenzeitlich andere Bits in der Variablen geändert haben. Bediener und Steuerung dürfen auf die angegebene Variable nur lesend zugreifen, bis die Variable wieder an die Steuerung übertragen wurde.
Hinweis
Verwenden Sie diese Systemfunktion nicht, wenn die Steuerung BOOL-Variablen unterstützt. Verwenden Sie statt dessen die Systemfunktion "SetzeBit".
"Nur lesend zugreifen, bis ..." - woher soll die Steuerung wissen, wann die Variable vom Panel gelesen
und wann wieder zurückgeschrieben wurde?
Ein ARRAY [0..255] OF BOOL ist zwar nur 1 Powertag, es kann aber auch hier zu Problemen kommen, wenn
in der SPS auf Bits in dem Array geschrieben wird.
Beim Ändern eines Array-Bits vom Panel wird das komplette Array in die SPS geschrieben und danach wieder
gelesen. Wenn nun im Panel schon ein weiteres Bit geändert wurde, wird wieder das gesamte Array in die
SPS geschrieben, mit dem vermeintlich noch gesetzten Bit von der ersten Änderung! Und ohne zwischenzeitlich
von der SPS geänderte Bits.
Das Panel kann man (zumindest unter WinCCflex) nicht zwingen, eine Variable vor dem Schreiben NICHT zu lesen.
Nachteile der Zusammenfassung von Bits in Doppelwörtern oder Arrays of Bool:
- Auf die einzelnen Bits kann nicht mehr "symbolisch" zugegriffen werden.
- Die Querverweisliste in WCCflex wird unvollständig und unübersichtlich.
- Die meisten WCCflex-Objekte können nicht mit Arrays umgehen, (ich glaube) nur Schalter.
- Auf Bitfeld-Variablen vom Panel darf die SPS nicht schreiben.
- in Panel und SPS unterschiedliche Berechnung, auf welcher Adresse Bit0 ... Bit31 sind
Gruß
Harald