Schrittketten in AWL gegeben falls mit Sprungmarken?

Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[FONT=courier new]TAR1  #dTempAR1                   //Adressregister 1 sichern [COLOR=#ff0000]Was schreibe ich in die Schnittstelle das FB's? z.B. unter Stat dTempAR1 INT [/COLOR] [/FONT][FONT=courier new]      AUF   #FehlerDB[/FONT]   [COLOR=#ff0000]Lege ich einen globalen DB an schreibe ihn da hin?[/COLOR]  [FONT=courier new]      L     #Zeiger_Schreiben           //Aktueller Speicherplatz[/FONT] [FONT=courier new][COLOR=#ff0000]Was schreibe ich in die Schnittstelle das FB's? z.B. unter Stat Zeiger_Schreiben DINT[/COLOR][/FONT] [FONT=courier new]      L     2                           //Byteanzahl je Speicherplatz[/FONT] [FONT=courier new]      *I    [/FONT] [FONT=courier new]      SLD   3                           //Pointerformat erzeugen (Wert auf Byteadressstelle verschieben)                              [/FONT] [FONT=courier new]      LAR1                              //in das Adressregister laden                 [/FONT]  [FONT=courier new]      L     #FehlerNr[/FONT] [FONT=courier new]      T     DBW [AR1,P#0.0]             //FehlerNr in FIFO eintragen (Pointer + Start-Versatz im DB)[/FONT]  [FONT=courier new]      L     1[/FONT] [FONT=courier new]      L     #Zeiger_Schreiben[/FONT] [FONT=courier new]      +I                                //Zeiger um einen Platz erhöhen[/FONT] [FONT=courier new]      L     10[/FONT] [FONT=courier new]      <I                                //noch kleiner als 10? (Maximaler Speicherplatz)[/FONT] [FONT=courier new]      SPB   ZS_N[/FONT] [FONT=courier new]      L     0                           //auf Anfang zurücksetzen[/FONT] [FONT=courier new]ZS_N: T     #Zeiger_Schreiben           //Neuer Wert des Zeigers[/FONT]  [FONT=courier new]      LAR1  #dTempAR1                   //gesichertes Adressregister in AR1 zurückschreiben
[/FONT]


Code:
[FONT=courier new]  FM:   L     #Zeiger_Schreiben
      L     #Zeiger_Lesen [/FONT][FONT=courier new][COLOR=#ff0000]//Was schreibe ich in die Schnittstelle das FB's? z.B. unter Stat Zeiger_Lesen DINT[/COLOR][/FONT][FONT=courier new]
      <>I   
      =     #Alarm
      NOT                               //wenn kein Alarm zu melden
      BEB                               //Baustein beenden
[/FONT]




Dann finde ich den keine Angaben zu den Telefonnummern, bzw. wo der FB48 aufgerufen wird.

mfg

aufgerufen wird
 
Zuletzt bearbeitet:
So habe jetzt den Baustein an Marius86 Beispiel angepasst, folgende Erkentnis:
Er sendet max. an einer der 3 Telefonnummern, wenn z.B. 2 aktiviert wurden, nimmt er die erste in der Reihenfolge.

Das stimmt, ich dachte das sei so beabsichtigt. Dann müsste man wohl noch mitzählen, bei welcher Telenummer er gerade ist, da das verschicken mehrere Zyklen dauern kann.

Über eine Variablen Tabelle habe ich mal ganz langsam mit 10 Sekunden Zeitversatz alle 6 eingänge belegt. dort kamen auch die Texte genau nach Reihenfolge an.
Wenn ich aber alle 6 Eingänge nacheinander so schnell wie möglich auf 1 setze überspringt er welche, statt 6 verschiedene kommen z.B. sparadisch nur 4 SMS an.

Ich schätze mal das er sich da irgendwie verhaspelt.

Kann es sein, dass du die Variablen "#Aufrufbedingung_1" als "Temp" deklariert hast?
 
Dann finde ich den keine Angaben zu den Telefonnummern, bzw. wo der FB48 aufgerufen wird.
Da fehlen noch weitere Netzwerke:
Ungetestet, aber so in etwa würde ich da herangehen ->
...
Für mehr ist es mir heut' zu spät, sorry.
(Noch :confused:) keine Komplettlösung, nur mein möglicher Ansatz!
Ging ja auch hauptsächlich um den FIFO (beschreiben im NW3 und wieder auslesen im NW5).
;-)


Code:
[LEFT][FONT=courier new]#Zeiger_Schreiben = INT,   Stat (sollte an möglichen Speicherplätzen reichen)[/FONT]
[FONT=courier new]#Zeiger_Lesen     = INT,   Stat (gleiche Größe wie #Zeiger_Schreiben[COLOR=#333333])
#dTempAR1         = DWORD, Temp[/COLOR][/FONT][/LEFT]
Bei den Zeigern steht überall *I und sie sollen über den Zyklus bestehen bleiben.
;-)


3. Braucht der FB SMS_SEND zum SMS senden mehrere Zyklen oder schafft der das in einem (Anm.: Zyklus)?
Von der Antwort auf diese Frage hängt übrigens das Vorgehen für das SMS versenden ab, das ich dann wählen würde.
Bei Ersterem ohne Schleife im Zyklus, bei Zweiterem könnte man alle SMs in einem Rutsch (Zyklus) mittels LOOP versenden.
PS: Wenn ich mir Deinen obigen Code näher ansehe, scheint das Ganze wohl mehrere Zyklen zu dauern.
 
Zuletzt bearbeitet:
Wenn ich es richtig verstanden habe bei FiFo wäre es ja so, wenn Aufrufmerker1 1 ist schaue nach welche Telefonnummer aktiv ist schreibe es in den Speicher und nimm das 1. im Speicher und schicke es per SMS fort
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein. Das Versenden der Fehler an die 3 Tel.Nr. hat (fast) nichts mit dem FIFO zu tun.
Der ist nur zum Auffangen der Fehler gedacht und gibt damit dem SMS-Versenden die benötigte Zeit, damit keine neuen Fehler verloren gehen:
zu 1. Wenn mehrere Fehler z.B. gleichzeitig kommen, soll nach einander die SMS'en kommen, halt nur einmal, auch wenn der Fehler weiter ansteht.
PS: Außerdem gibt Dir der Fehler-DB bei entsprechender Größe die Möglichkeit, auch später das Auftreten der Fehler noch nach zu vollziehen. Vor allem, wenn Du auch noch Datum und Uhrzeit mit einträgst.
 
Zuletzt bearbeitet:
zu 1. Wenn mehrere Fehler z.B. gleichzeitig kommen, soll nach einander die SMS'en kommen, halt nur einmal, auch wenn der Fehler weiter ansteht.
Das schreit förmlich nach zwischenpuffern ...

Wenn ich aber alle 6 Eingänge nacheinander so schnell wie möglich auf 1 setze überspringt er welche, statt 6 verschiedene kommen z.B. sparadisch nur 4 SMS an.

Ich schätze mal das er sich da irgendwie verhaspelt.
Ja, das passiert typischerweise, wenn man nicht zwischenpuffert ...

FIFO [...] Der ist nur zum Auffangen der Fehler gedacht und gibt damit dem SMS-Versenden die benötigte Zeit, damit keine neuen Fehler verloren gehen
Genau. Doppelt unterstreichen.

Der FIFO-Pufferspeicher ist dafür da, sich die aufgetretenen Ereignisse in der zeitlich richtigen Reihenfolge zu merken, egal wie schnell die Ereignisse kommen und gehen und wie viele Reaktionen/SMS erforderlich sind. Weil das Versenden einer SMS erheblich mehr als 1 OB1-Zyklus Zeit braucht, müssen die Geschwindigkeiten entkoppelt werden, d.h. müssen die Ereignisse (bzw. Sendeaufträge) zwischengespeichert (gepuffert) werden.

Glaube uns ... das bekommt man nur mit einem FIFO-Pufferspeicher (Warteschlange) in den Griff.

Harald
 
... das bekommt man nur mit einem FIFO-Pufferspeicher (Warteschlange) in den Griff.
Du teilst durch den FIFO Deinen FB in 2 zeitlich unabhängige Funktionen (könntest oder wenn nicht sogar solltest auch 2 FB's d'raus machen):

1. Eintragen: schrieb:
- Fehler tritt auf
- prüfen welcher, z.B. Fehler Nr. 2
- Eintrag in FIFO-Speicherplatz 0: Fehler Nr. "2"
- Zeiger auf Speicherplatz 1 erhöhen
- warten auf nächsten Fehler -> tritt auf
- prüfen welcher, z.B. Fehler Nr. 5
- Eintrag in FIFO-Speicherplatz 1: Fehler Nr. "5"
- Zeiger auf Speicherplatz 2 erhöhen
...
- warten auf nächsten Fehler -> tritt auf
- prüfen welcher, z.B. Fehler Nr. 1
- Eintrag in FIFO-Speicherplatz 9: Fehler Nr. "1"
- Zeiger auf Speicherplatz 10 erhöhen
- oh Moment, 9 größte Speicherplatznummer, also die Speicherplatznummer auf 0 zurücksetzen (Platz 0 wird als nächstes überschrieben)
- ...
2. Auslesen: schrieb:
- Zeiger_Lesen steht bei 0, aber Zeiger_Schreiben steht jetzt auf 1 (oder noch woanders) -> ah, da gibt's was zu melden
- Lese Speicherplatz 0 die Fehlernummer aus -> "2"
- "2" entspricht Text "sowieso2" (bis hierhin geht der Code in meinem Ansatz)
- (wenn gewünscht) Text "sowieso2" an TelNr.1 senden und warten bis erfolgreich
- (wenn gewünscht) Text "sowieso2" an TelNr.2 senden und warten bis erfolgreich
- (wenn gewünscht) Text "sowieso2" an TelNr.3 senden und warten bis erfolgreich
- Zeiger_Lesen auf 1 erhöhen
- Zeiger_Lesen mit Zeiger_Schreiben vergleichen, wenn gleich warten, sonst:

- Lese Speicherplatz 1 die Fehlernummer aus -> "5"
- "5" entspricht Text "sowieso5" (bis hierhin geht der Code in meinem Ansatz)
- (wenn gewünscht) Text "sowieso5" an TelNr.1 senden und warten bis erfolgreich
- (wenn gewünscht) Text "sowieso5" an TelNr.2 senden und warten bis erfolgreich
- (wenn gewünscht) Text "sowieso5" an TelNr.3 senden und warten bis erfolgreich
- Zeiger_Lesen auf 2 erhöhen
- Zeiger_Lesen mit Zeiger_Schreiben vergleichen, ...

Immer wenn der #Zeiger_Lesen vom #Zeiger_Schreiben abweicht, gibt es Meldungen zu versenden. Sind sie wieder gleich, wurde alles abgearbeitet.

Wie Du hoffentlich erkennst, kann sich das SMS-Versenden Zeit lassen, da neu auftretende Fehler im 1.Schritt der Reihe nach in den Fehler-DB (ich bevorzuge einen globalen DB) eingetragen werden und so im 2. Schritt in Ruhe abgearbeitet werden können.

Bei Deiner Variante löscht Du nach dem Versenden an die 3. TelNr. alle Fehler bzw. gleichzeitig aufgetretene Fehler würdest Du erst gar nicht erfassen (dies ist nicht unbedingt ein Nachteil). Der Pferdefuss wird definitiv immer sein, dass das SMS_Senden offensichtlich mehrere Zyklen benötigt und dadurch das Fehlererfassen manchmal mit den Fehlern nicht Schritt halten kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok jetzt habe ich erst mal den Schrittablauf verstanden.

Code:
U     #Prioritaet                 //nur höhere Prio eintragen?
      SPBN  FLE                         //Nein - Routine überspringen

Was ist mit Prioritaet geimeint, wann ist die 1?
 
Zuletzt bearbeitet:
Damit kann man festlegen, ob bei gleichzeitig auftretenden Fehlern nur der mit der höchsten Priorität (=1) (Fehler 1=höchste, mom. Fehler 6=niedrigste Priorität) oder alle (=0) gesendet werden sollen. Z.B. damit man während des Urlaubs nicht dem Nachbarn mit x SMS auf den Sack geht. Dafür müsste aber bestimmt dann auch noch ein Zeitglied oder eine andere Unterdrückung beim Versenden her.
 
Hier noch meine Überlegungen zum Netzwerk für das Auswählen der Telefonnummer:
Code:
[FONT=courier new]      L     3                           //max. Anzahl an Tel.Nr. (max. 16!)
      T     #Max_TelNr

      U     #TelNr_eingetragen          //Telefonnummer bereits übertragen
      SPB   TNE

TNS:  L     #Zeiger_TelNr
      L     #aktive_Telefone            //TelNr. über Bitstelle freigegeben
      SRW                               //gesuchtes Tel. an letzte Bitstelle
      L     1                           //andere Telefone
      UW                                //ausmaskieren
      SPP   TNSL                        //TelNr aktiviert? zur Sprungliste

      L     #Zeiger_TelNr               //sonst Zeiger um eins erhöhen
      L     1
      +I    
      L     #Max_TelNr
      >=I   
      SPB   TNE
      SPA   TNS

TNSL: L     #Zeiger_TelNr

      SPL   LST3                        //Sprungliste
      SPA   TN0
      SPA   TN1
      SPA   TN2
LST3: SPA   TNE

TN0:  CALL  "BLKMOV"
       SRCBLK :=#Telefon_Nr1
       RET_VAL:=#Wert
       DSTBLK :=#Telefon_Nr_Move
      SPA   TNC

TN1:  CALL  "BLKMOV"
       SRCBLK :=#Telefon_Nr2
       RET_VAL:=#Wert
       DSTBLK :=#Telefon_Nr_Move
      SPA   TNC

TN2:  CALL  "BLKMOV"
       SRCBLK :=#Telefon_Nr3
       RET_VAL:=#Wert
       DSTBLK :=#Telefon_Nr_Move
      SPA   TNC

TNC:  L     0
      L     #Wert
      ==I   
      S     #TelNr_eingetragen

TNE:  NOP   0[/FONT]
Über das Eingangswort #aktive_Telefone kann man bitweise festlegen, an welche Telefonnummern (max. 16) gesendet werden soll.
Wenn die SMS im nächsten Netzwerk irgendwann erfolgreich gesendet worden ist, kann der #Zeiger_TelNr um eins erhöht und das Flag #TelNr_eingetragen zurück gesetzt werden.
Wurde die max. mögliche Anzahl an TelNr überschritten, kann der FIFO-Zeiger zum Auslesen um eins erhöht und das Flag #SMSText zurückgesetzt werden.

Das nächste Netzwerk kann ich (momentan) bei mir nicht so richtig erstellen, da ich den FB zum SMS-Versenden bei mir nicht finde.
Das Netzwerk sieht dann aber sicher im Wesentlichen so aus, wie bei Dir das reine Versenden.


Und bitte nicht vergessen, das sind alles bloß meine Überlegungen!
Da ist nichts getestet und schon gar nicht fehlerbereinigt! Und meine Logik kann sich durchaus auch verrannt haben!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
    A1:  CALL  "SMS_SEND" , "IDB_FB48"
       MPI_TS_ADAPTER:=1
       PHONE_NO      :=#Telefon_Nr_Move
       SCENTER_NO    :=#Servicecenter_Nr
       MESSAGE       :=#SMS_Text_Move
       BUSY          :=#Send_1_Busy
       STATUS        :=#Send_1_Status



// Prüfung der Aufrufergebnisse auf das Ende der Bearbeitung

      U     #Send_1_Busy                // ist BUSY == 0 ?
      BEB                               // nein, SMS_SEND bearbeitet den Auftrag noch 



      L     0                           // ja, Bearbeitung ist abgeschlossen
      L     #Send_1_Status
      ==I                               // STATUS == 0 ?
      SPB   ok_1                        // ja, es ist kein Fehler aufgetreten
      L     W#16#7000                   // nein,  
      ==I                               // hat sich SMS_SEND zurückgesetzt ?
      SPB   A1                          // ja, SMS_SEND erneut aufrufen

// (im nächsten Zyklus)

ok_1:

zu Satz 2: wo wird denn TelNr_eingetragen überhaupt gesetzt?
Hier das Netzwerk zum verschicken

als Anlage der Anhang anzeigen FB48.zip
 
Zuletzt bearbeitet:
Zurück
Oben