# Datenaustausch WinCC-flexible zu SQL-Server



## Funky (22 Februar 2008)

Hallo Leute 

Habe die Aufgabenstellung Werte aus einem „WinCC flexible PC-Runtime“ auf einen SQL 2005 Server Express Edition zu schreiben.
Die Verbindung zum Server und das Erzeugen einer neuen Tabelle vom Runtime aus läuft problemlos. Ich kann auch Werte von Type INT in die Tabelle schreiben.
Mein Problem ist das ich außer Ganzahlen, REAL-Zahlen (Später ca.50) und noch Daten von Type DATE_AND_TIME übertragen muss.
In Abwandlung von einer Siemens FAQ sieht mein Projekt wie folgt aus.

*Skript 1 „Erzeugung einer neuen Tabelle“*

Dim conn, rst
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

conn.Open "Provider=MSDASQL;DSN=C45-Archiv" 'DSN= Name der ODBC-Datenbank 
Dim SQL_Tabelle

SQL_Tabelle = "CREATE TABLE "& SmartTags("SQL\Tab_Name") &" (Nr Int, Temp NUMERIC(4,1), R_Ist FLOAT(9), R_Soll FLOAT(9))"

Set rst = conn.Execute(SQL_Tabelle)

*Skript 2 „Schreiben von Variabel in Tabelle“*

Dim conn, rst
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
conn.Open "Provider=MSDASQL;DSN=C45-Archiv"

Dim SQL_Tabelle 

SQL_Tabelle = "SELECT * FROM "&SmartTags("SQL\Tab_Name") & " WHERE Nr = "&SmartTags("SQL\Dat_Nr") '* = Alle Daten
Set rst = conn.Execute(SQL_Tabelle)

If Not (rst.EOF And rst.BOF) Then 
'Vergleich ob End of File oder Begin of File ist, wenn nicht wird der Zeiger auf den Ersten Eintrag zurückgesetzt
ShowSystemAlarm "Dat_Nr. ist bereits vorhanden!"
rst.close 
Else

SQL_Tabelle = "INSERT INTO "& SmartTags("SQL\Tab_Name") & " VALUES ('"&SmartTags("SQL\Dat_Nr") &"','"&SmartTags("SQL\Temperatur") &"','"&SmartTags("SQL\NTC Ist")&"','"&SmartTags("SQL\NTC Soll")&"')"

Set rst = conn.Execute(SQL_Tabelle)
End If

Die Variabeln in flexible haben folgende Formate:
SQL\Tab_Name = String
SQL\Dat_Nr = Word
SQL\Temperatur = Int
SQL\NTC Ist = Real
SQL\NTC Soll = Real

Wenn ich das zweite Skript ausführe, erhalte ich folgende Fehlermeldung. „Fehler beim Konvertieren des varchar Datentypes in real. 
Kann man jemand helfen wie ich REAL Werte übertragen kann, bzw. für Später welche Formate muß ich einstellen um das Siemens Format Dat-und-Time zu übertragen.

Harald


----------



## JesperMP (22 Februar 2008)

Ist den Tabelle erzeugt geworden mit REALs ?

Dies ist von Siemens' Beispielprojekt, aber für INTs:

'Definition of SQL table - Definition der SQL-Tabelle
SQL_Table = "CREATE TABLE "& szTableName & " (Nr SMALLINT, " _
            & szName_1 & " CHAR(30), " & szName_2 & " SMALLINT, " _
            & szName_3 & " SMALLINT)

Ich weiss nicht ob REALs auch "REAL" heisst in SQL.


----------



## Funky (22 Februar 2008)

Hallo Jesper M. Pedersen 

Es gibt in SQL REAL als auch FLOAT Datentypen
Mit beiden habe ich es probiert.
Im oberen Auszug wird eine Tabelle mit FLOAT für die letzten beiden Spalten erzeugt.

SQL_Tabelle = "CREATE TABLE "& SmartTags("SQL\Tab_Name") &" (Nr Int, Temp NUMERIC(4,1), R_Ist _*FLOAT(9*_), R_Soll _*FLOAT(9*_))"

Die Tabelle wird auch richtig erstellt. Die Datenbank kann ich mit "MS SQL Server Manageament Studio Express" gut beobachten.
Vielen Dank für Deine Mühe
Harald


----------



## JesperMP (23 Februar 2008)

Dies interessiert mich auch sehr viel.
Ich muss auch REALs schreiben, haben aber nur getestet mit INTs so weit.
Ich dachte nicht, dass es ein Problem werden könnte.
Montag kann ich testen, ob ich auch das gleiche Problem haben.
Wenn dies der Fall ist, würde ich Kontakt mit Siemens support nehmen.


----------



## Funky (25 Februar 2008)

Hallo Jesper M. Pedersen 

Habe gerade das Problem an den Support von Siemens übergeben.
Wenn ich Nachricht habe, werde ich dich darüber in Kenntnis setzen.

mfg Harald


----------



## JesperMP (25 Februar 2008)

Hallo Harald.

Bei mir hat es geklappt, aber nur when ich das komma-zeichen auf mein PC auf "." eingestellt habe !

Ein tip ist ein systemmessage zu triggern für jeden SQL befehl:

If SmartTags("ODBC\debug_message_on") Then ShowSystemAlarm SQL_Table

ODBC\debug_message_on stuere ich mit ein schalter auf den schirm.

Dabei habe ich gesehn dass den string ein "," als kommazeichen verwendete.

Die Frage besteht: Verwendet SQL als Kommazeichen immer das ".", oder hängt es auf irgendeiner einstellung.


----------



## JesperMP (25 Februar 2008)

Dies gibt ein systemmessage when das "falsche" dezimalzeichen eingestellt ist:

chDecPoint = Mid(CStr(8.1), 2, 1)
If SmartTags("ODBC\debug_message_on") And Not chDecPoint = "." Then ShowSystemAlarm "Decimal separator is wrong. Set to '.' in Windows Control Panel .. Regional settings."


----------



## Funky (25 Februar 2008)

Hallo Jesper M. Pedersen 

Danke für die schnelle Lösung.
Nach der Umstellung des Dezimaltrennzeichen auf den "Punkt" läuft die Übertragung reibungslos.

Mal sehen was der Seimens - Support dazu sagt!

Vielen Dank nochmal

Harald


----------



## Funky (28 Februar 2008)

Hallo
ich habe folgende Rückmeldung aus der Entwicklungsabteilung erhalten:

Zitat:

Das beschriebene Verhalten liegt nicht im WinCC flexible. Bitte beachten Sie nachfolgenden Hinweis:

Wenn in den Windowseinstellungen das Komma als Dezimaltrennzeichen eingestellt ist, dann würde man auch erwarten, dass im VBS die Umwandlung eines Tags in String mit Komma erfolgt.

A = CStr(Smarttags("MyDoubleValue"))
Liefert für A halt einen String im Format 1,23

Entweder Sie müssen den SQL-Server anders aussteuern, damit der das Komma als Trennzeichewn akzeptiert oder Sie müssen sich ein Script schreiben, welches in einem String die Kommas durch Punkte ersetzen.
Vielleicht gibt es ja auch schon eine VBS-Funktion die solche Stringoperationen ermöglicht. Dies müssen Sie in der MS-Doku nachschlagen.

Ende Zitat

Nach meinen Recherchen (können auch falsch sein) akzeptiert ein SQL-Server nur den Punkt als Dezimaltrennzeichen, unabhängig der Windowseinstellungen.

Währe es da nicht der richtige Weg, wenn das „WinnCC flexible“-Objekt SmartTags("xyz"), oder ein anderes, die richtige Wandlung des Dezimaltrennzeichens übernimmt. 

*Das währe bestimmt Anwenderfreundlich.* 

Oder muss ich über VBS jede Variabel als Sting zerlegen, das Komma suchen und gegen Punkt tauschen und dann an SQL übergeben?

Hat jemanden so eine Funktion ?

mfg Harald


----------



## JesperMP (29 Februar 2008)

Funky schrieb:


> Oder muss ich über VBS jede Variabel als Sting zerlegen, das Komma suchen und gegen Punkt tauschen und dann an SQL übergeben?
> 
> Hat jemanden so eine Funktion ?


Ich glaube dies sollte gehen.

chDecPoint = Mid(CStr(8.1), 2, 1)
strVal1 = Replace(CStr(rVal1), chDecPoint, ".")
strVal2 = Replace(CStr(rVal2), chDecPoint, ".")
usw.

Aber ich habe keine gutes gefühl wenn meine skripte zu komplizirt werden.
Bis jetzt genügt es mir mit ein warnmeldung.


----------

