Im Datenbaustein Bereiche um kopieren Die Aufgabe besteht darin, das wir in einem Datenbaustein, hier im Beispiel DB1, Datenfelder[1] bis Datenfelder [10] anlegten. Die jeweiligen Datenfelder[] beinhalteten 10 Bytes (10 mal 8 Bits) oder auch 5 Worte. Nun sollte in Abhängigkeit von Parameter, genannt Quelle, die Daten in den Zielbereich um kopiert werden. Wir wollen zum Beispiel 10 Bytes von Datenfeld[5] in das Datenfeld[1] umladen oder um kopieren. Klassische Anwendung Rezeptur. Das Umladen wird impulsgesteuert einmalig vollzogen. Beginn: Ich legte zuerst eine UDT 1, einen sogenannten anwenderdefinierten Datentyp an. Dann erzeugte ich einen Datenbaustein DB1 in Verbindung mit dem UDT 1. Im DB legt ich einen ARRAY[0..10] mit Bezug zum UDT 1 an. Dann programmierte ich eine Funktion FC1. Dort programmierte ich einige Hilfsfunktionen, wie z.B. Daten in Datenbaustein mit Werte füllen usw. Jetzt stellt sich die Frage, wie mache ich nun dieses Umladen? Es gibt einige Lösungen, hier in meinem Beispiel habe ich 5 verschiedene Lösungsvorschläge integriert. 1. die S7-Code Variante, mittels Schleife 2. die SCL-Code Variante, Hochsprache 3. die IBLKMOV Variante, TI-S7 Converting Blocks 4. die SFC20 Variante, Systemfunktionen, fest 5. SFC20 Variante, variabel Es gibt noch weitere Möglichkeiten wie z.B. mittels S7-Programm und Sprungfunktonen. Doch hier sind nur die oben beschrieben Variante beschrieben. Um mit dem Programmcode zu arbeiten bzw. zu verstehen, sind einige Kenntnisse zur Architektur der CPU und den Registern notwendig. Deshalb habe ich kurz einige Informationen zusammen getragen. Um der Quellenamnestie vorzubeugen, nenne ich die Quellen, worauf ich zurück gegriffen haben: • SIMATIC S7 Upgrade S5-S7, Trainis-Center, 1999 • Automatisierung mit STEP 7 in AWL, Hans Berger, 1998 • Automatisieren mit STEP 7 in AWL und SCL, Hans Berger, 2008 • Einführung in der STEP 7 – Programmierung, Teil 1 -3, SPS-Magazin 99 • seit 1987 Programmiererfahrung in der Industrie • SIMATIC Manager Version 5.4 SP2, Onlinehilfe • Simulator als Bestandteil des S7 Software http://Schmitz-Blanke.de/ D:\Eigene_Dateien\001_Dokumente\001_Word_OpenOffice\Adressierung_S7_2009.odt Datenfeld[1] 10 Byte Datenfeld[5] 10 Byte Datenfeld[10] 10 Byte DBB 0 DBB 9 DBB 40 DBB 49 DBB 90 DBB 99 DB 1 .
18
Embed
Im Datenbaustein Bereiche um kopieren - schmitz- · PDF fileIm Datenbaustein Bereiche um kopieren Die Aufgabe besteht darin, das wir in einem Datenbaustein, hier im Beispiel DB1, Datenfelder[1]
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Im Datenbaustein Bereiche um kopieren
Die Aufgabe besteht darin, das wir in einem Datenbaustein, hier im Beispiel DB1,Datenfelder[1] bis Datenfelder [10] anlegten. Die jeweiligen Datenfelder[] beinhalteten10 Bytes (10 mal 8 Bits) oder auch 5 Worte. Nun sollte in Abhängigkeit von Parameter, genannt Quelle, die Daten in den Zielbereichum kopiert werden. Wir wollen zum Beispiel 10 Bytes von Datenfeld[5] in dasDatenfeld[1] umladen oder um kopieren. KlassischeAnwendung Rezeptur.
Das Umladen wird impulsgesteuert einmaligvollzogen.Beginn:Ich legte zuerst eine UDT 1, einen sogenanntenanwenderdefinierten Datentyp an. Dann erzeugte icheinen Datenbaustein DB1 in Verbindung mit dem UDT 1. Im DB legt ich einen ARRAY[0..10] mitBezug zum UDT 1 an. Dann programmierte ich eineFunktion FC1. Dort programmierte ich einigeHilfsfunktionen, wie z.B. Daten in Datenbaustein mitWerte füllen usw.Jetzt stellt sich die Frage, wie mache ich nun diesesUmladen? Es gibt einige Lösungen, hier in meinemBeispiel habe ich 5 verschiedene Lösungsvorschlägeintegriert.1. die S7-Code Variante, mittels Schleife2. die SCL-Code Variante, Hochsprache3. die IBLKMOV Variante, TI-S7 Converting Blocks4. die SFC20 Variante, Systemfunktionen, fest5. SFC20 Variante, variabel
Es gibt noch weitere Möglichkeiten wie z.B. mittels S7-Programm und Sprungfunktonen.Doch hier sind nur die oben beschrieben Variante beschrieben.
Um mit dem Programmcode zu arbeiten bzw. zu verstehen, sind einige Kenntnisse zurArchitektur der CPU und den Registern notwendig. Deshalb habe ich kurz einige Informationen zusammen getragen. Um derQuellenamnestie vorzubeugen, nenne ich die Quellen, worauf ich zurück gegriffenhaben:
• SIMATIC S7 Upgrade S5-S7, Trainis-Center, 1999
• Automatisierung mit STEP 7 in AWL, Hans Berger, 1998
• Automatisieren mit STEP 7 in AWL und SCL, Hans Berger, 2008
• Einführung in der STEP 7 – Programmierung, Teil 1 -3, SPS-Magazin 99
x = Bitadresse; y = Byteadresse; z = Bereich Der z-Bereich ist wie folgt festgelegt: siehe Bild Akkumulator
0 0 0 P = Peripherie
0 0 1 E = Eingänge
0 1 0 A = Ausgänge
0 1 1 M = Merker
1 0 0 DBX = Globaldaten
1 0 1 DIX = Instanzdaten
1 1 0 L = temporäre Daten
1 1 1 Temporäre Daten
Hier einige Beispiele zu der indirekten Adressierung
speicherindirekte Adressierung mit BereichszeigerL P#10.0 // Zeiger in den Akku 1 ladenT MD20 // ins Merkerdoppelwort rettenL MW[MD20] // digital adressieren. . . . . // weitere S7-CodeU M[MD20] // binär adressieren
speicherindirekte Adressierung mit NummerL 145 // Zeiger in den Akku 1 ladenT MW20 // ins Merkerwort rettenAUF DB[MW20] // Global-DB aufmachen. . . . . // weitere S7-CodeSE T[MW20] // Zeit starten (T 145)
registerindirekte bereichsinterne Adressierung LAR1 P#20.0 // Zeiger in das Adressrigister 1 laden. . . . . // L MW[AR1,P#4.1] // digital adressieren. . . . . // weitere S7-CodeU E[AR1,P#3.1] // binär adressieren
registerindirekte bereichsübergreifende Adressierung LAR1 P#M20.0 // Zeiger in das Adressrigister 1 laden. . . . . // L B[AR1,P#4.0] // digital adressieren. . . . . // weitere S7-CodeS A[AR1,P#8.7] // binär adressieren
Ein Pointer oder DB-Zeiger kann wie folgt nur als Parameter-Eingang an einem FC oderFB übergeben werden, er sieht wie folgt aus:
z.B. P#DB2.DBX0.0 Er ist 48 Bit bzw. 6 Byte groß.
Dieser Pointer kann nicht in den Akku und auch nicht in die Adressregister direktgeladen werden. Er kann jedoch z.B in einem DB (6 Byte) erzeugt und manipuliertwerden. Hier der Aufbau des DB-Zeiger
u = Datenbausteinnummer, 215 entspricht 32768, (abhängig von CPU);x = Bitadresse, 23 entspricht 8, adressierbar von 0 bis 7;y = Byteadresse, 215 entspricht 32768, (abhängig von CPU);z = Bereich, 23 Bitmuster und Bedeutung siehe unten;
0 0 0 P = Peripherie
0 0 1 E = Eingänge
0 1 0 A = Ausgänge
0 1 1 M = Merker
1 0 0 DBX = Globaldaten
1 0 1 DIX = Instanzdaten
1 1 0 L = temporäre Daten
1 1 1 Temporäre Daten
DB-Zeiger, andere Darstellung mit Beispiel
Byte Bedeutung z.B. DB2.wort Beispiel, Wert
n Datenbaustein- D B 2. D B B 0 00
n +1 nummer D B 2. D B B 1 01
n + 2 Operandenbereich D B 2. D B B 2 B#10000100
n + 3 Byte-Adresse D B 2. D B B 3 00
n + 4 Byte-Adresse D B 2. D B B 4 00
n + 5 Byte.Bit-Adresse D B 2. D B B 5 B#01010000
Im DB2.DBX0.0 (6Byte) ist der Pointer P#DB1.DBX10.0 adressiert.DB2.[DBB0][DBB1][DBB2][DBB3][DBB4][DBB5] immer rechtsbündig.
Der SIMATIC Manager mit den Datenbausteine, UDTs, FCs usw.
Der DB1 mit dem ARRAY[0..10]
OB1, Hauptprogramm
Als Schmankerl, habe ich ab Netzwerk 13, eine komfortable Adressierung mittels SFC20BLKMOV und variabler Adressierung mit ANY_Zeiger und Lokalvariable programmiert.
Netzwerk: 1 Dient der Impulserzeugung, in DB1 Daten füllen
ImpulserzeugenMB 1 ist ein Zeit bzw. Taktgeber, in der CPU als Ta ktmerker fest eingestellt MB1 = 0 0 0 0 0 0 0 0 ! +---> 2 Hz _ _ +-----------> 0,5 Hz _! !_! !_ . . . M2.1 wird nur ein Zyklus (CPU-Takt) _/\__/\__ . . .
=P
&M1.4M1.4
Blinktakt0,125 Hz
"M 1.4"
M10.0M10.0Daten im
DB1 füllen"M 10.0"
M2.0M2.0Flankenmer
ker 1"M 2.0"
M2.1M2.1Impuls 1"M 2.1"
SymbolinformationM1.4 M 1.4 Blinktakt 0,125 HzM10.0 M 10.0 Daten im DB1 füllenM2.0 M 2.0 Flankenmerker 1M2.1 M 2.1 Impuls 1
Netzwerk: 2
UN "M 2.1" // Impuls M2.1 -- Impuls 1 SPB Ende // wenn keiner dan Ende
// Ab hier füllen wir den DB1 mit daten// Erster Datensatz
AUF "Probe DB" // Db aufschlagen, oder besse r DB-Rigister adressieren
DB1 -- Probe Datenbaustein
L DBW 10 // jetzt können wir vereinfache n, kürzer als L DB1.DBW10 L 1 // Konstante laden +I // addieren T DBW 10 // und zurückschreiben
L DBW 12 // Variable 1 laden + B#16#1 // Konstante 1 und addieren T DBW 12 // Wert wieder zurück schreiben SLW 1 //SChiebe den Akku 1 nach links (*2) T DBW 14 SLW 1 T DBW 16 SLW 1 T DBW 18
// Zweiter Datensatz
L DBW 10 L 2 *I T DBW 20 + B#16#1 T DBW 22 + B#16#1 T DBW 24 + B#16#1 T DBW 26 + B#16#1 T DBW 28
// dritter Datensatz
L DBW 10 L 3 *I T DBW 30 + B#16#1 T DBW 32 + B#16#1 T DBW 34 + B#16#1 T DBW 36 + B#16#1 T DBW 38
L DBW 10 L 4 *I T DBW 40 + B#16#1 T DBW 42 + B#16#1 T DBW 44 + B#16#1 T DBW 46 + B#16#1 T DBW 48
// fünfter Datensatz
L DBW 10 L 5 *I T DBW 50 + B#16#1 T DBW 52 + B#16#1 T DBW 54 + B#16#1 T DBW 56 + B#16#1 T DBW 58
Ende: NOP 0
Netzwerk: 3 Dient der Impulserzeugung, zur Pro be nur einmal ausführen
Impuls für daten umladen, nur einmal wenn M10.1 ges etzt, mittels S7 Programmcode
=
P
M2.2M2.2Flankenmer
ker 2"M 2.2"
M10.1M10.1Datenübertragung S7
- Code"M 10.1"
M2.3M2.3Impuls 2"M 2.3"
SymbolinformationM2.2 M 2.2 Flankenmerker 2M10.1 M 10.1 Datenübertragung S7 - CodeM2.3 M 2.3 Impuls 2
Netzwerk: 4 Datenübertragung mittels S7 Code u nd Schleifenprogrammierung
Die Beschreibung gilt für den ersten Durchlauf (zum Verständnis) Über den Aufbau und die Architektur der Adressierun g habe ich ein Pamphlet (Erklärung) erstellt. Dezember 2009 / SBL
UN "M 2.3" // Impulsauswertung, nur einmal umladen M2.3 -- Impuls 2 SPB WeiA
// Vorbereitung Datenumladen
AUF "Probe DB" // [DB-Register] der Vorstän digkeit Quell_DB aufmachen
DB1 -- Probe Datenbaustein
AUF DI 1 // [DI-Register] Ziel_Db Aufmac hen (geht nicht symbolisch)
// Verwendung der Adressregister LAR1 P#DBX 10.0 // Adressregister 1 mit Quell e laden LAR2 P#DIX 0.0 // Adressregister 2 mit Ziel l aden
L 5 // SchleifenzählerSchl: T "MW 100" // Hilfsregister Schleifenzähle r Wert ret
tenMW100 -- Schleifenzähler für die Datenübertragung S7- Code
L W [AR1,P#0.0] // Lade erster Wert Daten- Quelle (AR1=DBX10.0+P#0.0 ....) T W [AR2,P#0.0] // Lade erster Wert Daten- Ziel (AR2=DBX0.0+P#0.0 ....) +AR1 P#2.0 // Adiere zum AR1=DBX10.0 + P#2.0 wird AR1=DBX12.0 ....) +AR2 P#2.0 // Adiere zum AR2=DBX0.0 + P#2.0 w ird AR2=DBX2.0 ....) L "MW 100" // Schleifenzähler wieder in Ak ku 1 lade
nMW100 -- Schleifenzähler für die Datenübertragung S7- Code
LOOP Schl // LOOP subtrahiert im Akku 1 = 5 - 1 Akku 1 = 4 dann Springen > 0...)
Netzwerk: 5 Dient der Impulserzeugung, zur Pro be nur einmal ausführen
Datenübertragung mittels erstelltem FC100 mit der S truktursprache SCL
=
P
M2.4M2.4Flankenmer
ker 3"M 2.4"
M10.2M10.2Datenübert
ragungmit FC100
"M 10.2"
M2.5M2.5Impuls 3"M 2.5"
SymbolinformationM2.4 M 2.4 Flankenmerker 3M10.2 M 10.2 Datenübertragung mit FC100M2.5 M 2.5 Impuls 3
Netzwerk: 6 Datenübertragung mittels FC100 / S Cl Code
FC100 / Datenübertragung BLOCK_FC, in diesem Beispi el werden Datenbereiche im DB1 umkopiert oder besser übertragen EN = bei 1, einmal ausführenQuelle = aus dem Datenbaustein 1, Datensatz (10 Bytes) hier Datensatz[3]Ziel = in den Datenbaustein 1, in den Datensat z (10 Bytes) hier Datensatz[2]
FC100
M2.5M2.5Impuls 3
"M 2.5" EN
3 Quelle
2 Ziel ENO
SymbolinformationM2.5 M 2.5 Impuls 3
Netzwerk: 7 Dient der Impulserzeugung, zur Pro be nur einmal ausführen
Datenübertragen mittels FC81 siehe folgende
=
P
M2.6M2.6Flankenmer
ker 4"M 2.6"
M10.3M10.3Datenübert
ragungmit FC81
"M 10.3"
M2.7M2.7Impuls 4"M 2.7"
SymbolinformationM2.6 M 2.6 Flankenmerker 4M10.3 M 10.3 Datenübertragung mit FC81M2.7 M 2.7 Impuls 4
Netzwerk: 8
DB-Zeiger es gilt: DB-Zeiger [Byte n][Byte n+1][Byte n+2][Byte n+3][B yte n+4][Byte n+5] DB2. [ DBB 0][ DBB 1 ][ DBB 2 ][ DBB 3 ][ DBB 4 ][ DBB 5 ] Die Betrachtung ist immer rechtsorientiert. Byte n = Datenbausteinnummer (High-Byte) Byte n+1 = Datenbausteinnummer (Low-Byte ) Byte n+2 = Bereichszeiger (Byte n Operandenbere ich B#2#10000zzz ) Byte n+3 = Bereichszeiger (Byte n+1 Operandenbere ich B#2#00000yyy ) Byte n+4 = Bereichszeiger (Byte n+2 Operandenbere ich B#2#yyyyyyyy )
Byte n+5 = Bereichszeiger (Byte n+3 Operandenbere ich B#2#yyyyyxxx ) Bedeutung zzz 000 = Peripherie P 001 = Eingänge E 010 = Ausgänge A 011 = Merker M 100 = Globaldaten DBX 101 = Instanzdaten DIX 110 = tempräre Lokaldaten L 111 = temporäre Lokaldaten vorgän gerbaustein V yyy Byte-Adresse 0 bis 32768 xxx Bit-Adresse 0 bis 7 Diese allgemeine Beschreibung gilt für Quell und Zi elparameter ! Dezember 2009 / SBL
UN "M 2.7" M2.7 -- Impuls 4 SPB Nie1// Vorbelegung des Quell-Zeigers Pointer, es soll d er Quell-Zeiger P#DB1.DBX10.0 adressiert werden
AUF "Lokal-DB" // DB2 Zeiger oder Pointer DB aufschlagen DB2 -- Pointer zum Umlad en L 2#0 // Konstante 0 T DBB 0 // Byte n
L 2#1 // Datebbausteinnummer 1 T DBB 1 // Byte n+1
L 2#10000100 // Globaldaten DBX T DBB 2 // Byte n+2
L 2#0 // Byte-Adresse 00000yyy T DBB 3 // Byte n+3
L 2#0 // Byte-Adresse yyyyyyyy T DBB 4 // Byte n+4
L 2#1010000 // Byte-Adresse 10. Bit-Adress e 0 yyyyyxxx T DBB 5 // Byte n+5
// Länge der übertragenen Daten, am FC81 E-Typ habe ich o4=Word eingestellt, deshalb die 5, fünf Worte
L 5 // 5 Worte übertragen T DBW 6 // das Längewort belegen
// Vorbelegung des Ziel-Zeigers Pointer, es soll de r Ziel-Zeiger P#DB1.DBX0.0 adressiert werden
L 2#0 // Konstante 0 T DBB 8 // Byte n
L 2#1 // Datebbausteinnummer 1 T DBB 9 // Byte n+1
L 2#10000100 // Globaldaten DBX T DBB 10 // Byte n+2
L 2#0 // Byte-Adresse 00000yyy T DBB 11 // Byte n+3
L 2#0 // Byte-Adresse yyyyyyyy T DBB 12 // Byte n+4
L 2#0 // Byte-Adresse 10. Bit-Adresse 0 y yyyyxxx T DBB 13 // Byte n+5
Netzwerk: 9 Datebworte umladen mit der FC81 Fu nktion
Parameter von FC81 (dieser Baustein findet man wenn man die Übersicht einschaltet, unter Bibliotheken/Standrad Libory/TI- S7Converting Blocks ParameterDeklarationDatentypSpeicherbereichBeschrei bungEN EingangBOOLE, A, M, D, LDer Signalzustand " 1" am Fre igabeeingang akt iviert die Box.ENO AusgangBOOLE, A, M, D, LDer Freigabeausgan g hat den Sig nalzustand "1", wenn die Fun ktion fehlerfrei ausgeführt wir d.S_DATA Eingang *PointerE, A, M, DZeigt auf ein en Pointer, der die Anf angsadresse der Quelle ang ibt.LENGTH Eingang *PointerE, A, M, DZeigt auf die Länge des
Dat enbereichs, der übertragen wer den soll.D_DATA Eingang *PointerE, A, M, DZeigt auf ein en Pointer, der die Anf angsadresse des Ziels angibt.E_TYPE EingangBYTEE, A, M, D, LGibt den Datent yp an. Folgende Wer te sin d für E_TYPE gültig: B#1 6#02 = BYTE B#1 6#04 = WORD B#1 6#05 = INT B#1 6#06 = DWORD B#1 6#07 = DINT B#1 6#08 = REAL
"IBLKMOV"
FC81FC81Indirect Block Move
M2.7M2.7Impuls 4
"M 2.7" EN
P#DB2.DBX0P#DB2.DBX0.0.0
DB-Zeiger6 Byte /
Quelle"Lokal-
DB".Quelle_
Zeiger S_DATA
DB2.DBW6DB2.DBW6Länge der
Uebertragung
"Lokal-DB".Laenge LEN
P#DB2.DBX8P#DB2.DBX8.0.0
DB-Zeiger6 Byte /
Ziel"Lokal-
DB".Ziel_
Zeiger D_DATA
B#16#4 E_TYPE ENO
SymbolinformationFC81 IBLKMOV Indirect Block MoveM2.7 M 2.7 Impuls 4P#DB2.DBX0.0 "Lokal-DB".Quelle_Zeiger DB-Zeiger 6 Byt e / QuelleDB2.DBW6 "Lokal-DB".Laenge Länge der UebertragungP#DB2.DBX8.0 "Lokal-DB".Ziel_Zeiger DB-Zeiger 6 Byte / Ziel
Netzwerk: 10 Dient der Impulserzeugung, zur Pro be nur einmal ausführen
Datenübertragen mittels SFB20 BLKMOV
=
P
M3.0M3.0Flankenmer
ker 5"M 3.0"
M10.4M10.4Datenübert
ragungSFC20
BLOKMOV,feste
Adressierung
"M 10.4"
M3.1M3.1Impuls 5"M 3.1"
SymbolinformationM3.0 M 3.0 Flankenmerker 5M10.4 M 10.4 Datenübertragung SFC20 BLOKMOV, feste Ad ressierungM3.1 M 3.1 Impuls 5
Die Quellen und Zielangabe am SFC20 werden als ANY- Zeiger Format erwartet.Pointer mit Angabe der Länge hier P#DB1.DBX20.0 Byt e 10 Quellpointer P#DB1.DBX0.0 Byte 10 Zielpointer Hier fest eingestellt Datensatz[2] nach Datensatz[0 ] umladen
"BLKMOV"
SFC20SFC20Copy Variables
M3.1M3.1Impuls 5
"M 3.1" EN
P#DB1.DBX2P#DB1.DBX20.00.0
vorläufigePlatzhalt
ervariable"Probe
DB".DB_VAR[2] SRCBLK
RET_VAL
MW4MW4Schmiermer
kerwortoder auchDatengrab
"MW 4"
DSTBLK
P#DB1.DBX0P#DB1.DBX0.0.0
vorläufigePlatzhalt
ervariable"Probe DB".DB_VAR[0]
ENO
SymbolinformationSFC20 BLKMOV Copy VariablesM3.1 M 3.1 Impuls 5P#DB1.DBX20.0 "Probe DB".DB_VAR[2] vorläufige Platzha ltervariableMW4 MW 4 Schmiermerkerwort oder auch DatengrabP#DB1.DBX0.0 "Probe DB".DB_VAR[0] vorläufige Platzhal tervariable
Netzwerk: 12
// ############# Ein Beispiel wie man mittel ANY_Ze iger die Bereiche ########### // ############# adressieren kann ###########////
Netzwerk: 13 Dient der Impulserzeugung, zur Pro be nur einmal ausführen
Datenübertragen mittels SFB20 BLKMOV
=
P
M3.2M3.2Flankenmer
ker 6"M 3.2"
M10.5M10.5Datenübert
ragungSFC20,BLKMOV
mitvariabler
Adressierung
"M 10.5"
M3.3M3.3Impuls 6"M 3.3"
SymbolinformationM3.2 M 3.2 Flankenmerker 6M10.5 M 10.5 Datenübertragung SFC20, BLKMOV mit varia bler AdressierungM3.3 M 3.3 Impuls 6
Netzwerk: 14 Arbeien mit einem ANY_Zeiger
Der ANY_Zeiger ist 10 Byte lang und sihe wie folgt aus:
zB. P#DB1.DBX30.0 10 Byte, im temporären Bereich d es FC1 wurde ein ANY_Zeiger definiert. Die temporär en Variablen kann man mit LBx, LWx, LDx anspreche n. ANY-Zeiger für Datenbausteine z.Beispiel P# DB1.DBX30.0 10 Byte 16# in HEX 2# dual LB0 Byte n fest 16#10 16#10 LB1 Byte n+1 Type 16#02 (Byte) LB2 Byte n+2 Anzahl (highbyte) 16#00 LB3 Byte n+3 Anzahl (lowbyte) 16#0A 10 Byte LB4 Byte n+4 DB-NR (highbyte) 16#00 LB5 Byte n+5 DB-NR (lowbyte) 16#01 DB1 LB6 Byte n+6 Bereichszeiger 16#84 DBX LB7 Byte n+7 " 16#00 LB8 Byte n+8 " 16#00 LB9 Byte n+9 " 2#11110000 30.0 im untenstehenden Beispiel arbeiten wir mit LW also Lokalwort. Dezember 2009 / SBL S452
UN "M 3.3" // Impuls auswerten M3.3 -- Impuls 6 SPB www// der ANY-Zeiger wird nun mit Daten belegt
LAR1 P##ANY_Zeiger // Adressregister mit Anfa ngsadresse der temp.Variable laden Hier L0.0 L W#16#1002 // Type Byte T LW [AR1,P#0.0] // in BYte n und n+1 lade n L 10 // Anzahl der Bytes T LW [AR1,P#2.0] // in Byte n+2 und n+3 la den L 1 // DB-Nr T LW [AR1,P#4.0] // in BYte n+4 und n+5 L W#16#8400 // Operandenbereich hier DBX T LW [AR1,P#6.0] // in Byte n+6 und n+7
// wir laden hier eine Konstant zB 30 als Byteanfan gsadresse, hier kann man über MWxx xbeliebige// Werte laden. Die Byteadresse muss dreimal nach l inks geschoben werden, weil die unteren// drei Bits die Bitadresse beinhalten als 0 bis 7. Wir wollen 30.0 adressieren.
L 30 // Quellenanfang (Zeiger) wir woolen aus DB1.DBX30.0 anfangen SLW 3 // dreimal nach links (im Akku 1) T LW [AR1,P#8.0] // in Byte n+8 und n+9
// Der ANY_Zeiger sollte jetzt komplett vorbelegt s ein, war doch einfach oder ?
www: NOP 0 // Sprungmarke mit Nulloperation, ist halt so !
Netzwerk: 15 Datenübertragung mit SFC20
Die Quellen und Zielangabe am SFC20 werden als ANY- Zeiger Format erwartet.Pointer mit Angabe der Länge hier P#DB1.DBX30.0 Byt e 10 Quellpointer P#DB1.DBX0.0 Byte 10 Zielpointer Hier fest eingestellt Datensatz[2] nach Datensatz[0 ] umladen
"BLKMOV"
SFC20SFC20Copy Variables
M3.3M3.3Impuls 6
"M 3.3" EN
#ANY_Zeiger SRCBLK
RET_VAL
MW4MW4Schmiermer
kerwortoder auchDatengrab
"MW 4"
DSTBLK
P#DB1.DBX0P#DB1.DBX0.0.0
vorläufigePlatzhalt
ervariable"Probe DB".DB_VAR[0]
ENO
SymbolinformationSFC20 BLKMOV Copy VariablesM3.3 M 3.3 Impuls 6MW4 MW 4 Schmiermerkerwort oder auch Datengrab
Adresse Name Typ Anfangswert Aktualwert Kommentar0.0 DB_VAR[0].Nr WORD W#16#0 W#16#02.0 DB_VAR[0].Variable_1 INT 0 04.0 DB_VAR[0].Variable_2 INT 1 16.0 DB_VAR[0].Variable_3 INT 2 28.0 DB_VAR[0].Variable_4 INT 3 310.0 DB_VAR[1].Nr WORD W#16#0 W#16#012.0 DB_VAR[1].Variable_1 INT 0 014.0 DB_VAR[1].Variable_2 INT 1 116.0 DB_VAR[1].Variable_3 INT 2 218.0 DB_VAR[1].Variable_4 INT 3 320.0 DB_VAR[2].Nr WORD W#16#0 W#16#022.0 DB_VAR[2].Variable_1 INT 0 024.0 DB_VAR[2].Variable_2 INT 1 126.0 DB_VAR[2].Variable_3 INT 2 228.0 DB_VAR[2].Variable_4 INT 3 330.0 DB_VAR[3].Nr WORD W#16#0 W#16#032.0 DB_VAR[3].Variable_1 INT 0 034.0 DB_VAR[3].Variable_2 INT 1 136.0 DB_VAR[3].Variable_3 INT 2 238.0 DB_VAR[3].Variable_4 INT 3 340.0 DB_VAR[4].Nr WORD W#16#0 W#16#042.0 DB_VAR[4].Variable_1 INT 0 044.0 DB_VAR[4].Variable_2 INT 1 146.0 DB_VAR[4].Variable_3 INT 2 248.0 DB_VAR[4].Variable_4 INT 3 350.0 DB_VAR[5].Nr WORD W#16#0 W#16#052.0 DB_VAR[5].Variable_1 INT 0 054.0 DB_VAR[5].Variable_2 INT 1 156.0 DB_VAR[5].Variable_3 INT 2 258.0 DB_VAR[5].Variable_4 INT 3 360.0 DB_VAR[6].Nr WORD W#16#0 W#16#062.0 DB_VAR[6].Variable_1 INT 0 064.0 DB_VAR[6].Variable_2 INT 1 166.0 DB_VAR[6].Variable_3 INT 2 268.0 DB_VAR[6].Variable_4 INT 3 370.0 DB_VAR[7].Nr WORD W#16#0 W#16#072.0 DB_VAR[7].Variable_1 INT 0 074.0 DB_VAR[7].Variable_2 INT 1 176.0 DB_VAR[7].Variable_3 INT 2 278.0 DB_VAR[7].Variable_4 INT 3 380.0 DB_VAR[8].Nr WORD W#16#0 W#16#082.0 DB_VAR[8].Variable_1 INT 0 084.0 DB_VAR[8].Variable_2 INT 1 186.0 DB_VAR[8].Variable_3 INT 2 288.0 DB_VAR[8].Variable_4 INT 3 390.0 DB_VAR[9].Nr WORD W#16#0 W#16#092.0 DB_VAR[9].Variable_1 INT 0 094.0 DB_VAR[9].Variable_2 INT 1 196.0 DB_VAR[9].Variable_3 INT 2 298.0 DB_VAR[9].Variable_4 INT 3 3100.0 DB_VAR[10].Nr WORD W#16#0 W#16#0102.0 DB_VAR[10].Variable_1 INT 0 0104.0 DB_VAR[10].Variable_2 INT 1 1106.0 DB_VAR[10].Variable_3 INT 2 2108.0 DB_VAR[10].Variable_4 INT 3 3