nutellahase
Level-2
- Beiträge
- 180
- Reaktionspunkte
- 28
-> Hier kostenlos registrieren
Hallo.
Mal angenommen ich habe einen Datenbaustein (Test_DB) mit einem Array [1..100] of Bool (Test). Zu jedem Index ist ein fester Eingang zugeordnet. Allerdings liegen diese Eingänge nicht hintereinander, sondern immer nur jeder 2. Eingang.
Ich brauch alle 100 Werte immer jeden Zyklus, daher gibt es jetzt meiner Meinung nach zwei Möglichkeiten:
1. Möglichkeit - alles in AWL runtertippen
Vorteil: Ich finde alle Eingänge in meinen Referenzdaten.
Nachteil: Enorm viel Tipparbeit, bei einer Erweiterung der Array Dimension muss ich ebenfalls alles wieder kopieren und händisch ausbessern (fehleranfällig).
2. Möglichkeit - Anwendung einer Schleife (vorzugsweise in SCL) - ist natürlich eine von vielen Lösungen..
Vorteil: Bei einer Erweiterung der Array-Dimension muss man nur den Endwert der Schleife ändern (z.B. von 100 auf 200). Die Adresse wird abhängig vom Index immer richtig berechnet.
Nachteil: In den Referenzdaten finde ich keinen einzigen Hinweis auf die Verwendung der Eingänge E0.0, E0.2, E0.4, ... E24.4, E24.6 (auch nicht unter Überlappender Zugriff auf Speicherbereiche!!)
Jetzt auch mal eine Frage zur Zykluszeit.. Würde es sichtliche Auswirkungen haben wenn ich Möglichkeit 1 durch Möglichkeit 2 ersetze??? Ob mein Programm jetzt Zeile für Zeile abgearbeitet wird oder innerhalb der Schleife hin- und herspringt müsste dann schon egal sein oder ??
Welche Methode würdet ihr verwenden???
Mal angenommen ich habe einen Datenbaustein (Test_DB) mit einem Array [1..100] of Bool (Test). Zu jedem Index ist ein fester Eingang zugeordnet. Allerdings liegen diese Eingänge nicht hintereinander, sondern immer nur jeder 2. Eingang.
Ich brauch alle 100 Werte immer jeden Zyklus, daher gibt es jetzt meiner Meinung nach zwei Möglichkeiten:
1. Möglichkeit - alles in AWL runtertippen
Code:
U E0.0
= "Test_DB".Test[1]
U E0.2
= "Test_DB".Test[2]
....
U E24.4
= "Test_DB".Test[99]
U E24.6
= "Test_DB".Test[100]
Vorteil: Ich finde alle Eingänge in meinen Referenzdaten.
Nachteil: Enorm viel Tipparbeit, bei einer Erweiterung der Array Dimension muss ich ebenfalls alles wieder kopieren und händisch ausbessern (fehleranfällig).
2. Möglichkeit - Anwendung einer Schleife (vorzugsweise in SCL) - ist natürlich eine von vielen Lösungen..
Code:
FUNCTION "Test":VOID
VAR_OUTPUT
Liste: ARRAY [1..100] OF BOOL; // hier wird dann von außen mein Test-Array beschalten
END_VAR
VAR_TEMP
Index: INT;
Byteadresse: INT;
Bitadresse: INT;
END_VAR
BEGIN
FOR Index := 1 TO 100 DO
Byteadresse := ((Index - 1) * 2) / 8;
Bitadresse := ((Index - 1) * 2) MOD 8; // es wird immer nur in 2er schritten gezählt 0,2,4,6, 0,2,4,6,...
Liste[Index]:= E[Byteadresse,Bitadresse];
END_FOR;
END_FUNCTION
Vorteil: Bei einer Erweiterung der Array-Dimension muss man nur den Endwert der Schleife ändern (z.B. von 100 auf 200). Die Adresse wird abhängig vom Index immer richtig berechnet.
Nachteil: In den Referenzdaten finde ich keinen einzigen Hinweis auf die Verwendung der Eingänge E0.0, E0.2, E0.4, ... E24.4, E24.6 (auch nicht unter Überlappender Zugriff auf Speicherbereiche!!)
Jetzt auch mal eine Frage zur Zykluszeit.. Würde es sichtliche Auswirkungen haben wenn ich Möglichkeit 1 durch Möglichkeit 2 ersetze??? Ob mein Programm jetzt Zeile für Zeile abgearbeitet wird oder innerhalb der Schleife hin- und herspringt müsste dann schon egal sein oder ??
Welche Methode würdet ihr verwenden???