# Variablen von wincc nach access



## chrissi52000 (3 Mai 2007)

Hallo.

Hab ein kleines aber feines Problem.

Ich möchte WinCC Variablen nach Access in eine Datenbank schreiben.
Die funktioniert auch, solange es sich um reine Zahlen handelt(z.B.Vorzl. 8 Bit Wert).

Sobald ich versuche Variablen vom Typ Textvariable in die Datenbank zu schreiben, treten Probleme auf.

Zum Einen, wenn es sich um eine Textvariable vom Typ 8 Bit handelt, wird mir diese in der Datenbank als Kommazahl angezeigt.(In der WinCCVariable steht 12345612345612345121... und angezeigt in Access wird 1,23456123456123E+71)
Zum Zweiten, wenn in der Textvariablen Buchstaben vorkommen, wird nichts in die Datenbank geschrieben.
Wenn ich die Variable als Typ Textvariable 16 Bit festlege, wird ebenfalls nichts in die Datenbank eingetragen.

In Access habe ich das Feld für die Eintragung der Variablen als Text eingestellt.

Mein Vb Skript sieht so aus:

Dim objConnection
Dim strConnectionString
Dim lngValue
Dim strSQL
Dim objCommand
strConnectionString = "Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;" 
lngValue = HMIRuntime.Tags("Tag1").Read
strSQL = "INSERT INTO WINCC_DATA (TagValue) VALUES (" & lngValue & ");" 
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strConnectionString
objConnection.Open
Set objCommand = CreateObject("ADODB.Command")
With objCommand
.ActiveConnection = objConnection
.CommandText = strSQL
End With
objCommand.Execute
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing

Vielleicht hat ja jemand ne Idee woran das liegen könnte.

MfG
Chrissi


----------



## Krumnix (4 Mai 2007)

Unter der Hilfe von Siemens steht folgendes:

*Beispiel: So projektieren Sie eine Datenbankanbindung mit VBS
*Einleitung
Die folgenden Beispiele beschreiben die Projektierung einer Access-Datenbankanbindung über einen ODBC-Treiber.
Beispiel 1 schreibt einen Variablenwert aus WinCC in eine Access-Datenbank. 
Beispiel 2 liest einen Wert aus der Datenbank und schreibt diesen Wert in eine WinCC Variable. 
Die Beispiele enthalten keine Fehlerbehandlung.
Vorgehensweise Beispiel 1
1. Access-Datenbank mit Tabelle WINCC_DATA und Spalten (ID, TagValue) mit der ID als Autowert erstellen.
2. ODBC-Datenquelle mit Namen "SampleDSN" einrichten, Verweis auf obige AccessDatenbank.
3. Programmierung.

*Beispiel 1*
'VBS108
Dim objConnection
Dim strConnectionString
Dim lngValue
Dim strSQL
Dim objCommand
strConnectionString = "Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;" 
lngValue = HMIRuntime.Tags("Tag1").Read
strSQL = "INSERT INTO WINCC_DATA (TagValue) VALUES (" & lngValue & ");"  
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strConnectionString
objConnection.Open
Set objCommand = CreateObject("ADODB.Command")
With objCommand
    .ActiveConnection = objConnection
    .CommandText = strSQL
End With
objCommand.Execute
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing

--- --- --- --- ---

*Vorgehensweise Beispiel 2*
WinCC Variable mit dem Namen dbValue anlegen.
Access-Datenbank mit Tabelle WINCC_DATA und den Spalten: ID, TagValue erstellen (ID als Autowert).
ODBC-Datenquelle mit Namen "SampleDSN" einrichten, Verweis auf obige AccessDatenbank.
Programmierung.
*Beispiel 2*
'VBS108a
Dim objConnection
Dim objCommand
Dim objRecordset
Dim strConnectionString
Dim strSQL
Dim lngValue
Dim lngCount
strConnectionString = "Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;" 
strSQL = "select TagValue from WINCC_DATA where ID = 1" 
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strConnectionString
objConnection.Open
Set objRecordset = CreateObject("ADODB.Recordset")
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = strSQL
Set objRecordset = objCommand.Execute
lngCount = objRecordset.Fields.Count
If (lngCount>0) Then
objRecordset.movefirst
lngValue = objRecordset.Fields(0).Value
HMIRuntime.Tags("dbValue").Write lngValue
Else
HMIRuntime.Trace "Selection returned no fields" & vbNewLine 
End If
Set objCommand = Nothing
objConnection.Close
Set objRecordset = Nothing
Set objConnection = Nothing

Vielleicht solltest du es mal über die ODBC-Verbindung versuchen.

Gruß


----------



## chrissi52000 (7 Mai 2007)

Hallo.

Genau die 2 Skripte habe ich auch gefunden und benutzt.
Wie gesagt, das funktioniert alles, solange es sich nicht um Variablen vom Typ "Textvariable" handelt.


----------



## Larry Laffer (7 Mai 2007)

chrissi52000 schrieb:


> strSQL = "INSERT INTO WINCC_DATA (TagValue) VALUES (" & lngValue & ");"


 
Hallo,
hast du mal dein Augenmerk auf den Eintrag VALUES("&lngValue&") gelegt ?
M.E. könnte das heißen, dass eine Variable im Format LongInteger geschrieben werden soll ...
Ich bin allerdings auch kein Profi und somit ist das nur eine Mutmassung ...


----------



## Krumnix (9 Mai 2007)

Ja, das ist korrekt.

Aber nicht hier sondern folgend:

Dim lngValue <--- --- --- Ist mit der Deklaration als Variant vorgegeben.

Das bedeutet, das der erste Datentyp, der kommt, diese Variable als den
Typ deklariert. Wenn du also zuerst ein Int, Real etc. schickt, und dann
deine Strings, dann ist die Variable aber schon als Real vorgesehn und es
kommen nur Zahlen, oder es passiert garnix. Vermutlich das 2. kommt 
öfters vor.
Deswegen solltest du lngValue feste auf den Typ deklarieren, als den du
ihn nutzen willst


----------



## batman79 (14 Mai 2007)

Hallo!
Um eine String-Variable in eine Access-Datenbank zu schreiben muss man den Variablenwert in Hochkomma schreiben.

strSQL = "INSERT INTO WINCC_DATA (TagValue) VALUES (*'* " & lngValue & " *'*);" 

Gruß
de Maddin


----------



## rostiger Nagel (16 Juni 2010)

*Endschuldigung* das ich den alten Thread noch einmal hervor hole.
Ein Kollege von mir, versucht entsprechend den Beitrag #2 von Krumnix
eine Datenbankanbindung zu machen. Dieses klappt auch soweit, allerdings
nur mit einer Variabel. Sein wunsch ist es mehrere Variabeln und dann
noch in einer Zeile zu schreiben, kann uns da jemand ein Tip geben.

gruß helmut


----------

