# WinCC flex + Datenbank



## marvin (1 Februar 2007)

Hallo,

kann mir jemand sagen ob es möglich ist mit WinCC flexible Daten aus einer Datenbank auszulesen ?  
Normalerweise müsste es doch über ein Skript möglich sein, oder ?


----------



## tomtom222 (5 Februar 2007)

*Datenbank*

Ja, mit einem PC und VB-Script ist dies ohne weiteres möglich!
Nicht nur lesen, sondern auch schreiben!

Falls du nicht VB-Script kannst, aber ein bischen Geld über hast
gibt es von der Firma Inat den OPC-Router, der Daten über
 zB.: WinCC Flexible OPC-Server auf unterschiedliche 
Datenbanken lesen und schreiben kann!

Viele Grüße!


----------



## marvin (5 Februar 2007)

Genau das ist das Problem, ich habe zwar ein wenig Erfahrung mit VB, aber nicht mit VBS. Geld für eine neue Komponente möchte ich auch nicht ausgeben.
Mittlerweile ist die Aufgabenstellung auch ein wenig konkreter: Ich möchte Daten aus einer Access-Datenbank auslesen. Ich habe schon Beispiele gefunden wie ich über ein Archiv Daten in Access abspeicher kann, wie ich aber welche aus Access herausbekomme konnte ich leider noch nicht finden. Hat jemand ein Beispiel an dem mir deutlich wird wie das funktioniert ?


----------



## Jochen Kühner (5 Februar 2007)

*daten lesen....*

hier mal ein beispiel...

On Error Resume Next
Dim sql,d,t,pos
Dim dbname, dbuser, dbpw, conn
Dim recordset, datenbankwert 

dbname = "dbs"
dbuser = "root"
dbpw = "admin"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=" + dbname + "; UID=" + dbuser + ";PWD=" + dbpw + "; OPTION=3"
conn.Open

d=Mid(SmartTags("DB_ALLGEMEIN.SYSTEMZEIT"),7,4)+"-"+Mid(SmartTags("DB_ALLGEMEIN.SYSTEMZEIT"),4,2)+"-"+Mid(SmartTags("DB_ALLGEMEIN.SYSTEMZEIT"),1,2)
t=Mid(SmartTags("DB_ALLGEMEIN.SYSTEMZEIT"),12,8)

sql = "SELECT feld1 FROM tabelenname WHERE feld2 = wert)"
recordset = conn.Execute(sql)

datenbankwert = recordset("feld1")

conn.Close
Set conn = Nothing


----------



## marvin (5 Februar 2007)

Danke erstmal für dein Beispiel. Anscheinend hast du dich da mit einer MySQL DB verbunden. Soweit ich das herausgefunden hatte ist die Syntax für Access eine etwas andere ( oder doch nicht ?). Nach langem (zusammen)suchen hatte ich folgendes Script geschrieben:

Dim db, rst, strSQL

Set db = CreateObject("ADODB.Connection")
db.Open ("DRIVER=Microsoft.Jet.OLEDB.4.0; DBQ=D:\Techniker\Projekt\Test.mdb")

Set rst = CreateObject("ADODB.Recordset")
strSQL = "SELECT tbltest.lfdnr FROM tbltest"
rst.Open strSQL


Was mir aber noch unklar ist und wofür ich noch kein Beispiel gefunden hatte: Wohin erfolgt das Ergebnis der SQL Abfrage bzw. wie bekomme ich das Ergebnis in eine Variable?
Damit klar wird was ich derzeit vorhabe:
Ich möchte mich in einer Runtime auf dem PC mit Hilfe des SmartClient mit verschiedenen Panels ( immer nur eins auf einmal ) auf denen der SmartServer läuft verbinden. In der Access-Datenbank sollen sowohl der Anlagenname wie auch die IP-Adresse des Panels hinterlegt sein.
Ich habe mir das so vorgestellt das ich in einem E/A Feld die Anlagennamen angezeigt bekomme und nachdem ich eine Anlage ausgewählt habe, die zugehörige IP-Adresse in eine Variable geschrieben wird.


----------



## marvin (5 Februar 2007)

Habe nach lange suche etwas bei Siemens gefunden, ist allerdings für WinCC:
http://support.automation.siemens.c...seus&aktprim=0&extranet=standard&load=content

Wenn mir jetzt jemand weiterhelfen könnte wie ich dieses Script unter flexible zum laufen bekomme, dann wäre dies meine Rettung.


----------



## tomtom222 (7 Februar 2007)

> In der Access-Datenbank sollen sowohl der Anlagenname wie auch die IP-Adresse des Panels hinterlegt sein.
> Ich habe mir das so vorgestellt das ich in einem E/A Feld die Anlagennamen angezeigt bekomme und nachdem ich eine Anlage ausgewählt habe, die zugehörige IP-Adresse in eine Variable geschrieben wird.


 
In der Datenbank soll "nur" IP-Adresse und Anlagenname hinterlegt sein,
oder soll mehr in die DB.

Nur für die IP-Adresse und den Anlagenname brauchst du keine Datenbank,
da reichen ein Skript und 2 Interne Stringvariablen aus!

Werde das Skript testen (wenn ich gleich Zeit habe) + posten!

viele Grüße
Thomas


----------



## marvin (7 Februar 2007)

In der Datenbank soll natürlich nicht nur der Anlagenname und die IP hinterlegt sein, sondern jeder Anlage sollen noch weitere Werte in einer eigenen Tabelle zugeordnet werde.
Mittlerweile habe ich das Script zum laufen bekommen. An einer Stelle  fehlte ein Set-Befehl  und anstatt  hmiruntime.tags muss es hmiruntime.smarttags heissen.


----------



## tomtom222 (8 Februar 2007)

Hi!
Dasselbe geht auch mit ner SQL-Datenbank, falls du mal eine 
verwenden solltest.

Trotzdem hier noch das Skript um die IP,Hostname und evtl. die MAC-Adresse der HMI-Station auszulesen. Wenn du dann mit Smart-Service
auf die Station schaust, kannst du immer die aktuelle IP sehen!


Einfach 3 interne Stringvariablen (25 Bytes) mit den Namen 

strMAC_Adresse
strHost_Name
strIP_Adresse

anlegen und mit einem Ausgabefeld (Typ String min 25 Zeichen) 
verschalten.

Dann hängst du dieses Skript zB. einfach an das 'Startbild'->Ereignis->Bild 
aufgebaut oder du rufst es zeitlich im Taskplaner auf. 



```
Dim strComputer,objWMIService,colAdapters,n
Dim objAdapter,i
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colAdapters = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
Set objAdapter = colAdapters 
n = 1
 For Each objAdapter In colAdapters
  If n=1 Then
  SmartTags("strMAC_Adresse")=CStr(objAdapter.MACAddress)
   SmartTags("strHost_Name")= CStr(objAdapter.DNSHostName)
 
   If Not IsNull(objAdapter.IPAddress) Then
      For i = 0 To UBound(objAdapter.IPAddress)
        SmartTags("strIP_Adresse")=CStr(objAdapter.IPAddress(i))
      Next
   End If
   End If
   n=n+1
 Next
```
 
PS:
Wenn du viel mit Visualisierungen zu tun hast, würde ich mir 
VBscript und Visual Basic ein bischen anschauen, denn damit läßt sich 
vieles realisieren, wo du sonst mit den 'reinen' Visu-Mitteln nicht
rankommst. Und die meisten Visualisierungen unterstützen VBscript.

Viele Grüße 
Thomas


----------

