# Werte aus einen DB auslesen



## magmaa (13 Mai 2008)

Hallo gibt es eine Möglichkeit Werte aus einen DB aus der SPS auszulesen. 
Ich habe ein DB in dem alle 10ms Werte von einem Inkrementalgeber geschrieben werden. 
Nun will ich mir die Werte als Kurve darstellen lassen z.B. in Exel.
Ich hab schon mit Protool versucht aber das ist zu langsam.


----------



## MW (13 Mai 2008)

magmaa schrieb:


> Hallo gibt es eine Möglichkeit Werte aus einen DB aus der SPS auszulesen.
> Ich habe ein DB in dem alle 10ms Werte von einem Inkrementalgeber geschrieben werden.
> Nun will ich mir die Werte als Kurve darstellen lassen z.B. in Exel.
> Ich hab schon mit Protool versucht aber das ist zu langsam.


 
10 ms is schon recht schnell, musst auch bedenken, dass das mit der Zeit eine Sehr große Datenmenge wird.

Such mal im Forum nach Libnodave, da ist ein Beispiel für EXCEL dabei

Es wäre nach gut zu wissen, welchen Kommunikationsweg du nutzen möchtest: Ethernet, MPI, Profibus ????


----------



## Larry Laffer (13 Mai 2008)

ich mache sehr oft Kurvendarstellung und auch -Aufzeichnung mit ProTool ... Wo ist das Problem ? Auch das abspeichern nach Excel (wenn nicht kontinuierlich) stellt kein Problem dar ...
Schreib mal etwas mehr zu deiner Anwendung ...

Gruß
LL


----------



## magmaa (15 Mai 2008)

Mit den Kurven sollen Weg, Geschwindikeit und Strom von einer Laufkatze aufgezeichnet werden.
In Protool habe ich schon eine kleine Kurvendarstellung aber bei einer Abtastzeit von 0,5s im Protool und einer Geschwindikeit von 0,7m/s der Katze und ca. 2m Fahrweg ist die Kurve ziemlich eckig und damit nicht zu gebrauchen. 
Gibt es noch ne besser Lösung mit Protool oder muss ich mich gleich mit libnodave beschäftigen?


----------



## vierlagig (15 Mai 2008)

wie oft fährt die Katze? wenn du nur immer eine Bewegung aufzeichnen möchtest, würde ich die Kurvenaufzeichnung während der Laufzeit machen und die entsprechenden Daten einer Bewegung in einem DB ablegen, diesen DB dann als Kurve darstellen ... damit wärst du unabhängig von der Aktualisierungsrate


----------



## Larry Laffer (15 Mai 2008)

Entsprechend des Vorschlags von Vierlagig verfahre ich da auch immer. Wenn du so schnelle Abtastungen hast (10 ms-Intervall im OB35) gibt es da keinen anderen sinnvollen Weg - auch nicht mit einem anderen System ...
Der Vorteil des "erst Aufzeichnen - dann Ausgeben" ist zusätzlich noch, dass du die erfasste Kurve so auch auswerten kannst - wird bei mir eigentlich immer gebraucht ...

Gruß
LL


----------



## magmaa (15 Mai 2008)

Ja die Kurve soll nur für eine Fahrt aufgenommen werden und ich habe schon einen DB in dem alle 10ms Werte aufgenommen werden. 
Die frage ist nur wie kann ich das nun darstellen lassen in Exel oder Protool?


----------



## Larry Laffer (15 Mai 2008)

Na, in ProTool natürlich ...
Nach Excel (so mache ich das) werden die Daten nur übergeben, wenn vom Bediener ausdrücklich gewünscht (also auf Tastendruck).

Wo ist den jetzt konkret der Knackpunkt ?
Warum (sagtest du) läuft das "zu langsam" ?

Gruß
LL


----------



## vierlagig (15 Mai 2008)

nun, das ist egal, da die daten ja verfügbar sind und du bei entsprechender skalierung sowohl in protool als auch in excel nur die 10ms schritte als stufen hast


----------



## Larry Laffer (15 Mai 2008)

... noch so als Nachsatz, damit du noch etwas zu Lesen hast :

Etwas ähnliches mache ich auch - nennt sich Kraft-Weg-Messung bei einer Feder. Hier nehme ich auch im 10ms-Raster die Kraft- und die Weg-Werte auf und speichere die ab.
Falls dir dir Messwerte immer noch zu "hakelig" sind gibt es ja auch noch die Mpglichkeit die Daten vor der Übertragung zu Glätten. Das mache ich bei einer anderen Messung sehr gerne ...


----------



## magmaa (15 Mai 2008)

Das Problem ist wie ich den DB mit den gespeicherten Werten in Protool auslesen kann bzw. als Kurve darstellen kann?


----------



## Larry Laffer (15 Mai 2008)

1. Bereichszeiger "Kurvenanforderung" anlegen
2. Bereichszeiger "Kurvenübertragung1" anlegen
3. Array im ProTool anlegen mit der Quelle der Daten.
4. Kurve anlegen als "Profilkurve" und dort die Variable antragen.
5. Im SPS-Programm nach erfolgter Kurven-Aufzeichnung das Kurven-Bit und das -Sammelbit anstossen damit die Kurve vom ProTool aktualisiert wird.


----------



## magmaa (15 Mai 2008)

Uh versteh nur Bahnhof gibt es auch ne detaillierte Anleitung?


----------



## Larry Laffer (15 Mai 2008)

... das war eigentlich schon die detaillierte Anleitung ...!?

Wenn du Hintergrund-Info's benötigst, so solltest du in der ProTool-Hilfe mal die von mir aufgezählten Schlagworte eingeben.
Es gibt im Forum auch diverse Threads zu dem Thema, aber meines Wissens sind das alles Threads, die so den letzten Rest behandeln - du steckst scheinbar noch ganz am Anfang. 
Vielleicht versuchen wir es "Schritt für Schritt".
Die Bereichszeiger anzulegen sollte doch kein Problem darstellen ...?
Wie sieht es mit der Kurven-Variablen (-Array) aus ?

Gruß
LL


----------



## Larry Laffer (15 Mai 2008)

By the Way ...
Welches System nutzt du da eigentlich ?
MPxxx oder Runtime auf PC oder ...?

Ich hoffe mal, dass du eine Runtime hast ...


----------



## magmaa (15 Mai 2008)

Ja Schritt für Schritt wäre nicht schlecht benutz Protoolpro RT auf PC 

So Bereichszeiger "Kurvenanforderung" und Bereichszeiger "Kurvenübertragung1" hab ich gefunden, 
aber was macht die Kurvenanforderung und die Kurvenübertagung1?


----------



## Larry Laffer (15 Mai 2008)

... die machen den Handshake von Visu und SPS ...

Der Bereichszeiger "Kurvenübertragung1" beinhaltet die Triggerbits für jede definierte Kurve und das Sammelbit. Diese Bits mußt du jeweils setzen, wenn du neue Daten für die Visu hast ...

Soweit klar ?


----------



## magmaa (16 Mai 2008)

Ne noch nicht ganz. 
Die DB´s die ich bei "Kurvenanforderung" und "Kurvenübertragung1" angeben muss, muss ich die noch im Step7 Projekt anlegen oder muss ich da den DB angeben in dem die Messwerte stehen?


----------



## Larry Laffer (16 Mai 2008)

... die beiden genannten Worte muss es in der SPS geben. Sie können in einem Datenbaustein liegen (mache ich immer so), es können aber auch genauso gut Merkerworte sein.

Wichtig für dich ist (wie schon gesagt) "Kurvenübertragung1" wegen der Triggerbits, die du in deinem Programm setzen mußt ...

Den DB mit den Messwerten mußt du für die Kurven-Variable angeben ...


----------



## magmaa (16 Mai 2008)

OK hab jetzt DB1 angelegt und mit zwei Wörtern, Kurvenanforderung und Kurvenuebertragung1 und diese in ProTool zugewiesen.
Pass das so?


----------



## Larry Laffer (16 Mai 2008)

... sieht gut aus ...


----------



## magmaa (16 Mai 2008)

OK und wie kann ich ein Array im ProTool anlegen?


----------



## Larry Laffer (16 Mai 2008)

Einfach eine Variable einfügen, die auf das erste Element deines DB's zeigen lassen und bei "Anzahl Elemente" eben die Anzahl der erfassten Werte eingeben ...


----------



## magmaa (16 Mai 2008)

Ok hab jetzt einen zweiten DB angelegt mit 10 Messwerten und in Protool ne variabel erzeugt


----------



## Larry Laffer (16 Mai 2008)

... wäre vielleicht ganz nett, wenn die Variable nicht VAR_1 sondern vielleicht "Kurven_Variable" oder so heißt, aber das tut der Funktion keinen Abbruch.

Jetzt erzeugst du dir eine Kurve (Unterrubrik Kurven - Kurve einfügen).
Der gibst du vielleicht auch einen netten Namen. Auf dem Blatt "Allgemein" mußt du nun nochmals die Anzahl der Werte angeben.
Auf dem Blatt "Datenquelle" wählst du "Profilkurve" und bei "Kurvenpuffer" gibst du die neu erzeugte Variable (das Array) an. Auf dem gleichen Blatt siehst du "Triggerung". Das Bit, das du dort siehst (und wählst) ist das schon besprochene Triggerbit ...

Nun mußt du dir nur noch auf einer Seite die Kurvendarstellung einfügen und dort die erzeugte Kurve angeben ... und ...
habe fertig ...!

Gruß
LL


----------



## magmaa (16 Mai 2008)

So hab ich getan 
Muss ich DB1.DBX5.0 Triggerbit nur einmal setzten oder muss das Takt sein?


----------



## Larry Laffer (16 Mai 2008)

... jedes Mal, wenn du die Daten aktualisiert darstellen willst ...


----------



## magmaa (17 Mai 2008)

So hab es geschafft vielen danke für die Mühen. 
Aber was ich etwas umständlich finde ist das man das Triggerbit immer übern ein Word ansprechen muss.
Oder gibt es da ne elegante Lösung für und wie sieht das mit Export der Werte nach Excel aus?


----------



## volker (17 Mai 2008)

magmaa schrieb:


> Oder gibt es da ne elegante Lösung für und wie sieht das mit Export der Werte nach Excel aus?


mit vbscript.
schau in die faq da steht wie das geht.

das arrary kannst du in einer schleife lesen/schreiben

for i = 0 to 9
aktuell = var1(i)
next


----------



## Larry Laffer (17 Mai 2008)

volker schrieb:


> mit vbscript.
> schau in die faq da steht wie das geht.


 
genau ... und eben dieser Volker hat dazu wirklich einen Klasse Beitrag geschrieben ...

Gruß
LL


----------



## magmaa (18 Mai 2008)

Das hier http://www.sps-forum.de/showthread.php?t=15348?

Oh das werde ich mir mal in einer stillen Stunde ansehen ob ich das verstehe mit VB hab ich noch nicht gearbeitet.


----------



## Larry Laffer (18 Mai 2008)

Den hier hatte ich irgendwann auch mal zu dem Thema geschrieben ...
http://www.sps-forum.de/showthread.php?p=121911&highlight=excel#post121911
Das ist eigentlich auch ziemlich vollständig. Daran kannst du dich ja auch mal versuchen. Es gibt im Forum aber auch noch etliche andere Beiträge zu dem Thema ...

Gruß
LL


----------



## volker (18 Mai 2008)

@LL
habe das mal auszugsweise in die faq übernommen
http://www.sps-forum.de/showthread.php?t=15348

EDIT:
hab den thread auch noch um access und mysql erweitert.


----------



## magmaa (19 Mai 2008)

Mal ne dumme frage wo muss ich den Quellcode hin kopieren oder brauch ich einen VB compiler.?


----------



## Larry Laffer (19 Mai 2008)

Da gibt es in ProTool eine Rubrik mit dem Namen *Skripte*.
Dort legst du dein Script an ... Auch hier kann man einen netten Namen vergeben. Den Aufruf deines Scriptes kannst du z.B. an eine Taste ("bei Betätigung") hängen.


----------



## magmaa (19 Mai 2008)

Kommt ne Fehlermeldung bei dem Skript 

Ersetze ProTool Namen...
Zeile: 12,     Fehler: Falscher Präfix Gebrauch , "Info: Verzeichnis ProdDaten"
1 Fehler, 0 Warnungen


----------



## Larry Laffer (20 Mai 2008)

Hallo Magmaa,

in dem von mir geposteten Beispiel sind alle ROT dargestellten Variablen PROTOOL-Variablen. Das heißt, das es diese Variablen in deiner Variablen-Liste geben muß, wenn du das Script genauso einsetzen willst. Eigentlich sollte es dir aber nur als Anregung dienen - es erfüllt ja doch nicht zu 100% deine Wünsche. Ich schlage also für Weiteres vor, dass du dich mit dem Beispiel, dem Beitrag von Volker und der VB-Hilfe mal etwas eingehender beschäftigst. Nun solltest du ein eigenes Script daraus erstellen, dass sich an deinen Wünschen orientiert. Wenn das dann nicht richtig (oder gar nicht) funktioniert, dann postest du es und wir machen daran weiter.

Gruß
LL


----------



## magmaa (20 Mai 2008)

Ok werde ich machen.


----------



## vierlagig (20 Mai 2008)

hab da mal eben was in excel und vba zusammengeschustert, mit libnodave und iso on tcp auf eine s7 300 ... nicht schön, ich weiß, aber man kann erkennen, wie es funktionieren könnte


----------



## Larry Laffer (20 Mai 2008)

@4L: Kannst du deinen Code vielleicht auch noch so veröffentlichen, das Leute, die gerade kein Step7 dabei haben, sich auch daran beteiligen können ...?


----------



## vierlagig (20 Mai 2008)

klar larry, für dich immer  ... 

also erstmal der baustein, der im OB35 alle 10ms aufgerufen wird


```
*
FUNCTION_BLOCK "Kurvenschreiber"
TITLE =
//Kurvenschreiber
//
//Aurufumgebung: Weckalarm OB mit 10ms
//Interface: EXCEL, Visu, other direkt auf IDB
//
//Dieser Baustein erstellt nach einem Startimpuls einen Datenbaustein mit aus 
//Aufzeichnungsdauer und Stützpunktanzahl berechneter Länge. Der Datenbaustein 
//wird mit den Daten des angegebenen MD gefüllt.
//
//Es können max. 10 DB angelegt werden. Bevor eine neue Messung gestartet werden 
//kann, müssen diese 10 DB gelöscht werden.
//
//DATE:     19.05.2008
//AUTHOR:   4lagig
//VERSION:  V0.1
AUTHOR : '4lagig'
VERSION : 0.1


VAR
  xInStart : BOOL ;    //Aufzeichnung starten
  xInDeleteDb : BOOL ;    //Datenbausteine löschen
  xOutOnAir : BOOL ;    //Aufzeichnung läuft
  xDbOverflow : BOOL ;    //10 DBs angelegt
  xHelpFlag1 : BOOL ;    
  xHelpFlag2 : BOOL ;    
  iInMdNumber : INT ;    //Aufzuzeichnendes Doppelwort
  iInTimeStamp : INT ;    //Auflösung
  iInTimeWriting : DINT ;    //Aufzeichnungsdauer in ms
  wDbNumber : WORD ;    //Nummer des erstellten DB
  wDbLength : WORD ;    //Länge des erstellten DB
  iCreateReturn : INT ;    
  iDataCounter : INT ;    //Adressierungszähler
  iCycleTimes : INT ;    //Aufzeichnungshäufigkeit
  iCycleCounter : INT ;    //Aufzeichnungszähler
  iDelReturn : INT ;    
  wBuffer0 : WORD ;    
  wBuffer1 : WORD ;    
  wBuffer2 : WORD ;    
  wBuffer3 : WORD ;    
  wBuffer4 : WORD ;    
  wBuffer5 : WORD ;    
  wBuffer6 : WORD ;    
  wBuffer7 : WORD ;    
  wBuffer8 : WORD ;    
  wBuffer9 : WORD ;    
  iDbCounter : INT ;    //erstellte DBs zählen
END_VAR
VAR_TEMP
  wDbNumberTemp : WORD ;    //Datenbausteinnummer zur Weiterverarbeitung
  dMdNumber : DWORD ;    //Merkerdoppelwortnummer zur Weiterverarbeitung
  dAr1Save : DWORD ;    //AR1
  dAr2Save : DWORD ;    //AR2
  wDbnoSave : WORD ;    //letzter globaldaten DB
  iLoop : INT ;    //Schleifenzähler
END_VAR
BEGIN
NETWORK
TITLE =


// ---------> Interrupt-Daten sichern <--------- //


      L     DBNO; // letzten offenen Globaldatenbaustein ...
      T     #wDbnoSave; // ... sichern
      TAR1  #dAr1Save; // AR1 sichern
      TAR2  #dAr2Save; // AR2 sichern


// --------> Startbedingungen ermitteln <------- //


      U     #xOutOnAir; // Aufzeichnung läuft bereits
      SPB   log; // dann aufzeichnen

      U     #xInStart; // Startimpuls
      FP    #xHelpFlag1; 
      UN    #xDbOverflow; // bereits 10 Aufzeichnungen gemacht
      SPBN  late; // neuer DB oder Möglichkeit zu löschen


// -------> Datenbausteinnummer prüfen <-------- //


      L     #wBuffer9; // der letzte Pufferplatz
      L     0; // ungleich 0
      <>I   ; // heißt 10 DBs angelegt
      O     ; // oder
      L     #iDbCounter; // der DB-Zähler
      L     10; // ist auf 10
      ==I   ; 
      SPBN  go; // wenn noch Platz ist, ist alles i.O.
      S     #xDbOverflow; // 10-DBs angelegt
      SPA   late; // maximale Anzahl erreicht, erst löschen


// ------> Datenbausteinlänge ermitteln <------ //


go:   L     #iInTimeWriting; // Länge der Aufzeichnung
      L     #iInTimeStamp; // Trigger 10, 20, 30, ... 100ms ...
      /I    ; // = Anzahl der Aufzuzeichnenden Werte
      L     4; // REAL in Bytes ...
      *I    ; // ...Anpassung
      +     4; // Kopfdaten 2*INT
      T     #wDbLength; // Datenbausteinlänge


// ----------> Datenbaustein erzeugen <--------- //


      CALL "CREAT_DB" (
           LOW_LIMIT                := W#16#1,// Bereich der DB-Nummer
           UP_LIMIT                 := W#16#FF,// angeben
           COUNT                    := #wDbLength,// Länge übergeben
           RET_VAL                  := #iCreateReturn,// Fehlercode
           DB_NUMBER                := #wDbNumber);// DB Nummer zur weiterbearbeitung


// --------> Datenbausteinnr. ablegen <--------- //


      L     #wBuffer8; // shift-Register begin...
      T     #wBuffer9; // 
      L     #wBuffer7; // 
      T     #wBuffer8; // 
      L     #wBuffer6; // 
      T     #wBuffer7; // 
      L     #wBuffer5; // 
      T     #wBuffer6; // 
      L     #wBuffer4; // 
      T     #wBuffer5; //                
      L     #wBuffer3; // 
      T     #wBuffer4; // 
      L     #wBuffer2; // 
      T     #wBuffer3; // 
      L     #wBuffer1; // 
      T     #wBuffer2; // 
      L     #wBuffer0; // 
      T     #wBuffer1; // 
      L     #wDbNumber; // 
      T     #wBuffer0; // ... end

      L     #iDbCounter; // DB-Zähler
      +     1; // 
      T     #iDbCounter; // inkrementieren


// -------------> Initialisierung <------------- //


      L     0; // 0
      T     #iDataCounter; // für den Wertezähler

      L     0; // 0
      T     #iCycleCounter; // für Aufzeichnungszähler

      L     #iInTimeStamp; // Trigger 10, 20, 30, ... 100ms ...
      L     10; // 10
      /I    ; // dividiert
      T     #iCycleTimes; // macht die Pausen

      L     #wDbLength; // verfügbarer Speicherplatz
      +     -4; // -4 
      T     #wDbLength; // macht Adressierung

      SET   ; // 1
      S     #xOutOnAir; // für Aufzeichnung läuft


// -------------> Kopf schreiben <-------------- //


      L     #wDbNumber; // DB-Adresse
      T     #wDbNumberTemp; // für Weiterverarbeitung

      L     #iDataCounter; // Adressierungszähler
      SLD   3; // Bits maskieren
      LAR1  ; // in AR1  laden
      AUF   DB [#wDbNumberTemp]; // DB öffnen

      L     #wDbLength; // DB Länge Nutzdaten
      T     DBW [AR1,P#0.0]; // in DB schreiben

      L     #iInTimeStamp; // Auflösung
      T     DBW [AR1,P#2.0]; // in DB schreiben

      L     #iDataCounter; // Adressierung
      +     4; // um vier
      T     #iDataCounter; // erhöhen  


// --------------> Daten erfassen <------------- //


log:  U     #xOutOnAir; // Aufzeichnung läuft
      SPBN  late; // 

      L     #iCycleCounter; // Aufzeichnungszähler
      L     1; 
      +I    ; // inkrementieren
      T     #iCycleCounter; 

      L     #iCycleCounter; 
      L     #iCycleTimes; // mit Soll
      ==I   ; // vergleichen
      SPBN  late; // wenn nich, dann nich

      L     0; // wenn doch, dann 0
      T     #iCycleCounter; // in Aufzeichnungszähler

      L     #wDbNumber; // DB-Adresse
      T     #wDbNumberTemp; // für Weiterverarbeitung

      L     #iInMdNumber; // MD-Adresse
      SLD   3; 
      T     #dMdNumber; // für Weiterverarbeitung

      L     #iDataCounter; // Adressierungszähler
      SLD   3; // Bits maskieren
      LAR1  ; // in AR1  laden
      AUF   DB [#wDbNumberTemp]; // DB öffnen
      L     MD [#dMdNumber]; // Wert
      T     DBD [AR1,P#0.0]; // in DB schreiben

      L     #iDataCounter; // Adressierung
      +     4; // um vier
      T     #iDataCounter; // erhöhen     

      L     #wDbLength; 
      L     #iDataCounter; // mit Adressierungszähler
      <=I   ; // vergleichen
      SPBN  late; 
      R     #xOutOnAir; // Aufzeichnung beendet


// ---------> Datenbausteine löschen <---------- //


late: U     #xInDeleteDb; // löschen angefordert
      FP    #xHelpFlag2; 
      UN    #xOutOnAir; // und keine Aufzeichnung aktiv
      SPBN  end; 

      L     10; // max. angelegte DBs
next: T     #iLoop; // als Schleifenzähler benutzen

      L     #wBuffer0; // DB-Adresse auf 0 prüfen
      L     0; 
      ==I   ; // wenn 0 (=ungültige DB-Adresse)
      SPB   shif; // löschen überspringen

      CALL "DEL_DB" (// Datenbaustein löschen
           DB_NUMBER                := #wBuffer0,
           RET_VAL                  := #iDelReturn);

shif: L     #wBuffer1; // shift-Register begin...
      T     #wBuffer0; //  
      L     #wBuffer2; // 
      T     #wBuffer1; // 
      L     #wBuffer3; // 
      T     #wBuffer2; // 
      L     #wBuffer4; // 
      T     #wBuffer3; // 
      L     #wBuffer5; // 
      T     #wBuffer4; // 
      L     #wBuffer6; // 
      T     #wBuffer5; // 
      L     #wBuffer6; // 
      T     #wBuffer7; // 
      L     #wBuffer7; // 
      T     #wBuffer8; // 
      L     #wBuffer9; // 
      T     #wBuffer9; // 
      L     0; // 
      T     #wBuffer9; // ... end

      L     #iLoop; 
      LOOP  next; 
      SET   ; 
      R     #xDbOverflow; // max-Bit rücksetzen
      L     0; 
      T     #iDbCounter; // Datenbausteinzähler zurücksetzen


// -------------> Schlußbehandlung <------------ //


end:  LAR1  #dAr1Save; // AR1 rücksichern
      LAR2  #dAr2Save; // AR2 rücksichern
      AUF   DB [#wDbnoSave]; // letzten Globaldatenbaustein öffnen
      SET   ; 
      SAVE  ; // EN0 eins machen
      BE    ; 

END_FUNCTION_BLOCK
```
im excel sieht das dann wie im anhang aus.

es ist weder bugfrei noch ausführlich getestet geschweigedenn besonders schön, gerade der VBA-teil ist überarbeitungsbedürftig, hab es wie gesagt nur schnell zusammengeschustert


----------



## vierlagig (20 Mai 2008)

also um das jetzt nochmal festzuhalten:

larrys protool-lösung funktioniert 1. natürlich auch und wird 2. die werte evtl. komfortabler darstellen können

wollte den protool-gedanken nicht untergraben, nur feststellen das es ein paar mehr wege nach rom gibt und wie larry bewies funktioniert es eben auch über protool, ebenso wie mit libnodave, man kann es auch mit OPC und dde-anbindung machen ...


----------



## magmaa (20 Mai 2008)

Oh too manny input von vierlagig ist doch wieder ne andere möglichkeit oder?
Werde mich erstmal mit Protool auseinander setzten.


----------



## Larry Laffer (20 Mai 2008)

Genau ..
der Vorschlag von 4L beschreibt eine alternative Möglichkeit - Im Prinzip in Anlehnung an den Beitrag #2 von MW in diesem Thread ...

Ich würde dir auf jeden Fall auch empfehlen, zunächst den eingeschlagenen Weg weiter zu verfolgen ...

Gruß
LL


----------



## Larry Laffer (24 Mai 2008)

wie sieht es denn mittlerweile aus bei dir ...?
Gibt es etwas Neues ...?


----------



## magmaa (6 Juni 2008)

Danke der nachfrage aber bin gerade etwas zeitlich eingespannt. 
Darum hab ich mich jetzt nicht weiter mit der Sache beschäftigt. 
Aber soweit wieder Zeit ist oder die Notwendigkeit besteht, setzt ich mich nochmal mit dem Thema auseinander. 
Und dann kommen auch sicher die nächsten Fragen.


----------



## magmaa (20 März 2009)

Hallo so hab mich Interesse halber mal wieder mit dem Thema beschäftigt. 
Mittlerweile aber mit WinCC flex 2008 



```
On Error resume next
 
Dim appExcel , fs , wbExcel , wsExcel
Dim Verzeichnis , Datei
Dim Zeile
'------------------------------------------------------------------------------
' Variablen-Zuweisungen ...
Verzeichnis = "c:\daten\"
Datei = "test.xls"
'------------------------------------------------------------------------------
' Pointer auf Tabelle laden
Set appExcel = CreateObject ("EXCEL.Application")
Set fs = CreateObject ("Scripting.FileSystemObject")
'------------------------------------------------------------------------------
' Objekte erzeugen
' prüfe ob datei existiert. wenn nicht erzeugen.
if not fs.fileexists (Verzeichnis + Datei) then
    appExcel.Workbooks.Add
    appExcel.ActiveWorkbook.SaveAs(Verzeichnis + Datei)
end if
 
Set wbExcel = appExcel.Workbooks.Open (Verzeichnis + Datei)
Set wsExcel = wbExcel.Worksheets("Tabelle1")
 
' Zelle lesen und um 1 erhöhen
Zeile = wsExcel.Range("D1") + 1 
 
' Zelle beschreiben
wsExcel.Cells (Zeile , 1) = date
wsExcel.Cells (Zeile , 2) = time
wsExcel.Range("D1") = Zeile 
 
' Tabelle abspeichern
wbExcel.Close true 'false
appExcel.Quit ()
 
'------------------------------------------------------------------------------
' verwendeten Speicher wieder freigeben
Set wsExcel = Nothing
Set wbExcel = Nothing
Set fs = Nothing
Set appExcel = Nothing
Set Verzeichnis = Nothing
Set Datei = Nothing
```

Mit folgenden Code kann ich werte aus einer Variable auslesen und in Excel speichern.

Wenn ich nun aber aber DB mit n worten auslesen will brauch ja ziemlich viel Variablen im Wincc flex 
Quasi pro Wort eine Variable und das ganze dann nochmal im Skript das ziemlich umständlich.

Kann man die Variablen Adressierung der Variablen in Wincc flex variable gestallten oder muss ich das mit pointer über die SPS machen.

Oder gibt es noch ne besser lösung?


----------



## Larry Laffer (21 März 2009)

Hallo,
wie wäre es auf Seiten der SPS mit einem ARRAY ?
Dieses kannst du dann in der Visu als eine Variable (mit z.B. 100 Elementen) anlegen. Im Script kannst du die dann (innerhalb einer Schleife) indexieren. Dazu gibt es im Forum auch einige Beispiele (hier vor Allem nach den Beiträgen von *Kai* Ausschau halten).

Gruß
LL


----------



## magmaa (22 März 2009)

Also ich hab mir ein jetzt ein DB mit einem Array mit 10 Wörtern angelegt und in Wincc flex zwei Variablen. 

Eine Interne index variable und eine zum DB

Sieht dann so aus  Name: Wert, Adresse DB1 DBW [index]

Wenn ich das Skript von Hand über einen Button aufrufe und die index Variable im Skript um zwei erhöhe dann funktioniert es. 

Wenn ich das ganze in eine Schleife packe wird mir nur ein Wert Angezeigt.
Wird das Skrit zuschnell bearbeite das die Aktualisierung der Variable Wert nicht hinterherkommt oder woran liegt das?


```
Index = 0
 
For i = 1  To 9

  ' Zelle lesen und um 1 erhöhen
  Zeile = wsExcel.Range("D1") + 1 
 
  ' Zelle beschreiben
  wsExcel.Cells (Zeile , 1) = Wert
  wsExcel.Cells (Zeile , 2) = "Wert " & i
  wsExcel.Range("D1") = Zeile 
 
  Index = Index + 2 

Next
```


----------



## Larry Laffer (23 März 2009)

Lies dir doch mal bitte diesen Beitrag durch ...


----------



## Domi55 (23 März 2009)

Larry Laffer schrieb:


> Hallo,
> wie wäre es auf Seiten der SPS mit einem ARRAY ?
> Dieses kannst du dann in der Visu als eine Variable (mit z.B. 100 Elementen) anlegen. Im Script kannst du die dann (innerhalb einer Schleife) indexieren. Dazu gibt es im Forum auch einige Beispiele (hier vor Allem nach den Beiträgen von *Kai* Ausschau halten).
> LL



Hallo Larry! 
Das wäre genau das was ich benötige! Habe aber noch keinen Beitrag von Kai gefunden! Also 100 werte habe ich im DB! Jetzt muß ich halt das mit dem Array machen! Wie geht das genau? 
Danke schonmal!


----------



## Larry Laffer (23 März 2009)

Hallo Dominik,
zusätzlich zu dem Link aus meinem Beitrag #50 vielleicht auch noch diesen mal durchlesen ...

Gruß
LL


----------



## Domi55 (23 März 2009)

Oh man! Das klappt noch nicht so ganz! Habe mal das Script ein wenig umgewandelt! Aber es läuft nicht! Habe es mal im Anhang stehen! Das ganze soll auf dem Mobile Panel 277 laufen! Habe halt 50 Werte im DB! Habe noch keine Erfahrung mit VBS bzw mit Siemens VBS programmierung! Wäre über jede Hilfe super Dankbar!
Gruß Dominik


----------



## Larry Laffer (23 März 2009)

Was läuft denn konkret nicht ?


----------



## magmaa (23 März 2009)

Danke mit 



```
'HINWEIS:
' Beim Erstellen von Skripten können Sie mit <Strg+Leertaste> vordefinierte 
' Systemfunktionen in das neue Skript einbinden.
' Das HMIRuntime-Objekt ermöglicht einfachen Zugriff auf die Objekte des
' WinCC flexible Objektmodells, ihre Methoden und ihre Eigenschaften.
' Für ein komfortables Auswählen einer Objektreferenz betätigen Sie bitte <Alt+Rechts>.
' Komplexe Skripte können Sie mit Sprachelementen der Programmiersprache
' VBScript erstellen.
' Der Zugriff auf WinCC flexible Variablen erfolgt direkt über den Variablennamen,
' z.B. Tag = 5


On Error Resume Next
 
Dim appExcel , fs , wbExcel , wsExcel
Dim Verzeichnis , Datei
Dim Zeile
Dim i 
'------------------------------------------------------------------------------
' Variablen-Zuweisungen ...
Verzeichnis = "c:\daten\"
Datei = "test.xls"
'------------------------------------------------------------------------------
' Pointer auf Tabelle laden
Set appExcel = CreateObject ("EXCEL.Application")
Set fs = CreateObject ("Scripting.FileSystemObject")
'------------------------------------------------------------------------------
' Objekte erzeugen
' prüfe ob datei existiert. wenn nicht erzeugen.
If Not fs.FileExists (Verzeichnis + Datei) Then
    appExcel.Workbooks.Add
    appExcel.ActiveWorkbook.SaveAs(Verzeichnis + Datei)
End If
 
Set wbExcel = appExcel.Workbooks.Open (Verzeichnis + Datei)
Set wsExcel = wbExcel.Worksheets("Tabelle1")


 
For i = 0  To 9

' Zelle lesen und um 1 erhöhen
Zeile = wsExcel.Range("D1") + 1 
 
' Zelle beschreiben
wsExcel.Cells (Zeile , 1) = SmartTags("wert1")(i) 
wsExcel.Cells (Zeile , 2) = "Wert " & i
wsExcel.Range("D1") = Zeile 

Next 
 
' Tabelle abspeichern
wbExcel.Close True 'false
appExcel.Quit ()
 
'------------------------------------------------------------------------------
' verwendeten Speicher wieder freigeben
Set wsExcel = Nothing
Set wbExcel = Nothing
Set fs = Nothing
Set appExcel = Nothing
Set Verzeichnis = Nothing
Set Datei = Nothing
```

geht es


----------



## magmaa (23 März 2009)

Achja kann man das Skript auch unter WinCC 6.2 verwenden?


----------



## Domi55 (23 März 2009)

Larry Laffer schrieb:


> Was läuft denn konkret nicht ?



Kompalieren geht ohne Fehler! Allerdings macht das Skript nichts! Vermute das das skript nicht den Speicherplatz findet, also \Storage Card MMC\ Oder sind dort grundlegende Fehler enthalten?


----------



## Larry Laffer (24 März 2009)

@magmaa:
Zu WinCC kann ich nichts sagen ...

@Dominik:
Welches Ereignis (auf der Visu) startet denn dein Script ? Ich nehme an, dass du nur das Script hast. Das reicht aber nicht. Du könntest hier z.B. eine Taste nehmen und mit der das Script aufrufen - oder eine Variable (bei Wert-Änderung).

Gruß
LL


----------



## Domi55 (24 März 2009)

Hallo Larry!
Ich starte das Skript mit einem Button von der Folientastatur am Mobile Panel! Aber machen tut es noch nichts! Kann es sein das ich meinen DB nicht korrekt aufrufe?
LG Domi


----------



## Larry Laffer (24 März 2009)

... dann wird das Script auch ausgeführt. In dem Fall ist der Fehler intern.
Auf den ersten Blick fällt mir da dein "bcreated" auf. Der muß TRUE sein, damit du etwas speicherst. Er ist aber nur dann TRUE, wenn es die Datei vorher nicht gab - wolltest du das so ?

Gruß
LL


----------



## Domi55 (24 März 2009)

Hallo!
Das sollte nicht das problem sein! Es ist ja nichts vorhanden auf der karte also sollte er ja eine datei erstellen! Bin hier schon alles am probieren!
Danke LL


----------



## Domi55 (24 März 2009)

Hallo zusammen!
Habe eine neue Variante an die ich mich im moment halte! Mit Rezepturen würd das doch auch gehen oder? Ist zwar ein wenig arbeit aber theoretisch doch machbar oder?
Gruß Dominik


----------



## Larry Laffer (24 März 2009)

... da kann ich dir nichts dazu sagen ...
Aber was mir so auffällt ... warum verfolgst du nicht erstmal eine Linie bis zum "geht oder geht nicht" bevor die die Nächste aufs Korn nimmst ...?


----------



## Domi55 (24 März 2009)

Hallo Larry!
Hab dafür leider keine zeit alles wenns mal nicht 100% läuft auszutesten! Da ich mich in einer Projektphase befinde! Aber mit der Rezeptur läuft es jetzt! Brauche kein Skript und es ist schon eine csv Datei! Die Werte werden sauber eingelesen! Also das Funktioniert jetzt tadellos! 
Hab ich natürlich zum größten Teil euch zu verdanken! Klasse Forum wenns um die SPS programmierung geht!

Danke nochmal!


----------



## magmaa (29 April 2009)

Hallo ich möchte gern die DB Werte in EA Feldern darstellen
ich mach das bis jetzt mit:


```
HmiRuntime.Screens("Bild_1").ScreenItems("EA-Feld_0").ProcessValue = SmartTags("wert3")(0)
HmiRuntime.Screens("Bild_1").ScreenItems("EA-Feld_1").ProcessValue = SmartTags("wert3")(1)
usw.
```
für jeden Wert einzeln.

Wollte das ganze jetzt dynamisch mit einer schleife machen 


```
For i = 0  To 9

HmiRuntime.Screens("Bild_1").ScreenItems("EA-Feld_" & i).ProcessValue = SmartTags("wert3")(i)

Next
```

so geht leider nicht hat jemand ne Idee?


----------

