TIA WinCC Advanced V17/V18 mit VB - Script csv-Datei einlesen

Klar. Warum nicht? Ist doch nur ne Sache wie ich das im weiteren Programm verwende. 0 ist für mich NULL.
Hab mir angewohnt meine Arrays immer mit 0 zu beginnen, für den Fall dass wirklich etwas mal undefiniert steht/zeigt. Aber solange du damit zurecht kommst alles fein, würde es mich nur nicht mehr trauen
 
Ein anderer Weg wär per SPS-Webserver CSV auf die Memory Card legen und per "load reciped" (SPS-Baustein) direkt in der SPS arbeiten.
 
Hallo Harald,
zu Deinem Beitrag #36, die Qualität des Produktes ist davon nicht betroffen!
die Anlage die wir für unseren Kunden bauen ist eine Verpackungsanlage für unterschiedliche Produkte (Flaschen), die Parameter in der CSV - Datei sind zum Beispiel Produktnummer, Kartontyp, Anzahl der Flaschen die verpackt werden (Karton), welche Gefahrgutlabel aufgebracht werden müss usw.

@DCDCDC
Ich habe auf meinem IPC Excel 2019 installiert das wäre auch eine Möglichkeit die ich gerade teste.
 
Hallo DCDCDC,
dein Beitrag #33
Das kling fast danach als wollte man sich ein MES sparen? Warum muss die SPS so viel "wissen"?
Meine Idee war bisher, den CPU-Ladespeicher als Backup zu nuzen. Falls der IPC mal ausfällt kann der Kunde weiter produzieren
da die Produkte-Datei sich im Ladespeicher befindet.
 
Hallo Harald,
ich habe Dein Code-Beispiel (#28) getestet. Wenn ich das Script ausführe bekomme ich folgendes angezeigt (Meldefenster):



Ist das Problem vielleicht an einer anderern Stelle, ist meine WinCC Advanced runtime V17 nicht richtig eingestellt?
 
Hast du denn die Variablen auch so angelegt wie von Harald beschrieben ?

Bei SAP handelt es sich um einen DINT - da macht diese Zeile :
Code:
SmartTags("SAP")(i) = "0" + aWert_1(i)
... so keinen Sinn - die "0" stehen ja für einen String - nimm die mal weg ...
Das kann dann weitere DINT's natürlich genauso gelten ...
 
Hallo Larry Laffer,
ich habe es getestet, mit dem gleichen Ergebnis Error Number: 190011, "Tag SAP: value couldnot be written in PLC.
 
ich habe Dein Code-Beispiel (#28) getestet. Wenn ich das Script ausführe bekomme ich folgendes angezeigt (Meldefenster):

Anhang anzeigen 70353

Du hast 2 Probleme:
(1) "Error no Tag 'Bez[0]'... - vom String-Array "Bez" musst Du jedes Array-Element einzeln als HMI-Variable (String) projektieren, und zwar so:
PLC: Bez[1] --> HMI: Bez[0]
...
PLC: Bez[11] --> HMI: Bez[10]

(2) der Tag "SAP" (das DInt-Array) kann nicht in die PLC geschrieben werden, weil die HMI-Verbindung zur PLC gar nicht aufgebaut ist (siehe die Meldung 140001). Das ist auch die Ursache bei dieser Meldung:
ich habe es getestet, mit dem gleichen Ergebnis Error Number: 190011, "Tag SAP: value couldnot be written in PLC.


Der Grund für dieses Konstrukt ist, daß in seiner csv-Datei öfters Werte fehlen bzw. leer sind (direkt aufeinanderfolgende Semikolons!). Das ergibt beim Split() dann leere Strings (Null). Die in VBS automatische Konvertierung zu Dint bei der Zuweisung an SmartTags("DIntvariable") erzeugt einen Runtime-Error, wenn man einen Null-String an eine DInt-Variable zuweisen will. Der Ausdruck SmartTags("SAP")(i) = "0" + aWert_1(i) erzeugt zuerst einen String, der garantiert nicht Null ist, und danach kann die automatische Konvertierung ohne Runtime-Error zu 0 (dezimal) konvertieren.

PS: Eventuell kann man auch (besser?) formulieren: SmartTags("SAP")(i) = aWert_1(i) & " "
PPS: Es könnte aber auch sein, daß die Konvertierung zu Dint zuerst alle führenden und nachfolgenden Leerzeichen/Whitespace entfernt, dann bliebe wieder ein Null-String übrig, der nicht in DInt konvertiert werden kann. Genau deshalb hatte ich "0" + aWert_1(i) formuliert.
PPPS: jetzt nochmal drüber nachgedacht, meine ich, um ganz sicher zu gehen, wäre diese Formulierung perfekt: "0" & Trim(aWert_1(i))

Harald
 
Zuletzt bearbeitet:
@PN/DP : Danke für die Aufklärung - immer auf die implizierte Konvertierung zu setzen ist in meinen Augen kein guter Stil und auch nicht ungefährlich. Hier es gleich so zu schreiben wie es erforderlich ist halte ich für sauberer und es hat dann ja auch keinen Einfluß auf die Code-Laufzeit, es hat aber den Vorteil das jemend fremdes (wie z.B. ich) keine falschen Schlüsse zieht ...
 
@PN/DP : immer auf die implizierte Konvertierung zu setzen ist in meinen Augen kein guter Stil und auch nicht ungefährlich. Hier es gleich so zu schreiben wie es erforderlich ist halte ich für sauberer
Auch CLng(aWert_1(i)) liefert einen Runtime Error bei einem Null-String. Auch für CLng() ist es erforderlich, daß man "0" + aWert_1(i) schreibt. Ob man da noch zusätzlich CLng( ... ) außen rum schreibt, ändert nichts am Ergebnis.

Oder meinst Du so eine Formulierung für erforderlich:
Code:
If aWert_1(i) = "" Then
    SmartTags("SAP")(i) = 0
Else
    SmartTags("SAP")(i) = CLng(aWert_1(i))
End If
?

EDIT: alle CInt durch CLng ersetzt, weil S7-DInt = VBS-Long !

Harald
 
Zuletzt bearbeitet:
... man könnte sich in dem Fall auch eine eigene Funktion dafür bauen ...
 
Der umgekehrte Weg geht anscheinend über den Webserver. Vielleicht klappt es auch da drüber?

 
Hallo,
ich möchte mich meinen Dank aussprechen für Euro zahlreichen Tipps und anregungen die Ihr mir gegeben habt.
Vielen dank für die interessanten Code-Snipes, die ich auch gestet habe und auch funktionieren!
aber ich habe auf Grund der Größe der Produktdatei, zur Zeit ca. 1200 Produkte, mich dazu entschlossen mit einer SQL-Datenbank zu arbeiten.
Der Zugriff auf diese Datenbank wird mit dem "SQL / Tabular Data Stream (SQL)" durchgeführt. Es wird nur ein Datensatz (Parameter) in die SPS geladen.

Vielen Dank für die Hilfe
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…