Problem mit Sql <> SPS Datenübertragung

Dementis

Level-1
Beiträge
37
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
HAllo Leute,

Ich hab wieder einmal ein Problem.

Ich hab ein VB Skript geschrieben das von einer SQL Datenbank daten auslest und gegebenfalls bei wertänderung SPS seitig (Flankenauswertung) wieder in Datenbank schreibt.

In grossen und ganzen Funktioniert das Skript einwandfrei, nur wenn ich das auf eine Tabelle begrenze.

Nun mein Problem daran ist einfach das ich alle Spalten die in der Datenbank vorhanden sind auf die selbe weise überprüfen will.

Das skript wird über Taktmerker von SPS aufgerufen, ich vermute das das Skript noch nicht durchlaufen ist und dann durch änderung des Taktmerkers neu gestartet wird.

Auch bei anderen Taktmerker ist das selbe.

Meine Frage ist nun kann man wincc flex "zwingen" das Skript fertig durch zu arbeiten, oder hat wer ne andere idee?

Probiert hab ich bereits Schleifen und abarbeitung ohne SCHleife.

Mfg
 
wie wäre es mit einem "inProgress"-Bit, welches bei start des skriptes gesetzt wird und erst nach abarbeitung zurückgesetzt? steuerungsseitig z.B. mit UN in den Start rein und im skript am ende auf false ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Tipp, werd ich mal Probieren.

Andere frage, Gibt eigentlich ne schnellere Möglichkeit dynamisch auf einen Datenbereich der SPS zuzugreifen über Wincc flex außer Multiplexen?(und nich ohne x1000 Variablen anzulegen :D)

mfg
 
So hab das mal getestet.

Es funktioniert so wie du meinst, Das skript läuft bis zum ende durch, aber das skript braucht ewig für die abarbeitung...

Gibt es eine Möglichkeit den Datenaustausch sauber und schnell zwischen SQL Datenbank und SPS zu verwircklichen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmals ein paar Worte zu den Skript ist ja bissal lang :)...


Es geht um Überprüfung auf änderung der einzelnen Werte (Flankenauswertung) und dann wird überprüft von welcher Seite die änderung kommt Datenbank oder SPS und dann werden die Variablen überschrieben.

Hab mir auch schon überlegt ob ich die ganze Flankenauswertung über SPS mache, das hab ich noch nciht probiert...

Code:
On Error Resume Next
Dim sql,sql1
Dim dbname, dbuser, dbpw, conn
Dim recordset, i
Dim Raum
Dim Szene
Dim Licht
Dim Raumzahl
Dim offsetarray
Dim Jalauf,Jalzu,Heizungaktiv,Jalaktiv,Farbsteuerung,Szenenwahl,Raumname,Solltemp,Solljal
Dim zugriffrechnung,LichtSPS,JalaufSPS,JalzuSPS,Jalaufzyklus,Jalzuzyklus,Istjal,Isttemp
Dim RGBzyklus,Lichtzyklus,zeit
i=schleife
offsetarray=54
Raumzahl=SmartTags("Raumzahl")
'MySQL Daten zugriff variablen deklarieren
dbname = "puppenhaus"    'Datenbankname
dbuser = "root"    'Datenbankuser
dbpw = ""     'Datenbankpasswort
Set conn = CreateObject("ADODB.Connection")
'Aufruf des verwendeten SQL Treiber
conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=" + dbname + "; UID=" + dbuser + ";PWD=" + dbpw + "; OPTION=3"
'Kommunikation zu mysql öffnen
conn.Open
 
SmartTags("Multiplex_Name")=(offsetarray*i)+20
SmartTags("Multiplex_Bits1")=(offsetarray*i)+52
SmartTags("Multiplex_Bits2")=(offsetarray*i)+53
SmartTags("Multiplex_RGB")=(offsetarray*i)+54
SmartTags("Multiplex_RGB_zyklus")=(offsetarray*i)+56
SmartTags("Multiplex_SollJal")=(offsetarray*i)+58
SmartTags("Multiplex_Istjal")=(offsetarray*i)+62
SmartTags("Multiplex_SollTemp")=(offsetarray*i)+66
SmartTags("Multiplex_IstTemp")=(offsetarray*i)+70
'For zeit=0 To 100 Step 1
'hh
' Next
Delay(1)
 
 
 
' Daten von mysql Datenbank auslesen
sql = "SELECT NAME,Heizung,Jalousie,Farbe,Szene,Solltemp,Solljalousie,Lichtein,Jalauf,Jalzu FROM raume WHERE id="& CStr(i+1)
recordset = conn.Execute(sql)
Licht = recordset("Lichtein")
Jalauf= recordset("Jalauf")
Jalzu= recordset("Jalzu")
Heizungaktiv= recordset("Heizung")
Jalaktiv= recordset("Jalousie")
Farbsteuerung= recordset("Farbe")
Szenenwahl= recordset("Szene")
Raumname= recordset("NAME")
Solltemp= recordset("Solltemp")
Solljal= recordset("Solljalousie")
SmartTags("S_Raumname")=Raumname
If SmartTags("B_Licht_ein")=True Then
 LichtSPS=1
Else
 LichtSPS=0
End If
If SmartTags("B_Licht_Zyklus")=True Then
 Lichtzyklus=1
Else
 Lichtzyklus=0
End If
If Licht <> LichtSPS Then
 If Lichtzyklus <> Licht Then
  If Licht = 1 Then
   SmartTags("B_Licht_ein")=True 
   SmartTags("B_Licht_Zyklus")=True
  Else
   SmartTags("B_Licht_ein")=False
   SmartTags("B_Licht_Zyklus")=False
  End If
 End If
 
 If Lichtzyklus <> LichtSPS Then
  sql1 = "Update raume SET Lichtein="& CInt(LichtSPS)& " where ID="& CInt(i+1)
  recordset = conn.Execute(sql1)
 
  If LichtSPS =1 Then
   SmartTags("B_Licht_Zyklus")=True
  Else
   SmartTags("B_Licht_Zyklus")=False
  End If
 End If
End If
SmartTags("B_Heizung_aktiv")=Heizungaktiv
If Heizungaktiv =1 Then
 Isttemp=SmartTags("R_Istwert_Temp")
 SmartTags("R_Sollwert_Temp")=Solltemp
 sql1 = "Update raume SET Isttemp="& CDbl(Isttemp)& " where ID="& CInt(i+1)
 recordset = conn.Execute(sql1)
 
End If
If Jalaktiv =1 Then
 
 If SmartTags("B_Jal_auf")=True Then
  JalaufSPS=1
 Else
  JalaufSPS=0
 End If
 If SmartTags("B_Jal_zu")=True Then
  JalzuSPS=1
 Else
  JalzuSPS=0
 End If
 
 If SmartTags("B_Jal_auf_Zyklus") = True Then
  Jalaufzyklus=1
 Else
  Jalaufzyklus=0
 End If
 
 If SmartTags("B_Jal_zu_Zyklus") = True Then
  Jalzuzyklus=1
 Else
  Jalzuzyklus=0
 End If
 
 If JalaufSPS <> Jalauf Then
 
  If Jalaufzyklus <> Jalauf Then
   If Jalauf =1 Then
    SmartTags("B_Jal_auf")= True
    SmartTags("B_Jal_auf_Zyklus")=True
   Else
    SmartTags("B_Jal_auf")=False
    SmartTags("B_Jal_auf_Zyklus")=False
   End If
  End If
 
  If Jalaufzyklus <> JalaufSPS Then
 
   sql1 = "Update raume SET Jalauf="& CInt(JalaufSPS)& " where ID="& CInt(i+1)
   recordset = conn.Execute(sql1)
 
   If JalaufSPS =1 Then
    SmartTags("B_Jal_auf_Zyklus")=True
   Else
    SmartTags("B_Jal_auf_Zyklus")=False
   End If
  End If
 End If
 
 If JalzuSPS <> Jalzu Then
  If Jalzuzyklus <> Jalzu Then
   If Jalauf =1 Then
    SmartTags("B_Jal_zu")= True
    SmartTags("B_Jal_zu_Zyklus")=True
   Else
    SmartTags("B_Jal_zu")=False
    SmartTags("B_Jal_zu_Zyklus")=False
   End If
  End If
 
  If Jalzuzyklus <> JalzuSPS Then
   sql1 = "Update raume SET Jalzu="& CInt(JalzuSPS)& " where ID="& CInt(i+1)
   recordset = conn.Execute(sql1)
   If JalaufSPS =1 Then
    SmartTags("B_Jal_zu_Zyklus")=True
   Else
    SmartTags("B_Jal_zu_Zyklus")=False
   End If
  End If
 End If
 SmartTags("R_Sollwert_jal")=Solljal
 If i>0 Then
 Istjal=SmartTags("R_Istwert_jal")
 sql1 = "Update raume SET Istjal="& CLng(Istjal)& " where ID="& CInt(i+1)
 recordset = conn.Execute(sql1)
 End If
 
End If
 
If Farbsteuerung= 1 Then
  If Szenenwahl <> SmartTags("I_RGB_Szene") Then
   If Szenenwahl <> SmartTags("I_RGB_zyklus") Then
    SmartTags("I_RGB_Szene")= Szenenwahl
    SmartTags("I_RGB_zyklus")=Szenenwahl
   End If
 
   If SmartTags("I_RGB_Szene") <> SmartTags("I_RGB_zyklus") Then
 
    sql1 = "Update raume SET Szene="& CInt(SmartTags("I_RGB_Szene"))& " where ID="& CInt(i+1)
    recordset = conn.Execute(sql1)
    SmartTags("I_RGB_zyklus") =SmartTags("I_RGB_Szene")
   End If
  End If
End If
 
conn.close

mfg
 
Es funktioniert so wie du meinst, Das skript läuft bis zum ende durch, aber das skript braucht ewig für die abarbeitung...

Da du das ganze ja über indriekte Adressierung machst, wieviele Schleifendurchläufe hast du denn? Wenn er nach jedem durchlauf die indirekte Adresse ändern muss, wird er auch immer wieder die indirekt Adressierte Variable frisch lesen und am Ende frisch schreiben müssen.

Wenn wir jetzt davon ausgehen das ein SPS Zugriff so um die 15ms dauert (ist z.B. bei meiner 400er TestCPU so), dann musst du im Script ja schon 2 mal Zugreifen (1* lesen, 1* schreiben), das würde bei z.B. 100 durchläufen schon 3s dauern!

Und du schreibst ja noch viel mehr Wert, wobei Ich jetzt nicht weis, wann WinCC-Flex die an die SPS überträgt, sofort oder erst wenn die Multiplexadresse geändert wird...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@ Kai das funktioniert leider nicht, da ja die Bit variablen in der SPS True bzw False Zustände haben, hab ich schonmal Probiert

@jochen

Ja ist indirekt weil ich das ganze dynamisch Programmieren will, das es für wenig aufwand erwiterbar ist.

Normal aktuell 7 Durchläufe ABER bin auf folgende idee gekommen.
Ich beschreib per PHP eine Variable die mir genau die ID des Aktuellen Raums den der Benutzer anschaut rein Schreibt und somit hab ich NUR 1 Durchlauf und zwar mit der Nummer des Raumes so Klappt es! :)

Jaja ich weiß bei mehrere LEute auf der Visu wird das blöd aber dazu hab ich noch vor das ich ne Sessionverwaltung mach, mal sehen wann ich dazu komm...

:D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist natürlich schon lang, aber wie gesagt, Ich weis nicht wann Flexible die Variablen in einem Script an die SPS schreibt, sofort oder werden die Schreibaufträge gepuffert.

In WinCC kann man das ja beinflussen durch die Tag Funktionen mit Wait oder Ohne (oder in VBS durch anhängen einer 1), aber bei Flex, keine Ahnung!
 
Das ist natürlich schon lang, aber wie gesagt, Ich weis nicht wann Flexible die Variablen in einem Script an die SPS schreibt, sofort oder werden die Schreibaufträge gepuffert.

Ich glaub du meinst die Einstellung unter Variableneigenschaften wo man auswählen ob die Variable bei Zyklus fortlaufen, zyklisch bei Verwendung und bei Anforderung,oder?

In WinCC kann man das ja beinflussen durch die Tag Funktionen mit Wait oder Ohne (oder in VBS durch anhängen einer 1), aber bei Flex, keine Ahnung!
Wie meinst das? das klingt interesant :D
Ich kenn nur bei Wincc flex das mit der eigenen Funktion Waitzeit.

mfg
 
Ich glaub du meinst die Einstellung unter Variableneigenschaften wo man auswählen ob die Variable bei Zyklus fortlaufen, zyklisch bei Verwendung und bei Anforderung,oder?

Nöö, Ich meine, wann schreibt Flexible eine in einem Script zugewiesene Variable in die SPS. Direkt nach der Zuweisung, und wartet dann das Script? Oder läuft das im Hintergrund?
 
Zurück
Oben