Beruflich Dokumente
Kultur Dokumente
Version 5.2
© Stäubli Faverges 2005
D28056202B - 06/2005
2 / 122 D28056202B - 06/2005
REFERENZANLEITUNG VAL3 - Version 5.2
EINLEITUNG....................................................................................................................... 9
ELEMENTE DER SPRACHE VAL3.................................................................................. 10
APPLIKATIONEN ................................................................................................................. 10
Definition........................................................................................................................................ 10
Vorprogrammierte Inhalte .............................................................................................................. 10
Starten und Beenden der Applikation ............................................................................................ 10
Parameter der Applikation ............................................................................................................. 10
Längeneinheit............................................................................................................................................ 11
Größe des Ausführungsspeichers............................................................................................................. 11
PROGRAMME...................................................................................................................... 11
Definition........................................................................................................................................ 11
Wiedereinsprung............................................................................................................................ 11
Programm start()........................................................................................................................... 11
Programm stop() ........................................................................................................................... 11
DATENTYP .......................................................................................................................... 12
Definition........................................................................................................................................ 12
Einfache Typen.............................................................................................................................. 12
Strukturierte Typen ........................................................................................................................ 12
KONSTANTEN ..................................................................................................................... 12
Definition........................................................................................................................................ 12
Konstanten einfachen Typs ........................................................................................................... 12
Konstanten strukturierten Typs...................................................................................................... 12
Konstantentabelle .......................................................................................................................... 13
VARIABLEN ......................................................................................................................... 13
Definition........................................................................................................................................ 13
Gültigkeitsbereich einer Variablen ................................................................................................. 13
Zugriff auf den Wert einer Variablen.............................................................................................. 13
"By value"-Parameter .................................................................................................................... 14
"By Reference"-Parameter ............................................................................................................ 14
ANWEISUNGEN ZUR ABLAUFSTEUERUNG..................................................................... 15
Bemerkung // ...................................................................................................................................... 15
Aufruf des Unterprogramms call ......................................................................................................... 15
Rückkehr aus dem Unterprogramm return ......................................................................................... 16
Anweisung if........................................................................................................................................ 16
Anweisung while................................................................................................................................. 17
Anweisung do ... until......................................................................................................................... 17
Anweisung for ..................................................................................................................................... 18
Anweisung switch............................................................................................................................... 19
TASKS .............................................................................................................................. 52
Definition........................................................................................................................................ 52
Fortsetzen nach einer Fehlermeldung ........................................................................................... 52
Starten und Beenden der Applikation ............................................................................................ 52
Sequentielles Ordnen .................................................................................................................... 53
Synchronisierung ........................................................................................................................... 54
Gemeinsame Nutzung von Ressourcen ........................................................................................ 55
Anweisungen ................................................................................................................................. 56
void taskSuspend(string Name)......................................................................................................... 56
void taskResume(string Name, num Sprung) .................................................................................... 56
void taskKill(string Name) .................................................................................................................. 57
num taskStatus(string Name) ............................................................................................................ 58
void taskCreate string Name, num Priorität, Programm(...) ............................................................... 59
void wait(bool Bedingung) .................................................................................................................. 60
void delay(num Sekunden) ................................................................................................................. 60
num clock() ......................................................................................................................................... 61
bool watch(bool Bedingung, num Sekunden)..................................................................................... 61
BIBLIOTHEKEN................................................................................................................ 62
Definition........................................................................................................................................ 62
Schnittstelle ................................................................................................................................... 62
Kennung der Schnittstelle.............................................................................................................. 62
Inhalt .............................................................................................................................................. 62
Im Speicher laden und aus dem Speicher entfernen..................................................................... 62
Zugriffspfad.................................................................................................................................... 63
Fehlercodes ................................................................................................................................... 63
Anweisungen ................................................................................................................................. 64
num identifiant:libLoad(string Weg).................................................................................................... 64
num identifiant:libSave(), num libSave() ............................................................................................ 64
num libDelete(string Weg) .................................................................................................................. 64
string identifiant:libPath(), string libPath().......................................................................................... 65
bool libList(string Weg, string& contenu) ........................................................................................... 65
ARMPOSITION ................................................................................................................. 69
EINLEITUNG ........................................................................................................................ 69
TYP JOINT ........................................................................................................................... 69
Definition........................................................................................................................................ 69
Operatoren..................................................................................................................................... 70
Anweisungen ................................................................................................................................. 70
joint abs(joint Position) ....................................................................................................................... 70
joint herej() ......................................................................................................................................... 71
bool isInRange(joint Position) ............................................................................................................ 71
TYP TRSF ............................................................................................................................ 72
Definition........................................................................................................................................ 72
Orientierung ................................................................................................................................... 73
Operatoren..................................................................................................................................... 75
Anweisungen ................................................................................................................................. 75
num distance(trsf Position1, trsf Position2) ....................................................................................... 75
TYP FRAME ......................................................................................................................... 76
Definition........................................................................................................................................ 76
Verwendung................................................................................................................................... 76
void movec(Mittlerer Punkt, Endpunkt, tool Werkzeug, mdesc desc) ............................................. 107
void stopMove()............................................................................................................................... 108
void resetMotion(), void resetMotion(joint Start) ............................................................................. 108
void restartMove() ........................................................................................................................... 109
void waitEndMove() ........................................................................................................................ 109
bool isEmpty() ................................................................................................................................. 110
bool isSettled() ................................................................................................................................ 110
void autoConnectMove(bool aktiv), bool autoConnectMove() ..................................................... 110
OPTIONEN...................................................................................................................... 111
AUSGEGLICHENE BEWEGUNGEN MIT KRAFTSTEUERUNG....................................... 111
Prinzip.......................................................................................................................................... 111
Programmierung .......................................................................................................................... 111
Steuerung der Kraft ..................................................................................................................... 111
Begrenzungen ............................................................................................................................. 112
Anweisungen ............................................................................................................................... 112
void movejf(joint Position, tool Werkzeug, mdesc desc, num Kraft) ............................................... 112
void movelf(point Punkt, tool Werkzeug, mdesc desc, num Kraft) ................................................. 113
bool isCompliant() .......................................................................................................................... 114
ANHANG......................................................................................................................... 115
FEHLERCODES................................................................................................................. 115
TASTENCODES DER BEDIENKONSOLE ........................................................................ 116
ADDILDUNG ................................................................................................................... 117
INDEX.............................................................................................................................. 119
EINLEITUNG
VAL3 ist eine höhere Programmiersprache für die Steuerung von Stäubli-Robotern bei der Ausführung industrieller
Handhabungs- und Montageaufgaben.
VAL3 besitzt alle wichtigen Funktionen von gängigen Echtzeit-Programmiersprachen und zusätzlich die speziellen
Steuerungsfunktionen für Industrieroboter:
• Steuerungsprogramme des Roboters
• Programme zur Erstellung geometrischer Modelle
• Tools zur Ansteuerung der Ein-/Ausgänge
In dem vorliegenden Handbuch sind alle zur Programmierung notwendigen Begriffe und Anweisungen der VAL3-
Sprache eingehend erläutert. Es enthält die Kapitel:
• Sprachelemente
• Einfache Typen
• Benutzerschnittstelle
• Tasks
• Bibliotheken
• Steuerung des Roboters
• Position des Roboterarms
• Bewegungssteuerung
Zum leichteren Auffinden sind die Anweisungen mit ihrer Syntax im Inhaltsverzeichnis angegeben.
APPLIKATIONEN
Definition
Eine VAL3-Applikation ist ein eigenständiges Programm zur Programmierung des Roboters einer CS8-Steuerung.
Eine VAL3-Applikation besteht aus folgenden Elementen:
- einer Gruppe von Programmen: den auszuführenden VAL3-Anweisungen,
- einer Gruppe von globalen Variablen: den Daten der Applikation
- einer Gruppe von Bibliotheken: von der Applikation benutzte externe Anweisungen und Daten
Während ihrer Ausführung enthält eine Applikation außerdem:
- eine Gruppe von Tasks: die zu diesem Zeitpunkt ausgeführten Programme
Vorprogrammierte Inhalte
Eine VAL3-Applikation enthält immer die Programme start() und stop(), das Koordinatensystem world (Typ frame)
und das Tool flange (Typ tool).
Bei der Erstellung enthält eine VAL3-Applikation außerdem die speziellen Anweisungen und Daten des gewählten
Modells.
Diese Elemente werden in den entsprechenden Kapiteln detailliert beschrieben.
Längeneinheit
In den VAL3-Applikationen werden Millimeter oder Inch als Längeneinheit verwendet. Sie dienen zur Beschreibung der
geometrischen Daten von VAL3: Koordinatensysteme, Punkte, Transformationen, Werkzeuge oder Bahnglättungen.
Die Längeneinheit wird bei Erstellung einer Applikation durch die im System geltende Längeneinheit festgelegt und
kann anschließend nicht mehr geändert werden.
Größe des Ausführungsspeichers
Der Ausführungsspeicher einer VAL3-Applikation ist der für die einzelnen Tasks verfügbare Speicher, in dem unter
anderem lokale Programmvariablen abgelegt werden. Der voreingestellte Wert beträgt 5000 Bytes.
Dieser Wert kann jedoch für Applikationen mit besonders umfangreichen Tabellen lokaler Variablen oder rekursiven
Algorithmen nicht ausreichen: Er muss in diesem Fall über die Benutzerschnittstelle der CS8 erhöht werden.
PROGRAMME
Definition
Ein Programm enthält eine Reihe von VAL3-Anweisungen, die auszuführen sind.
Es besteht aus folgenden Elementen:
- einer Sequenz von Anweisungen: den auszuführenden VAL3-Anweisungen,
- einer Gruppe von lokalen Variablen: den programminternen Daten,
- einer Gruppe von Parametern: den Daten, die dem Programm beim Aufrufen geliefert werden.
Programme dienen zur Zusammenfassung von Anweisungssequenzen, um sie an verschiedenen Stellen in einer
Applikation verwenden zu können. Neben dem geringeren Programmierungsaufwand werden die Applikationen
dadurch übersichtlicher, was die Programmierung und Wartung erleichtert und die Lesbarkeit verbessert.
Die Anzahl der Programmanweisungen ist nur durch den im System verfügbaren Speicherplatz begrenzt.
Die Anzahl der lokalen Variablen und Parameter ist nur durch den Ausführungsspeicher der Applikation begrenzt.
Wiedereinsprung
Die Programme erlauben den Wiedereinsprung (Reentrantprogramme), d.h. ein Programm kann sich selbst rekursiv
aufrufen (Anweisung call) oder von mehreren Tasks gleichzeitig aufgerufen werden. Jeder Programmaufruf besitzt
seine eigenen lokalen Variablen und Parameter.
Programm start()
Um die VAL3-Applikation zu starten, wird das Programm start() aufgerufen. Es kann keine Parameter besitzen.
In diesem Programm befinden sich alle zum Start der Applikation erforderlichen Vorgänge: Initialisierung der globalen
Variablen, der Ein-/Ausgänge, Starten der Tasks der Applikation....
Die Applikation ist am Ende des start()-Programms noch nicht unbedingt beendet, da noch andere Tasks dieser
Applikation in der Ausführung sein können.
Das start()-Programm kann, wie jedes andere Programm, in einem anderen Programm aufgerufen werden (Anweisung
call).
Programm stop()
Das Programm stop() wird am Ende der Ausführung der VAL3-Applikation aufgerufen. Es kann keine Parameter
besitzen.
In diesem Programm finden sich im Allgemeinen alle zum korrekten Beenden der Applikation erforderlichen Vorgänge:
Reinitialisierung der Ein-/Ausgänge, Beenden der Tasks der Applikation in einer bestimmten Reihenfolge....
Das stop()-Programm kann, wie jedes andere Programm, in einem anderen Programm aufgerufen werden (Anweisung
call): Das Aufrufen des stop()-Programms führt nicht zum Abbruch der Applikation.
Einfache Typen
Die Sprache VAL3 unterstützt folgende einfache Typen:
- Typ bool: für boolesche Werte (true/false)
- Typ num: für digitale Werte
- Typ string: für Zeichenketten
- Typ dio: für digitale Ein-/Ausgänge
- Typ aio: für numerische Ein-/Ausgänge (analog oder digital)
- Typ sio: für Ein-/Ausgänge serieller Verbindungen und Ethernet-Socket
Strukturierte Typen
Ein strukturierter Typ enthält mehrere Datentypen, so genannte strukturierte Datenfelder. Strukturierte Datenfelder
können mit ihrem Namen einzeln aufgerufen werden.
Die Sprache VAL3 unterstützt folgende strukturierte Typen:
- Typ trsf: für kartesische Koordinatentransformationen
- Typ frame: für das kartesische Koordinatensystem
- Typ tool: für die am Roboter montierten Tools
- Typ point: für die kartesischen Toolpositionen
- Typ joint: für die Winkelpositionen der Robotergelenke
- Typ config: für die Roboterkonfigurationen
- Typ mdesc: für die Bewegungsparameter des Roboters
KONSTANTEN
Definition
Eine Konstante ist ein Datenelement, das direkt und ohne vorherige Deklaration in einem VAL3-Programm festgelegt
ist. Der Typ einer Konstante ist implizit durch das System vorgegeben.
Zum Beispiel
procedure dummy(trsf t, dio d)
point p
p = {{100, -50, 200, 0, 0, 0}, {sfree, efree, wfree}}
call dummy({a+b, 2* c, 120, limit(c, 0, 90), 0, 0}, io:Ventil1)
Konstantentabelle
Eine Konstantentabelle muss für jeden einzelnen Eingang initialisiert werden.
Zum Beispiel
joint j[5 ]
j[0] = {0, 0, 0, 0, 0, 0}
j[1] = {90, 0, 90, 0, 0, 0}
j[2] = {-90, 0, 90, 0, 0, 0}
j[3] = {90, 0, 0, -90, 0, 0}
j[4] = {-90, 0, 0, -90, 0, 0}
VARIABLEN
Definition
Eine Variable ist ein Datenelement in einem Programm, das durch seinen Namen gekennzeichnet ist.
Eine Variable ist definiert durch:
- ihren Namen: eine Zeichenkette
- ihren Typ: einen der oben beschriebenen VAL3-Typen
- ihre Größe: z.B. die Anzahl der Datenelemente in einer Tabelle
- ihren Gültigkeitsbereich: das (die) zur Verwendung dieser Variablen berechtigte(n) Programm(e)
Der Name einer Variablen ist eine Zeichenkette mit 1 bis 12 Zeichen von "a..zA..Z0..9_".
Alle Variablen können wie Tabellen verwendet werden. Einfache Variablen haben die Größe 1. Die Größe einer
Variablen kann mittels der Anweisung size() in Erfahrung gebracht werden.
"By value"-Parameter
Bei einer "By Value"-Parameter-Übergabe erstellt das System eine lokale Variable und initialisiert diese mit dem Wert
der Variablen oder des Ausdrucks, der vom aufrufenden Programm geliefert wird.
Die Variablen des aufrufenden Programms, die als By Value-Parameter verwendet werden, bleiben unverändert, auch
wenn das aufgerufene Programm den Wert des Parameters geändert hat.
Eine Datentabelle kann nicht "by value" übergeben werden.
Zum Beispiel:
procedure dummy(num x) // x per By Value-Übergabe
begin
x=0
putln(x) // ergibt 0
end
num a
a=10
putln(a) // ergibt 10
call dummy(a) // ergibt 0
putln(a) // ergibt 10: a wird von dummy() nicht geändert
"By Reference"-Parameter
Bei einer "By Reference"-Parameter-Übergabe arbeitet das Programm nicht mehr mit einer Kopie des vom aufrufenden
Programm übergebenen Datenelements, sondern mit dem Datenelement selbst, das nur lokal umbenannt wurde.
Die Variablen des aufrufenden Programms, die als By Reference-Parameter verwendet werden, ändern ihren Wert,
wenn das aufgerufene Programm den Wert des Parameters ändert.
Alle Elemente einer "By Reference" übergebenen Tabelle können benutzt und geändert werden. Wird ein Element einer
Tabelle "By Reference" übergeben, so können dieses Element und alle ihm folgenden Elemente benutzt und geändert
werden. Der Parameter wird dann wie eine Tabelle betrachtet, die bei dem beim Aufruf übergebenen Element beginnt.
Die Anweisung size() ermöglicht es, die effektive Größe eines Parameters in Erfahrung zu bringen.
Wenn eine Konstante oder ein Ausdruck "By reference" übergeben wurde, hat eine Zuweisung des entsprechenden
Parameters keinen Effekt: der Parameter behält den Wert der Konstanten oder des Ausdrucks bei.
Zum Beispiel:
procedure dummy(num& x) // x per By Reference-Übergabe
begin
x=0
putln(x) // ergibt 0
end
procedure element(num& x)
begin
x[3] = 0
putln(size(x))
end
num a
num b[10]
a=10
putln(a) // ergibt 10
call dummy(a) // ergibt 0
putln(a) // ergibt 0: a wird von dummy() geändert.
b[2] = 2
b[5] = 5
call element(b[2]) // ergibt 8, die Elemente 0 und 1 von b wurden nicht übergeben
putln(b[5]) // ergibt 0: b[5] wird von element() geändert.
Syntax
// <Kette>
Funktion
Eine Zeile, die mit « // » beginnt, wird nicht berücksichtigt, das Programm geht auf die nächste Zeile weiter.
Zum Beispiel
// Dies ist ein Beispiel für eine Bemerkung
Syntax
call Programm([Parameter1][,Parameter2])
Funktion
Führt das aufgerufene Programm mit den angegebenen Parametern aus.
Syntax
return
Funktion
Das laufende Programm wird sofort verlassen. Wenn das Programm durch einen call aufgerufen worden war, wird die
Programmausführung im aufrufenden Programm nach dem call fortgesetzt. Andernfalls (z. B. wenn das
Unterprogramm das Programm start() oder der Startpunkt für eine Task ist) wird die laufende Task beendet.
Anweisung if
Syntax
if <bool Bedingung>
<Anweisungen>
[else
<Anweisungen>]
endIf
Funktion
Wenn die Überprüfung der booleschen Bedingung Bedingung wahr (true) ergibt, werden alle eventuell nachfolgenden
Anweisungen bis zur Bedingung else oder endIf überprüft.
Wenn der Ausdruck falsch (false) ist, werden die zwischen else und endIf liegenden Anweisungen überprüft, sofern
else vorhanden ist. In jedem Fall wird die Ausführung des Programms nach der Anweisung endIf fortgesetzt.
Parameter
bool Bedingung zu überprüfender boolescher Ausdruck
Zum Beispiel
string s
num a
// s = "a=0" wenn a=0, sonst "a = ? "
s = "a = ? "
if a==0
s = "a=0"
endIf
// s = "a=0" wenn a=0, sonst "a <> 0"
s = "a = ? "
if a==0
s = "a = 0"
else
s = "a <> 0"
endIf
Anweisung while
Syntax
while <bool Bedingung>
<Anweisungen>
endWhile
Funktion
Die Anweisungen zwischen while und endWhile werden solange ausgeführt, wie die boolesche Bedingung
Bedingung wahr (true) ist.
Wenn die boolesche Bedingung Bedingung bei der ersten Überprüfung nicht wahr ist, werden die Anweisungen
zwischen while und endWhile nicht ausgeführt.
Parameter
bool Bedingung zu überprüfender boolescher Ausdruck
Zum Beispiel
dio dLampe
// Bewirkt das Blinken eines Signals solange der Roboter nicht stillsteht
dLampe = false
while (isSettled()==false)
dLampe = ! dLampe // Bildet den Kehrwert für die dLampe: true false
delay(0.5) // Wartet ½ s
endWhile
dLampe = false
Syntax
do
<Anweisungen>
until <bool Bedingung>
Funktion
Die Anweisungen zwischen do und until werden solange ausgeführt, bis die boolesche Bedingung Bedingung wahr
(true) ist.
Die Anweisungen zwischen do und until werden ausgeführt, wenn die boolesche Bedingung Bedingung bei der
erstmaligen Überprüfung wahr ist.
Parameter
bool Bedingung zu überprüfender boolescher Ausdruck
Zum Beispiel
num a
// Warten auf Betätigung der Enter-Taste
do
a = get() // Warten auf Betätigen einer Taste
until (a == 270) // Testet den Code der Enter-Taste
Syntax
for <num Zähler> = <num Anfang> to <num Ende> [step <num Schritt>]
<Anweisungen>
endFor
Funktion
Die Anweisungen zwischen for und endFor werden solange ausgeführt, bis Zähler den spezifizierte Wert Ende
überschreitet.
Der Zähler wird auf den Wert Anfang initialisiert. Wenn Anfang Ende überschreitet, werden die Anweisungen
zwischen for und endFor nicht ausgeführt. Bei jedem Iterationsschritt wird Zähler um den Wert Schritt und die
Anweisungen zwischen for und endFor werden, solange der Zähler den Wert Ende nicht überschreitet, wiederholt.
Wenn Schritt positiv ist, hat der Zähler Ende dann überschritten, wenn er größer ist als Ende. Wenn Schritt negativ
ist, hat der Zähler Ende überschritten, wenn er kleiner ist als Ende.
Parameter
num Zähler Variable des Typs num, die als Zähler verwendet wird
Zum Beispiel
num i
joint jDest
jDest = {0,0,0,0,0,0}
// Dreht die Achse 1 von 10° in Schritten von je 10 Grad
for i = 90 to -90 step -10
jDest.j1 = i
movej(jDest, flange, mNomSpeed)
waitEndMove()
endFor
Anweisung switch
Syntax
switch <num Auswahl>
case <num Fall1> [, <num Fall2>]
<Anweisungen1-2>
break
[case <num Fall3> [, <num Fall4>]
<Anweisungen3-4>
break ]
[default
<Standardanweisungen>
break ]
endSwitch
Funktion
Führt die Anweisungen für die spezifizierte Auswahl aus.
Wenn für Auswahl ein nicht ganzzahliger Wert spezifiziert wurde oder für eine Fall (Fall Test), wird die nächstliegende
ganze Zahl verwendet.
Wenn kein Fall auf die spezifizierte Auswahl zutrifft, werden die Standardanweisungen ausgeführt, sofern vorhanden.
Wenn der gleiche Wert für Fall mehrmals auftritt, wird nur das letzte Auftreten berücksichtigt.
Parameter
num Auswahl Variable numerischen Typs num zur Auswahl
Zum Beispiel
num nMenü
string s
// Testet, ob die Menütaste gedrückt ist
nMenü = get()
switch nMenü
case 271
s = "Menü 1"
break
case 272
s= "Menü 2"
break
case 273, 274, 275, 276, 277, 278
s = "Menü 3 à 8"
break
default
s = "Diese Schaltfläche ist kein Menü"
break
endSwitch
Anweisungen
num size(Variable)
Syntax
num size(<Variable>)
Funktion
Liefert die Größe der Variable.
Wenn es sich bei Variable um einen "By Reference" übergebenen Programmparameter handelt, so hängt ihre Größe
von dem beim Aufruf des Programms festgelegten Index ab.
Parameter
Variable Variable beliebigen Typs
Zum Beispiel
num nTabelle[10]
program printSize(num& nParamètre)
begin
putln(size(nParamètre))
end
call printSize(nTabelle) // ergibt 10
call printSize(nTabelle[6]) // ergibt 4
TYP BOOL
Definition
Variablen oder Konstanten des Typs bool können folgende Werte annehmen:
- true: wahr
- false: falsch
Der vorprogrammierte Wert für eine Variable des Typs bool ist immer false.
Operatoren
Mit zunehmender Priorität:
bool <bool& Variable> = <bool Weist den Wert von Bedingung der Variable Variable zu und überträgt
Bedingung> den Wert von Bedingung.
bool <bool Bedingung1> or Überträgt den Wert des logischen OR zwischen Bedingung1 und
<bool Bedingung2> Bedingung2.. Bedingung2 wird nur zur Bewertung herangezogen, wenn
Bedingung1 false ist.
bool <bool Bedingung1> and Überträgt den Wert des logischen AND für Bedingung1 und Bedingung2..
<bool Bedingung2> Bedingung2 wird nur zur Bewertung herangezogen, wenn Bedingung1
true ist.
bool <bool Bedingung1> xor Überträgt den Wert des ausschließenden logischen OR für Bedingung1
bool <Bedingung2> und Bedingung2.
bool <bool Bedingung1> != Testet die Ungleichheit der Werte für Bedingung1 und Bedingung2.
<bool Bedingung2> Überträgt true, wenn die Werte verschieden sind, andernfalls false.
bool <bool Bedingung1> == Testet die Ungleichheit der Werte für Bedingung1 und Bedingung2.
<bool Bedingung2> Überträgt true, wenn die Werte identisch sind, andernfalls false.
bool ! <bool Bedingung> Überträgt das Gegenteil des Wertes für Bedingung
TYP NUM
Definition
Der Typ num stellt einen numerischen Wert mit etwa 14 signifikanten Stellen dar.
Numerische Berechnungen erfolgen daher mit einer durch die 14 Stellen beschränkten Genauigkeit.
Dies ist bei der Prüfung der Gleichheit zweier numerischer Werte zu berücksichtigen: Deshalb muss in der Regel in
einem Intervall geprüft werden.
Zum Beispiel
putln(sel(cos(90)==0,1,-1)) // ergibt -1
putln(sel(abs(cos(90))<0.000000000000001,1,-1)) // ergibt 1
Konstanten numerischen Typs haben folgendes Format:
[-] <Zahlen>[.<Zahlen>]
Zum Beispiel
1
0.2
-3.141592653
Variablen des Typs num werden vorprogrammiert auf den Wert 0 initialisiert.
bool <num Wert1> != <num Wert2> Überträgt true, wenn Wert1 ungleich Wert2 ist,
andernfalls false.
bool <num Wert1> == <num Wert2> Überträgt true, wenn Wert1 gleich Wert2 ist,
andernfalls false.
bool <num Wert1> >= <num Wert2> Überträgt true, wenn Wert1 größer gleich Wert2 ist,
andernfalls false.
bool <num Wert1> > <num Wert2> Überträgt true, wenn Wert1 größer Wert2 ist,
andernfalls false.
bool <num Wert1> <= <num Wert2> Überträgt true, wenn Wert1 kleiner gleich Wert2 ist,
andernfalls false.
bool <num Wert1> < <num Wert2> Überträgt true, wenn Wert1 kleiner Wert2 ist,
andernfalls false.
num <num Wert1> - <num Wert2> Überträgt den Unterschied zwischen Wert1 und Wert2.
num <num Wert1> + <num Wert2> Überträgt die Summe von Wert1 und Wert2.
num <num Wert1> % <num Wert2> Überträgt den Rest der Division von Wert1 durch
Wert2. Ist Wert2 gleich 0, wird eine Fehlermeldung
generiert. Das Zeichen für den Rest ist das Zeichen von
Wert1.
num <num Wert1> / <num Wert2> Überträgt den Quotienten von Wert1 durch Wert2. Ist
Wert2 gleich 0, wird eine Fehlermeldung generiert.
num <num Wert1> * <num Wert2> Überträgt das Produkt von Wert1 und Wert2.
Anweisungen
num sin(num Winkel)
Syntax
num sin(<num Winkel>)
Funktion
Liefert den Sinus von Winkel.
Parameter
num Winkel Winkel in Grad
Zum Beispiel
putln(sin(30)) // ergibt 0.5
Syntax
num asin(<num Wert>)
Funktion
Liefert die Inverse des Sinus von Wert in Grad. Das Ergebnis liegt zwischen -90 und +90 Grad.
Ist Wert größer als 1 oder kleiner als -1, wird eine Fehlermeldung generiert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(asin(0.5)) // ergibt 30
Syntax
num cos(<num Winkel>)
Funktion
Liefert den Cosinus von Winkel.
Parameter
num Winkel Winkel in Grad
Zum Beispiel
putln(cos(60)) // ergibt 0.5
Syntax
num acos(<num Wert>)
Funktion
Liefert die Inverse des Cosinus von Wert in Grad. Das Ergebnis liegt zwischen 0 und 180 Grad.
Ist Wert größer als 1 oder kleiner als -1, wird eine Fehlermeldung generiert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(acos(0.5)) // ergibt 60
Syntax
num tan(<num Winkel>)
Funktion
Liefert die Tangente von Winkel.
Ist der Winkel zu groß oder zu klein (ungenügende Rechengenauigkeit), wird eine Fehlermeldung generiert.
Parameter
num Winkel Winkel in Grad
Zum Beispiel
putln(tan(45)) // ergibt 1.0
Syntax
num atan(<num Wert>)
Funktion
Liefert die Inverse des Tangens von Wert in Grad. Das Ergebnis liegt zwischen -90 und +90 Grad.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(atan(1)) // ergibt 45
Syntax
num abs(<num Wert>)
Funktion
Liefert den Absolutbetrag von Wert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(sel(abs(45)==abs(-45),1,-1)) // ergibt 1
Syntax
num sqrt(<num Wert>)
Funktion
Liefert die Quadratwurzel von Wert.
Ist Wert negativ, wird eine Fehlermeldung generiert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(sqrt(9)) // ergibt 3
Syntax
num exp(<num Wert>)
Funktion
Liefert den Exponentialwert vonWert.
Ist Wert zu groß, wird eine Fehlermeldung erzeugt.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(exp(1)) // ergibt 2.718282
Syntax
num ln(<num Wert>)
Funktion
Liefert den natürlichen Logarithmus von Wert.
Ist Wert negativ oder null, wird eine Fehlermeldung generiert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(ln(2.718281828)) // ergibt 1
Syntax
num log(<num Wert>)
Funktion
Liefert den Zehnerlogarithmus von Wert.
Ist Wert negativ oder null, wird eine Fehlermeldung generiert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(log(10)) // ergibt 1
Syntax
num roundUp(<num Wert>)
Funktion
Liefert den nächstgrößeren ganzzahligen Wert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(roundUp(7.8)) // Ergibt den Wert 8
putln(roundUp(-7.8)) // Ergibt den Wert -7
Syntax
num roundDown(<num Wert>)
Funktion
Liefert den nächstkleineren ganzzahligen Wert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(roundDown(7.8)) // Ergibt den Wert 7
putln(roundDown(-7.8)) // Ergibt den Wert -8
Syntax
num round(<num Wert>)
Funktion
Liefert den nächstliegenden ganzzahligen Wert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(round(7.8)) // Ergibt den Wert 8
putln(round(-7.8)) // Ergibt den Wert -8
Syntax
num min(<num x>, <num y>)
Funktion
Liefert den kleineren Wert von x und y.
Parameter
num x Numerischer Ausdruck
Zum Beispiel
putln(min(-1,10)) // Ergibt den Wert -1
Syntax
num max(<num x>, <num y>)
Funktion
Liefert den größeren Wert von x und y.
Parameter
num x Numerischer Ausdruck
Zum Beispiel
putln(max(-1,10)) // Ergibt den Wert -10
Syntax
num limit(<num Wert>, <num Mini>, <num Maxi>)
Funktion
Liefert den durch die Werte Mini und Maxi begrenzten Wert.
Parameter
num Wert Numerischer Ausdruck
Zum Beispiel
putln(limit(30,-90,90)) // ergibt 30
putln(limit(100,90,-90)) // ergibt 90
putln(limit(-100,-90,90)) // ergibt -90
Syntax
num sel(<bool Bedingung>, <num Wert1>, <num Wert2>)
Funktion
Liefert Wert1, wenn Bedingung gleich true ist, ansonsten Wert2.
Parameter
bool Bedingung Boolescher Ausdruck
Zum Beispiel
putln(sel(bFlag,a,b))
// ist äquivalent zu
if bFlag==true
putln(a)
else
putln(b)
endIf
Operatoren
Mit zunehmender Priorität:
string <string& Variable> = <string Kette> Weist der Variablen Variable die Zeichenkette zu und
überträgt Kette.
bool <string Kette1> != <string Kette2> Liefert true, wenn Kette1 und Kette2 nicht identisch
sind, ansonsten false.
bool <string Kette1> == <string Kette2> Liefert true, wenn Kette1 und Kette2 identisch sind,
ansonsten false.
string <string Kette1> + <string <Kette2> Liefert die 128 ersten Zeichen von Kette1 verknüpft
mit Kette2.
Anweisungen
string toString(string Format, num Wert)
Syntax
string toString(<string Format>, <num Wert>)
Funktion
Liefert eine Zeichenkette, die Wert im Anzeigeformat Format darstellt.
Das Format hat die Form "Größe.Präzision", wobei Größe für die Mindestgröße des Ergebnisses (gegebenenfalls
werden am Anfang der Zeichenkette Leerstellen hinzugefügt) und Präzision für die Anzahl bedeutungstragender
Ziffern nach dem Dezimalkomma steht (die 0 am Ende der Kette werden durch Leerstellen ersetzt). Größe und
Präzision haben den Standardwert 0. Der ganzzahlige Teil des Werts wird niemals verkürzt, auch wenn seine
Anzeigelänge den Wert von Größe übertrifft.
Parameter
string Format Ausdruck des Typs Zeichenkette
Zum Beispiel
num nPi
nPi = 3.141592654
putln(toString(".4", nPi)) // ergibt «3.1416»
putln(toString("8", nPi)) // ergibt « 3»
putln(toString("8.4", nPi)) // ergibt « 3.1416»
putln(toString("8.4", 2.70001)) // ergibt « 2.7 »
putln(toString("", nPi)) // ergibt «3»
putln(toString("1.2", 1234.1234)) // ergibt «1234.12»
Siehe auch
string chr(num ASCII-Code)
string toNum(string Kette, num& Wert, bool& Bericht)
Syntax
string toNum(<string Kette>, <num& Wert>, bool& Bericht)
Funktion
Bestimmt den numerischen Wert am Anfang der genannten Kette, und übergibt Kette, in der alle Zeichen bis zum
nächsten numerischen Wert entfernt worden sind.
Befindet sich am Anfang von Kette kein numerischer Wert, so wird Bericht auf false gesetzt und Wert wird nicht
geändert, andernfalls wird rapport auf true gesetzt.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
num nVal
bool bOk
putln(toNum("10 20 30", nVal, bOk)) // Zeigt «20 30» an, nVal nimmt den Wert 10, bOk den Wert true
putln(toNum("a10 20 30", nVal, bOk)) // Zeigt «a10 20 30» an, nVal bleibt unverändert, bOk ist false
putln(toNum("10 end", nVal, bOk)) // Zeigt «» an, nVal nimmt den Wert 10, bOk den Wert true
buffer = "+90 0.0 -7.6 17.3"
do
buffer = toNum(buffer, nVal, bOk)
putln(nVal) // Zeigt nacheinander an: 90, 0, -7.6, 17.3
until (bOk ! = true)
Siehe auch
string toString(string Format, num Wert)
Syntax
string chr(<num ASCII-Code>)
Funktion
Übergibt das der Zahl ASCII Wert-Code entsprechende Zeichen, wenn dieses als Typ string erkannt wird, andernfalls
eine leere Zeichenkette.
In der nachstehenden Tabelle sind die ASCII-Code-Zahlen kleiner 128 zusammengestellt. Die grau dargestellten
Zeichen werden nicht als Typ string erkannt:
Parameter
num Wert Ausdruck des Typs num
Zum Beispiel
putln(chr(65)) // ergibt «A»
Siehe auch
num asc(string chaîne, num position)
Syntax
num asc(<string Kette>, <num position>)
Funktion
Gibt den ASCII-Code des Indexzeichens Position wieder.
Wird -1, wenn Position negativ oder größer als Kette ist.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(asc("A",0)) // ergibt 65
Siehe auch
string chr(num ASCII-Code)
Syntax
string left(<string Kette>, <num Größe>)
Funktion
Liefert die Größe ersten Zeichen von Kette. Wenn Größe größer ist als die Länge von Kette, liefert diese Anweisung
die Kette.
Ist Größe negativ, wird eine Fehlermeldung generiert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(left("hello world",5)) // ergibt «hello»
Syntax
string right(<string Kette>, <num Größe>)
Funktion
Liefert die Größe letzten Zeichen von Kette. Wenn die spezifizierte Anzahl größer ist, als die Länge von Kette, liefert
diese Anweisung Kette.
Ist Größe negativ, wird eine Fehlermeldung generiert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(right("hello world",5)) // ergibt «world»
Syntax
string mid(<string Kette>, <num Größe>, <num Position>)
Funktion
Liefert Größe Zeichen von Kette ab dem Zeichen Position bis zum Ende von Kette.
Sind Größe oder Position negativ, wird eine Fehlermeldung generiert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(mid(«hello wild world»,4,6)) // ergibt «wild»
Syntax
string insert(<string Kette>, <string Einfügen>, <num Position>)
Funktion
Überträgt die Kette, in die Einfügen nach dem Zeichen an der Stelle Position eingefügt wurde. Ist Position größer als
die Größe von Kette, so wird Einfügen am Ende von Kette angefügt. Das Ergebnis wird nach 80 Zeichen
abgeschnitten.
Ist Position negativ, wird eine Fehlermeldung generiert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(insert("hello world","wild ",6)) // ergibt «hello wild world»
Syntax
string delete(<string Kette>, <num Größe>, <num Position>)
Funktion
Überträgt Kette, in der die Größe Zeichen nach dem Zeichen an der Stelle Position gelöscht wurden. Wenn Position
größer ist als die Länge von Kette, überträgt die Anweisung Kette.
Sind Größe oder Position negativ, wird eine Fehlermeldung generiert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
string source
putln(delete(source="hello wild world",5,6)) // ergibt «hello world»
putln(source) // ergibt «hello wild world»
Syntax
string replace(<string Kette>, <string Ersetzen>, <num Größe>, <num Position>)
Funktion
Überträgt Kette, in der die Größe Zeichen nach dem Zeichen an der Stelle Position durch Ersetzen ersetzt wurden.
Wenn Position größer ist als die Länge von Kette, überträgt die Anweisung Kette.
Sind Größe oder Position negativ, wird eine Fehlermeldung generiert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(replace("hello ? world","wild",1,6)) // ergibt «hello wild world»
Syntax
num find(<string Kette1>, <string Kette2>)
Funktion
Überträgt die Stelle (zwischen 0 und 127) des ersten Zeichens beim erstmaligen Auftreten von Kette2 in Kette1. Wenn
Kette2 nicht in Kette1 enthalten ist, liefert die Anweisung -1.
Parameter
string Kette1 Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(find("hello wild world","wild")) // ergibt 6
Syntax
num len(<string Kette>)
Funktion
Überträgt die Länge von Kette.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Zum Beispiel
putln(len("hello wild world")) // ergibt 16
Operatoren
Mit zunehmender Priorität:
bool <dio Ausgang> = <dio Ein-/ Ordnet den Status von Ein-/Ausgang dem Ausgang zu und
Ausgang> überträgt diesen Status. Wenn Ausgang keinem digitalen
Ausgang des Systems zugewiesen ist, wird eine
Fehlermeldung erzeugt.
bool <dio Ausgang> = <bool Weist Bedingung dem Status des Ausgang zu und überträgt
Bedingung> Bedingung. Wenn Ausgang keinem digitalen Ausgang des
Systems zugewiesen ist, wird eine Fehlermeldung erzeugt.
bool <dio Eingang1> != <bool Überträgt true, wenn Eingang1 und Eingang2 nicht den
Eingang2> gleichen Status haben, ansonsten false.
bool <dio Eingang> != <bool Überträgt true, wenn der Status des Eingang nicht gleich
Bedingung> Bedingung ist, ansonsten false.
bool <dio Eingang> == <bool Überträgt true, wenn der Status des Eingang gleich
Bedingung> Bedingung ist, ansonsten false.
bool <dio Eingang1> == <dio Eingang2> Überträgt true, wenn Eingang1 und Eingang2 den gleichen
Status haben, ansonsten false.
Anweisungen
void dioLink(dio& Variable, dio Quelle)
Syntax
void dioLink(<dio& Variable>, <dio Quelle>)
Funktion
Weist Variable dem Ein-/Ausgang des Systems, an dem Quelle angeschlossen ist, zu.
Wenn Quelle ein im System geschützter Ein-/Ausgang ist, wird eine Fehlermeldung erzeugt.
Parameter
dio& Variable Variable des Typs digitaler Ein-/Ausgang
Zum Beispiel
dio dZange1
dio dZange2
dioLink(dZange1, io:Ventil1) // Verbindet dZange1 mit dem Ein-/Ausgang des Systems Ventil1
dioLink(dZange2, dZange1) // Verbindet dZange2 mit dem Ein-/Ausgang von dZange1, und somit
mit Ventil1
dioLink(dZange1, io:Ventil2) // dZange2 ist nun mit Ventil2 und dZange1 immer noch mit
Ventil1 verbunden
Syntax
num dioGet(<dio dTabelle>)
Funktion
Übergibt den Zahlenwert der dTabelle von dio, welcher wie eine ganze Zahl in Binärschreibweise gelesen wird, das
heißt: dTabelle[0]+2 dTabelle[1]+4 dTabelle[2]+...+2 k dTabelle[k], oder dTabelle[i] = 1 wenn dTabelle[i]
gleich true ist, anderenfalls 0.
Ist ein Element der dTabelle nicht an einem Ein-/Ausgang des Systems angeschlossen, so wird ein Ausführungsfehler
erzeugt.
Parameter
dio nTabelle Ausdruck des Typs dio
Zum Beispiel
dio dCode[4]
dCode[0] = false
dCode[1] = false
dCode[2] = false
dCode[3] = true
putln(dioGet(dCode)) // ergibt 10 = 0 + 2 1 + 4 0 + 8 1
Siehe auch
num dioSet(dio dTabelle, num Wert)
Syntax
num dioSet(<dio dTabelle>, <num Wert>)
Funktion
Ordnet den binär geschriebenen ganzzahligen Teil von Wert den digitalen Ein-/Ausgängen der dTabelle zu und
übergibt den tatsächlich zugeordneten Wert, das heißt:
dTabelle[0]+2 dTabelle[1]+4 dTabelle[2]+...+2 k dTabelle[k], oder dTabelle[i] = 1 wenn dTabelle[i] gleich
true ist, anderenfalls 0.
Ist ein Element der dTabelle keinem Ausgang des Systems zugeordnet, wird ein Ausführungsfehler erzeugt.
Parameter
dio dTabelle Ausdruck des Typs dio
Zum Beispiel
dio dCode[4]
? dioSet(dCode, 10) // ergibt 10 = 0 + 2 1 + 4 0 + 8 1
? dioSet(dCode, 26) // ergibt 10, da code nicht ausreicht, um 26 vollständig in binär
aufzunehmen
Siehe auch
num dioGet(dio dTabelle)
TYP AIO
Definition
Der Typ aio ermöglicht es, eine Variable VAL3 einem numerischen Ein-/Ausgang (digital oder analog) des Systems
zuzuordnen.
Die im System deklarierten Ein-/Ausgänge können direkt in einer VAL3-Applikation verwendet werden, ohne dass sie
vorher in der Applikation als lokale oder globale Variable deklariert werden müssen. Der Typ aio dient daher vor allem
zum Parametrieren eines Programms, in dem Ein- oder Ausgänge verwendet werden.
Anweisungen, in denen eine Variable des Typs aio verwendet wird, die nicht einem im System deklarierten Ein-/
Ausgang zugewiesen wurde, bewirken eine Fehlermeldung.
Eine Variable des Typs aio ist nicht von vornherein einem Ein-/Ausgang zugewiesen und führt zu einer Fehlermeldung,
wenn sie ohne Zuweisung verwendet wird.
Anweisungen
void aioLink(aio& Variable, aio Quelle)
Syntax
void aioLink(<aio& Variable>, <aio Quelle>)
Funktion
Weist Variable dem Ein-/Ausgang des Systems, an dem Quelle angeschlossen ist, zu.
Wenn Quelle ein im System geschützter Ein-/Ausgang ist, wird eine Fehlermeldung erzeugt.
Parameter
aio& Variable Variable des Typs aio
Zum Beispiel
aio aCapteur1
aio aCapteur2
aioLink(aCapteur1, io:système1) // Verbindet aCapteur1 mit dem Ein-/Ausgang des Systems système1
aioLink(aCapteur2, aCapteur1) // Verbindet aCapteur2 mit dem Ein-/Ausgang von aCapteur1, und somit mit
système1
aioLink(aCapteur1, io:système2) // aCapteur2 ist nun mit système2 und aCapteur1 immer noch mit
système1 verbunden.
Syntax
num aioGet(<aio Eingang>)
Funktion
Übersendet den numerischen Wert von Eingang.
Ist Eingang nicht mit einem Ein-/Ausgang des Systems verbunden, so wird ein Ausführungsfehler erzeugt.
Parameter
aio Tabelle Ausdruck des Typs aio
Zum Beispiel
aio aCapteur
putln(aioGet(aCapteur)) // zeigt den aktuellen Wert des Sensors an
Siehe auch
num aioSet(aio Ausgang, num Wert)
Syntax
num aioSet(<aio Ausgang>, <num Wert>)
Funktion
Ordnet Wert den Wert von Ausgang zu und sendet Wert zurück.
Ist Ausgang mit keinem Ausgang des Systems verbunden, so wird ein Ausführungsfehler erzeugt.
Parameter
aio& Ausgang Ausdruck des Typs aio
Zum Beispiel
aio aCommande
putln(aioSet(aCommande, -12.3)) // ergibt -12.3
Siehe auch
num aioGet(aio Eingang)
TYP SIO
Definition
Der Typ sio ermöglicht es, eine VAL3-Variable einem seriellen Ein-/Ausgang des Systems oder einer Verbindung per
Ethernet-Socket zuzuordnen. Ein sio-Ein-/Ausgang ist gekennzeichnet durch:
• Im System definierte, dem Typ der Kommunikation eigene Parameter
• Ein Zeichenketten-Endzeichen, um die Verwendung des Typs string zu ermöglichen
• Eine Kommunikations-Wartefrist
Die seriellen Ein-/Ausgänge des Systems sind ständig aktiviert. Die Verbindungen per Ethernet-Socket werden beim
ersten Lese-/Schreibzugriff durch ein VAL3-Programm aktiviert. Bei Beendigung der VAL3-Anwendung, werden die
Verbindungen per Ethernet-Socket automatisch deaktiviert.
Die im System erklärten Ein-/Ausgänge sind in einer Applikation des Typs VAL3 direkt verwendbar, ohne dass sie in
der Applikation als globale oder lokale Variable erklärt werden müssen. Der Typ sio dient daher vor allem zum
Parametrieren eines Programms, in dem Ein- oder Ausgänge verwendet werden.
Anweisungen, in denen eine Variable des Typs sio verwendet wird, die nicht einem im System deklarierten Ein-/
Ausgang zugewiesen wurde, bewirken eine Fehlermeldung.
Eine Variable des Typs sio ist nicht von vornherein einem Ein-/Ausgang zugewiesen und führt zu einer Fehlermeldung,
wenn sie ohne Zuweisung verwendet wird.
Operatoren
Wird die Kommunikations-Wartefrist beim Lesen oder Schreiben eines seriellen Ein-/Ausgangs erreicht, so wird ein
Ausführungsfehler erzeugt.
string <sio Ausgang> = <string Angabe> Schreibt nacheinander in Ausgang die Zeichen von
Angabe, gefolgt vom Zeichenketten-Endzeichen, und
übergibt Angabe.
num <sio Ausgang> = <num Angabe> Schreibt in Ausgang die Angabe nähestliegende
ganze Zahl, Modulo 256, und übergibt den tatsächlich
übermittelten Wert.
num <num Angabe> = <sio Eingang> Liest ein Zeichen in Eingang und ordnet Angabe den
ASCII-Code dieses Zeichens zu.
string <string Angabe> = <sio Eingang> Liest in Eingang eine Zeichenkette und ordnet dieser
Angabe zu. Mit dem Typ string nicht kompatible
Zeichen werden außer Acht gelassen. Die
Zeichenkette endet, wenn das Zeichenketten-
Endzeichen gelesen wird, oder wenn Angabe die
maximale Größe des Typs string (128 Zeichen)
erreicht hat. Das Zeichenketten-Endzeichen wird
nicht in Angabe übertragen.
Syntax
void sioLink(<sio& Variable>, <sio Quelle>)
Funktion
Verbindet Variable mit dem seriellen Ein-/Ausgang des Systems, an dem Quelle angeschlossen ist.
Wenn Quelle ein im System geschützter Ein-/Ausgang ist, wird eine Fehlermeldung erzeugt.
Parameter
sio& Variable Variable des Typs sio
Zum Beispiel
sio sCapteur1
sio sCapteur2
sioLink(sCapteur1, io: serial1) // Verbindet sCapteur1 mit dem Ein-/Ausgang des Systems serial1
sioLink(sCapteur2, sCapteur1) // Verbindet sCapteur2 mit dem Ein-/Ausgang von sCapteur1, und
somit mit serial1
sioLink(sCapteur2, io: serial1) // Verbindet sCapteur2 mit serial1, sCapteur1 ist weiterhin mit
serial1 verbunden
Syntax
num clearBuffer(<sio Eingang>)
Funktion
Leert den Lesepuffer von Eingang und teilt die Anzahl der so gelöschten Zeichen mit.
Bei Verbindungen per Ethernet-Socket, übernimmt clearBuffer die Socket-Deaktivierung, falls diese schon
stattgefunden hat, meldet clearBuffer -1.
Wenn Eingang keiner seriellen Verbindung oder Ethernet-Socket zugewiesen ist, wird ein Ausführungsfehler erzeugt.
Syntax
num sioGet(<sio Eingang>,<num& Daten>)
Funktion
Liest eine Zeichentabelle in Eingang und teilt die Anzahl der gelesenen Zeichen mit. Der Lesevorgang wird
beendet, wenn die Tabelle Angabe voll oder der Eingangs-Lesepuffer leer ist.
Bei Verbindungen per Ethernet-Socket versucht sioGet zuerst die Verbindung herzustellen, wenn diese noch
nicht aktiviert wurde. Nach dem Erreichen der Kommunikations-Wartefrist eines Eingangs meldet sioGet -1.
Wenn die Verbindung aktiviert ist, aber keine Daten im Eingangs-Lesepuffer vorhanden sind, wartet sioGet
solange, bis Daten empfangen werden oder die Kommunikations-Wartefrist abgelaufen ist.
Wenn Eingang keiner seriellen Verbindung oder Ethernet-Socket zugewiesen ist oder Daten keine VAL3-
Variable ist, wird ein Ausführungsfehler erzeugt.
Syntax
num sioSet(<sio Ausgang>,<num& Daten>)
Funktion
Schreibt eine Zeichentabelle in Ausgang und teilt die Anzahl der geschriebenen Zeichen mit. Die digitalen Werte
werden vor der Übertragung in ganze Zahlen zwischen 0 und 255 umgewandelt, dabei wird jeweils die
nähestliegende ganze Zahl Modulo 256 verwendet.
Bei Verbindungen per Ethernet-Socket versucht sioSet zuerst die Verbindung herzustellen, wenn diese noch
nicht aktiviert wurde. Nach dem Erreichen der Kommunikations-Wartefrist eines Ausgangs meldet sioSet -1. Die
Anzahl der geschriebenen Zeichen kann unter der Größe von Daten liegen, wenn ein Kommunikationsfehler
entdeckt wurde.
Wenn Ausgang keiner seriellen Verbindung oder Ethernet-Socket zugewiesen ist, wird ein Ausführungsfehler
erzeugt.
Bedienerseite
Die über die Benutzerschnittstelle VAL3 eingegebenen Anweisungen erlauben:
- die Anzeige von Meldungen auf dem Handbediengerät (MCP) für diese Applikation
- die Erfassung der Eingaben auf der Tastatur des MCP
Bedienerseite
Die Bedienerseite hat 14 Zeilen mit je 40 Zeichen. Die letzte Zeile kann zur Erstellung von Menüs mit zugeordneter
Taste verwendet werden. Eine weitere Zeile steht zur Anzeige eines Titels zur Verfügung.
Anweisungen
Syntax
void userPage ()
void userPage (<bool fix>)
Funktion
Bewirkt die Anzeige der Bedienerseite auf dem Display des MCP.
Wenn der Parameter fix true ist, kann der Bediener nur auf die Bedienerseite zugreifen sowie über den Shortcut "Shift
User" auf die Seite Profiländerung. Wenn diese Seite angezeigt wird, kann die Anwendung mit der Taste "Stop"
gestoppt werden, falls das aktuelle Benutzerprofil dies erlaubt.
Hat der Parameter den Wert false, so sind auch die anderen CS8-Seiten zugänglich.
Syntax
void gotoxy(<num x>, <num y>)
Funktion
Bewegt den Cursor der Bedienerseite auf die Koordinaten (x, y). Die linke obere Ecke hat die Koordinaten (0,0), die
rechte untere Ecke (39, 13).
Auf die Abszisse x wird Modulo 40 angewandt. Für die Ordinate y gilt Modulo 14.
Parameter
num x Abszisse des Cursors (von 0 bis 39)
Siehe auch
void cls()
void cls()
Syntax
void cls()
Funktion
Löscht die Bedienerseite und bewegt den Cursor auf (0,0).
Siehe auch
void gotoxy(num x, num y)
Syntax
void put(<string Kette>)
void put(<num Wert>)
void putln(<string Kette>)
void putln(<num Wert>)
Funktion
Zeigt auf der Bedienerseite an der Stelle des Cursors die Kette oder den spezifizierten Wert an (mit 3 Dezimalstellen).
Der Cursor wird anschließend auf das dem letzten Zeichen der angezeigten Meldung folgende Zeichen weiterbewegt
(Anweisung put), oder auf das erste Zeichen der nächsten Zeile (Anweisung putln).
Beim Erreichen des Zeilenendes, wird die Anzeige auf der nächsten Zeile fortgesetzt.
Am Seitenende verschiebt sich die Anzeige der Benutzerseite eine Zeile nach oben.
Parameter
string Kette Ausdruck des Typs Zeichenkette
Siehe auch
void popUpMsg(string Kette)
void logMsg(string Kette)
void title(string Kette)
Syntax
void title(<string Kette>)
Funktion
Ändert den Titel der Bedienerseite.
Die aktuelle Position des Cursors wird durch die Anweisung title() nicht geändert.
Parameter
string Kette Ausdruck des Typs Zeichenkette
num get()
Syntax
num get(<string& Kette>)
num get(<num& Wert>)
num get()
Funktion
Erfasst eine in die Tastatur der Konsole eingegebene Zeichenkette, eine Zahl oder eine Taste.
Kette oder Wert wird an der aktuellen Position des Cursors angezeigt und kann vom Benutzer geändert werden. Die
Eingabe wird mit einer Menütaste, mit Return oder Esc beendet.
Die Anweisung überträgt den Code der Taste, mit der die Eingabe beendet wurde.
Mit der Return- oder einer Menütaste wird die Variable Kette oder Wert aktualisiert. Mit der Esc-Taste bleibt sie
unverändert.
Wenn kein Parameter übertragen wurde, wartet die Anweisung get() auf einen beliebigen Tastendruck und sendet
ihren Code zurück. Die gedrückte Taste wird nicht angezeigt.
Die aktuelle Position des Cursors wird durch die Anweisung get() nicht geändert.
Ohne Shift Mit Shift
3 Caps Space 3 Caps Space
283 - 32 Move 283 - 32 Move
- -
Ret. Ret.
2 Shift Esc Help Run 2 Shift Esc Help Run
282 - 255 - 270 - 282 - 255 - 270 -
Menu Tab Up Bksp Stop Menu UnTab PgUp Bksp Stop
- 259 261 263 - - 260 262 263 -
1 User Left Down Right 1 User Home PgDn End
281 - 264 266 268 281 - 265 267 269
Mit Shift
7 8 9 + * ; ( ) [ ]
55 56 57 43 42 59 40 41 91 93
4 5 6 - / ? : ! { }
52 53 54 45 47 63 58 33 123 125
1 2 3 0 " % - . , >
49 50 51 48 34 37 95 46 44 62
Parameter
string& Kette Variable des Typs string
Zum Beispiel
num nValeur
num nKey
// Wartet auf die Return-Taste zum Validieren der Eingabe
do
nKey = get (nValeur)
until (nKey == 270)
Siehe auch
num getKey()
Syntax
num getKey()
Funktion
Erfasst den Wert einer Taste der Pult-Tastatur. Liefert den Code der seit dem letzten Aufruf von getKey() zuletzt
gedrückten Taste. Wurde seitdem keine Taste gedrückt, so wird der Code -1 übergeben.
Im Gegensatz zur Anweisung get() übergibt die Anweisung getKey() den Wert sofort.
Die gedrückte Taste wird nicht angezeigt und die aktuelle Cursorposition wird nicht geändert.
Zum Beispiel
// Anzeige der Systemuhr bis zum Drücken einer beliebigen Taste
getKey() // Neuinitialisierung des Codes der zuletzt gedrückten
Taste
while (getKey()== -1)
gotoxy(0,0)
put(toString(«», clock()* 10))
endWhile
Siehe auch
num get()
bool isKeyPressed(nom code)
Syntax
bool isKeyPressed(<num code>)
Funktion
Liefert den Zustand der spezifizierten Taste durch ihren Code (siehe get()), true bei gedrückter Taste, ansonsten false.
Siehe auch
num getKey()
Syntax
void popUpMsg(<string Kette>)
Funktion
Zeigt Kette in einem "popup"-Fenster über dem aktuellen MCP-Fenster an. Dieses Fenster bleibt so lange angezeigt,
bis es im Menü mit Ok bestätigt oder die Esc-Taste gedrückt wird.
Siehe auch
void userPage(), void userPage(bool fix)
void put() void putln()
Syntax
void logMsg(<string Kette>)
Funktion
Schreibt Kette in die Protokollliste des Systems. Die Meldung wird mit Datum und Uhrzeit registriert.
Siehe auch
void popUpMsg(string Kette)
string getProfile()
Syntax
string getProfile()
Funktion
Gibt den Namen des aktuellen Benutzerprofils zurück.
Definition
Eine Task ist ein Programm, das zu einem gegebenen Zeitpunkt ausgeführt wird.
In einer Applikation befinden sich typischerweise Tasks für die Armbewegungen, eine Task Automat, eine Task für die
Benutzerschnittstelle, eine Task für die Überwachung der Sicherheitssignale, Kommunikationstasks usw..
Eine Task ist durch folgende Elemente gekennzeichnet:
• Namen: Bezeichnung der Task, die im System nur einmal vorkommt
• Priorität: Parameter für Ablaufsteuerung der Tasks
• Programm: Einsprungstelle (und Aussprungstelle) der Task
• Status: aktiv oder beendet
• die nächste auszuführende Anweisung (mit Kontext)
Sequentielles Ordnen
Wenn in einer Applikation mehrere Tasks ausgeführt werden, hat es den Anschein, als ob dies gleichzeitig und
unabhängig voneinander erfolgt. Das ist jedoch nur richtig, wenn man die Applikation global, d.h. über genügend lange
Zeitintervalle von z.B. einer Sekunde betrachtet. Bei kurzen Zeitintervallen ist diese Aussage nicht mehr gültig.
Da das System nur einen Prozessor besitzt, kann es auch nur jeweils eine Task ausführen. Die Gleichzeitigkeit der
Ausführung wird durch ein rasches sequentielles Ordnen der einzelnen Tasks erreicht, die reihum einige Anweisungen
abarbeiten, bevor das System auf die nächste Task weitergeht.
Sequentielles Ordnen
Priorität
T1 führt die
Funktion delay() Zeit abgelaufen
aus.
T1 T1
Normale T1 Normale
Ausführung Ausführung
T2 T2 T2 T2 T2
T3 T3 T3 T3 T3
Zeit
Unter VAL3 sind die Sequenzen der Tasks nach folgenden Regeln geordnet:
1. Die Tasks werden in der Reihenfolge ihrer Erstellung sequentiell geordnet.
2. In jeder Sequenz versucht das System, die Anzahl von VAL3-Programmzeilen auszuführen, die der
Priorität der Task entspricht.
3. Sobald eine Programmzeile nicht beendet werden kann (Ausführungsfehler, Warten auf ein Signal, Task
unterbrochen...), fährt das System mit der nächsten Task fort.
4. Jede Task wird mindestens alle 10 ms aufgerufen.
Folgende Anweisungen in VAL3 bewirken ein sofortiges Weitergehen zur Sequenz der nächsten Task:
• watch() (zeitlich begrenztes Warten auf eine Bedingung)
• delay() (Wartezeit)
• wait() (Warten auf eine Bedingung)
• waitEndMove() (Warten auf Stillstand des Roboters)
• open() und close() (Warten auf Stillstand des Roboters mit anschließender Wartezeit)
• get() (Warten auf eine Tasteneingabe)
• resume() (wartet, bis die Task zum Neustart bereit ist)
• kill() (wartet, bis die Task tatsächlich gekillt ist)
• disablePower() (wartet, bis die Leistung tatsächlich abgeschaltet wurde)
• Die Anweisungen zum Zugriff auf den Inhalt der Festplatte (libLoad, libSave, libDelete, libList)
• Die Anweisungen zum Lesen / Schreiben von sio (Bediener =, sioGet(), sioSet())
program tache1()
begin
while(true)
call mutex(bEcran) // Anforderung der Komponente Bildschirm
call fillScreen(1)
bEcran = false // Freigabe der Komponente Bildschirm
delay(0) // Weitergehen zur nächsten Task
endWhile
end
program tache2()
begin
while(true)
call mutex(bEcran) // Anforderung der Komponente Bildschirm
call fillScreen(2)
bEcran = false // Freigabe der Komponente Bildschirm
delay(0) // Weitergehen zur nächsten Task
endWhile
end
Syntax
void taskSuspend(<string Name>)
Funktion
Unterbricht die Ausführung der Task Name.
Wenn die Task bereits den Status STOPPED hat, ist die Anweisung wirkungslos.
Wenn Name keiner Task in VAL3 entspricht, wird eine Fehlermeldung erzeugt.
Parameter
string Name Ausdruck des Typs Zeichenkette
Siehe auch
void taskResume(string Name, num Sprung)
void taskKill(string Name)
Syntax
void taskResume (<string Name>, <num Sprung>)
Funktion
Setzt die Task Name bei der Zeile fort, die Sprung Programmzeilen vor oder nach der aktuellen Zeile liegt.
Wenn Sprung negativ ist, wird die Ausführung vor der aktuellen Zeile fortgesetzt. Wenn die Task nicht den Status
STOPPED hat, ist die Anweisung wirkungslos.
Eine Fehlermeldung wird erzeugt, wenn Name keiner Task in VAL3 entspricht, oder wenn es für den spezifizierten
Sprung keine Programmzeile gibt.
Parameter
string Name Ausdruck des Typs Zeichenkette
Siehe auch
void taskSuspend(string Name)
void taskKill(string Name)
Syntax
void taskKill (<string Name>)
Funktion
Unterbricht und löscht anschließend die Task Name. Nach Ausführung dieser Anweisung ist die Task Name im System
nicht mehr vorhanden.
Wenn es keine Task Name gibt, ist die Anweisung wirkungslos.
Parameter
string Name Ausdruck des Typs Zeichenkette
Siehe auch
void taskSuspend(string Name)
void taskCreate string Name, num Priorität, Programm(...)
Parameter
string Name Ausdruck des Typs Zeichenkette
Siehe auch
void taskResume(string Name, num Sprung)
void taskKill(string Name)
Syntax
void taskCreate <string Name>, <num Priorität>, Programm([p1] [,p2])
Funktion
Erstellt und startet die Task Name.
Name muss 1 bis 12 Zeichen zwischen "a..zA..Z0..9_" besitzen. Es darf keine andere Task mit dem gleichen Namen
geben.
Die Ausführung von Name beginnt mit dem Aufruf von Programm mit den spezifischen Parametern. Für
Referenzparameter dürfen keine lokalen Variablen verwendet werden.
Die Task endet vorprogrammiert mit der letzten Zeile von Programm bzw. vorher, wenn diese ausdrücklich gelöscht
wurde.
Priorität muss zwischen 1 und 100 liegen. Bei jedem sequentiellen Ordnen der Tasks führt das System die in Priorität
angegebene Zahl von Programmzeilen aus, bzw. weniger, wenn eine sperrende Anweisung angetroffen wird (siehe
Kapitel Sequentielles Ordnen).
Wenn das System nicht genügend Speicherplatz zum Erstellen der Task vorfindet, Name ungültig oder bereits
vergeben oder Priorität ungültig ist, wird eine Fehlermeldung erzeugt.
Parameter
string Name Ausdruck des Typs Zeichenkette
Zum Beispiel
program affiche(string& sTexte)
begin
putln(sTexte)
sTexte = "stop"
end
string sMessage
program start()
begin
sMessage = "start"
taskCreate "t1", 10, affiche(sMessage) // ergibt « start »
wait(taskStatus("t1") == -1) // Wartet auf das Ende von t1
putln(sMessage) // ergibt "stop"
end
Siehe auch
void taskSuspend(string Name)
void taskKill(string Name)
num taskStatus(string Name)
Syntax
void wait(<bool Bedingung>)
Funktion
Stellt die aktuelle Task solange zurück, bis Bedingung true wird.
Die Task bleibt RUNNING während der Wartezeit. Wenn condition bei der ersten Überprüfung true ist, wird die
Ausführung sofort mit der gleichen Task fortgesetzt (kein sequentielles Ordnen der nächsten Task).
Parameter
bool Bedingung Boolescher Ausdruck
Siehe auch
void delay(num Sekunden)
bool watch(bool Bedingung, num Sekunden)
Syntax
void delay(<num Sekunden>)
Funktion
Schiebt die Ausführung der laufenden Task für Sekunden Sekunden auf.
Die Task bleibt RUNNING während der Wartezeit. Wenn Sekunden kleiner oder gleich 0 ist, schiebt das System zuvor
andere Tasks in VAL3 ein, bevor die aktuelle Task fortgesetzt wird.
Parameter
num Sekunden Numerischer Ausdruck
Siehe auch
num clock()
bool watch(bool Bedingung, num Sekunden)
num clock()
Syntax
num clock()
Funktion
Überträgt den aktuellen Wert des systeminternen Taktgebers in Sekunden.
Die Genauigkeit des internen Taktgebers beträgt eine Millisekunde. Er wird beim Start der Steuerung auf 0 gesetzt und
ist unabhängig von der Uhrzeit.
Zum Beispiel
num nDebut
nDebut=clock()
<instructions>
put("Dauer des Vorgangs= " )
putln(clock()-nDebut)
Siehe auch
void delay(num Sekunden)
bool watch(bool Bedingung, num Sekunden)
Syntax
bool watch (<bool Bedingung>, <num Sekunden>)
Funktion
Schiebt die aktuelle Task auf, bis Bedingung gleich true ist oder die Zeit von Sekunden Sekunden abgelaufen ist.
Überträgt true, wenn die Wartezeit dadurch beendet wird, dass Bedingung gleich true wird. Wird die Wartezeit
beendet, weil die Zeit abgelaufen ist, wird false übertragen.
Die Task bleibt RUNNING während der Wartezeit. Wenn Bedingung bei der ersten Überprüfung true ist, wird die
Ausführung sofort mit der gleichen Task fortgesetzt, andernfalls werden die anderen VAL3-Tasks vom System
eingeschoben (auch wenn Sekunden kleiner oder gleich 0 ist).
Parameter
bool Bedingung Boolescher Ausdruck
Zum Beispiel
while (watch (dCapteur, 20)) == false
popUpMsg("Warten auf Teil")
endWhile
Siehe auch
void delay(num Sekunden)
void wait(bool Bedingung)
num clock()
Definition
Eine VAL3-Bibliothek ist eine Software, die von einer Applikation oder anderen VAL3-Bibliotheken verwendet werden
kann.
Wie eine Applikation besteht eine VAL3-Bibliothek aus folgenden Elementen:
- einer Gruppe von Programmen: den auszuführenden VAL3-Anweisungen,
- einer Gruppe von globalen Variablen: den Daten der Bibliothek
- einer Gruppe von Bibliotheken: von der Bibliothek benutzte externe Anweisungen und Daten
Eine in Ausführung befindliche Bibliothek kann zudem enthalten:
- eine Gruppe von Tasks: eigene Programme der in Ausführung befindlichen Bibliothek
Eine Bibliothek wird im gleichen Format gespeichert, wie eine VAL3-Applikation. Jede Applikation kann als Bibliothek
und jede Bibliothek als Applikation verwendet werden, wenn in ihr die Programme start() und stop() definiert sind.
Schnittstelle
Die Programme und die globalen Variablen einer Bibliothek sind entweder exportiert oder privat. Nur exportierte
Programme und globale Variablen sind außerhalb der Bibliothek zugänglich. Private Programme und globale Variablen
können nur von den Programmen der Bibliothek verwendet werden.
Die Gruppe der exportierten Programme und globalen Variablen einer Bibliothek wird als deren Schnittstelle
bezeichnet: Verschiedene Bibliotheken können die gleiche Schnittstelle haben, wenn ihre exportierten Programme und
Daten die gleichen Namen besitzen.
Die vom Programm einer Bibliothek geschaffenen Tasks sind immer privat, das heißt, sie sind nur von dieser Bibliothek
zugänglich.
Inhalt
Der Inhalt einer Bibliothek ist nicht vorgeschrieben: Sie kann nur Programme, nur Daten oder beides gleichzeitig
enthalten.
Der Zugang zu einer Bibliothek erfolgt durch Aufschreiben des Namens der Kennung, gefolgt von ’:’ und dem Namen
des Programms oder der Daten der Bibliothek, zum Beispiel:
Teil:libLoad("Teil_7") // Lädt die Bibliothek "Teil_7" unter der Kennung ’Teil’
title(Teil:nom) // Zeigt als Titel den Namen des aktuellen Teils an
call Teil:init() // Ruft das Programm init() des aktuellen Teils
Wird der Zugriff zum Inhalt einer Bibliothek gefordert, die noch nicht in den Speicher geladen wurde, so bewirkt dies
einen Ausführungsfehler.
Zugriffspfad
Die Anweisungen libLoad(), libSave() und libDelete() verwenden einen Bibliotheks-Zugriffspfad, der in Form einer
Zeichenkette festgelegt ist. Ein Zugriffspfad enthält einen Stamm (fakultativ), einen Pfad (fakultativ) und den Namen
einer Bibliothek in folgendem Format:
Stamm://Weg/Name
Der Stamm legt den Datenträger der Datei fest: "Floppy" für Diskette, "Disk" für Speicherung in CS8 oder den Namen
einer in CS8 für einen Netzzugang festgelegten Ftp-Verbindung.
Im Standardfall ist der Stamm "Disk" und der Pfad leer.
Beispiele
Teil:libLoad("Teil_1")
Teil:libSave("Floppy://Teil")
Teil:libSave("Disk://Teil_x/Teil_1")
Fehlercodes
Die VAL3-Funktionen für den Umgang mit Bibliotheken erzeugen keine Ausführungsfehler, sondern übergeben einen
Fehlercode, mit dessen Hilfe das Ergebnis einer Anweisung überprüft und der Ursprung eventueller Probleme
untersucht werden kann.
Code Beschreibung
0 Kein Fehler
10 Die Kennung der Bibliothek wurde nicht durch libLoad() initialisiert.
11
Laden der Bibliothek unmöglich: Ihre Schnittstelle entspricht nicht derjenigen der
Kennung.
12
Laden der Bibliothek unmöglich: Die Bibliothek enthält ungültige Daten oder
Programme.
13
Entfernen der Bibliothek nicht möglich: Die Bibliothek enthält ungültige Daten oder
Programme.
20 Datei-Zugriffsfehler: der Stamm des Pfads ist ungültig.
21 Datei-Zugriffsfehler: der Pfad ist ungültig.
22 Datei-Zugriffsfehler: der Name ist ungültig.
30 Lese-/Schreibfehler auf Datei.
31
Schreibzugriff: Der angegebene Pfad enthält bereits eine Bibliothek.
Lesezugriff: Diese Bibliothek wird schon von einer anderen Kennung genutzt.
Syntax
num identifiant:libLoad(string Weg)
Funktion
Initialisierung der Kennung einer Bibliothek durch Laden der Programme und Daten der Bibliothek auf den festgelegten
Weg.
Überträgt 0 nach erfolgreichem Laden und einen Bibliothek-Fehlercode, wenn noch von der zu entfernenden Bibliothek
geschaffene Tasks verbleiben, wenn der Zugangspfad zur Bibliothek ungültig ist, wenn die Bibliothek Syntax-Fehler
enthält oder wenn die genannte Bibliothek nicht der für die Kennung erklärten Schnittstelle entspricht.
Siehe auch
num identifiant:libSave(), num libSave()
Syntax
num identifiant:libSave()
num identifiant:libSave(string Weg)
Funktion
Sichern der Programme und Daten, die einer Bibliothek-Kennung zugeordnet sind. Wenn libSave() ohne Kennung
aufgerufen wird, wird die Anwendung der aufrufenden Bibliothek gespeichert. Bei Angabe eines Parameters erfolgt das
Sichern über den genannten Weg. Andernfalls wird über den beim Laden festgelegten Pfad gesichert.
Überträgt 0, wenn die Programme und Daten gesichert worden sind, und einen Bibliothek-Fehlercode, wenn die
Kennung nicht initialisiert ist, wenn der Pfad ungültig ist, oder wenn ein Schreibfehler eingetreten ist bzw. der genannte
Pfad bereits zu einer Bibliothek führt.
Siehe auch
num libDelete(string Weg)
Syntax
num libDelete(string Weg)
Funktion
Löscht die durch den Weg angezeigte Bibliothek.
Überträgt 0, wenn die genannte Bibliothek nicht existiert oder gelöscht worden ist, und einen Bibliothek-Fehlercode,
wenn die Kennung nicht initialisiert ist, wenn der Pfad ungültig ist, oder wenn ein Schreibfehler eingetreten ist.
Siehe auch
num identifiant:libSave(), num libSave()
string identifiant:libPath(), string libPath()
Syntax
string identifiant:libPath()
Funktion
Überträgt den Zugangspfad der mit der Kennung verknüpften Bibliothek, oder der aufrufenden Anwendung oder
Bibliothek, falls keine Kennung angegeben ist.
Siehe auch
bool libList(string Weg, string& contenu)
Syntax
bool libList(string Weg, string& contenu)
Funktion
Liste des in Tabelle Inhalt spezifizierten Weg. Überträgt true, wenn Tabelle Inhalt das gesamte Ergebnis auflistet,
false wenn die Tabelle zu klein ist, um die gesamte Liste zu speichern.
Die Tabelle Inhalt wird vor der Aktualisierung bei "" gestartet. Um das Ergebnis von libList() zu lesen, muss gestoppt
werden, sobald ein ""-Wert auftritt.
Falls Inhalt eine globale Variable ist, wird sie automatisch vergrößert, wenn Platz zur Speicherung des vollständigen
Ergebnisses benötigt wird.
Siehe auch
string identifiant:libPath(), string libPath()
In diesem Kapitel sind die Anweisungen für die verschiedenen Komponenten des Roboters aufgeführt.
Anweisungen
void disablePower()
Syntax
void disablePower()
Funktion
Schaltet die Armleistung ab und wartet, bis die Leistung tatsächlich abgeschaltet wurde.
Wenn der Arm zu diesem Zeitpunkt in Bewegung ist, erfolgt vor dem Abschalten ein sofortiger Stillstand auf der Bahn.
Siehe auch
void enablePower()
bool isPowered()
void enablePower()
Syntax
void enablePower()
Funktion
Schaltet den Arm im ferngesteuerten Betrieb ein.
Diese Anweisung hat keinen Einfluss auf den lokalen, manuellen oder Testbetrieb oder wenn die Leistung gerade
abgeschaltet wird.
Zum Beispiel
// Schaltet den Strom ein und wartet auf das volle Anliegen der Spannung
enablePower()
if(watch(isPowered(), 5) == false)
putln("Die Leistung kann nicht angelegt werden")
endIf
Siehe auch
void disablePower()
bool isPowered()
bool isPowered()
Syntax
bool isPowered()
Funktion
Überträgt den Status der Leistungsversorgung des Arms:
true: Arm mit Strom versorgt
false: der Arm ist ausgeschaltet, wird gerade ein- oder ausgeschaltet
bool isCalibrated()
Syntax
bool isCalibrated()
Funktion
Überträgt den Kalibrierstatus des Roboters:
true: Alle Roboterachsen sind kalibriert
false: Mindestens eine Roboterachse ist nicht kalibriert
Syntax
num workingMode (num& Status)
num workingMode()
Funktion
Überträgt die aktuelle Betriebsart des Roboters:
Modus Status Betriebsart Status
0 0 Ungültig oder Transition -
0 Programmierte Bewegung
1 Anschlussbewegung
2 Drehbewegung (Joint)
1 3 Handbetrieb Translationsbewegung (World)
4 Tool (Tool)
5 zum Punkt (User)
6 Hold
0 programmierte Bewegung (250 mm/s)
1 Anschlussbewegung (250 mm/s)
2 2
Test programmierte schnelle Bewegung
3 Hold
0 Move (programmierte Bewegung)
3 1 Local Move (Anschlussbewegung)
2 Hold
0 Move (programmierte Bewegung)
4 1 Remote Move (Anschlussbewegung)
2 Hold
Parameter
num& Status Variable numerischen Typs.
Syntax
num speedScale()
Funktion
Überträgt die aktuelle Geschwindigkeit des Monitors.
Zum Beispiel
num nCycle
taskCreate "checkSpeed", 5, checkSpeed()
program checkSpeed()
begin
while true
if(nCycle < 2)
if (speedScale()> 10)
stopMotion()
putln("Für den ersten Zyklus muss die Monitorgeschwindigkeit bei 10 % bleiben")
wait(speedScale()<= 10)
restartMotion()
endIf
endIf
endWhile
end
num esStatus()
Syntax
num esStatus()
Funktion
Überträgt den Status der Sicherheitsschaltungen:
Code Status
0 Alle Sicherheitssignale sind inaktiv.
1 Warten auf Freigabe nach Notausschaltung.
2 Sicherheitssignal aktiviert.
Siehe auch
num workingMode(), num workingMode(num& Status)
ARMPOSITION
EINLEITUNG
In diesem Kapitel sind die verschiedenen Typen von VAL3-Daten beschrieben, mit denen die in einer VAL3-Applikation
verfügbaren Armpositionen programmiert werden können.
Zwei Typen von Position sind in VAL3 definiert: Winkelpositionen (Typ joint), die die Stellung der Gelenkachsen
beschreiben und kartesische Punkte (Typ point), mit denen die Position des am Arm montierten Werkzeugs in
kartesischen Koordinaten angegeben wird.
Der Typ tool beschreibt ein Werkzeug mit seiner Geometrie, das zur Positionierung und Geschwindigkeitssteuerung
des Arms verwendet wird, sowie dessen Aktivierungsmodus.
Der Typ frame beschreibt ein Koordinatensystem. Durch die Verwendung von Bezugssystemen wird insbesondere die
Programmierung bewegter Punkte einfacher und intuitiver.
Der Typ trsf beschreibt eine Koordinatentransformation. Sie wird implizit von den Typen tool, point und frame
verwendet.
Der Typ config beschreibt den komplexeren Begriff der Armkonfiguration.
Die Beziehungen zwischen den verschiedenen Typen lassen sich wie folgt zusammenfassen:
world
TYP JOINT
Definition
Ein Gelenkpunkt (Typ joint) definiert die Winkelposition jeder Roboterachse.
Der Typ joint ist ein strukturierter Typ mit folgenden Feldern in der nachstehenden Reihenfolge:
num j1 Winkelposition Achse 1
num j2 Winkelposition Achse 2
num j3 Winkelposition Achse 3
Diese Felder werden für die Drehachsen in Grad angegeben sowie in Millimetern für die linearen Achsen. Der Nullpunkt
jeder Achse ist durch den verwendeten Armtyp festgelegt.
Standardmäßig wird der Wert für jedes Feld einer Variable des Typs joint mit dem Wert 0 initialisiert.
bool <joint Position1> != <joint Position2> Überträgt true, wenn ein Feld von Position1 im
Rahmen der Robotergenauigkeit nicht gleich dem
entsprechenden Feld von Position2 ist, ansonsten
false.
bool <joint Position1> == <joint Position2> Überträgt true, wenn jedes Feld von Position1 im
Rahmen der Robotergenauigkeit gleich dem
entsprechenden Feld von Position2 ist, ansonsten
false.
bool <joint Position1> > <joint Position2> Überträgt true, wenn jedes Feld von Position1 größer
als das entsprechende Feld in Position2 ist, ansonsten
false.
bool <joint Position1> < <joint Position2> Überträgt true, wenn jedes Feld von Position1 kleiner
als das entsprechende Feld in Position2 ist, ansonsten
false.
Achtung: Position1 > Position2 ist nicht
vollständig identisch mit Position2 < Position1!
joint <joint Position1> - <joint Position2> Überträgt die Differenz für jedes Feld von Position1 mit
Position2.
joint <joint Position1> + <joint Position2> Überträgt die Summe für jedes Feld von Position1 und
Position2.
Anweisungen
joint abs(joint Position)
Syntax
joint abs(<joint Position>)
Funktion
Überträgt den Absolutwert für jedes Feld von Position.
Parameter
num Position Ausdruck des Typs Gelenkpunkt
Zum Beispiel
joint jEcartMax
joint j
jEcartMax = {5, 5, 5, 5, 5, 5}
j = herej
// Prüft, ob alle Achsenpositionen weniger als 5 Grad von der Markierung abweichen
if(!(abs(j) < jEcartMax))
popUpMsg("Nähern Sie sich den Markierungen)
endIf
Siehe auch
Opérateur bool <Joint Position1> <Joint Position2>
joint herej()
Syntax
joint herej()
Funktion
Überträgt die aktuelle Gelenkposition des Arms (empfohlene Position und nicht die gemessene Position).
Siehe auch
joint herej()
bool isInRange(joint Position)
Syntax
bool isInRange(<joint Position>)
Funktion
Überträgt true, wenn Position innerhalb der Softwarebegrenzungen des Roboters liegt.
Parameter
joint Position Ausdruck des Typs Gelenkpunkt
Siehe auch
joint herej()
Opérateur bool <Joint Position1> <Joint Position2>
Orientierung
Orientierung
z1
z2
450 mm
x2 y2
250 mm
350 mm
x1 y1
Die Position des Koordinatensystems R2 (grau) in Bezug auf R1 (schwarz) ist Folgende:
x = 250mm, y = 350 mm, z = 450mm, rx = 0°, ry = 0°, rz = 0°
Die drei Koordinaten rx, ry und rz entsprechen den Winkeln, um welche die x, y und z-Achse nacheinander zu drehen
sind, um die gewünschte Orientierung des Koordinatensystems zu erhalten.
Die Orientierung rx = 20°, ry = 10°, rz = 30° wird zum Beispiel auf folgende Weise erhalten. Zuerst wird das
Koordinatensystem (x,y,z) um 20° um die x-Achse gedreht. Damit erhält man das neue Koordinatensystem (x’,y’,z’).
Die Achsen x und x’ sind deckungsgleich.
y’
20°
x = x’
y
Anschließend wird das Koordinatensystem um 20° um die Achse y’ des im vorherigen Schritt erhaltenen
Koordinatensystems gedreht. Damit erhält man das neue Koordinatensystem (x’’,y’’,z’’). Die Achsen y’ und y’’ sind
deckungsgleich.
10°
y’ = y’’
x = x’
y
x’’
Zum Schluss wird das Koordinatensystem um 20° um die Achse z’’ des im vorherigen Schritt erhaltenen
Koordinatensystems gedreht. Das neue Koordinatensystem (x’’’,y’’’,z’’’) hat die durch rx, ry, rz definierte Orientierung.
Die Achsen z’’ und z‘’’ sind deckungsgleich.
30°
y’’’
y’ = y’’
x = x’
y
x’’
x’’’
Die Position des Koordinatensystems R2 (grau) in Bezug auf R1 (schwarz) ist Folgende:
x = 250mm, y = 350 mm, z = 450mm, rx = 20°, ry = 10°, rz = 30°
Die Werte rx, ry und rz sind Modulo 360 Grad definiert. Die vom System berechneten Werte für rx, ry und rz liegen
damit immer zwischen -180 und +180. Damit bleiben noch mehrere Werte für rx, ry, und rz möglich: Das System sorgt
dafür, dass mindestens zwei der Koordinaten zwischen -90 und 90 liegen. Wenn ry 90° (modulo 180) beträgt, wird rx =
0 gewählt.
Operatoren
Mit zunehmender Priorität:
trsf <trsf& Position1> = <trsf Position2> Weist Position2 nacheinander der Variablen
Position1 zu und überträgt Position2.
bool <trsf Position1> != <trsf Position2> Überträgt true, wenn ein Feld von Position1 nicht
gleich dem entsprechenden Feld in Position2 ist,
ansonsten false.
bool <trsf Position1> == <trsf Position2> Überträgt true, wenn jedes Feld von Position1 gleich
dem entsprechenden Feld in Position2 ist, ansonsten
false.
trsf <trsf Position1> <trsf Position2> Überträgt die geometrischen Komponenten der
Transformationen Position1 und Position2. Achtung!
Im Allgemeinen ist ! Position1 Position2 ! =
Position2 Position1!
Anweisungen
num distance(trsf Position1, trsf Position2)
Syntax
num distance(<trsf Position1>, <trsf Position2>)
Funktion
Überträgt die Entfernung zwischen Position1 und Position2.
ACHTUNG:
Damit die Entfernung gültig ist, müssen Position1 und Position2 im gleichen Referenz-
Koordinatensystem definiert sein.
Parameter
trsf Position1 Ausdruck des Typs Transformation
Zum Beispiel
// Zeigt den Abstand zwischen zwei Punkten unabhängig von ihrem Referenz-Koordinatensystem an
putln(distance(position(point1, world), position(point2, world)))
Siehe auch
point appro(point Position, trsf Umwandlung)
point compose(point Position, frame Markierung, trsf Umwandlung)
trsf position(point Position, frame Markierung)
num distance(point Position1, point Position2)
point21a point21b
frame 21 frame 21
point1a
point2a
frame1 frame2
world
Wenn nicht anders festgelegt, verwendet eine Variable des Typs frame world als Bezugssystem.
Verwendung
Die Verwendung von Referenz-Koordinatensystemen in einer Roboteranwendung wird ausdrücklich empfohlen:
- Um die einzelnen Punkte der Applikation intuitiv erkennen zu können
Die von der Arbeitszelle erlernten Punkte werden entsprechend der hierarchischen Ordnung der
Koordinatensysteme in strukturierter Weise angezeigt.
Operatoren
Mit zunehmender Priorität:
frame <frame& Markierung1> = <frame Weist die Position und das Referenz-
Markierung2> Koordinatensystem von Markierung2 der Variable
Markierung1 zu.
bool <frame Markierung1> != <frame Überträgt true, wenn Markierung1 und Markierung2
Markierung2> nicht das gleiche Referenz-Koordinatensystem oder
darin nicht die gleiche Position haben.
bool <frame Markierung1> == <frame Überträgt true, wenn Markierung1 und Markierung2
Markierung2> die gleiche Position im gleichen Referenz-
Koordinatensystem haben.
Anweisungen
num setFrame(point Herkunft, point AchseOx, point PlanOxy, frame&
Markierung)
Syntax
num setFrame(point Herkunft, point AchseOx, point PlanOxy, frame& Markierung)
Funktion
Berechnet die Koordinaten von Markierung anhand dessen Herkunft unter Verwendung eines Punktes AchseOx auf
der (Ox)-Achse und eines Punktes PlanOxy der Ebene (Oxy).
Der Punkt AchseOx muss auf der positiven x-Achse liegen. Der Punkt PlanOxy muss auf der positiven y-Achse liegen.
Die Funktion liefert folgende Antwort:
0 Kein Fehler.
TYP TOOL
Definition
Der Typ tool dient zur Definition der Geometrie und der Bewegung eines Werkzeugs.
Der Typ tool ist ein strukturierter Typ mit folgenden Feldern in der nachstehenden Reihenfolge:
trsf trsf Position des Tools als Basiswerkzeug
outil21 outil21
outil1 outil2
flange
Der Ausgang eines Tools ist vorprogrammiert auf Ausgang io:Ventil1 des Systems, die Öffnungs- und Schließzeit sind
0 und das Basistool ist flange.
Verwendung
Die Verwendung von Werkzeugen in einer Roboteranwendung wird ausdrücklich empfohlen:
- Um die Bewegungsgeschwindigkeit zu steuern
Bei manuellen oder programmierten Bewegungen steuert das System die kartesische Geschwindigkeit am
Werkzeugende.
Operatoren
Mit zunehmender Priorität:
tool <tool& Werkzeug1> = <tool Werkzeug2> Weist der Variablen Werkzeug1 die Position und das
Basiswerkzeug von Werkzeug2 zu.
bool <tool Werkzeug1> != <tool Werkzeug2> Überträgt true, wenn Werkzeug1 und Werkzeug2
nicht das gleiche Basiswerkzeug, die gleiche Position
in ihrem Basiswerkzeug, den gleichen digitalen
Ausgang oder die gleichen Öffnungs- und
Schließzeiten haben.
bool <tool Werkzeug1> == <tool Werkzeug2> Überträgt true, wenn Werkzeug1 und Werkzeug2 die
gleiche Position im gleichen Basiswerkzeug, den
gleichen digitalen Ausgang mit den gleichen Öffnungs-
und Schließzeiten haben.
Anweisungen
void open(tool Werkzeug)
Syntax
void open (tool Werkzeug)
Funktion
Betätigung des Werkzeugs (öffnen). Hierfür wird der digitale Ausgang des Werkzeugs auf true gesetzt.
Bevor das Tool bewegt werden kann, wartet open() bis der Roboter den Punkt erreicht hat, was mittels einer
gleichwertigen Aktion wie waitEndMove() geschieht. Nach der Aktivierung wartet das System otime Sekunden, bevor
die nächste Anweisung ausgeführt wird.
Diese Anweisung stellt nicht die Stabilisierung des Roboters vor der Aktivierung des Werkzeugs an seiner Endposition
sicher. Wenn die vollständige Stabilisierung nach der Bewegung abgewartet werden soll, so muss die Anweisung
isSettled() verwendet werden.
Wenn dio von Werkzeug nicht definiert oder kein Ausgang ist, wird ein Ausführungsfehler erzeugt, ebenso, wenn ein
zuvor aufgezeichneter Bewegungsbefehl nicht ausgeführt werden kann (Endpunkt außer Reichweite).
Parameter
tool Werkzeug Ausdruck des Typs Werkzeug
Zum Beispiel
// Die Anweisung open() entspricht:
waitEndMove()
tOutil.gripper=true
delay(tOutil.otime)
Siehe auch
void close(tool Werkzeug)
void waitEndMove()
Syntax
void close (tool Werkzeug)
Funktion
Betätigt das Werkzeug (schließen). Hierfür wird der digitale Ausgang des Werkzeugs auf false gesetzt.
Bevor das Tool bewegt werden kann, wartet open() bis der Roboter den Punkt erreicht hat, was mittels einer
gleichwertigen Aktion wie waitEndMove() geschieht. Nach der Aktivierung wartet das System ctime Sekunden, bevor
die nächste Anweisung ausgeführt wird.
Diese Anweisung stellt nicht die Stabilisierung des Roboters vor der Aktivierung des Werkzeugs an seiner Endposition
sicher. Wenn die vollständige Stabilisierung nach der Bewegung abgewartet werden soll, so muss die Anweisung
isSettled() verwendet werden.
Wenn dio von Werkzeug nicht definiert oder kein Ausgang ist, wird ein Ausführungsfehler erzeugt, ebenso, wenn ein
zuvor aufgezeichneter Bewegungsbefehl nicht ausgeführt werden kann (Endpunkt außer Reichweite).
Parameter
tool Werkzeug Ausdruck des Typs Werkzeug
Zum Beispiel
// Ausdruck des Typs Werkzeug:
waitEndMove()
tOutil.gripper = false
delay(tOutil.ctime)
Siehe auch
Type tool
void open(tool Werkzeug)
void waitEndMove()
Punktdefinition
Frame world Frame f1 Frame f2
Point p3
Wenn man eine Variable des Typs point ohne definiertes Referenz-Koordinatensystem verwendet, wird eine
Fehlermeldung erzeugt.
ACHTUNG:
Eine lokale Variable des Typs point hat standardmäßig kein vorprogrammiertes Referenz-
Koordinatensystem. Um sie zu verwenden, muss sie von einem anderen Punkt aus oder mit
einer der Anweisungen here(), appro() oder compose() initialisiert werden.
Operatoren
Mit zunehmender Priorität:
point <point& Punkt1> = <point Punkt2> Weist die Position, die Konfiguration und das
Referenz-Koordinatensystem von Punkt1 der
Variablen Punkt2 zu.
bool <point Punkt1> ! = <point Punkt2> Überträgt true, wenn Punkt1 und Punkt2 nicht das
gleiche Referenz-Koordinatensystem oder darin
nicht die gleiche Position haben.
bool <point Punkt1> == <point Punkt2> Überträgt true, wenn Punkt1 und Punkt2 die gleiche
Position im gleichen Referenz-Koordinatensystem
haben.
Anweisungen
num distance(point Position1, point Position2)
Syntax
num distance(point Position1, point Position2)
Funktion
Überträgt die Entfernung zwischen Position1 und Position2.
Ein Ausführungsfehler wird erzeugt, wenn das Referenz-Koordinatensystem von Position1 oder Position2 nicht
festgelegt ist.
Parameter
point Position1 Ausdruck des Typs point
Zum Beispiel
// Zeigt den Abstand zwischen zwei Punkten unabhängig von ihrem Referenz-Koordinatensystem an
putln(distance(point1, point2))
Siehe auch
point appro(point Position, trsf Umwandlung)
point compose(point Position, frame Markierung, trsf Umwandlung)
trsf position(point Position, frame Markierung)
num distance(point Position1, point Position2)
Syntax
point compose(point Position, frame Markierung, trsf Umwandlung)
Funktion
Überträgt Position, auf welche die in Bezug auf Markierung definierte Koordinatentransformation Umwandlung
angewandt wurde.
ACHTUNG:
Die Drehkomponente von Umwandlung ändert in der Regel nicht nur die Ausrichtung von
Position, sondern auch seine kartesischen Koordinaten (außer wenn sich Position am
Ursprung von Markierung befindet).
Wenn Umwandlung nur die Ausrichtung von Position ändern soll, muss das Ergebnis mit den
kartesischen Koordinaten von Position aktualisiert werden (siehe Beispiel).
Das Referenz-Koordinatensystem und die Konfiguration des übertragenen Punktes sind die von Position.
Wenn für Position kein Referenz-Koordinatensystem definiert ist, wird eine Fehlermeldung erzeugt.
Parameter
point Position Ausdruck des Typs point
Zum Beispiel
point pResultat
// Änderung der Ausrichtung ohne Änderung von Position
pResultat = compose (Position,Markierung,Umwandlung)
pResultat.x = Position.x
pResultat.y = Position.y
pResultat.z = Position.z
// Änderung von Position ohne Änderung der Ausrichtung
Umwandlung.rx = Umwandlung.ry =Umwandlung.rz = 0
pResultat = compose (pResultat,Markierung,Umwandlung)
Siehe auch
Opérateur trsf <trsf Position1> * <trsf Position2>
point appro(point Position, trsf Umwandlung)
Syntax
point appro(point Position, trsf Umwandlung)
Funktion
Überträgt Position, auf welche die für das Referenz-Koordinatensystem von Position definierte
Koordinatentransformation Umwandlung angewandt wurde.
Das Referenz-Koordinatensystem und die Konfiguration des übertragenen Punktes sind die von Position.
Wenn für Position kein Referenz-Koordinatensystem definiert ist, wird eine Fehlermeldung erzeugt.
Parameter
point Position Ausdruck des Typs point
Zum Beispiel
// Annähern auf 100 mm oberhalb des Punktes (Z-Achse)
point p
movej(appro(p,{0,0,-100,0,0,0}), flange, mNomDesc) // Annäherung
movel(p, flange, mNomDesc) // Bewegung zum Punkt
Siehe auch
Opérateur trsf <trsf Position1> * <trsf Position2>
point compose(point Position, frame Markierung, trsf Umwandlung)
Syntax
point here(tool Werkzeug, frame Markierung)
Funktion
Überträgt die aktuelle Position des Werkzeugs Werkzeug in Markierung (empfohlene Position und nicht die
gemessene Position).
Das Referenz-Koordinatensystem des übertragenen Punktes ist Markierung. Die Konfiguration des übertragenen
Punktes ist die aktuelle Konfiguration des Arms.
Siehe auch
joint herej()
config config(joint Position)
point jointToPoint(tool Werkzeug, frame Markierung, joint Position)
Syntax
point jointToPoint (tool Werkzeug, frame Markierung, joint Position)
Funktion
Überträgt die Position Werkzeug in Markierung, wenn der Arm in der Gelenkposition Position ist.
Das Referenz-Koordinatensystem des übertragenen Punktes ist Markierung. Die Konfiguration des übertragenen
Punktes ist die des Arms in der Gelenkposition Position.
Parameter
tool Werkzeug Ausdruck des Typs Werkzeug
Siehe auch
point here(tool Werkzeug, frame Markierung)
bool pointToJoint(tool Werkzeug, joint anfänglich, point Position,joint& Angaben)
Syntax
bool pointToJoint(tool Werkzeug, joint anfänglich, point Position, joint& Angaben)
Funktion
Berechnet die Angaben, die der spezifizierten Position entsprechen. Überträgt true, wenn Gelenk-Angaben gefunden
wurden, und false, wenn es keine Lösung gibt.
Die gesuchte Gelenkposition ist mit der Konfiguration von Position kompatibel. Die Felder mit dem Wert free schreiben
keine Konfiguration vor. Die Felder mit dem Wert same schreiben die gleiche Konfiguration wie anfänglich vor.
Wenn die Achsen mehr als eine Umdrehung ausführen sollen, gibt es mehrere Lösungen, die genau die gleiche
Konfiguration haben: Es wird die anfänglich am nächsten liegende Lösung genommen.
Wenn Position außer Reichweite (Arm zu kurz) oder außerhalb der Softwaregrenzen liegt, kann es sein, dass es keine
Lösung gibt. Wenn Position eine Konfiguration spezifiziert, kann sie für diese Konfiguration außerhalb, aber für eine
andere Konfiguration innerhalb der Softwaregrenzen liegen.
Wenn für Position kein Referenz-Koordinatensystem definiert ist, wird eine Fehlermeldung erzeugt.
Parameter
tool Werkzeug Ausdruck des Typs Werkzeug
Siehe auch
joint herej()
point jointToPoint(tool Werkzeug, frame Markierung, joint Position)
Syntax
trsf position(point Position, frame Markierung)
Funktion
Überträgt die Koordinaten von Position in Markierung.
Wenn Position kein Referenz-Koordinatensystem besitzt, wird eine Fehlermeldung erzeugt.
Zum Beispiel
// Zeigt den Abstand zwischen zwei Punkten unabhängig von ihrem Referenz-Koordinatensystem an
putln(distance(position(point1, world), position(point2, world)))
Siehe auch
num distance(point Position1, point Position2)
Einleitung
Im Allgemeinen hat der Roboter mehrere Möglichkeiten, eine in kartesischen Koordinaten angegebene Position
anzufahren.
Diese verschiedenen Möglichkeiten werden "Konfigurationen" genannt. Die nachfolgende Zeichnung zeigt zwei
verschiedene Konfigurationen:
P P
In bestimmten Fällen ist es wichtig, anzugeben, welche der möglichen Konfigurationen zulässig sind und welche
verboten werden sollen. Um dieses Problem zu lösen, können mit dem Typ point dank des nachstehend definierten
Feldes des Typs config die zulässigen Roboterkonfigurationen spezifiziert werden.
Definition
Typ config ermöglicht die Definition der erlaubten Konfigurationen für eine bestimmte kartesische Position.
Er hängt vom verwendeten Armtyp ab.
Für einen Stäubli RX/TX-Arm ist der Typ config ein strukturierter Typ mit folgenden Feldern in der nachstehenden
Reihenfolge:
shoulder Konfiguration der Schulter
Für einen Stäubli RS-Arm ist der Typ config auf das Feld Shoulder begrenzt:
shoulder Konfiguration der Schulter
Die Felder shoulder, elbow und wrist können folgende Werte annehmen:
righty Konfiguration der Schulter righty vorgeschrieben
Operatoren
Mit zunehmender Priorität:
config <config& Konfiguration1> = <config Weist die Felder shoulder, elbow und wrist von
Konfiguration2> Konfiguration2 der Variablen Konfiguration1 zu.
bool <config Konfiguration1> != <config Überträgt true, wenn die Felder shoulder, elbow oder wrist
Konfiguration2> in Konfiguration1 und Konfiguration2 nicht den gleichen
Wert haben.
bool <config Konfiguration1> == <config Überträgt true, wenn die Felder shoulder, elbow oder wrist
Konfiguration2> in Konfiguration1 und Konfiguration2 den gleichen Wert
haben.
Die Konfiguration righty ist definiert durch ((d1.sin(j2) + d2.sin(j2+j3) + ) < 0, die Konfiguration lefty durch
(d1.sin(j2) + d2.sin(j2+j3) + ) >= 0, mit d1 = Armlänge des Roboters, d2 = Unterarmlänge und = Abstand der
Achsen 1 und 2 in Richtung x.
Die Konfiguration righty ist definiert durch sin(j2) > 0, die Konfiguration lefty durch sin(j2) < 0.
Syntax
config config(joint Position)
Funktion
Überträgt die Roboterkonfiguration für die Gelenkposition Position.
Parameter
joint Position Ausdruck des Typs Gelenkposition
Siehe auch
point here(tool Werkzeug, frame Markierung)
joint herej()
BEWEGUNGSSTEUERUNG
BEWEGUNGSSTEUERUNG
Um eine Roboterbahn zu definieren, genügt es nicht, nur eine Reihe von Punkten anzugeben. Es müssen außerdem
die Art der zwischen diesen Punkten verwendeten Bahnen (Kurven- oder Geradenabschnitte) sowie die Art der
Anschlüsse zwischen diesen Abschnitten und schließlich die Geschwindigkeitsparameter für diese Bewegung
festgelegt werden. Dieses Kapitel gibt eine Einführung in Punkt-zu-Punkt-Bewegungen und geradlinige Bewegungen
(Anweisungen movej und movel) und beschreibt, wie die Parameter des Bewegungsdeskriptors (Typ mdesc) zu
verwenden sind.
Final position
Dagegen bewegt sich der Werkzeugmittelpunkt bei einer geradlinigen Bewegung entlang der vorgegebenen Geraden.
Die Orientierung wird zwischen der Ausgangs- und Endorientierung des Werkzeugs linear interpoliert.
Geradlinige Bewegung
Z
Y
Z
X
X Y
Kreisförmige Bewegung
Nächste Bewegung
Vorherige Bewegung
Zum Beispiel:
Eine typische Handlingaufgabe besteht darin, Teile an einem Ort aufzunehmen und an einem anderen Ort abzulegen.
Angenommen, die Teile sollen am Punkt PRISE aufgenommen und am Punkt DEPOSE abgelegt werden. Um vom
Punkt PRISE zum Punkt DEPOSE zu gelangen, muss der Roboter über einen Zwischenpunkt DEGAGE und einen
Annäherungspunkt APPRO fahren.
Zyklus: U
DEGAGE APPRO
X X
Z Z
PRISE DEPOSE
X X
Z Z
Angenommen, der Roboter steht zu Beginn am Punkt PRISE. Dann kann das Programm für diese Bewegung wie folgt
aussehen:
movel(DEGAGE, tool, mDesc)
movej(APPRO, tool, mDesc)
movel(DEPOSE, tool, mDesc)
Zum Freifahren und zur Annäherung werden gerade Bahnabschnitte verwendet. Die Hauptbewegung ist dagegen eine
Punkt-zu-Punkt-Bewegung, da dieser Teil der Bahn keine genaue geometrische Steuerung erfordert, sondern vielmehr
möglichst rasch zurückgelegt werden soll.
Hinweis:
Bei beiden Bewegungstypen hängt die Geometrie der Bahn nicht von der Geschwindigkeit ab,
mit der die Bewegungen ausgeführt werden. Der Roboter fährt immer den gleichen Punkt an.
Dieser Umstand ist bei der Entwicklung von Applikationen besonders wichtig. Man kann mit
langsamen Bewegungen beginnen und die Geschwindigkeit nach und nach erhöhen, ohne dabei
die Bahn des Roboters zu ändern.
R
VE EA
LEA C
H
Zum Beispiel:
Betrachten wir das Programm im Kapitel "Bewegungstypen:Punkt-zu-Punkt und geradlinig". Das vorhergehende
Bewegungsprogramm kann geändert werden:
mDesc.blend = joint
mDesc.leave = 50
mDesc.reach = 200
movel(DEGAGE, tool, mDesc)
mDesc.leave = 200
mDesc.reach = 50
movej(APPRO, tool, mDesc)
mDesc.blend = OFF
movel(DEPOSE, tool, mDesc)
Geglätteter Zyklus
200
200
DEGAGE APPRO
50
50
PRISE DEPOSE
Der Roboter hält an den Punkten DEGAGE und APPRO nicht mehr an. Die Bewegung wird daher schneller. Je größer
die Entfernungen leave und reach gewählt werden, desto rascher wird die Bewegung.
Aufheben der Glättung
Die Anweisung waitEndMove() ermöglicht unter anderem, den Glättungseffekt zu annullieren. In diesem Fall führt der
Roboter die zuletzt programmierte Bewegung bis zum Zielpunkt aus, als ob das Feld blend im Bewegungsdeskriptor
auf off stehen würde.
Betrachten wir zum Beispiel das folgende Programm:
mDesc.blend = joint
mDesc.leave = 10
mDesc.reach = 10
movej(A, tool, mDesc)
movej(B, tool, mDesc)
waitEndMove()
movej(C, tool, mDesc)
movej(D, tool, mDesc)
etc...
ergibt sich folgende Bahn des Roboters:
10 10 10
10
No smoothing at B
(BREAK)
10 10 10
D 10
B
Bei der Wiederaufnahme der Bewegung stellt das System sicher, dass sich der Roboter auf der programmierten Bahn
befindet: Bei Abweichungen (auch sehr kleinen Werts) zeichnet er automatisch einen Punkt-zu-Punkt-
Bewegungsbefehl auf, der zur exakten Position, aus welcher der Roboter seine Bahn verlassen hat, zurückführt: Dies
ist die sogenannte "Anschlussbewegung". Sie erfolgt mit reduzierter Geschwindigkeit. Sie muss vom Bediener bestätigt
werden, außer bei Automatikbetrieb, wo sie ohne menschliche Eingriffe erfolgen kann. Das Verhalten bei
Automatikbetrieb kann mittels der Anweisung autoConnectMove() festgelegt werden.
Die Anweisung resetMotion() ermöglicht das Abbrechen der aktuellen Bewegung und das eventuelle Programmieren
einer Anschlussbewegung, mit deren Hilfe eine Position bei reduzierter Geschwindigkeit unter der Kontrolle des
Bedieners angefahren werden kann.
Vorherige Bewegung
• Für eine konstante Ausrichtung bezüglich der Bahn (z. B. Richtung Y der Werkzeugmarkierung
Bahntangente) müssen Ausgangs- und Endposition sowie die Mittelposition für einen Kreis dieselbe
Ausrichtung haben.
Nächste Bewegung
• •
Vollständiger Kreis
Vorherige
Bewegung
Nächste
Bewegung
Y
Bei einer Änderung der Schulterkonfiguration muss der Mittelpunkt des Handgelenks über die Achse 1 hinwegfahren
(nicht unbedingt bei Robotern mit Ausleger).
Bei Änderung der Konfiguration des Ellenbogens muss der Arm gestreckt (q3 = 0°) werden.
Bei einer Änderung der Konfiguration des Handgelenks muss der Arm kurzzeitig das Handgelenk (q5 = 0°) strecken.
Das bedeutet, dass der Roboter auf seinem Weg bestimmte Positionen einnehmen muss, wenn die Konfiguration
geändert wird. Man kann aber keine geradlinigen oder kreisförmigen Bewegungen über diese Positionen erzwingen,
wenn sie nicht auf der gewünschten Bahn liegen! Daraus folgt, dass ein Konfigurationswechsel während einer
geradlinigen oder kreisförmigen Bewegung nicht erzwungen werden kann.
Anders ausgedrückt kann man bei einer geradlinigen oder kreisförmigen Bewegung eine Konfiguration nur dann
realisieren, wenn sie mit der Anfangsposition vereinbar ist: Eine freie oder mit der Ausgangsposition identische
Konfiguration kann immer spezifiziert werden.
Im Ausnahmefall kann die Gerade oder der Kreisbogen durch eine Position gehen, an der ein Konfigurationswechsel
möglich ist. In diesem Fall kann das System, wenn die Konfiguration nicht vorher festgelegt wurde, die Konfiguration auf
einer geradlinigen oder kreisförmigen Bewegung ändern.
Bei einer kreisförmigen Bewegung wird die Konfiguration des mittleren Punktes nicht berücksichtigt. Es zählen nur die
Konfigurationen von Anfangs- und Endposition.
Das Ausführen der Programmzeilen führt nur zur Speicherung der aufeinanderfolgenden Bewegungsanweisungen. Der
Roboter realisiert sie anschließend nach seinen Möglichkeiten. Damit das System eine möglichst optimale Bahn wählen
kann, muss der Speicher, in dem die Bewegungen abgelegt werden, relativ groß sein. Die Speicherkapazität ist jedoch
begrenzt. Wenn der Speicher voll ist, wird die Programmausführung bei der nächsten Bewegungsanweisung
unterbrochen. Die Ausführung wird erst fortgesetzt, wenn der Roboter die laufende Bewegung beendet hat und der
entsprechende Speicherplatz frei geworden ist.
Geglätteter Zyklus
A C
B leave B reach
B D
Solange die zweite Zeile nicht ausgeführt ist, kann der geglättete Bahnabschnitt um den Punkt A nicht vollständig
bestimmt werden, da das System die nächste Bewegung noch nicht kennt. Im Schrittmodus würde der Roboter, wenn
der Benutzer nicht auf die nächste Anweisung weitergeht, nur bis zum Punkt Aleave fahren. Wenn die nächste
Anweisung ausgeführt wurde, können die geglättete Bahn um den Punkt A (zwischen Aleave und Areach) sowie die
Bewegung zum Punkt Bleave definiert werden. Der Roboter kann sich damit bis Bleave bewegen. Er wird aber im
Schrittmodus nicht über diesen Punkt hinausfahren können, wenn der Benutzer die dritte Anweisung noch nicht
ausgeführt hat usw..
Der Vorteil dieser Betriebsart ist, dass der Roboter im Schrittmodus und bei normaler Programmausführung genau die
gleiche Bewegung ausführt.
Synchronisierung
Das Antizipieren besteht also in einer zeitlichen Entkopplung der Ausführung der Programmzeilen unter VAL3 und den
entsprechenden Bewegungen des Roboters: Das Programm VAL3 eilt dem Roboter voraus.
Wenn an einer bestimmten Position des Roboters eine Aufgabe vorgesehen ist, muss das Programm warten, bis der
Roboter seine Bewegungen beendet hat: Diese Synchronisierung wird mit der Anweisung waitEndMove() erreicht.
GESCHWINDIGKEITSSTEUERUNG
Prinzip
Die Geschwindigkeitssteuerung auf einer Bahn arbeitet nach folgendem Prinzip:
Zu jedem Zeitpunkt wird der Roboter mit voller Leistung bewegt und beschleunigt, wobei alle von der
Bewegungssteuerung vorgegebenen Bedingungen für Geschwindigkeit und Beschleunigung einzuhalten sind.
Die Bewegungsanweisungen enthalten zwei Arten von Randbedingungen für die Geschwindigkeit, die in einer
Variablen des Typs mdesc definiert sind:
1. Geschwindigkeiten, Beschleunigungen und Abbremsungen für Gelenkbewegungen
Einfache Einstellung
Wenn das Werkzeug oder der vom Roboter transportierte Gegenstand keine besonders vorsichtige Handhabung
erfordern, sind Randbedingungen für kartesische Geschwindigkeiten unnötig. Die Einstellung der Bahngeschwindigkeit
erfolgt im Allgemeinen auf folgende Weise:
1. Die Randbedingungen für kartesische Geschwindigkeit werden auf hohe Werte gesetzt, z.B. auf die
vorprogrammierten Werte, damit sie keinen Einfluss auf die anschließende Einstellung haben.
2. Die Geschwindigkeiten und Beschleunigungen der Gelenke werden auf ihre Nennwerte (100%) initialisiert.
3. Dann wird die Bahngeschwindigkeit nur mit dem Parameter Gelenkgeschwindigkeit eingestellt.
4. Wenn keine ausreichende Geschwindigkeit erreicht werden kann, müssen die Beschleunigungs- und
Abbremswerte vergrößert werden
Komplexere Einstellungen
Wenn die kartesische Geschwindigkeit des Werkzeugs beherrscht werden muss, zum Beispiel um eine Bahn mit
konstanter Geschwindigkeit auszuführen, sollte besser auf folgende Weise vorgegangen werden:
1. Die Bedingungen für die kartesischen Geschwindigkeiten auf die zunächst gewünschten Werte einstellen.
2. Die Geschwindigkeiten und Beschleunigungen der Gelenke werden auf ihre Nennwerte (100%) initialisiert.
3. Dann die Bahngeschwindigkeit nur mit dem Parameter kartesische Geschwindigkeit einstellen.
4. Wenn die gewünschte Geschwindigkeit nicht erreicht werden kann, müssen die Beschleunigungs- und
Abbremswerte vergrößert werden.
Wenn man in starken Kurven automatisch bremsen möchte, müssen die Beschleunigungs- und Abbremswerte
verringert werden.
Schleppfehler
Die Nennwerte für die Geschwindigkeiten und Beschleunigungen der Drehachsen gelten für Roboter mit Nennlast
unabhängig von der Bahn.
In vielen Fällen kann der Roboter schnellere Bewegungen ausführen: Seine Höchstgeschwindigkeiten hängen jedoch
von der Last und der Bahn ab. Unter günstigen Bedingungen (geringe Last, günstiger Einfluss der Schwerkraft) kann
der Roboter seine Nennwerte ohne Schaden überschreiten.
Wenn der Roboter hingegen eine schwerere Last bewegen muss, als die Nennlast, oder wenn zu hohe
Geschwindigkeiten und Beschleunigungen der Drehachsen parametriert wurden, kann der Roboter unter Umständen
den Bewegungsanweisungen nicht mehr folgen und bleibt mit einem Schleppfehler stehen. Durch Eingabe kleinerer
Geschwindigkeits- und Beschleunigungswerte können derartige Fehler vermieden werden.
ACHTUNG:
Bei geradlinigen Bewegungen in der Nähe singulärer Punkte sind große Gelenkbewegungen
für kleine Werkzeugbewegungen erforderlich. Wenn eine zu hohe Gelenkgeschwindigkeit
eingegeben wurde, wird der Roboter der Anweisung nicht mehr folgen können und mit einem
Schleppfehler stehen bleiben.
ONLINE-BEWEGUNGSSTEUERUNG
Die bis jetzt angesprochenen Bewegungssteuerungen haben keine sofortige Wirkung: Die Ausführung einer solchen
Steueranweisung vom Programm führt zur Speicherung der Bewegungsanweisung durch das System. Sie werden erst
anschließend vom Roboter ausgeführt.
Es besteht jedoch die Möglichkeit, die Bewegungen des Roboters mit sofortiger Wirkung zu beeinflussen:
• Die Monitorgeschwindigkeit ändert die Geschwindigkeiten aller Bewegungen. Sie kann nur auf dem
Handbediengerät des Roboters und nicht in einem VAL3-Programm geändert werden. Mit der Anweisung
speedScale() kann das Programm jedoch die aktuelle Monitorgeschwindigkeit lesen und den Benutzer
gegebenenfalls auffordern, sie bei einem Wiederholzyklus zu verringern oder sie mit 100% in die Produktion
zu geben.
• Mit den Anweisungen stopMove() und restartMove() kann die Bewegung auf der Bahn unterbrochen und
wieder aufgenommen werden.
• Die Anweisung resetMotion() ermöglicht die Unterbrechung einer Bewegung und das Löschen der
gespeicherten Bewegungsanweisungen.
num decel Maximal zulässige Abbremsung des Gelenks, angegeben in % der nominalen Abbremsung
des Roboters.
num tvel Maximal zulässige Lineargeschwindigkeit des Werkzeugmittelpunkts in mm/s oder inch/s je
nach Längeneinheit des Programms.
blend
Glättungsart: off (keine Glättung) oder joint (mit Glättung).
blend
num leave Bei Glättung (joint), die Entfernung vom Zielpunkt bei der die Glättung zum nächsten Punkt
beginnt, angegeben in mm oder inch, je nach Längeneinheit des Programms.
num reach Bei Glättung (joint), die Entfernung vom Zielpunkt bei der die Glättung zum nächsten Punkt
endet, angegeben in mm oder inch, je nach Längeneinheit des Programms.
Operatoren
Mit zunehmender Priorität:
mdesc <mdesc& desc1> = <mdesc desc2> Weist jedes Feld desc2 dem entsprechenden Feld der
Variablen desc1 zu.
bool <mdesc desc1> != <mdesc desc2> Überträgt true, wenn sich desc1 und desc2 in
mindestens einem Feld unterscheiden.
bool <mdesc desc1> == <mdesc desc2> Überträgt true, wenn die Werte der Felder in desc1
und desc2 gleich sind.
BEWEGUNGSANWEISUNGEN
void movej(joint joint, tool Werkzeug, mdesc desc)
Syntax
void movej(joint Position, tool Werkzeug, mdesc desc)
void movej(point Punkt, tool Werkzeug, mdesc desc)
Funktion
Speichert einen Bewegungsbefehl für ein Gelenk zur Position Punkt oder Position mit dem Werkzeug Werkzeug und
den Bewegungsparametern desc.
ACHTUNG:
Das System wartet nicht auf das Ende der Bewegung, um zur nächsten VAL3-Anweisung
weiterzugehen: Es können mehrere Bewegungsanweisungen vorab gespeichert werden.
Wenn nicht mehr genügend Speicherplatz für eine neue Anweisung verfügbar ist, wird mit der
Ausführung gewartet, bis die Speicherung möglich ist.
Zur ausführlichen Beschreibung der verschiedenen Bewegungsparameter, siehe Beginn des Kapitels
Bewegungssteuerung.
Wenn desc unzulässige Werte aufweist, position außerhalb der Softwaregrenzen liegt, point nicht erreichbar ist oder
ein zuvor aufgezeichneter Bewegungsbefehl nicht ausgeführt werden kann, wird eine Fehlermeldung erzeugt
(Endpunkt nicht erreichbar).
Parameter
tool Werkzeug Ausdruck des Typs Werkzeug
Siehe auch
void movel(point Punkt, tool Werkzeug, mdesc desc)
bool isInRange(joint Position)
void waitEndMove()
void movec(Mittlerer Punkt, Endpunkt, tool Werkzeug, mdesc desc)
Syntax
void movel(point Punkt, tool Werkzeug, mdesc desc)
Funktion
Speichert einen linearen Bewegungsbefehl zur Position Punkt mit dem Werkzeug Werkzeug und den
Bewegungsparametern desc.
ACHTUNG:
Das System wartet nicht auf das Ende der Bewegung, um zur nächsten VAL3-Anweisung
weiterzugehen: Es können mehrere Bewegungsanweisungen vorab gespeichert werden.
Wenn nicht mehr genügend Speicherplatz für eine neue Anweisung verfügbar ist, wird mit der
Ausführung gewartet, bis die Speicherung möglich ist.
Zur ausführlichen Beschreibung der verschiedenen Bewegungsparameter, siehe Beginn des Kapitels
Bewegungssteuerung.
Wenn desc unzulässige Werte aufweist, Punkt nicht erreichbar oder eine geradlinige Bewegung zu Punkt nicht
möglich ist oder ein zuvor aufgezeichneter Bewegungsbefehl nicht ausgeführt werden kann, wird eine Fehlermeldung
erzeugt (Endpunkt nicht erreichbar).
Parameter
point Punkt Ausdruck des Typs point.
Siehe auch
void movej(joint joint, tool Werkzeug, mdesc desc)
void waitEndMove()
void movec(Mittlerer Punkt, Endpunkt, tool Werkzeug, mdesc desc)
Syntax
void movec(Mittlerer Punkt, Endpunkt, tool Werkzeug, mdesc desc)
Funktion
Speichert die Anweisung für eine kreisförmige Bewegung, ausgehend vom Zielort der vorherigen Bewegung, über
Mittlerer Punkt bis zu Endpunkt.
Die Ausrichtung des Werkzeugs ist so interpoliert, dass eine absolute, konstante Ausrichtung oder eine Ausrichtung
bezüglich der Bahn möglich ist.
ACHTUNG:
Das System wartet nicht auf das Ende der Bewegung, um zur nächsten VAL3-Anweisung
weiterzugehen: Es können mehrere Bewegungsanweisungen vorab gespeichert werden.
Wenn nicht mehr genügend Speicherplatz für eine neue Anweisung verfügbar ist, wird mit der
Ausführung gewartet, bis die Speicherung möglich ist.
Zur ausführlichen Beschreibung der verschiedenen Bewegungsparameter und der Interpolation der
Ausrichtung, siehe Beginn des Kapitels "Bewegungssteuerung".
Bei ungültigen Werten von desc wird ein Ausführungsfehler erzeugt. Dies gilt auch, wenn die Positionen Mittlerer
Punkt (oder Endpunkt) nicht erreichbar sind, wenn die kreisförmige Bewegung nicht möglich ist (siehe Kapitel
"Bewegungssteuerung" - Interpolation der Ausrichtung) oder wenn ein zuvor aufgezeichneter Bewegungsbefehl nicht
ausgeführt werden kann (Zielposition nicht erreichbar).
Parameter
Mittlerer Punkt Ausdruck des Typs point.
Siehe auch
void movej(joint joint, tool Werkzeug, mdesc desc)
void movel(point Punkt, tool Werkzeug, mdesc desc)
void waitEndMove()
Syntax
void stopMove()
Funktion
Hält den Arm während der Bewegung an und hebt die programmierte Freigabe der Bewegung vorübergehend auf.
ACHTUNG:
Diese Anweisung bewirkt sofortige Rückkehr, die VAL3-Task wartet zur Ausführung der
folgenden Task nicht auf den Stillstand des Arms.
Zum Anhalten des Roboters werden die kinematischen Parameter der laufenden Bewegung verwendet.
Die Bewegung kann erst nach Ausführung der Anweisung restartMove() oder resetMotion() fortgesetzt werden.
Nicht programmierte Bewegungen (manuelles Verfahren) bleiben weiterhin möglich.
Zum Beispiel
wait (dSignal==true) // Warten auf ein Signal
stopMove() // Anhalten des Roboters während der Bewegung
<instructions>
restartMove() // Erneutes Anfahren des Roboters auf der gleichen Bahn
Siehe auch
void restartMove()
void resetMotion(), void resetMotion(joint Start)
Syntax
void resetMotion()
void resetMotion(joint Start)
Funktion
Hält den Roboterarm während der Bewegung an und löscht alle gespeicherten Bewegungsanweisungen.
ACHTUNG:
Diese Anweisung bewirkt sofortige Rückkehr, die VAL3-Task wartet zur Ausführung der
folgenden Task nicht auf den Stillstand des Arms.
Wenn die programmierte Freigabe der Bewegung durch die Anweisung stopMove() aufgehoben worden war, wird sie
wieder hergestellt.
Wenn die Anfangs-Winkelposition Start festgelegt ist, so kann die nächste Bewegungsanweisung nur von dieser
Position aus durchgeführt werden: Es ist zunächst eine Anschluss-Bewegung erforderlich, um zu Start
zurückzukehren.
Ist keine Winkelposition festgelegt, so wird die nächste Bewegungsanweisung von der aktuellen Position des Arms
ausgeführt, egal, wo sich dieser befindet.
Siehe auch
bool isEmpty()
void stopMove()
void autoConnectMove(bool aktiv), bool autoConnectMove()
void restartMove()
Syntax
void restartMove()
Funktion
Stellt die programmierte Freigabe der Bewegung wieder her und setzt die mit der Anweisung stopMove()
unterbrochene Bewegung fort.
Wenn die programmierte Bewegungsfreigabe nicht durch stopMove() unterbrochen war, hat diese Anweisung
keinerlei Auswirkungen.
Siehe auch
void stopMove()
void resetMotion(), void resetMotion(joint Start)
void waitEndMove()
Syntax
void waitEndMove()
Funktion
Annulliert die Glättung der zuletzt gespeicherten Bewegungsanweisung und wartet auf die Ausführung dieser
Anweisung.
Diese Anweisung wartet nicht auf die Stabilisierung des Roboters an seiner Endposition, sondern nur dass die an die
Getriebe gesendete Positionsanweisung mit der gewünschten Endposition übereinstimmt. Wenn die vollständige
Stabilisierung nach der Bewegung abgewartet werden soll, so muss die Anweisung isSettled() verwendet werden.
Ein Ausführungsfehler wird erzeugt, wenn ein zuvor aufgezeichneter Bewegungsbefehl nicht durchgeführt werden kann
(Endpunkt außer Reichweite).
Zum Beispiel
waitEndMove()
putln(sel(isEmpty(),1,-1)) // ergibt 1, wenn kein Befehl mehr ansteht
putln(sel(isSettled(),1,-1)) // Kann -1 anzeigen, da der Roboter noch nicht unbedingt stabilisiert ist
watch(isSettled(), 1) // Wartet während maximal 1 s auf die Stabilisierung des Roboters
Siehe auch
bool isSettled()
bool isEmpty()
void stopMove()
void resetMotion(), void resetMotion(joint Start)
bool isSettled()
Syntax
bool isSettled()
Funktion
Überträgt true, wenn der Roboter gestoppt ist, und false, wenn seine Position noch nicht stabilisiert ist.
Die Position wird als stabilisiert betrachtet, wenn der Positionsfehler für jede Achse während 50 ms weniger als 1% der
maximal zulässigen Position beträgt.
Siehe auch
bool isEmpty()
void waitEndMove()
ACHTUNG:
Unter normalen Einsatzbedingungen stoppt der Arm bei einem Notaus auf seiner Bahn.
Demzufolge kann der Arm im ferngesteuerten Modus unabhängig von dem in der Anweisung
autoConnectMove definierten Modus der Anschlussbewegung automatisch neu starten.
Siehe auch
void resetMotion(), void resetMotion(joint Start)
OPTIONEN
Der Roboter ist "ausgleichfähig" (compliant), wenn er gewisse Abweichungen der angesteuerten Position von der
tatsächlichen Position erlaubt. Die Steuerung CS8 kann so programmiert werden, dass sie auf ihrer Bahn
ausgleichfähig ist. Das heißt, sie kann einen Verzug oder eine Voreilung auf der programmierten Bahn durch Steuerung
der auf den Arm ausgeübten Kraft ausgleichen. Hingegen wird keinerlei räumliche Abweichung von der Bahn toleriert.
In der Praxis können ausgeglichene Bewegungen der CS8 dem Arm eine Verfolgung seiner Bahn ermöglichen, auch
wenn er von äußeren Kräften geschoben oder gebremst wird. Gleichermaßen kann der Arm mit einem Objekt in
Berührung treten, wobei die vom Arm auf dieses Objekt ausgeübte Kraft gesteuert wird.
Programmierung
Ausgeglichene Bewegungen werden wie Standardbewegungen mit den Anweisungen movelf() und movejf()
programmiert, wobei ein zusätzlicher Parameter die vom Arm ausgeübte Kraft steuern kann. Während der
ausgeglichenen Bewegung erfolgen Geschwindigkeits- und Beschleunigungsbegrenzungen wie bei
Standardbewegungen mittels des Bewegungsdeskriptors. Die Bewegung kann auf der Bahn in beiden Richtungen
erfolgen.
Ausgeglichene Bewegungen können untereinander oder mit Standardbewegungen verkettet werden: Nach Erreichen
der Zielposition fährt der Roboter mit dem folgenden Bewegungsbefehl fort. Die Anweisung waitEndMove() ermöglicht
es, das Ende einer ausgeglichenen Bewegung abzuwarten.
Die Anweisung resetMotion() bricht alle programmierten Bewegungen, sowohl standardmäßige als auch
ausgeglichene, ab. Nach Ausführung von resetMotion() ist der Roboter nicht mehr ausgleichfähig (compliant).
Die Anweisungen stopMove() und restartMove() können auch auf ausgeglichene Bewegungen zur Anwendung
kommen:
stopMove() erzwingt Geschwindigkeit 0 für die in Ausführung befindliche Bewegung. Handelt es sich um eine
ausgeglichene Bewegung, so wird diese gestoppt und der Roboter ist bis zur nächsten Ausführung von restartMove()
nicht mehr ausgleichfähig (compliant).
Schließlich ermöglicht es die Anweisung isCompliant(), vor Zulassung der Einwirkung einer äußeren Kraft auf den
Roboterarm sicherzustellen, dass der Roboter ausgleichfähig ist.
Anweisungen
void movejf(joint Position, tool Werkzeug, mdesc desc, num Kraft)
Syntax
void movejf(joint Position, tool Werkzeug, mdesc desc, num Kraft)
Funktion
Speicherung einer ausgeglichenen Gelenkbewegung zu Position Position, mit dem Werkzeug Werkzeug, den
Bewegungsparametern desc und einem gesteuerten Kraftwert Kraft.
Der gesteuerte Kraftwert Kraft wird in Prozent der maximalen Belastbarkeit des Arms ausgedrückt. Er muss innerhalb
±1000% liegen.
ACHTUNG:
Das System wartet nicht auf das Ende der Bewegung, um zur nächsten VAL3-Anweisung
weiterzugehen: Es können mehrere Bewegungsanweisungen vorab gespeichert werden. Wenn
nicht mehr genügend Speicherplatz für eine neue Anweisung verfügbar ist, wird mit der
Ausführung gewartet, bis die Speicherung möglich ist.
Die verschiedenen Parameter der Bewegung sind zu Beginn des vorliegenden Kapitels genauer erklärt.
Bei ungültigen Werten von desc oder Kraft wird ein Ausführungsfehler erzeugt, ebenfalls, wenn der Wert von Position
außerhalb der Softwareanschläge liegt, wenn die vorangehende Bewegung eine Glättung fordert oder wenn ein zuvor
aufgezeichneter Bewegungsbefehl nicht ausgeführt werden kann (Zielposition nicht erreichbar).
Parameter
tool Werkzeug Ausdruck des Typs Werkzeug.
Siehe auch
void movelf(point Punkt, tool Werkzeug, mdesc desc, num Kraft)
bool isCompliant()
Syntax
void movelf(point Punkt, tool Werkzeug, mdesc desc, num Kraft)
Funktion
Speicherung einer ausgeglichenen Linearbewegung zur Position Punkt, mit dem Werkzeug Werkzeug, den
Bewegungsparametern desc und einem gesteuerten Kraftwert Kraft.
Der gesteuerte Kraftwert Kraft wird in Prozent der maximalen Belastbarkeit des Arms ausgedrückt. Er muss innerhalb
±1000% liegen.
ACHTUNG:
Das System wartet nicht auf das Ende der Bewegung, um zur nächsten VAL3-Anweisung
weiterzugehen: Es können mehrere Bewegungsanweisungen vorab gespeichert werden. Wenn
nicht mehr genügend Speicherplatz für eine neue Anweisung verfügbar ist, wird mit der
Ausführung gewartet, bis die Speicherung möglich ist.
Die verschiedenen Parameter der Bewegung sind zu Beginn des vorliegenden Kapitels genauer erklärt.
Bei ungültigen Werten von desc oder Kraft wird ein Ausführungsfehler erzeugt. Dies gilt auch, wenn die Position Punkt
nicht erreichbar ist, wenn die Position Punkt nicht auf einer geradlinigen Bewegung angefahren werden kann, wenn die
vorangehende Bewegung eine Glättung fordert oder wenn ein zuvor aufgezeichneter Bewegungsbefehl nicht
ausgeführt werden kann (Zielposition nicht erreichbar).
Parameter
point Punkt Ausdruck des Typs point.
Siehe auch
void movejf(joint Position, tool Werkzeug, mdesc desc, num Kraft)
bool isCompliant()
Syntax
bool isCompliant()
Funktion
Liefert den Wert true, wenn der Roboter in ausgeglichenem Betrieb arbeitet, andernfalls den Wert false.
Zum Beispiel
movelf(position, outil, mDesc, 0)
wait(isCompliant()) // Wartet bis der Roboter ausgleichfähig ist
dEjection = true // Auswurfbefehl der Spritzgießmaschine
waitEndMove() // Wartet auf das Ende der ausgeglichenen Bewegung
movej(jDépart, outil, mDesc) // Schließt eine Standardbewegung an
Siehe auch
void movelf(point Punkt, tool Werkzeug, mdesc desc, num Kraft)
void movejf(joint Position, tool Werkzeug, mdesc desc, num Kraft)
ANHANG
FEHLERCODES
Code Beschreibung
-1 Es gibt keine Task Name
0 Die Task Name ist ohne Ausführungsfehler gestoppt
1 Die Task Name befindet sich in Ausführung
10 Ungültige numerische Berechnung (Division durch Null).
11 Ungültige numerische Berechnung (zum Beispiel ln(-1))
20 Zugriff zu einer Tabelle mit höherem Index als die Tabellengröße.
21 Zugriff zu einer Tabelle mit negativem Index.
29 Ungültiger Name der Task. Siehe Anweisung taskCreate().
30 Der festgelegte Name entspricht keiner Task von VAL3.
31 Es existiert bereits eine Task gleichen Namens. Siehe Anweisung taskCreate.
40 Der Speicherplatz genügt nicht für die Daten.
41 Der Ausführungsspeicher ist für die Task unzureichend. Siehe Größe des Ausführungsspeichers.
60 Maximale Ausführungszeit der Anweisung ist abgelaufen.
61 Interner Fehler des VAL3-Interpreters
70 Ungültiger Wert des Parameters der Anweisung. Siehe entsprechende Anweisung.
80 Verwendung von Daten oder Programmen einer nicht im Speicher geladenen Bibliothek.
90 Die Task kann an der festgelegten Stelle nicht wieder aufgenommen werden. Siehe Anweisung taskResume().
100 Die im Bewegungsdeskriptor spezifizierte Geschwindigkeit ist ungültig (negativ oder zu groß).
101 Die im Bewegungsdeskriptor spezifizierte Beschleunigung ist ungültig (negativ oder zu groß).
Die im Bewegungsdeskriptor spezifizierte Abbremsgeschwindigkeit ist ungültig (negativ, zu groß oder kleiner als
102
die Geschwindigkeit).
103 Die im Bewegungsdeskriptor spezifizierte Translationsgeschwindigkeit ist ungültig (negativ oder zu groß).
104 Die im Bewegungsdeskriptor spezifizierte Rotationsgeschwindigkeit ist ungültig (negativ oder zu groß).
105 Der im Bewegungsdeskriptor spezifizierte Parameter reach ist ungültig (negativ).
106 Der im Bewegungsdeskriptor spezifizierte Parameter leave ist ungültig (negativ).
122 Schreibversuch auf einem Eingang des Systems.
123 Verwendung eines Ein-/Ausgangs dio, aio oder sio, der keinem Ein-/Ausgang des Systems zugeordnet ist.
124 Versuch des Zugriffs auf einen geschützten Ein-/Ausgang des Systems
125 Lese- oder Schreibfehler an einem dio, aio oder sio (Fehler auf Feldbus)
Diese Bewegungsanweisung lässt sich nicht ausführen: Eine vorher angeforderte Bewegung konnte nicht beendet
150
werden (Punkt nicht erreichbar, singulärer Punkt, Konfigurationsproblem usw.)
152 Verwendung eines point ohne Referenzsystem. Siehe Definition.
153 Bewegungsbefehl nicht unterstützt
154 Ungültige Bewegungsanweisung: Bewegungsdeskriptor überprüfen.
160 Koordinaten des Tools flange nicht gültig
161 Koordinaten des Koordinatensystems world nicht gültig
162 Verwendung eines point ohne Referenzsystem. Siehe Definition.
163 Verwendung eines Koordinatensystems ohne Referenzsystem. Siehe Definition.
164 Verwendung eines Tools ohne Referenztool. Siehe Definition.
165 Referenzsystem oder Referenztool ungültig (globale Variable mit lokaler Variablen verbunden)
Mit Shift
7 8 9 + * ; ( ) [ ]
55 56 57 43 42 59 40 41 91 93
4 5 6 - / ? : ! { }
52 53 54 45 47 63 58 33 123 125
1 2 3 0 " % - . , >
49 50 51 48 34 37 95 46 44 62
ADDILDUNG
Abhängigkeit der Tools ................................................ 78
Absolute, konstante Ausrichtung .......................................... 96
Andere Schulterkonfiguration möglich ..................................... 100
Anfans- und Endposition ............................................... 91
Bedienerseite ...................................................... 46
Beziehung zwischen: frame / point / tool / trsf ................................. 69
Definition der Entfernungen: ’leave’ / ’reach’ .................................. 93
Drehung des Koordinatensystems bezüglich folgender Achse: X .................... 73
Drehung des Koordinatensystems bezüglich folgender Achse: Y’ .................... 74
Drehung des Koordinatensystems bezüglich folgender Achse: Z’’ .................... 74
Geglätteter Zyklus .................................................. 101
Geglätteter Zyklus ................................................... 94
Geradlinige Bewegung ................................................ 91
Konfiguration: enegative ............................................... 88
Konfiguration: epositive ................................................ 88
Konfiguration: lefty ................................................... 87
Konfiguration: lefty ................................................... 89
Konfiguration: righty .................................................. 87
Konfiguration: righty .................................................. 89
Konfiguration: wnegative ............................................... 88
Konfiguration: wpositive ............................................... 88
Konstante Ausrichtung bezüglich der Bahn ................................... 96
Kreisförmige Bewegung ............................................... 92
Mehrdeutigkeit der mittleren Ausrichtung .................................... 97
Orientierung ....................................................... 73
Positive / negative Konfiguration des Ellenbogens .............................. 98
Positive / negative Konfiguration des Handgelenks .............................. 99
Punktdefinition ...................................................... 80
Sequentielles Ordnen ................................................. 53
Vollständiger Kreis ................................................... 97
Wechsel: righty / lefty ................................................. 98
Wechseln der Ellenbogenkonfiguration nicht möglich ............................ 99
Zusammenhang zwischen den Referenz-Koordinatensystemen ..................... 76
Zwei verschiedene Konfigurationen, um denselben Punkt zu erreichen: P .............. 86
Zyklus mit unterbrochener Glättung ........................................ 94
Zyklus: U ......................................................... 92
INDEX
A E
abs (fonction) 24, 70 elbow 86
accel 104 else 16
acos (fonction) 23 enablePower (fonction) 66
aio 12, 41 endFor 18
aioGet (fonction) 41 endIf 16
aioLink (fonction) 41 endWhile 17
aioSet (fonction) 42 enegative 88
appro (fonction) 83 epositive 88
asc (fonction) 33 esStatus (fonction) 68
asin (fonction) 23 exp (fonction) 25
atan (fonction) 24
autoConnectMove 95 F
autoConnectMove (fonction) 110 find (fonction) 36
flange 10
B for 18
blend 93, 104 for (fonction) 18
bool 12 frame 12, 69
C G
call 11, 16 get 53
call (fonction) 15 get (fonction) 48
chr (fonction) 32 getKey (fonction) 50
clearBuffer (fonction) 44 globale 13
clock (fonction) 61 gotoxy (fonction) 47
close 53
close (fonction) 79 H
cls (fonction) 47 here (fonction) 83
codeAscii 32 herej (fonction) 71
compose (fonction) 82 I
config 12, 69, 86 if (fonction) 16
config (fonction) 90 insert (fonction) 35
cos (fonction) 23 isCalibrated (fonction) 67
D isCompliant 111
decel 104 isCompliant (fonction) 114
delay 53 isEmpty (fonction) 110
delay (fonction) 60 isInRange (fonction) 71
delete (fonction) 35 isKeyPressed (fonction) 50
dio 12, 38 isPowered (fonction) 66
dioGet (fonction) 39 isSettled (fonction) 110
dioLink (fonction) 39 J
dioSet (fonction) 40 joint 12
disablePower (fonction) 66 jointToPoint (fonction) 84
distance (fonction) 75, 81
do 17 L
do ... until (fonction) 17 leave 93, 104
left (fonction) 33
userPage (fonction) 46
V
vel 104
W
wait 53
wait (fonction) 60
waitEndMove 53, 94, 111
waitEndMove (fonction) 109
watch 53
watch (fonction) 61
while (fonction) 17
wnegative 88
workingMode (fonction) 67
world 10
wpositive 88
wrist 86