22
328 9 Indirekte Adressierung 9.1 Adressierungsarten in AWL Die Hauptaufgabe einer CPU besteht darin, Daten aus dem Arbeitsspeicher zu lesen und ent- sprechend dem Anwenderprogramm zu verarbeiten. Eine AWL-Anweisung besteht daher aus einem Operator, der bestimmt was zu tun ist und einem Operanden, der die zu verarbeitenden Daten bereithält. Die Operanden können direkt adressierbare Speicherplätze oder symbolisch adressierte Variablen sein. Zum Lesen oder Schreiben von Daten muss eine Anforderung an die Adresse des Operanden gerichtet werden, die als Adressierung bezeichnet wird. 9.1.1 Indirekte Operanden-Adressierung in STEP 7-AWL Bei der direkten Adressierung ist die Operandenadresse bereits in der Anweisung enthalten, z. B. L EB 1. Dagegen wird bei der indirekten Adressierung an Stelle der Operandenadresse nur ein in eckigen Klammern gesetzter Adressoperand oder ein Adressregister angegeben, wo die eigentliche Operandenadresse hinterlegt ist, z. B. L EB [MD 10]. Das Besondere an der indirekten Adressierung ist die Möglichkeit, den Speicherplatzinhalt des Adressoperanden oder Adressregisters verändern zu können, während eine direkt angegebene Operandenadresse ein festgeschriebener Teil einer Anweisung ist. Im Adressoperanden oder Adressregister stehen somit Daten, die eine Adressenbedeutung haben und die zur Laufzeit des Programms verändert werden können. Anwendung findet die in STEP 7 vorgesehene indirekte Operanden-Adressierung insbesonde- re beim Umgang mit Datenfeldern wie z. B. Tabellen in Datenbausteinen. Durch wenige An- weisungen können diese mit Hilfe der indirekten Adressierung bearbeitet werden. Bei Pro- grammteilen, die z. B. in einer Schleife mehrfach durchlaufen werden, kann bei jedem Durch- lauf der Operandenteil in der Anweisung verändert werden. Die in der Symboltabelle mit ei- nem Namen versehenen Operanden haben eine feste (absolute) Adresse und gehören daher auch zu den indirekt adressierbaren Operanden. Dagegen können in STEP 7-AWL deklarierte lokale Variablen nicht indirekt adressiert werden. 9.1.2 Indirekte Adressierung bei Multielement-Variablen nach IEC 61131-3 In der SPS-Norm IEC 61131-3 ist die indirekte Adressierung von SPS-Operanden in keiner Programmiersprache vorgesehen. Um dennoch eine Bearbeitung von Datenfeldern in den Pro- grammiersprachen Anweisungsliste AWL und Strukturierter Text ST zu ermöglichen, können diese mit Hilfe von Multielement-Variablen gebildet und bearbeitet werden. Besteht ein Datenfeld nur aus Datenelementen eines Typs, kann eine Feldvariable des Daten- typs ARRAY[0 .. n] OF ... durch Deklaration gebildet und mit einem Feldindex bearbeitet werden. Bei Datenfeldern mit typverschiedenen Datenelementen muss eine Strukturvariable als Datentyp für die Arraystruktur angelegt werden. Ein Beispiel zeigt das nachfolgende Bild. Für den Feldindex in einer AWL-Anweisung ist laut Norm vorgesehen, dass der Index eine Einzelelement-Variable oder ein Literal vom Datentyp INTEGER sein muss. Für eine ST-An- weisung darf es auch ein Ausdruck sein, dessen Ergebnis ebenfalls einen Integer-Wert liefern muss. Einzelheiten hierzu sind in Kapitel 3 zu finden und gelten auch für CoDeSys.

9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

328

9 Indirekte Adressierung

9.1 Adressierungsarten in AWL Die Hauptaufgabe einer CPU besteht darin, Daten aus dem Arbeitsspeicher zu lesen und ent-sprechend dem Anwenderprogramm zu verarbeiten. Eine AWL-Anweisung besteht daher aus einem Operator, der bestimmt was zu tun ist und einem Operanden, der die zu verarbeitenden Daten bereithält. Die Operanden können direkt adressierbare Speicherplätze oder symbolisch adressierte Variablen sein. Zum Lesen oder Schreiben von Daten muss eine Anforderung an die Adresse des Operanden gerichtet werden, die als Adressierung bezeichnet wird.

9.1.1 Indirekte Operanden-Adressierung in STEP 7-AWL Bei der direkten Adressierung ist die Operandenadresse bereits in der Anweisung enthalten, z. B. L EB 1. Dagegen wird bei der indirekten Adressierung an Stelle der Operandenadresse nur ein in eckigen Klammern gesetzter Adressoperand oder ein Adressregister angegeben, wo die eigentliche Operandenadresse hinterlegt ist, z. B. L EB [MD 10].

Das Besondere an der indirekten Adressierung ist die Möglichkeit, den Speicherplatzinhalt des Adressoperanden oder Adressregisters verändern zu können, während eine direkt angegebene Operandenadresse ein festgeschriebener Teil einer Anweisung ist. Im Adressoperanden oder Adressregister stehen somit Daten, die eine Adressenbedeutung haben und die zur Laufzeit des Programms verändert werden können.

Anwendung findet die in STEP 7 vorgesehene indirekte Operanden-Adressierung insbesonde-re beim Umgang mit Datenfeldern wie z. B. Tabellen in Datenbausteinen. Durch wenige An-weisungen können diese mit Hilfe der indirekten Adressierung bearbeitet werden. Bei Pro-grammteilen, die z. B. in einer Schleife mehrfach durchlaufen werden, kann bei jedem Durch-lauf der Operandenteil in der Anweisung verändert werden. Die in der Symboltabelle mit ei-nem Namen versehenen Operanden haben eine feste (absolute) Adresse und gehören daher auch zu den indirekt adressierbaren Operanden. Dagegen können in STEP 7-AWL deklarierte lokale Variablen nicht indirekt adressiert werden.

9.1.2 Indirekte Adressierung bei Multielement-Variablen nach IEC 61131-3 In der SPS-Norm IEC 61131-3 ist die indirekte Adressierung von SPS-Operanden in keiner Programmiersprache vorgesehen. Um dennoch eine Bearbeitung von Datenfeldern in den Pro-grammiersprachen Anweisungsliste AWL und Strukturierter Text ST zu ermöglichen, können diese mit Hilfe von Multielement-Variablen gebildet und bearbeitet werden. Besteht ein Datenfeld nur aus Datenelementen eines Typs, kann eine Feldvariable des Daten-typs ARRAY[0 .. n] OF ... durch Deklaration gebildet und mit einem Feldindex bearbeitet werden. Bei Datenfeldern mit typverschiedenen Datenelementen muss eine Strukturvariable als Datentyp für die Arraystruktur angelegt werden. Ein Beispiel zeigt das nachfolgende Bild. Für den Feldindex in einer AWL-Anweisung ist laut Norm vorgesehen, dass der Index eine Einzelelement-Variable oder ein Literal vom Datentyp INTEGER sein muss. Für eine ST-An-weisung darf es auch ein Ausdruck sein, dessen Ergebnis ebenfalls einen Integer-Wert liefern muss. Einzelheiten hierzu sind in Kapitel 3 zu finden und gelten auch für CoDeSys.

Page 2: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329

CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL

In der STEP 7-AWL besteht die Einschränkung, dass der Feldindex nur ein Literal des Typs INTEGER sein darf und damit zur Laufzeit des Programm leider nicht verändert werden kann.

9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL

Die indirekte Adressierung in der Programmiersprache AWL kann nur bei SPS-Operanden angewendet werden. Den Operanden kann in der Symboltabelle allerdings ein Bezeichner zu geordnet werden. Echte Variablen mit symbolischer Deklaration können nicht indirekt adres-siert werden. Entscheidend ist, dass für die indirekte Adressierung in der STEP 7-AWL die absoluten Speicherplatz-Adressen als Operanden-Adressen benötigt werden. Bei der indirekten Adressierung steht im Operandenteil der AWL-Anweisung anstelle einer Adresse ein Verweis der angibt, wo die Adresse zu finden ist. Je nach Art des Verweises unter-scheidet man zwischen der speicherindirekten Adressierung und der registerindirekten Adres-sierung. Die speicherindirekte Adressierung verwendet als Verweis einen Operanden (Adressoperand) aus dem Systemspeicher, um die Adresse zu bestimmen. Der Adressoperand ist doppelwort-breit, wenn ein Operand mit einer Doppelwort-, Wort-, Byte- oder Bit-Adresse angesprochen werden soll. Beispiel:

U E [MD10] Es wird der Eingang E abgefragt, dessen Adresse im Merkerdoppelwort MD10 steht.

Der Adressoperand ist wortbreit, wenn eine vorzeichenlose Integer-Zahl als Nummer bei Zäh-lern Z, Zeiten T, Funktionen FC, Funktionsbausteinen FB oder Datenbausteinen DB angespro-chen werden soll. Beispiel:

ZV Z [MW20] Es wird der Zähler vorwärts gezählt, dessen Nummer im Merkerwort MW 20 steht.

Daten- struktur

Deklarationsteil

Anweisungsteil

Simulation

Page 3: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

330 9 Indirekte Adressierung

Die registerindirekte Adressierung verwendet als Verweis ein Adressregister AR1 und einen Zeiger (Pointer P), um die Adresse des Operanden zu bestimmen. Beispiel:

U E [AR1,P#2.0] Es wird der Eingang E abgefragt, des-sen Adresse sich aus der Addition von der im Adressregister AR1 stehenden Adresse plus einem Versatz ergibt, der durch einen Zeiger (hier P#2.0) angege-ben wird.

Bei der indirekten Adressierung von Operanden aus den Bereichen Peripherie P, Eingänge E, Ausgänge A, Merker M, Datenbausteindaten DB und temporäre Lokaldaten L muss die Adres-se in dem Verweis so aufgebaut sein, dass sie die Bitadresse, die Byteadresse und gegebenen-falls auch die Bereichsadresse enthält. Dieses besondere Datenformat wird bei STEP 7 als Zeiger (POINTER) bezeichnet. Ein Zeiger wird verwendet, um gleichsam auf einen Operan-den zu zeigen. Insgesamt gibt es bei STEP 7 drei Arten von Zeigern: Bereichszeiger sind 32 Bit lang und enthalten die Bitadresse, die Byteadresse und gegebe-

nenfalls das Operandenkennzeichen. DB-Zeiger sind 48 Bit lang und enthalten den Bereichszeiger und die Nummer eines Da-

tenbausteins. ANY-Zeiger sind 80 Bit lang und enthalten den DB-Zeiger und weitere Angaben wie z. B.

Datentyp des Operanden. Für die indirekte Adressierung sind nur die zwei Typen der Bereichszeiger von Bedeutung.

9.3 Bereichszeiger in STEP 7 Enthält ein Bereichszeiger nur die Bitadresse und die Byteadresse wird er als bereichsinterner Zeiger bezeichnet. Enthält der Bereichszeiger darüber hinaus noch den Operandenbereich, wird er als bereichsübergreifender Zeiger bezeichnet. Aufbau der Bereichszeiger:

Bereichsinterner Zeiger (Typ 1):

Bereichsübergreifender Zeiger (Typ 2):

Die Belegung des Bit 31 unterscheidet die beiden Zeigerarten. Mögliche Operandenbereiche (ZZZ) beim bereichsübergreifenden Zeiger sind: PE, PA, E, A, M, DBX oder DIX. Bereichszeiger lassen sich unmittelbar adressieren und in den Akkumulator oder in die Adress-register laden. Die Notation dabei lautet: L P#y.x //Bereichsinterner Zeiger (z. B. L P#10.2) L P#Zy.x //Bereichsübergreifender Zeiger (z. B. L P#A10.4)

Soll mit einem Bereichszeiger ein Digitaloperand angegeben werden, ist die Bit-Adresse (xxx) mit 000 zu belegen (z. B. durch Linksschieben um 3 Stellen: SLW 3).

Page 4: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.4 Speicherindirekte Adressierung in STEP 7-AWL 331

9.4 Speicherindirekte Adressierung in STEP 7-AWL

Bei der speicherindirekten Adressierung steht die Adresse in einem Operanden (Adressope-rand). Eine Anweisung mit speicherindirekter Adressierung setzt sich zusammen aus einer Operation, einem Operandenkennzeichen mit möglicher Angabe der Zugriffsbreite (Byte, Wort, ..) und einem in eckigen Klammern stehenden Adressoperanden (Verweis). Der Adress-operand muss den Datentyp DWORD haben, wenn die Angabe einer Doppelwort-, Wort-, Byte- oder Bit-Adresse erforderlich ist. Beispiel:

L EB [MD10] Bei der Anweisung L EB ist eine Byte-Adresse anzugeben. Der Adressoperand (MD10) ist deshalb im Datenformat DWORD anzugeben.

Besteht die anzusprechende Adresse aus einer Nummer (Integer-Wert) muss der Adressope-rand den Datentyp WORD besitzen. Beispiel:

SE T [MW20] Bei der Anweisung SE T ist eine Integer-Adresse anzugeben. Der Adressoperand (MW20) ist deshalb im Datenformat WORD anzugeben.

Der theoretische Zahlenbereich von 0 bis 65 535 für die Angabe der Adressen wird in der Praxis durch das Operandenvolumen der verwendeten CPU begrenzt. Eine Zusammenfassung aller speicherindirekt adressierbarer Operanden ist in der nachfolgen-den Tabelle in Abhängigkeit von der Art der Adresse angegeben.

Art der Adresse Operandenkennzeichen Hinweise

Bit- und Byte-Adresse E; A; M; L; DIX; DBX Anwendung bei Bitverknüpfungs-operationen

Byte-, Wort- und Doppelwortadresse

EB, EW, ED; AB, AW, AD; MB, MW, MD; LB, LW, LD; PEB, PEW, PED; PAB, PAW, PAD; DBB, DBW, DBD; DIB, DIW, DID

Anwendung bei Lade und Transfer-funktionen. Die Bit-Nummer des Bereichszeigers muss dabei den Wert 0 haben.

Integer-Wert T; Z; DB; DI; FC; FB Zum Adressieren von Zeiten, Zählern oder Bausteinen

Aus der Tabelle ist zu ersehen, dass neben Operanden auch Datenbausteine, Funktionen oder Funktionsbausteine indirekt aufgerufen werden können. Als Adressoperanden im Wort- oder Doppelwortformat können Merker, Lokaldaten oder Datenbausteinoperanden verwendet werden. Eine symbolische Operandenbezeichnung über die Symboltabelle ist zulässig.

Page 5: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

332 9 Indirekte Adressierung

Die nachfolgende Tabelle zeigt eine Zusammenstellung der möglichen Adressoperanden im Wort- oder Doppelwortformat:

Adressoperand Hinweise Merker M Angabe als direkter Operand oder symbolischer Bezeichner

mit absoluter Adressenangabe Lokaldaten L (temporäre Lokaldaten)

Angabe als direkter Operand oder symbolischer Bezeichner mit absoluter Adressenangabe

Global-Datenbaustein DB Angabe als direkt adressierter Operand. Wird ein Global-datenoperand indirekt über ein Globaldatendoppelwort adres-siert, müssen beide im selben Datenbaustein liegen.

Instanzdatenbaustein DI Angabe als direkter Operand oder symbolisch Bezeichner mit absoluter Adressangabe. Instanzdaten als Adressenoperanden in Funktionen werden wie Globaldatenoperanden behandelt.

Der Inhalt des Adressoperanden kann über Lade- und Transferoperationen vorgegeben wer-den. Die folgenden Beispiele zeigen Möglichkeiten, wie eine Adresse in den Adressoperanden eingegeben werden kann. An späteren Beispielen wird noch gezeigt, wie Adressänderungen zur Laufzeit des Programms realisiert werden können.

Der Eingang E 8.5 soll abgefragt werden: L 8 SLW 3 L 5 OW T MD 10 U E[MD 10]

Die Byte-Adresse wird in den Akku 1 geladen und durch Linksschie-ben um drei Stellen an die richtige Stelle platziert. Danach wird die Bit-Adresse geladen und mit der Byte-Adresse ODER verknüpft. Der Akkuinhalt wird dann dem Adressoperanden MD 10 zugewiesen.

oder: L W#16#0045 T MD 10 U E[MD 10]

Das Bitmuster 0000 0000 0100 0101 wird über die HEX-Darstellung 16#0045 in den Akku geladen und dem Adressoperanden MD 10 zu-gewiesen.

oder: L P#8.5 T MD10 U E[MD10]

Ein Zeiger, der die Byte- und Bit-Adresse des anzusprechenden Ope-randen enthält wird in den Adressoperanden geladen.

Das Eingangswort EW 8 soll abgefragt werden: L 8 SLW 3 T DBD0 L DBW[DBD0]

Die Byte-Adresse wird in den Akku 1 geladen und durch Linksschie-ben um drei Stellen an der richtigen Stelle platziert. Der Akkuinhalt wird dann dem Adressoperanden DBD0 zugewiesen.

oder: L W#16#0040 T DBD0 L DBW[DBD0]

Das Bitmuster 0000 0000 0100 0000 wird über die HEX-Darstellung 16#0040 in den Akku geladen und dem Adressoperanden DBD0 zu-gewiesen.

Der Zähler Z13 soll vorwärts gezählt werden: L 13 T MW20 ZV Z[MW20]

Die Integer-Zahl 13 wird in den Akku 1 geladen und dem Adressope-randen zugewiesen.

Page 6: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.5 Registerindirekte Adressierung in STEP 7-AWL 333

9.5 Registerindirekte Adressierung in STEP 7-AWL Bei der registerindirekten Adressierung befindet sich die Basis-Adresse in einem der beiden Adressregister AR1 bzw. AR2. Adressregister sind 32 Bit breite Speicherzeilen in der CPU. Der Inhalt der Adressregisters ist ein bereichsinterner oder bereichsübergreifender Zeiger. Je nach Art des Zeigers unterscheidet man die bereichsinterne oder die bereichsübergreifende indirekte Adressierung. Neben dem Adressregister mit der Basisadresse muss bei der register-indirekten Adressierung noch zusätzlich ein bereichsinterner Zeiger angegeben werden, mit dem ein Versatz bestimmt wird. Beispiel für eine bereichsinterne indirekte Adressierung mit dem Adressregister AR1: U E [AR1,P#0.0] Die Adresse des Eingangs ergibt sich aus dem Inhalt von Adress-

register AR1 (Basisadresse) plus dem Wert des Zeigers P#0.0. In diesem Fall ist kein Versatz vorhanden.

Bei der bereichsinternen registerindirekten Adressierung können in Abhängigkeit von der Art der Adresse folgende Operandenkennzeichen verwendet werden:

Art der Adresse Operandenkennzeichen Hinweise

Bit- und Byte- Adresse E; A; M; L; DIX; DBX Anwendung bei Bitverknüpfungs- operationen

Byte-, Wort- und Doppelwortadresse

EB, EW, ED; AB, AW, AD; MB, MW, MD; LB, LW, LD; PEB, PEW, PED; PAB, PAW, PAD; DBB, DBW, DBD; DIB, DIW, DID

Anwendung bei Lade- und Transferfunk-tionen. Die Bit-Nummer des Bereichszei-gers muss dabei den Wert 0 haben.

Eine Adressierung von Operanden mit einer Nummer (INT-Zahl) als Adresse, wie bei Zeiten, Zählern, Funktionen etc., ist bei der registerindirekten Adressierung nicht möglich. Bei der bereichsübergreifenden registerindirekten Adressierung wird kein Operandenkenn-zeichen geschrieben, da dieser im Zeiger des Adressregisters AR1 angegeben ist. Beispiel für eine bereichübergreifende indirekte Adressierung mit dem Adressregister AR1: U [AR1,P#0.0] Die Adresse und der Operand ergibt sich aus dem Inhalt von Ad-

ressregister AR1 plus dem Wert des Zeigers P#0.0. In diesem Fall ist kein Versatz vorhanden.

Bereichsinterne oder bereichsübergreifende Zeiger werden über Lade-Anweisungen in die Adressregister gebracht. Die nachfolgend aufgeführten Anweisungen zeigen verschiedene Möglichkeiten, wie ein Zeiger in ein Adressregister geladen werden kann.

LAR1 P#20.0 Das Adressregister AR1 wird mit dem Pointer P#20.0 geladen. L P#20.0 LAR1

Das Adressregister AR1 wird mit dem Inhalt von Akku 1 geladen. In diesem Fall ist es der Pointer P#20.0.

LAR1 MD20 Das Adressregister AR1 wird mit dem Inhalt von Merkerdoppel-wort MD 20 geladen.

LAR1 AR2 Das Adressregister AR1 wird mit dem Inhalt von Adressregister AR2 geladen.

Page 7: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

334 9 Indirekte Adressierung

Die folgenden Beispiele zeigen Möglichkeiten der registerindirekten Adressierung.

Der Eingang E 8.5 soll abgefragt werden: L P#8.5 LAR1 U E[AR1,P#0.0] oder

Ein Zeiger, der die Byte- und Bit-Adresse des anzusprechenden Operanden enthält, wird in das Adressregister AR1 geladen.

L 8 SLW 3 L 5 OW T MD 10 LAR1 MD10 U E[AR1,P#0.0] oder

Die Byte-Adresse wird in den Akku 1 geladen und durch Links-schieben um drei Stellen an die richtige Stelle platziert. Danach wird die Bit Adresse geladen und mit der Byte-Adresse ODER-verknüpft. Der Akkuinhalt wird dann dem Adressregister zugewie-sen.

LAR1 P#5.6 U E[AR1,P#2.6] oder

Ein Zeiger, der eine Byte- und Bit-Adresse enthält, wird in das Adressregister AR1 geladen. Mit dem Versatz des Zeigers P#2.6 wird die Adresse des anzusprechenden Operanden berechnet.

LAR1 P#E8.5 U [AR1,P#0.0]

Ein bereichsübergreifender Zeiger, der das Operandenkennzeichen sowie die Byte- und Bit-Adresse des anzusprechenden Operanden enthält, wird in das Adressregister AR1 geladen.

Mit der bereichsübergreifenden registerindirekten Adressierung ist es möglich, die Übertra-gungsrichtung beim Austausch von Daten zwischen zwei Datenbereichen erst während des Programmdurchlaufs festzulegen. Zur Aufnahme der Datenbereiche werden die beiden Ad-ressregister AR1 und AR2 verwendet. Durch Ausführung der Anweisung: TAR //Die Inhalte von AR1 und AR2 werden vertauscht

kann die Übertragungsrichtung geändert werden. Im folgenden Beispiel sollen 8 Byte Daten zwischen dem Datenbereich ab DB10.DBB0 und dem Datenbereich ab DI20.DBB30 übertra-gen werden. Die Übertragungsrichtung wird durch den Eingang E 0.0 bestimmt.

LAR1 P#DBX 0.0 LAR2 P#DIX 30.0 AUF DB 10 AUF DI 20 UN E 0.0 SPB M001 TAR M001: L D[AR1,P#0.0] T D[AR2,P#0.0] L D[AR1,P#4.0] T D[AR2,P#4.0]

Die beiden Adressregister werden mit Zeigern geladen, die auf den jeweiligen Beginn des Datenbereichs zei-gen. Da zwei Datenbausteine aufzuschlagen sind, wird der eine mit DB und der zweite mit DI bezeichnet. Ist der Eingang E 0.0 = „0“, werden die Daten vom DB 10 in den DI 20 übertragen. Bei Signalzustand „1“ von Eingang E 0.0 wird der Inhalt der beiden Adressregister getauscht. Somit werden die Daten von DI 20 in den angegebenen Bereich von DB 10 übertragen. Die Übertragung von 8 Byte erfolgt über 2 Lade- und Transferanweisungen mit der Zugriffsbreite Doppelwort.

Statt den Inhalt der Adressregister zu tauschen, wäre es auch möglich gewesen, mit der An-weisung TDB //Tausche die Datenbausteinregister

Page 8: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.5 Registerindirekte Adressierung in STEP 7-AWL 335

die aufgeschlagenen Datenbausteine zu vertauschen und so die Übertragungsrichtung zu än-dern. Allerdings wird mit der Vertauschung der Datenbausteine der entsprechende Datenbe-reich nicht mitgetauscht. Stünde in der vorhergehenden AWL statt „TAR“ die Anweisung „TDB“, werden bei „0“-Signal von E 0.0 die acht Byte von DB10 ab DBB0 zum Datenbau-stein DI 20 ab DBB30 transferiert. Bei „1“-Signal von E 0.0 würden acht Byte von DI 20 ab DBB0 zum Datenbaustein DB10 ab DBB30 transferiert werden. Besonders bei der Ausführung von Schleifen kommt es vor, dass die Adresse eines Operanden bei jedem Schleifendurchlauf erhöht wird. Die Anweisungen: +AR1 //Addiere zum Inhalt des Adressregisters AR1 einen //Versatz der in Akku 1 steht oder +AR1 P#x.y //Addiere zum Inhalt des Adressregisters AR1 den mit //dem Zeiger P#x,y angegebenen Versatz

bieten dafür eine einfache Möglichkeit, die Adresse im Adressregister AR zu erhöhen. Im nächsten Beispiel ist eine Anwendung der „+AR1“-Anweisung gezeigt. Dabei sollen die 16 Datenwörter eines Datenbereichs ab DBW 10 im Datenbaustein DB10 mit dem Wert 16#FFFF verglichen werden. Ist der Vergleich erfüllt, wird ein entsprechendes Merkerbit auf „1“ ge-setzt. Der Merkerbereich, der das Ergebnis der Vergleiche enthält, soll ab M 10.0 beginnen.

AUF DB10

LAR1 P#DBX 10.0

LAR2 P#M 10.0

L 16

M001: T #S_ZAE

L W#16#FFFF

L W[AR1,P#0.0]

==I

= [AR2,P#0.0]

+AR1 P#2.0

+AR1 P#0.1

L #S_ZAE LOOP M001

Die Adressregister AR1 bzw. AR2 werden mit be-reichsübergreifenden Zeigern geladen, die jeweils auf den Beginn des Datenbereichs bzw. des Merkerbereichs zeigen. Schleifenzähler S_ZAE mit Wert 16 laden. Vergleich durchführen. Wenn Vergleich positiv, betreffenden Merker „1“ zu-weisen. Bei jedem Schleifendurchlauf wird die Byte-Adresse von Adressregister AR1 um 2 und die Bit-Adresse des Adressregisters AR2 um 1 erhöht. Schleifenende überprüfen (Loop dekrementiert Schlei-fenzähler).

Neben den bisher beschriebenen Anweisungen für den Umgang mit den Adressregistern gibt es noch die Anweisungen „TAR1“ bzw. „TAR2“, mit denen der Inhalt des jeweiligen Adress-registers z. B. ein Merkerdoppelwort, ein Lokaldatendoppelwort oder Datenbausteindoppel-wort in den Akku 1 geladen werden kann. Damit kann eine aktuelle indirekte Adresse in einer Variablen gespeichert werden. Beispiel:

Der Inhalt von Adressregister AR1 soll im Datendoppelwort DBD 10 gespeichert werden. TAR1 T DBD 10

Ein Zeiger, der die Byte- und Bit-Adresse des anzusprechenden Operanden enthält, wird in das Datendoppelwort DBD 10 geladen.

Page 9: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

336 9 Indirekte Adressierung

9.6 Beispiele

Beispiel 9.1: Messwert in einen Datenbaustein an vorgebbare Stelle schreiben (FC 901_WR)

Zum Einlesen von Messwerten mit dem Datenformat REAL an eine bestimmte Stelle in einen Datenbau-stein soll eine Funktion FC 901 entworfen werden. An den Eingängen der Funktion FC 901 wird der Messwert (MEW), die Nummer des Messwertes (MENR) und die Nummer des Datenbausteins (DBNR), in den der Messwert eingelesen werden soll, vorgegeben.

Übergabeparameter: Beschreibung der Parameter:

MEW: REAL Einzulesender Messwert MEWNR: INT Nummer des Messwertes DBNR: INT Datenbausteinnummer, in den der Messwert eingelesen werden soll

Zum Test der Funktion FC 901 wird ein Datenbaustein DB 10 mit einem Array von 256 Realwerten mit beliebigen Anfangswerten angelegt. Die Übernahme des Messwertes wird über den EN-Eingang mit einer Flankenauswertung der Taste S1 veranlasst. An den Funktionseingang MEW wird ein Merkerdop-pelwort MD und an den Eingang MEWNR ein Eingangswort EW gelegt, mit denen beliebige Werte über „Variable beobachten/steuern“ vorgegeben werden können. Die richtige Funktionsweise des Bausteins kann dann ebenfalls mit „Variable beobachten/steuern“ verfolgt werden. Zuordnungstabelle der Eingänge und Merker: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Taster Übernahme Vorgabe Messwertnummer

S1 EW

BOOL INT

Betätigt S1 = 1 Zahl zwischen 0 und 255

E 0.1 EW 8

Merkervariable Einzulesender Messwert MD REAL Gleitpunktzahl MD 10

Lösung Das folgende Struktogramm, welches nur aus einer Anweisungsfolge besteht, gibt das erforderliche Steuerungsprogramm der Funktion wieder.

Mit der Variablen DBNRW, welche das Format WORD haben muss, wird der entsprechende Datenbaustein aufgeschlagen. Die Adresse ADR im Format DWORD dient als Adress-operand für die indirekte Adressierung der Speicherzelle des Datenbausteins im Format DWORD. Sie berechnet sich aus der Multiplikation der Messwertnummer MWNR mit 4 und anschließendem Linksschieben um 3 Stellen. Wegen Multiplikation mit 4 siehe bei Adressen im erzeugten Datenbaustein.

STEP 7 Programm (AWL-Quelle):

FUNCTION FC901 : VOID VAR_INPUT MEW : REAL ; MENR : INT ; DBNR : INT ; END_VAR

VAR_TEMP DBNRW : WORD ; ADR : DWORD ; END_VAR

Page 10: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 337

BEGIN L #DBNR; T #DBNRW; AUF DB [#DBNRW];

L #MENR; L 4; *I ; SLW 3; T #ADR;

L #MEW; T DBD [#ADR]; END_FUNCTION

Anlegen des Datenbausteins DB 10:

Beispiel 9.2: Byte-Bereich in einem Datenbaustein auf einen Wert setzen (FC 902: SET_DB)

Für die eigene Programmbibliothek ist eine Funktion FC 902 zu entwerfen, mit der ein vorgebbarer Byte-Bereich in einem Datenbaustein auf einen Wert 16#XX gesetzt werden kann. Der Byte-Bereich wird durch die Angabe des Anfangsbytes ANB und der Länge LAE vorgegeben. An den Eingang B_W der Funktion wird der Wert gelegt, den die einzelnen Bytes des Bereichs annehmen sollen. Wird beispiels-weise der Wert 16#00 vorgegeben, so kann die Funktion FC 902 auch dazu genutzt werden, einen Be-reich in einem Datenbaustein zu löschen. Übergabeparameter: Beschreibung der Parameter:

DBNR (INT): Nummer des Datenbausteins ANB (INT): Anfangsbyte LAE (INT): Anzahl der Byte B_W (BYTE): Wert, den die Bytes in dem vorgegebenen Bereich erhalten sollen

Zum Test der Funktion FC 902 wird ein Datenbaustein DB 20 mit einer beliebigen Datenstruktur und beliebigen Anfangswerten angelegt und die Zahl 20 an den Funktionseingang DBNR geschrieben. An den Eingängen ANB und LAE können beliebige Zahlen notiert werden. Es ist jedoch unbedingt darauf zu achten, dass der durch die angegebenen Zahlen bestimmte Bereich auch im Datenbaustein vorhanden ist. An den Eingang B_W wird das Eingangsbyte EB eines zweistelligen Zifferneinstellers gelegt. Mit einer Flankenauswertung der Übernahme-Taste S1 wird die Bearbeitung der Funktion über den EN-Eingang einmalig veranlasst. Die Auswirkung des Funktionsaufrufs kann mit der STEP 7 Operation „Variable beobachten/steuern“ verfolgt werden. Zuordnungstabelle der Eingänge: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Übernahmetaste Zifferneinsteller

S1 EB

BOOL BYTE

Betätigt S1 = 1 BCD-Code

E 0.1 EB 9

Darstellung des Algorithmus im Struktogramm:

Hinweis: Neben den Eingangsvariablen der Funktion FC 902 müssen für den Algorithmus noch die temporären Variablen DBNRW (WORD), ADR (DWORD) und ZAE (INT) deklariert werden.

Page 11: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

338 9 Indirekte Adressierung

Mit der Variablen DBNRW wird der entsprechende Datenbaustein aufgeschlagen. Die Eingangsvariable DBNR kann dafür nicht verwendet werden, da diese im Format INT vorliegt. Zu Beginn der Anwei-sungsfolge wird der Wert der Variablen DBNR der Variablen DBNRW zugewiesen, die mit Datentyp WORD deklariert ist. Die Variable ADR muss zur indirekten Adressierung der Datenbytes als Adressenoperand eingeführt werden. Durch die Addition des Anfangswertes ANB und der jeweils aktuellen Länge LAE ergibt sich die Zeigeradresse. Die Variable LAE wird der temporären Variablen ZAE zugewiesen, die sich bei jedem Schleifendurchlauf um 1 vermindert, bis der gesamte vorgegebene Bereich durchlaufen ist.

STEP 7 Programm (AWL-Quelle):

FUNCTION FC902 : VOID VAR_INPUT DBNR : INT ; ANB : INT ; LAE : INT ; B_W : BYTE ; END_VAR

VAR_TEMP DBNRW : WORD ; ADR : DWORD ; ZAE : INT END_VAR

BEGIN L #DBNR; T #DBNRW; AUF DB [#DBNRW]; L LAE T ZAE

M001: L #LAE; L 0; <=I; BEB; L #ZAE; + -1; T #ZAE; L #ANB;

+I ; SLW 3; T #ADR; L #B_W; T DBB [#ADR]; SPA M001; END_FUNCTION

Beispiel 9.3: Bestimmung von Minimum, Maximum und arithmetischer Mittelwert in einem Datenbaustein (FC903_MINMAX)

Für die eigene Programmbibliothek ist eine Funktion FC 903 zu entwerfen, die aus einer bestimmten Anzahl von Messwerten, welche sich in einem Datenbaustein befinden, den kleinsten und den größten Wert bestimmt sowie den arithmetischen Mittelwert der Messwerte berechnet. Die Messwerte liegen im Datenformat REAL vor. Der Bereich der Messdaten für die Bestimmung der Werte wird durch die Anga-be der ersten Messwert-Nummer MNR und die Anzahl der Messwerte ANZ vorgegeben.

Übergabeparameter: Beschreibung der Parameter:

DBNR INT Nummer des Datenbausteins MNR INT Nummer des ersten Messwertes ANZ INT Anzahl der Messwerte MINW REAL Kleinster Wert im Datenfeld MAXW REAL Größter Wert im Datenfeld AMW REAL Arithmetischer Mittelwert des Datenfeldes

Zum Test der Funktion FC 903 wird ein Datenbaustein DB 30 mit 50 unterschiedlichen Gleitpunktzahlen angelegt. Die Anfangsnummer des Messwertes MNR und die Anzahl der zu untersuchenden Messwerte ANZ werden mit den Eingangsworten EW8 und EW10 vorgegeben. Es ist darauf zu achten, dass mit der Angabe von Messwertanfang MNR und der Anzahl ANZ der ausgewählte Datenbereich im Datenbau-stein auch tatsächlich vorhanden ist. Mit einer Flankenauswertung der Übernahme-Taste S1 wird die Bearbeitung der Funktion FC 903 über den EN-Eingang einmalig veranlasst. Die Ergebnisse der Bearbeitung MINW, MAXW und AMW wer-den den Merkerdoppelwörtern MD10, MD20 und MD30 zugewiesen.

Page 12: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 339

Die Funktionsweise des Bausteins FC 903 kann dann mit „Variable beobachten/steuern“ überprüft wer-den. Zuordnungstabelle der Eingänge und Merker: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Übernahmetaste Vorgabe Messwertanfangsnummer Vorgabe Anzahl der Messwerte

S1 MWNR

ANZ

BOOL INT INT

Betätigt S1 = 1 Integer Zahl Integer Zahl

E 0.1 EW 8 EW 10

Merkervariable Kleinster Messwert Größter Messwert Arithmetischer Mittelwert

MINW MAXW AMW

REAL REAL REAL

Gleitpunktzahl Gleitpunktzahl Gleitpunktzahl

MD 10 MD 20 MD 30

Der Algorithmus für die Ermittlung des kleinsten und des größten Messwertes basiert auf dem Vergleich jedes Messwertes mit dem aktuellen Minimalwert MINW bzw. dem aktuellen Maximalwert MAXW. Falls der Vergleich erfüllt ist wird der jeweilige Messwert dem aktuellen Minimalwert bzw. Maximalwert zugewiesen. Zu Beginn der Vergleiche werden der Minimalwert und der Maximalwert auf den Wert des letzten Messwertes des zu untersuchenden Datenfeldes gesetzt. Für die Berechnung des arithmetischen Mittelwertes wird jeder Messwert zu der Variablen AMW ad-diert. Nachdem alle Messwerte addiert sind, wird die Summe durch die Anzahl der Messwerte dividiert. Darstellung des Algorithmus im Struktogramm:

Temporäre Variablen: DBNRW (WORD): Datenbaustein-Nummer im Format WORD für den indirekten Aufruf des Datenbausteins. ADR (INT): Die Variable ADR wird zur indirekten Adressierung der Messwerte verwen-det. Da für jeden Messwert vier Byte benötigt werden, wird bei jedem Schleifendurchlauf 4 subtrahiert. ZAE (INT): Variable zur Zählung der Schleifen-durchläufe. Zu beachten ist, dass bei der Division der Summe aller Messwerte durch die Anzahl beide Variablen im Datenfor-mat REAL vorliegen.

STEP 7 Programm (AWL-Quelle):

FUNCTION FC 903 : VOID VAR_INPUT DBNR : INT ; MNR : INT ; ANZ : INT ; END_VAR;

VAR_OUTPUT MINW : REAL ; MAXW : REAL ; AMW : REAL ; END_VAR

VAR_TEMP DBNRW : WORD ; ZAE : INT ; ADR : DWORD ; END_VAR

BEGIN L #DBNR; T #DBNRW;

<=I ; SPB M002;

M004: NOP 0; L DBD [#ADR];

Page 13: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

340 9 Indirekte Adressierung

AUF DB [#DBNRW]; L #MNR; L #ANZ; +I ; + -1; L 4; *I ; SLW 3; T #ADR; L DBD [#ADR]; T #MINW; T #MAXW; T #AMW; L #ANZ; + -1; T #ZAE; M001: NOP 0; L #ZAE; L 0;

L #ADR; SRW 3; L 4; -I ; SLW 3; T #ADR; L DBD [#ADR]; L #MINW; <R ; SPBN M003; L DBD [#ADR]; T #MINW; M003: NOP 0; L DBD [#ADR]; L #MAXW; >R ; SPBN M004; L DBD [#ADR]; T #MAXW;

L #AMW; +R ; T #AMW; L #ZAE; + -1; T #ZAE; SPA M001; M002: NOP 0; L #AMW; L #ANZ; ITD ; DTR ; /R ; T #AMW; END_FUNKTION

Beispiel 9.4: Sortieren von Messwerten in einem Datenbaustein (FC904: SORT) Für die eigene Programmbibliothek ist eine Funktion FC 904 zu entwerfen, die Messwerte in einem Datenbaustein der Größe nach sortiert. Die Messwerte liegen im Datenformat REAL vor. Der Bereich der Messdaten, in dem die Messwerte sortiert werden sollen, wird durch die Angabe des Anfangwertes MNR und die Anzahl der Messwerte ANZ vorgegeben. Übergabeparameter: Beschreibung der Parameter:

DBNR (INT): Nummer des Datenbausteins MNR (INT): Nummer des Messwertes, ab dem sortiert werden soll ANZ (INT): Anzahl der Messwerte, die sortiert werden sollen

Zum Test der Funktion FC 904 wird ein Datenbaustein DB 40 mit 30 unterschiedlichen Gleitpunktzahlen angelegt. Die Anfangswerte der Gleitpunktzahlen im Datenbaustein können beliebig sein. Die Anfangs-nummer des Messwertes MNR und die Anzahl der zu sortierenden Messwerte ANZ werden mit den Eingangsworten EW8 und EW10 vorgegeben. Es ist darauf zu achten, dass mit der Angabe von Mess-wertanfang MNR und der Anzahl ANZ der ausgewählte Datenbereich auch im Datenbaustein tatsächlich vorhanden ist. Mit einer Flankenauswertung der Übernahme-Taste S1 wird die Bearbeitung der Funktion FC 904 über den EN-Eingang einmalig gestartet. Die Funktionsweise des Bausteins FC 904 kann dann mit „Variable beobachten/steuern“ überprüft werden.

Zuordnungstabelle der Eingänge: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Übernahmetaste Vorgabe Messwertanfangsnummer Vorgabe Anzahl der Messwerte

S1 MWNR

ANZ

BOOL INT INT

Betätigt S1 = 1 Integer Zahl Integer Zahl

E 0.1 EW 8 EW 10

Der Algorithmus für das Sortieren basiert darauf, dass in dem Datenfeld jeder Messwert mit dem vorher-gehenden auf „größer“ abgefragt wird. Ist der vorhergehende Wert dabei größer, werden die Adressen der beiden Messwerte über eine Hilfsvariable HO vertauscht. Dieser Vorgang wird für das Datenfeld solange wiederholt, bis keine Vertauschung mehr erforderlich ist.

Page 14: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 341

Darstellung des Algorithmus im Struktogramm:

Temporäre Variablen: DBNRW (WORD): Datenbaustein-Nummer im Wort-Format VERT (BOOL): Vertauschung erfolgt: VERT:= TRUE ZAE (INT): Variable zur Zählung der Schleifen-durchläufe HO (REAL): Hilfsoperand zur Zwischenspeiche-rung eines Wertes bei der Vertau-schung

Die indirekte Adressierung der Messwerte innerhalb des Datenbausteins erfolgt mit Hilfe der registerindi-rekten Adressierung über das Adressregister AR1 und einen Zeiger. Die boolesche Variable VERT wird bei jeder erfolgten Vertauschung auf den Wert „1“ gesetzt. Erst wenn keine Vertauschung mehr erforder-lich ist, sind alle Messwerte richtig sortiert und die Bearbeitung der Schleife wird beendet.

STEP 7 Programm (AWL-Quelle):

FUNCTION FC 904 : VOID VAR_INPUT DBNR : INT ; MNR : INT ; ANZ : INT ; END_VAR;

VAR_TEMP DBNRW : WORD ; VERT : BOOL ;

ZAE : INT ; HO : REAL ; END_VAR

BEGIN L #DBNR; T #DBNRW; AUF DB [#DBNRW]; SET ; = #VERT; M001: NOP 0; UN #VERT; BEB ; CLR ; = #VERT; L #ANZ; + -1; T #ZAE; L #MNR;

L #ANZ; +I ; + -2; L 4; *I ; SLW 3; LAR1; M002: NOP 0; L DBD [AR1,P#4.0]; L DBD [AR1,P#0.0]; <R ; SPBN M003; L DBD [AR1,P#0.0]; T #HO; L DBD [AR1,P#4.0]; T DBD [AR1,P#0.0];

L #HO; T DBD [AR1,P#4.0]; SET; = #VERT; M003: NOP 0; L -4; SLW 3; +AR1; L #ZAE; + -1; T #ZAE; L 0; >I ; SPB M002; SPA M001; END_FUNCTION

Page 15: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

342 9 Indirekte Adressierung

Beispiel 9.5: Einlesen und Suchen von Materialnummern (FC905: WR_MNR u. FC906: SU_MNR)

Zum Einlagern von Kisten mit Materialien in ein Hochregallager werden die Kisten mit einer Material-nummer versehen. Eine einzulagernde Kiste wird mit einer Fördereinrichtung in das nächste freie Fach transportiert. Die Steuerung merkt sich, welche Materialnummer welchem Fach zugeordnet wurde. Bei der Materialausgabe muss die Materialnummer gesucht werden, um das Fach zu ermitteln, welches die Fördereinrichtung anfahren muss. Technologieschema: Bild 9.1: Hochregallager

Jedes der insgesamt 16 Fächer des Hochregallagers wird einem Datenwort DBW eines Datenbausteins zugewiesen. Somit entsprechen die in den Datenworten stehenden Werte den Nummern der Kisten. Die Nummer Null ist für die freien Fächer reserviert. Das zu entwickelnde Steuerungsprogramm lässt sich in die Teile „Einlesen einer Materialnummer“ und „Suchen einer Materialnummer“ untergliedern.

Einlesen einer Materialnummer: Zum Testen des Steuerungsprogramms werden die Materialnummern über einen Zifferneinsteller in die Datenworte eingelesen. Bei Betätigung des Tasters S1 „Einlesen“ soll eine Materialnum-mer, die durch den vierstelligen BCD-Wert eines Zifferneinstellers EW vorgegeben wird, in ein Da-tenwort DBW eingelesen werden. Die Adresse des Datenwortes wird dabei durch die Dualkombination der Schalter S10 bis S13 bestimmt. Der Zusammenhang zwischen der Fachnummer, den Datenworten und der Dualkombination der Schalter ist in der nebenstehenden Tabelle dargestellt.

Fach- nummer Datenwort Schalterkombination

S13 S12 S11 S10 1 2 3 . .

14 15 16

DBW 0 DBW 2 DBW 4

..

.. DBW 26 DBW 28 DBW 30

0 0 0 0 0 0 0 1 0 0 1 0 . . . . . . . . 1 1 0 1 1 1 1 0 1 1 1 1

Aus der Tabelle ist zu ersehen, dass die Adresse der Datenwörter DBW sich aus der Dualkombination der Schalter S10 bis S13 multipliziert mit dem Faktor 2 berechnet.

Page 16: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 343

Suchen einer Materialnummer: Zur Suche einer Materialnummer wird der Inhalt aller Datenworte mit dem an einem Zifferneinsteller EW eingestellten BCD-Wert verglichen. Wird eine Materialnummer gefunden, so ist dies durch einen zugeordneten Steuerungsausgang anzuzeigen. Da es sich um 16 Fächer handelt, kann die Zuord-nung der Fächer zu den Ausgängen in einem Ausgangswort AW er-folgen.

Es soll auch der Fall berücksichtigt werden, dass eine Materialnummer mehrmals vorkommen kann. Durch Betätigung des Tasters S2 „Suchen“ wird der Suchvorgang einmalig gestartet. Das Ende des Suchvorgangs soll durch die Anzeigeleuchte P0 gemeldet werden. Mit Taster S3 „Quittieren“ können alle Anzeigen gelöscht werden. Für das Einlesen und das Suchen der Materialnummern ist es zweckmäßig, die Anzeige- und Bedienelemente auf einem Bedienfeld anzuordnen.

Bild 9.2: Bedienfeld Hochregallager

Zuordnungstabelle der Eingänge und Ausgänge:

Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Taster Einlesen Taster Suchen Taster Quittieren Schalter Wert 0 Schalter Wert 1 Schalter Wert 2 Schalter Wert 4 Zifferneinsteller

S1 S2 S3

S10 S11 S12 S13 EW

BOOL BOOL BOOL BOOL BOOL BOOL BOOL WORD

Betätigt S1 = 1 Betätigt S2 = 1 Betätigt S3 = 1 Betätigt W0 = 1 Betätigt W1 = 1 Betätigt W2 = 1 Betätigt W4 = 1 4-stelliger BCD-Wert

E 0.1 E 0.2 E 0.3 E 1.0 E 1.1 E 1.2 E 1.3 EW 8

Ausgangsvariable Fachanzeige 1 bis Fachanzeige 16 Anzeige Such-Ende

P1 ...

P16 P0

BOOL ...

BOOL BOOL

Leuchtet P1 = 1 ... Leuchtet P16 = 1 Leuchtet P0 = 1

A 4.0 ...

A 5.7 A 12.0

Page 17: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

344 9 Indirekte Adressierung

Zum Einlesen von Materialnummern in entsprechende Datenwörter ist eine Funktion FC 905 zu entwer-fen. An den Eingang Fachnummer FA_NR der Funktion wird die durch Maskieren gewonnene Dualkom-bination der Schalter S 10 bis S 13 übergeben. Am Eingang MA_NR wird die Materialnummer einge-stellt. Schließlich wird an dem Eingang DB_NR noch die Nummer des Datenbausteins fest vorgegeben, in dem die Materialnummer gespeichert werden soll. Das Suchen der Materialnummern soll die Funktion FC 906 übernehmen. Zur Anzeige, dass ein Such-vorgang stattgefunden hat, wird die Betätigung des Tasters S2 „Suchen“ gespeichert und der Anzeige P0 zugewiesen. Eine Flankenauswertung ruft die Suchfunktion FC 906 einmalig auf. An den Funktionsein-gängen MA_NR und DB_NR werden die zu suchende Materialnummer und der zugehörige Datenbau-stein angegeben. Das Ergebnis des Suchvorgangs kann an den Fachanzeigen P1 bis P16 abgelesen wer-den, die an das Ausgangswort AW 4 angeschlossen sind. Durch Betätigung der Quittiertaste S3 werden die Speicherfunktion und alle Ausgänge von Ausgangswort AW 4 zurückgesetzt. Bausteinstruktur und Übergabeparameter:

Einlesen

Suchen

Quittieren

Programmteil „Einlesen einer Materialnummer“: Aus der Angabe der Fach-Nummer FA_NR und der Datenbaustein-Nummer DB_NR wird das Datenwort ermittelt, in das die Materialnummer MA_NR geschrieben wird. Das Programm kann in drei Abschnitte unterteilt werden: Datenbaustein aufrufen

L #DB_NR T #DB_NRW AUF DB [DB_NRW]

Zum Aufruf des Datenbausteins über eine speicherindirekte Adressierung muss der Operand, der die Nummer des Datenbausteins enthält, im Da-tenformat WORD vorliegen.

Berechnung der Datenwortadresse L #FA_NR L 2 *I SLW 3 T #ADR

Die Fachnummer FA_NR muss mit zwei multipliziert werden, um die Adresse des zugehörigen Datenworts zu erhalten. Das Ergebnis wirddann um drei Stellen nach links verschoben (siehe Kap 9.3 Bereichszei-ger) und der Variablen ADR (Adressoperand) mit dem Datenformat DWORD zugewiesen.

Materialnummer in das Datenwort schreiben L #MA_NR T DBW [ADR]

Die Materialnummer wird über die indirekte Adressierung in das Daten-wort transferiert, dessen Nummer der Adressoperand ADR angibt.

Page 18: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 345

Programmteil „Suchen der Materialnummer“: Die Funktion FC 906 vergleicht den an dem Funktionseingang MA_NR liegende Wert mit den Inhalten von 16 Datenworten. Um nicht 16 Vergleiche programmieren zu müssen, wird eine Schleife verwendet, die mit der AWL Funktion „LOOP“ realisiert wird. Der Schleifenzähler S_ZAE bildet dabei den Aus-gangswert, um die jeweilige Adresse des Datenwortes zu berechnen. Fällt ein Vergleich von Datenwort und Materialnummer positiv aus, wird in der Anzeigevariablen ANZ das zugehörige Bit gesetzt. Dazu wird ein Schieberegister als temporäre Variable S_RE eingeführt, dessen 16. Bit zu Beginn der Pro-grammausführung auf „1“ gesetzt und bei jedem Schleifendurchlauf um eine Stelle nach rechts gescho-ben wird.

Struktogramm der Funktion FC 906:

Hinweise: Die Adressnummer wird aus dem Schleifenzähler S_ZAE nach der Formel 2*(S_ZAE -1) berechnet. Beispiel: S_ZAE = 10 zugehöriges Datenwort: DBW 18 (siehe Tabelle). Mit dem letzten Befehl TAW werden die Bytes des Anzeigewortes vertauscht. Dies ist erforderlich, damit Fach 1 auch der Fachanzeige A 4.0 zugewie-sen wird.

Ohne Vertauschung würde dem Ausgang A 4.0 das Fach 9 zugewiesen werden.

STEP 7 Programm (AWL-Quelle):

FUNCTION FC905 : VOID FUNCTION FC906 : VOID

VAR_INPUT FA_Nr : INT ; MA_Nr : WORD DB_NR : INT ; END_VAR VAR_TEMP DB_NRW : WORD ; ADR : DWORD ; END_VAR BEGIN L #DB_NR; T #DB_NRW; AUF DB [#DB_NRW]; L #FA_Nr; L 2; *I ; SLW 3; T #ADR; L #MA_Nr; T DBW [#ADR]; END_FUNCTION

VAR_INPUT MA_Nr : WORD ; DB_NR : INT ; END_VAR VAR_OUTPUT ANZ : WORD; END_VAR VAR_TEMP DB_NRW : WORD ; S_ZAE : INT ; S_RE : WORD ; ADR : DWORD ; END_VAR BEGIN L #DB_NR; T #DB_NRW; AUF DB [#DB_NRW]; L 0; T #ANZ; L W#16#8000; T #S_RE; L 16;

M001: T #S_ZAE; L #S_ZAE; L 1; -I ; L 2; *I ; SLW 3; T #ADR; L DBW [#ADR]; L #MA_Nr; <>I ; SPB M002; L #S_RE; L #ANZ; OW ; T #ANZ; M002: L #S_RE; SRW 1; T #S_RE; L #S_ZAE; LOOP M001; L #ANZ; TAW; T #ANZ; END_FUNCTION

Page 19: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

346 9 Indirekte Adressierung

Beispiel 9.6: Rezeptwerte einschreiben und auslesen

In einer Textilfabrik werden verschiedene Vlies- sowie Filzstoffe für technische Anwendungen in einem Mixmaster hergestellt. Je nach gewünschtem Endprodukt wird dabei ein Ausgangsstoff nach unterschied-lichen Rezepturen hergestellt. Die Rezeptur für einen Ausgangsstoff besteht dabei im Wesentlichen aus vier Rezeptwerten. Diese sind: Q1: Menge Substanz 1 (Angabe als INT-Wert im Bereich von 0 bis 100 %), Q2: Menge Substanz 2 (Angabe als INT-Wert im Bereich von 0 bis 100 %), T_V: Temperatur-Vorgabe (Angabe als REAL-Wert im Bereich von 0.0 bis 100.0) und M_Z: Mischzeit (Angabe als Zeitwert S5T).

Da es insgesamt 16 verschieden Ausgangsstoffe gibt, sind 16 Rezepturen mit je 4 Rezeptelementen in einem Datenbereich hinterlegt. Jedem Rezeptelement wird ein Rezeptwert zugeordnet. Vor der Herstel-lung eines bestimmten Vlies- bzw. Filzstoffes müssen die entsprechenden 4 Rezeptwerte aus dem Daten-bereich geladen werden.

Technologieschema:

Bild 9.3: Rezeptverwaltung

Es sind zwei Funktionen FC 907 und FC 908 zu entwerfen. Mit der Funktion FC 907 können die Re-zeptwerte einer Rezeptur in einen wählbaren Datenbaustein eingeschrieben werden. Die Funktion FC 908 liest die Rezeptwerte einer vorgegebenen Rezeptur aus dem Datenbaustein aus. Funktion FC 907: Einschreiben der Rezeptwerte Übergabeparameter: Beschreibung der Parameter:

DB_NR: INT Nummer des Datenbausteins für die Rezeptwerte

RE_NR: INT Rezeptnummer

RE_W1: INT Rezeptwert 1 (Menge Q1 in %)

RE_W2: INT Rezeptwert 2 (Menge Q2 in %)

RE_W3: REAL Rezeptwert 3 (Temperatur in °C von 0 ... 100)

RE_W4: S5TIME Rezeptwert 4 (Zeitwert )

FEH: BOOL Eingabefehler

Page 20: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 347

Funktion FC 908: Auslesen der Rezeptwerte Übergabeparameter: Beschreibung der Parameter:

DB_NR: INT Nummer des Datenbausteins der Rezeptwerte RE_NR: INT Rezeptnummer RE_W1: INT Rezeptwert 1 (Menge Q1 in %) RE_W2: INT Rezeptwert 2 (Menge Q2 in %) RE_W3: REAL Rezeptwert 3 (Temperatur in °C von 0 ... 100) RE_W4: S5TIME Rezeptwert 4 (Zeitwert)

Zum Test der Funktionen werden die Code-Bausteine aufgerufen und den Eingängen bzw. Ausgängen Merker-Variablen zugewiesen. Mit „Variablen steuern / bearbeiten kann dann die richtige Arbeitsweise der beiden Funktionen überprüft werden. Das Bild zeigt eine mögliche Anordnung der SPS-Operan-den im S7-PLC-SIM-Programm.

Eine weitere Kontrolle der richtigen Ar-beitsweise der Funktion FC 10 besteht in der Beobachtung des Datenbausteins DB10.

Zuordnungstabelle der Eingänge, Merker und Ausgänge:

Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Einschreiben Auslesen

S1 S2

BOOL BOOL

Betätigt (positive Flanke) S1 = 1 Betätigt (positive Flanke) S2 = 1

E 0.1 E 0.2

Merkervariable Datenbausteinnummer Rezeptnummer Rezeptwert 1 Rezeptwert 2 Rezeptwert 3 Rezeptwert 4

DBNR RENR REW1 REW2 REW3 REW4

INT INT INT INT

REAL S5TIME

Vorgabe: 10 (DB10) Ganzzahl (0 ... 16) Ganzzahl (0 ... 100) Ganzzahl (0 ... 100) Gleitpunktzahl (0.0 ... 100.0) Zeitwert

10 MW 10 MW 12 MW 14 MD 16 MW 20

Ausgangsvariable Einschreibfehler Rezeptwert 1 Rezeptwert 2 Rezeptwert 3 Rezeptwert 4

FEH QREW1 QREW2 QREW2 QREW2

BOOL INT INT

REAL S5TIME

Eingabefehler FEH = 1 Ganzzahl (0 ... 100) Ganzzahl (0 ... 100) Gleitpunktzahl (0.0 ... 100.0) Zeitwert

A 4.0 AW 12 AW 14 AD 16 AW20

Page 21: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

348 9 Indirekte Adressierung

Funktion FC 907 „Einschreiben“ Beim einmaligen Aufruf der Funktion werden die vier Rezeptwerte in den Datenbaustein DB 10 ge-schrieben. Der Integer-Wert RE_NR gibt dabei die Rezeptnummer vor. Die Berechnung der Adresse in Abhängigkeit von der Rezeptnummer RE_NR und die Zuweisung der Rezeptwerte in die Datenbaustein-wörter bzw. das Datenbausteindoppelwort zeigen die folgenden Anweisungen:

L DB_NR T DBNRW AUF DB [#DBNRW] L RE_NR L 10 *I SLW 3 LAR1 L RW1 T DBW [AR1,P#0.0] L RW2 T DBW [AR1,P#2.0] L RW3 T DBD [AR1,P#4.0] L RW4 T DBW [AR1,P#8.0]

Die vier Rezeptwerte bestehen aus den Datenformaten (Q1) INT, (Q2) INT; (TEMP) REAL und (ZEIT) S5TIME. Das ergibt eine Länge von 10 Byte pro Rezept im Datenbaustein DB10. Die Re-zeptnummer RE_NR muss somit mit 10 multipliziert werden, um den Zeiger auf den Beginn des Bereichs zu stellen, in dem die Rezeptur abgelegt ist. Da es sich um eine Byte-Adresse des Zei-gers handelt, wird der mit 10 multiplizierte Wert um drei Stellen nach links verschoben und dann dem Adressregister AR1 zugewie-sen.

Der zweite Rezeptwert (Q2) wird über den Versatz von 2 Byte, der dritte Rezeptwert über den Versatz von 4 Byte und der vierte Re-zeptwert über den Versatz von 8 Byte in die entsprechende Daten-wörter bzw. das Datendoppelwort eingelesen.

Bevor die Adressrechnung und das Einschreiben durchgeführt wird, ist eine Überprüfung der Eingabe-werte hinsichtlich der vorgegebenen Grenzen und der Plausibilität (Vorgabe Q1 plus Vorgabe Q2 <= 100 %) durchzuführen. Im Fehlerfall werden die Werte nicht übernommen und dem Ausgang FEH ein 1-Signal zugewiesen.

Struktogramm Funktion FC 907:

Das Einschreiben der Rezeptwerte erfolgt nach der oben angegebenen Adressrechnung und ist im Struktogramm nicht explizit angegeben.

Funktion FC 908 „Auslesen“ Beim einmaligen Aufruf der Funktion werden die vier Rezeptwerte aus dem Datenbaustein DB 10 ausge-lesen. Der Integer-Wert RE_NR gibt dabei die Rezeptnummer vor. Die Berechnung der Adresse in Ab-hängigkeit von der Rezeptnummer RE_NR und das Laden der Rezeptwerte entspricht den Anweisungen in der Funktion FC 908. Lediglich die Lade- und Transferanweisungen sind vertauscht.

Page 22: 9 Indirekte Adressierung · 2018-10-12 · 9.2 Grundlagen der indirekten Adressierung in STEP 7-AWL 329 CoDeSys Beispiel: Array mit Datenstruktur für WORD, INT, REAL In der STEP

9.6 Beispiele 349

STEP 7 Programm (AWL-Quelle):

FUNCTION FC907 : VOID FUNCTION FC908 : VOID VAR_INPUT DB_NR : INT ; RE_NR : INT ; RW1 : INT ; RW2 : INT ; RW3 : REAL ; RW4 : S5TIME ; END_VAR VAR_OUTPUT FEH : BOOL ; END_VAR VAR_TEMP DBNRW : WORD ; END_VAR BEGIN SET; = #FEH; L #RW1; L 100; >I ; BEB; L #RW2; L 100; >I ; BEB; L #RW1; L #RW2; +I ; L 100; >I ; BEB; L #RW3; L 0.000000e+000; <R ; BEB ; L #RW3; L 1.000000e+002; >R ; BEB ;

CLR ; = #FEH; L #DB_NR; T #DBNRW; AUF DB [#DBNRW]; L #RE_NR; L 10; *I ; SLW 3; LAR1; L #RW1; T DBW [AR1,P#0.0]; L #RW2; T DBW [AR1,P#2.0]; L #RW3; T DBD [AR1,P#4.0]; L #RW4; T DBW [AR1,P#8.0]; END_FUNCTION

VAR_INPUT DB_NR : INT ; RE_NR : INT ; END_VAR VAR_OUTPUT RW1 : INT ; RW2 : INT ; RW3 : REAL ; RW4 : S5TIME ; END_VAR VAR_TEMP DBNRW : WORD ; END_VAR BEGIN L #DB_NR; T #DBNRW; AUF DB [#DBNRW]; L #RE_NR; L 10; *I ; SLW 3; LAR1 ; L DBW [AR1,P#0.0]; T #RW1; L DBW [AR1,P#2.0]; T #RW2; L DBD [AR1,P#4.0]; T #RW3; L DBW [AR1,P#8.0]; T #RW4; END_FUNCTION