# von WinCC in SQL-Datenbank schreiben



## mertens2 (4 Oktober 2008)

Hallo,

muss für ein Projekt von WinCC aus einige Variablen in eine SQL-Datenbank schreiben. Auf dem Rechner ist SQL-Server schon installiert. Habe eine Tabelle angelegt und ein Skript (Habe ich aus Siemens-Support-Seite) angelegt. Skript läuft ohne Fehlermeldung, zumindestens sehe ich keine. Unter WinCCflex läuft der Spass. Datenquelle habe ich angelegt.

Hier mein Skript:

Sub procedure1





Dim conn, rst, sql_table

Set conn=CreateObject("adodb.connection")
Set rst=CreateObject("adodb.recordset")
HMIRuntime.Tags("writecounter").write 24
conn.Open "Provider=MSDASQL;DSN=SQL_QSDaten" 'DSN= Name der ODBC-Datenbank

sql_table="INSERT INTO DL_QSDaten VALUES (55,33,66,33')"

Set rst=conn.execute(sql_table)
conn.close

Set rst = Nothing
Set conn=Nothing



End Sub

Hat jemand eine Idee? Oder sowas mit einem Skript schonmal gemacht?


----------



## volker (4 Oktober 2008)

guck mal hier. ganz unten.
http://www.sps-forum.de/showthread.php?t=15348


----------



## mertens2 (4 Oktober 2008)

*glaub ich nicht das richtige*

hab ja keine mysql-Datenbank sondern sql server....


----------



## Question_mark (4 Oktober 2008)

*Erkläre doch mal Dein Problem mit dem Script ...*

Hallo,



			
				mertens2 schrieb:
			
		

> Hat jemand eine Idee?



Es wäre jetzt eigentlich schön, nachdem Du Dein Script hier eingestellt hast, eine Beschreibung Deines Problems nachzureichen. Funktioniert Dein Script nicht ? Gibt es Fehlermeldungen ? Ich kann jetzt Dein Problem nicht so richtig nachvollziehen ..

Gruß

Question_mark


----------



## mertens2 (5 Oktober 2008)

*fehlermeldung gibt es nicht...*

also ich bin nicht der experte in WinCC und schon gar nicht in WinCC Skripten. Das Skript läuft ab, aber an der stelle wo der execute befehl kommt, scheint es abzubrechen. Es kommt keine Fehlermeldung. Aber ich habe das so bemerkt: alle Befehle vor dem execute werden ausgeführt, alle danach nicht mehr. Habe einfach an verschiedenen stellen des skripts einer variablen verschiedene werte zugewiesen, so konnte ich feststellen wie weit es läuft. In der Doku wird von einem Skript-Debugger gesprochen, ich weiss aber nicht, wie ich ihn einbinde.

In der Datenbank werden keine Werte geschrieben. Die Datenbank habe ich unter SQL server angelegt (welches ja durch winCC schon auf dem Rechner drauf ist)


----------



## volker (5 Oktober 2008)

ich vermisse user und passwort

vielleicht hilft dir das weiter
http://support.microsoft.com/kb/836863/de


----------



## Ralle (5 Oktober 2008)

Du mußt dem MicrosoftScriptDebugger installieren. Bei WinCC6.0 war der wohl noch auf der CD dabei, bei WinCC6.2 ist er anscheinend nicht mehr dabei :twisted:, obwohl Siemens ihn in der Doku erwähnt, gib mal in der Hilfe "Scriptdebugger" ein. Leider macht ein Siemens darauf überhaupt nicht aufmerksam. Zusätzlich kannst du die aus "Smart-Objekten/Applikationsfenster" ein Global Script und dann GSC-Diagnose Objekt in einem deiner Bilder anlegen. Dann kannst du im Script in dieses Fenster Texte ausgeben.

HMIRuntime.Trace "Variable xY geschrieben" & MeineVariable & vbCrLf


----------



## mertens2 (5 Oktober 2008)

*user id und passwort?*

wo muss ich das angeben? schon bei open?


----------



## volker (5 Oktober 2008)

genau
in etwa so

```
conn.open "provider=msdasql;driver=sql server;server=YourServer;database=pubs;uid=YourUID;pwd=YourPassword;"
```

vielleicht hilft auch das
http://domain945847.sites.fasthosts.com/faqs.asp


----------



## Ralle (5 Oktober 2008)

@mertens2

zum MicrosoftScriptdebugger für WinCC

1. Installieren
2. WinCC öffnen 
3. im WinCC-Projekt unter Rechner --> Eigenschaften --> Eigenschaften --> Runtime -> Debugging aktivieren
4. zusätzlich habe ich noch in den iexplorer-Eigenschaften das "Scriptdebugging deaktivieren" abgewählt, weiß nicht ob das ein MUSS ist
5. WinCC schließen, und nochmal öffnen, es wird nun automatisch der Scriptdebugger vom MS mitgestartet
6. im Scriptdebugger "View/Running Documents" anhaken
7. Ich hab nun dort unter PDLRT z.Bsp. stehen Testbild.pdl_Events, das doppelclicken, das Script öffnet sich, da hab ich dann einen Haltpunkt gesetzt und dann funzt das

Ich glaube aber, es wird dann alles debuggt, evtl. auch ohne Breakpoints, bin mir nicht mehr ganz sicher.


----------



## mertens2 (5 Oktober 2008)

Ralle schrieb:


> @mertens2
> 
> zum MicrosoftScriptdebugger für WinCC
> 7. Ich hab nun dort unter PDLRT z.Bsp. stehen Testbild.pdl_Events, das doppelclicken, das Script öffnet sich, da hab ich dann einen Haltpunkt gesetzt und dann funzt das


 ´
was ist denn PDLRT? Bin WinCC-Anfänger. Sorry.


----------



## Ralle (5 Oktober 2008)

Mach mal im Scriptdebugger den View auf, dann findest du das. Darunter stehen dann deine ganzen Scripte, die im WinCC laufen, u.A. auch die Actionscripte, den WinCCBildern (*.pdl) zugeordnet. Ich habs gerade probiert, das Debuggen funktioniert. Allerdings gebe ich mir Variablen, welche mich interessieren immer mit dem "HMIRuntime.Trace" aus, ich glaube der Scriptdebugger zeigt einem die Variablenwerte nicht, oder hab ich das nur nicht gefunden? Vielleicht weiß darüber noch jemand etwas. Insgesamt ist es eh sinnvoll, sich einen Schalter in die Scripte einzubauen (eine Variable, z.Bsp. DebugON genannt), welcher einem dann per if ... then Debugausgaben in ein extra Bild schreibt, in dem ein GCC Diagnose-Objekt groß genug angeordnet ist. Das hat sich bei uns jedenfalls bewährt. Der MS-Debugger zeigt einem die Fehler im Script, wenn man das Fehlerfrei hat, sollte man den wieder über die Eigenschaften deaktivieren, sonst hält das WinCC laufend an, bei Scripten. Dran denken, wenn der Debugger das Script stoppt, steht alles in WinCC, keine anderen Scripte kommen dann noch zur Ausführung.


----------



## Funky (5 Oktober 2008)

Hallo mertens2

Ich habe für dich zwei Skripte die problemlos Daten in einen SQL -Server schreiben (2000, 2005).

Auf den Runtime - PC muß die ODBC Datenqeulle eingerichtet werden. Bei mir im Beispiel "C45-Archiv".

Skript 1 kann bei Aufruf ein neues Tabelle "Kamera" mit den in Zeile 7 angegeben Spalten erzeugen.

```
' Dieses Skript erzeugt eine Neue Tabelle in einer SQL Datenbank
Dim conn1, rst1
Set conn1 = CreateObject("ADODB.Connection")
Set rst1 = CreateObject("ADODB.Recordset")
conn1.Open "Provider=MSDASQL;DSN=C45-Archiv" 'DSN= Name der ODBC-Datenbank 
Dim SQL_Tabelle1
SQL_Tabelle1 = "CREATE TABLE Kamera (Zeitstempel_Kamera DATETIME NOT NULL, Ergebnis_Kamera CHAR(6) NOT NULL, Pos_Fahne FLOAT(6) NOT NULL, Abst_Fahne FLOAT(6) NOT NULL, Tol_Fahne_min FLOAT(6) NOT NULL, Tol_Fahne_max FLOAT(6) NOT NULL, Abst_Draht_li FLOAT(6) NOT NULL, Abst_Draht_re FLOAT(6) NOT NULL, Tol_Draht FLOAT(6) NOT NULL, Länge_NTC FLOAT(6) NOT NULL, Tol_NTC_min FLOAT(6) NOT NULL, Tol_NTC_max FLOAT(6) NOT NULL, Mittenversatz_NTC FLOAT(6) NOT NULL, Tol_Mittenversatz FLOAT(6) NOT NULL)"
' ShowSystemAlarm SQL_Tabelle1 
Set rst1 = conn1.Execute(SQL_Tabelle1)
 
conn1.close
Set conn1 = Nothing
Set rst1 = Nothing
Set SQL_Tabelle1 = Nothing
```
Wenn Zeile 8 aktiviert wird, wird der an den SQL-Treiber übergebene String angezeigt.


Skript 2 schreibt dann 14 Werte zum SQL-Server. Wert 1 steht am Ende von Zeile 16.

```
' Dieses Skript schreibt Daten in eine SQL Datenbank
SmartTags("Mess\Kamera110\DIB St.110.M_Datenbernahme")=2
Dim conn1, rst1
On Error Resume Next
Set conn1 = CreateObject("ADODB.Connection")
Set rst1 = CreateObject("ADODB.Recordset")
conn1.Open "Provider=MSDASQL;DSN=C45-Archiv"
'Fehlerroutine
If Err.Number <> 0 Then
 ShowSystemAlarm "Fehler 1 #" & Err.Number & " " & Err.Description
 Err.Clear
 Exit Sub
End If
Dim SQL_Tabelle1 
 
 SQL_Tabelle1 = "INSERT INTO Kamera ([Zeitstempel_Kamera],[Ergebnis_Kamera],[Pos_Fahne],[Abst_Fahne],[Tol_Fahne_min],[Tol_Fahne_max],[Abst_Draht_li],[Abst_Draht_re],[Tol_Draht],[Länge_NTC],[Tol_NTC_min],[Tol_NTC_max],[Mittenversatz_NTC],[Tol_Mittenversatz]) VALUES ('"&SmartTags("Mess\Kamera110\Zeitstempel")&"','"_
               &SmartTags("Mess\Kamera110\DIB St.110.M_Gutteil")&"','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Pos_Fahne")),",",".")+ "','"_
                 +Replace(CStr(SmartTags("Mess\Kamera110\Abst_Fahne")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Toler_Fahne_min")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Toler_Fahne_max")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Abst_Daht_li")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Abst_Daht_re")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Toler_Daht")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Laenge_NTC")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Toler_NTC_min")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Toler_NTC_max")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Abst_Fahne_NTC")),",",".")+ "','"_
              +Replace(CStr(SmartTags("Mess\Kamera110\Toler_Fahne_NTC")),",",".")+"')"
 'Fehlerroutine
If Err.Number <> 0 Then
 ShowSystemAlarm "Fehler 3 #" & Err.Number & " " & Err.Description
 Err.Clear
 Exit Sub
End If
 
' ShowSystemAlarm SQL_Tabelle1 
 Set rst1 = conn1.Execute(SQL_Tabelle1)
'Fehlerroutine
If Err.Number <> 0 Then
 ShowSystemAlarm "Fehler 4 #" & Err.Number & " " & Err.Description
 Err.Clear
 Exit Sub
End If
 
conn1.close
Set conn1 = Nothing
Set rst1 = Nothing
Set SQL_Tabelle1 = Nothing
SmartTags("Mess\Kamera110\DIB St.110.M_Datenbernahme")=0
```
 
Wenn Werte im REAL-Format übertragen werden sollen ist das "," durch einen "." zu ersetzten. Ab Zeile 18 wird mit "CStr" der Wert in einen String gewandelt und über den "Replace" - Befehl Komma gegen Punkt getauscht.

mfg Harald


----------



## mertens2 (6 Oktober 2008)

Funky schrieb:


> ShowSystemAlarm "Fehler 4 #" & Err.Number & " " & Err.Description



Vielen Dank. Über Error Number und Description habe ich den Fehler gefunden. Die Anzahl der übergebenen Daten passte einfach nicht. ShowSystemAlarm funktioniert bei mir allerdings nicht. Ich habe das dann über normale Ausgabefelder der Runtime gemacht.

Vielen Dank!


----------

