Werte in DB archivieren bzw schieben

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen suche eine einfache Lösung um einen wert in den DB zu schreiben und bei dem nächsten wert immer einen weiterzuschieben also das die Werte praktisch gespeichert werden.

Also Wert kommt geht sage ich mal ins datenword 0
2 ter Wert kommt erster ins word 2 und der neue ins 0
usw

Du könntest mit einem FIFO-Speicher arbeiten:

http://www.sps-forum.de/showpost.php?p=215073&postcount=3

http://www.sps-forum.de/showpost.php?p=215075&postcount=4

Gruß Kai
 
Ok

ich vrstehe das irgendwie nicht ist vieleicht schon zu spät heute danke erstmal werde mich morgen damit beschäftigen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich muss immer in der lage sein die 100 Werte auszudrucken daher in DB und dann über Panel im Protokol einlesen und drucken

Wenn Du Dein Panel mit VBScript programmieren kannst, dann könntest Du den FIFO-Speicher auch direkt als VBScript im Panel programmieren.

Siehe dazu das nachfolgende Programmbeispiel für WinCC flexible:

http://www.sps-forum.de/showthread.php?t=22745

Gruß Kai
 
Danke Kai

habe mich mit der Materie noch nicht beschäfzigt geht das beim op77b ?? und kann man das auch drucken ??
Gruß Micha
 
MW hatte im chat grad den FC90(??sicher war er sich auch nicht) ins feld geworfen ... der kann das schieberegister wohl auch in KUP
 
Wenn du in AWL nicht so fit bist, kannst du auch einen fertigen Baustein aus der Siemens Lib nehmen, dass ist der FC90 "WSR" aus der Standart Library->TI-S7 Converting Blocks. Der stellt die von dir benötigte Schiebefunktion bereit.

Ja der VL war wieder schneller oder ich zu langsam :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Micha,

ich weiß nicht ob Du in SCL fit bist. Mit 20 Zeilen Code wäre das Problem sicher
abgeschlossen. Sogar noch mit einem Zeitstempel zu dem Wert und einem
zusätzlichen Bit das nach 100 Werten gesetzt wird und was Du dann in Deinem
Panel, als Bitmeldung, zum autom. Ausdruck des Protokolls verwenden kannst.

Hier die Grundidee :

VAR
Datenpuffer : ARRAY[0..99] OF
STRUCT
Wert : INT ; //Format evtl. ändern
Datum : DATE_AND_TIME ; //mit READ_CLK
END_STRUCT ;
END_VAR

Der zugehörige Instanzdatenbaustein mit 100 Indexvariablen wird dann automatisch angelegt.

Jetzt muß man einmal eine FOR-Schleife durchlaufen und die Werte jeweils eine Indexvariable nach vorn kopieren und den neuen Wert in das letzte Fach eintragen.
In der FOR-Schleife dann eine Varable jeweils um +1 erhöhen und bei 100, ein Bit zum
Ausdrucken des Protokolls setzen und vom Panel wieder zurücksetzen.

Gruß fmbux
 
Umkopieren mit SFC20 "BLKMOV"

Hallo Micha,

also der zu letzt gemessene muss oben stehn
dachte halt es gibt ne funktin wo man die int im DB komplett verschieben kann
Muß der zuletzt gemessene Wert unbedingt oben = am Anfang des Array stehen?

Üblicherweise steht am Anfang der älteste Wert und am Ende der neueste Wert.
Dann sind die Meßwerte historisch richtig sortiert, so daß das Array auch gleich
als Trendkurve ausgegeben werden kann (ältester=Links, neuester=Rechts).

Und dann kann man statt der Schleife eine fertige Funktion für das Umkopieren der
99 Meßwerte vor dem Einspeichern des neuen Wertes benutzen: SFC20 "BLKMOV"
Der SFC20 kopiert immer aufsteigend und benötigt nur etwa ein siebtel der Zeit
einer Schleife.
Code:
      U     #Trigger
      SPBN  END

      CALL SFC20
       SRCBLK :=P#DB100.DBX 2.0 WORD 99
       RET_VAL:=#Temp_Int
       DSTBLK :=P#DB100.DBX 0.0 WORD 99

      L     #Messwert
      T     DB100.DBW 198

END:  NOP   0
Aber wie gesagt, SFC20 geht nur, wenn der neueste Meßwert unten/hinten steht.

Gruß Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Danke

erstmal an alle die mir geholfen haben ja der letzte Wert muss oben stehen Zeit denke ich ist relativ es werden mit ner 313c nur die werte ausgelsen und eine bewegung und nen paar Lampen mehr macht das ding nicht ok es sind 3 mal 100 werte aber sollte funzen
nein mit er Hochsprache habe ich mich leider noch nicht beschäftigt
Micha
 
oki

danke der baustein vom kai hat mir sehr geholfen habe noch abschließend ne frage weiß ist die falsche rubrik aber bekomme ich die Daten auf einen schlag ins OP 77B
oder Variable für Variable
Micha
 
Der SFC20 kopiert immer aufsteigend und benötigt nur etwa ein siebtel der Zeiteiner Schleife.

Hi PN/DP,

mal so 55% Offtopic:

Wie macht der SFC20 das eigentlich in 1/7 der Zeit einer Schleife?
Ist in dem SFC nicht auch nur "normaler" AWL-Code? Wenn ja, AWL ist ja bekanntlich sehr Maschinencode-nahe. :rolleyes: Hmmm, wie geht's denn dann noch schneller? :rolleyes: Grübel... Werde ich heute wohl nicht schlauer ins Bett gehen können...

Gruß
Flinn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Benchmark

Wie macht der SFC20 das eigentlich in 1/7 der Zeit einer Schleife?
Ist in dem SFC nicht auch nur "normaler" AWL-Code? Wenn ja, AWL ist ja bekanntlich sehr Maschinencode-nahe. :rolleyes:
Vielleicht hat der in S7-300 verbaute Prozessor einen Blockmove-Befehl im Microcode (MOVSB)?
Vielleicht arbeitet die SFC20 auch mit Speicheradressen in einem Flat-Modell und muß nicht für
jeden Speicherzugriff die DBx.DBWy-Adresse auf die tatsächliche Speicheradresse umrechnen?

Auch AWL ist nur eine (Hardware-nah aussehende) Interpretersprache. Der SFC20 ist aber schon
in echtem Maschinencode in der Firmware der CPU enthalten.

Das für uns Programmierer zugängliche AR1-Register enthält nur den "halben" Pointer (nur den
Offset zum Beginn des DB). Der Prozessor muß bei jedem AWL-Zugriff auf den Speicher den Wert im
AR1 prüfen, die Nummer des aktuell geöffneten DB (Selektor) ermitteln, dann aus einer Tabelle die
Anfangsadresse dieses DB auslesen und zum Offset aus dem AR1 addieren. Der SFC20 macht diese
Prüfung und Berechnung nur einmal.

Ich hatte mal für eine Thema, wo es um das Umspeichern von 2879 INT-Werten in einem FIFO ging,
auf einer echten CPU 315-2PN/DP (315-2EH13) verschiedene Programmversionen programmiert und
die benötigte Bearbeitungszeit gemessen: jede Minute einen Datensatz aufzeichnen
Code:
Normal verständliche AWL-Schleife    : 19,3ms
Optimierte Schleife                  : 16,2ms
2 INT-Werte gleichzeitig umspeichern :  8,7ms
mit SFC20 umspeichern                :  2,7ms
Daher kommt meine Aussage, daß der SFC20 nur ein siebtel der Bearbeitungszeit einer in AWL
programmierten Programmschleife benötigt.

Manche Sachen muß man einfach in der Praxis ausprobieren, um solche Erkenntnisse zu gewinnen.

Gruß Harald
 
Zuletzt bearbeitet:
Zurück
Oben