Makro Sprache
Gültig für S300, S700
Table of Contents
Makro Sprache
Der Benutzer kann ein Anwendungsprogramm schreiben, das innerhalb des S300/S700 laufen soll. Die Sprache ist eine Teilmenge von IEC 601131-3 strukturierter Text. Weil die Sprache BASIC und C sehr ähnlich ist, benötigt ein Programmierer nicht viel Training, um ein einfaches Programm zu schreiben. Das System benutzt einen internen Compiler, der einen schnellen Programmablauf erlaubt. Das Programm wird in einem Segment des Flash Speichers des Verstärkers (zur Zeit 60kByte) gespeichert und automatisch während der Startphase kompiliert. Wenn der Verstärker nicht freigegeben ist, kann das Programm geändert und neu kompiliert werden.
Das Entwicklungstool MacroStar unterstützt den Programmierer optimal.
Programm Steuerung
Die Programm Steuerung gibt dem System die Fähigkeit Bedingungen auszuwerten und unterschiedliche Aktionen abhängig vom Ergebnis zu starten. Die Makrosprache unterstützt z.B. IF .. THEN ELSE END_IF, WHILE .. DO END_WHILE, REPEAT .... UNTIL, GOTO und FOR .......
IF
Die grundsätzliche Ablaufsteuerung des Programms verwendet die Syntax:
IF <Ausdruck> THEN
.....
ELSE
...
END_IF ;
Der ELSE Pfad ist optional und kann weg gelassen werden. IF wird gefolgt von einem Ausdruck, der den Vergleich von Variablen und/oder Konstanten oder eine einfache Aussage beinhalten kann. Für IF ... THEN, ELSE und END_IF sollte jeweils eine eigene Programmzeile verwendet werden und wir empfehlen Leezeichen oder Tabulatoren zur Strukturierung zu benutzen.
Die folgenden vergleichenden Operatoren sind erlaubt:
> größer als
< kleiner als
>= größer oder gleich
<= kleiner oder gleich
= gleich
<> ungleich
Beispiele für IF:
IF var1=12 THEN
prüft ob var1 gleich 12 ist (Wahr) oder nicht (Falsch).
IF var1 THEN
prüft ob var1 ungleich 0 ist (Wahr) oder gleich 0 (Falsch).
Wenn der Ausdruck wahr ist, wird der Programmteil zwischen THEN und ELSE (falls benutzt) oder END_IF ausgeführt. Wenn der Ausdruck falsch ist, wird der otionale Pfad zwischen ELSE und END_IF ausgeführt.
#IF
Der #IF (scharfes IF) Befehl ist eine spezielle Erweiterung gem. IEC 1131-2 strukturierter Text. Er arbeitet wie das Kommando eines 'C' Preprocessor. Der Ausdruck wird verarbeitet und der Ausführungspfad wird während der Kompilierungszeit gewählt. Wegen dieser Einschränkung sollten nur Konfigurationsvariablen (nicht während des Betriebs ändern!) und Konstanten mit dem #IF Befehl verwendet werden.
#IFDEF arbeitet wie ein ‘C’ #ifdef. Der Kompiler prüft, ob die folgende Variable schon definiert ist (wahr) oder nicht (falsch).
WHILE
Die
WHILE ... DO ... END_WHILE ;
Syntax ermöglicht strukturierte Programm - Schleifen. Die Bedingung wird genauso gehandhabt wie beim IF .. THEN Befehl. Schleifen (Rücksprünge) sind nur im Task PLCMAIN erlaubt.
GOTO
Der Befehl GOTO <Marke> erlaubt dem Servoverstärker, das Programm nicht sequentiell abzuarbeiten. Der Befehl zwingt das Programm zu einem Sprung zur Zeile mit der angegebenen Marke. Es ist möglich, rekursive Sprünge und damit Endlosschleifen aufzubauen. Daher ist in keinem Echtzeit Task ein Rücksprung zulässig.
Variablen
Variablen sind Namen, die Datenwerte in Makro Ausdrücken repräsentieren. Der Wert kann der Variable durch Gleichsetzen mit einer Konstanten oder als Ergebnis einer Berechnung zugewiesen werden.
Variablennamen dürfen maximal 10 Zeichen lang sein und nicht identisch mit Makro Befehlen, Operatoren oder Funktionsnamen sein. Für den Namen sind Buchstaben und Zahlen zugelassen, das erste Zeichen muss ein Buchstabe sein. Variablennamen müssen immer mit Großbuchstaben geschrieben werden!
Die Makrosprache bietet verschiedene Variablentypen, die in verschiedenen RAM Bereichen gespeichert werden. Alle Variabeln sind mit Vorzeichen und global gültig (wie bei BASIC). Fließkomma und Array Variablen sind nicht implementiert. Nahezu alle Berechnungen sind mit Vorzeichen zu 32 Bit erweitert und werden mit 32 Bit ausgeführt.
BYTE
Die kleinste Variablentyp ist ein BYTE. Sie kann Werte von –128 to 127 (1 Byte) repräsentieren.
Beispiel:
BYTE VAR1,VAR ;
WORD
Der Typ WORD ist 2 Byte groß und speichert Werte von –32768 bis 32767
Beispiel:
WORD VAR2;
LONG
Der Typ LONG ist 4 Byte groß und speichert Werte von –2147483648 bis 2147483647
Beispiel:
LONG VAR3;
DLONG
Der Typ DLONG ist 8 Byte groß und kann Werte von –263 bis 263 speichern
Beispiel:
DLONG VAR4;
Der Typ DLONG ist keine Standard Variable. Daher können die Standard Ausdrücke und Operationen (siehe nächsten Abschnitt) nicht verwendet werden. Es gibt jedoch einige interne Makrofunktionen, mit denen 64 Bit Variabeln verarbeitet werden können.
Beispiele:
CLRDLONG(Var64); -> Var64 := 0; SETDLONG(Var64_1,Var64_2); -> Var64_1 := Var64_2; ADDDLONG(Var64_1,Var64_2,Var32); -> Var64_1 := Var64_2 + Var32; SUBDLONG(Var64_1,Var64_2,Var32); -> Var64_1 := Var64_2 - Var32;
Vordefinierte Benutzervariablen
16 vordefinierte allgemeine Variablen vom Typ Long können im Programm genutzt werden. Sie können z.B. über RS232 wie alle ASCII Parameter geändert werden, mit dem SAVE Befehl im EEPROM oder in einem Parameterfile gespeichert werden.
| Variablenname | CAN Objekt Nummer | PROFIBUS PNU |
|---|---|---|
| DPRVAR1 | 36A6h oder 2090h Subindex 1 (siehe CANopen Handbuch) | 2022d |
| DPRVAR2 | 36A7h oder 2090h Subindex 2 | 2023d |
| ... | ... | |
| DPRVAR8 | 36ADh oder 2090h Subindex 8 | 2029d |
| DPRVAR9 | 36AEh oder 2030h Subindex 1 (s. CANOpen manual) | 2030d |
| DPRVAR10 | 36AFh oder 2030h Subindex 2 | 2031d |
| ... | ... | ... |
| DPRVAR16 | 36B9h oder 2030h Subindex 8 | 2037d |
Seit Firmware Version 3.62 gibt es 16 zusätzliche Variablen:
| Variablenname | CAN Objekt Nummer | Profibus PNU |
|---|---|---|
| DPV17 | 37BCh | 1900 Index 17 |
| DPV18 | 37BDh | 1901 Index 17 |
| ... | ... | ... |
| DPV32 | 37CBh | 1915 Index 17 |
Zugriff auf ASCII Parameter
Die folgenden Funktionen erlauben Zugriff auf alle ASCII-Parameter und Kommandos. Sie dürfen nur in der MAIN oder INIT Routine verwendet werden, weil sie vergleichsweise viel Zeit brauchen.
// schreibe den Inhalt der Benutzervariablen TEMPVAR1in den ASCII-Parameter MTMUX
XWRITE('MTMUX',TEMPVAR1);
// lese den Wert von PGEARO und speichere ihn in der Benutzervariablen MYPGEARO
XREAD('PGEARO',MYPGEARO);
// erzeuge mit dem Kommando ORDER einen Fahrsatz
COMMAND('ORDER 192 49000 2800 8192 50 50 0 0 0 0');
Ausdrücke und Operationen
Ausdrücke sind formatierte Konstanten, Variablen und/oder Operationen. Ein Ausdruck kann eine einfache Variablenzuweisung sein wie z.B.
var1 := 13 ;
oder eine Kombination von Konstanten, Variablen und Operationen wie
var2 := 2 * var3-var4 ;
Die priorität der Operation bestimmt die Ablaufreihenfolge. Die Priorität kann durch Unterausdrücke in Klammern ( ) überschrieben werden. Der Teil eines Ausdrucks in Klammern wird zunächst zu einemeinzelnen Wert reduziert, bevor die Teile außerhalb der Klammer bearbeitet werden.
var2 := 2 * (var3-var4) ;
Die Hierarchie / Priorität ist gemäß IEC 601131 definiert :
Höchste ()
-(unary), not, bnot
*, /, mod
+, -
>>, <<
>, >=, <, <=
=, <>
&
|
xor
and
or
Niedrigste :=
Arithmetischer Operator/ Umschaltoperator
Der arithmetische Operator definiert eine arithmetische Operation, die an den beiden Operanden auf jeder Seite des Operators durchgeführt wird. Das Minuszeichen kann auch als unäres Minuszeichen benutzt werden (Var 1 = - Var 2;)
+ arithmetische Addition mit Vorzeichen: 32 Bit + 32 Bit = 32 Bit
- arithmetische Subtraktion mit Vorzeichen: 32 Bit + 32 Bit = 32 Bit
* arithmetische Multiplikation mit Vorzeichen: 16 Bit * 16 Bit = 32 Bit
/ arithmetische Division mit Vorzeichen: 32 Bit / 16 Bit = 16 bit
mod arithmetisches Modulo mit Vorzeichen 32 bit / 16 bit = 16 bit
>> arithmetische Verschiebung mit Vorzeichen rechts (jedoch nur mit Konstantenverschiebungen: var1 >> 3)
<< arithmetische Verschiebung mit Vorzeichen links (jedoch nur mit Konstantenverschiebungen: var1 << 2 )
Relationelle Operatoren
Die relationellen Operatoren dienen in erster Linie dazu, die Werte zweier Operanden zu vergleichen, sie liefern jedoch auch ein arithmetisches Ergebnis:
True := -1
False := 0
Die relationellen Operatoren verwenden immer 32 Bit.:
> größer als
< kleiner als
>= größer als oder gleich
<= kleiner als oder gleich
= gleich
<> ungleich
Logische Operatoren
Mit Hilfe der logischen Operatoren kann der relationelle Operator mit einem komplexeren Ausdruck kombiniert werden. Vor der Berechnung werden alle Werte ungleich Null in „true" konvertiert; Null steht für „falsch". Das Ergebnis lautet entweder „true" oder „false". Dies sind die logischen Operatoren:
AND logisches „und"( 1 AND 0 ergibt „false" (=0) )
OR logisches „oder" ( 7 OR 0 ergibt „true" (=-1) )
XOR logisch ausschließendes „oder" ( 8 XOR 1 ergibt „false" (=0) )
NOT logische Negation ( NOT 8 ergibt „false" (=0) )
Binäre Operatoren
Mit Hilfe der binären Operatoren können Bits in einer Variable maskiert werden; sie produzieren aber auch ein arithmetisches Ergebnis von 32 Bit:
& binäres „und" ( 20 & 15 ergibt 4 )
| binäres „oder" ( 20 | 15 ergibt 31 )
^ binäres „exclusiv oderr" ( 20 | 15 ergibt 27 )
bnot binäres „nicht" ( bnot -1 ergibt 0 )
MULDIV - Funktion
Für Multiplikationen und Divisionen von Variablen des Typs Long kann die Funktion MULDIV folgendermaßen benutzt werden:
MULDIV (WERT1,WERT2,WERT3,ERGEBNIS);
Hier wird WERT 1 direkt mit WERT2 multipliziert, das Ergebnis durch WERT 3 dividiert und das Ergebnis in ERGEBNIS eingesetzt.
Ist nur eine Multiplikation notwendig, muss Wert 3 = 1 sein; ist nur eine Division notwendig, muss WERT 2 = 1 sein. Es ist nicht möglich, eine Zahl direkt zu nutzen.
Subroutinen
Subroutinen können auf unterschiedliche Arten aufgerufen werden:
Aufruf einer schnellen MAKRO Subroutine:
LIMITW(OUT ,IN ,MAX ) ;
Dieses Unterprogramm überprüft den Wert der Variablen IN und reduziert ihn auf +/- MAX, falls der Wert größer als MAX ist. Das Ergebnis wird in der Variablen OUT gespeichert. Alle Variablen werden als Pointers (wie in FORTRAN) übermittelt - und das Unterprogramm ist immer zeilenkodiert. Hierdurch wird der Code zwar sehr schnell ausgeführt, aber eine Rekursion ist nicht erlaubt, d. h., das Programm darf sich nicht selbst aufrufen.
Aufrufen eines regulären Unterprogramms:
FUNCTION (CALCOPMODE) ;
Hiermit wird das Unterprogramm CALCOPMODE aufgerufen. Es ist nicht möglich, Parameter zu übermitteln.
Die Sequenz
COMMAND ( OPMODE 0’)
ruft den „ ASCII Servostar Command interpreter " auf, um in den "Opmode 0" umzuschalten. Das zwar der einfachste Weg, um Unterprogramme auszuführen, es ist zugleich aber auch der langsamste. Er sollte nur im Anwendungstask PLCMAIN verwendet werden.
Die Sequenz
LONG YEAR;
YEAR:= 2011 ;
PRINTF (‘Hello world in the year %d\n’,YEAR) ;
funktioniert wie eine Untermenge der ‘C’ printf funktion. Sie erscheint folgendermaßen auf dem Terminal :
Hello world in the year 2011
Zusätzlich zum Kontroll String sind bis zu drei Parametern möglich. Parameter Typ ist LONG. Konstanten und andere Typen werden momentan noch nicht unterstützt. PRINTF sollte nur im Anwendungstask PLCMAIN verwendet werden.
Beschränkungen von Zeit / Leistung
Die Ausführung der PLC - Programme ist abhängig von der Größe und der Zykluszeiten der ausgeführten Routinen. Ist für die Ausführung eines Task mehr als die festgesetzte Zeit erforderlich, wird auf am Servoverstärker ein F 32 - Fehler angezeigt. Die Zeit, die zur Ausführung eines Makro - Programms zur Verfügung steht, kann in den unterschiedlichen FW - Versionen variieren. Sie kann auch abhängig von der Einstellung der Standardvariablen für die Konfiguration von S300/S700 variieren.
Die PLC - Programme werden während der Initialisierungsphase des Antriebs kompiliert.
Die Informationen über den Fortgang der Kompilierung, über Fehler im Programm und über die Größe des Programms über das serielle Interface (Terminal, Parameter MSG=2) angezeigt.
Die Anzahl der für jedes einzelne PLC - Programm angezeigten Zeilen kann dazu benutzt werden, die durch das alle PLC - Programm verursachte Gesamtbelastung des Systems zu berechnen.
| PLC Program | Belastungsfaktor |
|---|---|
| PLC62 | 256*Anzahl der Zeilen |
| PLC250 | 64*Anzahl der Zeilen |
| PLC1 | 16*Anzahl der Zeilen |
| PLC4 | 4*Anzahl der Zeilen |
| PLC16 | 1*Anzahl der Zeilen |
| PLCMAIN | - |
| PLCINIT | - |
Der für den S300/S700 erlaubte Faktor für die Gesamtbelastung beträgt: 100000
Beispiel:
PLC62 (Größe=20)
PLC1 (Größe=1000)
PLC16 (Größe=200)
Der Faktor für die Gesamtbelastung beträgt: 20*256 + 1000*16 + 200 = 21320 ( ist geringer als100000)
Zwar kann die Funktion PLCMAIN die Funktion des Antriebs nicht beeinflussen, ihre Größe definiert jedoch die Zykluszeit der Hauptschleife des PLC. Existiert PLCMAIN, kann die Zeit für dessen Ausführung durch den Befehl TASK kontrolliert werden. Dieser Befehl berechnet, wie oft die PLC - Hauptschleife pro Sekunde ausgeführt wird.
Läuft das Programm PLCMAIN nicht, beträgt der Output des TASK - Befehls: PLC 0
Ist das Programm PLCMAIN nicht im PLC - Segment enthalten, liefert der TASK - Befehl keine Informationen über dieses Programm.
Die Größe der PLCINIT Funktion beeinflusst die Funktion des Antriebs nicht . Diese Funktion wird direkt vor der Aktivierung anderer PLC - Programme aktiviert (nach dem Befehl PLCSTART). Deshalb verzögert die Zeit, die zur Ausführung der PLCINIT - Funktion benötigt wird, den Start der anderen PLC - Programme.
Back to topBefehle und Funktionen
- Functionen für Bewegung
- Functionen für Ein- / Ausgänge
- Functionen für Laufzeitumgebung
- Functionen für Programmierungebung
- Functionen für Mehrachssysteme (CANopen)
- Functionen für Latchen
Startseite >
Knowledge Base >
FAQs nach Themen >
Downloads >