251, 1 KB
· Aufrufe: 107
252 KB
· Aufrufe: 90
#9
Nach Rücksprache mit Rommani hier noch einmal ein leicht geändertes Programmbeispiel:
ARRAY_WERTE: ARRAY [0.. 9] OF REAL;
DB_NUMMER: WORD;
L P##ARRAY_WERTE; // Pointer
L W [AR1, P#0. 0]; // DB-Nummer
T #DB_NUMMER;
AUF DB [#DB_NUMMER];
L D [AR1, P#2. 0]; // Bereichszeiger
L #WERT; // Wert speichern
L #WERT; // Wert erhöhen
T #WERT;
· Aufrufe: 33
7, 1 KB
· Aufrufe: 40
4, 7 KB
33, 3 KB
· Aufrufe: 25
#10
341, 4 KB
· Aufrufe: 59
342, 4 KB
#11
Bestens Dank für euch alle. Besonders Kai
#12
S7 Indirekte Adressierung
Vielen Dank an alle Besonders Kai:s12:
#13
los, einmal geht noch. aller guten dinge sind drei! #14
EDIT: @Kai's FC_Werte (s. o. ) L [COLOR=#ff0000]W [AR1, P#0. 0][/COLOR]; // DB-Nummer [COLOR=#ff0000]--> Warum steht hier die DB-Nummer? [COLOR=#ff0000]In welchem Speicherbereich bin ich hier? Wo ist sowas dokumentiert? Indirekte adressierung sps tv. [/COLOR][/COLOR]
L [COLOR=#ff0000]D [AR1, P#2. 0][/COLOR]; // Bereichszeiger [COLOR=#ff0000]--> Warum steht hier der Bereichszeiger?
- Indirekte adressierung sps tv
- Indirekte adressierung sps 1
- Indirekte adressierung sps m
- Indirekte adressierung sps 10
Indirekte Adressierung Sps Tv
Beispiel: Eingänge mit X0 = 0 und X1 = 1. Im Programm wird über LDP X0[D0] die Flange überwacht. Ändert sich nun der Wert von D0 von 0 auf 1, dann reagiert die positive Flanke, obwohl sich die Werte X0 und X1 nicht geändert hat. Allerdings hat sich ja der Wert des Ausdrucks X0[D0] geändert. Euer spstiger
Indirekte Adressierung Sps 1
#1
Hallo zusammen,
folgende Adressierung habe ich vorgenommen:
I_xEingangbel_Ein AT%IX0. 0:BOOL;
Wenn ich jetzt in der Visualisierung die Variable I_xEingangbel_Ein toggeln möchte funktioniert das nicht. Ist dies durch die indirekte
Adressierung nicht mehr möglich? Meine Idee war eine Variable für die Hardwareeingänge und parallel für die Visu zu nutzen. Danke für Eure Hilfe. Gruß
Benno
#2
Hallo Benno,
das ist leider weder Richtig noch sinnvoll, denn:
Der von dir adressierte Eingang kommt aus einer physikalischen Adresse, dessen Zustand wird durch die Baugruppe bestimmt und nun möchtest du diesen Eingang "zwangsändern"?! Übertrieben gesagt ist das so ein wenig als wenn man eine Phase in eine Steckdose steckt! Omron Indirekte Adressierung | SPS-Forum - Automatisierung und Elektrotechnik. Klassisch wird immer für die Visu eine eigene Variable genommen und durch entsprechende Logiken die beiden verbunden zu einem "dritten" (ggf. Ausgang)
Ich hoffe, ich habe mich nicht zu blöd ausgedrückt...
Viel Spaß
Shrimps
#3
Hallo,
ich gebe Shrimps da recht - die physikalische Adresse steht für einen realen Eingang mit einem zugehörigen Zustand - selbst wenn die visu diese Variable beschreiben könnte wird der aktuelle physikalische Zustand beim nächsten Eingangsabbild Deinen Zustand überschreiben.
Indirekte Adressierung Sps M
Für einige Anwendungen ist das Verfahren der speicher-indirekten-Adressierung nicht flexibel genug. Daher gibt es in der CPU zwei spezielle Register (AR 1 und AR2, Adressregister 1 u. 2. ), mit deren Hilfe der Index erst während des Zugriffs berechnet wird. Vor der ersten Benutzung der Adressregister müssen diese mit einem Zeiger auf einen Operanden geladen werden. Wenn Sie auf den Operanden E 5. 6 zugreifen wollen, programmieren Sie:
LAR1 P#5. 6 // Lade Pointer auf "irgendwas" 5. 6 in AR1
Jetzt steht die Adresse 5. 6 im Adressregister 1. Den Eingang fragen Sie nun mit folgender Operation ab:
U E[AR1, P#0. 0]
Wollen Sie aber die Adresse E 5. 7 abfragen, so programmieren Sie:
U E[AR1, P#0. 1]
Der Pointer nach dem Komma wird zu dem Wert im Adressregister 1 addiert und das Resultat als Byte- und Bit-Nummer des Eingangs interpretiert. Indirekte adressierung sps m. Dabei wird berücksichtigt, dass Bytes nur 8 Bits haben, Bit 5. 9 wird daher zu Bit 6. 0. Wenn Sie jetzt
U E[AR1, P#0. 2]
programmieren, wird der Eingang 6. 0 abgefragt.
Indirekte Adressierung Sps 10
Das Ganze nennt man registerindirekte-bereichsinterne-Adressierung. Bereichsintern deswegen, weil (im Beispiel) immer nur Eingänge abgefragt werden. Natürlich können Sie durch diese nicht nur auf Bits, sondern auch auf Bytes, Words und DWords zugreifen. Beispiel:
L MW[AR2, P#2. 0]
Es gibt nun aber auch die registerindirekte-bereichsübergreifende Adressierung. Da müssen Sie im Vorfeld nicht einmal entscheiden, ob Eingänge, Ausgänge oder Merker abgefragt werden. Das geht folgendermaßen:
Sie laden das AR1 mit der Adresse A 5. 3:
LAR1 P#A5. 3
Dann weisen Sie dem Ausgang A 5. 3 den Wert des VKE zu, indem Sie programmieren:
= [AR1, P#0. 0]
und entsprechend den Ausgang A 17. 2
= [AR1, P#11. 7] // (5. 3 + 11. 7 = 17. Indirekte Adressierung | SPS-Forum - Automatisierung und Elektrotechnik. 2)
Auch hier können Sie genauso auf Bytes, Words und DWords zugreifen:
L W[AR1, P#4. 0]
Eigenartigerweise ist der bereichsübergreifende Zugriff auf Lokaldaten in einer S7-300 nicht gestattet, bei einer S7-400 jedoch erlaubt. Wir haben diesen Zugriff in TrySim gesperrt.!! Warnung bei Verwendung der Adressregister!!
Nicht ganz. Elementare Datentypen werden als Wert (Kopie, ByVal) übergeben. Zusammengesetzte Datentypen werden als POINTER (Referenz, ByRef) übergeben. #19
Nochmal ne Frage zu o. g. Code:
L P##ARRAY_WERTE; // Pointer: Gehen hierbei nicht Byte 4 und 5 des Pointer verloren, da der AKKU1 nur 4 Byte groß ist?? L W [AR1, P#0. 0]; // DB-Nummer: die ersten zwei Byte im Pointer
L D [AR1, P#2. 0]; // Bereichszeiger: siehe [B]Frage [/B]
L #WERT
T DBD [AR1, P#0. 0] // DBD bezieht sich auf das zuvor geladene DB-Register
Frage:
Bezieht sich diese Anweisung 1. auf das zuvor geladene DB-Register oder liest es 2. einen Teil aus dem Pointer? Wenn 1, müsste es dann nicht DBD [... ] heissen? SPS > Liste der Operationen > Register-indirekte Adressierung > Indirekte Adressierung. Wenn 2., warum heisst es dann nicht L B [AR1, P#2. 0], wenn nur der Bereichszeiger gemeint ist? Laut Pointer-Format-Doku steht im Byte 2 der Speicherbereich.