-> Hier kostenlos registrieren
Hallo
Bei einem SPS Projekt was ich hier vor mir habe, wird für jeden Alarm (Fehler), der auf dem System erscheint ein Bit in einem Doppelwort ausgegeben.
Alarm1 A30.0
Alarm2 A30.1
.
.
.
Es gibt 32 Alarmmeldungen, also ein Doppelwort AD30.
Die Bedingung dabei ist, dass immer nur ein Alarm gerade aktiv ist. Nach einer Zeit X soll dann der nächste Alarm erscheinen, der aktiv ist.
Nun hab ich diese Aufgabe soweit implementiert, dass ich mir eine rotierende Maske programmiert habe (DWORD mit 1), die mir zusammen mit einer binären Verknüpfung mit dem Quellwort immer nur den Alarm ausgibt, der gerade in der rotierenden Maske aktiv ist. Anbei mal die Codezeilen, die mir das realisieren:
Zur Erläuterung:
DB120.DBD2 ist das DWORD in dem sich die 32 möglichen Alarme befinden
#sAlarmNr ist das DWORD in dem als Maske immer 1 Bit auf 1 ist.
#sAlarmAnzeige ist dann die binäre Verknüpfung des Quellwortes und der Maske wo dann immer nur 1 Alarm aktiv ist.
#sHMAnzeigeFehler startet die AnzeigeTimer die dann die Alarmmeldungen auf die Ausgänge schreiben...
Soweit so gut. Das Prinzip funktioniert gut. Ich bekomme immer nur einen aktiven Alarm und die Meldungen rotieren durch. Wenn zum Beispiel das 5. und das 9. Bit auf 1 sind, also einen Alarm enthalten, dann wird für die Zeit X zuerst das 5. Bit ausgegeben und danach für die Zeit X das 9. Bit. Dann wieder das 5. usw. Der Code arbeitet pro Zyklus eine Rotation in der Maske ab und prüft dann ob das Ergebniswort #sAlarmAnzeige größer 0 ist. Wenn ja, dann muss der Alarm angezeigt werden. Wenn nicht wird im nächsten Zyklus die nächste Rotation geprüft. Wird ein Alarm gefunden so wird #sHMAnzeigeFehler gesetzt, der dann den Timer für die Anzeigedauer startet und nach Ablauf der Anzeigedauer von dieser wieder zurück gesetzt wird.
Nun hab ich aber ein Problem. Wenn in dem Quellwort DB120.DBD2 zwei Bits nacheinander einen Alarm anzeigen, nehmen wir als Beispiel das Bit 9 und 10, dann funktioniert die Rotation nicht.
Mein Wort wo die Alarme reingeschrieben werden, #sAlarmAnzeige, zeigt dann immer nur das 9. Bit an.
Aus irgendwelchen Gründen wird das Rotationsbit entweder über das 10. Bit drüber geschoben oder es wird vorher gelöscht (durch was auch immer), so das der Suchlauf immer von vorn beginnt.
Die Variablen sind statische Variablen in einem MultiinstanzFB.
Ich hab schon den halben Tag damit verbracht die Ursache zu finden, aber ich komme nicht drauf. Ich hab auch schon anstatt der statischen DB Variablen globale Merker genommen, aber das funktioniert genau so wenig.
Könnt ihr mir da einen Tipp geben, was da der Fehler sein kann?
Solltet ihr noch Infos brauchen, dann gebt eine Info. Dann kann ich auch noch mehr Infos geben.
Danke im Voraus und Grüße
Daimonion
Bei einem SPS Projekt was ich hier vor mir habe, wird für jeden Alarm (Fehler), der auf dem System erscheint ein Bit in einem Doppelwort ausgegeben.
Alarm1 A30.0
Alarm2 A30.1
.
.
.
Es gibt 32 Alarmmeldungen, also ein Doppelwort AD30.
Die Bedingung dabei ist, dass immer nur ein Alarm gerade aktiv ist. Nach einer Zeit X soll dann der nächste Alarm erscheinen, der aktiv ist.
Nun hab ich diese Aufgabe soweit implementiert, dass ich mir eine rotierende Maske programmiert habe (DWORD mit 1), die mir zusammen mit einer binären Verknüpfung mit dem Quellwort immer nur den Alarm ausgibt, der gerade in der rotierenden Maske aktiv ist. Anbei mal die Codezeilen, die mir das realisieren:
Code:
L DB120.DBD 2
L 0
==D
SPB TEnd
U #sHMAnzeigeFehler
SPB TEnd //starte Rotation der Anzeige wenn kein Fehler angezeigt wird
L #sAlarmNr
RLD 1
T #sAlarmNr
L #sAlarmNr
L DB120.DBD 2
UD //verknüpfe Rotation mit Fehleranzeige
T #sAlarmAnzeige
L #sAlarmAnzeige
L 0
==D //Prüfe ob Fehlerbit gesetzt ist
SPB TEnd
S #sHMAnzeigeFehler //wenn Fehlerbit gesetzt ist , dann starte die Anzeigetimer
TEnd: NOP 0
Zur Erläuterung:
DB120.DBD2 ist das DWORD in dem sich die 32 möglichen Alarme befinden
#sAlarmNr ist das DWORD in dem als Maske immer 1 Bit auf 1 ist.
#sAlarmAnzeige ist dann die binäre Verknüpfung des Quellwortes und der Maske wo dann immer nur 1 Alarm aktiv ist.
#sHMAnzeigeFehler startet die AnzeigeTimer die dann die Alarmmeldungen auf die Ausgänge schreiben...
Soweit so gut. Das Prinzip funktioniert gut. Ich bekomme immer nur einen aktiven Alarm und die Meldungen rotieren durch. Wenn zum Beispiel das 5. und das 9. Bit auf 1 sind, also einen Alarm enthalten, dann wird für die Zeit X zuerst das 5. Bit ausgegeben und danach für die Zeit X das 9. Bit. Dann wieder das 5. usw. Der Code arbeitet pro Zyklus eine Rotation in der Maske ab und prüft dann ob das Ergebniswort #sAlarmAnzeige größer 0 ist. Wenn ja, dann muss der Alarm angezeigt werden. Wenn nicht wird im nächsten Zyklus die nächste Rotation geprüft. Wird ein Alarm gefunden so wird #sHMAnzeigeFehler gesetzt, der dann den Timer für die Anzeigedauer startet und nach Ablauf der Anzeigedauer von dieser wieder zurück gesetzt wird.
Nun hab ich aber ein Problem. Wenn in dem Quellwort DB120.DBD2 zwei Bits nacheinander einen Alarm anzeigen, nehmen wir als Beispiel das Bit 9 und 10, dann funktioniert die Rotation nicht.
Mein Wort wo die Alarme reingeschrieben werden, #sAlarmAnzeige, zeigt dann immer nur das 9. Bit an.
Aus irgendwelchen Gründen wird das Rotationsbit entweder über das 10. Bit drüber geschoben oder es wird vorher gelöscht (durch was auch immer), so das der Suchlauf immer von vorn beginnt.
Die Variablen sind statische Variablen in einem MultiinstanzFB.
Ich hab schon den halben Tag damit verbracht die Ursache zu finden, aber ich komme nicht drauf. Ich hab auch schon anstatt der statischen DB Variablen globale Merker genommen, aber das funktioniert genau so wenig.
Könnt ihr mir da einen Tipp geben, was da der Fehler sein kann?
Solltet ihr noch Infos brauchen, dann gebt eine Info. Dann kann ich auch noch mehr Infos geben.
Danke im Voraus und Grüße
Daimonion