0% fanden dieses Dokument nützlich (0 Abstimmungen)
16 Ansichten46 Seiten

Control

Das Dokument enthält Sicherheitshinweise für die Bedienung einer CNC-Maschine. Es warnt vor Gefahren durch elektrische Spannungen und plötzliche Bewegungen der Maschine. Der sichere Umgang mit der Maschine erfordert Beachtung der Hinweise und Verfügbarkeit von Handbüchern.

Hochgeladen von

Marc van Endert
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
16 Ansichten46 Seiten

Control

Das Dokument enthält Sicherheitshinweise für die Bedienung einer CNC-Maschine. Es warnt vor Gefahren durch elektrische Spannungen und plötzliche Bewegungen der Maschine. Der sichere Umgang mit der Maschine erfordert Beachtung der Hinweise und Verfügbarkeit von Handbüchern.

Hochgeladen von

Marc van Endert
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

Hinweise zur Sicherheit

Dieses Handbuch wendet sich an ausgebildetes und mit der Bedienung und
Programmierung einer CNC-Maschine vertrautes Fachpersonal. Nicht nur die
Bedienung, sondern insbesondere auch die elektrische Installation, die Parametrierung
und die Inbetriebnahme der CNC-Steuerung dürfen nur von dazu befähigten Personen
durchgeführt werden.

An den Baugruppen der CNC-Steuerung liegen gefährliche, elektrische Spannungen an.


Arbeiten an der Steuerung dürfen nur ausgeführt werden, wenn zuvor sowohl die
Netzspannungsversorgung der Steuerung als auch alle externen Betriebs- und
Steuerspannungen abgeschaltet und gegen Wiedereinschalten gesichert sind.

Insbesondere bei Arbeiten an der elektrischen Anlage und bei Testläufen während der
Parametrierung oder PLC-Programmierung, aber auch bei Ausführung von NC-
Programmen durch den Maschinenbediener, können Achs- und Spindelantriebe sowie
andere mechanische Baugruppen plötzlich und unerwartet anlaufen und dabei schwere
Personen- und/oder Sachschäden verursachen. Antriebskomponenten, von denen eine
Gefahr ausgehen kann, sind daher entsprechend zu sichern und gegen jeden Zugang
(auch durch unbeteiligte Personen) abzusperren.

Bei der Maschineneinrichtung kann das Verfahren der Achsen und das Ingangsetzen
der Spindelantriebe möglich (und notwendig) sein, ohne dass der Zugang zum
Arbeitsraum der Maschine durch Sicherheitseinrichtungen blockiert ist. Hierbei ist stets
mit unerwarteten Maschinenbewegungen (ausgelöst durch Bedienungsfehler oder
mögliche Fehlfunktionen der Maschine) zu rechnen, die zu schweren Verletzungen
führen können.

1
Hinweise zu diesem Handbuch
Jedem Bediener einer mit dieser CNC-Steuerung ausgestatteten Maschine ist das
Bedienerhandbuch zur Verfügung zu stellen. Bevor dieser mit der Bedienung und/oder
Programmierung der CNC-Maschine betraut wird, ist sicherzustellen, dass das
Handbuch von ihm gelesen und verstanden worden ist.

Techniker, die eine Maschine mit der CNC-Steuerung ausrüsten und/oder erstmalig in
Betrieb nehmen, müssen darüber hinaus das Technikerhandbuch gelesen und
verstanden haben.

Dieses Handbuch ist Bestandteil des Lieferumfangs der CNC-Steuerung und muss stets
griffbereit in der Nähe der Hardwarekomponenten der Steuerung bzw. der mit der
Steuerung ausgestatteten Maschine aufbewahrt werden.

Falls der Hersteller oder Lieferant der Steuerung neue, überarbeitete Versionen dieses
Handbuchs zur Verfügung stellt, sind die im Umlauf befindlichen und die an der
Maschine aufbewahrten Handbücher umgehend durch die neuen Versionen zu
ersetzen.

2
1 Parameter
Die Datei [Link] enthält über die im Handbuch Installation beschriebenen Parameter
hinaus weitere, speziell für die Konfiguration der Steuerung PNC-2 benötigte Parameter.
Diese Parameter sind in folgende Sections gegliedert:

• [Control] (Parameter für die Bausbaugruppe)


• [Axis] (Parameter für die einzelnen Achsbaugruppen)
• [Spindle] (Parameter für die einzelnen Hauptspindelbaugruppen)
• [Servo] (Parameter für die PWM-Ausgänge der Servobaugruppen)

3
1.1 [Control]
Diese Section dient der Angabe von Parametern, die die Busbaugruppe betreffen:

[Control]
NetworkAdr=<Adresse>
Parameter=<Parameter>
DeviceCount=<Anzahl Baugruppen> 0...15
PathBlockSize=<Blocklänge Bahndaten> 1...7
PathBufSize=<Puffergröße Bahndaten> <Blocklänge Bahndaten>...254
InvertAlarm=<Alarmeingänge invertiert> 0|1

Adresse

ist die Adresse des Gerätes im Netzwerk (USB-Seriennummer) und muß nur angegeben
werden, wenn mehrere Buseinheiten mit dem PC verbunden sind.

Parameter

ist ein für interne Zwecke des Herstellers reservierter Parameter; hier ist immer 0
einzutragen.

Anzahl Baugruppen

ist die Anzahl der zusätzlich zur Busbaugruppe PNC-2-BU1 vorhandenen, weiteren
Baugruppen (max. 14).

Blocklänge Bahndaten

gibt an, wie viele Positionsdaten während der Bahninterpolation gleichzeitig in Form
eines Blockes vom CNC-Steuerungsrechner zur Buseinheit übertragen werden sollen.
Enthält die Buseinheit bis zu vier Achsbaugruppen, sollte immer die maximale
Blocklänge (7) angegeben werden; bei mehr als vier Achsen kann es u.U. notwendig
sein, die Blocklänge zu verkleinern, wenn es zu Problemen mit der Leistung des
Steuerungsrechners kommt.

Puffergröße Bahndaten

ist die Größe des Pufferspeichers, in den die Positionsdatenblöcke übertragen werden.
Durch Verwendung dieses Pufferspeichers (Mindestgröße = Blocklänge Bahndaten + 2)
ist sichergestellt, dass sich kurzzeitige Unterbrechungen des CNC-
Steuerungsprogramms durch das Betriebssystem Windows nicht durch Aussetzer bei
der Bewegung der Achsen bemerkbar machen. Der dadurch unvermeidbare leichte
Zeitversatz zwischen der Ausführung des NC-Programms und der tatsächlichen
Bewegung der Achsen steigt mit der Puffergröße. Daher sollte stets die kleinstmögliche
Puffergröße angegeben werden, mit der ein reibungsloser Betrieb möglich ist;
üblicherweise genügt eine Puffergröße von ca. 50 bis 100.

4
Alarmeingänge invertiert

ermöglicht die Invertierung der Schaltzustände der Alarmeingänge der Busbaugruppe.


Ohne Invertierung (Option nicht ausgewählt) muss bei Normalbetrieb Spannung an den
Alarmeingängen anliegen.

5
1.2 [Axis]
Diese Sections enthalten die Parameter zur Konfiguration der Achsbaugruppen:

[Axis_<ID>] 1...15
Name=<Bezeichnung> X|Y|Z|U|V|W|A|B|C|E|*
Precision=<Anzeigeauflösung> 0...4
MinPos=<SW-Endschalter min.> mm (°)
MaxPos=<SW-Endschalter max.> mm (°)
Modulo=<Modulo> mm (°)
RotAxis=<Drehachse> 0|1
MaxFeed=<max. Geschwindigkeit> > 0 mm/min (°/min)
FastFeedManual=<Eilgang Handbetrieb> > 0 mm/min (°/min)
FastFeedAuto=<Eilgang Automatikbetrieb> > 0 mm/min (°/min)
FastFeedDryRun=<Eilgang Programmtestlauf> > 0 mm/min (°/min)
TravelUnit=<Teilweg> > 0 mm (°)
StepsPerUnit=<Schritte/Teilweg> >0
InvertDirection=<Richtung invertiert> 0|1
InvertCommand=<Sollwert invertiert> 0|1
PositionGain=<KP> 0...32767
IntegralGain=<KI> 0...32767
DerivativeGain=<KD> 0...32767
IntegrationLimit=<max. I> 0...32767
MaxStepFrequency=<max. Schrittfrequenz> > 0...4000 kHz
ErrorLimit=<max. Schleppfehler> > 0 mm (°)
Acceleration=<max. Beschleunigung> > 0 mm/s² (°/s²)
LimitAngle=<Grenzwinkel> 0°...45 °
ArcTolerance=<Kreistoleranz> > 0 mm (°)
InvertInput1=<Eingang 1 invertiert> 0|1
InvertInput2=<Eingang 2 invertiert> 0|1
InvertAlarm=<Alarmeingang invertiert> 0|1
AlarmDelay=<Verzögerung Alarm> >= 0 ms
EnableOutput=<Ausgang Reglerfreigabe>
BrakeOutput=<Ausgang Bremse>
BrakeDelay=<Verzögerung Bremse> >= 0 ms
Gantry=<Gantry-Achse> 1...15

ID

ist die eindeutige Nummer der Achse (1 = erste Achsbaugruppe nach Busbaugruppe, 2
= zweite Achsbaugruppe usw.).

Bezeichnung

ist die Bezeichnung der Achse. Die Hauptachsen werden mit einen NC-
Koordinatenbuchstaben bezeichnet; es darf nicht mehreren Hauptachsen derselbe
Koordinatenbuchstabe zugeordnet werden. Hilfsachsen werden mit einem Stern ("*")
bezeichnet.

6
Anzeigeauflösung

ist die Anzahl der Nachkommastellen, die bei der Positionsanzeige auf dem CNC-
Bildschirm dargestellt werden sollen.

SW-Endschalter min.
SW-Endschalter max.

geben die Lage der Software-Endschalter an, die den Gesamtweg der Achse
begrenzen. In beiden Feldern muss 0 eingegeben werden, wenn es sich um eine Achse
mit endlosem Verfahrweg handelt und der dann unter Modulo angegebene Wert
ungleich 0 ist.

Modulo

wird bei Achsen mit endlosem Verfahrweg (üblicherweise Rundachsen) verwendet. Ist
hier ein Wert ungleich 0 angegeben, wird in der Positionsanzeige der CNC stets der
Divisionsrest aus der Division der tatsächlichen Position durch den angegebenen Wert
dargestellt. Bei einer Rundachse mit Modulo = 360° würde dann z.B. beim Verfahren
von der Position 0° auf die Position 725° die Achse etwas mehr als zwei Umdrehungen
ausführen und die Positionsanzeige anschließend 5° anzeigen.

Drehachse

ist auszuwählen, wenn es es sich nicht um eine Linear-, sondern um eine Drehachse
handelt. Diese Angabe wird vom Interpolator der Steuerung benötigt, um beim
gemeinsamen Verfahren von Linear-und Rundachsen die Geschwindigkeitsprofile nach
Achstypen getrennt berechnen zu können.

max. Geschwindigkeit

ist die maximale Verfahrgeschwindigkeit der Achse. Unabhängig von anderen


Parametern und von Geschwindigkeitsangaben in NC-Programmen wird die
Verfahrgeschwindigkeit immer auf diese Maximalgeschwindigkeit begrenzt.

Eilgang Handbetrieb
Eilgang Automatikbetrieb
Eilgang Programmtestlauf

geben die Eilganggeschwindigkeit (bei G0) für die verschiedenen Betriebsarten der CNC
an. Wird mehr als eine Achse gleichzeitig verfahren, erfolgt eine Begrenzung der
Eilganggeschwindigkeit auf die kleinste für eine der beteiligten Achsen angegebene
Eilganggeschwindigkeit.

7
Teilweg

ist ein Wegabschnitt, der zur Positionsmessung bzw. zur Schrittsignalerzeugung (bei
Schrittmotorantrieben) in eine bestimmte Anzahl von Schritten (des Messsystems bzw.
des Schrittmotors) unterteilt ist. Bei Linearachsen mit Gewindespindel wird hier der einer
Umdrehung des Messystems (bzw. des Schrittmotors) entsprechende Weg angegeben
(üblicherweise gleich der Spindelsteigung); bei Rundachsen wird, abhängig von der
Getriebeübersetzung, der einer Umdrehung des Messystems bzw. Motors
entsprechende Winkel angegeben.

Schritte/Teilweg

gibt an, wieviel Schrittimpulse das Wegmeßsystem je Teilweg zählt bzw. wieviel
Schrittimpulse der Schrittmotorantrieb je Teilweg benötigt. Bei Wegmeßsystemen
(Encoder oder Glasmaßstäbe) ist zu berücksichtigen, dass die Decodierung der
Messdaten über einen Quadraturdecoder erfolgt und dadurch die anzugebende
Schrittanzahl dem Vierfachen der Strichanzahl des Meßsystems entspricht.

Richtung invertiert

kehrt die Verfahrrichtung der Achse um.

Sollwert invertiert

kann verwendet werden, um die Polarität des analogen Drehzahlsollwerts bzw. den
Zustand des Richtungsausgangs zu invertieren.

KP
KI
KD

stellen die Verstärkungsfaktoren für den PID-Lageregler dar. KP ist der


Proportionalanteil, KI der Integralanteil und KD der Differentialanteil. Bei Servo- oder
Schrittmotorantrieben mit Wegmessystem sind diese Parameter sehr genau auf die
mechanischen Eigenschaften der jeweiligen Maschine abzustimmen ("Tuning"); hierzu
steht die PLC-Funktion AxTune zur Verfügung. Bei Schrittmotorantrieben ohne
Wegmeßsystem ist die Parametrierung einfacher: Bei KI und KD wird 0 eingegeben und
für KP wird experimentell der kleinste Wert ermittelt, bei dem der Antrieb bei einer
Verfahrbewegung noch sicher seine Zielposition erreicht.

max. I

dient der Begrenzung des integrierten (laufend aufsummierten) Schleppfehlers, dessen


Wert mit KI multipliziert den Integralanteil des Lagereglers darstellt. Die Angabe erfolgt
in Encoderschritten; die zugrundeliegende Integratorzeitkonstante beträgt 512 µs.

8
max. Schrittfrequenz

gibt bei Verwendung des analogen Sollwertausgangs die bei Maximaldrehzahl des
Motors (d.h. bei maximalem Drehzahlsollwert) vom Wegmeßsystem gezählte
Schrittfrequenz an (in kHz). Bei Schrittmotorantrieben ist hier die am
Schrittimpulsausgang der Achsbaugruppe bei Maximaldrehzahl des Motors
auszugebende Schrittfrequenz anzugeben. Der Maximalwert beträgt 4.000 kHz.

max. Schleppfehler

ist der maximal zulässige Schleppfehler der Achse. Eine Überschreitung führt zur
Abschaltung aller Achsantriebe und Ausgabe einer entsprechenden Fehlermeldung.
Multipliziert man den hier angegebenen Wert mit Schritte/Teilweg, darf das Ergebnis
maximal 32767 betragen.

max. Beschleunigung

ist die höchstzulässige Beschleunigung (bzw. Verzögerung) der Achse. Dieser


Parameter bestimmt die Steigung der Beschleunigungs- und Bremsrampen.

Grenzwinkel

ist der Winkel zwischen zwei Geradensegmenten einer im NC-Programm


programmierten Bahn, unterhalb dessen kein Abbremsen auf Null und erneutes
Beschleunigen erfolgt. Solange der Grenzwinkel nicht überschritten ist, werden alle
Segmente einer solchen Bahn mit konstanter Geschwindigkeit durchfahren.
Empfehlenswert ist die Angabe eines Winkels von 10°.

Kreistoleranz

gibt die maximale Abweichung der Endpunkte der vom CNC-Interpolator aus
Kreisbögen (G2/G3) erzeugten Geradensegmente vom ursprünglichen Kreisbogen an.
Diese Toleranz sollte ungefähr der Größenordnung der Auflösung der Achse
entsprechen (z.B. 0,001 mm).

Eingang 1 invertiert
Eingang 2 invertiert
Alarmeingang 1 invertiert

ermöglicht es, den Schaltzustand der drei Eingänge der Achsbaugruppe zu invertieren.
Im Normalzustand sind diese Eingänge aktiv (Spannung anliegend), wenn der Schalter
nicht betätigt ist bzw. kein Alarm ansteht; bei Invertierung muß Spannung anliegen,
wenn der Schalter betätigt ist bzw. ein Alarm ansteht.

Verzögerung Alarm

gibt an, wieviele Millisekunden zwischen Aktivierung der Reglerfreigabe und Aktivierung
des Alarmeingangs vergehen sollen.

9
Ausgang Reglerfreigabe

gibt (wenn ungleich Null) die ID eines Digitalausgangs (auf einer Digital-
Ein-/Ausgabebaugruppe) an, der zusätzlich zu dem auf der Achsbaugruppe befindlichen
Schaltausgang für die Reglerfreigabe verwendet werden soll. Hier kann auch bei
mehreren Achsen dieselbe ID angegeben werden, wenn für die Reglerfreigabe der
dazugehörigen Achsantriebe eine gemeinsame Leitung verwendet wird.

Ausgang Bremse

gibt (wenn ungleich Null) die ID eines Digitalausgangs (auf einer Digital-
Ein-/Ausgabebaugruppe) an, der zum Lösen der Bremse der Achse dient.

Verzögerung Bremse

gibt an, wieviele Millisekunden nach Aktivierung der Reglerfreigabe bis zum Lösen der
Bremse bzw. nach dem Aktivieren der Bremse bis zur Ausschaltung der Reglerfreigabe
gewartet werden soll.

Gantry

ordnet der Achsbaugruppe eine zweite Achsbaugruppe zu, mit der zusammen ein
Gantry-Antrieb gebildet wird. Für die zweite Baugruppe werden keine Parameter
angegeben; diese werden identisch von der ersten Baugruppe übernommen.

10
1.3 [Spindle]
Diese Sections enthalten die Parameter zur Konfiguration der Hauptspindelbaugruppen:

[Spindle_<ID>] 1...15
MaxSpeed<Getriebestufe>=<max. Drehzahl> > 0 1/min
Encoder=<Encodereingang> 0|1
Quadrature=<Quadratursignal> 0|1
Index=<Indexmarke> 0|1
StepsPerRevolution=<Schritte/Umdrehung> >0
MaxSyncSpeed=<max. Drehzahl G33> > 0 1/min
InvertDirection=<Richtung invertiert> 0|1
InvertCommand=<Sollwert invertiert> 0|1
InvertInput1=<Eingang 1 invertiert> 0|1
InvertInput2=<Eingang 2 invertiert> 0|1
InvertAlarm=<Alarmeingang invertiert> 0|1
AlarmDelay=<Verzögerung Alarm> >= 0 ms

ID

ist die eindeutige Nummer der Hauptspindel (1 = erste Spindelbaugruppe nach


Busbaugruppe, 2 = zweite Spindelbaugruppe usw.).

Getriebestufe
max. Drehzahl

ist die höchste Solldrehzahl der jeweiligen Getriebestufe; bei dieser Drehzahl wird am
Sollwertausgang 10 V ausgegeben.

Encodereingang

gibt an, ob ein Encoder angeschlossen ist.

Quadratursignal

ermöglicht die Auswertung eines vom Encoder gelieferten Quadratursignals mit


vierfacher Auflösung. Wenn diese Option nicht ausgewählt ist, werden der Encoderkanal
A als Schrittimpulseingang und der Kanal B als Richtungssignaleingang verwendet.

Indexmarke

gibt an, ob der Indexkanal des Encoder angeschlossen ist.

Schritte/Umdrehung

gibt an, wieviel Schrittimpulse der Encoder je Spindelumdrehung zählt. Ist die Option
Quadratursignal ausgewählt, ist zu berücksichtigen, dass die Decodierung der
Messdaten über einen Quadraturdecoder erfolgt und dadurch die anzugebende
Schrittanzahl dem Vierfachen der Strichanzahl des Encoders entspricht.

11
max. Drehzahl G33

Werden die Schrittimpulse des Encoders zum synchronen Verfahren der Achsantriebe
verwendet (G33), ist die Übertragung der Synchronimpulse auf eine Taktrate von 125
kHz begrenzt. Bei hohen Encoderauflösungen wird daher der Encodertakt durch einen
intern errechneten Wert geteilt, der sich an der max. verwendeten Drehzahl orientiert,
die hier anzugeben ist. Beispiel: Bei Schritte/Umdrehung = 10000 können die
Encoderimpulse 1:1 nur bis maximal 750/min als Synchrontakt übertragen werden; gibt
man nun unter max. Drehzahl G33 einen Wert von 1500/min an, wird der Encodertakt
durch 2 geteilt, damit diese Drehzahl erreichbar ist.

Richtung invertiert

kehrt die Zählrichtung des Encoders um.

Sollwert invertiert

kann verwendet werden, um die Polarität des analogen Drehzahlsollwerts zu invertieren.

Eingang 1 invertiert
Eingang 2 invertiert
Alarmeingang 1 invertiert

ermöglicht es, den Schaltzustand der drei Eingänge der Hauptspindelbaugruppe zu


invertieren. Im Normalzustand sind diese Eingänge aktiv (Spannung anliegend), wenn
der Schalter nicht betätigt ist bzw. kein Alarm ansteht; bei Invertierung muß Spannung
anliegen, wenn der Schalter betätigt ist bzw. ein Alarm ansteht.

Verzögerung Alarm

gibt an, wieviele Millisekunden zwischen Aktivierung der Reglerfreigabe und Aktivierung
des Alarmeingangs vergehen sollen.

12
1.4 [Servo]
Diese Sections enthalten die Parameter zur Konfiguration der PWM-Ausgänge der
Servobaugruppen:

[Servo_<ID>]
MinPWM=<min. Pulsweite> µs
MaxPWM=<max. Pulsweite> µs
MinPos=<min. Position> °
MaxPos=<max. Position> °
HomePos=<Grundstellung> °

ID

ist die eindeutige Nummer des PWM-Ausgangs und setzt sich zusammen aus Nummer
der Servobaugruppe (1 = erste Servobaugruppe nach Busbaugruppe, 2 = zweite
Servobaugruppe usw.) * 10 + Nummer des Ausgangs der Baugruppe (1 bis 4).

min. Pulsweite
max. Pulsweite

gibt die dem Verfahrweg des Servos entsprechende minimale und maximale Länge des
PWM-Impulses an (in µs).

min. Position
max. Position

gibt den Verfahrweg des Servos in Winkelgraden an.

Grundstellung

gibt die Grundstellung des Servos in Winkelgraden an.

13
1.5 [ModbusTCP]
Diese Section enthält die IP-Adressen von bis zu 9 Modbus-TCP-Geräten:

[ModbusTCP]
IP<ID>=<IP-Adresse>
...
IP<ID>=<IP-Adresse>

ID

ist die eindeutige Nummer des Gerätes (1 = erstes Gerät, 2 = zweites Gerät usw.).

14
2 PLC-Programme
Die Syntax der PLC-Programme ist an die der Programmiersprache „C“ angelehnt und
enthält folgende Sprachelemente:

• Deklarationen
• Anweisungen
• Ausdrücke
• integrierte Funktionen

Deklarationen beschreiben die in einem PLC-Programm implementierten Funktionen


und die Daten, auf die sie zugreifen. Diese Funktionen enthalten ihrerseits Anweisungen
zur Steuerung des Programmablaufs und Ausdrücke zur Berechnung und Verarbeitung
von Daten. Durch Aufruf von integrierten Funktionen kann ein PLC-Programm mit der
Steuerungshardware und der CNC-Software kommunizieren.

15
2.1 Deklarationen
Ein PLC-Programm besteht aus folgenden Deklarationen:

• Variablen
• Konstanten
• Funktionen
Am Anfang des Programms werden zunächst die Konstanten und Variablen deklariert.
Darauf folgen die Deklarationen der benötigten Funktionen. Ruft eine Funktion eine
andere Funktion auf, so muss diese vorher deklariert worden sein. Daher werden die am
tiefsten verschachtelten Funktionen am Anfang des Programms deklariert und die
Funktion main am Ende des Programms. Eine Funktion mit diesem Namen muss
vorhanden sein, da bei ihrer ersten Anweisung die Programmausführung beginnt.

Mit der Anweisung #include kann der Inhalt einer anderen Quelltextdatei in den
aktuellen Quelltext eingebunden werden. So ist es möglich, häufig verwendete Source-
Abschnitte in eigenen Dateien zu speichern und in neue Programme bei Bedarf
einzubinden. Nach der #include-Anweisung folgt eine String-Konstante mit dem
Dateinamen der einzubindenden Quelltextdatei.

Kommentare in einem Programm beginnen entweder mit /* und enden mit */ (sie
können sich dann über mehrere Zeilen erstrecken) oder sie beginnen mit // und enden
am Zeilenende.

16
2.1.1 Variablen
Es wird zwischen globalen und lokalen Variablen unterschieden. Globale Variablen
werden vor der ersten Funktion deklariert, lokale Variablen innerhalb einer Funktion.
Eine globale Variable ist von allen Funktionen aus sichtbar, eine lokale Variable nur
innerhalb der Funktion, in der sie deklariert wurde. Daher dürfen in zwei verschiedenen
Funktionen die lokalen Variablen identische Namen haben. Für lokale Variablen wird
beim Eintritt in die Funktion kein neuer Speicher reserviert, sondern sie haben eine
statische Speicheradresse und können daher bei rekursivem Aufruf derselben Funktion
überschrieben werden.

Variablen werden deklariert, indem ihr Typ, ihr Name und ihr Initialisierungswert
angegeben werden. Bei Array-Variablen wird zusätzlich die Anzahl der Elemente
angegeben.

Als Typen stehen char für 8-Bit-Variablen und int für 32-Bit-Variablen zur Verfügung.
char- und int-Variablen sind zuweisungskompatibel und werden automatisch
konvertiert. Ein Datenverlust bei der Zuweisung von int nach char wird nicht
abgefangen.

Der Name einer Variable muss mit einem Buchstaben oder einem Unterstrich beginnen
und darf nicht identisch mit dem Namen einer anderen Variablen (die auch global oder
lokal zu derselben Funktion ist), einer Konstanten, einer Funktion oder einem
Schlüsselwort sein.
Eine Array-Variable enthält mehrere Elemente, auf die einzeln zugegriffen werden kann.
Die Anzahl der Elemente wird bei der Deklaration direkt nach ihrem Namen angegeben,
eingeschlossen in eckige Klammern. Beim späteren Zugriff auf eine solche Variable
muss der Index in eckigen Klammern nach dem Variablennamen angegeben werden
(als beliebiger Ausdruck). Der kleinste zulässige Index ist Null, der größte die deklarierte
Länge minus Eins (Bereichsüberschreitungen werden nicht geprüft).

Mit einem Stern vor dem Variablennamen kann ein Zeiger (Pointer) deklariert werden.
Zeiger belegen immer 32 Bit Speicherplatz. Sie sind zuweisungskompatibel zu allen
anderen Typen. Dereferenziert wird eine Zeigervariable, indem bei ihrer Verwendung
ebenfalls ein Stern vorangestellt wird oder indem ihr, eingeschlossen in eckige
Klammern, ein Index folgt. Eine Array-Variable, die ohne Index in eckigen Klammern
benutzt wird, wirkt wie ein Zeiger auf das erste Element des Arrays.

Optional kann mit dem Zeichen "=" ein Initialisierungswert angegeben werden. Nach
dem Zeichen wird eine Konstante erwartet. Dieses ist bei Arrays entweder eine String-
Konstante oder eine Aufzählung der einzelnen Werte, eingeschlossen in geschweifte
Klammern und getrennt mit Kommazeichen. Werden weniger Zeichen bzw. Werte als
die deklarierte Elementanzahl angegeben, werden die restlichen Elemente mit Null
initialisiert. Die Initialisierung der globalen Variablen erfolgt einmal am Programmanfang;
lokale Variablen werden bei jedem Eintritt in die Funktion erneut initialisiert.

Wird auf eine lokale Variable, für die ein Initialisierungswert angegeben ist, nur lesend
zugegriffen, ist eine erneute Initialisierung bei jedem Aufruf der Funktion nicht
erforderlich. Bei der Deklaration solcher Variablen kann dem Typ ein const
vorangestellt werden.

Sollen mehrere Variablen desselben Typs deklariert werden, können deren Namen und
evtl. Initialisierungswerte jeweils mit einem Komma den vorhergehenden angehängt
werden. Eine Deklaration wird mit einem Semikolon beendet.

17
2.1.2 Konstanten
Konstante Werte können als Zeichenkonstanten angegeben werden (eingeschlossen in
einfache Anführungszeichen), als Integerkonstanten (numerische Werte) oder als
Stringkonstanten (eingeschlossen in doppelte Anführungszeichen).

Mit einem Backslash können bei Zeichenkonstanten numerische oder hexadezimale


Werte (wie bei Integerkonstanten) angegeben werden.

In Zeichen- oder Stringkonstanten steht außerdem "\r" für "Return" (ASCII 13), "\n" für
"New Line" (ASCII 10) und "\t" für "Tab" (ASCII 8).

Integerkonstanten, die mit 0x oder 0X beginnen, sind hexadezimale Werte. Steht einer
Integerkonstante ein Minuszeichen voran, wird der Wert negiert.

Mit dem Schlüsselwort #define kann einer Konstanten ein Name zugeordnet werden.
Bei jedem Auftreten dieses Namens wird die entsprechende Konstante verwendet. Nach
#define dürfen keine zusammengesetzten Ausdrücke stehen.

Wie eine Konstante verhält sich außerdem sizeof. Nach sizeof kann eine Variable
angegeben werden (eingeschlossen in runde Klammern) und es wird dann die Größe
des Speicherplatzes dieser Variable in Bytes zurückgeliefert.

18
2.1.3 Funktionen
Eine Funktion wird deklariert, indem man den Typ ihres Rückgabewertes angibt (oder
void, wenn kein Wert zurückgegeben wird), danach den Namen der Funktion und
schließlich die Parameterliste, eingeschlossen in runde Klammern. Werden keine
Parameter übergeben, kann man () oder (void) nach dem Funktionsnamen angeben.

Die Parameterliste besteht für jeden Parameter aus dem Typ (char oder int) und
einem Namen für den Parameter. Mehrere Parameter werden jeweils durch ein Komma
getrennt.

Funktionsparameter werden vom Compiler wie Variablen angelegt, deren Inhalt vor dem
Aufruf der Funktion gefüllt wird. Innerhalb einer Funktion können sie wie lokale Variablen
genutzt werden. Wie bei lokalen Variablen gilt auch für die Parameter, dass sie bei
rekursivem Eintritt in die Funktion überschrieben werden, da die PLC nicht über einen
Stapelspeicher (Stack) für lokale Variablen und Parameter verfügt.

Nach der Parameterliste folgt eine geschweifte Klammer, anschließend können lokale
Variablen deklariert werden, dann folgen die einzelnen Anweisungen und schließlich
wieder eine geschweifte Klammer.

19
2.2 Anweisungen
Folgende Arten von Anweisungen werden unterschieden:

• Zuweisungen
• Funktionsaufrufe
• Kontrollanweisungen

20
2.2.1 Zuweisungen
Zuweisungen bestehen aus einem Variablennamen, einem Zuweisungsoperator, einem
Ausdruck und einem Semikolon. Ist die Variable als Array deklariert, muss der Array-
Index in Form eines entsprechenden Ausdrucks in eckigen Klammern hinter dem
Variablennamen angegeben werden.

Der Zuweisungsoperator "=" speichert das Ergebnis des nachfolgenden Ausdrucks in


die davor stehende Variable. Ihm kann einer der folgenden Operatoren vorangestellt
werden:

+ - << >> * / % & | ^

In diesem Falle wird die entsprechende Operation zwischen der Variable und dem
Ergebnis des Ausdrucks vor der Zuweisung vorgenommen. So entspricht z.B. a+=1 der
Anweisung a=a+1. Eine besondere Form stellen die Operatoren "++" und "--" dar, mit
denen der Inhalt einer Variable um 1 erhöht oder erniedrigt werden kann. Diese
Operatoren können nicht in Ausdrücken verwendet werden.

21
2.2.2 Funktionsaufrufe
Eine Funktion wird aufgerufen, indem ihr Name angegeben wird, gefolgt von den als
Parameter zu übergebenden Ausdrücken (eingeschlossen in runde Klammern, getrennt
durch Kommazeichen). Funktionen ohne Parameter werden aufgerufen, indem ihrem
Namen () folgt.

Neben den im Programm deklarierten Funktionen stehen integrierte Funktionen zur


Verfügung, die in der gleichen Art und Weise aufgerufen werden können.

22
2.2.3 Kontrollanweisungen
Folgende Kontrollanweisungen dienen der Kontrolle des Programmablaufs:

if (<Bedingung>) <Block>;

if (<Bedingung>) <Block> else <Block>;

while (<Bedingung>) <Block>;

do <Block> while (<Bedingung>);

for (<Anweisung>; <Bedingung>; <Anweisung>) <Block>;

switch (<Ausdruck>)
{
case <Konstante>: <Block>;
case <Konstante>: <Block>;
...
default: <Block>;
};

break;

continue;

return;

return <Ausdruck>;

Ein Block ist entweder eine einzelne Anweisung (ohne nachfolgendes Semikolon) oder
eine Folge von Anweisungen (eingeschlossen in geschweifte Klammern). Der Block
kann auch leer sein bzw. fehlen. Eine Bedingung ist ein beliebiger Ausdruck. Wenn er
einen Wert ungleich Null liefert, ist die Bedingung erfüllt.

if wertet diesen Ausdruck aus und führt den nachstehenden Block nur aus, wenn die
Bedingung erfüllt ist. Folgt ein else, wird der darauf folgende Block ausgeführt, wenn
die Bedingung nicht erfüllt ist.

while führt den Block solange wiederholt aus, wie die Bedingung erfüllt ist. Die
Auswertung und Prüfung der Bedingung erfolgt vor der Ausführung des Blocks.

do führt den Block ebenfalls solange aus, wie die Bedingung erfüllt ist, jedoch wird sie
nach Ausführung des Blocks ausgewertet und geprüft (der Block wird also mindestens
einmal durchlaufen).

for führt zunächst einmal die erste angegebene Anweisung aus und prüft dann die
Bedingung. Ist sie erfüllt, werden erst der Block und dann die zweite angegebene
Anweisung ausgeführt, und zwar solange wiederholt, wie die Bedingung erfüllt ist.

23
switch beginnt abhängig vom Wert des Ausdrucks mit der Ausführung der nach dem
entsprechenden case stehenden Anweisungen und setzt die Ausführung bis zum
Auftreten eines break bzw. bis zum Ende der switch-Anweisung fort. Ist kein zum
Wert des Ausdrucks passendes case vorhanden, werden die nach default stehenden
Anweisungen ausgeführt.

break setzt die Ausführung mit der der aktuellen while-, do-, for- oder switch-
Anweisung folgenden Anweisung fort.

continue bricht die Ausführung des Blocks der aktuellen while-, do- oder for-
Anweisung ab und fährt mit dem nächsten Schleifendurchlauf fort.

return verläßt die Funktion. Liefert die Funktion einen Wert zurück, kann ein
entsprechender Ausdruck dem return nachgestellt werden.

24
2.3 Ausdrücke
Die einfachste Form eines Ausdrucks ist eine einzelne Konstante, eine einzelne Variable
oder ein Funktionsaufruf. In diesem Falle liefert der Ausdruck den Wert der Konstanten
oder den Inhalt der Variablen bzw. den Rückgabewert der Funktion. Bei Array-Variablen
muss in eckigen Klammern ein Ausdruck für den Index angegeben werden.

Für zusammengesetzte Ausdrücke können Operatoren verwendet werden. Dabei wird


zwischen unären Operatoren (vor einem Operanden) und binären Operatoren (zwischen
zwei Operanden) unterschieden. Operand kann wiederum ein beliebiger Ausdruck sein.
Die Reihenfolge der Auswertung kann mit runden Klammern gesteuert werden.

Folgende binäre Operatoren stehen zur Verfügung:

+ Addition
- Subtraktion
* Multiplikation
/ Division
% Divisionsrest
& bitweises AND
| bitweises OR
^ bitweises XOR
<< bitweises Verschieben nach links
>> bitweises Verschieben nach rechts
&& logisches Und
|| logisches Oder
= gleich
!= ungleich
< kleiner
<= kleiner oder gleich
> größer
>= größer oder gleich

Folgende unäre Operatoren können verwendet werden:

& Adresse einer Variablen


- Negieren
~ bitweises NOT
! logisches Nicht

Wenn die Reihenfolge der Operationen nicht durch Klammerebenen bestimmt ist, gelten
folgende Vorrangregeln (die Operationen der höchsten Stufe werden zuerst ausgeführt):

1. && || <= >= < >


2. == !=
3. + - << >>
4. * / % & | ^
5. - ! ~ (unäre Operatoren)
6. &

25
2.4 Integrierte Funktionen
Für die Kommunikation mit der CNC, den Zugriff auf Hardwarebaugruppen sowie für
diverse weitere Zwecke steht eine Reihe von integrierten Funktionen zur Verfügung.
Diese Funktionen werden genauso aufgerufen wie im Programm deklarierte Funktionen.
Die Namen dieser Funktionen sind reservierte Wörter, die nicht bei der Deklaration von
Konstanten, Variablen oder Funktionen verwendet werden dürfen.

Folgende integrierte Funktionen sind verfügbar:

• Arithmetische Funktionen
• Systemfunktionen
• Zugriff auf Ein-Ausgabebaugruppen
• Zugriff auf Achsbaugruppen
• Zugriff auf Hauptspindelbaugruppen
• Zugriff auf Busbaugruppe
• Zugriff auf Bedienfeld

26
2.4.1 Arithmetische Funktionen
int min(int Value1, int Value2)

gibt den kleineren der beiden Werte <Value1> und <Value2> zurück.

int max(int Value1, int Value2)

gibt den größeren der beiden Werte <Value1> und <Value2> zurück.

int abs(int Value)

gibt den Absolutwert von <Value> zurück.

int sqrt(int Value)

gibt die Quadratwurzel von <Value> zurück.

27
2.4.2 Steuerung des Programmablaufs
int PgRequest(int ID, int *Param1, int *Param2)

gibt 1 zurück, wenn die Anforderung <ID> der CNC zu verarbeiten ist. In diesem Falle
werden in <Param1> und <Param2> zwei Parameterwerte zu der anstehenden
Anforderung geliefert, die Anforderung muss danach verarbeitet und mit der Funktion
PgResponse quittiert werden.

Der erste Aufruf der Funktion PgRequest definiert gleichzeitig den entsprechenden M-
Code ("M<RequestId>") als gültig für die Verwendung in einem NC-Programm.

void PgResponse(int ID, int Result)

quittiert die Verarbeitung der Anforderung <ID> und gibt einen Rückgabewert <Result>
an die CNC bzw. das parallel laufende PLC-Programm zurück. Wurde die Anforderung
korrekt verarbeitet, muss <Result> einen Wert ungleich 0 haben. Andernfalls ist 0 als
<Result> zu übergeben.

int PgExecute(int ID, int Param1, int Param2)

veranlaßt die Verarbeitung der Anforderung <ID> mit den Parameterwerten <Param1>
und <Param2> durch ein anderes, parallel laufendes PLC-Programm.

void PgWait(int Time)

hält die Programmausführung für eine Zeitspanne von <Time> Millisekunden an.

void PgStore(char *Section, char *Key, int Value)

speichert den Wert <Value> unter dem Schlüsselbegriff <Key> im Abschnitt <Section>
der Datei "[Link]".

int PgLoad(char *Section, char *Key)

gibt den unter dem Schlüsselbegriff <Key> im Abschnitt <Section> der Datei "[Link]"
gespeicherten Wert zurück. Existiert der Eintrag nicht, wird 0 zurückgegeben.

28
2.4.3 Zugriff auf Benutzerschnittstelle
void UiInfo(char *Text, int Value)

zeigt eine Informationsmeldung <Text> auf dem CNC-Bildschirm an. Diese kann
Formatanweisungen zur Ausgabe des Wertes <Value> enthalten. Wird als <Text> ein
Leerstring übergeben, wird die zuletzt angezeigte Informationsmeldung wieder vom
Bildschirm gelöscht, wenn nicht zwischenzeitlich eine Fehlermeldung ausgegeben
wurde.

void UiValue(char *Text, int Value)

zeigt einen Wert <Text> auf dem CNC-Bildschirm an. Der Text kann
Formatanweisungen zur Ausgabe des Wertes <Value> enthalten. Wird als <Text> ein
Leerstring übergeben, wird der zuletzt angezeigte Wert wieder vom Bildschirm gelöscht.

void UiError(char *Text, int Value)

zeigt eine Fehlermeldung <Text> auf dem CNC-Bildschirm an. Diese kann
Formatanweisungen zur Ausgabe des Wertes <Value> enthalten.

29
2.4.4 Zugriff auf Digital-Ein-/Ausgabebaugruppen
int DgGetDI(int ID)

gibt den Zustand (0 oder 1) des Digitaleingangs <ID> zurück. Ist <ID>%100 Null, wird
der Zustand (Bitmuster) aller Digitaleingänge der Baugruppe geliefert.

int DgWaitDI(int ID, int Value, int Time)

wartet maximal <Time> Millisekunden, bis der Digitaleingang <ID> den Zustand <Value>
hat und gibt 1 zurück, wenn der erwartete Zustand eingetreten ist; andernfalls wird 0
zurückgegeben. Ist <ID>%100 Null, wird auf den Zustand (Bitmuster <Value>) aller
Digitaleingänge der Baugruppe gewartet.

void DgSetDO(int ID, int Value)

schaltet den Digitalausgang <ID> ein (<Value> = 1) oder aus (<Value> = 0). Ist <ID>
%100 Null, wird der Zustand aller Digitalausgänge der Baugruppe entsprechend des
Bitmusters <Value> gesetzt.

int DgGetDO(int ID)

gibt den Schaltzustand (0 oder 1) des Digitalausgangs <ID> zurück. Ist <ID>%100 Null,
wird der Zustand (Bitmuster) aller Digitalausgänge der Baugruppe geliefert.

void DgFlipDO(int ID)

schaltet den Digitalausgang <ID> um ("Ein" statt "Aus" bzw. "Aus" statt "Ein"). Ist <ID>
%100 Null, wird der Zustand aller Digitalausgänge der Baugruppe umgeschaltet.

void DgPulseDO(int ID, int Time)

schaltet den Digitalausgang <ID> für <Time> Millisekunden ein und dann wieder aus. Ist
<ID>%100 Null, werden alle Digitalausgänge der Baugruppe ein- und wieder
ausgeschaltet.

void DgClearCount(int ID)

setzt den dem Digitaleingang <ID> zugeordneten Ereigniszähler auf 0 zurück. Ist <ID>
%100 Null, werden alle Ereigniszähler der Baugruppe zurückgesetzt.

int DgGetCount(int ID)

gibt den Zählerstand des dem Digitaleingang <ID> zugeordneten Ereigniszählers


zurück. Ist <ID>%100 Null, wird 0 zurückgegeben.

30
int DgWaitCount(int ID, int Value, int Time)

wartet maximal <Time> Millisekunden, bis der dem Digitaleingang <ID> zugeordnete
Ereigniszähler den Zählerstand <Value> erreicht hat und gibt 1 zurück, wenn der
erwartete Zählerstand erreicht wurde; andernfalls wird 0 zurückgegeben.

int DgGetEvent(int ID)

gibt 1 zurück, wenn seit dem letzten Aufruf von DgGetEvent oder DgWaitEvent die
Ereigniserkennung des Digitaleingangs <ID> ausgelöst wurde; andernfalls wird 0
zurückgegeben. Ist <ID>%100 Null, wird 0 zurückgegeben.

int DgWaitEvent(int ID, int Time)

wartet maximal <Time> Millisekunden, bis die dem Digitaleingang <ID> zugeordnete
Ereigniserkennung ausgelöst wird. Wird in der angegebenen Zeit ein Ereignis ausgelöst,
wird 1 zurückgegeben, andernfalls 0.

31
2.4.5 Zugriff auf Analog-Ein-/Ausgabebaugruppen
int AnGetAI(int ID)

gibt die Spannung (in mV) des Analogeingangs <ID> zurück.

void AnSetAO(int ID, int Voltage)

gibt am Analogausgang <ID> die Spannung <Voltage> (in mV) aus. Ist <ID>%100 Null,
wird an allen Analogausgängen der Baugruppe die Spannung <Voltage> ausgegeben.

int AnGetAO(int ID)

gibt die Spannung (in mV) am Analogausgang <ID> zurück.

32
2.4.6 Zugriff auf Achsbaugruppen
int AxGetDI(int ID, int Input)

gibt den Schaltzustand des Digitaleingangs <Input> (1 = MI1, 2 = MI2, 3 = MAL) der
Achsbaugruppe <ID> zurück. Ist <Input> Null, wird der Zustand (Bitmuster) aller
Digitaleingänge der Baugruppe geliefert.

int AxWaitDI(int ID, int Input, int Value, int Time)

wartet maximal <Time> Millisekunden, bis der Digitaleingang <Input> (1 = MI1, 2 = MI2,
3 = MAL) der Achsbaugruppe <ID> den Zustand <Value> hat und gibt 1 zurück, wenn
der erwartete Zustand eingetreten ist; andernfalls wird 0 zurückgegeben. Ist <Input>
Null, wird auf den Zustand (Bitmuster <Value>) aller Digitaleingänge der Baugruppe
gewartet.

void AxSetDO(int ID, int Output, int Value)

schaltet den Digitalausgang <Output> (1 = MO1, 2 = MO2, 3 = MEN) der


Achsbaugruppe<ID> ein (<Value> = 1) oder aus (<Value> = 0). Ist <Output> Null, wird
der Zustand aller Digitalausgänge der Baugruppe entsprechend des Bitmusters <Value>
gesetzt.

int AxGetDO(int ID, int Output)

gibt den Schaltzustand (0 oder 1) des Digitalausgangs <Output> (1 = MO1, 2 = MO2, 3


= MEN) der Achsbaugruppe <ID> zurück. Ist <Output> Null, wird der Zustand
(Bitmuster) aller Digitalausgänge der Baugruppe geliefert.

void AxSetAO(int ID, int Voltage)

gibt am Analogausgang der Achsebaugruppe <ID> die Spannung <Voltage> (mV) aus.

int AxGetAO(int ID)

gibt die aktuell am Analogausgang der Achsbaugruppe <ID> ausgegebene Spannung


(mV) zurück.

void AxSetPos(int ID, int Pos)

setzt die aktuelle Position der Achse <ID> auf <Pos>. <Pos> ist in Vielfachen von 0,001
mm bzw. 0,001 ° anzugeben.

int AxGetPos(int ID)

gibt die aktuelle Position der Achse <ID> zurück. Der Positionswert ist ein Vielfaches
von 0,001 mm bzw. 0,001 °. Ist die Servoregelung aktiv, wird die Sollposition geliefert;
andernfalls die Istposition.

33
int AxWaitReady(int ID, int Time)

wartet maximal <Time> Millisekunden, bis der Achsantrieb <ID> betriebs- bzw.
einschaltbereit ist (Alarmeingang inaktiv) und gibt 1 zurück, wenn der erwartete Zustand
eingetreten ist; andernfalls wird 0 zurückgegeben. Bei <ID> = 0, wird gewartet, bis alle
Achsantriebe bereit sind.

int AxMove(int ID, int Relative, int Pos, int Feed, int Input,
int StopAbruptly)

verfährt die Achse <ID> auf die absolute (<Relative> = 0) oder relative (<Relative>
ungleich 0) Position <Pos> mit der Geschwindigkeit <Feed> (mm/min). <Pos> ist in
Vielfachen von 0,001 mm bzw. 0,001 ° anzugeben. Die Achse wird verfahren bis der
Eingang <Input> (1 = MI1, 2 = MI2, 3 = Indexmarke) der Achsbaugruppe seinen Zustand
wechselt. Ist <Input> = 0, wird die komplette Strecke gefahren. Die Funktion gibt 1
zurück, wenn der angegebene Eingang seinen Zustand wechselte bzw. (bei <Limit> = 0)
die komplette Strecke gefahren wurde. Es wird 0 zurückgegeben, wenn bei <Input> = 0
die Zielposition nicht erreicht wurde (Abbruch der Bewegung durch den Bediener oder
Antriebsfehler) oder wenn bei <Input> ungleich 0 der Eingang keine Zustandsänderung
erfuhr. Ist <StopAbruptly> ungleich 0, wird die Verfahrbewegung bei Zustandsänderung
des Eingangs bzw. Erreichen der Indexmarke ohne Bremsrampe abrupt angehalten.

Für eine interpolierte Achse darf die Funktion AxMove nur aufgerufen werden, wenn
eine CNC-Anforderung zu verarbeiten ist; nur für Hilfsachsen darf der Aufruf auch
asynchron zur CNC erfolgen.

void AxHome(int ID, int Pos1, int Pos2, int Here)

setzt die Referenzposition <Pos1> und den Status "Referenzfahrt erfolgt" der Achse
<ID>. Ist <Here> ungleich 0, wird die aktuelle Position zur Referenzposition. Andernfalls
die Position, an der beim vorangegangenen AxMove mit <Input> ungleich 0 der Eingang
seinen Zustand gewechselt hat. Handelt es sich um eine Gantry-Achse, wird die
Referenzposition <Pos2> für den zweiten Antrieb verwendet.

Für eine interpolierte Achse darf die Funktion AxHome nur aufgerufen werden, wenn
eine CNC-Anforderung zu verarbeiten ist; nur für Hilfsachsen darf der Aufruf auch
asynchron zur CNC erfolgen.

int AxGetHomed(int ID)

gibt den Status "Referenzfahrt erfolgt" (0 oder 1) der Achse <ID> zurück. Ist <ID> Null,
wird 1 zurückgegeben, wenn für alle Hauptachsen die Referenzfahrt erfolgt ist.

34
int AxMovePos(int ID1, int Pos1, int ID2, int Pos2, int ID3, int
Pos3, int Feed)

führt eine Verfahrbewegung von bis zu drei Achsen <ID1> bis <ID2> auf die Positionen
<Pos1> bis <Pos3> mit der Geschwindigkeit <Feed> (mm/min) durch. Für weniger als
drei zu verfahrende Achsen kann für <ID1>, <ID2> oder <ID3> 0 übergeben werden.
Werden die Positionen erreicht, wird 1 zurückgegeben; bei Nichterreichen der
Positionen (Abbruch der Bewegung durch den Bediener oder Antriebsfehler) wird 0
zurückgegeben.

Für interpolierte Achsen darf die Funktion AxMovePos nur aufgerufen werden, wenn
eine CNC-Anforderung zu verarbeiten ist; nur wenn es sich bei allen beteiligten Achsen
um Hilfsachsen handelt, darf der Aufruf auch asynchron zur CNC erfolgen.

int AxTune(int ID)

führt ein automatisches Servo-Tuning der Achse <ID> durch und liefert den ermittelten
KP-Wert zurück. Die Achse wird dabei ausgehend von der aktuellen Position um 0,1 mm
hin- und her verfahren.

35
2.4.7 Zugriff auf Hauptspindelbaugruppen
int SpGetDI(int ID, int Input)

gibt den Schaltzustand des Digitaleingangs <Input> (1 = MI1, 2 = MI2, 3 = MAL) der
Hauptspindelbaugruppe <ID> zurück. Ist <Input> Null, wird der Zustand (Bitmuster) aller
Digitaleingänge der Baugruppe geliefert.

int SpWaitDI(int ID, int Input, int Value, int Time)

wartet maximal <Time> Millisekunden, bis der Digitaleingang <Input> (1 = MI1, 2 = MI2,
3 = MAL) der Hauptspindelbaugruppe <ID> den Zustand <Value> hat und gibt 1 zurück,
wenn der erwartete Zustand eingetreten ist; andernfalls wird 0 zurückgegeben. Ist
<Input> Null, wird auf den Zustand (Bitmuster <Value>) aller Digitaleingänge der
Baugruppe gewartet.

void SpSetDO(int ID, int Output, int Value)

schaltet den Digitalausgang <Output> (1 = MO1, 2 = MO2, 3 = MEN) der


Hauptspindelbaugruppe <ID> ein (<Value> = 1) oder aus (<Value> = 0). Ist <Output>
Null, wird der Zustand aller Digitalausgänge der Baugruppe entsprechend des
Bitmusters <Value> gesetzt.

int SpGetDO(int ID, int Output)

gibt den Schaltzustand (0 oder 1) des Digitalausgangs <Output> (1 = MO1, 2 = MO2, 3


= MEN) der Hauptspindelbaugruppe <ID> zurück. Ist <Output> Null, wird der Zustand
(Bitmuster) aller Digitalausgänge der Baugruppe geliefert.

void SpSetAO(int ID, int Voltage)

gibt am Analogausgang der Hauptspindelbaugruppe <ID> die Spannung <Voltage>


(mV) aus.

int SpGetAO(int ID)

gibt die aktuell am Analogausgang der Hauptspindelbaugruppe <ID> ausgegebene


Spannung (mV) zurück.

void SpSetPos(int ID, int Pos)

setzt die aktuelle Winkelposition der Hauptspindel <ID> auf <Pos>. Die Position ist in
Vielfachen von 0.001° anzugeben.

int SpGetPos(int ID)

gibt die aktuelle Winkelposition (in Vielfachen von 0.001°) der Hauptspindel <ID> zurück.

36
int SpWaitReady(int ID, int Time)

wartet maximal <Time> Millisekunden, bis der Hauptspindelantrieb <ID> betriebs- bzw.
einschaltbereit ist (Alarmeingang inaktiv) und gibt 1 zurück, wenn der erwartete Zustand
eingetreten ist; andernfalls wird 0 zurückgegeben. Bei <ID> = 0, wird gewartet, bis alle
Hauptspindelantriebe bereit sind.

void SpSetRPM(int ID, int Gear, int Value)

ändert den Drehzahlsollwert der Hauptspindel <ID> auf die der Getriebestufe <Gear>
und dem Drehzahlwert <Value> (0.001/min) entsprechende Spannung. Soll eine
negative Spannung ausgegeben werden, ist für <Value> ein negativer Wert anzugeben.

int SpGetRPM(int ID)

gibt die aktuelle Drehzahl der Hauptspindel <ID> in Vielfachen von 0.001/min zurück. Ist
die Spindel mit einem Encoder ausgestattet, wird die tatsächliche (gemessene)
Drehzahl zurückgegeben und ihr Vorzeichen gibt die Drehrichtung an; andernfalls wird
der zuletzt mit SetSpindleRPM ausgegebene Drehzahlsollwert (mit dem dabei
angegebenen Vorzeichen) zurückgegeben.

37
2.4.8 Zugriff auf Servobaugruppen
void SvSetPos(int ID, int Pos)

fährt den Servo <ID> auf die Position <Pos>. <Pos> ist in Vielfachen von 0,001 °
anzugeben.

int SvGetPos(int ID)

liefert die aktuelle Position des Servos <ID> (in Vielfachen von 0,001 °).

void SvHome(int ID)

fährt den Servo <ID> auf seine Grundstellung.

38
2.4.9 Zugriff auf Modbus-TCP-Geräte
int MbGetIR(int ID, int Adr)

liefert den Wert des Input-Registers mit der Adresse <Adr>.

int MbGetHR(int ID, int Adr)

liefert den Wert des Holding-Registers mit der Adresse <Adr>.

void MbSetHR(int ID, int Adr, int Value)

setzt das Holding-Register mit der Adresse <Adr> auf den Wert <Value>.

Die Funktionen MbGetHR und MbSetHR dienen, aufgerufen mit <ID>=0, auch dem
Zugriff auf die Holding-Register (Adresse 0 bis 65535) eines in der PLC implementierten
Modbus-TCP-Servers. Dieser Server unterstützt die Modbus-Funktion 3 ("read holding
registers"), beschränkt auf ein einzelnes Register, sowie die Modbus-Funktion 6 ("write
single holding register"). Der Modbus-Server ermöglicht die Kommunikation zwischen
der PLC und bis zu (gleichzeitig) 32 externen Geräten bzw. Softwareanwendungen, die
als Modbus-Clients fungieren.

39
2.4.10 Zugriff auf Busbaugruppe
int BuGetAlarm(void)

gibt den Zustand der Alarmeingänge der Busbaugruppe zurück. Sind alle vier Eingänge
aktiv (normaler Betriebszustand), wird 0x00 zurückgegeben. Bit 0 des Rückgabewertes
entspricht Eingang 1 (CA1), Bit 1 Eingang 2 (CA2) usw.

Den Alarmeingängen sind in der CNC folgende Statusmeldungen zugeordnet:

0x01 ALARM STEUERUNG


0x02 ALARM ANTRIEB
0x04 NOT-AUS
0x08 ALARM ENDSCHALTER

int BuGetCEO(void)

gibt den Schaltzustand des Not-Aus-Relais (CEO) der Busbaugruppe zurück. Ist der
Relaiskontakt geöffnet (ALARM STEUERUNG ausgelöst), wird 1 zurückgegeben.

void BuSetCEO(int CEO)

schaltet den Not-Aus-Ausgang (CEO) der Busbaugruppe. Wenn <CEO> ungleich Null
ist, wird ALARM STEUERUNG ausgelöst und das Relais öffnet; bei Null wird der
Relaiskontakt geschlossen (normaler Betriebszustand).

40
2.4.11 Zugriff auf Bedienfeld
int PnSetPot(int Pot, int Percent)

setzt den Prozentwert (aktuelle Stellung des Potentiometers <Pot>, 1 oder 2) des
Bedienfeldes auf den Wert <Percent>.

int PnGetPot(int Pot)

gibt die Stellung des Potentiometers <Pot> (1 oder 2) des Bedienfeldes als Prozentwert
zurück.

int PnSetKey(int Key, int On)

setzt den Schaltzustand (0 oder 1) des Schlüsselschalters <Key> (1 bis 4) des


Bedienfeldes auf den Wert <On>.

int PnGetKey(int Key)

gibt den Schaltzustand (0 oder 1) des Schlüsselschalters <Key> (1 bis 4) des


Bedienfeldes zurück.

41
2.5 Programmablauf
Alle PLC-Programme werden bei der Initialisierung der Steuerungssoftware gestartet
und dann parallel ausgeführt, bis die Steuerungssoftware beendet wird.

Die Kommunikation zwischen der CNC und den PLC-Programmen erfolgt über die
Funktionen PgRequest und PgResponse. Ein PLC-Programm prüft dabei kontinuierlich
durch Aufruf von PgRequest, ob eine von ihm zu verarbeitende Anforderung vorliegt.
Ist dies der Fall, verarbeitet es die Anforderung und antwortet mit PgResponse. Mit der
Funktion PgExecute kann ein PLC-Programm eine Anforderung durch ein anderes
PLC-Programm verarbeiten lassen.

Eine Anforderung der CNC oder eines anderen PLC-Programms muss innerhalb von 2
Sekunden von einem der parallel ablaufenden PLC-Programme durch Aufruf der
Funktion PgRequest entgegengenommen und die entsprechende Anforderung muss
dann innerhalb von 60 Sekunden verarbeitet und mit PgResponse quittiert werden.

42
3 PLC-Anforderungen
Für Maschinenfunktionen, deren Ausführung beim Ablauf von NC-Programmen oder bei
der manuellen Bedienung der Maschine notwendig ist, stellt die CNC entsprechende
Anforderungen an die PLC. Diese führt die Anforderungen aus und meldet die
erfolgreiche Ausführung bzw. etwaige Fehler bei der Ausführung an die CNC zurück.

43
3.1 Schnittstelle CNC/PLC
Folgende Anforderungen können von der CNC an die PLC übermittelt werden:

ID M Funktion Parameter P1 Parameter P2


1 M1 bedingter Halt 0 0
2 M2 Halt 0 0
3 M3 Spindel CW S * 1000 0
4 M4 Spindel CCW S * 1000 0
5 M5 Spindel Aus 0 0
6 M6 Werkzeugwechsel T (0 = Ablegen) Platz-Nr.
7 M7 Kühlmittel Nr. 2 Ein 0 0
8 M8 Kühlmittel Nr. 1 Ein 0 0
9 M9 Kühlmittel Aus 0 0
10 M10 Werkzeug klemmen 0 0
11 M11 Werkzeug lösen 0 0
12 M12 Werkzeug vermessen 0/1 Anfahrt/Freifahrt 0
13 M13 Schneidkopf Aus/Zustellen 0 0
14 M14 Schneidkopf Ein S * 1000 0
15 M15 Schneidkopf Aus/Parken 0 0
16 M16 Extruder entladen 0 0
17 M17 Extruder laden 0 0
19 M19 Spindel richten 0 0
20 M20 Heizung Ein 0 0
21 M21 Heizung Aus 0 0
22 M22 Status abfragen 0 0
23 M23 Extruderheizung Ein S * 1000 0
24 M24 Extruderheizung Ein/Warten S * 1000 0
25 M25 Extruderheizung Aus 0 0
26 M26 Gebläse Ein 0 0
27 M27 Gebläse Aus 0 0
29 M29 Zentralschmierung 0 0
30 M30 Programmende 0 0
40 M40 Getriebe auskuppeln 0 0
41 M41 Getriebestufe 1 0 0
42 M42 Getriebestufe 2 0 0
43 M43 Getriebestufe 3 0 0
44 M44 Getriebestufe 4 0 0
45 M45 Getriebestufe 5 0 0
60 M60 Werkstückwechsel 0 0
61 M61 Werkzeugplatz anfahren T (0 = freier Platz) Platz-Nr.

100 M100 maschinenspezifisch S * 1000 P


...
899 M899

900 Rücksetzen Not-Aus 0 0


901 Maschine Ein/Aus 0/1 Aus/Ein 0
902 Betriebsbereitschaft Ein/Aus 0/1 Aus/Ein 0
903 Automatikbetrieb Ein/Aus 0/1 Aus/Ein 0
904 Referenzfahrt 0/1 Aus/Ein 0
905 Freifahren Ein/Aus 0/1 Aus/Ein 0
906 Fehlermeldung Ein/Aus 0/1 Aus/Ein 0

44
Nach Ausführung einer Anforderung ist von der PLC ein Wert ungleich 0
zurückzuliefern, wenn die Anforderung ausgeführt wurde und 0, wenn ein Fehler auftrat.

Die M-Funktionen M0, M48, M49 und M62 sind vollständig in der CNC implementiert; für
diese Funktionen werden keine Anforderungen übermittelt und sie sind, unabhängig von
der Software der PLC, immer in NC-Programmen verfügbar. Die Funktionen M1, M2 und
M30 sind in der CNC implementiert, rufen jedoch ggf. zusätzlich die entsprechenden
Maschinenfunktionen auf, wenn diese in der PLC ebenfalls implementiert sind. Alle
übrigen M-Funktionen können in NC-Programmen nur genutzt werden, wenn die
entsprechenden Anforderungen in der Software der PLC implementiert sind.

Die Funktionen M3/M4, M14 und M23/M24 werden von der CNC nicht nur aufgerufen,
wenn sie explizit programmiert sind bzw. manuell aufgerufen werden, sondern auch
dann, wenn sie bereits aktiv sind und sich das CNC-Register S ändert.

Die Funktion M6 wird von der CNC nur aufgerufen, wenn sich die aktuelle
Werkzeugnummer T geändert hat.

M6 wird bei Maschinen mit statischen Werkzeugplatznummern (ohne dynamische


Werkzeugplatzverwaltung) zunächst mit Parameter P1 = 0 aufgerufen, um ein evtl.
eingewechseltes Werkzeug an seinem alten Platz (Parameter P2) abzulegen. Ist die
neue Werkzeugnummer ungleich T0, wird M6 ein zweites mal aufgerufen (P1 = T), um
das neue Werkzeug einzuwechseln. In beiden Fällen kann P2 = 0 sein; in diesem Falle
sollte die PLC beim ersten Aufruf keine Aktionen durchführen (es war kein Werkzeug
eingewechselt) und beim zweiten Aufruf entweder einen Fehler melden (Werkzeug hat
keine Platznummer) oder einen manuellen Werkzeugwechsel einleiten und melden und
dann das CNC-Programm anhalten.

Bei Maschinen mit dynamischer Werkzeugplatzverwaltung wird M6 nur einmal


aufgerufen. In Parameter P1 wird die neue Werkzeugnummer übergeben. Ist Parameter
P1 = 0 (Werkzeug soll abgelegt werden), wählt die CNC einen freien Platz im Magazin
aus und übergibt diesen als Parameter P2; ist P1 ungleich 0 (Werkzeug soll gewechselt
werden), übergibt die CNC die Platznummer des neuen Werkzeugs in Parameter P2.
Nach erfolgreicher Ausführung von M6 ändert die CNC automatisch die Platznummer
des abgelegten Werkzeugs auf P2 und die Platznummer des eingewechselten
Werkzeugs auf 0. Wenn beim Aufruf von M6 Parameter P2 = 0 ist, sollte die PLC einen
Fehler melden (kein freier Platz zum Ablegen im Magazin gefunden bzw. keine
Platznummer am Werkzeug gespeichert) oder einen manuellen Werkzeugwechsel
einleiten und melden und dann das CNC-Programm anhalten.

M12 wird von der CNC zunächst mit Parameter P1 = 0 aufgerufen; die PLC sollte dann
den Meßtaster anfahren und die Z-Position zurückliefern. Die CNC ermittelt dann die
Werkzeugkorrekturdaten als Differenz zwischen dieser Position und der aktuellen
Maschinenposition. Dann erfolgt ein zweiter Aufruf von M12 (P1 = 1) zum Freifahren
(Rückzug vom Meßtaster).

Bei Aufruf maschinenspezifischer M-Funktionen wird der Inhalt des CNC-Registers P


("Parameter") in Parameter P2 übergeben.

Maschinenspezifische M-Funktionen sollten bei der Inbetriebnahme der Maschine nur


im Bereich von M100 bis M899 implementiert werden; der Bereich M0 bis M99 ist
reserviert für nach DIN 66025 genormte M-Funktionen und der Bereich M900 bis M999
für intern verwendete CNC-Anforderungen, die nicht als M-Funktionen genutzt werden.

45
Der Aufruf der intern durch die CNC verwendeten Maschinenfunktionen geschieht wie
folgt:

900 (Rücksetzen Not-Aus)

wird einmal beim Start der PC-Software und jedesmal beim Ausschalten der Maschine
(Funktionstaste Umsch+F2) aufgerufen. Die CNC kann hiermit z.B. einen Reset des
Not-Aus-Kreises durchführen.

901 (Maschine Ein/Aus)

wird aufgerufen, wenn die Maschine über die Funktionstaste Umsch+F1 eingeschaltet
wird (ReqP1 = 1) oder über Umsch+F2 ausgeschaltet wird (ReqP1 = 0). Die PLC kann
hier z.B. die Leistungselektronik (Servoregler etc.) der Maschine ein- oder ausschalten
und z.B. mit ReqRes = 0 zurückmelden, dass ein Einschalten nicht möglich war (z.B.
Not-Aus betätigt).

902 (Betriebsbereit Ein/Aus)

wird beim Einschalten der Maschine nach M91 (mit ReqP1 = 1) und beim Ausschalten
vor M91 (mit ReqP1 = 0) aufgerufen.

903 (Automatikbetrieb Ein/Aus)

wird mit ReqP1 = 1 aufgerufen, wenn die Ausführung eines NC-Programms im


Automatikbetrieb beginnt und mit ReqP1 = 0, wenn sie beendet wurde. Liefert die PLC
ReqRes = 0 (bei ReqP1 = 1), verhindert die CNC den Start des NC-Programms.

904 (Referenzfahrt)

wird bei Anforderung einer Referenzfahrt durch den Benutzer (mit der Funktionstaste
Umsch+F3) aufgerufen. War die Referenzfahrt erfolgreich, setzt die PLC ReqRes = 1.

905 (Freifahren Ein/Aus)

dient dem Freifahren der Achsen unter Kontrolle der CNC nach Auslösung eines
Hardware-Endschalters.

906 (Fehlermeldung Ein/Aus)

wird mit ReqP1 = 1 aufgerufen, wenn dem Bediener auf dem PC-Bildschirm eine
Fehlermeldung angezeigt wird und mit ReqP1 = 0, wenn der Bediener diese bestätigt
hat. Die PLC kann hier z.B. eine Warnlampe ein- und wieder ausschalten.

46

Das könnte Ihnen auch gefallen