MPS50 04
MPS50 04
41
Instruktionen MPL 50
Inhalt
Einführung...................................................................... 3
Instruktionsformate .................................................... 3
Syntaxregeln............................................................... 4
Zustandsflags ............................................................. 4
Arithmetikinstruktionen ................................................. 5
Arithmetikinstruktionen für Integerzahlen................. 5
Arithmetikinstruktionen für Floatingpointzahlen ...... 7
Trigonometrische Instruktionen ................................. 8
Arithmetische Hilfsinstruktionen ............................... 9
Konversionsinstruktionen .......................................... 10
Vergleichs- und Datentransportinstruktionen ................ 11
Vergleichsinstruktionen ............................................. 11
Datentransportinstruktionen....................................... 14
Logikinstruktionen ......................................................... 16
Programmsteuerinstruktionen ........................................ 17
Sprunginstruktionen ................................................... 17
Bedingte Warteinstruktion ......................................... 18
Bedingte Instruktionsausführung ............................... 18
Aufruf von Simultanprogrammen (Multitasking)...... 21
Aufruf von Unterprogrammen und Prozeduren ......... 23
Kommunikationsinstruktionen....................................... 27
Dateneingabe über RS 232C ...................................... 27
Datenausgabe über RS 232C...................................... 28
Kommunikations-Steuerflags..................................... 32
CIB-Flag................................................................. 32
ECHO-Flag ............................................................ 32
Variable KCOD...................................................... 32
Lesen aus dem FIFO-Buffer der RS 232C................. 34
Instruktionen zum Einlesen in den Linebuffer........... 37
Datenübertragungs-Instruktionen............................... 40
Sonderinstruktionen ....................................................... 44
Adressen von Variablen ............................................. 44
NOP-Instruktion......................................................... 44
Umschaltung der Baud-Rate ...................................... 45
Ein/Ausgabe des gesamten ASCII-Zeichensatzes ..... 46
Positionierinstruktionen ................................................. 47
Einführung ................................................................. 47
Positionierdistanz ....................................................... 48
Geschwindigkeiten..................................................... 49
Rampen ...................................................................... 52
Die Positionierinstruktionen ...................................... 55
Starten von Endlosbewegungen ................................. 56
Polygon-Interpolation .................................................... 57
Steuersignale für die Polygon-Interpolation .............. 59
Interpolationsinstruktionen ........................................ 60
Compileranweisungen im Programm............................. 66
END-Anweisung ........................................................ 66
INCLUDE-Anweisung............................................... 67
PATH-Anweisung...................................................... 68
RAM / ROM-Anweisungen ....................................... 68
ORIGIN-Anweisung .................................................. 69
MOD-Anweisung....................................................... 70
Anweisungen für die Variablendefinition.................. 70
LISTOFF / LISTON-Anweisungen ........................... 70
Programmausführungszeiten.......................................... 71
HEX-Adressen von Systemvariablen............................. 73
Instruktionsformate
Es werden folgende Instruktionsformate unterschieden:
Instruktion: Parameter:
OPERATION ZIELOPERAND1, ZIELOPERAND2, QUELLENOPERAND1,
QUELLENOPERAND2
OPERATION ZIELOPERAND, QUELLENOPERAND1, QUELLENOPERAND2
OPERATION ZIELOPERAND, QUELLENOPERAND
OPERATION ZIELOPERAND
Im ZIELOPERAND wird stets das Resultat der ausgeführten Operation gespeichert. Der
Inhalt von QUELLENOPERAND1 und QUELLENOPERAND2 wird durch die Operati-
on verarbeitet. Die Quellenoperanden werden durch die Ausführung der Operation nicht
verändert!
Wird nur der ZIELOPERAND angegeben, stellt dieser zugleich Quellen- und Zielope-
rand dar.
Beispiel:
IADD VAR1,VAR2,VAR3
Die Operation IADD bewirkt die Addition von zwei Integerzahlen.
Die Inhalte der Quellenoperanden VAR2 und VAR3 werden addiert.
Die Summe von VAR2 und VAR3 wird in den Zieloperanden VAR1 gespeichert.
Syntaxregeln
Folgende Syntaxregeln sind zu beachten:
• Zwischen Operation und Operand muß mindestens 1 Leerschlag stehen.
• Operanden werden untereinander durch Komma getrennt.
• Variablennamen dürfen keine Sonderzeichen enthalten.
• Variablennamen müssen mit einem Buchstaben beginnen.
• Bei der Definition einer Variablen muß ein Anfangswert oder ein ? angegeben werden.
• Kleinbuchstaben sind nur für Variablennamen und Labels zulässig.
• Pro Instruktion lassen sich nur Daten vom selben Typ miteinander verarbeiten.
• Vor und nach Compileranweisungen dürfen keine Labels oder Instruktionen stehen.
Zustandsflags
Durch die Ausführung einer MPL 50-Instruktion werden 4 verschiedene Zustandsflags
beeinflußt:
Flag: Syntax: Zustand:
Zeroflag ZF (aktiv wenn Resultat einer Instruktion=0)
Signflag SF (aktiv wenn Vorzeichen eines Resultates negativ)
Oddflag ODF (aktiv wenn Resultat eine ungerade Zahl ist)
Overflowflag OVF (aktiv wenn Resultat mehr Bytes umfaßt als für den
Zieloperanden vereinbart sind)
Diese Flag lassen sich mittels Logik- oder Programmsteuer-Instruktionen zur Beeinflus-
sung des Programmablaufs abfragen.
Arithmetikinstruktionen
Die Arithmetikinstruktionen bestehen aus den 4 Grundrechenarten Addition, Subtraktion,
Multiplikation und Division. Es werden die Datentypen Integer und Floatingpoint unter-
schieden.
Als Kurzbezeichnung der einzelnen Operanden in den Instruktionen werden folgende
Ausdrücke verwendet:
Operand: Kurzbezeichnung:
ZIELOPERAND: DOP
QUELLENOPERAND1: SOP1
QUELLENOPERAND2: SOP2
Hinweis: Der vereinbarte Datentyp des Zieloperanden (I1 ... I4) sollte demjenigen
des Quellenoperanden entsprechen. Andernfalls ist es möglich, daß Re-
chenresultate nur teilweise richtig weiterverarbeitet werden.
Ist nur ein Resultat von IDIV von Interesse, muß der andere Destinationsoperand DOP als
* angegeben werden.
Beispiele:
IADD VAR1,VAR2,VAR3 Die Inhalte von VAR2 und VAR3 werden addiert und
die Summe in VAR1 gespeichert.
ISUB VAR1,20,8 Die Konstante 8 wird von 20 subtrahiert und die
Differenz wird in VAR1 gespeichert.
IMUL VAR1,VAR1,2 Der Inhalt von VAR1 wird mit 2 multipliziert und das
Produkt wird wieder in VAR1 gespeichert.
IADD VARX,VARY Zum Inhalt VARX wird VARY dazu addiert.
IDIV RA,RB,17,5 RA enthält das Resultat der Division 17/5 = 3. RB
zeigt das Resultat der Modulo-Division 17/5 = 2
(Rest der Division)
IDIV RESULTAT,*,100,5 In RESULTAT wird das Ergebnis der Division
100/5 = 20 gespeichert.
Beispiele:
FADD RA,VAR1,25.75 Die Konstante 25.75 wird zum Inhalt von VAR1
addiert und die Summe im Rechenregister RA gespeichert.
FDIV RA,FELD(10),RB Der Inhalt des 10. Elements aus dem Variablenfeld FELD
wird durch den Inhalt des Rechenregisters RB dividiert.
Der Quotient wird im Rechenregister RA gespeichert.
SQU RA,5.0 Das Quadrat von 5.0 (= 25.0) wird in
Rechenregister RA gespeichert.
SQR VAR1,FELD(RA) Im Variablenfeld FELD wird durch den Inhalt des
Rechenregisters RA ein bestimmtes Element indexiert
und aus dessen Inhalt die Quadratwurzel gezogen.
Das Resultat wird in der Variablen VAR1 gespeichert.
Trigonometrische Instruktionen
Die trigonometrischen Instruktionen werden ausschließlich mit Daten vom Typ Floating-
point ausgeführt. Die Instruktionen werden aus Operation, Zieloperand und Quellenope-
rand gebildet. Die Angabe des Zieloperanden ist nicht zwingend.
Durch Setzen des Flags RAD (log. 1) werden die Instruktionen in Radiant ausgeführt.
Durch Rücksetzen dieses Flags (log. 0) wird in Grad gerechnet.
Beispiele:
SIN RA,VAR1 Der Sinuswert des in VAR1 enthaltenen Winkels wird
im Rechenregister RA gespeichert.
COS RB,60.0 Der Cosinuswert (0.5) von 60.0 Grad
(RAD-Flag = 0) wird in RB gespeichert.
Arithmetische Hilfsinstruktionen
Die arithmetischen Hilfsinstruktionen werden aus Operation und einem Quellenoperan-
den sowie dem nicht zwingend notwendigen Zieloperanden gebildet.
Beispiele:
CPL RA,7 Im Rechenregister RA wird das binäre
Komplement von 7 (= -8) gespeichert.
INC RA,125 Im Rechenregister RA wird 125 + 1= 126
gespeichert.
DEC VAR3 Der Inhalt von VAR3 wird um 1
dekrementiert.
INV RA,3.0 Im Rechenregister RA wird 1.0 / 3.0 = 0.3
gespeichert.
Konversionsinstruktionen
Die Konversionsinstruktionen dienen zum Umwandeln von Integer- in Floatingpointzah-
len und umgekehrt. Die Instruktionen bestehen aus Operation und Quellenoperand sowie
dem nicht zwingend notwendigen Zieloperand.
Konversion: Syntax:
Integer in Floatingpoint CFLO DOP,SOP
Floatingpoint in Integer: Ohne Rundung CINT DOP,SOP
Mit Rundung CINR DOP,SOP
Bei CINT gehen die Stellen nach dem Komma verloren. Bei CINR werden Kommastellen
ab 0.5 auf die nächste ganze Zahl aufgerundet.
Beispiele:
CFLO RA,10 In RA steht 10.0
CINT RA,15.6 In RA steht 15
CINR RA,15.6 In RA steht 16
CINR RA,13.4576 In RA steht 13
Vergleichs- und
Datentransportinstruktionen
Vergleichsinstruktionen
Die Vergleichsinstruktionen dienen zum Vergleichen von alphanumerischen mit numeri-
schen Daten. Für numerische Daten sind folgende Vergleiche realisierbar:
• Größer
• Kleiner
• Gleich
• Grenzwert
Alphanumerische Daten können nur auf Gleichheit geprüft werden. Das Vergleichsresul-
tat läßt sich durch logische Verarbeitung von Zeroflag ZF und dem Signflag SF, oder
durch Anwendung der bedingten Programmsteuerinstruktionen auswerten.
Grösser/Kleiner/Gleich-Vergleich:
Vergleich von: Syntax:
Integerzahlen ICMP SOP1,SOP2
Floatingpointzahlen FCMP SOP1,SOP2
Beispiel:
ICMP VAR1,15 Wenn der Inhalt von VAR1:
gleich 15, dann ZF=1 und SF = 0
kleiner 15, dann ZF=0 und SF = 1
grösser 15, dann ZF=0 und SF = 0
Grenzwert-Vergleich
Instruktion: Syntax:
Grenzwert-Vergleich
Integerzahlen ICMP SOP1,SOP2,SOP3
Grenzwert-Vergleich
Floatingzahlen FCMP SOP1,SOP2,SOP3
Wenn der Wert von SOP1 innerhalb der in SOP2 und SOP3 enthaltenen Grenzwerte liegt,
so wird das Zeroflag ZF aktiv. Vergleiche auf grösser (>) oder kleiner (<) sind nicht vor-
gesehen.
Es gilt:
SOP2 ≤ SOP1 ≤ SOP3 => ZF=1
SOP3 < SOP1 < SOP2 => ZF=0
Beispiel:
FCMP RA,12.5,30.0 Das Zeroflag wird aktiv, wenn der Inhalt des
Rechner-Registers RA zwischen 12.5 und 30.0 liegt.
Instruktion: Syntax:
Vergleich von Stringvariablen SCMP SOP1,SOP2
Diese Instruktion vergleicht zwei Strings und setzt das Zeroflag ZF im Falle von Gleich-
heit. Die beiden Stringvariablen SOP1 und SOP2 müssen dieselbe Anzahl Zeichen ent-
halten.
Der Vergleich auf Grösser / Kleiner und der Vergleich mit einer Stringkonstanten ist nicht
vorgesehen.
Beispiel:
EINGABE_STRING: DSTR <' '>
VERGLEICH_STRING: DSTR <'SELEDATA'>
JMP BEGIN
MOD 2
END BEGIN
Datentransportinstruktionen
Die Datentransportinstruktionen dienen zum Verschieben von Daten innerhalb von Va-
riablen, Variablenfeldern, Rechenregistern usw.
Hinweis: Die Zustandsflags (SF,ZF) werden durch diese Instruktionen nicht verän-
dert.
Die Befehle MOV und XCHG sind für Daten vom Typ Integer, Floatingpoint, Ordinal
und Bool'sch ausführbar.
Die ROT-Instruktion ermöglicht das Verschieben eines Datenwertes aus dem Quellen-
operanden SOP um eine definierbare Anzahl Bits. Der rotierte Datenwert wird in den
Zieloperanden DOP gespeichert, der Quellenoperand SOP bleibt unverändert.
Die Angabe eines Zieloperanden DOP ist optional. Wird nur der Quellenoperand SOP an-
gegeben, erfolgt die Bitrotation innerhalb desselben.
N gibt an, um wieviele Bits rotiert wird. Das Vorzeichen von N legt die Rotationsrichtung
fest:
• +N bedeutet Linksrotation
• -N bedeutet Rechtsrotation
Die Operation ROT1 verschiebt nur den Datenwert innerhalb vom niederwertigsten Byte
des Quellenoperanden SOP.
Die Operation ROT2 verschiebt innerhalb der 2 niederwertigsten Bytes, ROT3 innerhalb
von 3 Bytes usw.
Je nach angewendeter Operation gibt es für N bestimmte Maximalwerte zu beachten:
Operation: Maximalwerte N:
ROT1 -7 ... +7
ROT2 -15 ... +15
ROT3 -23 ... +23
ROT4 -31 ... +31
Die XFER-Instruktion dient zum Verschieben von Daten von einem Variablenfeld ins an-
dere. Dabei dürfen sich die beiden Variablenfelder überlappen, wodurch sich Einfügen-
und Entfernenfunktionen einfach realisieren lassen.
Beispiel:
Einfügen eines Wertes an 9. Stelle in einem Variablenfeld
ARRAY: DF 20 DUP ?
INSERT: XFER ARRAY(10), ARRAY(9), 10
MOV ARRAY(9), 2.5
Logikinstruktionen
Für die Ausführung von logischen Funktionen dienen die Logikinstruktionen. Sie ermög-
lichen Abfrage, logische Verknüpfung und Zuweisung von Bool'schen Datentypen.
Die logischen Verknüpfungen sind auch für Bytes anwendbar.
Die Zuweisung eines Bool'schen Operanden entsprechend dem Resultat einer Verknüp-
fung kann auch mit der Instruktion MOV erfolgen.
Die invertierte Abfrage von Bool'schen Operanden erfolgt durch Voranstellen des Zei-
chens /.
Für Byteoperationen ist die Anwendung des Invertierungszeichens / nicht zulässig!
Beispiele:
AND OUT(0),IN(0),/IN(1) Der Ausgang OUT(0) wird aktiv wenn der
Eingang IN(0) aktiv und IN(1) inaktiv ist.
AND FLG(1),IN(0),IN(1) Der Ausgang OUT(0) wird aktiv
AND FLG(2),IN(2),IN(3) wenn die Eingänge IN(0) und
OR OUT(0),FLG(1),FLG(2) IN(1), oder wenn die Eingänge IN(2) und
IN(3) aktiv sind
BYTE_1: DO1 7
BYTE_2: DO1 9
START : AND RA, BYTE_1, BYTE_2 RA wird zu 1
(Bitweise UND-Verknüpfung von
00000111 und 00001001)
Programmsteuerinstruktionen
Ein MPL 50-Programm arbeitet grundsätzlich sequentiell. Das bedeutet, dass eine In-
struktion erst bearbeitet wird, wenn die vorangehende zu Ende geführt ist. Damit nun Pro-
grammverzweigungen, Unterprogramme und parallele Abläufe realisiert werden können,
stehen eine Reihe von komfortablen Programmsteuerinstruktionen zur Verfügung.
Sprunginstruktionen
Es werden zwei Arten Sprünge unterschieden: • Unbedingte Sprünge
• Bedingte Sprünge
Nach einem unbedingten Sprung verzweigt das Programm in jedem Fall zum angegebe-
nen Ziel.
Nach einem bedingten Sprung verzweigt das Programm nur zum angegebenen Ziel, wenn
die Sprungbedingung erfüllt ist. Andernfalls werden die direkt nachfolgenden Instruktio-
nen ausgeführt. Als Sprungbedingung wird immer ein logisches Zustandsflag untersucht,
wie z.B. das Zeroflag ZF oder das Signflag SF.
Bedingte Warteinstruktion
Die bedingte Warteinstruktion ermöglicht das Anhalten der Programmausführung solan-
ge eine gewünschte Bedingung erfüllt ist.
Instruktion: Syntax: Operation:
Wartefunktion W*** VARC Programmausführung anhalten,
wenn Bedingung *** für die
untersuchte Variable VARC
erfüllt ist.
Beispiel:
WT IN(0) Programmausführung anhalten, wenn Eingang IN(0)
logisch 1 (TRUE) ist.
Bedingte Instruktionsausführung
Diese Instruktion ermöglicht es, die Ausführung einer Instruktion von einer Bedingung
abhängig zu machen.
Hinweis: Ist die bedingt ausgeführte Instruktion ein Unterprogramm- oder ein Pro-
zeduraufruf, so muss dieser mittels CALL erfolgen.
Beispiel 1:
IFOD RA INC RB Wenn RA ungerade ist, dann inkrementiere RB
Beispiel 2:
In einem MPL Programm gibt es 3 Programmblöcke: A, B und C.
Durch Eingabe von 0,1 oder 2 wird einer dieser Blöcke angesprungen. Das jeweilige
Sprungziel ist in einer Sprungtabelle gespeichert.
SPRUNGTAB: DO 2 3 DUP 0
A: ...
JMP START
B: ...
JMP START
C: ...
JMP START
Nach Arithmetikinstruktionen:
.Z wenn Null (ZF=1)
.NZ wenn nicht Null (ZF=0)
.M wenn Minus (negativ) (SF=1)
.P wenn Plus (positiv) (ZF v /SF = 1)
.OD wenn ungerade (ODF=1)
.EV wenn gerade (ODF=0)
.OV(*) wenn Ueberlauf (OVF=1)
.NOV(*) wenn kein Ueberlauf (OVF=0)
Nach Logikinstruktionen:
.T wenn wahr (log. 1) (ODF=1)
.F wenn nicht wahr (log. 0) (ODF=0)
Nach Prozeduraufruf:
.PAR wenn Parameter vorhanden
.NPAR wenn kein Parameter vorhanden
.PH wenn Scheinparameter (*) vorhanden
.NPH wenn kein Scheinparameter (*) vorhanden
*) Für diese Bedingungen ist die Angabe einer Variablen VARC nicht vorgesehen
Beispiele:
JMP START Unbedingter Sprung zum Label START
JT IN(0),PROGRAMM1 Sprung zum Label PROGRAMM1 wenn Eingang IN(0)
aktiv.
ICMP RA,15 Vergleich Rechenregister RA mit 15.
JLT RA_KLEIN Wenn RA kleiner 15,
ICMP RA,15 dann Sprung zum Label RA_KLEIN, wenn RA grösser JGT
RA_GROSS 15, dann Sprung zum Label RA_GROSS.
Syntax: Parameter:
ASIM n , LABEL n (0 ... 7) LABEL zeigt Programmbeginn
ASIM n , VAR n (0 ... 7) Inhalt von VAR zeigt
Programmbeginn.
Durch Abfrage der Variablen PNB kann ermittelt werden, in welchem Simultanpro-
gramm man sich befindet. Die Variable PNB ist besonders beim Aufbau von Prozeduren
wichtig, die gleichzeitig von verschiedenen Simultanprogrammen aus aufgerufen werden.
In diesen Fällen empfiehlt sich die Indexierung prozedurinterner Variablen mit PNB. Da-
mit ist sichergestellt, dass jedes Simultanprogramm seinen eigenen, geschützten Datenbe-
reich erhält.
Die Instruktion PSIM gibt dem ausführenden Task höchste Priorität und hält damit die
Ausführung aller übrigen Tasks an, bis die Instruktion RSIM ausgeführt wird. Damit ist
es möglich, exklusive Ausschlüsse von kritischen Programm- oder Datenregionen wie
beispielsweise den Eintrag in eine FIFO zu realisieren.
Nach RSIM werden wieder alle Tasks gleichwertig parallel bearbeitet.
Hinweis: Nach PSIM sollte die Reaktivierung von parallelen Tasks nicht mit
ASIM erzwungen werden.
Instruktion: Syntax:
Unterprogrammaufruf (CALL) LABEL
Sämtliche Regeln für die Verarbeitung eines Unterprogrammes gelten ebenfalls für Pro-
zeduren. Neben dem Prozedurnamen (LABEL) lassen sich jedoch noch eine beliebige
Anzahl von PARAMETERN angeben, die die Eingangsdaten und Ausgangsdaten für die
Bearbeitung des Prozedurprogrammes darstellen.
Wichtige Eigenschaft der Programmiersprache MPL 50 ist die Möglichkeit, eine Proze-
dur gleichzeitig von mehreren Simultanprogrammen aus aufzurufen.
Instruktion: Syntax:
Prozeduraufruf PROZEDURNAME PARAMETER0, PARA-
METER1, ..., PARAMETERn
Es lassen sich insgesamt 256 formale Parameter [%(0) ... %(255)] direkt definieren.
Bei der Verwendung von RETJ ist darauf zu achten, dass keine unübersichtlichen Pro-
grammstrukturen entstehen!
Beispiel:
Es soll eine Prozedur für einen Blinker programmiert werden. Als Parameter sollen ein
Eingangssignal, die Blinkzeit in Sekunden und ein Ausgangssignal angegeben werden.
Prozedur:
;Prozeduraufruf mit Eingang 0, Blinkzeit 0,5 sec und Ausgang 0.
;Hauptprogramm
START: BLINKER IN(0),0.5,OUT(0)
;Verzweigung ins
JMP START ;Prozedurprogramm
;Prozedurprogramm
BLINKER: IFF %(0) RET ;Rücksprung ins Hauptprogramm wenn
;Steuereingang false
FMUL RA,%(1),1000.0 ;Zeit in Millisekunden
CINR RA
LOOP: MOV TMR(PNB),RA ;Timerindex = Simultan-
;programm-Nummer
SET TAF(PNB) ;Start Blinkzeit ein
WT TAF (PNB) ;Warten bis Zeit abgelaufen
SET %(2) ;Set Ausgang
MOV TMR(PNB),RA
SET TAF(PNB) ;Start Blinkzeit aus
WT TAF (PNB)
RES %(2) ;Reset Ausgang
JT %(0),LOOP ;Sprung nach LOOP wenn
;Steuereingang = TRUE
RET ;Rücksprung ins Hauptprogramm
END START
Kommunikationsinstruktionen
SELEDATA® MPL 50 bietet eine Reihe von komfortablen Kommunikations-instruktio-
nen. Als Kommunikationskanal dient immer die RS 232C Schnittstelle.
Instruktion: Syntax:
Eingabe Integer- oder
Ordinalzahl IINP DOP
Eingabe Floatingpointzahl FINP DOP
Eingabe String STINP DOP
Diese Instruktion dient vor allem zur Verarbeitung von Steuersignalen, die über die seri-
elle Schnittstelle empfangen werden. Die nächste Instruktion nach KINP wird ausgeführt,
sobald ein Zeichen über RS 232C empfangen worden ist.
Beispiele:
FINP VAR1 Die über RS 232C gesendete Floatingpointzahl wird in
die Variable VAR1 gespeichert.
KINP RA ASCII-Zeichen in Rechenregister RA speichern und
ICMP RA, "M" mit ASCII-Zeichen M vergleichen.
Instruktion: Syntax:
Ausgabe Integerzahl IPR SOP
Ausgabe Floatingpointzahl FPR SOP
Ausgabe String STPR SOP
Ausgabe Steuerzeichen KPR SOP,SOP2,SOPn
Der Quellenoperand SOP kann entweder als Konstante oder als Variable angegeben wer-
den.
Beispiele:
IPR PABS(0) Ausgabe der Absolutposition der
Achse 0 in Schritten.
STPR <"GUTEN TAG",$D,$A> Ausgabe des Text GUTEN TAG.
Die hexadezimalen Zeichen D und A bewirken
Carriage Return und Line Feed.
Die nächste Daten-Ausgabe wird am Anfang
der nächsten Zeile beginnen.
KPR $D Ausgabe des ASCII-Zeichen CR.
Die Printmode-Variablen
Die Printmode-Variablen dienen zur Festlegung des Formats von Zahlen ,welche über RS
232C ausgegeben werden. Es wird zwischen Printmodevariablen für Integerzahlen (PMI)
und für Floatingpointzahlen [PMF(0),PMF(1)] unterschieden. Die einzelnen Variablen
haben folgende Bedeutung:
PMI = 0:
Die übertragene Integerzahl wird auf der angeschlossenen Anzeige unmittelbar rechts von
der letzten Cursorposition dargestellt (Linksbündige Darstellung). Die erste Stelle ist stets
für das Vorzeichen reserviert, wobei nur das negative Vorzeichen angezeigt wird.
Beispiele:
Übertragene Zahlen: -1, 10, -200, 1000
Printmode Variable:
Programm: MOV PMI,0 Darstellung:
IPR -1 -1
IPR 10 10
IPR -200 -200
IPR 1000 1000
Printmode Variable:
Programm: MOV PMI,4 Darstellung:
IPR -1 -1
IPR 10 10
IPR -200 -200
IPR 1000 1000
PMF(0) = 0:
Die übertragene Floatingpointzahl wird in wissenschaftlicher Schreibweise mit 6 Nach-
kommastellen dargestellt.
PMF(1) = n :
Die übertragenen Floatingpointzahl wird mit n Nachkommastellen dargestellt.
Beispiele:
Übertragene Zahlen: 100.75 , 0.123456
Printmode Variablen:
Programm: MOV PMF(0),0 ;Vorkomma-Stellen
FPR 100.75
FPR 0.123456
Darstellung: 1.007500E02
1.234560E-01
Printmode Variablen:
Programm: MOV PMF(0),3 ;Vorkomma-Stellen
MOV PMF(1),4 ;Nachkomma-Stellen
FPR 100.75
FPR 0.1234
Darstellung: 100.7500
0.1234
Kommunikations-Steuerflags
CIB-Flag
Der Default-Wert des CIB-Flags ist TRUE (log. 1). Dadurch wird unmittelbar vor jeder
INP-Instruktion der FIFO-Buffer der seriellen Schnittstelle gelöscht. PCC 50 liest also
nur jene Zeichen, die zeitlich gesehen nach Beginn der Ausführung einer INP-Instruktion
ankommen.
Wird das CIB-Flag auf FALSE (log. 0) gesetzt, erfolgt kein löschen des FIFO-Buffers.
Dadurch gehen also jene Zeichen nicht verloren, welche nach dem letzten Carriage Return
und vor Beginn der Ausführung einer INP- Instruktion gesendet worden sind. Diese Ei-
genschaft ist vor allem bei automatischem Datenaustausch mit übergeordneten Rechner-
systemen von grossem Vorteil.
ECHO-Flag
Der Default-Wert der ECHO-Flags ist TRUE (log. 1). Bei der Ausführung einer INP-In-
struktion bewirkt dies ein Zurücksenden der angekommenen Zeichen zum Sender.
(Ausnahme: KINP kennt kein ECHO!) Vor allem beim automatischen Datenaustausch
mit übergeordneten Systemen ist dieser ECHO-Betrieb unerwünscht und lässt sich des-
halb durch Rücksetzen des ECHO-Flags auf FALSE (log. 0) ausschalten.
Variable KCOD
KCOD ist eine vorgegebene, numerische Variable vom Typ Ordinal 1Byte und enthält
stets das letzte Zeichen, das über die serielle Schnittstelle angekommen ist. KCOD kann
als Operand in allen Instruktionen auftreten, welche für Operationen mit Ordinalzahlen
vorgesehen sind.
Damit kann ohne Umweg über INP-Instruktionen direkt auf diese Variable zugegriffen
werden.
Anwendungsfälle ergeben sich, wenn beispielsweise Steuerzeichen gelesen werden müs-
sen, während das System eine Print-Instruktion (STPR,FPR,IPR,KPR) ausführt und somit
die serielle Schnittstelle für eine INP-Instruktion gesperrt ist.
Beispiel:
Eine Achse soll im Handbetrieb bewegt werden. Die Steuerzeichen "V" = Vorwärts, "R"
= Rückwärts und "S" = Stop sind über ein Terminal einzugeben. Auf dem Display soll die
aktuelle Position der Achse laufend angezeigt werden.
;Symboldefinitionen:
X = 0
VOR = FLG(0)
RUECK = FLG(1)
START: INITAB 0,0,100,75,75,500,25.0,2000.0
ASIM 1,BEWEGUNG
ASIM 2,ANZEIGE
MOV PMI,7
;Motorbewegungen:
BEWEGUNG:JOGP X,VOR ;Handbetrieb vorwärts
JOGN X,RUECK ;Handbetrieb rückwärts
JMP BEWEGUNG
;Positionsanzeige:
ANZEIGE: IPR PABS(X) ;Anzeige der Absolutposition
KPR $D ;Cursor auf Zeilenanfang (CR)
JMP ANZEIGE
INCL (INITAB.PR4)
INCL (JOGP.PR4)
INCL (JOGN.PR4)
MOD2
END START
Hinweis: Die Anwendung der folgenden Instruktionen ist nur sinnvoll wenn das
CIB-Flag FALSE (log.0) ist!
Instruktion: Syntax:
Lesezeiger dekrementieren POPK
POPK dekrementiert den Lesezeiger auf die FIFO. Damit wird es möglich, ein ankom-
mendes Zeichen mit KINP zu lesen, zu analysieren und zu entscheiden, von welcher Art
die Eingabe ist (z.B. Zahl oder Buchstabe), ohne dass dieses erste Zeichen verloren geht.
Beispiel:
NUMERIC: DI4 0
STRING: DSTR <' '>
START: KINP RA
ICMP RA,'0','9'
JE ZAHL
ICMP RA,'A','Z'
JE GROSSBUCHSTABE
JMP START
ZAHL: POPK ;Schon gelesenes Zeichen
;wieder zugänglich machen
IINP NUMERIC ;Zahl lesen
GROSSBUCHSTABE: POPK
STINP STRING ;String lesen
.....
Instruktion: Syntax:
Zeichen lesen ohne
inkrementieren des
Lesezeigers KVINP DOP
KVINP liest das Zeichen aus der FIFO, auf welches der Lesezeiger zeigt, ohne diesen zu
inkrementieren. Falls der Lese- und der Schreibzeiger der FIFO gleich sind, wird die Pro-
grammausführung angehalten bis ein Zeichen eingegeben wird.
Instruktion: Syntax:
Zeichenvorrat in der
FIFO ermitteln SINP DOP
SINP ermittelt den Zeichenvorrat in der FIFO oder anders ausgedrückt, die Differenz zwi-
schen Lese- und Schreibzeiger.
Beispiel:
POS,1, 100.0
POS 1 100.0
POS 1 100.0
Die Separatoren werden im Linebuffer gespeichert aber durch die Leseinstruktionen igno-
riert.
Durch ein ankommendes CR-Zeichen ($D) wird der Lesevorgang beendet und ein Flag
LNF gesetzt.
In einem gemischten String können sich auch Kommentare befinden. Zu diesem Zweck
werden Zeichen nach einem Semikolon [;] ignoriert.
Instruktion: Syntax:
Initialisierung des Buffers
und der FIFO CLINP - Löscht den Linebuffer UND
die FIFO(!) der RS 232C.
- Setzt die Anzahl Zeichen im
Linebuffer ([Link] $FF00)
auf 0.
- Setzt das Flag LNF auf TRUE
(log.1).
Instruktion: Syntax:
Start des Lesevorgangs
in den Buffer LINP - Startet den Lesevorgang.
- Setzt die Anzahl Zeichen im
Linebuffer ([Link] $FF00)
auf 0.
- Setzt des Flag LNF auf
FALSE (log.0).
Die Instruktion LINP startet den Lesevorgang ohne dessen Ende abzuwarten.
Der Lesevorgang kann als beendet und damit die Daten im Linebuffer als gültig betrachtet
werden, sobald das Flag LNF = TRUE (log.1) ist. Dies ist der Fall, sobald die Datenüber-
tragung mit CR (ASCII 13) abgeschlossen wird.
Instruktion: Syntax:
Auslesen String STXINP DOP,(Elementnummer)
Auslesen Integer-Zahl IXINP DOP,(Elementnummer)
Auslesen Floatingpoint-Zahl FXINP DOP,(Elementnummer)
Mit Elementnummer kann exakt definiert werden, welches Element aus dem Linebuffer
gelesen werden soll. Ohne Angabe von Elementnummer wird immer das nächst folgende
Element gelesen.
Wird ein Element ausgelesen, für welches sich keine Werte mehr im Linebuffer befinden,
wird das Overflowflag OVF gesetzt.
Beispiel:
Übertragener String von übergeordnetem System:
POS X, 250.75, Y, 10.31, 200, , , , ;Positionieren [CR]
0 1 2 3 4 5 6 7 8 ;Element-Nr
Durch folgende Programmsequenz lässt sich dieser gemischte String aus dem Linebuffer
auslesen:
;Variablen
BEFEHL: DSTR <' '>
ACHSE: DSTR 2 DUP <' '>
KOORDINATE: DF 2 DUP 0.0
VORSCHUB: DO1 0
Datenübertragungs-Instruktionen
MPS 50 bietet die Möglichkeit, bis zu 15 Systeme miteinander über die RS 232-Schnitt-
stelle zu vernetzen und Daten auszutauschen. Jedes MPS 50-System erhält seine indivi-
duelle Modulnummer (1 ... 15), welche eine direkte Kommunikation zwischen dem
Master-System und einem einzelnen Slave ermöglicht.
Die Modulnummer 0 erlaubt eine gleichzeitige Übertragung von Daten vom Master zu al-
len Slaves (nur Senden).
Folgende Punkte sind bei der Daten Übertragung in einem Netz von MPS 50-Systemen
zu beachten:
• Ein Kommunikationsnetz besteht immer aus einem übergeordneten Mastersystem und
max. 14 untergeordneten Slavesystemen
• Jedes System muss eine Modulnummer zwischen 1 und 15 haben.
• Das Senden und Empfangen von Daten sollte nur vom Mastersystem gesteuert werden
um Übertragungskonflikte zu vermeiden.
• Es können ausschliesslich numerische Daten vom Typ Floatingpoint, Integer oder
Ordinal übertragen werden.
• Der Inhalt der Rechenregister RA ... RF sowie der Variablen PNB kann nicht direkt
übertragen werden.
Diese Art der Vernetzung eignet sich nur dort, wo die Systeme nahe beieinander liegen
und die Umgebung frei von elektrischen Störungen ist.
In einem industriellen Umfeld wird für solche Zwecke mit Vorteil der Kommunikations-
controller TCC 50 eingesetzt. Dieser ermöglicht die Vernetzung über Intel-BITBUS mit
anderen MPS-Steuerungen, speicherprogrammierbaren Steuerungen SELECONTROL®
PMC 20,30 und 40 sowie mit verschiedenen handelsüblichen Steuer- und Rechnersyste-
men.
Instruktion: Syntax:
Daten senden von Master zu Slave TX M,DOPSLAVE, SOPMASTER
Der Inhalt von SOP im Master wird in DOP im Slave mit Modulnummer M übertragen.
Ist M = 0 wird der Inhalt von SOP in DOP von sämtlichen Slaves übertragen.
Instruktion: Syntax:
Daten empfangen in Master von Slave RX DOPMASTER,M,SOPSLAVE
Der Inhalt von SOP im Slave mit Modulnummer M wird in DOP im Master übertragen.
M = 0 ist für die Instruktion RX unzulässig.
Falls die Slaveoperanden DOPSLAVE oder SOPSLAVE indexierte Elemente eines Varia-
blenfeldes sind, ist zu beachten, dass der Elementindex RA ... RF durch die Rechenregi-
ster im Master gebildet wird.
Beispiel:
Für die praktische Verwendung der RX und TX-Instruktionen empfielt es sich, folgenden
Programmaufbau zu wählen:
Beispiel Programmaufbau:
MOD 1..15
START: JMP BEGINN
INCL(ALLGEMVAR)
VAR: DF 0,0 ....
BEGINN: MOV RA,0 ....
.....
END START
Die INCL-Datei ALLGEMVAR enthält alle Variablen, die in den verschiedenen Syste-
men für die Kommunikation mit dem Master verwendet werden. So ist es möglich, in den
Programmen für die verschiedenen Steuerungen stets mit denselben Symbolen zu arbei-
ten.
Mit der Compilerfunktion T (Transfer) lässt sich jedes compilierte Programm auf die zu-
gehörige Steuerung übertragen. (siehe Kapitel "Compiler")
Durch Modulnummer 0 gefolgt von R (Run) wird die Programmausführung in allen
Steuerungen gleichzeitig gestartet. (siehe Kapitel "Compiler")
Schaltung mit PC
TXD RXD
PC + MPL 50 Console-Mode
Schaltung ohne PC
Sonderinstruktionen
Adressen von Variablen
Bei der Definition von Variablen werden vom Compiler den vereinbarten Variablenna-
men Adressen zugeordnet. Diese Adressen werden im Maschinencode benötigt und sind
für den Anwender normalerweise nicht sichtbar. Mit der Instruktion ADDR lassen sich
nun diese Adressen von Variablen und indexierten Variablen ermitteln.
Instruktion: Syntax: Operation:
Variablen-Adresse
ermitteln ADDR DOP,VAR Die Adresse von VAR wird
ermittelt und im Zieloperanden
DOP als Zahlenwert
gespeichert.
NOP-Instruktion
Die Instruktion NOP hat keine Funktion zur Folge. Sie dient als "Leerstelle" im Pro-
gramm.
Instruktion: Syntax:
Leerstelle im Programm NOP
Instruktion: Syntax:
Baud-Rate einstellen BAUD SOP
Syntax: Parameter:
XMODE SOP SOP = 0 : XMODE ein Zeichen 00 ... FF
SOP = 1 : XMODE aus (Normalbetrieb) Zeichen 01 ... DF
Positionierinstruktionen
Einführung
MPS 50 ist mit sogenannten Bewegungsgeneratoren für die Steuerung der Achsbewegun-
gen ausgerüstet. Diese Bewegungsgeneratoren haben die Aufgabe, den Verlauf der
Schrittfrequenz während einer Bewegung von A nach B entsprechend den von der CPU
berechneten Werten für die Rampen und Verfahrgeschwindigkeiten zu steuern.
Für die genaue Definition einer Positionierung werden folgende Daten benötigt:
• Positionierdistanz in Schritten
• Wert für Beschleunigungsrampe
• Wert für Bremsrampe
• Maximale Verfahrgeschwindigkeit
• Arbeitsgeschwindigkeit
• Geschwindigkeitsteilwert
Positionierdistanz
Die Angabe der Positionierdistanz erfolgt für die Bewegungsgeneratoren immer als rela-
tive Anzahl von Mikroschritten. Für die Distanzeingabe in technischen Einheiten muss
also vorher mittels einem Skalenfaktor diese Anzahl Mikroschritte berechnet werden.
Diese Aufgabe übernimmt die Standardprozedur INITAB.
Bei der Angabe des Skalenfaktors ist zu beachten, dass sich die Anzahl Mikroschritte im-
mer auf eine interne Referenzfrequenz von max. 250 kHz bezieht. Werden also die
Schrittmotorantriebe am Impulsausgang FA (max. 100 kHz) betrieben, ist die Anzahl Mi-
kroschritte für die Bewegungsgeneratoren 2.5 mal und beim Impulsausgang FB (max. 25
kHz) 10 mal grösser als die vom Schrittmotor ausgeführte Schrittzahl.
Diese Faktoren werden durch die Prozedur INITAB automatisch mit einbezogen und in
den Systemvariablen KMUL (0 ... 5) gespeichert.
Beispiel:
Ein Schrittmotor treibt eine Spindel mit einer Steigung von 5 mm direkt gekoppelt an. Der
Schrittmotor macht im Mikroschrittbetrieb 2000 Schritte pro Umdrehung. Als Impulsaus-
gang wird FB verwendet.
Welcher Skalenfaktor muss verwendet werden, damit Distanzen in mm eingegeben wer-
den können?
Eine Umdrehung der Spindel entspricht 5 mm und 2000 Schritte am Schrittmotor. Daraus
folgt, dass für eine Distanz von 1 mm genau 400 Schritte benötigt werden.
Schritt-
motor
Steigung p = 5 mm
Geschwindigkeiten
Die Verfahrgeschwindigkeit wird aus insgesamt drei veränderbaren Komponenten er-
rechnet:
• Maximale Verfahrgeschwindigkeit
• Arbeitsgeschwindigkeit
• Geschwindigkeitsteilwert
Frequenz
SPMX
SPLD
SPLI
Zeit
Ta Ta
Der maximale Geschwindigkeitswert hängt von den Gegebenheiten der Anwendung ab.
Durch Versuche oder Berechnung wird die maximal erlaubte Verfahrgeschwindigkeit er-
mittelt und im Programm einmal festgelegt. Damit wird verhindert, dass eine program-
mierte Arbeitsgeschwindigkeit ausserhalb der erlaubten Grenzwerte liegt.
0 255
SPMX
0 255
SPLD
0 255
SPLI
Beispiele:
GTW:DO1 100 ;Variable für Geschwindigkeitsteilwert
START: MOV SPLI(0),#GTW ; Adresse von GTW in SPLI speichern
Die effektiv resultierende Schrittfrequenz am Ausgang lässt sich also wie folgt berechnen:
ADC(8)
—————
SPMX * SPLD * Ganzzahlrundung 255
F = f * ——————————————————————
2552
Rampen
Das Drehmoment Montag, 13. Oktober 1997eines Schrittmotors nimmt mit zunehmender
Frequenz ab. Um auch bei hohen Schrittfrequenzen optimale Beschleunigunswerte zu er-
zielen, erfolgt die Rampensteuerung bei MPS 50 exponentiell. Dadurch nimmt die Be-
schleunigung mit zunehmender Frequenz ab und damit auch das
Beschleunigungsmoment.
Dieses Verfahren erlaubt eine mechanische Masse in wesentlich kürzerer Zeit zu be-
schleunigen und abzubremsen als das mit einer linearen Rampensteuerung der Fall wäre.
Sind die BSTE-Flags = log 1, so werden die BST-Steuerausgänge während TA aktiviert.
Systemvariablen für
exponentiellen Rampen: Syntax: Bereich:
Beschleunigungsrampe KUP(0 ... 6) 0 ... 255
Bremsrampe KDN(0 ... 6) 0 ... 255
Bei SPMX = 255 und SPLD = 255 lässt sich die Beschleunigungs- und BremszeitMontag,
13. Oktober 1997 für die exponentiellen Rampen mit folgender Näherungsformel bestim-
men:
Für SPMX und SPLD kleiner als 255 reduziert sich TA entsprechend.
Soll während dem Positioniervorgang die Geschwindigkeit verändert werden, lässt sich
die berechnete exponentielle Bremsrampe nicht verwenden. Deshalb wird ein zusätzli-
cher linearer Rampenwert festgelegt, der dann den Beschleunigungs-/Bremsvorgang zeit-
lich steuert.
Systemvariablen für
lineare Bremsrampe: Syntax: Bereich:
Bremsrampe KLIN(0 ... 6) 0 ... 65535
Bei der linearen Rampe KLIN ist die Beschleunigungs- oder Bremszeit diejenige Zeit,
welche verstreicht, um von einer Anfangsgeschwindigkeit VA auf eine neue Endge-
schwindigkeit VE zu beschleunigen.
Für die Berechnung der Rampenzeit wird also die Geschwindigkeitsdifferenz DV benö-
tigt.
DV = V A - VE
Die resultierende Rampenzeit für KLIN kann nach folgender Formel ermittelt werden:
DV * 256
TA (sec) = ———— * 4 * 10-3
KLIN
Falls durch ein Programm keine Geschwindigkeits- und Rampenwerte vorgegeben wer-
den, nimmt der Controller PPC 50 folgende Default-Werte an:
Variable: Default-Wert:
PABS (0 ... 5) 0
SPMX (0 ... 6) 128
SPLD (0 ... 6) 128
SPLI (0 ... 6) Adresse $FF enthält den Wert 255
KUP (0 ... 6) 64
KDN (0 ... 6) 64
KLIN (0 ... 6) 512
Die Positionierinstruktionen
Die Ausführung einer Positionierung erfolgt in verschiedenen Schritten:
• Laden des Bewegungsgenerators mit der richtigen Anzahl Mikroschritten.
• Setzen bzw. Rücksetzen des Drehrichtunsflags DIR
• Setzen des RUN-Flags und damit starten der Bewegung. Warten solange RUN-Flag
aktiv ist, d.h. solange Bewegung läuft.
Instruktion: Syntax:
Laden Bewegungsgenerator IMG ACHSNUMMER, DISTANZ
Beispiel:
START: MOV SPMX(0),200 ; Max. Geschwindigkeit
MOV SPLD(0),100 ; Arbeitsgeschwindigkeit
MOV SPLI(0),#ADC(8) ; Geschwindigkeitsteilwert
MOV KUP (0),50 ; Beschleunigungsrampe
MOV KDN (0),50 ; Bremsrampe
MOV KLIN(0),500 ; Linearrampe
Beispiel:
X=0
ENDLOS_X_RW:SETDIR(X) ;Drehrichtung RW
RES KDN(X)
IMG X,100000
SET RUN(X) ;Start Endlosbewegung
MOV RA,SPLD(X)
HALT_X: WF IN(0) ;Warten auf HALT ein
RES SPLD(X) ;Halt Bewegung
WF ZSF(X) ;Warten bis Motor steht
WT IN(0) ;Warten auf HALT aus
MOV SPLD(X),RA ;alte Geschwindigkeit
;laden
RES RUN(X) ;KDN(X) anschl. wieder
;auf alten Wert schreiben
JMP HALT_X
END ENDLOS_X_RW
Hinweis: Das Stoppen der Motorbewegung erfolgt mit der in KLIN(X) festgeleg-
ten linearen Rampe.
Polygon-Interpolation
Das Betriebssystem des Controllers PPC 50 enthält die notwendigen Funktionen, um alle
6 Achsen interpolierend verfahren zu können. Diese Funktionen erlauben lineare Interpo-
lationen zwischen allen Achsen.
Komplexe Bahnen wie beispielsweise Kreise werden als Polygon behandelt.
Zu dem Zweck lassen sich bis zu 255 lineare Bahnsegmente in einem Interpolationsbuffer
ablegen und ohne Zwischenhalt verfahren.
Für die Ausführung von Interpolationen stehen eine Reihe von spezifischen Instruktionen
zur Verfügung. Für die notwendigen Berechnungen dienen die Arithmetik-Instruktionen.
Die Beschleunigungs- und Bremsrampen der beteiligten Achsen haben keinen negativen
Einfluss auf die Bahngeometrie und auch die Verfahrgeschwindigkeit entlang der Bahn
bleibt konstant. Dies ist möglich, weil eine virtuelle siebente Achse (Achse 6) als Steuer-
element für die Interpolation geschaffen wurde.
Sämtliche Daten zur Bestimmung der zu verfahrenden Bahn beziehen sich auf diese vir-
tuelle Achse. Die beteiligten realen Achsen (Achse 0 ... 5) werden untergeordnet betrie-
ben.
Die Geschwindigkeitsdaten SPMX(6), SPLD(6), SPLI(6) und Rampen KUP(6), KDN(6),
KLIN(6) übersteuern somit die für die realen Achsen angegebenen Werte.
B
DX6
S6
DY6
S4
S5
S3
S2
DX1
S1
A
DY1
Durch den Start der Interpolation werden die LIN-Flags der beteiligten Achsen automa-
tisch gesetzt und nach Erreichen der Endposition auch wieder zurückgesetzt.
Wichtig: Soll eine laufende Interpolation von aussen, z.B. durch den Eingang 0
unterbrochen werden, ist folgende Sequenz zu programmieren:
Interpolationsinstruktionen
MPL 50 umfasst die notwendigen Instruktionen für die Ausführung einer Polygon-Inter-
polation. Dazu gehören Befehle zum Einrichten eines Interpolationsbuffers zur Berech-
nung der Interpolationsdaten und zum Ausführen der Interpolation.
Segmentdaten
Parameter: Bedeutung:
Bufferadresse Anfangsadresse des Interpolationsbuffers.
Modus Gibt an, ob die Koordinaten relativ oder absolut sind.
Modus = 0 Absolute Koordinaten bezogen auf den Anfangspunkt der Bahn.
Modus = 1 Relative Koordinaten bezogen auf das vorangehende Bahnsegment.
Koordinate1 ... N Die Koordinaten werden in technischen Einheiten als Floatingpoint
angegeben. Für die Umrechnung sind systembekannte
Skalenfaktoren KMUL (0 ... 6) eingeführt [Link] müsssen für
die Interpolation unbedingt initialisiert werden, was durch die
Standardprozedur INITAB geschieht (ohne KMUL (6)).
Hinweis: KMUL (6) muss mindestens 1.005 mal grösser sein als der grösste Wert
von KMUL (0 ... 5).
Diese Sequenz berechnet eine Bahn mit 3 Interpolations-Segmenten und speichert sie im
INT_BUFFER.
Die Rechenzeit für Bahnen beträgt :
Bei 2 Achsen: Ca. 60 Segmente pro sec
Bei 3 Achsen: Ca. 50 Segmente pro sec
Die zweite Methode hat den Vorteil der kürzeren Compilationszeit und auch die Grösse
des Interpolations-Buffers muss nicht zum voraus definiert werden.
Sind nun in eine der obigen Datenstrukturen Interpolations-Daten für mehrere Bahnen zu
speichern, muss natürlich für eine Bahn N die letzte belegte Adresse der vorangehenden
Bahn N-1 bekannt sein. Diese Funktion übernimmt NEXTC.
Syntax: Parameter:
NEXTC DOP,SOP DOP= Anfangsadresse für Bahn N
SOP= Anfangsadresse von Bahn N-1
Beispiel:
NEXTC RA,#INT_BUFFER
Die nächste freie Adresse im INT_BUFFER wird in RA gespeichert.
Der notwendige Speicherplatz berechnet sich wie folgt:
NB = NS*(3 + NA*6) + 13
NB : Anzahl Bytes
NS : Anzahl Segmente
NA : Anzahl Achsen
Zur Steuerung der Polygoninterpolation bedient sich das Betriebssystem eines Segment-
pointers (Adresse $164). Dieser zeigt während der Interpolation, wieviele Segmente noch
zu verfahren sind.
Beispiel:
EXECC #INT_BUFFER
EXECC startet die Interpolation. Das Ende der Achsbewegungen lässt sich über das Flag
RUN(6) ermitteln.
Beispiel:
X =0
Y =1
Z =2
ABS =0
REL =1
;Linearinterpolation
INITAB X,0,200,75,75,500,25.0,2000.0,
Y,0,200,75,75,500,25.0,2000.0,
Z,0,200,75,75,500,25.0,2000.0,
MUL KMUL(6),KMUL(Z),1.005
DTABVA 100,75,75,500
BEGIN: OPENC #INT_BUFFER,X,Y,Z ;Öffnen Interpolationsbuffer
SEGMC #INT_BUFFER,REL,-100.0,REL,30.7,REL,50.8;Berechnen
;Linearinterpolation
EXECC #INT_BUFFER ;Ausführen Linearinterpolation
WT RUN(6)
;Bahn-Interpolation
NEXTC RA,#INT_BUFFER ; RA = Anfangsadresse für Bahn
OPENC RA,X,Y,Z ;Öffnen Interpolationsbuffer für
;Bahn
SEGMC RA,ABS,20.0,ABS,50.0,ABS,10.0;Berechnen der Bahn-
SEGMC RA,ABS,50.0,ABS,90.0,ABS,10.0;interpolation
SEGMC RA,ABS,90.0,ABS,120.0,ABS,10.0
SEGMC RA,ABS,140.0,ABS,140.0,ABS,10.0
EXECC RA ;Ausführen der Bahninter-
WT RUN(6) ;polation
JMP BEGIN
INCL (INITAB.PR4)
INCL (DTABVA.PR4)
INT_BUFFER: DO1 ? ;dynamischer Interpolations-
;buffer
MOD 2
END BEGIN
Durch Definition des INT_BUFFER am Ende des Programmes steht der gesamte nach-
folgende Speicherplatz für den Interpolationsbuffer zur Verfügung.
Compileranweisungen im Programm
MPL 50 sieht eine Reihe von Anweisungen vor, die für die eigentliche Programmausfüh-
rung unbedeutend sind, aber bestimmte Funktionen während der Compilation steuern.
END-Anweisung
Damit der Compiler das Ende des Programmes erkennen kann, muss jedes Programm mit
der Instruktion END beendet werden.
Zusammen mit END ist ein Label anzugeben, der die Startadresse für den automatischen
Start darstellt. In Prozeduren, die auf Harddisk oder Diskette gespeichert und mit INCL
weiterverarbeitet werden, wird END ohne Label angegeben.
Syntax:
END Ende Compilation einer mit INCL geladenen Prozedur
END LABEL Ende Compilation. Programmstart bei LABEL
INCLUDE-Anweisung
Bei der Verwendung von Prozeduren veranlasst diese Anweisung den Compiler, das ent-
sprechende Prozedurprogramm automatisch zu laden und mitzucompilieren. Die Datei-
grösse der Prozedurprogramme kann jeweils max. 64kByte betragen. Die max. Anzahl
INCLUDE-Dateien hängt ab vom Eintrag FILES = n in der [Link]-Datei des PC.
Hinweis: Sollen Prozedurprogramme auf diese Weise geladen werden, muss die
letzte Anweisung im Prozedurprogramm ein END ohne Label sein.
INCLUDE-Dateien dürfen selber keine INCL-Anweisung enthalten.
PATH-Anweisung
Befinden sich alle Prozeduren in einem besonderen Unterverzeichnis, kann mit der
PATH-Anweisung der Pfad eingestellt werden. (Pfad kann max. 80 Zeichen haben).
Instruktion: Syntax:
Pfad-Anweisung PATH (Drive:\Dir\) Die nachfolgenden Dateien werden
durch die INCL-Anweisungen im
Laufwerk ’Drive’ aus dem
Unterverzeichnis ’Dir’ geladen.
RAM / ROM-Anweisungen
MPS 50 bietet die Möglichkeit, ausgetestete Programme im freien Bereich des EPROMs
(Adressen 4000 ... 7FFF) zu speichern. Damit jedoch weiterhin variable Daten verarbeitet
werden können, ist dafür zu sorgen, dass den Variablen Speicherplatz im RAM-Bereich
reserviert wird. Zu diesem Zweck wird dem Variablen-Definitionsteil die Anweisung
RAM und dem Programmteil die Anweisung ROM vorangestellt. Für die genaue Be-
schreibung der Speicherung in EPROMs mit handelsüblichen EPROM-Programmierge-
räten siehe Kapitel "Compiler".
Beispiel:
RAM
VAR: DF 10 DUP 0.0
ROM
START: WT IN(0)
MOV RA,7
ORIGIN-Anweisung
Allen Variablen, Labels usw. wird durch den Compiler automatisch in chronologischer
Folge eine hexadezimale Adresse zugeordnet. Die ORIGIN-Instruktion ermöglicht es, ei-
ner Variablen, einem Label usw. eine selber definierte Adresse zuzuordnen.
Syntax:
ORG ADRESSE Der Zeiger für die Speicheradressen wird auf den Wert
ADRESSE gesetzt.
ORG SYMBOL Der Zeiger für die Speicheradressen wird gleich der Adresse
von SYMBOL gesetzt.
Beispiel:
ORG $8F00 Der Zeiger für die Speicheradressen wird auf
hexadezimal 8F00 gesetzt.
VAR: DF 0.0 Der Floatingpointvariablen VAR wird somit
die Adresse hexadezimal 8F00 zugeordnet.
MOD-Anweisung
Für die Kommunikation zwischen mehreren SELEDATA® MPS 50-Systemen ist jedem
System eine eigene Modulnummer (1 ... 15) zuzuordnen.
Die Anweisung MOD plus eine Zahl zwischen 1 und 15 veranlasst den Compiler, auto-
matisch die entsprechende Modulnummer für den nachfolgenden Programmtransfer- und
Start vorzunehmen.
Beispiel:
MOD 2 Die Modulnummer 2 wird bei der Compilation
automatisch gewählt.
LISTOFF / LISTON-Anweisungen
Mit den Anweisungen LISTOFF und LISTON lassen sich Teile eines MPL-Programmes
für die LIST-Funktion des Compilers ausblenden.
Beispiel:
LISTOFF
INCL (POSA.PR4)
LISTON
Hinweis: Die beiden Anweisungen LISTOFF und LISTON dürfen nie allein in ei-
nem Programm stehen.
Programmausführungszeiten
Die Ausführungszeit eines Programmes setzt sich aus der Summe der einzelnen Instruk-
tionszeiten zusammen.
Durch die Verwendung von Simultanprogrammen verlängert sich die gesamte Ausfüh-
rungszeit eines Programmes, da der Prozessor mehrere Aufgaben quasi gleichzeitig aus-
führen muss.
Instruktionsausführungszeiten
Die angegebenen Werte sind immer mit maximal möglicher Anzahl Operanden ermittelt
worden. Bei reduzierter Anzahl Operanden können sich kürzere Zeiten ergeben.
* plus Datenübertragungszeit
TMR(0) $ 80 18 VI3
TMR(1) $ 80 1B VI3
TMR(2) $ 80 1E VI3
TMR(3) $ 80 21 VI3
TMR(4) $ 80 24 VI3
TMR(5) $ 80 27 VI3
TMR(6) $ 80 2A VI3
TMR(7) $ 80 2D VI3
SPMX(0) $ 80 48 VO1
SPMX(1) $ 80 49 VO1
SPMX(2) $ 80 4A VO1
SPMX(3) $ 80 4B VO1
SPMX(4) $ 80 4C VO1
SPMX(5) $ 80 4D VO1
SPMX(6) $ 80 4E VO1
SPLD(0) $ 80 4F VO1
SPLD(1) $ 80 50 VO1
SPLD(2) $ 80 51 VO1
SPLD(3) $ 80 52 VO1
SPLD(4) $ 80 53 VO1
SPLD(5) $ 80 54 VO1
SPLD(6) $ 80 55 VO1
SPLI(0) $ 80 56 VO2
SPLI(1) $ 80 58 VO2
SPLI(2) $ 80 5A VO2
SPLI(3) $ 80 5C VO2
SPLI(4) $ 80 5E VO2
SPLI(5) $ 80 60 VO2
SPLI(6) $ 80 62 VO2
KDN(0) $ 80 6B VO1
KDN(1) $ 80 6C VO1
KDN(2) $ 80 6D VO1
KDN(3) $ 80 6E VO1
KDN(4) $ 80 6F VO1
KDN(5) $ 80 70 VO1
KDN(6) $ 80 71 VO1
KLIN(0 $ 80 72 VO2
KLIN(1) $ 80 74 VO2
KLIN(2) $ 80 76 VO2
KLIN(3) $ 80 78 VO2
KLIN(4) $ 80 7A VO2
KLIN(5) $ 80 7C VO2
KLIN(6) $ 80 7E VO2
Segmentpointer
Polygoninterpolation $ 164 VO1 nur lesen
KCOD $ 80 84 VO1
PMF(0) $ 80 8D VO1
PMF(1) $ 80 8E VO1
PMI(0) $ 80 8F VO1
FIFO-Buffer $ 8180 ... $ 81BF VO1 64 Byte
RS 232C
Write pointer $ 10A VO1 nur lesen
Read pointer $ 10B VO1 nur lesen