Step 7 Mit Pointer in Ringregister schreiben

Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast doch gerade was mit Pointern üben wollen :ROFLMAO: (immer noch ungetestet):

[EDIT] Hinweise zu Fehler bei der LOOP-Schleife von Ralle ab Post #53 beachten! [/EDIT]

Code:
[FONT=Courier New]      U     #Speichern                  // IN: BOOL
      FP    #FM_Speichern               // STATIC: BOOL
      SPBN  Neu

      AUF   #Register                   // IN: BLOCK_DB

// Zeiger inkrementieren
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer (STATIC: INT)
      +     1
      T     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer

// Zeiger auf Überlauf prüfen
      L     #DS_Anzahl                  // maximale Anzahl an Datensätzen  (IN: INT,  Wert 10 über die Schnittstelle übergeben)
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
      <=I   
      SPBN  over
      L     0
over: T     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer


// Ereigniszähler inkrementiern
      L     #Ereigniszaehler            // Ereigniszähler  (STATIC: INT)
      +     1
      T     #Ereigniszaehler            // Ereigniszähler

// AR1 sichern                            
      TAR1                              // AR1 in Akku1 laden
      T     #Sicherung_AR1              // und im Temp sichern (im Forum so gelernt :), TEMP: DWORD )

// Pointer erstellen
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
      L     #DS_Laenge                  // Datensatzlänge (IN: INT,  Wert 8 über die Schnittstelle übergeben)
      *I    
      L     #DS_Offset                  // Startadresse des Datenfeldes (IN: INT,  Wert 10 über die Schnittstelle übergeben)
      +I    
      SLD   3                           // berechneten Wert auf die Byteadresse schieben
      LAR1                              // und ins Adressregister 1 schreiben

// Daten eintragen
      L     #Ereigniszaehler            // Ereigniszähler
      T     DBW [AR1,P#0.0]             // und wieder sichern

      L     #Uhrzeit.Aktuell_Stunden    // Aktuelle Stunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#4.0]             // und in Ringpuffer sichern

      L     #Uhrzeit.Aktuell_Minuten    // Aktuelle Minute (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern

      L     #Uhrzeit.Aktuell_Sekunden   // Aktuelle Sekunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#6.0]             // und in Ringpuffer sichern

// AR1 wiederherstellen                            
      L     #Sicherung_AR1              // Gesicherten Wert laden
      LAR1                              // und ins AR1 zurückschreiben




// Register ggf. resetten
Neu:  U     #Reset                      // Öffner-Taster
      FN    #FM_Reset                   // deswegen negative Flanke
      SPBN  ende

// AR1 sichern                            
      TAR1                              // AR1 in Akku1 laden
      T     #Sicherung_AR1              // und im Temp sichern

// Zeiger initialisieren
      L     #DS_Anzahl                  // maximale Anzahl an Datensätzen
      +     1                           // für Start um 1 erhöhen

// Schleifenstart = Zeiger dekrementieren
Next: +     -1                          // um 1 verringern
      T     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer speichern

// Pointer erstellen
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
      L     #DS_Laenge                  // Datensatzlänge
      *I    
      L     #DS_Offset                  // Startadresse des Datenfeldes
      +I    
      SLD   3                           // berechneten Wert auf die Byteadresse schieben
      LAR1                              // und ins Adressregister 1 schreiben

// Daten eintragen
      L     0                           // Wert 0
      T     DBD [AR1,P#0.0]             // ins 1. DWORD eintragen

      L     0                           // Wert 0
      T     DBD [AR1,P#4.0]             // ins 2. DWORD eintragen

// Zeiger auf Null prüfen
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer laden
      LOOP  Next                        // Schleife wiederholen, bis Ringpuffer bei Null steht

// AR1 wiederherstellen                            
      L     #Sicherung_AR1              // Gesicherten Wert laden
      LAR1                              // und ins AR1 zurückschreiben

ende: NOP   0
[/FONT]
 
Zuletzt bearbeitet:
Ich hab grad kein S7 zur Hand, aber aus dem Gedächtnis hätte das so ausgesehen:
Code:
u  Ex.y
fn Mx.y
spbn ende

L   0
t    tmp_byte

call sfc21
      srcblk : p#tmp_byte
      retval : tmp_int
      dstblk : p#db37.dbx0.0 byte 187 // die Adressen musst du natürlich anpassen

ende : nop 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab das jetzt mal von hucki so angepasst, CPU geht aber auf SF. Findet jemand meinen Fehler???

Code:
      U     E    124.1
      FP    M     10.1
      SPBN  Neu

      L     "Uhrzeit".Aktuell_Stunden
      T     #Temp_akt_h

      L     "Uhrzeit".Aktuell_Minuten
      T     #Temp_akt_m

      L     "Uhrzeit".Aktuell_Sekunden
      T     #Temp_akt_s


      AUF   "Register"                  // IN: BLOCK_DB

// Zeiger inkrementieren
      L     MW    12                    // Zeiger für Ringpuffer (STATIC: INT)
      +     1
      T     MW    12                    // Zeiger für Ringpuffer

// Zeiger auf Überlauf prüfen
      L     2000                        // maximale Anzahl an Datensätzen
      L     MW    12                    // Zeiger für Ringpuffer
      <=I   
      SPBN  oves
      L     0
oves: T     MW    12                    // Zeiger für Ringpuffer



// Ereigniszähler inkrementiern
      L     MW    16                    // Ereigniszähler  (STATIC: INT)
      +     1
      T     MW    16                    // Ereigniszähler

// AR1 sichern                            
      TAR1                              // AR1 in Akku1 laden
      T     DBW   18                    // und im Temp sichern (im Forum so gelernt :), TEMP: DWORD )

// Pointer erstellen
      L     MW    12                    // Zeiger für Ringpuffer
      L     8                           // Datensatzlänge (IN: INT,  Wert 8 über die Schnittstelle übergeben)
      *I    
      L     10                          // Startadresse des Datenfeldes (IN: INT,  Wert 10 über die Schnittstelle übergeben)
      +I    
      SLD   3                           // berechneten Wert auf die Byteadresse schieben
      LAR1                              // und ins Adressregister 1 schreiben

// Daten eintragen
      L     MW    16                    // Ereigniszähler
      T     DBW [AR1,P#0.0]             // und wieder sichern

      L     "Uhrzeit".Aktuell_Stunden   // Aktuelle Stunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#4.0]             // und in Ringpuffer sichern

      L     "Uhrzeit".Aktuell_Minuten   // Aktuelle Minute (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern

      L     "Uhrzeit".Aktuell_Sekunden  // Aktuelle Sekunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#6.0]             // und in Ringpuffer sichern

// AR1 wiederherstellen                            
      L     DBW   18                    // Gesicherten Wert laden
      LAR1                              // und ins AR1 zurückschreiben




// Register ggf. resetten
Neu:  U     E    124.2                  // Öffner-Taster
      FN    M     11.2                  // deswegen negative Flanke
      SPBN  endf

// AR1 sichern                            
      TAR1                              // AR1 in Akku1 laden
      T     DBW   18                    // und im Temp sichern

// Zeiger initialisieren
      L     2000                        // maximale Anzahl an Datensätzen
      +     1                           // für Start um 1 erhöhen

// Schleifenstart = Zeiger dekrementieren
Next: +     -1                          // um 1 verringern
      T     MW    12                    // Zeiger für Ringpuffer speichern

// Pointer erstellen
      L     MW    12                    // Zeiger für Ringpuffer
      L     8                           // Datensatzlänge
      *I    
      L     10                          // Startadresse des Datenfeldes
      +I    
      SLD   3                           // berechneten Wert auf die Byteadresse schieben
      LAR1                              // und ins Adressregister 1 schreiben

// Daten eintragen
      L     0                           // Wert 0
      T     DBD [AR1,P#0.0]             // ins 1. DWORD eintragen

      L     0                           // Wert 0
      T     DBD [AR1,P#4.0]             // ins 2. DWORD eintragen

// Zeiger auf Null prüfen
      L     MW    12                    // Zeiger für Ringpuffer laden
      LOOP  Next                        // Schleife wiederholen, bis Ringpuffer bei Null steht

// AR1 wiederherstellen                            
      L     DBW   18                    // Gesicherten Wert laden
      LAR1                              // und ins AR1 zurückschreiben

endf: NOP   0
 
Aventinus, ich hab halt hier immer das Problem dass ich Sachen nicht weiss die ich reinschreiben muss, z.B.:

Code:
u  Ex.y
fn Mx.y
spbn ende

L   0
t   [COLOR="#EE82EE"]tmp_byte[/COLOR]

call sfc21
      srcblk : [COLOR="#EE82EE"]p#tmp_byte[/COLOR]
      retval : [COLOR="#EE82EE"]tmp_int[/COLOR]
      dstblk : [COLOR="#EE82EE"]p#db37.dbx0.0 byte 187[/COLOR] // die Adressen musst du natürlich anpassen

ende : nop 0
 
Das mit dem DBW 18 für die Sicherung des AR ist nicht wirklich gut.
Das kannst du zwar machen, wenn du in dem DB das DBW 18 dafür vorgesehen hast, aber wozu?
Deklariere eine Temp, schreib das AR am Anfang des Bausteins dort hinein und am Ende restaurierst du es wieder, fertig.
Dazu braucht es keine "quasi-statische" Variabe aus dem DB.

Ansonsten: Hast du mal den Diagnosepuffer in der CPU angesehen? und ist der Db auch wirklich lang genug, stimmen alle deine Adressberechnungen und zeigen nicht über den DB hinaus?

 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
// Pointer erstellen
      L     MW    12                    // Zeiger für Ringpuffer
      L     8                           // Datensatzlänge
      *I    
      L     10                          // Startadresse des Datenfeldes
      +I    
      SLD   3                           // berechneten Wert auf die Byteadresse schieben
      LAR1

für MW 12 = 0 liegt dein Pointer auf 10
für MW 12 = 1 liegt dein Pointer auf 18

dein AR liegt in DBW 18, das wird also von Werten überschrieben.

für MW 12 = 2000 liegt dein Pointer auf 16010, ist dein DB lang genug eingerichtet?
 
Ahja, okay.
Das erste verstehe ich noch, dass ich nicht DBW 18 nehmen soll, aber was soll/kann ich stattdessen nehmen (Was ist Temp, eine temporäre Variable wie z.b ein MW???) ?

Mein Db sollte groß genung sein, er ist auch mit Abstand der Größte Baustein...
Bausteine.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oben im Kopf des FC/FB kannst du Variablen deklarieren. Dort unter Temp legst du eine Variable AR1TEMP als DWORD an, diese nutzt du dann statt DBW18.

TAR 1
T #AR1Temp

...


L #AR1Temp
LAR 1
 
Ahja, okay.
Das erste verstehe ich noch, dass ich nicht DBW 18 nehmen soll, aber was soll/kann ich stattdessen nehmen (Was ist Temp, eine temporäre Variable wie z.b ein MW???) ?

Mein Db sollte groß genung sein, er ist auch mit Abstand der Größte Baustein...
Anhang anzeigen 21344

Temp ist eine temponäre Baustein Variable und sollte nur
im Deklarierten Baustein verwendet werden. Der Temponäre Speicherbereich
wird auch von anderen Bausteinen verwendet und ist somit nicht für Statische
Verwendung über die Bausteingrenzen geeignet.


Der Merkerbereich ist eine Globale statische Variable.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was steht zu diesem Zeitpunkt in MW12 ?
Der Fehler sagt aus, dass du an eine Stelle schreiben willst, die es im DB nicht gibt, er also wahrschenlich zu kurz ist.
Was steht im DB-Register? (Welcher DB ist zu diesem Zeitpunkt aktiv?) Sollte ja "Register" sein, aber noch mal kontrollieren.
Ist der DB von dir auch ins AG übertragen worden?
 
Zuletzt bearbeitet:
Argh, dein Loop ist falsch, jetzt seh ich das:


Code:
// Zeiger initialisieren
      L     #DS_Anzahl                  // maximale Anzahl an Datensätzen
      [COLOR=#FF0000]+     1         [/COLOR]                  // für Start um 1 erhöhen           [COLOR=#FF0000]streichen!!![/COLOR]

!!// Schleifenstart = Zeiger dekrementieren
Next: [COLOR=#FF0000]+     -1 [/COLOR]                         // um 1 verringern         [COLOR=#FF0000]streichen!!![/COLOR]
      T     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer speichern

// Pointer erstellen
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
      L     #DS_Laenge                  // Datensatzlänge
      *I    
      L     #DS_Offset                  // Startadresse des Datenfeldes
      +I    
      SLD   3                           // berechneten Wert auf die Byteadresse schieben
      LAR1                              // und ins Adressregister 1 schreiben

// Daten eintragen
      L     0                           // Wert 0
      T     DBD [AR1,P#0.0]             // ins 1. DWORD eintragen

      L     0                           // Wert 0
      T     DBD [AR1,P#4.0]             // ins 2. DWORD eintragen

// Zeiger auf Null prüfen
      L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer laden
      LOOP  Next                        // Schleife wiederholen, bis Ringpuffer bei Null steht

Loop verringert die Variable "#Zeiger_Ringpuffer" selbst um 1.
Dadurch löscht du nur jeden 2. Datensatz und beim letzten löscht du bei einer sehr hohen Adresse, da dein Wert -1 wird, als DWort also mithin eine hohe Adresse ausgerechnet wird, die es wohl nicht gibt.
 
Argh, dein Loop ist falsch, jetzt seh ich das:

Loop verringert die Variable "#Zeiger_Ringpuffer" selbst um 1.
Das ist dann wohl mein Fehler! :oops:

Aber wie bekommt er dann den Datensatz 0 gelöscht? Da erfolgt doch dann kein Rücksprung mehr, oder?


PS: Ich vermute mal, einen separaten Schleifenindex, oder?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab' das jetzt mal korrigiert (hoffentlich) und die Übergabe der aktuellen Uhrzeit auch gleich noch auf (wie vorgegeben) Bytes geändert:

Code:
[FONT=Courier New]FUNCTION_BLOCK "Ereignisspeicher"
TITLE =
AUTHOR  : Hucki
VERSION : 0.1


VAR_INPUT
  Speichern : BOOL ;	
  Reset : BOOL ;	
  Register : BLOCK_DB ;	
  DS_Laenge : INT ;	
  DS_Offset : INT ;	
  DS_Anzahl : INT ;	
  Uhrzeit : STRUCT 	
   Aktuell_Stunden : BYTE ;	
   Aktuell_Minuten : BYTE ;	
   Aktuell_Sekunden : BYTE ;	
  END_STRUCT ;	
END_VAR

VAR
  Zeiger_Ringpuffer : INT ;	
  Ereigniszaehler : INT ;	
  Schleifenindex : INT ;	
  FM_Speichern : BOOL ;	
  FM_Reset : BOOL ;	
END_VAR

VAR_TEMP
  Sicherung_AR1 : DWORD ;	
  Error : INT ;	
END_VAR


BEGIN

NETWORK
TITLE =

      U     #Speichern;
      FP    #FM_Speichern;
      SPBN  Neu; 

      AUF   #Register;

// Zeiger inkrementieren
      L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer 
      +     1; 
      T     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer

// Zeiger auf Überlauf prüfen
      L     #DS_Anzahl; // maximale Anzahl an Datensätzen
      L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
      <=I   ; 
      SPBN  over; 
      L     0; 
over: T     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer


// Ereigniszähler inkrementiern
      L     #Ereigniszaehler; // Ereigniszähler
      +     1; 
      T     #Ereigniszaehler; // Ereigniszähler

// AR1 sichern                            
      TAR1  ; // AR1 in Akku1 laden
      T     #Sicherung_AR1; // und im Temp sichern (im Forum so gelernt :) )

// Pointer erstellen
      L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
      L     #DS_Laenge; // Datensatzlänge
      *I    ; 
      L     #DS_Offset; // Startadresse des Datenfeldes
      +I    ; 
      SLD   3; // berechneten Wert auf die Byteadresse schieben
      LAR1  ; // und ins Adressregister 1 schreiben

// Daten eintragen
      L     #Ereigniszaehler; // Ereigniszähler
      T     DBW [AR1,P#0.0]; // und wieder sichern

      L     #Uhrzeit.Aktuell_Stunden; // Aktuelle Stunde (könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#4.0]; // und in Ringpuffer sichern

      L     #Uhrzeit.Aktuell_Minuten; // Aktuelle Minute (könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#5.0]; // und in Ringpuffer sichern

      L     #Uhrzeit.Aktuell_Sekunden; // Aktuelle Sekunde (könnte man auch getrennt übergeben) laden
      T     DBB [AR1,P#6.0]; // und in Ringpuffer sichern

// AR1 wiederherstellen                            
      L     #Sicherung_AR1; // Gesicherten Wert laden
      LAR1  ; // und ins AR1 zurückschreiben




// Register ggf. resetten
Neu:  U     #Reset; // Öffner-Taster
      FN    #FM_Reset; // deswegen negative Flanke
      SPBN  ende; 

// AR1 sichern                            
      TAR1  ; // AR1 in Akku1 laden
      T     #Sicherung_AR1; // und im Temp sichern

// Zeiger initialisieren
      L     #DS_Anzahl; // maximale Anzahl an Datensätzen
      +     1; // für Start um 1 erhöhen

// Schleifenstart = Zeiger dekrementieren
Next: T     #Schleifenindex; // als Schleifenindex speichern
      +     -1; // um 1 verringern
      T     #Zeiger_Ringpuffer; // als Zeiger für Ringpuffer speichern

// Pointer erstellen
      L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
      L     #DS_Laenge; // Datensatzlänge
      *I    ; 
      L     #DS_Offset; // Startadresse des Datenfeldes
      +I    ; 
      SLD   3; // berechneten Wert auf die Byteadresse schieben
      LAR1  ; // und ins Adressregister 1 schreiben

// Daten eintragen
      L     0; // Wert 0
      T     DBD [AR1,P#0.0]; // ins 1. DWORD eintragen

      L     0; // Wert 0
      T     DBD [AR1,P#4.0]; // ins 2. DWORD eintragen

// Zeiger auf Null prüfen
      L     #Schleifenindex; // Schleifenzähler laden,
      LOOP  Next; // um 1 verringern und Schleife wiederholen, wenn Schleifenzähler noch > 0

// AR1 wiederherstellen                            
      L     #Sicherung_AR1; // Gesicherten Wert laden
      LAR1  ; // und ins AR1 zurückschreiben

ende: NOP   0; 

END_FUNCTION_BLOCK[/FONT]


@Minico89,
sorry, wenn ich bei den Lokalvariablen bleibe, aber das Hantieren mit den Merkern bzw. globalen Daten innerhalb des FBs ist in meinen Augen einfach "unschön" und deshalb will ich niemanden erst dazu motivieren.
Der Aufruf des FBs würde dann mit der Übergabe der benötigten Sachen (die Du bis jetzt global oder als Konstante im FB angibst) an der Schnittstelle z.B. so aussehen:

 
Code:
[FONT=Courier New]FUNCTION_BLOCK "Ereignisspeicher"
TITLE =
AUTHOR  : Hucki
VERSION : 0.1


V[COLOR="#FF0000"]AR_INPUT
  Speichern : BOOL ;	
  Reset : BOOL ;	
  Register : BLOCK_DB ;	
  DS_Laenge : INT ;	
  DS_Offset : INT ;	
  DS_Anzahl : INT ;	
  Uhrzeit : STRUCT 	
   Aktuell_Stunden : BYTE ;	
   Aktuell_Minuten : BYTE ;	
   Aktuell_Sekunden : BYTE ;	
  END_STRUCT ;	
END_VAR

VAR
  Zeiger_Ringpuffer : INT ;	
  Ereigniszaehler : INT ;	
  Schleifenindex : INT ;	
  FM_Speichern : BOOL ;	
  FM_Reset : BOOL ;	
END_VAR

VAR_TEMP
  Sicherung_AR1 : DWORD ;	
  Error : INT ;	
END_VAR
[/COLOR]


@Minico89,
sorry, wenn ich bei den Lokalvariablen bleibe, aber das Hantieren mit den Merkern bzw. globalen Daten innerhalb des FBs ist in meinen Augen einfach "unschön" und deshalb will ich niemanden erst dazu motivieren.
Der Aufruf des FBs würde dann mit der Übergabe der benötigten Sachen (die Du bis jetzt global oder als Konstante im FB angibst) an der Schnittstelle z.B. so aussehen:


Was mache ich mit dem rot-markierten Code, wo schreibe ich das hin? Und danke hucki, das mit den Lokalvariablen ist gut!
 
Du gehst im Simatikmanager auf den Ordner Quellen und fügst Dir dort ein neues Objekt vom Typ AWL-Quelle ein.
Die öffnest Du dann und kopierst Dir den gesamten Code, den ich gepostet habe, dort hinein.
Anschließend läßt Du diesen Code über das Menü Datei->Übersetzen na? ... -> Übersetzen, richtig!

S7 erstellt Dir dann daraus den kompletten FB, vorausgesetzt es findet den FB-Namen "Ereignisspeicher" (oder den von Dir gewünschten) im Symboleditor. Alternativ könnte man in der Quelle auch direkt z.B. FB2 anstelle von "Ereignisspeicher" angeben.


Ansonsten kannst Du die von Dir rot markierte Deklaration der Lokalvariablen natürlich auch von Hand in die Schnittstelle des FBs eintragen, die Du oberhalb der Netzwerke im Editor findest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay, das mit dem Übersetzen hat nicht geklappt, es wirft mir 29 Fehler und 6 Warnungen aus!

Ich glaube das Variablen eintippen werde ich bevorzugen, nur was trage ich ein in:

IN:
Speichern : BOOL ;
Reset : BOOL ;
Register : BLOCK_DB ;
DS_Laenge : INT ;
DS_Offset : INT ;
DS_Anzahl : INT ;
Uhrzeit : STRUCT
Aktuell_Stunden : BYTE ;
Aktuell_Minuten : BYTE ;
Aktuell_Sekunden : BYTE ;
END_STRUCT ;

OUT:

IN_OUT:

STAT:
Zeiger_Ringpuffer : INT ;
Ereigniszaehler : INT ;
Schleifenindex : INT ;
FM_Speichern : BOOL ;
FM_Reset : BOOL ;

TEMP:
Sicherung_AR1 : DWORD ;
Error : INT ;


Stehen die Sachen an den richtigen Stellen?????
 
PLANÄNDERUNG

Okay, ich versuche es auf eine andere Weise mit dem folgenden Code:

Code:
      U     E    124.1
      FP    M     10.1
      SPBN  ende

      L     "Uhrzeit".Aktuell_Stunden
      T     #Temp_akt_h

      L     "Uhrzeit".Aktuell_Minuten
      T     #Temp_akt_m

      L     "Uhrzeit".Aktuell_Sekunden
      T     #Temp_akt_s



      AUF   "Register"

// Zeiger inkrementieren
      L     MW    12                    // Zeiger für Ringpuffer
      +     1
      T     MW    12                    // Zeiger für Ringpuffer

// Zeiger auf Überlauf prüfen
      L     20                          // maximale Anzahl an Datensätzen
      L     MW    12                    // Zeiger für Ringpuffer
      <=I   
      SPBN  over
      L     0
over: T     MW    12                    // Zeiger für Ringpuffer


// Ereigniszähler inkrementiern
      L     MW    14                    // Ereigniszähler
      +     1
      T     MW    14                    // Ereigniszähler

// Daten eintragen
      L     MW    12                    // Zeiger für Ringpuffer
      L     8                           // Datensatzlänge
      *I    
      +     10                          // Startadresse des Datenfeldes
      SLD   3
      LAR1  

      L     MW    14                    // Ereigniszähler
      T     DBW [AR1,P#0.0]             // und wieder sichern

      L     #Temp_akt_h                 // Aktuelle Stunde laden
      T     DBB [AR1,P#4.0]             // und in Ringpuffer sichern

      L     #Temp_akt_m                 // Aktuelle Minute laden
      T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern

      L     #Temp_akt_s                 // Aktuelle Sekunde laden
      T     DBB [AR1,P#6.0]             // und in Ringpuffer sichern

ende: NOP   0


Dieser Code soll erweitert werden, und zwar folgendermaßen:

Wenn die FN vom E 124.2 kommt soll eine Schleife Anfangen im Eintrag [0] den Wert Null für alles zu schreiben. Alle 5 ms soll der Zeiger dann weiterspringen im Eintrag [1] , [2] usw... wieder auf Null zurücksetzen.

Wenn ich das mal so überdenke soll die Schleife also 2000 mal springen alle 5ms , d.h. 10 sek.

Wie zum Henker setze ich das in einen Code um??? :cry:
 
Okay, das mit dem Übersetzen hat nicht geklappt, es wirft mir 29 Fehler und 6 Warnungen aus!
Die 6 Warnungen sind wegen der indirekten DB-Zugriffe.

Aber was zeigt er denn bei den 29 Fehlern an? :confused:
Irgendwo ein Semikolon oder so gelöscht oder irgendwas geändert?
Kannst Du mal ein Screenshot von der Infozeile mit den Fehlern hochladen?


Anschließend wenden wir uns dann der Planänderung zu.
Immer schön eins nach dem anderen.
;)
 
Zurück
Oben