Ich würde das etwa so realisieren
- in der SPS einen Ringpuffer für ca. 1600 Zeilen (Datensätze) je 9 INT (Reserve: 10 INT) anlegen (z.B. ARRAY[0..1599] OF ARRAY[0..8] OF INT (oder OF STRUCT))
- in der SPS einen Kommunikationspuffer für ca. 40 Zeilen anlegen
- im Skript jeweils 40 Zeilen aus der csv-Datei in eine Rezeptur einlesen (kann Dein HMI(?) Arrays in Rezepturen? Wenn nicht dann brauchst Du 360 Rezeptur-Variablen)
- handshake-gesteuert die Rezeptur aus dem HMI in den Kommunikationspuffer in der SPS schreiben (WinCC flex: SetDataRecordTagsToPLC())
- wenn die Rezeptur vollständig in der SPS angekommen ist, dann vom Kommunikationspuffer in den Ringpuffer kopieren
- wiederholen mit nächsten 40 Zeilen, solange noch Platz im Ringpuffer und csv-Datei noch nicht vollständig ausgelesen
- in der SPS per OB35 (oder Timer) alle 100ms eine Zeile aus dem Ringpuffer entnehmen und den 9 Variablen zuweisen
Bei dieser Art der Zwischenpufferung ist der 100ms-Takt zur Variablenzuweisung von der csv-Lesezeit entkoppelt, das csv-Lesen und in die SPS übertragen ist nicht mehr so kritisch. Du hast je 40-Zeilen-Rezeptur durchschnittlich 4s Zeit zum Auslesen aus der csv und in die SPS übertragen. Tatsächlich sollte die Übertragung nur höchstens 2s dauern. Wenn der Ringpuffer voll ist enthält er Daten für die nächsten ca. 150s.
Hier ein Beispiel für den umgekehrten Weg, wie das "häppchenweise" Übertragen von mehreren KByte von SPS zu csv-Datei funktioniert.
Harald