Skript Schreibt nicht in den DB

umi

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
WinCC flexible Runtime für PC
SPS S7-300

Hallo,

ich habe ein Problem was wie folgt schildert, das Skript was ich geschrieben habe funktioniert im Test modus zu 100%.

Aber sobald ich es auf den Rechner lade schreibt mir mein String(String hat 100 zeichen) nicht mehr in meinen DB.
Könnte mir bitte jemand einen Tip geben woran das liegen könnte.

Vielen Dank
 
Könntest Du uns mal 'ne Glaskugel leihen? ;)
Oder das Skript zeigen?
Was meinst Du mit "Test modus"?
Gibt es Fehlermeldungen? Hast Du eine Meldeanzeige, wo Du Fehlermeldungen der Klasse System sehen kannst?
Wird das Skript überhaupt aufgerufen? Läuft das Skript auch komplett durch ohne Abbruch? Mache Dir mal Debug-/Testausgaben in das Skript rein:
Code:
ShowSystemAlarm "Skript xyz gestartet"
...
ShowSystemAlarm "Skript xyz tut jetzt dies ..."
...
ShowSystemAlarm "Skript xyz tut jetzt das ..."
...
ShowSystemAlarm "Skript xyz beendet"
Woher weißt Du, daß das Skript nicht schreibt? Bist Du sicher daß der String den richtigen Inhalt hat? Schreibe mal mit dem PG alles 0 in den DB, und später mal alles 16#FF - wird es durch irgendwas anderes überschrieben?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

getestet habe ich das Programm mit WinnCC flexible Runtime Simulator und da hat alles so funktioniert wie es sollte, sprich csv Datei wurde erstellt und auch reingeschrieben. nur in der Anlage macht er es nicht außer das eine Fehlermeldung kommt das in Zeile 12 in Variablen_schreiben ein Fehler ist. Was auch okay ist da er ja nix schreiben kann wenn die csv auch nicht da ist. Wenn ich mir den String online anschaue wird nicht hinein geschrieben oder kann nicht schreiben ich weis es nicht. der String hat eine länge von 100 zeichen.






Archiv_erstellen Typ: Function
'Erstellt eine neue Archivdatei und liefert den Pfadnamen zurück
'
Dim fso, f, ts, Header, FName, Datum, Zeit
'Datums und Zeit als String erzeugen
Datum = CStr(DatePart("d",Date)) & "_" & CStr(DatePart("m",Date)) & "_" & CStr(DatePart("yyyy",Date))
Zeit = CStr(DatePart("h",Now)) & "_" & CStr(DatePart("n",Now))
'Dateinamen erzeugen
FName = Ablagepfad & Dateiname & "_" & Datum & "_" & Zeit & ".csv"
'Tabellenkopf zusammenstellen
Header = "Zeit;Variable;Wert" & Chr(10)
'FileSystemObject erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
'Prüfen ob das Verzeichnis vorhanden ist
If Not fso.FolderExists(Ablagepfad) Then
SetBit SmartTags("Pfad not OK")
Else
ResetBit SmartTags("Pfad not OK")
End If
' Wenn Datei noch nicht vorhanden ist, dann wird eine Datei erzeugt
If Not fso.FileExists(FName) Then
fso.CreateTextFile FName

'File Objekt erzeugen
Set f = fso.GetFile(FName)
'Datei zum anhängen öffnen
Set ts = f.OpenAsTextStream(8, -2)
'Pfad- & Dateiname und Tabellenkopf in die Datei schreiben
ts.WriteLine(FName)
ts.WriteLine(Header)
'Datei schließen
ts.Close

End If
'Pfad der erzeugten Datei zurückliefern
Archiv_erstellen =FName



'Schreibt die Variablen Druck,Temperatur und Sollwert an das Ende einer
'vorher erzeugten Archivdatei
'

Variablen_schreiben Typ:Sub

Dim fso, f, ts, Datum, Zeit
Datum = CStr(DatePart("d",Date)) & "." & CStr(DatePart("m",Date)) & "." & CStr(DatePart("yyyy",Date))
Zeit = CStr(DatePart("h",Now)) & ":" & CStr(DatePart("n",Now)) & ":" & CStr(DatePart("s",Now))
'FileSystemObject erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
'File Objekt erzeugen
Set f = fso.GetFile(FName)
'Datei zum anhängen öffnen
Set ts = f.OpenAsTextStream(8, -2)
' Werte der Variablen in die Archivdatei schreiben (Parameter "TagName"z.B. Tag_01)
ts.WriteLine(Datum & " " & Zeit & ";" & "Druck" & ";" & CStr(SmartTags("DB_MW.Druck1")))
ts.WriteLine(Datum & " " & Zeit & ";" & "Temperatur" & ";" & CStr(SmartTags("DB_MW.Temperatur_Mittelwert1")))
ts.WriteLine(Datum & " " & Zeit & ";" & "Sollwert" & ";" & CStr(SmartTags("Daten Autoklave.SW_Temp_Programm_akt")))
ts.WriteLine(Datum & " " & Zeit & ";" & "Sollwert Grenze Max" & ";" & CStr(SmartTags("DB_GW.GW_Berechnet_Temp_Max")))
ts.WriteLine(Datum & " " & Zeit & ";" & "Sollwert Grenze Min" & ";" & CStr(SmartTags("DB_GW.GW_Berechnet_Temp_Min")))

'Datei schließen
ts.Close
 
Hallo,
ist ein bißchen unübersichtlich, dein Script - vor Allem wenn man nicht weiß, welches Script gemeint ist ... 8)
Wo ist die Variable "Ablagepfad" definiert und was genau beinhaltet sie ?
Wenn du die übergibst ... hast du berücksichtigt, dass da ggf. am Ende ein Blackslash (\) stehen muß ?

Gruß
Larry
 
nur in der Anlage macht er es nicht außer das eine Fehlermeldung kommt das in Zeile 12 in Variablen_schreiben ein Fehler ist.
Könntest Du uns auch noch verraten wie die Fehlermeldung lautet oder ist das geheim? ;) :rolleyes:
Welche Zeile ist denn die Zeile 12? Diese hier?
Code:
Set ts = f.OpenAsTextStream(8, -2)

Wie lautet denn der Dateiname der Datei welche Du im Skript "Variablen_schreiben" schreiben willst? Wo kommt FName her? Wie/wo/wann wird das Skript "Variablen_schreiben" aufgerufen?
Kann es sein, daß der Ablagepfad bzw. die ganze Ordnerstruktur auf dem RT-PC an der Anlage nicht existiert? Dann mußt Du diese Ordnerstruktur erst erzeugen. Das Erstellen einer Datei erzeugt keine Ordner. Eigentlich müßte da aber auch ein Fehler im Skript "Archiv_erstellen" kommen und außerdem "Pfad not OK" sollte True werden:
Code:
'Prüfen ob das Verzeichnis vorhanden ist
If  Not fso.FolderExists(Ablagepfad) Then 
 SetBit SmartTags("Pfad not OK")
Else
 ResetBit SmartTags("Pfad not OK")
End If
' Wenn Datei noch nicht vorhanden ist, dann wird eine Datei erzeugt
If Not fso.FileExists(FName) Then
   fso.CreateTextFile FName  [COLOR="#FF0000"]'<--- hier sollte ein Fehler kommen, wenn das Verzeichnis nicht vorhanden ist[/COLOR]
Irgendwie ist das nicht logisch, das Vorhandensein einer Datei zu prüfen und der Versuch diese Datei zu erzeugen, wenn schon der Ablageordner garnicht existiert...
(außerdem: Tagnamen mit Leerzeichen sind nicht so toll)

Aber sobald ich es auf den Rechner lade schreibt mir mein String(String hat 100 zeichen) nicht mehr in meinen DB.
:confused:
Irgendwie sehe ich nicht, wo Du in einen String in einem DB schreibst bzw. schreiben willst.


PS: zum übersichtlichen Einfügen von Programmcode in einen Forumsbeitrag bitte die CODE-Tags benutzen (der #-Button im Beitragseditor).

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die Variable Ablagepfad ist ein Eingabe/Ausgabe(Sting) in der Viso darin steht zum bsp: D:\abc\ und wenn ich mir das online Anschaue steht das auch drin. Der Ablagepfad ist auch vorhanden.
Oben im Text sind es ja 2 Scripte. Im Script Variablen_schreiben kommt auch die Fehler Meldung der er mit der Zeile Set f = fso.GetFile(FName) ein Problem hat was ja klar ist weil die CSV Datei nicht da ist. Aus irgendwelchen gründen würd die csv Datei nicht erzeugt. Was mir aufgefallen ist das wenn ich im sage das er das Archiv erstellen soll`, er nicht den Dateinamen erzeugt. Aber in der Simulation macht er das alles...
Oder Liegt es daran das es ein WinCC PC ist und kein Panel und ich die falschen befehle nehme?
 
Oder Liegt es daran das es ein WinCC PC ist und kein Panel und ich die falschen befehle nehme?
Wenn Deine Skripte auf Deinem Erstell-PC funktionieren, dann hast Du die richtigen File-Funktionen benutzt, dann funktionieren diese File-Funktionen auch auf dem RT-PC an der Anlage. Es sei denn, der RT-PC wäre ein Panel oder PC unter Windows CE. Doch dann würdest Du schon beim "Set fso = CreateObject(..." eine Fehlermeldung mit Skriptabbruch bekommen.

Wie ich in Beitrag #2 schon schrieb:
Um ein Skript zu debuggen sollte man am besten testhalber Debug-/Testausgaben mit der Systemfunktion ShowSystemAlarm in das Skript einbauen. Dann sieht man z.B. wenn das Skript garnicht an bestimmten Programmstellen ankommt. Damit kann man sich auch den Wert von Variablen ausgeben lassen:
Code:
If Not fso.FileExists(FName) Then
  ShowSystemAlarm "Datei '" & FName & "' nicht gefunden"
  ...

Harald
 
Hallo,

ich habe die Variable Datei erstellen dies ist eine Real zahl, wenn 2 dann Archiv_erstellen bei Grenzen habe ich die Oberregrenze auf 1 und die grenze prüfen bei den Ereignissen wird bei Obergrenze überschritten die Archiv_erstellen bearbeitet
Code:
Rückgabewert=Dateiname DB201DBB388(String100)
Ablagepfad=Ablagepfad DB201Dbb346(String40)
Dateiname=Auftrag DB201DBB304(String40)
PfadnotOK=PfadnotOK M27.0

Den Dateinamen erzeugt er sich selber auf Auftragsnummer und dem Datum.
Code:
'Dateinamen erzeugen
FName = Ablagepfad & Dateiname & "_" & Datum & "_" & Zeit & ".csv"

Der Ablage Ordner ist vorhanden.
 
hallo die Fehler Meldung kommt bei
Code:
'File Objekt erzeugen
Set f = fso.GetFile(FName)

Die GetFile-Methode benutze ich nicht um Dateien zu lesen oder zu schreiben.
Wenn ich mit WinCCflex Logs in csv- oder allgemein Textdateien schreibe, dann mache ich das etwa so:
Code:
' Ausgabedatei für Append öffnen und eine Zeile anhängen
Const ForAppending = 8
Dim fso, f, outfile

On Error Resume Next 'Dateioperations-Fehler auffangen

outfile = SmartTags("System\LogFilename") 'z.B. "C:\Logs\logfile.txt"

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(outfile, ForAppending, True) 'True: Erstellen, falls noch nicht vorhanden

If Err.Number <> 0 Then
  ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Öffnen '" & outfile & "': " & Err.Description
  Exit Sub
End If

' eine Zeile an die Datei anhängen
f.WriteLine "Temperatur zu hoch: " & SmartTags("Sensorwert1") & "°C"
f.Close

' Fehler beim Datei-Schreiben oder -Schließen?
If Err.Number <> 0 Then
  ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Schreiben '" & outfile & "': " & Err.Description
  ' Exit Sub
End If

Harald
 
Code:
'Dateinamen erzeugen
FName = Ablagepfad & Dateiname & "_" & Datum & "_" & Zeit & ".csv"

Der Ablage Ordner ist vorhanden.
Bist Du 100% sicher?
Laß Dir Ablagepfad und FName im Skript ausgeben (ShowSystemAlarm und gerne auch in SmartTags schreiben) und vergleiche penibel genau.
Wenn Du ein EA-Feld für den/die SmartTags mit Ablagepfad und FName machst, dann kannst Du den Pfad aus dem EA-Feld kopieren und in die Adresszeile eines Explorer-Fensters einfügen. Findet der Explorer den Pfad?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie Harald es bemerkt hat, fso.getfile(..) wird nicht benötigt.
hallo die Fehler Meldung kommt bei
Code:
'File Objekt erzeugen
Set f = fso.GetFile(FName)
Es sollte kein Fehler kommen (obwohl fso.getfile nicht notwendig ist).
Genau welche Fehler Code ?

Ich wurde Haralds Beispiel als Vorlage nehmen, und sehr wichtig sind die Zeilen mit den ERR Objekt.
Code:
' [COLOR=#333333]Ausgabedatei für Append öffnen und eine Zeile anhängen[/COLOR]Const ForAppending = 8
Dim fso, f, outfile

[COLOR=#ff0000]On Error Resume Next[/COLOR] 'Dateioperations-Fehler auffangen

outfile = SmartTags("System\LogFilename") 'z.B. "C:\Logs\logfile.txt"

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(outfile, ForAppending, True) 'True: Erstellen, falls noch nicht vorhanden

[COLOR=#ff0000]If Err.Number <> 0 Then
  ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Öffnen '" & outfile & "': " & Err.Description
  Exit Sub
End If[/COLOR]

' eine Zeile an die Datei anhängen
f.WriteLine "Temperatur zu hoch: " & SmartTags("Sensorwert1") & "°C"
f.Close

' Fehler beim Datei-Schreiben oder -Schließen?
[COLOR=#ff0000]If Err.Number <> 0 Then
  ShowSystemAlarm "Fehler # " & Hex(Err.Number) & " beim Schreiben '" & outfile & "': " & Err.Description
  ' Exit Sub[/COLOR] 
[FONT=Verdana]
End If[/FONT]
Harald, warum Hex code ? Die Fehlernummer in Dezimal stimmen überein mit die Systemmeldungen wie sie in den Betriebsanleitung aufgelistet sind.
 
... ich hatte mich so ein bißchen an der Aussage "es hat schon funktioniert" orientiert - das war wohl falsch ... 8)

@TE:
Du solltest deine Scripte "Step by Step" durchgehen. Am Besten auch das Beispiel von Harald anpassen - so ähnlich sieht das bei mir auch immer aus.
Du dann die Alarm-Meldungen ausgeben - ggf. auch wenn es gar keinen Fehler gegeben hat - einfach um mal zu schauen, mit was du da so arbeitest ...

Gruß
Larry
 
Harald, warum Hex code ? Die Fehlernummer in Dezimal stimmen überein mit die Systemmeldungen wie sie in den Betriebsanleitung aufgelistet sind.
Jesper, das weiß ich nicht mehr. Vielleicht gibt oder gab es negative Fehlernummern???
Normal fange ich 99% der Fehlermöglichkeiten vorher ab, so daß ich mich nicht erinnern kann, daß es in einem produktiven System zu Runtime-errors gekommen wäre. Die Fehler-Ausgabe wird höchstens mal bei Programmtests, Kopieren in andere Projekte oder Inbetriebnahmen aktiv.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mir aufgefallen ist das wenn ich im sage das er das Archiv erstellen soll`, er nicht den Dateinamen erzeugt.
Nicht einfach zu verstehen was du meinst...
Meinst Du Dein Skript "Archiv_erstellen"? Meinst Du vielleicht, daß die hier nicht gezeigte äußere Verwendung des Rückgabewertes der Function nichts bewirkt?
Code:
Archiv_erstellen Typ: Function
'Erstellt eine neue Archivdatei und liefert den Pfadnamen zurück
...

'Dateinamen erzeugen
FName = Ablagepfad & Dateiname & "_" & Datum & "_" & Zeit & ".csv"
...

'Pfad der erzeugten Datei zurückliefern
Archiv_erstellen =FName
Ich schätze, daß der Dateiname durchaus zusammengebastelt wird und der Skript-internen Variable FName zugewiesen wird, das Skript aber wegen einem Runtime-Error gar nicht bis zur letzten Zeile kommt, sondern schon vorher unsanft abgebrochen wird, weil keine "On Error"-Anweisung vorhanden ist.
Ich würde FName schon im Skript einem SmartTag zuweisen (panelinterne Variable), zumindest zum testweisen Beobachten (falls das Skript "multiinstanzfähig" sein muß).

Harald
 
Zurück
Oben