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

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
ich habe Dein Code-Beispiel (#28) getestet. Wenn ich das Script ausführe bekomme ich folgendes angezeigt (Meldefenster):

Meldungsfenster.PNG

Ist das Problem vielleicht an einer anderern Stelle, ist meine WinCC Advanced runtime V17 nicht richtig eingestellt?
 
... Du musst für die 8 String-Arrays jedes Array-Element einzeln als HMI-Variable projektieren - das ist der kleinere Aufwand, kostet aber 80 PowerTags. Mit den 88 zusätzlichen einzelnen HMI-Variablen (jeweils String) sollte das folgende Skript funktionieren
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.


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 ...
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:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zurück
Oben