Daten Loggen für Anfänger

Beidendorfer

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin
vorweg ich bin ein Anfänger ;) und voll auf Motiviert ;)

Mein Problem ich will eine Leistungserfassung machen und diese Daten dann Abspeichern.

Meine Idee war die Daten ca. alle 30 Minuten in ein Arry zu schreiben! i Ein Zeitstempel wäre auch hilfreich!

Habe jetzt hier im Forum gelesen das es schöner ist diese Daten in DB zu schreiben. Aber habe da jetzt keine Ahnung wie ich das machen könnte?

Habe eine CPU 412-2 von Siemens und benutze den Simatic Manager

Wenn mir jemand helfen könnte wäre es klasse
 
lesetipp: Pointer Zeiger FIFO LIFO

datenbaustein macht schon sinn, gerade bei so seltenen zugriff, wie du die datenstruktur dann gestaltest, solltest du vorher wissen ...

zeitstempel
messwert
zeitstempel
messwert
...

wäre eine variante, da könntest du z.b. einen UDT anlegen mit struktur

zeitstempel
messwert

und in einem DB daraus dann ein array mit gewünschter länge machen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hört sich schon gut an, Hábe gerade eine UDT angelegt mit Zeitstempel und Daten

FIFO ist auch sehr interessant, aber wie bekomme ich die Daten in das UDT und danach in ein DB?

Wie gesagt Anfänger:rolleyes:
 
so, zwei screenshots.

im ersten siehst du, wie du den DB für 100 messwerte deklarieren kannst ... deklarationssicht

im zweiten siehst du die datensicht, des so deklarierten DBs, vorne stehen die adressen, auf die du zugreifen kannst und die ablage stellen damit benennen kannst
 
ja, ja, das essen war grad fertig :rolleyes:

hier kommen sie:
 

Anhänge

  • db_deklaration.png
    db_deklaration.png
    14,7 KB · Aufrufe: 160
  • db_daten.png
    db_daten.png
    35,4 KB · Aufrufe: 192
Bevor ihr hier jetzt weiter einsteigt ...

@Beidendorfer:
Ist dir das prinzipielle Verfahren, dass du in Step7 aufbauen mußt, damit so etwas korrekt funktioniert, klar ?
Also Pointer auf Schreibzeile(n), Daten dahin schreiben, Pointer für nächsten Vorgang erhöhen, Überprüfen, ob die Grenze des Schreib-Bereichs erreicht wurde, ggf. das Ganze auswerten ...
Falls nicht, dann sollten wir vielleicht erst an dieser Stelle weiter arbeiten ...

Gruß
LL
 
nein, du schreibst die daten in den DB, der userdatatyp gibt nur die struktur für den DB vor und ermöglicht es ein variables array zu erstellen ...

@larry: sorry, ich vergess manchmal, dass nicht immer gleich auf 100 funktioniert ... deine anmerkungen sollten auf jeden fall geklärt werden!
 
Habe ein UDT1 erstellt mit

Zeitstempel
Daten

Und ein DB112 was die Structur von UDT1 hat.

Nun muss ich die Daten in das DB schreiben?
und den Pointer erhöhen
wieder daten schreiben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun muss ich die Daten in das DB schreiben?
und den Pointer erhöhen
wieder daten schreiben?

richtig, wenn du einen ringspeicher bauen willst, also einmal voll machen und von oben beginnend, die werte wieder überschreiben... da du einen zeitstempel mit drinnen hast, sollte das so auswertbar sein ...
 
Bin jetzt schon ein ordentliches Stückchen weiter ;) THX

Aber nun zum FIFO

L P#0.0................................// Läd den Pointer mit 0.0
LAR1...................................// Läd das Adress Register 1
..........................................//mit Pointer
AUF DB 112
L DBW [AR1,P#0.0].............// Läde das Datenwort 1
.........................................//aus DB112

was Muss für einen Datentyp nehmen um ein TOD auszulesen? auch ein DBW?
 
TOD ist der Typ des Datenbereichs ... (im Prinzip ein DINT, dass die Millsek., die seit 0:00 vergangen sind beinhaltet). Du schreibst ihn also als DBD ...

Bitte bedenke beim Erhöhen des Pointers, dass du ihn um die Breite deines Datenbereichs erhöhen mußt und dass du dir den Pointer auch irgendwo "merken" mußt - warum nicht auch in dem DB ...?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
HAbe mir gedacht, ich speichere mir den Pointer im MW ab. Da ich nicht weiß wie es mit dem DB geht!


L 8
SLD 3
LAR1
AUF DB 112
L "MW988"
T DBD [AR1,P#0.0]

Sollte mir einen Pointer auf 8.0 setzen
den Inhalt von MW988 ind DB von 8.0 schreiben
funkt aber nicht so, sieht einer den fehler, wird bestimmt ein ganz kleiner sein?

Noch eine frage die mich brennend interessiert ;)
Kann ich den Wert von AR1 auslesen? oder von einer Variable?
wenn ja wo?
 
Zuletzt bearbeitet:
HAbe mir gedacht, ich speichere mir den Pointer im MW ab. Da ich nicht weiß wie es mit dem DB geht!


L 8
SLD 3
LAR1
AUF DB 112
L "MW988"
T DBD [AR1,P#0.0]

Sollte mir einen Pointer auf 8.0 setzen
den Inhalt von MW988 ind DB von 8.0 schreiben
funkt aber nicht so, sieht einer den fehler, wird bestimmt ein ganz kleiner sein?

suchst du deinen wert im DBW8? oder im DBD8, denn da sollte er stehen, ebenso im DBW10 ... denn du lädst ein wort in ein doppelwort, da werden 16bits des höherwertigen wortes mit null besetzt

Noch eine frage die mich brennend interessiert ;)
Kann ich den Wert von AR1 auslesen? oder von einer Variable?
wenn ja wo?

mit TAR1 kannst du den inhalt vom adressregister in den akku1 laden, und von da aus per T in ein 32bit weites feld schreiben, also ein dwort
 
moin

habe mir hier eine kleine schleife gebastelt!
MW900 hat den Anfangs INT-Wert und wird später auf den aktuellen Pointer erhöht!

MW988 hat den Daten werd der in mein DB geschrieben werden soll!

Nun mein problem: meine schleife läuft endlos wie kann ich sie unterbrechen? oder anhalten, stehe da irgendwie auf dem schlauch!



L "MW900"
SLD 3
LAR1
AUF DB 112
L "MW988"........................// zu speichender wert
T DBW [AR1,P#0.0]...........// Wert Abspeichern
L "MW900"
L 10
+I
T "MW900"
 
Also die Hilfe von der Simatic ist im Bezug auf LOOP sehr sehr mau :(

Habe mir eine Schleife selber gebastelt, nicht die beste lösung aber, einfach und doch mit fehlern, den die CPU geht in Stop und meckert rum, das der Pointer irgendwie auf die Adresse 1001 zeit, die es nicht gibt, wenn ich mein Program richtig verstehe läuft die Schleife aber nur 1 mal?


Code:
      L     1
      T     #Schleifen
ANF:  L     "MW100"
      SLD   3
      LAR1  
      AUF   DB   112
      L     "MW188"                     // zu speichender wert
      T     DBW [AR1,P#0.0]             //  Wert Abspeichern
      U     "M180.0"
      L     "MW100"
      L     10
      +I    
      T     "MW100"
      L     #Schleifen
      -I    
      L     0
      L     #Schleifen
      ==I   
      SPA   END
      SPB   ANF
END:  NOP   0
Liegt es an meinem Verständnis oder an diesem Morgen?
 
Liegt es an meinem Verständnis oder an diesem Morgen?

ja, das ist ein verständnis problem, denn ein absoluter sprung ist nun mal absolut und wird deine schleife davor schützen zum bedingten sprung durchzukommen ...


die LOOP ist doch eigentlich recht gut beschrieben... anzahl der durchläufe laden, rücksprungmarke einfügen mit dem transferbefehl in den schleifenindex, dann die anweisungen und am ende den schleifenindex laden und einen LOOP "rücksprungmarke" eingefügt, fertig ist die schleife ... das ist kein hexenwerk :rolleyes:

[edit]
noch zu der adresse: wo belegst du das "MW100" denn vor?
btw: eindeutige symbolik sieht anders aus
[/edit]
 
Zuletzt bearbeitet:
Zurück
Oben