TIA VB-Skript: CSV wird mit "0" beschrieben

Beiträge
53
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum

Ich möchte eine Datenbank (DB in SPS), über ein VB-Skript im HMI, als CSV Exportieren und auch Importieren können, so das ich die Daten bequem am PC bearbeiten kann. Mein erstelltes Skript erstellt zwar eine CSV, allerdings ohne den Inhalt des Datenbausteins.
Hier ein paar Bilder wie ich das ganze aufgebaut habe:

DB:
Datenbaustein.PNG
HMI Anzeige:
HMI_Anzeige.PNG

VB-Skript:
VB-Skript.PNG

CSV:
CSV_Datei.PNG

Was mache ich Falsch? Oder bin ich da komplett auf dem Holzweg?
Hat jemand eine bessere Idee wie ich das realisieren könnte?

Netzwerkverbindungen, OPC_UA oder ähnliches sind keine Optionen. Ich muss das ganze via USB machen.

Danke für die kommenden unterstützungen
 

Anhänge

  • 1714394096792.png
    1714394096792.png
    106,1 KB · Aufrufe: 31
  • 1714394977582.png
    1714394977582.png
    167,4 KB · Aufrufe: 12
  • 1714394768611.png
    1714394768611.png
    8,5 KB · Aufrufe: 10
  • 1714394316586.png
    1714394316586.png
    37,4 KB · Aufrufe: 13
Fehlt es ein CStr für alle die Werte ?
Das Skript kannst du als Text in 'Code' Box posten. Damit kann man es besser analysieren.

Und ein Tip. Kürze die Variabelnamen. So lange Variabelnamen ist umständlicher und nicht mehr lesbar.
 
100 ms sind übertrieben ... aber bitte ...
Mich stören ein bisschen die Variablen-Namen (Array im Array) und das du das Script als Screenshot und nicht als Text in deinem Beitrag gepostet hast.
Kannst du die fraglichen Variablen denn auf der HMI selbst mit Inhalt anzeigen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nabend.

Frage: Wie sieht denn der Dateiinhalt aus, wenn du sie mit einem Texteditor (Notebad o.ä.) öffnest?
Tipp 1: Du kannst den "festen" Teil des Variablennamens in eine skriptinterne Hilfsvariable überführen und diese dann im SmartTag verwenden
SmartTags(tagBaseName & "Comp{1}_No")
Tipp 2: Schleife verwenden

Gruß, Fred
 
Sind alle HMI-Variablen vorhanden? Sind die als Arrays projektiert oder viele einzelne Variablen?
Bekommst du Runtime Errors?
Wie wird das Skript aufgerufen?
Wenn du das Skript nach einigen Sekunden noch einmal aufrufst, sind dann Werte in der Datei?
 
Tipp 1: Du kannst den "festen" Teil des Variablennamens in eine skriptinterne Hilfsvariable überführen und diese dann im SmartTag verwenden
SmartTags(tagBaseName & "Comp{1}_No")
Tipp 2: Schleife verwenden
Tipp: besser keine Schleife verwenden bzw. den Name der HMI-Variablen nicht im Skript zusammenbasteln, denn dann weiß die WinCC Runtime nichts von der Verwendung der Variablen und aktualisiert sie erst nach dem Zugriff im Skript. Dann werden 0 oder alte Werte in die Datei geschrieben. Macht man einen Button in ein Bild und ruft das Skript nur mit dem Button auf, dann werden vom WinCC die im Skript sichtbar verwendeten HMI-Variablen (SmartTags) beim Bild-Aufbau aktualisiert. Dann muss man nur noch ein paar Sekunden warten und hoffen, dass alle Variablen aktualisiert wurden, wenn man das Skript aufruft. Wird das Skript durch irgendein Ereignis aufgerufen und in dem zu der Zeit aktiven Bild sind die Variablen nicht verwendet, dann werden die Variablen nicht vor dem Skript aktualisiert.

Zyklisch fortlaufend 100ms
Das ist totaler Unfug, die (vielen?) Variablen ständig alle 100ms zu aktualisieren, nur weil sie vielleicht einmal am Tag benötigt werden und dann im Grunde ein einziges Mal Lesen reicht.
Allerdings umgeht man so das oben beschriebene Problem mit der Aktualisierung der Variablen. Wenn einem nichts besseres einfällt, als ständig Vollgas zu fahren und hohe Kommunikationslast zu erzeugen ...

Wenn man es richtig machen will (und das wollen wir als Profis ja :cool:), dann bekommt man die Variablenwerte nur mit Handshake (z.B. als Rezeptur oder was selbst programmiertes) garantiert aktualisiert aus der PLC ins HMI. Es nützt ja nichts, wenn das Skript ohne Fehlermeldung durchläuft und auch eine Datei erstellt wird, aber die Werte in der Datei sind falsche bzw. nicht aktuelle Werte.

Ich möchte eine Datenbank (DB in SPS)
Die Abkürzung "DB" steht für "Datenbaustein". Die DB haben nichts mit Datenbanken zu tun.

PS: delimiter = Trennzeichen schreibt man nur zwischen Werte, aber nicht hinter den letzten Wert am Zeilenende, wenn gar kein Wert mehr kommt. Das kann zu Problemen beim Einlesen der der csv-Datei führen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tipp: besser keine Schleife verwenden bzw. den Name der HMI-Variablen nicht im Skript zusammenbasteln, denn dann weiß die WinCC Runtime nichts von der Verwendung der Variablen und aktualisiert sie erst nach dem Zugriff im Skript.
Bei zyklisch fortlaufend aktualisierten Variablen funktionieren die Tipps schon seit Jahren bei mir ganz gut ...
Was ja nicht heißt, dass man der Wertekonsistenz keine Beachtung schenken sollte!

@PN/DP:
Gemäß deines Tipps: wie würdest du denn dann z.B. 20 oder mehr Variablen vom Typ STRING in einem Skript behandeln? Immer den vollen Namen schreiben ohne Schleife? Viel Spass beim Tippen bzw. Copy/Paste...
 
Das ist totaler Unfug, die (vielen?) Variablen ständig alle 100ms zu aktualisieren, nur weil sie vielleicht einmal am Tag benötigt werden und dann im Grunde ein einziges Mal Lesen reicht.
Allerdings umgeht man so das oben beschriebene Problem mit der Aktualisierung der Variablen. Wenn einem nichts besseres einfällt, als ständig Vollgas zu fahren und hohe Kommunikationslast zu erzeugen ...
Manchmal gefällt mir dein Ton nicht :rolleyes:
Weißt du denn GENAU, wie der Themenstarter die genannten Variablen im Projekt weiterverwendet?
Außerdem: Kannst du mir sagen, wann genau die besagte hohe Kommunikationslast zu einem Problem wird? Vielleicht ist das bei der vorliegenden Maschine gar nicht so relevant ...
 
@faust : In jedem Fall hat Harald aber Recht. Kommt es zu einer Kommunikationslast dann schlägt sich dies in allererster Linie bei der Konsistenz der eingelesenen Werte nieder. Von daher war ja auch mein Vorschlag die 100 ms mal zu hinterfragen. Ganz häufig wird hier auch gerne mal "ein bißchen" mit der großen Gieskanne gearbeitet. Viele Variablen schnell abzufragen bewirkt meißt das Gegenteil von dem was man eigentlich erreichen wollte ...
Aber an dem Punkt sind wir ja noch gar nicht ...
Ich würde erstmal wissen wollen ob die angelegten Variablen auf dem HMI denn auf einer Bildschirmseite mit Werten angezeigt werden ... und so muss es m.E. erstmal anfangen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry Laffer:
Ich habe das Gesagte bzw. Grundsätzliche ja auch nicht bezweifelt.
Ich verwende auch nicht grundsätzlich "Zyklisch fortlaufend, 100ms". Aber ich empfinde die meisten Aussagen zu hoher Kommunikationslast immer als sehr verallgemeinernd, und wie gesagt: bis jetzt habe ich persönlich noch keine Nachteile o.ä. in meinen HMI-Projekten erfahren, wenn ich hunderte Variablen auf die genannte Weise aktualisieren lasse.

Ich würde erstmal wissen wollen ob die angelegten Variablen auf dem HMI denn auf einer Bildschirmseite mit Werten angezeigt werden ... und so muss es m.E. erstmal anfangen ...
Da hast du recht, also an @PP_Programmierer die konkrete Frage:
Funktioniert denn die zugehörige Seite korrekt?

Gruß, Fred
 
Hallo, und danke erstmal für die vielen Antworten. :cool:

Ich gebe zu das mit den 100ms ist sicher etwas wild... das ist auch eher aus "ich probiere mal was" entstanden.

Das DB für Datenbaustein steht ist mir schon klar 🫣. Ich wollte damit nur sagen das ich den "Datenbaustein" als "Datenbank" nutze. Soll heißen: Hier werden die Spezifischen Komponenten Daten einmalig gesammelt.
Also:
  • No (Int)
    Nummer der Komponente, dient als Identifikation im Programm
  • Name (String[30])
    Name der Komponente die im HMI angezeigt wird
  • Code (String[81])
    Nummer bzw. Barcode der Komponente
  • Density
    Dichte der Komponente
  • Viscosity
    Viskosität der Komponente
In meinem Projekt habe ich bis zu 50 verschiedene Komponenten die sich an 8 Verschiedenen Positionen befinden können. Diese werden dann nach Rezeptur in einem Behälter gemixt und anschließend abgefüllt.
Um es einfach zu gestalten wollte ich eben diese Daten als CSV Importieren bzw. Exportieren können, damit ich das nicht alles zu Fuß am HMI ein Tippen muss.

Zur Frage ob die Variablen am HMI richtig angezeigt werden:
Grundsätzlich Ja, ABER:
Die Schnittstelle vom Bildbaustein ist der "UDT_Comp_Dat" mit dem Index [0]. Hier werden die Daten Area [1] - [5] reingeschrieben, je nach dem welchen Bereich ich vorher am Auswahlfeld ausgesucht habe. Das funktioniert soweit auch ganz gut. Auch wenn ich Änderungen mache werden diese an der Richtigen Stelle im DB (Datenbaustein :ROFLMAO: ) überschrieben. Soll heißen Im Datenbaustein sind die korrekten Werte.
Die HMI Variablen die ich in die CSV schreiben möchte sind also nicht als E/A-Feld ausgeführt, sondern nur angelegt, siehe Bild:
1714464604328.png

Und "JA" ich werde das mit den 100ms noch wieder anpassen...

Was VB angeht, behaupte ich mal: Ist nicht meine Kernkompetenz.
Das Skript kommt gleich ...
 
bis jetzt habe ich persönlich noch keine Nachteile o.ä. in meinen HMI-Projekten erfahren, wenn ich hunderte Variablen auf die genannte Weise aktualisieren lasse.
Mit meinem derzeitigen Setup (1214 + KTP 1200) habe ich es noch nicht ausprobiert. Aber früher unsere S7-300 haben gerne mal Probleme gemacht wenn "mit der großen Gießkanne" gearbeitet wurde. Daher habe ich mir angewöhnt, pauschal nur dort schnell zu aktualisieren, wo es auch benötigt wird.
 
Füge noch ein If Err.Number<> 0 Then .. ein am Ende nach die Zeilen mit fo.LinePrint ..
Du siehst ja nicht wenn das Skript ein Fehler hat bei die viele Zeilen mit fo.LinePrint ..

Kommt die Systemmeldung "Storage of data was successful!" ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da wurde ich ein IF THEN ELSE machen.
IF Err.Number<> 0 THEN Showsystemalarm "error... ELSE Showsystemalarm "succesful...

Hinweis: Wegen ON ERROR RESUME NEXT, wird das Skript immer beendet, egal das ein Fehler auftritt.
Deswegen muss man sorgfältig IF Err.Number<> 0 THEN .. einfügen wo es Sinn macht.
 
Zuletzt bearbeitet:
Daten werden ja geschrieben.
Ich habe das mal mit Notepad++ geöffnet und da steht im Grunde das selbe drin wie in der CSV.
Da am ende die Meldung "Storage of data was successful!" kommt gehe ich davon aus das dass Skript Grundsätzlich funktioniert. Es werden nur nicht die richtigen Werte eingetragen.
 
Zurück
Oben