# Prozessdaten einer CPU 317 auf Speicherkarte eines TP277 6'' speichern



## Starter (16 August 2011)

Hallo,
ich würde gerne eine größere Menge Prozessdaten aus einem Datenbaustein einer Steuerung CPU 317-2DP mittels eines Touchpannels TP277 6'' auslesen und auf ein externes Speichermedium (zb SD Karte) des Pannels in Form von CSV Dateien speichern. 

Wir haben bisher versucht es über Rezepturen zu lösen. Ich wollte nun mal hören ob ihr eventuell noch andere Alternativen kennt?

Im Voraus schon mal vielen Dank!!!


----------



## thomas_1975 (16 August 2011)

Hallo,
versucht es doch einmal mit Archiven 

gruß Thomas


----------



## Ing_Lupo (17 August 2011)

Guten Morgen

ist eine Frage der Menge an Prozeßdaten.

Ausleseintervall und Archivdauer.

was soll mit den Daten im nachhinein passieren ?

Gruß
ing_lupo


----------



## Starter (22 August 2011)

Ing_Lupo schrieb:


> Guten Morgen
> 
> ist eine Frage der Menge an Prozeßdaten.
> 
> ...


 
Moin ing_Lupo,
Vielen Dank für deine Antwort. Es handelt sich hierbei um eine Datenmenge von 128kByte also schon ganz schön groß. 

Bei Ausleseintervall und Archivdauer bin ich mir nicht sicher was du meinst?
Die Daten sollen möglichst als ganzes ausgelesen werden, falls das Panel damit nicht überfordert wird.

Die Daten sollen nachher mittels Excel ausgewertet werden. Es wäre daher schön wenn alle Daten in eine einzige Csv Datei passen würden. 

Wir haben es jetzt erstmal über ein Skript versucht und das funktioniert auch schon ganz gut. Leider scheint jedoch ab einer bestimmten Datenmenge das Pannel überfordert zu sein. 

Gruß
Starter


----------



## volker (22 August 2011)

also daten SICHER aus der cpu ins panel holen kannst du nur über eine rezeptur. 128k ist ne menge holz. das wirst du auf etliche rezepturen aufteilen müssen. das kann durchaus mehrere minuten dauern.

das bedeutet, dass wenn du den stand von einem bestimmten moment ablegen willst, du vorher erst die daten in einem db ablegen musst der erst wieder aktualisiert wird wenn die letzte rezeptur bearbeitet wurde


----------



## daschris (22 August 2011)

Hallo
kannst du mal das script posten mit dem ihr es macht. mach auch sowas des öfteren und es funktioniert ganz gut.

wichtig wäre auch noch wie die datenstruktur bei euch aussieht. Ist es nur ein Datentyp im DB? Gemischt? Oder Gemischt aber in Blöcken in DBs abgelegt?

Der Ausleseinterval wäre für mich auch wichtig, d.h. wann wird das auslesen angestossen und in welcher frequenz (sekündlich, minütlich, stündlich)

Daschris


----------



## Thomas_v2.1 (22 August 2011)

Wenn du die Archivierung über die Panel-interne Archivierung machst, würde ich mich an die Grenzen des Panels halten. Diese findest du in der WinCC flexible Hilfe unter "Leistungsmerkmale, Bediengerät".
Für dei TP277 ist dort z.B. eine maximale Anzahl an Einträgen pro Archiv von 10000 angegeben.
Da hängt es dann von deinem Archivierungszyklus ab, über welchem Zeitraum in diesem Archiv Daten vorhanden sind. Bei 1s Archivierungszyklus eben nur 10000 Sekunden (~ 2,7 Stunden). Bei 1 Minuten Archivierungszyklus dann eben 10000 Minuten. Das gilt aber nur wenn du nur eine Variable pro Archiv hast. Bei mehreren reduziert sich die Dauer dementsprechend. Du kannst aber bis zu 20 Archive anlegen. Ein Archiv entspricht dabei einer CSV-Datei.

Du musst dir nur noch überlegen wie du die Daten vom Panel herunterkopieren möchtest. Denn du kannst nicht einfach bei laufender Archivierung dem Panel die Archive "unter dem Arsch wegziehen". Dafür gibt es entsprechende Systemfunktionen.


----------



## Starter (22 August 2011)

daschris schrieb:


> Hallo
> kannst du mal das script posten mit dem ihr es macht. mach auch sowas des öfteren und es funktioniert ganz gut.
> 
> wichtig wäre auch noch wie die datenstruktur bei euch aussieht. Ist es nur ein Datentyp im DB? Gemischt? Oder Gemischt aber in Blöcken in DBs abgelegt?
> ...



Moin Daschris,
wir haben uns als Vorlage das Script aus der Siemens Hilfe genommen link:
http://support.automation.siemens.com/WW/view/de/28937150


Die Sache funktioniert schon ganz gut. für das Auslesen der gesamten 128kbyte Daten braucht das Panel jedoch ca 6 minuten, aber das ist natürlich auch ein ganz schöner Sack voll. 



Das einzige Problem was ich da noch habe ist , dass am Anfang der csv Datei einige Werte nich richtig aus dem DB gelesen werden. In der CSV Datei befinden sich nach dem Auslesen 8 Spalten mit je 4000 Werten. 



In manchen Spalten fehlen Jedoch zum Teil die ersten bis zu 100 Werte. Das ist jedoch nich konsistent. Ich habe sogar schon mal Glück gehabt und es waren alle Werte vorhanden. 



Beim nächsten Mal haben dann wieder am Anfang einger Spalten Werte gefehlt die dann einfach mit Null belegt werden. Es fehlen jedoch bis jetzt nur Werte am Anfang der Spalten, nie zwischen durch. Hat da viellecht jemand ne Idee?


Ich stelle Morgen auch nochmal mein aktuelles Script rein, wenn ich wieder auf der Arbeit bin.


Gruß vom
Starter


----------



## PN/DP (22 August 2011)

Starter schrieb:


> Beim nächsten Mal haben dann wieder am Anfang einger Spalten Werte gefehlt die dann einfach mit Null belegt werden. Es fehlen jedoch bis jetzt nur Werte am Anfang der Spalten, nie zwischen durch. Hat da viellecht jemand ne Idee?


Genau dieses Problem hat Volker in #5 gemeint:


volker schrieb:


> also daten SICHER aus der cpu ins panel holen kannst du nur über eine rezeptur.



Harald


----------



## PN/DP (22 August 2011)

Vielleicht hilft Dir dieser Beitrag zum Verstehen Deines Variablen-Lesen-Problems:
http://www.sps-forum.de/showpost.php?p=344409&postcount=41

Harald


----------



## Starter (24 August 2011)

PN/DP schrieb:


> Vielleicht hilft Dir dieser Beitrag zum Verstehen Deines Variablen-Lesen-Problems:
> http://www.sps-forum.de/showpost.php?p=344409&postcount=41
> 
> Harald


 
Ich habe es nun fast geschaft. Das Lesen und Speichern der 8*4000 DWord Werte= 128kByte funktioniert zuverlässig. Es fehlen nun auch keine Werte mehr am Anfang mancher Spalten der CSV Datei. 

Ich hatte lange übersehen, dass ich die Erfassungsart der Variablen auf die Option: "Auf Anforderung" stellen muss. Nun werden die 8*4000 Werte nur einmalig aktualisiert, wenn man das Bild öffnet auf dem sich der Button befindent der das Skript ausführt. 

Vorher wurden alle 8*4000 Werte jede Sekunde aktualisiert. Die Daten waren daher nicht konsistent, als das Skript angefangen hatte die Werte auf die Speicherkarte zu sichern. 

Das einzige Problem was ich jetzt noch habe ist, das beim eimaligen Aktualisieren der 8*4000 Werte für ca 30 Sekunden eine Kommunikationswarnung zwischen Steuerung und TP generiert wird. 

Das TP wird wohl mit dem Aktualisieren der großen Mengen an externen Variablen für kurze Zeit überfordert sein, was ja irgendwo auch verständlich ist. 

Die Frage die ich mir nun stelle ist, ob man das aktualisieren dieser 8* 4000 externen Variablen(die in mehreren Arrays abelegt sind) irgendwie besser koordinieren könnte. 

Dazu müsste ich aber erstmal wissen wie man das automatische einmalige Aktualisieren der Variablen beim Öffenen des Bildes(auf dem sich der Button befindent der das Skript auslöst) unterbindet.

Weiter müsste ich das Aktualisieren der Variablen mittels eines Skripts oder ähnliches so steuern können, so dass das TP nicht überfordert wird. 

Hat da vielleicht jemand eine Idee?

Anbei das jetzige Skript:

/****************************************************************

Dim fs, f, FName, Dataset, Header, Storage_Path, strName, strTemp, arr, strDir

SmartTags("dubidu")=1

' Ablagepfad festlegen 
Storage_Path = "Storage Card MMC" 

' Archivierungspfad (Eingangsparameter) und Dateiname zusammensetzen 
FName = Storage_Path & "\Test" & ".csv"


' FileObject erstellen
Set f = CreateObject("FileCtl.File")

' Datei öffnen bzw. erstellen, wenn sie noch nicht existiert
f.open FName, 8

For strTemp = 0 To 999
Dataset = SmartTags("Test_DB_Test_1.Teil_1 
f.linePrint(Dataset) 'Write the Dataset in File'
SmartTags("Fortschrittsanzeige")=SmartTag ("_Fortschrittsanzeige")+1 Next 

f.Close 'Datei wieder schließen / Close File' 

SmartTags("dubidu")=0
SmartTags("Fortschrittsanzeige")=0

' Verwendeten Speicher wieder freigeben
Set f = Nothing

/****************************************************************


----------



## PN/DP (25 August 2011)

Starter schrieb:


> Das einzige Problem was ich jetzt noch habe ist, das beim eimaligen Aktualisieren der 8*4000 Werte für ca 30 Sekunden eine Kommunikationswarnung zwischen Steuerung und TP generiert wird.


Ohh, Du hast noch ein - womöglich sogar größeres - Problem: 
In der ganzen langen Zeit, während Dein Lesen-und-Speichern-Script läuft (Schleife!), werden keine weiteren Scripte ausgeführt. WinCC flexible kann nur 1 Script "gleichzeitig".



Starter schrieb:


> Die Frage die ich mir nun stelle ist, ob man das aktualisieren dieser 8* 4000 externen Variablen(die in mehreren Arrays abelegt sind) irgendwie besser koordinieren könnte.
> 
> Dazu müsste ich aber erstmal wissen wie man das automatische einmalige Aktualisieren der Variablen beim Öffenen des Bildes(auf dem sich der Button befindent der das Skript auslöst) unterbindet.


Das automatische Aktualisieren aller Variablen, deren Verwendung im Bild WinCC flexible bekannt ist, kann man meines Wissens nicht unterdrücken. Selbst Variablen, die nur geschrieben werden sollen, werden von WinCC flex beim Bildaufbau gelesen. Auch eine Einstellung "Lesen nur auf Anforderung" hilft nicht.

Es ist klar, daß Deine tausenden Variablen nur zum Zweck des Exports einmalig konsistent gelesen werden sollen und deshalb jedes zyklische Lesen sinnlos ist. Genau dafür gibt es die "Rezepturen", die nur ein anderer Name für "Datensatz" sind. Rezepturen kann man sehr schön konsistent ins Panel einlesen und muß sich um die Aktualisierungsart und -rate überhaupt keine Gedanken machen (Systemfunktion GetDataRecordTagsFromPLC). Dein Problem mit dem Aktualisieren der 8 * 4000 Variablen gibt es dann gar nicht. Außerdem spart so eine Rezeptur in Deinem Projekt wohl auch ungemein Powertags.

Deine vielen Variablen werden doch wohl irgendwie wiederkehrend strukturiert sein oder sich strukturieren lassen - am besten als ARRAY[..] OF STRUCT, notfalls als ARRAY[..] OF BYTE oder ARRAY[..] OF DWORD. Dann betrachte das ganze als "ARRAY OF Datensatz" und bilde die Struktur eines Datensatzes in einer Rezeptur ab. Da man die Adressen einer Rezeptur in WinCC flex nicht dynamisch ändern kann, müßte Deine CPU etwas mithelfen und den jeweils zu lesenden Datensatz in die als Rezeptur parametrierten Adressen kopieren, die dann als Lesepuffer dienen. Dies wäre am einfachsten eine einzelne Struktur mit dem selben Aufbau wie das ARRAY[..] OF STRUCT. Die Rezeptur wäre dann auf genau diese einzelne Struktur anzulegen.

Ich hatte mal mit einem MP370 320 Datensätze je 220 Byte ~ 70kByte aus einer 315-2 PN/DP in eine csv-Datei zu exportieren.
Das Panel war per Ethernet mit der SPS verbunden.
Damit das Script zum Datensatz lesen und exportieren in die csv-Datei nicht die ganze Zeit die Scriptbearbeitung des Panels blockiert, habe ich das Script in 3 Scripte aufgeteilt und diese dann ereignisgesteuert aufgerufen.
Damit das schneller ging, hatte ich zum Auslesen je 4 Datensätze zu insgesamt 80 Datensatzblöcken je 880 Byte zusammengefasst. 
Wenn ich mich richtig erinnere, hat das ganze knapp 3 Minuten gedauert. Die Aktualisierungsrate der 2 Event-Variablen war wohl auf 500ms eingestellt. Während der Lesezeit habe ich am Panel einen Fortschrittsbalken angezeigt, damit der Operator den ordnungsgemäßen Fortgang sieht.

Vereinfacht dargestellt lief das so ab (DS = Datensatz):

```
[SIZE="1"]. . Panel . . . . . . . . . . . . .        . . SPS . . . . . . . . . . . . . . . . . . . . .

(1) Vorbereitungen, Header schreiben
    [COLOR="Blue"]DS_Nummer_REQ[/COLOR] := 1               --->  [COLOR="blue"]DS_Nummer_REQ[/COLOR] <> [COLOR="blue"]DS_Nummer_ACK[/COLOR] ?   <-------------+
    Exit                                    |                                               |
                                            v                                               |
                                           kopiert gewünschte(n) DS in Rezeptur-Buffer      |
[COLOR="blue"]DS_Nummer_ACK[/COLOR] Event "Änderung"       <---  [COLOR="blue"]DS_Nummer_ACK[/COLOR] := [COLOR="blue"]DS_Nummer_REQ[/COLOR]                   |
 |                                                                                          |
 v                                                                                          |
(2) [COLOR="blue"]DS_Nummer_ACK[/COLOR] = [COLOR="blue"]DS_Nummer_REQ[/COLOR] ?                                                         |
      [COLOR="DarkRed"]GetDataRecordTagsFromPLC[/COLOR]          -  DS wird aus Rezeptur-Buffer gelesen              |
    Exit                               /                                                    |
                  +--- fertig ----   <-                                                     |
                  |                                                                         |
                  +--> [COLOR="Blue"]rdStat[/COLOR] := 4   --->  [COLOR="blue"]rdStat[/COLOR] (kann als Quit Lesen ausgewertet werden)  |
                                              |                                             |
[COLOR="blue"]rdStat[/COLOR] Event "Änderung"              <---  --/                                              |
 |                                                                                          |
 v                                                                                          |
(3) [COLOR="blue"]rdStat[/COLOR] = 4 ?                                                                            |
      Export DS in csv-Datei                                                                |
      [COLOR="blue"]DS_Nummer_REQ[/COLOR] < letzte ?                                                              |
        INC [COLOR="blue"]DS_Nummer_REQ[/COLOR]            --->  -------------------------------------------------+
    Exit[/SIZE]
```
DS_Nummer_REQ, DS_Nummer_ACK und rdStat sind INT- oder WORD-Variablen in der SPS.
rdStat wird bei GetDataRecordTagsFromPLC als Statusvariable angegeben und signalisiert das Ende des Einlesens.
(x): Script (1), Script (2) und Script (3)

Script (1) wird vom Operator per Schaltfläche aufgerufen, prüft ob schon ein Export-Job läuft, erstellt die csv-Datei und fordert den ersten Datensatz an.
Script (2) wird aufgerufen, wenn die SPS das Bereitstellen des gewünschten Datensatzes im Rezepturpuffer in DS_Nummer_ACK signalisiert und startet das Einlesen des Datensatzes (der Rezeptur) aus dem Rezepturpuffer in das Panel (GetDataRecordTagsFromPLC).
Script (3) wird aufgerufen, wenn das Einlesen des Datensatzes in das Panel beendet ist (mit rdStat = 4 signalisiert), exportiert den Datensatz in die csv-Datei und fordert das Bereitstellen des nächsten Datensatzes im Rezepturpuffer der SPS an.

Die 3 Scipte können für besseres späteres Verstehen auch zu 1 Script zusammengefasst werden, dann muß der Script-Aufrufer dem Script einen Parameter mitgeben, wer der Aufrufer ist und am Anfang des Scriptes ist ein Sprungverteiler oder das Script ist in 3 Abschnitte eingeteilt, welche abhängig von der Caller-Nummer im Aufrufparameter bearbeitet werden.

Alle Variablen-Schreib- und -Lese-Vorgänge werden vom Panel ausgeführt (die SPS ist nur Server), deshalb ist die Dauer des Datenlesens fast nur von der Aktualisierungsrate der Event-Variablen abhängig, aber fast nicht von der Anzahl Variablen je Datensatz.
(genau genommen darf außerdem nicht schneller gelesen werden, als auf die MemoryCard geschrieben werden kann - dürfte aber bei den heutigen schnellen SD-Cards nicht vorkommen)
Beim Export jedes Datensatzes in (3) wird die Datei geöffnet und geschrieben und geschlossen.

Harald


----------



## Starter (25 August 2011)

Danke Harald,
ich werd das mal versuchen nach deiner Anleitung umzusetzten. 

Gruß
Starter


----------



## Starter (25 August 2011)

Beim Export jedes Datensatzes in (3) wird die Datei geöffnet und geschrieben und geschlossen.

Harald[/QUOTE]

Hallo Harald,
ich hätte da noch eine Frage zu deinem Ansatz mit den Rezepturen. Hast du alle deine Daten nachher in einer CSV Tabelle gehabt? 

Ich benutze zurzeit, zum Exportieren der Daten auf die Speicherkarte, die Funktion ExportDataRecords. Doch diese Funktion will ja bei jedem Datensatz eine neue CSV Datei anlegen. Ich würde aber gerne alle Daten in eine CSV Tabelle bekommen. Wie hattest du das gelöst? 

Habe ich da bei der Parametrierung der Funktion ExportDataRecords einen Fehler gemacht, gibt es da eventuell noch eine andere Funktion, oder kann ich vielleicht direkt auf die gelesenen Daten des Rezepts im RAM zugreifen um die mauell wegzuspeichern?

Gruß
Starter


----------



## PN/DP (25 August 2011)

Starter schrieb:


> kann ich vielleicht direkt auf die gelesenen Daten des Rezepts im RAM zugreifen um die mauell wegzuspeichern?


JA, genau! Nicht die Rezeptur als Rezeptur exportieren (ExportDataRecords) sondern die Werte der in der Rezeptur enthaltenen einzelnen Variablen lesen und formatiert in die csv-Datei schreiben.
Die Rezeptur ist nur die "Krücke", mit der ich eine große Anzahl Variablen konsistent als Datensatz mit Ende-Event in das Panel einlesen lasse.

Hier mal ein Programmauszug:
aus dem "Script(3)"

```
' Ausgabedatei für Append öffnen und Datensatzzeile schreiben
On Error Resume Next 'Dateioperations-Fehler auffangen
SimPC = SmartTags("_System\!_RT-Sim_!")
If SimPC Then 'PC-Windows
	Set fso = CreateObject("Scripting.FileSystemObject")
	Set f = fso.OpenTextFile(outfile, ForAppending, True) 'True: Erstellen, falls noch nicht vorhanden
	If Err.Number <> 0 Then
		SmartTags("Protokoll\OP_Job_Stat") = 17 'Fehler anzeigen - Job beenden
		ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Öffnen '" & outfile & "': " & Err.Description
		Exit Sub
	End If
	f.WriteLine DS_DataLine 'formatierte Datenzeile in Datei schreiben
	f.Close
Else 'WinCE
	Set f = CreateObject("FileCtl.File")
	f.Open outfile, ForAppending
	If Err.Number <> 0 Then
		SmartTags("Protokoll\OP_Job_Stat") = 17 'Fehler anzeigen - Job beenden
		ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Öffnen '" & outfile & "': " & Err.Description
		Exit Sub
	End If
	f.LinePrint DS_DataLine 'formatierte Datenzeile in Datei schreiben
	f.Close
End If
' Fehler beim Datei-Schreiben oder -Schließen?
If Err.Number <> 0 Then
	SmartTags("Protokoll\OP_Job_Stat") = 16 'Fehler anzeigen - Job beenden
	ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Schreiben '" & outfile & "': " & Err.Description
'	Exit Sub
End If
```

Die Function DS_DataLine formatiert die Ausgabezeile:

```
' Function DS_DataLine()
' erzeugt die Datenzeile des Schichtprotokolls als STRING:
'Zeitstempel, Bediener,
'T1 Kz, eing, ausg, zerstA, brenner%, Startzeit,Stopzeit,grund, ...
'...
Dim s, ts, sts
ts = SmartTags("ProtokollEintrag\SP_Edit.DS.TimeStamp") ' -> "31.12.2008 01:59:59"
sts = Chr(34)& Right("0" & DatePart("d", ts), 2) & "." & Right("0" & DatePart("m", ts), 2) & "." & DatePart("yyyy", ts) & " " _
	& Right("0" & DatePart("h", ts), 2) & ":" & Right("0" & DatePart("n", ts), 2) & ":" & Right("0" & DatePart("s", ts), 2) &Chr(34)
s = sts &";"& Chr(34)& SmartTags("ProtokollEintrag\SP_Edit.DS.NameSF") &Chr(34)

'T1 Kz, eing, ausg, zerstA, brenner%, Startzeit,Stopzeit,grund, ...
s = s &";"& Chr(34)& SmartTags("ProtokollEintrag\SP_Edit.DS.T1_Produkt") &Chr(34)
s = s &";"& SmartTags("ProtokollEintrag\SP_Edit.DS.T1_Tmp_Eingang") &";"& SmartTags("ProtokollEintrag\SP_Edit.DS.T1_Tmp_Ausgang")
s = s &";"& SmartTags("ProtokollEintrag\SP_Edit.DS.T1_I_Zerstaeuber") &";"& SmartTags("ProtokollEintrag\SP_Edit.DS.T1_Brennerleistung")

'...

DS_DataLine = s
```

Harald


----------



## Starter (26 August 2011)

PN/DP schrieb:


> JA, genau! Nicht die Rezeptur als Rezeptur exportieren (ExportDataRecords) sondern die Werte der in der Rezeptur enthaltenen einzelnen Variablen lesen und formatiert in die csv-Datei schreiben.
> 
> Harald


 
Moin Harald, Viele Dank für deinen Programmauszug. Leider steig ich da nicht ganz durch und muss dich nochmal um deine Hilfe bitten. 

Wo liest du denn nun deine Rezepturvariablen aus? Ich verstehe einfach nicht wie man auf die einzelnen Rezepturdaten zugreifen kann. Machst du das auch mit den Smarttags? 

Mit den Funktionen Chr(), Right(), DatePart() organisierts du doch nur den String neu, oder?


----------



## PN/DP (26 August 2011)

Die SmartTags("ProtokollEintrag\SP_Edit.DS. ...") sind die Variablen aus der Rezeptur.

In Step7 habe ich einen UDT_SP, der die Struktur eines Schichtprotokoll-Datensatzes beschreibt.
Dann habe ich mehrere DB, die jeweils ein Array OF UDT_SP enthalten und zusammen einen Ringpuffer für die Schichtprotokoll-Datensätze bilden.
Dann habe ich noch einen DB200, der einen einzelnen STRUCT UDT_SP ab DBB0 enthält. Das ist mein Kopierpuffer "SP_Edit".DS für alle Datensatz-Lese- und -schreiboperationen zwischen Panel und CPU. Die CPU kopiert dazu den jeweils angeforderten einzelnen Datensatz aus dem Ringpuffer-Array in diesen Kopier/Bearbeitungspuffer und ggf. auch wieder zurück.

Im flex-Projekt habe ich unter Variablen einen Ordner "ProtokollEintrag".
In dem Ordner sind alle Variablen meines Datensatz-STRUCT aus dem Datensatz-Kopierpuffer der CPU angelegt, alle Erfassungsart "Auf Anforderung".
z.B. CPU: DB200.DBB0.. (DATE_AND_TIME) "SP_Edit".DS.TimeStamp
-> in flex: SP_Edit.DS.TimeStamp (Date and time)

Dann habe ich eine Rezeptur "Schichtprotokoll", bei der unter "Elemente" alle Variablen aus dem Variablenordner "ProtokollEintrag" aufgeführt sind. Somit habe ich alle Variablen aus dem Datensatz-Kopierpuffer der CPU nun in der Rezeptur "Schichtprotokoll".


Zum Exportieren des gesamten Schichtprotokolls fordere ich nun von der CPU nacheinander alle Datensätze des Schichtprotokolls an, 
indem ich die gewünschte Datensatznummer in die Variable "DS_Nummer_REQ" schreibe. Die CPU kopiert den gewünschten Datensatz aus dem Ringpuffer in den Kopierpuffer "SP_Edit".DS und signalisiert das erfolgte Kopieren, indem sie die Datensatznummer aus "DS_Nummer_REQ" in "DS_Nummer_ACK" schreibt. Diese Variablen-Änderung von "DS_Nummer_ACK" ruft auf dem Panel das Script(2) auf, in dem das Lesen des Datensatzes aus "SP_Edit".DS eingeleitet wird:

```
If SmartTags("Protokoll\DS_Nummer_ACK") = SmartTags("Protokoll\DS_Nummer_REQ") Then
    GetDataRecordTagsFromPLC "Schichtprotokoll", SmartTags("Protokoll\rdStat")
End If
```
Die flexible-Runtime liest nun den Datensatz aus der CPU aus "SP_Edit".DS (die Rezeptur "Schichtprotokoll") in das Panel in die Rezepturvariablen SmartTags("ProtokollEintrag\SP_Edit.DS. ...") ein und signalisiert das erfolgreiche Ende des Lesens, indem es eine 4 in SmartTags("Protokoll\rdStat") schreibt. Durch diese Änderung von rdStat wird Script(3) aufgerufen, welches die Werte der eben gelesenen Variablen SmartTags("ProtokollEintrag\SP_Edit.DS. ...") liest und formatiert in die csv-Datei schreibt. (siehe #15)



Starter schrieb:


> Mit den Funktionen Chr(), Right(), DatePart() organisierts du doch nur den String neu, oder?


Ja, für die formatierte Ausgabe der Werte in die csv-Datei habe ich nun alle Freiheiten.
z.B. formatiere ich SmartTags("ProtokollEintrag\SP_Edit.DS.TimeStamp") von S7-DATE_AND_TIME in einen String nach dem Muster "31.12.2008 01:59:59" unabhängig von den regionalen Einstellungen des Panels. Mit Chr(34) schreibe ich Hochkomma vor und hinter String-Variablen in die csv-Datei.

Harald


----------



## Starter (1 September 2011)

Moin Harald,
nochmals besten Dank für all deine Hilfe. Das Lesen und Speichern der 32000 DWord Variablen auf der Speicherkarte des Panels funktioniert nun zuverlässig, ohne Bus-Kommunikationsfehler und dauert ca. 5 bis 7 Minuten jenachdem wie groß man die Datensätze wählt. Damit bin ich sehr zufrieden.

Es ist mir bis jetzt nur noch eine kleine Sache aufgefallen die ich mir nicht erklären kann. Und zwar, wenn man während des Lesens und Speicherns der gesamten Datenmenge(also während der 5-7min) das Bild verlässt und zwischen durch auf anderen Bildern unterwegs ist bleibt manchmal der Prozess des Lesen uns Schreiben der Datensätze hängen. 

Es kommt dabei jedoch nicht zu Fehlern, die Skripte und Systemfunktionen werden bis zum Ende ausgeführt und melden auch eine erfolgreiche Ausführung. Ich habe mir deswegen eine zusätzliche Schaltfläche auf meinem Bild angelegt mit dem ich nochmal alle Skripte anstoße. Danach wird der Prozess auch weiter ausgeführt jedoch fehlt am Ende in manchen Fällen ein Datensatz. 

Hast du da vielleicht eine Idee, was dass sein könnte? Meinst du das ist ein Programmierfehler von mir, oder liegt das am Panel. Hattest du eventuell ähnliche Erfahrungen mit deiner Lösung gemacht.

Meine Lösung ist deiner sehr Ähnlich. Ich habe auch 3 Skripte angelegt. Eins zum Lesen der Datensätze aus der SPS, eins zum Speichern der Datensätze auf der SD-Karte und das letzte zum koordinieren des Prozesses. Die Skripte werden zum Teil über Variablen ausgelöst, aber auch über Schaltflächen in WinCC. Die Aktualisierung der Steuerariablen habe ich auf 500ms gestellt.

Über eine kurze Antwort würde ich mich sehr freuen.

Gruß vom
Starter


----------



## PN/DP (1 September 2011)

Starter schrieb:


> Das Lesen und Speichern der 32000 DWord Variablen auf der Speicherkarte des Panels funktioniert nun zuverlässig, ohne Bus-Kommunikationsfehler und dauert ca. 5 bis 7 Minuten jenachdem wie groß man die Datensätze wählt. Damit bin ich sehr zufrieden.


Hallo Starter,

schön zu lesen, daß Du es hinbekommen hast. Meine Erklärung des Konzeptes ist ja nur sehr idealisiert und es gab noch viele Einzelprobleme durch Dich zu lösen. 
	

	
	
		
		

		
			





 Danke für die Rückmeldung.



Starter schrieb:


> wenn man während des Lesens und Speicherns der gesamten Datenmenge(also während der 5-7min) das Bild verlässt und zwischen durch auf anderen Bildern unterwegs ist bleibt manchmal der Prozess des Lesen uns Schreiben der Datensätze hängen.


Die 2 Event-Variablen (DS_Nummer_ACK und rdStat) müssen auf Erfassungsart "Zyklisch fortlaufend" eingestellt werden, dann klappt's auch mit dem nebenbei anderweitig arbeiten. Es würde auch reichen, sie irgendwie im Permanentfenster zu verwenden, z.B. für eine Animation.

Gruß
Harald


----------



## Starter (2 September 2011)

Moin Harald,
jo das scheint es wohl gewesen zu sein. Hab es jetzt ein paar mal ausprobiert und der Fehler ist nicht mehr aufgetreten.

Nochmals besten Dank, echt ne klasse Lösung!!!


----------

