Sammelstörung mit wiederholter akust. Meldung

homei

Level-1
Beiträge
100
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe im einem zusammenhängenden Merkerbereich ca. 350 Störmelungen. Beim Auftreten einer Störmeldung soll ein optisches Dauersignal erfolgen und ein akustisches Signal für ca 30 Sekunden ausgegeben werden. Das Optische Signal soll ausgegeben werden, bis alle Störungen gegangen sind. Das akustische Signal soll immer ausgegeben werden, wenn eine Störung erfolgt, auch dann, wenn bereits schon eine Störung anliegt.

Hat jemand eine Idee, wie sich das effektiv programmieren läßt.

MfG
homei
 
Code:
*
      SET   
      R     #GROUPALARM                 // AUSGANG GROUPALARM VORBESETZEN

      L     #START_MB                   // VERGLEICHSSTART LADEN
      SLW   3                           // UND BITS AUSMASKIEREN
      T     #QUELLINDEX                 // UND ALS NEUEN START MERKEN

      L     #ANZ_BYTE                   // ANZAHL ZU VERGLEICHENDER BYTES LADEN
NEXT: T     #REFERENZ                   // UND IN SCHLEIFENINDEX LADEN
      L     B#16#FF                     // LADE KONSTANTE FF 

      L     MB [#QUELLINDEX]            // UND NACH MERKERBYTE TRANSFERIEREN
      ==I   
      SPB   OK
      SET   
      =     #GROUPALARM
      BEA   
OK:   L     #QUELLINDEX                 // QUELLINDEX LADEN UND
      +     8                           // UM EINS ERHÖHEN
      T     #QUELLINDEX                 // UND MERKEN FUER NÄCHSTEN DURCHLAUF
      L     #REFERENZ                   // SCHLEIFENINDEX LADEN
      LOOP  NEXT
      BE                                // FERTIG

macht eine sammelalarmmeldung - also deine optische anzeige

mit

Code:
*
      SET                               // VKE AUF LOG. 1  
      R     #UNGLEICH                   // UND ERGEBNIS VORBESETZEN

      L     #DB_REFERENZ                // AUS VORGABEWERT FÜR REFERNZDATENBAUSTEIN
      T     #REFERNZ_DB                 // EIN DOPPELWORT ZUR INDIZIERUNG MACHEN
      AUF   DB [#REFERNZ_DB]            // UND DATENBAUSTEIN FÜR FB ÖFFNEN

      L     #START_QUELLE_MB            // STARTDATENWORT QUELLE LADEN
      SLW   3                           // UND ALS ADRESSINDEX
      T     #QUELLINDEX                 // MERKEN

      L     #START_ZIEL_DB              // ZIELDATENWORT IN DER QUELLE LADEN
      SLW   3                           // UND ALS ADRESSINDEX
      T     #ZIELINDEX                  // MERKEN

      L     #ANZ_WORTE                  // VERGLEICHS - KOPIERLÄNGE LADEN (WORTE)
NEXT: T     #REFERENZ                   // UND ALS SCHLEIFENZÄHLER VERWENDEN
      L     MW [#QUELLINDEX]            // QUELLWERT (NEU) LADEN       [MWxyz]
      L     DBW [#ZIELINDEX]            // VERGLEICHSWERT (ALT) LADEN  [DWXYZ]
      XOW                               // EXCLUSIV-ODER VERKÜPFEN
      L     DBW [#ZIELINDEX]            // REFERENZWERT AKTUELL NOCHMAL LADEN
      UW                                // UND MIT XOR ERGEBNIS "VERUNDEN"
      L     W#16#0                      // REFERNZ 0000h laden
      ==I                               // BEIDE WERTE VERGLEICHEN
      SPB   EQU                         // WERTE GLEICH, DANN WEITERSUCHEN
      S     #UNGLEICH                   // WERTE UNGLEICH, DANN ERGEBNIS SETZEN
      SPA   COPY                        // UND AKTUELLE DATEN RETTEN
EQU:  L     #QUELLINDEX                 // WERTE GLEICH, DANN INDEX
      +     16                          // UM EIN WORT ERHÖHEN UND
      T     #QUELLINDEX                 // MERKEN
      L     #ZIELINDEX                  // JETZT ZIELINDEX
      +     16                          // UM EIN WORT ERHÖHEN UND
      T     #ZIELINDEX                  // MERKEN
      L     #REFERENZ                   // REFERENZ SCHLEIFENZÄHLER 
      LOOP  NEXT                        // UND NAECHSTES WORT VERGLEICHEN


COPY: LAR1  P##QUELLE                   // POINTERADRESSE FÜR QUELLE ZUM KOPIEREN
      L     B#16#10                     // IN LOKALDATENBEREICH KONSTRUIEREN
      T     LB [AR1,P#0.0]
      L     B#16#4                      // DATENTYP = WORTE
      T     LB [AR1,P#1.0]
      L     #ANZ_WORTE                  // ANZAHL WORTE
      T     LW [AR1,P#2.0]
      L     W#16#0                      // QUELLE IST KEIN DB (ALSO 0)
      T     LW [AR1,P#4.0]
      L     B#16#83                     // SPEICHERBEREICH IST M
      T     LB [AR1,P#6.0]
      L     B#16#0                      // OBERE ADRESSANGABE == 0
      T     LB [AR1,P#7.0]
      L     #START_QUELLE_MB            // STARTMERKERBYTE SCHIEBEN (3 = BITPOS)
      SLW   3
      T     LW [AR1,P#8.0]              // UND ALS QUELLANFANG MERKEN

      LAR1  P##ZIEL                     // POINTERADRESSE FÜR ZIEL ZUM KOPIEREN
      L     B#16#10                     // IM LOKALDATENBEREICH KONSTRUIEREN
      T     LB [AR1,P#0.0]
      L     B#16#4                      // DATENTYP = WORTE
      T     LB [AR1,P#1.0]
      L     #ANZ_WORTE                  // LAENGE = ANZAHL WORTE
      T     LW [AR1,P#2.0]
      L     #REFERNZ_DB                 // DB NUMMER
      T     LW [AR1,P#4.0]
      L     B#16#84                     // SPEICHERBEREICH IST DB
      T     LB [AR1,P#6.0]
      L     B#16#0                      // OBERE ADRESSANGABE == 0
      T     LB [AR1,P#7.0]
      L     #START_ZIEL_DB              // STARTDATENBAUSTEINWORT SCHIEBEN
      SLW   3
      T     LW [AR1,P#8.0]              // UND ALS ZIELANFANG MERKEN

      CALL  "BLKMOV"                    // KOPIEREN DER DATENBEREICHE DURCH BLOCKMOVE
       SRCBLK :=#QUELLE                 // VON QUELLE MWxyz nach DBxy,DWxyz FÜR n WORTE
       RET_VAL:=#RETURN
       DSTBLK :=#ZIEL                   // NACH ZIEL

      BE                                // UND FERTIG

führst du einen vergleich aus und es kommt ein signal bei jedem neuen alarm - also deine akustische meldung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo vierlagig,

ich danke dir für Deine Hilfe. Allerdings überblicke ich noch nicht, wie das ganze funktioniert. Es gibt auch Befehle, mit denen ich nichts anfangen kann, wie z. B.:

Warum schiebst Du das Start_MB um 3 Bit nach links?

Was bedeutet die Schreibweise MB [#QUELLINDEX]?

MfG
homei
 
@4L

Bei Auftreten einer Störung setze ich ein Bit in meinem Störmelde-DB oder wo auch immer.

Ist das bei dir anders, also Null für Störung und Eins für keine Störung:confused:

Oder wie soll ich deinen Code verstehen??


Code:
      ...
      L     B#16#FF                     // LADE KONSTANTE FF 
 
      L     MB [#QUELLINDEX]            // UND NACH MERKERBYTE TRANSFERIEREN
      ==I   
      SPB   OK
      SET   
      =     #GROUPALARM
      ...
Gruß

Pizza
 
:confused: höre ich zum ersten mal :confused:

Alle Programme, die mir je unter die Tasten gekommen waren also "nicht drahtbruchsicher" ;)

naja, mit dem Wissen lasst sich dein Beispiel jetzt auch nachvollziehen :ROFLMAO:

Gruß

Pizza
 
noch was:

Code:
      ...
      L     MW [#QUELLINDEX]            // QUELLWERT (NEU) LADEN       [MWxyz]
      L     DBW [#ZIELINDEX]            // VERGLEICHSWERT (ALT) LADEN  [DWXYZ]
      XOW                               // EXCLUSIV-ODER VERKÜPFEN
      L     DBW [#ZIELINDEX]            // REFERENZWERT AKTUELL NOCHMAL LADEN
      UW                                // UND MIT XOR ERGEBNIS "VERUNDEN"
      [COLOR=red]L     W#16#0[/COLOR]                      // REFERNZ 0000h laden
      ==I                               // BEIDE WERTE VERGLEICHEN
      SPB   EQU                         // WERTE GLEICH, DANN WEITERSUCHEN
      S     #UNGLEICH                   // WERTE UNGLEICH, DANN ERGEBNIS SETZEN
      ...

ist dieser Teil getestet ??;)

Gruß

Pizza
 
habs schon gemerkt :oops:

mal wieder ein Anfall geistigen Schwachsinns meinerseits.

nichts für ungut :ROFLMAO:

Gruß

Pizza
 
warum so kompliziert ?

Wundere mich gerade warum man das so kompliziert machen soll.
Habs zwar noch nicht ausprobiert, aber gehts nicht auch so ?

Code:
L MW #Stoerung
L MW #Stoerung_ALT
>I
= #Stoerung_kommt

L MW #Stoerung
T MW #Stoerung_ALT
Stoerung_kommt ist dann für einen Zyklus 1. Wenn eine neue Störung auftritt muss der Größer-Vergleich wahr sein, da ja mindestens ein Bit dazu kommt. Wenn eine Störung geht ist der vergleich nicht wahr.

Kann aber sein, dass ich das was Wichtiges übersehen hab, wenn ich dagegen die umfangreichen Lösungen oben sehe!
 
für alle die nicht drahtbruchsicher programmieren :ROFLMAO:

im ersten code einfach an der stelle FF eine 0 laden

Code:
*
NEXT: T     #REFERENZ                   // UND IN SCHLEIFENINDEX LADEN
      L     B#16#[B][COLOR=Red]0[/COLOR][/B]                      // LADE KONSTANTE 0
 
Hallo,

vielen Dank für Eure Hilfe und den darin enthaltenen Anregungen. Leider komme ich erst heute dazu mich mit diesem Problem weiter zu beschäftigen.

Danke vierlagig für Deinen Link zum Pointer Zeiger. Da wird mir wieder klar, was ich an wichtigen Dingen überhaupt nicht einmal erahne, geschweige denn überhaupt nicht weiß.

Ich werde das Beispiel von vierlagig mal versuchen zu programmieren und auszutesten mit ein paar MW's, denn an Beispielen kann ich solche Sachen am Besten nachvollziehen und begreifen.

Nochmals vielen Dank

MfG
homei
 
Zurück
Oben