TIA SCL Daten von einem Array-Element ins andere kopieren

xj900mb

Level-2
Beiträge
180
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ich möchte einen Parametersatz in einen anderen kopieren.
Es handelt sich um ein Array von 1..10 Parametersätzen
der Parametersatz ist ein PLC_Datentyp (bei Step7 hieß es noch UserDefinedDatatype)

im Anhang ein Screenshot meines FC_Para_kopieren und des DB in dem die PAra-Sätze gespeichert sind

in SCL wird indirekt addressiert: ich kann den Quell-Para-Satz und den Ziel-Para-satz fürs kopieren auf meinem Display auswählen

warum meckert TIA V15.1 in Zeile 33 dass der Zugriff auf den DB die Länge des DB überschreitet ???
wenn ich die Zeile 33 ausklammer, dann meckert TIA auch in allen folgenden Zeilen.
liegt es an der indirekten Adressierung mit einer Variablen?
in Zeile 32 habe ich testweise Durchmesser_Nr[10] eingetragen und da wird nicht gemeckert.
in den FOR-Schleifen vor Zeile 30 wird auch nicht gemeckert

hat jemand einen Tipp?

Snap 2019-12-12 at 11.12.57.jpgSnap 2019-12-12 at 11.19.39.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
Man kann tatsächlich wenig erkennen :(

Aber:
Steht der DB56 auf optimierten zugriff?

Wieso kopierst du die Werte alle einzeln?
Strukturen kannst du im ganzen kopieren bei SCL.
z.B.:
"DBParaSatz".Durchmesser[x] := "DBParaSatz".Durchmesser[y];
 
Vor dem Aufruf von die meckernde Zuweisungen, ein Check von #D_Nr_Quelle und #D_Nr_Ziel einfügen.
Etwa wie
IF (#D_Nr_Quelle >=1) AND (#D_Nr_Quelle <=10) AND (#D_Nr_Ziel >=1) AND (#D_Nr_Ziel <=10) THEN
... (zuweisungen)
ELSE
... (Störmeldung ausgeben)
END IF
 
Moin,

Wieso kopierst du die Werte alle einzeln?
Strukturen kannst du im ganzen kopieren bei SCL.
z.B.:
"DBParaSatz".Durchmesser[x] := "DBParaSatz".Durchmesser[y];

danke, da hab ich gar nicht dran gedacht !
wie läuft das dann intern ab? werden die werte der Strukturen einzeln nacheinander kopiert oder macht die CPUsowas wie BlkMov was mehrere Zyklen dauern kann?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
oder macht die CPUsowas wie BlkMov was mehrere Zyklen dauern kann?

Also der "alte" BlkMov arbeitet den Befehl in direkt ab, nicht über mehrere Zyklen

Systemfunktion SFC20:
EigenschaftenSFC20
Bezeichnung:"BLKMOV"
(block move)
Beschreibung:Kopiert den Inhalt eines Speicherbereiches (=Quellbereich) in einen anderen Speicherbereich
(= Zielbereich).
Zulässige
Quellbereiche:
Datenbausteine im Arbeitsspeicher:
  • Merker,
  • Prozessabbild der Eingänge,
  • Prozessabbild der Ausgänge.
Sollte die CPU den SFC83 nicht unterstützen, können die Daten auch im Ladespeicher abgelegt werden, wenn der DB mit "UNLINKED" kompiliert wurde.
Zulässige
Zielbereiche:
Datenbausteine im Arbeitsspeicher:
  • Merker,
  • Prozessabbild der Eingänge,
  • Prozessabbild der Ausgänge.
Verwendung des Ladespeichers MMC
(Micro Memory Card):
Ladespeicher wird entweder nicht benötigt oder er wird gelesen.
Maximal kopierbare
Datenmenge:
Gemäß CPU-spezifischen Einschränkungen.
Unterbrechung des Kopiervorgangs durch andere Tätigkeiten:Ja.
Datenkonsistenz:Um die Datenkonsistenz zu gewährleisten, darf der Zielbereich bei einer Unterbrechung vom Betriebssystem (z.B. für Alarmbearbeitung) nicht verändert werden.
Bearbeitung:Synchron, d. h. der Kopiervorgang ist nach dem SFC-Aufruf beendet.
Wichtiger Hinweis:Es können auch Lokaldatenblöcke (Quell- und Zielbereich) kopiert werden.
 
Mach doch dein Array gleich vom Anwenderdatentypen ohne das Struct drum herum :)
Oder spricht etwas dagegen?
Möglicherweise kann man das auch noch mit anderen Anwenderdatentypen verbessern, sodass die Nutzung von Struct entfällt
 
Zurück
Oben