TIA Meldung mit Date and Time in DB schreiben

Zuviel Werbung?
-> Hier kostenlos registrieren
ohne jetzt alle beiträge gelesen zu haben....(schande über mein haupt)

ich denke, dass dein array die letzten 100 einträge enthalten soll.
also wäre ein fifo sinnvoll. beim eintragen alle elemente um ein nach unten schieben und oben an der freien stelle den neuen eintragen.
der folgende code ist syntax-technisch nicht ok. dient nur dem prinzip

das stösst du mit einer positiven flanke an wenn ein neuer eintrag erstellt werden soll.
Code:
for i = 99 to 0 by -1 do 
    "datenbaustein_1".element(i+1) = "datenbaustein_1".element(i)
next
"datenbaustein_1".element(0) = "datenbaustein_2".neuer_eintrag
 
Moin Volker,

ohne jetzt alle beiträge gelesen zu haben....(schande über mein haupt)

ich denke, dass dein array die letzten 100 einträge enthalten soll.
also wäre ein fifo sinnvoll. beim eintragen alle elemente um ein nach unten schieben und oben an der freien stelle den neuen eintragen.
der folgende code ist syntax-technisch nicht ok. dient nur dem prinzip

das stösst du mit einer positiven flanke an wenn ein neuer eintrag erstellt werden soll.
Code:
for i = 99 to 0 by -1 do 
    "datenbaustein_1".element(i+1) = "datenbaustein_1".element(i)
next
"datenbaustein_1".element(0) = "datenbaustein_2".neuer_eintrag

Dann müssen aber 100 (99-0) + 1 Kopiervorgänge durchgeführt werden. Bei einem Ringpuffer brauchst Du nur einen Kopiervorgang.

VG

MFreiberger


Gesendet von iPhone mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
da hast du recht.
aber beim fifo-prinzip hat man eine eindeutige sortierung. neuste oben. älteste unten.
und über die zeit die man zum umkopieren braucht mach ich mir heutzutage ehr weniger sorgen.
zu s5 und anfänglichen s7-zeiten war das noch etwas anders. natürlich kommt es auch auf die datenmege an
 
da hast du recht.
aber beim fifo-prinzip hat man eine eindeutige sortierung. neuste oben. älteste unten.
und über die zeit die man zum umkopieren braucht mach ich mir heutzutage ehr weniger sorgen.
zu s5 und anfänglichen s7-zeiten war das noch etwas anders

Dafür kopiere ich einen Ausschnitt vom letzten Eintrag an (die letzten 10 Einträge oder so) in einen anderen Datenbereich. Wir nutzen einen Ringpuffer mit 500 Einträgen zur Übertragung per OPC UA an einen Rechner. Dieser liest die aktuellste Meldung und so viele aus der Historie wie er will.


Gesendet von iPhone mit Tapatalk
 
Dafür kopiere ich einen Ausschnitt vom letzten Eintrag an (die letzten 10 Einträge oder so) in einen anderen Datenbereich. Wir nutzen einen Ringpuffer mit 500 Einträgen zur Übertragung per OPC UA an einen Rechner. Dieser liest die aktuellste Meldung und so viele aus der Historie wie er will.
klar. kann man so machen. viele wege führen nach rom.
man muss immer irgendwie entscheiden was für die jeweilige applikation am sinnvollsten ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann müssen aber 100 (99-0) + 1 Kopiervorgänge durchgeführt werden. Bei einem Ringpuffer brauchst Du nur einen Kopiervorgang.
??? FIFO und RingPuffer schliessen sich doch nicht gegenseitig aus! Bzw. der Begriff FIFO besagt nicht, ob die Realisierung einen RingPuffer verwendet oder nicht.
Bei einem RingPuffer hat man 2 Zeiger, einen auf das erste belegte Element und einen auf das letzte belegte (oder das Element danach).
Die nicht-RingPuffer-Variante eignet sich bestens für ein LIFO, weil man dort sowieso nicht die angesammelten Daten aufrücken muss.

Gruss, Heinileini
 
Ok
Ich würde es jetzt gern in SCL versuchen...
Ich möchte immer wenn mein Eingang I1.0 ein positives Signal bekommt, das in meinem DB1 "Logbuch"
sowohl "Date" als auch "Time_of_Day" eingetragen wird wenn möglich auch noch eine ID um es eventuell mal noch auszubauen.

mein DB1 Array[0..100]

hat da jemand einen SCL Ansatz da ich mich damit nicht auskenne

Danke
 
Moin Byte0815,

eingentlich gibt es in diesem Thread schon div. Beispiele, in denen es in SCL ausprogrammiert ist.
Wo liegt das (Verständnis-)Problem?
Hast Du bereits ein SCL-Netzwerk eingefügt?

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grüße MFreiberger

Ja ich habe bereits ein SCL Netzwerk eingefügt.

Das Verständnisproblem liegt darin.

Ich habe mir einen DB1"Logbuch" erstellt.
beinhaltet Array (0..100) of Struct
*Date D#1990-01-01
*Time_of_Day TOD#00:00:00
*Index false


Dann habe ich im FUP

Die Zeit und das Datum mit RD_LOC_T ausgelesen.

Jetzt würde ich ein SCL Netzwerk einfügen um die Daten in den DB1 zu schreiben
 
Moin Byte0815,

Ich habe mir einen DB1"Logbuch" erstellt.
beinhaltet Array (0..100) of Struct
*Date D#1990-01-01
*Time_of_Day TOD#00:00:00
*Index false

Sinnvoller wäre ein eigener Datentyp. Unter "PLC-Datentypen" einfach einmal einen neuen Datentyp hinzufügen. Wird wie ein DB deklariert. Also einfach
DATE
TOD
BOOL
einfügen. Dann in Deinem DB mit Array statt "struct" Deinen Datentyp dranschreiben.
Dazu noch, neben dem Array eine weitere Variable mit Deinem Datentypen deklarieren.

Also:
Aktualdaten = myDatentyp
Element = Array[0..100] of myDatentyp


Jetzt mit einfacher Zuweisung:

"DB".Element[#i] := "DB".Aktualdaten;


VG

MFreiberger
 
Ok habe habe ich gemacht.

und wie weiße ich jetzt zu das bei der positiven Flanke I1.0 der Wert geschrieben werden soll ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Byte0815,

und wie weiße ich jetzt zu das bei der positiven Flanke I1.0 der Wert geschrieben werden soll ?

...das ist doch die Aufgabe? Bei einer Flanke den Wert schreiben?:s22:


Also, wie in mehreren Beispielen dieses Threads beschrieben:

Flanke erzeugen:
TRIG_FP := TRIG and not TRIG_FP_AUX;
TRIG_FP_AUX := TRIG;
Kannst Du auch anders programmieren (mit der trig-Funktion o.ä.).


WENN (IF) der Trigger da ist (Positive Flanke), DANN (THEN)
Wert zuweisen
FERTIG (END_IF)

IF TRIG_FP THEN
"DB".ELEMENT := "DB".Aktualadaten;
// i inkrementieren....
END_IF;


VG

MFreiberger
 
hier mal was. ungetestet.
den db_neuer_eintrag musst du natürlich noch mit daten versorgen.
 

Anhänge

  • Zwischenablage02.jpg
    Zwischenablage02.jpg
    230,1 KB · Aufrufe: 28
Möchte mich auch nochmal äussern, vor allem dazu:

Moin Volker,
Dann müssen aber 100 (99-0) + 1 Kopiervorgänge durchgeführt werden. Bei einem Ringpuffer brauchst Du nur einen Kopiervorgang.

da hast du recht.
aber beim fifo-prinzip hat man eine eindeutige sortierung. neuste oben. älteste unten.
und über die zeit die man zum umkopieren braucht mach ich mir heutzutage ehr weniger sorgen.
zu s5 und anfänglichen s7-zeiten war das noch etwas anders. natürlich kommt es auch auf die datenmege an

Hier meine Umsetzung in FUP:

Meldungslog.JPG

Hatte das damals (FW 3.x) erstmal gemacht, um den Einfluss auf die Zykluszeit zu sehen, Arraygrenzen (1x Date, 1x ToD, 1x Int Ereignisnummer) waren testweise 1023.

Laut TIA Zykluszeitanzeige lief das Gesamtprogramm durchschnittlich in 2ms, max. Zykluszeit war 4ms (CPU1214). Das war deutlich schneller als erwartet, da hab ich mir das Zeiger-Gebastel geschenkt und es so belassen. Ich vermute mal, das der MOVE_BLK an sich eh eine Zeiger-Umsetzung ist.

Das Ganze dient der Protokollierung (fast) jeder Aktion der Anlage, ist auch bei der Fehlersuche nützlich. Bei bestimmten Ereignisnummern wird der gesamte DB noch dauerhaft in den Ladespeicher kopiert.

Ja, ich weiß, es ist kein SCL, liesse sich aber wahrscheinlich recht einfach umsetzen. Ich komme momentan noch mit FUP über die Runden ....

Grüße,
Gleichstromer
 
So ich habe es jetzt mal so umgesetzt.
Es funktioniert auch :) .
Jetzt habe ich nur das Problem das ich es über Online und dann steuern auf 1 probiert habe.
Jetzt schreibt er mir aber das ganze "Logbuch" voll....

und bekomme ich es irgendwie hin das ich meine Meldung richtig benennen kann mit Namen oder nur Hexadezimal ?
 
hast du dir meinen post #33 (bild) angesehen.
und wie sollen wir wissen was du falsch machst wenn wir keinen code sehen.
 
Jetzt habe ich nur das Problem das ich es über Online und dann steuern auf 1 probiert habe.
Jetzt schreibt er mir aber das ganze "Logbuch" voll....
Was hast Du auf 1 gesteuert?
Wird Dein M5.0 noch woanders verwendet, eventuell durch andere Variablen überlappt (MB5, MW4, MW5, MD2/3/4/5)?
Wie sieht Dein Code des FC1 aus?

und bekomme ich es irgendwie hin das ich meine Meldung richtig benennen kann mit Namen oder nur Hexadezimal ?
Könntest Du Dich mal wie ein Programmierer eindeutig ausdrücken was Du meinst?
Meinst Du vielleicht den Meldetext, den Du mit in den Meldeeintrag speichern willst? Vermutlich beobachtest Du den nur falsch, wenn er Dir hexadezimal angezeigt wird.

Harald
 
Ich hatte meinen Eingang I1.0 auf True geforced .

Jetzt funktioniert es ich hatte tatsächlich eine Überlagerung von M5.0 mit MD5 gehabt.

Genau ich meine den Meldetext, dieser wird mir aktuell nicht als Text ausgegeben.
Dieser müsste mir ja eigentlich in meinem DB_Logbuch unter Meldetext angezeigt werden. In meinem DB wird aber nur ´$00´ angezeigt
 
Zurück
Oben