Step 7 Mit Pointer in Ringregister schreiben

Minico89

Level-1
Beiträge
66
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

ich benutze eine CPU314C-2DP.

Ich möchte gerne mit einem FB einen Tastendruck erkennen und diesen in ein Ringregister schreiben.
Jetzt ist die Frage wie ich einen Pointer benutze um im Register fortlaufend zu schreiben mit meinem Beispiel? Bisweilen überschreibe ich immer nur den ersten Eintrag!
Mein Quelltext kommt hier:

Netzwerk1 - Tastendruck erkennen

Code:
      U     E    124.1
      FP    M     10.0
      =     M     10.1

      U     M     10.1
      SPBN  M001
      L     "Register".Ereignis[0].Ereignisnummer
      L     1
      +I    
      T     "Register".Ereignis[0].Ereignisnummer

M001: NOP   0

Netzwerk2 - Uhrzeit (Stunden) protokollieren

Code:
      U     E    124.1
      FP    M     10.2
      =     M     10.3

      U     M     10.3
      SPBN  M003
      L     "Uhrzeit".Aktuell_Stunden
      T     #Temp_akt_h

M003: L     #Temp_akt_h
      T     "Register".Ereignis[0].Stunde

Ein Bild von meinem Db hänge ich auch dabei...
DB.jpg
M.f.G. Nico
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mal so ein Ansatz von mir. Keine Garantie, nur schnell runtergetippt und nicht getestet.

Code:
      U     E    124.1
      FP    M     10.1
      SPBN  ende


      AUF   "MyDB"

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

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

// Daten eintragen
      L     8
      *I    
      +     10
      SLD   3
      LAR1  

      L     DBW [AR1,P#0.0]             // Ereignis laden
      +     1                           // eins addieren
      T     DBW [AR1,P#0.0]             // und wieder sichern

      L     "Uhrzeit".Aktuell_Stunde    // Aktuelle Stunde laden
      T     DBW [AR1,P#4.0]             // und in Ringpuffer sichern

ende: NOP   0
 
Dann musst du uns auch sagen wo es genau klemmt.

Indirekt adressieren nach 5 Tagen wenn man vorher noch nix mit Programmieren zu tun hatte ist aber meist auch sportlich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weiss noch nicht genau wo es genau klemmt, ich versuche jetzt erstmal deinen Code in meinem einzubinden.

Nur eins verstehe ich nicht, und zwar:

Code:
// Daten eintragen
      L     8                      [COLOR="#FF0000"]//warum 8?[/COLOR]
      *I    
      +     10
      SLD   3
      LAR1  

      L     DBW [AR1,P#0.0]             // Ereignis laden
      +     1                           // eins addieren
      T     DBW [AR1,P#0.0]             // und wieder sichern

      L     "Uhrzeit".Aktuell_Stunde    // Aktuelle Stunde laden
      T     DBW [AR1,P#4.0]             // und in Ringpuffer sichern

ende: NOP   0
 
Entweder raff ich nicht was du grade geschrieben hast, oder ich bin total doof, aber mein Datensatz ist 2 Int und 3 Byte lang oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, klar. Aber wenn du in deinen Screenshot schaust stellst du fest, dass das Byte 17 nicht verwendet wird. Datentypen mit Word oder Doppelwortgröße beginnen immer an einer geraden Byteadresse. Und daher hast du 2 Integer, 3 Byte und ein Byte Reserve.
 
Ja, klar. Aber wenn du in deinen Screenshot schaust stellst du fest, dass das Byte 17 nicht verwendet wird. Datentypen mit Word oder Doppelwortgröße beginnen immer an einer geraden Byteadresse. Und daher hast du 2 Integer, 3 Byte und ein Byte Reserve.
 
Okay, ich hab den quellcode jetzt eingebunden und er erhöht nur die ereignisnummer um +1 bei jeder zweiten positive flanke.
die uhrzeit macht nichts mehr und im register nummer 90.0 steht dasselbe wie in 10.0. CRAZY!!!!! :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was soll die Ereignisnummer überhaupt aussagen?
Du müsstest bei jeder Positiven Flanke eine Bearbeitung des Programms haben, also müsste sich der Zeiger auch jedes mal ändern. Macht er das?
 
Ich hab jetzt was umgeschrieben und er springt jetzt immer einen eintrag weiter zur nächsten ereignisnummer!

Ich probiere jetzt erstmal wie weit ich komme ohne dumme fragen zu stellen, mal sehen wie lange :cool:... DANKE vorerst
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay, ich habs nicht hinbekommen dass die aktuelle Uhrzeit zu jedem Registereintrag geschrieben wird. Wie geht das, hat da jemand einen Code, bzw, eine Erweiterung für meinen Code?


Netzwerk 1
Code:
      U     E    124.1
      FP    M     10.0
      =     M     10.1

      U     M     10.1
      SPBN  M001
      L     "Register".Ereignis[0].Ereignisnummer
      L     1
      +I    
      T     "Register".Ereignis[0].Ereignisnummer




// Daten eintragen
      L     8
      *I    
      +     10
      SLD   3
      LAR1  

      L     DBW [AR1,P#0.0]             // Ereignis laden
      +     1                           // eins addieren
      T     DBW [AR1,P#0.0]             // und wieder sichern



M001: NOP   0

Netzwerk 2
Code:
      U     E    124.1
      FP    M     10.2
      =     M     10.3

      U     M     10.3
      SPBN  M003
      L     "Uhrzeit".Aktuell_Stunden
      T     #Temp_akt_h

M003: L     #Temp_akt_h
      T     "Register".Ereignis[0].Stunde

Netzwerk 3
Code:
      U     E    124.1
      FP    M     10.4
      =     M     10.5

      U     M     10.5
      SPBN  M004
      L     "Uhrzeit".Aktuell_Minuten
      T     #Temp_akt_m

M004: L     #Temp_akt_m
      T     "Register".Ereignis[0].Minute

Netzwerk 4
Code:
      U     E    124.1
      FP    M     10.6
      =     M     10.7

      U     M     10.7
      SPBN  M005
      L     "Uhrzeit".Aktuell_Sekunden
      T     #Temp_akt_s

M005: L     #Temp_akt_s
      T     "Register".Ereignis[0].Sekunde
 
Hallo,

erklär mir mal was du mit Ereignisnummer und Parameter meinst. Dann kann ich dir vielleicht was zaubern.
 
Hey,
im Endeffekt soll ein Ausfall eines Förderbands oder eines Elevators protokolliert werden.
Für den Anfang soll "Ereignisnummer" bedeuten, wie oft das Förderband ausgefallen ist, z.B. zum 1. mal um 09:15:23 Uhr, zum 2. mal um 12:14:53 Uhr, usw...
"ParameterXYZ" hat noch keine Bedeutung, bzw. da will ich später vielleicht nochmal was einfügen irgendwie! :confused: ;)
 
So, hab mal ein wenig umgebaut:

Code:
      U     E    124.1
      FP    M     10.1
      SPBN  ende


      AUF   "MyDB"

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

// Zeiger auf Überlauf prüfen
      L     MW    12                    // Zeiger für Ringpuffer
      L     10                          // maximale Anzahl an Datensätzen
      >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     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     "Uhrzeit".Aktuell_Stunde    // Aktuelle Stunde laden
      T     DBW [AR1,P#4.0]             // und in Ringpuffer sichern

      L     "Uhrzeit".Aktuell_Minute    // Aktuelle Minute laden
      T     DBW [AR1,P#4.0]             // und in Ringpuffer sichern

      L     "Uhrzeit".Aktuell_Sekunde    // Aktuelle Sekunde laden
      T     DBW [AR1,P#4.0]             // und in Ringpuffer sichern

ende: NOP   0

und bitte prüfe ob die Merker noch nicht verwendet sind. Wenn klemmt, einfach melden.

Edit:
Und die Anzahl Datensätze evtl. anpassen.
 
Hey, habs angepasst, klappt auch mit dem springen auf den nächsten Eintrag :s11:

Nur dummerweise schreibt er mir immer nur die Sekunden in das Feld für die Sekunden, der rest bleibt leer... hab mal versucht den Pointern andere Nummern zu geben, wollte aber auch net klappen...

Code:
      U     E    124.1
      FP    M     10.1
      SPBN  ende

    [COLOR="#00FF00"]  L     "Uhrzeit".Aktuell_Stunden
      T     #Temp_akt_h

      L     "Uhrzeit".Aktuell_Minuten
      T     #Temp_akt_m

      L     "Uhrzeit".Aktuell_Sekunden
      T     #Temp_akt_s
[/COLOR]


      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     MW    12                    // Zeiger für Ringpuffer
      L     10                          // maximale Anzahl an Datensätzen
      >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     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     DBW [AR1,P#[COLOR="#FF0000"]3.0[/COLOR]]             // und in Ringpuffer sichern

      L     #Temp_akt_m                 // Aktuelle Minute laden
      T     DBW [AR1,P#[COLOR="#FF0000"]4.0[/COLOR]]             // und in Ringpuffer sichern

      L     #Temp_akt_s                 // Aktuelle Sekunde laden
      T     DBW [AR1,P#[COLOR="#FF0000"]5.0[/COLOR]]             // und in Ringpuffer sichern

ende: NOP   0
 
Zurück
Oben