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

Zuviel Werbung?
-> Hier kostenlos registrieren
weitere Frage :
wieso hast du test auf 5000 Elemente deklariert und überträgst dann aber nur 11 zur Steuerung ?
Ich könnte mit gut vorstellen, dass alleine das Benutzen dieses test-Arrays die Speichermöglichkeiten der Visu sprengt. Wer sagt uns denn, dass der Fehler wirklich so auftritt wie beschrieben ?

Vielleicht solltest du einfach mal auf das test-Array verzichten und anstelle dessen (und anstelle meines Vorschlages aus Beitrag #20 mal mit dem Splitdata-Array direkt arbeiten ...
 
SmartTags: Ungültige Array-Verwendung -> Das nur bei den Stringvariablen
Das Problem liegt hier tatsächlich bei der Verwendung von Array of String - die können nicht so wie Arrays von einfachen Datentypen verwendet werden.

Siemens FAQ Beitrags-ID: 26165877: Tipps und Tricks für das Erstellen von Skripten
Hinweis
Es empfiehlt sich bei der Verwendung von "Array-Elementen mit Steuerungsanbindung", diese zu Beginn eines Skriptes auf "interne Skript Variablen" zu kopieren und im weiteren Verlauf dann mit diesen "internen Variablen" weiter zu arbeiten.
Am Ende des Skriptes müssen dann die Werte von den "internen Variablen" wieder auf die Array-Elemente zurückgeschrieben werden.

3. Wie können Sie Prozessvariablen-Arrays zwischen einer Steuerung und einem lokalen Skript effizient hin und her kopieren?
Um ein Array von Prozessvariablen aus der Steuerung in ein Skript zu kopieren, müssen Sie die Arrayelemente einzeln kopieren, z.B. in einer Schleife. Ein lokales Skript-Array können Sie jedoch mit einer einzigen Anweisung direkt auf ein Prozessvariablen-Array kopieren:

Beispiel
Code:
' CPU_Array sei ein Array von Prozessvariablen
Dim local_array(10)
Dim i
...
' Kopieren von der CPU in das Skript:
For i = 0 To 9
    local_array(i) = SmartTags("CPU_Array")(i)
Next
...
' Zurückkopieren in die CPU:
SmartTags("CPU_Array") = local_array
So mache ich das normalerweise. Das von Siemens nicht erwähnte Problem ist, daß das mindestens bis TIA V16 nicht mit Array of String geht! Ich habe kein TIA V17/V18, doch ich denke mal, da geht das auch nicht. (*)

String-Array-HMI-Variablen/SmartTags können im VBS-Skript nicht (wie im FAQ gezeigt) als ganzes Array angesprochen werden und die einzelnen Array-Elemente können auch nicht mit der Syntax SmartTags("CPU_StringArray")(i) angesprochen werden. Lediglich die Syntax SmartTags("MyStringArray[0]") und SmartTags("MyStringArray[" & i & "]") wird akzeptiert - das könnte allerdings bedeuten, daß jedes Array-Element als einzelne HMI-Variable angelegt werden muß? Ich werde das mal testen.

(*) Übrigens ist im Siemens Beispiel bei "Dim local_array(10)" das Array zu groß dimensioniert, "Dim local_array(9)" wäre passender. Allerdings erwarten wir von Siemens auch gar nicht fehlerfreie Beispiele ;)


Anderes Problem:
Bei Deinen verschiedenen Code-Varianten der Zuweisung Skript-interner Variablen an die SmartTags-Arrays verwendest Du CDbl() und CStr(), z.B. SmartTags("SAP")(j) = CDbl(test(j,0)) Nach welchen Kriterien verwendest Du manchmal CDbl(), manchmal CStr() und manchmal keines von beiden? Würfelst Du das aus? ;) Und wieso CDbl(), wo doch gar keine HMI-Variable vom Datentyp Real/LReal (VBS: Single/Double) ist, sondern DInt (VBS: Long) ist? Hat das einen bestimmten Grund?
Eigentlich weiß das SmartTags("..."), wie es den von VBS automatisch gewählten Datentyp in den Datentyp der HMI-Variable konvertieren muß. Da braucht es eigentlich keine expliziten Konvertierfunktionen ala CStr(). VBS ist allerdings so "schlau", daß auch völlig unpassende Typ-Konvertierungen am Ende in den richtigen Typ enden. ;)

Harald
 
(*) Übrigens ist im Siemens Beispiel bei "Dim local_array(10)" das Array zu groß dimensioniert, "Dim local_array(9)" wäre passender. Allerdings erwarten wir von Siemens auch gar nicht fehlerfreie Beispiele ;)
Da ist Siemens aber nicht der/die Einzige.
Ich hatte ein ähnliches Thema letztens im Codeproject-Forum. Es gehen tatsächlich die meisten Programmierer (sogar wirklich alte Hasen) davon aus, das die Zahl in der Klammen die Anzahl der Elemente im Array beschreibt und nicht den höchsten Index. Von daher ist das Siemens .Beispeil fast noch entschuldbar ... aber nur fast ... ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... Lediglich die Syntax SmartTags("MyStringArray[0]") und SmartTags("MyStringArray[" & i & "]") wird akzeptiert - das könnte allerdings bedeuten, daß jedes Array-Element als einzelne HMI-Variable angelegt werden muß? Ich werde das mal testen.
Naja ... in dem einen Beitrag vom OP kann man ja deutlich sehen, dass er ein String-Array anlegen konnte - das hätte dann ja auch schon nicht funktioniert haben dürfen. Ich hatte ja auch schon angenommen, dass das der Fehler ist ... :cool:
 
Naja ... in dem einen Beitrag vom OP kann man ja deutlich sehen, dass er ein String-Array anlegen konnte - das hätte dann ja auch schon nicht funktioniert haben dürfen. Ich hatte ja auch schon angenommen, dass das der Fehler ist ... :cool:
Das Anlegen des String-Arrays ging auch schon in TIA V15.1 (und noch früher?), und man kann die einzelnen Array-Elemente auch im Skript ansprechen, aber nicht mit variablem Index! Die Array-Elemente des String-Arrays kann man nicht mit Array-Index adressieren, und den TagName der Array-Elemente kann man nicht zusammenbasteln. :cry:

HMI-Variablen:
Code:
MyStringArray : Array [0..10] of String
MyStringArray[0] : String
MyStringArray[1] : String

Im VB-Skript:
Code:
SmartTags("MyStringArray[0]") = "T0" 'geht - das ist die HMI-Variable MyStringArray[0]
SmartTags("MyStringArray[1]") = "T1" 'geht - das ist die HMI-Variable MyStringArray[1]

'Array-Elemente lassen sich fest adressieren:
SmartTags("MyStringArray[2]") = "T2" 'geht - das ist das dritte Element von MyStringArray
SmartTags("MyStringArray[3]") = "T3" 'geht - das ist das vierte Element von MyStringArray

'... aber nicht variabel:
i = 3
SmartTags("MyStringArray")(i) = "T3" 'das geht schon gar nicht zu übersetzen --> SmartTags: Ungültige Array-Verwendung
SmartTags("MyStringArray[" & i & "]") = "T3"       'das geht nicht! --> Fehler 'no tag 'MyStringArray[3]'' in Skript ...
SmartTags("MyStringArray[" & CInt(i) & "]") = "T3" 'geht auch nicht --> ="=
SmartTags("MyStringArray[" & Trim(i) & "]") = "T3" 'geht auch nicht --> ="=

TagName = "MyStringArray[3]"
SmartTags(TagName) = "T3" 'geht auch nicht --> ="=

TagName = "MyStringArray[" & i & "]"
SmartTags(TagName) = "T3" 'geht auch nicht --> ="=

Code:
'mit MyStringArray als Array geht es nur mit fest adressieren per Fallunterscheidung:
For i = 0 To 10
  If i = 0 Then SmartTags("MyStringArray[0]") = "T0"
  If i = 1 Then SmartTags("MyStringArray[1]") = "T1"
  If i = 2 Then SmartTags("MyStringArray[2]") = "T2"
...
  If i = 10 Then SmartTags("MyStringArray[10]") = "T10"
End If

'oder so:
Select Case i
  Case 0  SmartTags("MyStringArray[0]") = "T0"
  Case 1  SmartTags("MyStringArray[1]") = "T1"
  Case 2  SmartTags("MyStringArray[2]") = "T2"
...
  Case 10 SmartTags("MyStringArray[10]") = "T10"
End Select

Will man einen variablen Tagname zusammenbasteln:
Code:
For i = 0 To 10
  SmartTags("MyStringArray[" & i & "]") = "T" & i
End If
dann geht das nur, indem man 11 einzelne HMI-Variablen projektiert:
MyStringArray[0] : String
MyStringArray[1] : String
...
MyStringArray[10] : String

Das TIA stört sich dabei nicht daran, daß die Variablen dieselben Namen wie die Array-Elemente des Arrays haben... Man könnte aber auch andere Klammern im Tagname nehmen, z.B. { }

Harald
 
Lediglich die Syntax SmartTags("MyStringArray[0]") und SmartTags("MyStringArray[" & i & "]") wird akzeptiert - das könnte allerdings bedeuten, daß jedes Array-Element als einzelne HMI-Variable angelegt werden muß? Ich werde das mal testen.
Ja, so ist das tatsächlich. Wie ich im Beitrag vorher (#27) dargelegt habe, können Array-Elemente von String-Arrays in TIA nicht variabel adressiert werden. Entweder musst Du für alle String-Arrays umständlich per Fallunterscheidung programmieren, oder 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:
Code:
Sub csvEinlesen_2()
'Daten aus einer csv-Datei in die SPS einlesen: 11 Zeilen mit je 12 Werten

Const ForReading = 1, Delimiter = ";"
Dim fso, f, FileName, data, splitdata, i, j
Dim aWert_1(10), aWert_2(10), aWert_3(10), aWert_4(10), aWert_5(10), aWert_6(10)
Dim aWert_7(10), aWert_8(10), aWert_9(10), aWert_10(10), aWert_11(10), aWert_12(10)

FileName = "D:\Produktdaten\TestCsv1.csv"

'*** Datei öffnen
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(FileName, ForReading)

f.SkipLine 'Zeile mit Überschriften überspringen

'*** 11 Zeilen mit je 12 Werten aus Datei einlesen
j = 0 'Zeilenzähler

Do While Not(f.AtEndOfStream) And (j < 11)
    data = f.ReadLine 'eine Zeile einlesen
    If data = "" Then Exit Do 'Leerzeile kann nicht gesplittet werden --> Formatfehler

    splitdata = Split(data, Delimiter)
    If UBound(splitdata) <> 11 Then Exit Do 'Zeile enthält nicht Struktur für genau 12 Werte --> Formatfehler

    'Werte der Zeile in Skript-interne Arrays übernehmen
    aWert_1(j) = splitdata(0)
    aWert_2(j) = splitdata(1)
    aWert_3(j) = splitdata(2)
    aWert_4(j) = splitdata(3)
    aWert_5(j) = splitdata(4)
    aWert_6(j) = splitdata(5)
    aWert_7(j) = splitdata(6)
    aWert_8(j) = splitdata(7)
    aWert_9(j) = splitdata(8)
    aWert_10(j) = splitdata(9)
    aWert_11(j) = splitdata(10)
    aWert_12(j) = splitdata(11)

    j = j + 1 'Zeile erfolgreich übernommen
Loop

f.Close 'Datei schließen

'*** Wenn erfolgreich eingelesen, dann Werte in die Arrays in der SPS schreiben:
If j = 11 Then 'genau 11 Zeilen erfolgreich übernommen?

    For i = 0 To 10
        SmartTags("SAP")(i)                  = "0" + aWert_1(i)
        SmartTags("Bez["& i &"]")            = aWert_2(i)
        SmartTags("FlaschenTyp["& i &"]")    = aWert_3(i)
        SmartTags("VerschlussTyp["& i &"]")  = aWert_4(i)
        SmartTags("KartonTyp")(i)            = "0" + aWert_5(i)
        SmartTags("FlaschenKarton")(i)       = "0" + aWert_6(i)
        SmartTags("PulpenTyp")(i)            = "0" + aWert_7(i)
        SmartTags("UnNummer["& i &"]")       = aWert_8(i)
        SmartTags("HazartClass["& i &"]")    = aWert_9(i)
        SmartTags("SubRisk1["& i &"]")       = aWert_10(i)
        SmartTags("LQ["& i &"]")             = aWert_11(i)
        SmartTags("ProduktEtikett["& i &"]") = aWert_12(i)
    Next

    ShowSystemAlarm "csv-Datei erfolgreich eingelesen"
Else
    ShowSystemAlarm "Formatfehler in csv-Datei in Zeile "& j + 2 &", keine Daten übernommen"
End If

End Sub

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Toll ... das erklärt jetzt sehr vieles ...
Bliebe jetzt für mich nur noch die Frage, weil das ja in dem verlinkten Siemens-Beispiel so dargestellt worden ist, ob das zuweisen des kompletten Skript-Array auf ein dklariertes Array funktionieren würde - also :
Code:
SmartTags("Bez") = aWert_2
... oder ähnlich ...

Naja und dann wäre für mich von Seiten des OP noch offen wofür er das 5000,10 Elemente umfassende test angelegt und zu befüllen versucht hat. Das macht dann ja gar keinen Sinn ...
 
Bliebe jetzt für mich nur noch die Frage, weil das ja in dem verlinkten Siemens-Beispiel so dargestellt worden ist, ob das zuweisen des kompletten Skript-Array auf ein dklariertes Array funktionieren würde - also :
Code:
SmartTags("Bez") = aWert_2
... oder ähnlich ...
Ja, das funktioniert mit einfachen Datentypen - aber eben nicht mit String-Arrays. Mit einem DInt-Array geht es:
Code:
SmartTags("SAP") = aWert_1
In dem Skript habe ich wegen der Übersichtlichkeit auf die Sonderbehandlung der 4 DInt-Arrays verzichtet.

Harald
 
Hallo Harald, hallo Larry Laffer,
ich bin gerade dabei das zu testen.
Die Problematik, der Kunde arbeitet mit einer Excel-Tabelle, mit dieser Excel-Tabelle will der Kunde auch in Zunkunft weiter arbeiten!
Diese Datei umfasst, Stand jetzt, ca. 1200 Produkte (wird ständig erweitert); 1200 Zeilen x 12 Spalten (Daten). Das bedeutet, wenn ich das richtig verstanden habe, 8 String-Arrays / Zeile x 1200 Zeilen = 9600 Powertags ? Installiert habe ich eine WinCC Advanced Runtime V17/V18 128 Powertags!

Die Idee die ich hatte war die Excel-Tabelle als csv-Datei einzulesen und in den Ladespeicher meiner CPU 1515- 2 PN zu speichern (DB_Produkte).
Es kann in der Anlage nur ein Produkt zur Zeit produziert werden das bedeutet es wird der entsprechende Datensatz für das Produkt aus dem DB-Produkte geladen und in DB-Auftrag gelesen. Akualisierungen- oder neue Produkte werden nur in derExcel-Tabelle durchgeführt. Anschliessend muss die Exceltabelle wieder neu eingelesen werden.



Naja und dann wäre für mich von Seiten des OP noch offen wofür er das 5000,10 Elemente umfassende test angelegt und zu befüllen versucht hat. Das macht dann ja gar keinen Sinn ...


Habe ich schon vernichtet/gelöscht das war nur ein Versuch, hat ja auch nicht funktioniert.....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das bedeutet, wenn ich das richtig verstanden habe, 8 String-Arrays / Zeile x 1200 Zeilen = 9600 Powertags ? Installiert habe ich eine WinCC Advanced Runtime V17/V18 128 Powertags!
Wenn der Kunde darf, dann könnte er direkt aus Excel die knapp 15000 Werte direkt in die CPU 1515 schreiben. Dann braucht Deine Visu gar keine PowerTags.
Oder die CPU holt sich die csv-Datei von einem Fileserver, z.B. TCP-Fileserver für S7-Controller (keine Lizenzkosten) oder per FTP-Client Kommunikation mit S7-1200/1500
Übertragung der Werte müsste auch per OPC gehen. Da habe ich aber keine Erfahrung.

Oder das Skript sendet die 1200 Zeilen in 120 Blöcken zu je 10 Zeilen in die CPU. Mit Handshake, und die CPU verschiebt die empfangenen Blöcke an die richtige Stelle. Das spart Powertags.
Oder Du stellst das Ganze auf richtige Datensätze/Rezepturen um und überträgst die Datensätze mit Handshake. Und die CPU verschiebt die empfangenen Datensätze an die richtige Stelle.

Wie lang sind die Strings? 1200 Zeilen mit 12 Werten, da kommen doch bestimmt Megabytes zusammen? Sollen die wirklich zur selben Zeit in der SPS liegen?? :unsure: 😲

Die Idee die ich hatte war die Excel-Tabelle als csv-Datei einzulesen und in den Ladespeicher meiner CPU 1515- 2 PN zu speichern (DB_Produkte).
Ich glaube, das geht gar nicht, mit der Visu nur in den Ladespeicher zu schreiben. Die Visu schreibt in den Arbeitsspeicher (ggf. "häppchenweise") und die CPU könnte den DB in den Ladespeicher kopieren (verschieben?).

Es kann in der Anlage nur ein Produkt zur Zeit produziert werden das bedeutet es wird der entsprechende Datensatz für das Produkt aus dem DB-Produkte geladen und in DB-Auftrag gelesen. Akualisierungen- oder neue Produkte werden nur in derExcel-Tabelle durchgeführt. Anschliessend muss die Exceltabelle wieder neu eingelesen werden.
Die csv-Datei könnte auch auf dem Visu-PC liegen und die SPS fordert bei Bedarf von der Visu die Daten eines bestimmten Produktes an und die Visu sucht die entsprechende Zeile aus der csv-Datei und sendet nur diese Zeile zur SPS.

WinCC Advanced (mit 128 Powertags!) ist einfach nicht die richtige Basis, um sooo viele Daten zu transportieren.
PS: und es ist eigentlich auch nicht die Aufgabe der SPS, so viele Daten zu handlen.

Harald
 
Zuletzt bearbeitet:
Hallo Harald, hallo Larry Laffer,
ich bin gerade dabei das zu testen.
Die Problematik, der Kunde arbeitet mit einer Excel-Tabelle, mit dieser Excel-Tabelle will der Kunde auch in Zunkunft weiter arbeiten!
Diese Datei umfasst, Stand jetzt, ca. 1200 Produkte (wird ständig erweitert); 1200 Zeilen x 12 Spalten (Daten). Das bedeutet, wenn ich das richtig verstanden habe, 8 String-Arrays / Zeile x 1200 Zeilen = 9600 Powertags ? Installiert habe ich eine WinCC Advanced Runtime V17/V18 128 Powertags!

Die Idee die ich hatte war die Excel-Tabelle als csv-Datei einzulesen und in den Ladespeicher meiner CPU 1515- 2 PN zu speichern (DB_Produkte).
Es kann in der Anlage nur ein Produkt zur Zeit produziert werden das bedeutet es wird der entsprechende Datensatz für das Produkt aus dem DB-Produkte geladen und in DB-Auftrag gelesen. Akualisierungen- oder neue Produkte werden nur in derExcel-Tabelle durchgeführt. Anschliessend muss die Exceltabelle wieder neu eingelesen werden.







Habe ich schon vernichtet/gelöscht das war nur ein Versuch, hat ja auch nicht funktioniert.....
Das kling fast danach als wollte man sich ein MES sparen? Warum muss die SPS so viel "wissen"?
 
Die csv-Datei könnte auch auf dem Visu-PC liegen und die SPS fordert bei Bedarf von der Visu die Daten eines bestimmten Produktes an und die Visu sucht die entsprechende Zeile aus der csv-Datei und sendet nur diese Zeile zur SPS.
So würde ich es angehen - nur die Produktnamen einlesen, ggf. davon auch nur soviele wie dargestellt werden können, und dann auf Anforderung das eine gewählte Rezept in die SPS spielen.
Das Abschnittweis Einlesen der CSV-Datei ist jetzt auch nicht das Problem und die Lade-/Umladezeiten halte ich für vernachlässigbar ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe erst mal nicht wenn 1200 Produkte vorhanden sind dein DB aber nur je Variable 12 Plätze hat wie soll das gehen?
Die Struktur vom DB ist äußerst schlecht gewählt.
Das sollte besser so aussehen.
1689937102960.png
Im HMI legst du die Variablen aus dem Import-DB an. Aktualisierungszeit 100ms

Im Script. Ich verwende hier variablen aus einer meiner Scripte. Ist aber analog zu deinen
Code:
SmartTags("10511_AVerw_Import_Allg_DB.Import_fertig")=False

Do While indatei.AtEndOfStream <> True
If Not SmartTags("10511_AVerw_Import_Allg_DB.Daten_bereit_von_HMI") And SmartTags("10511_AVerw_Import_Allg_DB.Import_Start_CSV") Then
'bereit und start müssen auf 100ms und zyklisch fortlaufend stehen
    inzeile = indatei.ReadLine
    scriptstatus = 4
    daten = Split (inzeile,";",-1)
    scriptstatus = 5
            SmartTags("10513_AVerw_Import_1DSastz_DB.Daten.Artikel_ID") = daten(0)
            SmartTags("10513_AVerw_Import_1DSastz_DB.Daten.Kommentar")  = daten(1)
usw

            SmartTags("10511_AVerw_Import_Allg_DB.Daten_bereit_von_HMI") = True
Loop

SmartTags("10511_AVerw_Import_Allg_DB.Import_fertig")=True

Im Programm. Die 0.3S Verzögerung sind dafür da damit man sicher sein kann, dass die Daten vom HMI in der Steuerung angekommen sind.
Der ganze Import dauert 1200 * 0,3s = 360s
(Man könnte hier auch Rezeptur und schreibe DatensatzInSteuerung verwenden. Ist aber etwas aufwändiger dafür aber evtl schneller)

1689937975892.png

EDIT. Wenn nur 1 Datensatz benötigt wird, ist der Vorschlag von PN/DP nur diesen in die Steuerung zu legen eine gute Wahl.
Und mit der RT auf einem IPC kannst du (wenn dort Excel installiert ist) auch direkt per Script aus der Excel-Datei ohne Umweg über csv lesen.
 

Anhänge

  • 1689937828948.png
    1689937828948.png
    36,1 KB · Aufrufe: 9
Zuletzt bearbeitet:
@S_Toben
Von den Datensätzen hängt doch sicher auch die Qualität der produzierten Produkte ab?
SPS-Programme neigen bekanntlich dazu, gelegentlich unabsichtlich Daten in der SPS zu zerstören, verlieren oder (oft unerkannt) zu verändern. Wie willst Du die Integrität und Konsistenz der Datensätze in der SPS sicherstellen? Da würde ich noch über Datensatz-Prüfsummen nachdenken.

Harald
 
Die Struktur vom DB ist äußerst schlecht gewählt.
Meine ich auch. Für Datensatz-ähnliche Daten nehme ich immer Array of Struct bzw. Array of Datentyp/UDT.

Im Programm. Die 0.3S Verzögerung sind dafür da damit man sicher sein kann, dass die Daten vom HMI in der Steuerung angekommen sind.
Der ganze Import dauert 1200 * 0,3s = 360s
(Man könnte hier auch Rezeptur und schreibe DatensatzInSteuerung verwenden. Ist aber etwas aufwändiger dafür aber evtl schneller)
Ohne Handshake kann man nie sicher sein, daß Daten irgendwo angekommen sind.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man sollte vielleicht auch noch berücksichtigen, dass sich Produkt-"Rezepte" gelegentlich ändern. Ist die Sammeldatei nur in der Visu (oder auf dem Server) und man holt sich immer nur das aktuell Benötigte wäre dieses Problem dann vom Tisch - von der Speicherbelastung der SPS mal abgesehen (die ich auch für unsinnig halte).
 
Meine ich auch. Für Datensatz-ähnliche Daten nehme ich immer Array of Struct bzw. Array of Datentyp/UDT.


Ohne Handshake kann man nie sicher sein, daß Daten irgendwo angekommen sind.

Harald
Grundsätzlich hast du sicher recht. Obiges habe ich seit Monaten im Einsatz und es ist noch nie zu Datenverfälschungen gekommen.
Aber ausschließen kann man das wahrscheinlich nicht.
 
Ich verstehe erst mal nicht wenn 1200 Produkte vorhanden sind dein DB aber nur je Variable 12 Plätze hat wie soll das gehen?
Die Struktur vom DB ist äußerst schlecht gewählt.
Das sollte besser so aussehen.
Anhang anzeigen 70298
Im HMI legst du die Variablen aus dem Import-DB an. Aktualisierungszeit 100ms

Im Script. Ich verwende hier variablen aus einer meiner Scripte. Ist aber analog zu deinen
Code:
SmartTags("10511_AVerw_Import_Allg_DB.Import_fertig")=False

Do While indatei.AtEndOfStream <> True
If Not SmartTags("10511_AVerw_Import_Allg_DB.Daten_bereit_von_HMI") And SmartTags("10511_AVerw_Import_Allg_DB.Import_Start_CSV") Then
'bereit und start müssen auf 100ms und zyklisch fortlaufend stehen
    inzeile = indatei.ReadLine
    scriptstatus = 4
    daten = Split (inzeile,";",-1)
    scriptstatus = 5
            SmartTags("10513_AVerw_Import_1DSastz_DB.Daten.Artikel_ID") = daten(0)
            SmartTags("10513_AVerw_Import_1DSastz_DB.Daten.Kommentar")  = daten(1)
usw

            SmartTags("10511_AVerw_Import_Allg_DB.Daten_bereit_von_HMI") = True
Loop

SmartTags("10511_AVerw_Import_Allg_DB.Import_fertig")=True

Im Programm. Die 0.3S Verzögerung sind dafür da damit man sicher sein kann, dass die Daten vom HMI in der Steuerung angekommen sind.
Der ganze Import dauert 1200 * 0,3s = 360s
(Man könnte hier auch Rezeptur und schreibe DatensatzInSteuerung verwenden. Ist aber etwas aufwändiger dafür aber evtl schneller)

Anhang anzeigen 70301

EDIT. Wenn nur 1 Datensatz benötigt wird, ist der Vorschlag von PN/DP nur diesen in die Steuerung zu legen eine gute Wahl.
Und mit der RT auf einem IPC kannst du (wenn dort Excel installiert ist) auch direkt per Script aus der Excel-Datei ohne Umweg über csv lesen.
Arrays die bei 1 losgehen? ;)
 
Zurück
Oben