Step 7 Beispiele Indirekte Adressierung

Anger

Level-2
Beiträge
76
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

ich beschäftige mich momentan mit der Indirekten Adressierung und habe das Ganze auch so halbwegs verstanden (Denk ich zumindest. ;-)).
Hätte jemand für mich praktische Beispiele wo er das Ganze schon Mal eingesetzt hat?
Mit fehlt noch der Bezug zur Praxis?

Gruß
anger
 
Mit 1500/1200 gibts da meiner Meinung gar keine Anwendung, aber du fragst ja in Step 7… In Classic konnte man nur in SCL Variablen als Array-Indizes verwenden (also Array[#Index] schreiben). In KOP/FUP/AWL ging das nicht, brauchte man aber ab und zu trotzdem.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfachstes Beispiel: Ein Array wird nacheinander mit Werten befüllt. In einer Variable ist die Information, welche Position des Arrays gerade befüllt wird.

MeinArray[AktuellePos] := Wert;

Das kann zum Initialiseren in einer FOR-Schleife innerhalb eines Programmzyklus sein

FOR iLoop := 0 TO 1000 DO
MeinArray[iLoop] := InitWert;
END_FOR;

das kann aber auch das zyklische Beschreiben zur Datenerfassung sein:

IF PulseStunde AND AktuellePos < 999 THEN:
MeinArray[AktuellePos] := Wert;
AktuellePos := AktuellePos + 1;
END_IF;
 
Mit 1500/1200 gibts da meiner Meinung gar keine Anwendung, aber du fragst ja in Step 7… In Classic konnte man nur in SCL Variablen als Array-Indizes verwenden (also Array[#Index] schreiben). In KOP/FUP/AWL ging das nicht, brauchte man aber ab und zu trotzdem.
Im TIA geht das inzwischen auch in KOP/FUP. Bei AWL kann ich es dir grad nicht sagen, würde mich aber wundern wenn nicht.

Hätte jemand für mich praktische Beispiele wo er das Ganze schon Mal eingesetzt hat?
Kommt drauf an welche "Art" von indirekter Adressierung dich interessiert.
Die von @TP-Inc und @Oberchefe erwähnten Zugriffe mit auf Array mittels Index sind Standard, speziell bei Verwendung von Schleifen.
Schau dir mal als Code-Beispiel den "LGF_SearchMinMax_DInt" aus der Siemens LGF-Bibliothek an, ist ein Klassiker.
Der Baustein bekommt ein "Array[*] of Dint" (also mit variablen Grenzen), ermittelt die Grenzen & durchsucht das Array von Anfang bis Ende nach Min/Max-Werten.
Code:
REGION Searching the array
  // Assign first value as min / max
  #tempMinValue := #tempMaxValue := #values[#tempArrayLowerBound];
 
  // Search the Array for min/max values
  FOR #tempCounter := #START_FROM_SECOND_ELEMENT TO #tempArrayUpperBound DO
    
    #tempActValue := #values[#tempCounter];
    
    // check for min
    IF #tempActValue < #tempMinValue THEN
      #tempMinValue := #tempActValue;
      #tempArrayIndexMin := #tempCounter;
      // check for max
    ELSIF #tempActValue > #tempMaxValue THEN
      #tempMaxValue := #tempActValue;
      #tempArrayIndexMax := #tempCounter;
    END_IF;
  END_FOR;
END_REGION

Ein weiteres Thema der indirekten Adressierung wären Pointer.
Kenne ich vorallem aus Bestands-AWL.
Wenn man diese beherscht kann man damit einiges an "dark Magic" betreiben ;)
Sollte hier im Forum mehr als genug Material dazu geben.

E/As kann man auch indirekt lesen, kenne ich aber nicht aus der Praxis.
Problem ist hier, dass indirekte Zugriffe auf E/As keine Querverweise generieren (oder ich zu blöd bin diese zu finden).
Das kann die Fehlersuche...interessant machen^^
 
Zurück
Oben