ECCO Manual 1.03.pdf - Horsch Elektronik AG
ECCO Manual 1.03.pdf - Horsch Elektronik AG
ECCO Manual 1.03.pdf - Horsch Elektronik AG
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Tel.: +41 81 771 61 81<br />
Fax: +41 81 771 17 47<br />
HORSCH ELEKTRONIK <strong>AG</strong><br />
Haagerstrasse 42<br />
Postfach<br />
CH-9473 Gams<br />
http://www.horsch.ch<br />
info@horsch.ch<br />
<strong>ECCO</strong> <strong>Manual</strong><br />
Version: 1.03<br />
Autor: M. Chicherio<br />
Datum: 19. Dezember 2005<br />
© <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, 2004 – 2005
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
1. VORWORT<br />
Die <strong>ECCO</strong> Programmiersprache der <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> wurde als Sprache zur<br />
Steuerung und Überwachung grösserer Anlagen zur automatischen Herstellung von<br />
komplexen Werkstücken entworfen und jahrelang verbessert und erfolgreich<br />
eingesetzt. In den 80-er Jahren durch Gabriel <strong>Horsch</strong> entworfen, ist sie in den letzten<br />
10 Jahren durch Dr. Peter Horn und Ing. Marcel Sestak weiterentwickelt worden.<br />
Die <strong>ECCO</strong> Steuerung ist eine konsequente Weiterentwicklung der bisherigen SMC<br />
Steuerungen. Was bisher durch eigene Hardware realisiert wurde, wird nun von<br />
einem kommerziellen Standard-PC erledigt, wodurch der Kunde von allen Vorteilen<br />
eines PC’s profitiert.<br />
Die <strong>ECCO</strong> Laufzeit-Umgebung ist äusserst leistungsfähig und erlaubt es, mit einem<br />
Pentium 3 800 MHz in einer Sekunde 200'000 Instruktionen aus 200 Tasks<br />
abzuarbeiten; dabei benötigt der Rechner lediglich 5% seiner Rechenleistung!<br />
Dieses <strong>Manual</strong> wurde mit grösster Sorgfalt zusammengestellt – dennoch kann es<br />
Fehler enthalten. Sollten Sie auf Fehler stossen, teilen sie diese bitte der <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong> mit.<br />
Aufgrund internationaler Urheberrechts-Schutzabkommen ist es Ihnen untersagt,<br />
dieses <strong>Manual</strong> ganz oder teilweise zu kopieren, digitalisieren, ändern oder vervielfältigen.<br />
Das Weitergeben, Veräussern oder Ausleihen an Dritte ist untersagt.<br />
Obwohl dieses <strong>Manual</strong> mit grösster Sorgfalt verfasst wurde, kann es dennoch<br />
Fehler, Irrtümer und Auslassungen enthalten. Mit dem Gebrauch dieses <strong>Manual</strong>s<br />
nehmen Sie diese Tatsache zur Kenntnis und verzichten auf alle Haftungsansprüche<br />
gegenüber der <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> oder Dritten aufgrund mangelhafter,<br />
fehlerhafter, irreführender oder andersartig falscher Angaben. Stimmen Sie diesen<br />
Bedingungen nicht zu, müssen Sie das <strong>Manual</strong> zwingend und umgehend zurückgeben,<br />
digitale Kopien löschen und dürfen das beschriebene Produkt nicht länger<br />
benützen.<br />
Alle Markennamen werden ohne Schutzzeichen gedruckt. Solches Fehlen stellt<br />
keinerlei Angabe zur freien Verfügbarkeit dar.<br />
© 2004, 2005<br />
HORSCH ELEKTRONIK <strong>AG</strong><br />
Haagerstrasse<br />
Postfach<br />
CH-9473 Gams<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 2/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
2. INHALTSVERZEICHNIS<br />
1. Vorwort .........................................................................................................2<br />
2. Inhaltsverzeichnis........................................................................................3<br />
3. Einführung in <strong>ECCO</strong> ....................................................................................8<br />
3. 1. Vorteile von <strong>ECCO</strong> gegenüber IEC 61131 ....................................................8<br />
3. 2. Installation von <strong>ECCO</strong> ...................................................................................9<br />
3. 3. Arbeiten mit dem Terminal...........................................................................10<br />
3. 4. Betriebsarten & -Zustände...........................................................................15<br />
3. 5. Die Programmierumgebung.........................................................................19<br />
3. 6. Ein minimales Programm.............................................................................21<br />
3. 7. Funktionen, Tasks und Prozeduren.............................................................24<br />
3. 8. Register und Merker ....................................................................................26<br />
3. 9. Arbeiten mit Strings .....................................................................................29<br />
3. 10. Ein- und Ausgänge ......................................................................................31<br />
3. 11. Anzeige und Eingabe...................................................................................32<br />
3. 12. Flusskontrolle ..............................................................................................34<br />
3. 13. Internationalisierung ....................................................................................36<br />
3. 14. Kommunikation zwischen Steuerungen.......................................................37<br />
3. 15. Statistik und ZPoint......................................................................................38<br />
3. 16. Der PAC ......................................................................................................40<br />
4. Befehle........................................................................................................41<br />
4. 1. Konventionen...............................................................................................41<br />
4. 2. Systematische Befehlsreferenz ...................................................................42<br />
4. 3. Alphabetische Befehlsreferenz ....................................................................46<br />
.ADDRESS ................................................................................................. 47<br />
.ARRAYS / .END_ARRAYS........................................................................ 48<br />
.CODE_OFF ............................................................................................... 49<br />
.CPLINK_MAP_DEF / .END_CPLINK_MAP_DEF ..................................... 50<br />
.DISPLAYS / .DISP_END ........................................................................... 51<br />
.END........................................................................................................... 52<br />
.ERROR_CODE_START............................................................................ 53<br />
.ERROR_FL<strong>AG</strong>_OFFSET .......................................................................... 54<br />
.FUNCTIONS / .FUNC_END ...................................................................... 55<br />
.IO_TEXT / .END_IO_TEXT ....................................................................... 57<br />
.LANGU<strong>AG</strong>ES ............................................................................................ 59<br />
.LIMITS....................................................................................................... 60<br />
.LOCAL....................................................................................................... 62<br />
.MAX_<strong>ECCO</strong> .............................................................................................. 63<br />
.OWN_<strong>ECCO</strong> ............................................................................................. 64<br />
.PAC_DEF / .END_PAC_DEF .................................................................... 65<br />
.PASSWORD.............................................................................................. 66<br />
.PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF ........................... 67<br />
.PROJECT.................................................................................................. 69<br />
.PROTECTED / .END_PROTECTED......................................................... 70<br />
.PSL / .END_PSL ....................................................................................... 71<br />
.SET_CONST / .END_CONST ................................................................... 74<br />
.SETLABEL ................................................................................................ 76<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 3/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
.SLCE_DEF / .END_SLCE_DEF ................................................................ 77<br />
.SLCS_DEF / .END_SLCS_DEF ................................................................ 78<br />
.STATIONS / STATION / .END_STATIONS............................................... 79<br />
.STATISTIC / GROUP / .END_STATISTIC ................................................ 80<br />
.STOP_IO_TEXT........................................................................................ 84<br />
.STRING_REG / .END_STRING_REG....................................................... 85<br />
.STRINGS / .END_STRINGS ..................................................................... 86<br />
.TEXT ......................................................................................................... 88<br />
.TINP_TEXT / .END_TINP_TEXT .............................................................. 89<br />
.UNLOCK / .END_UNLOCK ....................................................................... 91<br />
.ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT ............................................ 92<br />
ABS ............................................................................................................ 95<br />
AND............................................................................................................ 96<br />
BMOV......................................................................................................... 97<br />
BUS_OFF ................................................................................................... 98<br />
BUS_ON..................................................................................................... 99<br />
CALC ........................................................................................................ 100<br />
CALL......................................................................................................... 101<br />
CALLD ...................................................................................................... 102<br />
CALLF ...................................................................................................... 104<br />
CDATEDISP ............................................................................................. 106<br />
CLOSE ..................................................................................................... 107<br />
CLR_PUFFER .......................................................................................... 108<br />
CLS........................................................................................................... 109<br />
CLS_WIN.................................................................................................. 110<br />
COND_TRAP / IF_COND / END_COND_TRAP ...................................... 111<br />
CREGDISP............................................................................................... 113<br />
CTIMEDISP .............................................................................................. 115<br />
CWRITE ................................................................................................... 116<br />
DATEDISP................................................................................................ 117<br />
DO / DO_WHILE / DO_WHILENOT ......................................................... 118<br />
END_NUM_INP........................................................................................ 120<br />
EXCL ........................................................................................................ 121<br />
GET_PSL ................................................................................................. 122<br />
GW_DD .................................................................................................... 123<br />
GW_DW ................................................................................................... 124<br />
GW_MSG ................................................................................................. 125<br />
GW_QUEUE............................................................................................. 126<br />
GW_RD_DD ............................................................................................. 127<br />
GW_RD_DW ............................................................................................ 128<br />
HP_CDATEDISP ...................................................................................... 129<br />
HP_CLS_WIN........................................................................................... 131<br />
HP_CREGDISP........................................................................................ 132<br />
HP_CTIMEDISP ....................................................................................... 134<br />
HP_CWRITE ............................................................................................ 136<br />
HP_DATEDISP......................................................................................... 137<br />
HP_REGDISP .......................................................................................... 139<br />
HP_TIMEDISP.......................................................................................... 140<br />
HP_WRITE ............................................................................................... 142<br />
ID_INIT ..................................................................................................... 143<br />
ID_READ .................................................................................................. 144<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 4/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
ID_REG_RD ............................................................................................. 145<br />
ID_REG_WR ............................................................................................ 146<br />
ID_STATUS.............................................................................................. 147<br />
ID_WRITE ................................................................................................ 148<br />
IF / IFNOT / ELSE / END_IF..................................................................... 149<br />
INM........................................................................................................... 151<br />
INP............................................................................................................ 152<br />
JMPCOND................................................................................................ 154<br />
JMPTIM .................................................................................................... 155<br />
JPBIT........................................................................................................ 156<br />
JPEQ ........................................................................................................ 157<br />
JPGT ........................................................................................................ 158<br />
JPLT ......................................................................................................... 159<br />
JUMP........................................................................................................ 160<br />
L_INP........................................................................................................ 161<br />
L_JMPCOND............................................................................................ 163<br />
L_OUTP.................................................................................................... 164<br />
L_SWITCH / CASE / DEFAULT / END_SWITCH..................................... 165<br />
LEN_STR ................................................................................................. 166<br />
MID_STR.................................................................................................. 167<br />
MOV ......................................................................................................... 168<br />
MOV_PUFFER ......................................................................................... 169<br />
NEW_PUFFER......................................................................................... 170<br />
NOT.......................................................................................................... 171<br />
NSDEF ..................................................................................................... 172<br />
NUM_INP ................................................................................................. 173<br />
OPEN ....................................................................................................... 175<br />
OR ............................................................................................................ 176<br />
OUTA........................................................................................................ 177<br />
OUTP........................................................................................................ 178<br />
PAC .......................................................................................................... 179<br />
POWER_OFF........................................................................................... 181<br />
PUFFER ................................................................................................... 182<br />
RD_DATE................................................................................................. 183<br />
RD_HOUR................................................................................................ 184<br />
RD_PUFFER ............................................................................................ 185<br />
RD_TIME.................................................................................................. 186<br />
RD_WEEK................................................................................................ 187<br />
REGDISP ................................................................................................. 188<br />
RET .......................................................................................................... 189<br />
RETD........................................................................................................ 190<br />
RETE ........................................................................................................ 191<br />
RETF ........................................................................................................ 192<br />
SAVE_ARRAY.......................................................................................... 193<br />
SCALE_AD............................................................................................... 194<br />
SCALE_DA............................................................................................... 196<br />
SCHICHT.................................................................................................. 197<br />
SEARCH................................................................................................... 198<br />
SEND_IO.................................................................................................. 199<br />
SEND_REG.............................................................................................. 200<br />
SEND_SR................................................................................................. 201<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 5/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
SET_LANG............................................................................................... 202<br />
SET_PSL.................................................................................................. 203<br />
SETBIT ..................................................................................................... 204<br />
SETTIM .................................................................................................... 205<br />
SLCE ........................................................................................................ 206<br />
SLCS ........................................................................................................ 207<br />
SLV_RCV_STR ........................................................................................ 208<br />
SLV_SND_STR ........................................................................................ 209<br />
SMOV....................................................................................................... 210<br />
STAT_CLR ............................................................................................... 211<br />
STAT_PUFFER ........................................................................................ 212<br />
STAT_QUEUE.......................................................................................... 213<br />
STAT_TAKT ............................................................................................. 214<br />
STCKZAHL............................................................................................... 215<br />
STDEF...................................................................................................... 216<br />
STR_ADD................................................................................................. 217<br />
STR_ADD_ASCII ..................................................................................... 218<br />
STR_ADD_NR.......................................................................................... 220<br />
STR_TO_ASCII ........................................................................................ 221<br />
STR_TREAT............................................................................................. 222<br />
STR_VAL.................................................................................................. 223<br />
SV_COM .................................................................................................. 224<br />
SV_CONST .............................................................................................. 225<br />
SV_FIL...................................................................................................... 226<br />
SV_READ................................................................................................. 227<br />
SV_TRJ .................................................................................................... 228<br />
SWITCH / CASE / DEFAULT / END_SWITCH......................................... 229<br />
TASK_KILL............................................................................................... 230<br />
TASK_OPEN ............................................................................................ 231<br />
TASK_STEP............................................................................................. 232<br />
TIMEDISP................................................................................................. 233<br />
TINP ......................................................................................................... 234<br />
VI_CLRKEY.............................................................................................. 237<br />
VI_DATE................................................................................................... 238<br />
VI_JMPKEY.............................................................................................. 240<br />
VI_RDISP ................................................................................................. 241<br />
VI_READ .................................................................................................. 243<br />
VI_TIME.................................................................................................... 244<br />
VI_WRITE................................................................................................. 246<br />
WAITIM..................................................................................................... 247<br />
WHILE / WHILENOT / END_WHILE......................................................... 248<br />
WR_TIME ................................................................................................. 250<br />
WRITE ...................................................................................................... 251<br />
XOR.......................................................................................................... 252<br />
ZPOINT_STATE....................................................................................... 253<br />
4. 4. Label..........................................................................................................254<br />
BACKPGM................................................................................................ 255<br />
ERROR_PROTOTYPE............................................................................. 256<br />
HOT_TASK / HOT_END........................................................................... 257<br />
HPPGM .................................................................................................... 259<br />
NRMPGM ................................................................................................. 260<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 6/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
NSPGM .................................................................................................... 261<br />
NSRESP................................................................................................... 262<br />
STPGM..................................................................................................... 263<br />
STRESP ................................................................................................... 264<br />
4. 5. Veraltete Befehle .......................................................................................265<br />
CTRDEC................................................................................................... 266<br />
CTRDISP.................................................................................................. 267<br />
CTREQ ..................................................................................................... 268<br />
CTRINC .................................................................................................... 269<br />
CTRPRES ................................................................................................ 270<br />
CTRRES................................................................................................... 271<br />
DISABLE_STOP / ENABLE_STOP.......................................................... 272<br />
STAT_SEND ............................................................................................ 273<br />
STEND ..................................................................................................... 274<br />
TIMETRAP / END_TIMETRAP................................................................. 275<br />
TRAP / IF_TRAP / END_TRAP ................................................................ 276<br />
4. 6. Nicht länger unterstützte Befehle...............................................................277<br />
5. Anhänge ...................................................................................................278<br />
5. 1. Zustandsdiagramm....................................................................................278<br />
5. 2. Priorität ......................................................................................................279<br />
5. 3. Farben und Schriftarten auf dem Display ..................................................279<br />
5. 4. Systemregister...........................................................................................281<br />
5. 5. Systemmerker ...........................................................................................284<br />
5. 6. Systemfehler..............................................................................................286<br />
5. 7. Befehle an Servo-Slaves und PAC............................................................292<br />
5. 8. Der <strong>ECCO</strong> Debugger.................................................................................296<br />
5. 9. Der <strong>ECCO</strong> Profiler .....................................................................................299<br />
5. 10. Application Programming Interface............................................................303<br />
5. 11. Bibliographie..............................................................................................304<br />
6. Gültige Version ........................................................................................305<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 7/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
3. EINFÜHRUNG IN <strong>ECCO</strong><br />
In diesem Kapitel werden diverse Aspekte von <strong>ECCO</strong> erläutert. Es dient vor Allem<br />
dazu, in <strong>ECCO</strong> ungeübten Programmierern einen Einstieg zu geben, bietet daneben<br />
aber auch erfahrenen <strong>ECCO</strong>-Programmierern die Möglichkeit, sich auf die Grundsätze<br />
der Sprache zu besinnen.<br />
3. 1. Vorteile von <strong>ECCO</strong> gegenüber IEC 61131<br />
Die Vorteile der <strong>ECCO</strong> Programmiersprache und des neuen <strong>ECCO</strong> Betriebssystems<br />
sind schwer zu übermitteln. Weltweit werden die Steuerungen durch Normierung, die<br />
Ausbildung und Anzahl der Programmierer in eine andere Richtung, historisch bedingt,<br />
gelenkt.<br />
Die meistens in anderen Steuerungen verwendete IEC-61131 Programmiersprache<br />
ist eine Zustandsmaschine, welche im Laufe der Zeit aus der jetzt veralteten Relaistechnik<br />
abgeleitet wurde. Die Anwendung der Relaistechnik wirkte sehr stark auf die<br />
traditionelle Ausbildung der Steuerungsbauer und Betreiber industrieller Anlagen.<br />
Die digitale Technik wurde auch in dieser Art und Denkweise theoretisch behandelt.<br />
Nun haben die Prozessoren mit programmierbaren Digitalbausteinen fast alle Aufgaben<br />
der Relaistechnik übernommen. Jeder Prozessor arbeitet im Zeitablauf seine<br />
Programmzeilen ab. Für die Nachbildung einer Zustandsmaschine müssen zusätzliche<br />
Aufwendungen des Betriebssystems im Prozessor erfolgen, was die Leistungsfähigkeit<br />
des Prozessors beansprucht. Zustandsmaschinen arbeiten deshalb<br />
langsamer.<br />
Die Zustandsmaschine nach IEC 61131 wird im Takt durch den Prozessorprogramm<br />
nachgebildet, indem zuerst Eingänge eingelesen werden, dann alle programmierten<br />
Zustände der Ein- und Ausgänge abgearbeitet werden und am Ende des Taktes die<br />
Ausgänge gesetzt werden.<br />
Bei komplizierten Zuständen ist es auch für geübte Programmierer sehr schwierig,<br />
alle Zustände der Ein- und Ausgänge im Kopf zu behalten und Änderungen am Programm<br />
auszuführen, ohne dabei die vorher programmierten Zustände nicht zu<br />
beeinflussen.<br />
<strong>ECCO</strong> ist eine Zeitablaufsprache, so wie in jedem Prozessor seine Programme im<br />
Zeitablauf abgearbeitet werden. Die Ausführung von Aufgaben eines Prozess-<br />
Ablaufes erfolgen ebenfalls im Zeitablauf. Dies entspricht auch der menschlichen<br />
Denkart, wenn Aufgaben hintereinander erledigt werden.<br />
Eine Veränderung eines komplizierten Prozessablaufs bedeutet in einer Zustands-<br />
Maschine, dass alle Zustände auf die Auswirkung der Veränderung überprüft werden<br />
müssen, weil alle Variablen sich gegenseitig beeinflussen. In einem Zeitablauf wird<br />
hingegen nur ein Zeitsegment verändert, welcher keinen direkten Einfluss auf die anderen<br />
Zeitsegmente ausübt und nur in diesem Zeitsegment auf die neue Veränderung<br />
überprüft werden muss.<br />
Die zweite Veranschaulichung des Unterschiedes wäre ein Beispiel einer Gruppe<br />
von 10 Arbeitern, welche eine gemeinsame Arbeit ausführen. In einer Zustands-<br />
Maschine muss man jeden einzelnen Schritt jedes Arbeiters genau vorschreiben und<br />
überwachen, weil jeder Arbeiter den momentanen Zustand der gemeinsamen Aufgabe<br />
direkt beeinflusst.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 8/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
In einem Zeitablauf bekommt jeder Arbeiter seine Aufgabe unabhängig zu lösen, wobei<br />
die gemeinsame Kontrolle sich nur auf die Synchronisierungspunkte zwischen<br />
einigen Arbeitern und erst am Ende der Aufgabe die Synchronisierung der gesamten<br />
Gruppe beschränkt.<br />
Deshalb müssen auch in einem Zeitablauf die Zustände der einzelnen Arbeiten<br />
punktuell überwacht werden. Nicht aber immer wie es in der Zustandsmaschine der<br />
Fall ist. Dies erleichtert wesentlich die Denkart und die Abarbeitung der Änderungen<br />
in einem bestehenden Programm.<br />
Erfahrungsgemäss ist eine Ergänzung oder eine Veränderung des Programms in<br />
<strong>ECCO</strong> und die Überprüfung der Auswirkung auf andere Programmabläufe wesentlich<br />
schneller ausführbar als in einer Zustandsmaschine, wie es die IEC 61131<br />
Programmiersprache ist.<br />
<strong>ECCO</strong> Betriebssystem arbeitet schneller und ist der menschlichen Denkart besser<br />
angepasst und einfacher zu begreifen als eine Zustandsmaschine. Der Beweis liegt<br />
in der Flexibilität, schneller Durchführung von Änderungen und dadurch wesentlich<br />
kürzerer Zeit der Inbetriebnahmen bei anspruchsvollen und komplizierten Prozessen.<br />
Die Betrachtung der Programmier-, Inbetriebnahme- und Änderungskosten hat die<br />
<strong>ECCO</strong> Programmiersprache seit 20 Jahren trotz der minimalsten Bekanntheit und<br />
Verbreitung bisher überleben lassen.<br />
3. 2. Installation von <strong>ECCO</strong><br />
Die eigentliche Installation von <strong>ECCO</strong> ist äusserst einfach und kann innerhalb einer<br />
Minute erledigt werden. Daneben werden jedoch einige Software-Pakete von<br />
Drittanbietern benötigt, deren Installation etwas länger dauern kann. In diesem Abschnitt<br />
werden alle Installations-Schritte aufgezeigt. Beachten Sie, dass die einzelnen<br />
Programme Lizenzvereinbarungen unterliegen und nur entsprechend verwendet<br />
werden dürfen.<br />
1. Windows 2000 oder XP installieren – auf anderen Windows Produkten ist<br />
<strong>ECCO</strong> unter Umständen nicht lauffähig oder läuft nur instabil.<br />
2. Falls ein Beckhoff Touchscreen-Panel verwendet wird, müssen die Treiber<br />
speziell installiert werden. Ebenso müssen allenfalls kundenspezifische<br />
Anpassungen der Standart-Installation vorgenommen werden.<br />
3. Profibus-Karte installieren. Wird eine Karte der Firma Hilscher zusammen mit<br />
einem vorinstallierten Beckhoff Industrie-PC verwendet, so können nicht<br />
einfach die Profibus-Treiber installiert werden, sondern die vorinstallierten<br />
Beckhoff-Treiber sind durch die Treiber der Firma Hilscher zu ersetzen.<br />
4. Wird eine CP-Link Karte verwendet, so ist diese zu installieren und TwinCat CP<br />
muss installiert werden. Die Installation von TwinCat CP ist selbsterklärend.<br />
5. Ausführen der <strong>ECCO</strong>-Installation <strong>ECCO</strong>Setup.exe. Typischerweise reichen die<br />
Standard-Einstellungen aus; unter Umständen sind sie jedoch anzupassen.<br />
Falls <strong>ECCO</strong> zum ersten Mal installiert wird, sollte die Option „Execute 3rd<br />
Party Setup Files“, um Treiber zu installieren, welche zur Laufzeit benötigt<br />
werden.<br />
6. Beim Arbeiten mit Profibus oder CPLink muss die zum Dongle gehörende<br />
Lizenzdatei license.dat in das Verzeichnis von <strong>ECCO</strong> kopiert werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 9/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Damit ist die eigentliche Installation von <strong>ECCO</strong> abgeschlossen. Die Konfiguration von<br />
<strong>ECCO</strong> wird im nächsten Abschnitt erläutert.<br />
Zur Installation und Verwendung von SyCon und ist die jeweilige Dokumentation zu<br />
beachten. Bei der Anbindung von CPLink muss zudem TwinCat CP parallel zu<br />
<strong>ECCO</strong> laufen.<br />
3. 3. Arbeiten mit dem Terminal<br />
Das <strong>ECCO</strong> Terminal bildet das frühere SMC42 Panel ab. Daher fällt es SMC42<br />
Anwendern leicht, auf <strong>ECCO</strong> zu wechseln. Da <strong>ECCO</strong> die Soft-SPS Steuerung für<br />
windows-basierte PC’s ist, wird <strong>ECCO</strong> wie jedes andere Windows-Programm gestartet.<br />
1. Mit dem Hauptschalter am Schaltschrank die Anlage einschalten.<br />
2. Den Steuerungs-PC einschalten. Je nach Konfiguration muss beim Aufstarten<br />
ein Passwort eingegeben werden.<br />
3. Starten der <strong>ECCO</strong> Laufzeit-Umgebung ecco.exe.<br />
4. Der Konfigurator erscheint.<br />
5. Das Programm im Feld „Load Programm at Startup“ wählen und mit der<br />
Schaltfläche „Start <strong>ECCO</strong>“ starten.<br />
6. Das ausgewählte Programm wird nun von der Laufzeit-Umgebung gestartet.<br />
Das Programm meldet sich mit einer Meldung, die vom Programmierer mit dem<br />
.TEXT Befehl gewählt wurde.<br />
Der <strong>ECCO</strong> Konfigurator<br />
Beim Aufstarten von <strong>ECCO</strong> erscheint zuerst der Konfigurator. Ist die Steuerung erst<br />
einmal richtig konfiguriert, so braucht der Benutzer nur auf „Start <strong>ECCO</strong>!“ zu klicken,<br />
um die Steuerung zu starten.<br />
Die Anweisungen in diesem Abschnitt greifen vom Schwierigkeitsgrad etwas vor und<br />
erläutern die fortgeschrittene Konfiguration von <strong>ECCO</strong>; wer sich nicht dafür<br />
interessiert, kann diesen Abschnitt getrost überspringen.<br />
Die erste „fortgeschrittene“ Einstellung betrifft die Möglichkeit, den Konfigurator zu<br />
überspringen, wie dies in Produktionsumgebungen gewünscht wird, damit die Anlage<br />
vollständig autonom startet. Dazu wird <strong>ECCO</strong> mittels<br />
ecco -s <br />
aufgerufen, wobei der Schalter -s das<br />
Überspringen des Konfigurators angibt<br />
und in das kompilierte<br />
Laufzeit-Programm angegeben wird.<br />
Beim Aufruf ohne -s Schalter erscheint<br />
die Hauptseite des Konfigurators nach<br />
nebenstehender Abbildung. Die meisten<br />
Elemente sind inaktiv, da der Benutzer<br />
sich zuerst anmelden muss, bevor er<br />
Veränderungen vornehmen darf.<br />
Die Anmeldung geschieht, indem der<br />
Benutzer auf „User Login“ klickt und sich<br />
beim System anmeldet.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 10/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
In der Box „Login info“ befinden sich Informationen zum letzen Beenden von <strong>ECCO</strong><br />
(also wann und wie <strong>ECCO</strong> beendet wurde) und zum Benutzer. In den Feldern<br />
„Engine Runtime status“ und „UPS Status“ kann <strong>ECCO</strong> den Zustand der Laufzeit-<br />
Umgebung respektive der Stromversorgungs-Einheit angeben.<br />
Bei einem angemeldeten Benutzer sieht<br />
die Hauptseite wie in nebenstehender<br />
Abbildung aus. Neben der Möglichkeit,<br />
<strong>ECCO</strong> mittels „Start <strong>ECCO</strong>“ zu starten<br />
oder das Programm mittels „Cancel“ zu<br />
beenden, kann der Benutzer ein Laufzeit-<br />
Programm auswählen, <strong>ECCO</strong> ohne<br />
Laufzeit-Programm zu starten (indem er<br />
„Load Program at startup“ deaktiviert),<br />
sich selbst ausloggen und die aktuellen<br />
Einstellungen anschauen und ändern.<br />
Die Einstellungen werden über „<strong>ECCO</strong><br />
Settings“ inspiziert und bei Bedarf<br />
geändert. Die einzelnen Möglichkeiten<br />
werden dabei im Nachfolgenden erläutert.<br />
Die Einstellungen werden in acht Reitern<br />
dargestellt, wobei der erste Reiter serielle<br />
Verbindungen zu den Hilfsprogrammen<br />
ermöglicht. Da in älteren Steuerungs-<br />
Generationen dies ausschliesslich über<br />
serielle Schnittstellen möglich war, wird<br />
dies von <strong>ECCO</strong> weiterhin unterstützt.<br />
Die meisten Benutzer verzichten jedoch<br />
darauf und verwenden die erste Option<br />
(wie in der Abbildung ausgewählt), um<br />
die Hilfsprogramme anzubinden.<br />
Mit dem Auswahl-Feld „IP address for PC<br />
Services“ wird die zu verwendende<br />
eigene IP-Adresse ausgewählt.<br />
Der zweite Reiter, mit „IDEX“ beschriftet,<br />
dient ausschliesslich zur Information, da<br />
IDEX Einheiten über .PRODIBUS_DEF<br />
deklariert und konfiguriert werden.<br />
Die Zahl beim Max Feld gibt die Zahl der<br />
angeschlossenen IDEX Antennen an.<br />
Danach folgt die eigentliche Tabelle mit<br />
den IDEX Elementen, wobei die Felder<br />
folgende Bedeutung haben:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 11/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
ID Profibus ID der Auswerteinheit.<br />
Bd Nummer der verwendeten Karte.<br />
Ant Antenne auf der Auswerteinheit.<br />
Nr Die <strong>ECCO</strong> ID.<br />
IB Das erste Input-Byte im Abbild.<br />
OB Das erste Output-Byte im Abbild.<br />
Der dritte Reiter ist mit „Engine Tracer“<br />
beschriftet. Der Reiter bietet die Möglichkeit,<br />
Register beim Aufstarten zu initialisieren,<br />
Aufstart-Verhalten der Laufzeit-<br />
Umgebung und das Verhalten bei<br />
Profibus-Fehlern festzulegen, den Support<br />
für den Tracer zu aktivieren und zu<br />
konfigurieren, die Zeit zur periodischen<br />
Speicherung der „pufferter“ Register festzulegen,<br />
die Ereignisaufzeichnung zu<br />
beeinflussen, was die Offline-Analyse<br />
erleichtert, und die Anzahl der Systemumläufe<br />
in jeder Millisekunde anzugeben.<br />
Der vierte Reiter (der erste auf der<br />
„oberen“ Reihe) ermöglicht es, die<br />
Bildschirm-Ausgabe zu konfigurieren.<br />
Typischerweise wird <strong>ECCO</strong> als „Stand<br />
alone“ Anwendung betrieben, das heisst,<br />
<strong>ECCO</strong> läuft auf einem eigenen Rechner<br />
mit Bildschirm. Daneben besteht jedoch<br />
die Möglichkeit, die Ausgabe der<br />
Laufzeit-Umgebung auf einem eigenen<br />
Panel auszugeben (über eine beliebige<br />
serielle Schnittstelle) oder über TCP/IP<br />
auf einem fremden PC darzustellen (beispielsweise,<br />
um <strong>ECCO</strong> Rechner zentral<br />
zu verwalten).<br />
Der fünfte Reiter wird für ZPoint und<br />
StatREAD verwendet.<br />
Der Begriff „Gateway“ stammt noch von<br />
älteren Steuerungs-Generationen, bei<br />
welchen die SMC Steuerung über eine<br />
spezielle Gateway-Karte mit dem ZPoint-<br />
Rechner kommunizierte.<br />
Das Kontrollkästchen „Gateway support“<br />
aktiviert die ZPoint-Anbindung. Über die<br />
Schaltfläche „Configuration file“ kann die entsprechende Konfigurations-Datei<br />
ausgewählt werden. Das Kästchen „Activate/Deactivate STATISTIC support“ muss<br />
aktiviert sein, wenn eine Statistik-Software (wie ZPoint oder StatREAD) verwendet<br />
wird.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 12/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Der sechste Reiter ist mit „<strong>ECCO</strong>“ beschriftet<br />
und dient zum Verbinden mit<br />
fremden Steuerungen, so dass die<br />
Steuerungen zu einem Verbund zusammengefasst<br />
werden.<br />
Über das Kontrollkästchen „Support<br />
<strong>ECCO</strong> <strong>ECCO</strong> communication“ wird<br />
die Netzwerkunterstützung für den<br />
Verbund aktiviert; die weiteren Felder<br />
dienen zur Deklaration der IP-Adressen<br />
der verbundenen Steuerungen.<br />
Der siebte Reiter, überschrieben mit<br />
„Slave and VI“ ermöglich es, die Unterstützung<br />
für Slaves zu deaktivieren. Zudem<br />
werden Informationen über die angeschlossenen<br />
Slaves angezeigt.<br />
PB Profibus ID der Klemme.<br />
ECC In <strong>ECCO</strong> zugewiesene Nummer.<br />
BRD Nummer der verwendeten Karte.<br />
Slv Der Typ des angeschlossenen<br />
Typ Slaves<br />
COM Fortlaufende Com-Nummer.<br />
Typ Parameter des Com-Ports.<br />
Der achte und letzte Reiter aktiviert die<br />
PAC Unterstützung und zeigt folgende<br />
Informationen an:<br />
ID Profibus ID des PAC.<br />
Brd Nummer der verwendeten Karte.<br />
PAC <strong>ECCO</strong>-ID des PAC.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 13/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Die Elemente des Terminals<br />
Das Terminal besteht aus einem „Display“ mit hellblauem Grund, auf dem <strong>ECCO</strong><br />
Programme und die Laufzeit-Umgebung Mitteilungen schreiben können. Dabei sind<br />
die untersten zwei Zeilen der Laufzeit-Umgebung vorbehalten und werden<br />
üblicherweise Status-Zeilen genannt.<br />
Die übrigen Elemente repräsentieren Tasten, mit denen der Bediener das Programm<br />
bedient. Einige Tasten haben zusätzlich kleine „LED“‘s, welche den dazugehörigen<br />
Zustand anzeigen.<br />
Wenn aktiv wird bei den Zifferntasten die alternative Funktion ausgewählt.<br />
Diese ist bei den entsprechenden Tasten dokumentiert.<br />
Anwahl für die Eingabe von Zahlen.<br />
Zeigt Störungen und den Notstop an. Bei einem Notstop muss zuerst<br />
hardwaremässig quittiert werden (indem beispielsweise der Notstop-<br />
Schalter gelöst wird). Die Störung wird mit dem Drücken der „Fail“ Taste<br />
quittiert, worauf die Stör-Reset-Sequenz startet.<br />
Zeigt an, wenn die aktuelle Betriebsart „manueller Betrieb“ ist. Mit der<br />
Taste wird in den manuellen Betrieb gewechselt.<br />
Zeigt an, wenn die aktuelle Betriebsart „Stationenbetrieb“ ist. Mit der Taste<br />
wird in den Stationenbetrieb gewechselt.<br />
Zeigt an, wenn die aktuelle Betriebsart „Automatikbetrieb“ ist. Mit der<br />
Taste wird in den Automatikbetrieb gewechselt.<br />
Startet die ausgewählte Funktion, Station oder das Programm.<br />
Programm-Unterbrechung mit Auslösung des Diagnostik-Modus. Normale<br />
Programme werden unterbrochen, um die Eingänge zu zeigen, auf die<br />
gewartet wird. Mit Start wird das Programm fortgesetzt.<br />
Beendet den <strong>ECCO</strong> Monitor und das Anwenderprogramm.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 14/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Im Diagnostik-Modus wird die erste Bedingung angezeigt, auf die gewartet<br />
wird.<br />
In den Auswahl-Modi für Station, Funktion, Merker, ... wird der Auswahl-<br />
Modus verlassen.<br />
Im Diagnostik-Modus wird damit die nächste Bedingung angezeigt.<br />
Leuchtet, wenn ein Eingang, Ausgang oder Merker gewählt ist und dieser<br />
H ist. Mit der Taste wird das gewählte Element H gesetzt.<br />
Leuchtet, wenn ein Eingang, Ausgang oder Merker gewählt ist und dieser<br />
L ist. Mit der Taste wird das gewählte Element L gesetzt.<br />
Ziffer 0. Ist „Shift“ aktiv, so wird ein Timer angewählt.<br />
Ziffer 1. Ist „Shift“ aktiv, so wird ein Eingang angewählt.<br />
Ziffer 2. Ist „Shift“ aktiv, so wird ein Ausgang angewählt.<br />
Ziffer 3. Ist „Shift“ aktiv, so wird ein Merker angewählt.<br />
Ziffer 4. Ist „Shift“ aktiv, so wird ein Fehlermerker angewählt. Wird der<br />
Fehlermerker hoch gesetzt, so startet der dazugehörige Fehler-Handler.<br />
Kann auch verwendet werden, um anstehende Fehlermerker tief zu<br />
setzen.<br />
Ziffer 5. Ist „Shift“ aktiv, so wird eine Funktion angewählt. Dazu können<br />
sowohl die Ziffern, als auch die Pfeiltasten verwendet werden.<br />
Ziffer 6.<br />
Ziffer 7.<br />
Ziffer 8.<br />
Ziffer 9.<br />
Dezimalpunkt, wie er beispielsweise in NUM_INP Abfragen verwendet<br />
wird. Ist „Shift“ aktiv, so wird ein Zähler angewählt.<br />
Vorzeichen-Auswahl, wie sie beispielsweise in NUM_INP Abfragen<br />
verwendet wird.<br />
Löscht die Eingabe (inklusive Shift-Anwahl und allen eingegebenen<br />
Zeichen).<br />
Bei einem Systemfehler kann damit das Programm ungültig erklärt<br />
werden.<br />
Bestätigt die Eingabe.<br />
Pfeiltasten zur Navigation in der Funktionsauswahl oder zwischen PSL-<br />
Seiten.<br />
Stellt den Schlüsselschalter dar, dessen Funktion vom Programmierer frei<br />
programmierbar ist.<br />
Wie die einzelnen Tasten in den verschiedenen Betriebszuständen verwendet<br />
werden, wird im nächsten Abschnitt erklärt.<br />
3. 4. Betriebsarten & -Zustände<br />
Ein grosser Vorteil von <strong>ECCO</strong> gegenüber anderen Steuerungen sind seine Betriebsarten.<br />
Dadurch wird das Einrichten und Testen, die Inbetriebnahme und das Abändern<br />
komplizierter Abläufe massiv vereinfacht.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 15/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Der Unterschied zwischen Betriebszuständen und Betriebsarten ist einfach: Die<br />
Steuerung befindet sich in einem Zustand, der ihr Verhalten bestimmt. Der Benutzer<br />
kann gewisse Betriebszustände auswählen; diese bezeichnet man dann als Betriebsarten.<br />
<strong>ECCO</strong> kennt grob 8 Betriebszustände: Normierung, manueller Betrieb, Stationen-<br />
und Automatikbetrieb, Funktionsmodus, Störung, Notstop und Systemfehler. Vier<br />
dieser Zustände kann der Benutzer direkt auswählen; dies sind die Betriebsarten<br />
Funktionsmodus, manueller Betrieb, Stationen- und Automatikbetrieb.<br />
Im Anhang 5. 1 „Zustandsdiagramm“ werden die einzelnen Betriebszustände<br />
graphisch gezeigt. Dort werden auch die Zustandsübergänge angegeben, wie also<br />
von einem Zustand in einen anderen gewechselt werden kann.<br />
Manueller Betrieb<br />
Im manuellen Betrieb können einzelne Elemente und Funktionen direkt von Bediener<br />
ansteuerbar. So können einzelne Ausgänge geschaltet werden um die Anlage<br />
mechanisch zu kalibrieren. Dadurch vereinfacht sich die Inbetriebnahme wesentlich<br />
und kann zudem schon zu einem Zeitpunkt vorgenommen werden, in dem das eigentliche<br />
Programm noch nicht ausprogrammiert ist.<br />
Das Setzen von Eingängen, Ausgängen, Merkern und Fehlermerkern geschieht,<br />
durch Drücken von und danach den Tasten bis . Mit<br />
kann der Funktionsmodus erreicht werden.<br />
Stationenbetrieb<br />
Im Stationenbetrieb wird eine einzelne Station unabhängig von den übrigen gestartet.<br />
Dazu wird in dieser Betriebsart die Taste gedrückt und dann die Nummer der<br />
Station eingegeben (entweder als Zahl oder über die Pfeiltasten). Mit der Taste<br />
kann die Auswahl korrigiert, mit der Taste bestätigt werden. Schliesslich wird die<br />
so ausgewählte Station mit gestartet. Die Ausführung kann mit der<br />
Taste unterbrochen werden; damit kann <strong>ECCO</strong> direkt am Terminal gedebuggt werden.<br />
Näheres dazu weiter unten.<br />
Automatikbetrieb<br />
Der Automatikbetrieb ist der eigentliche Produktionsmodus. Damit werden die in der<br />
Automation benötigten halb- und vollautomatischen Abläufe realisiert. Der Automatikbetrieb<br />
wird gestartet, indem die Taste gedrückt und mit der Taste bestätigt<br />
wird.<br />
Die Ausführung kann mit der Taste unterbrochen werden; damit kann <strong>ECCO</strong><br />
direkt am Terminal gedebuggt werden, oder es kann in den Funktionsmodus gewechselt<br />
werden. Näheres dazu weiter unten. Während der Produktion wird jedoch<br />
dringend abgeraten, von dieser Möglichkeit gebrauch zu machen.<br />
Normierung<br />
Die Normierungssequenz wird beim Starten der Maschine ausgeführt, um die<br />
Steuerung und die dazugehörende Anlage zu Normieren; erst nach dem Ende der<br />
Sequenz steht die Maschine im Manuellmodus bereit.<br />
Gleichzeitig mit der Normierung wird der Background-Task und der Hot-Task gestartet.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 16/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Die Ausführung der Normierung kann mit der Taste unterbrochen werden;<br />
damit kann <strong>ECCO</strong> direkt am Terminal gedebuggt werden. Näheres dazu weiter<br />
unten. Davon wird jedoch dringend abgeraten, da sich dann die Anlage nicht mehr in<br />
einem wohldefinierten Zustand befindet.<br />
Störung<br />
Tritt eine vom Anwender programmierte Störungs-Bedingung im Automaten- oder<br />
Stationenbetrieb auf, so wird das Programm unterbrochen, die Taste leuchtet<br />
und auf dem Display erscheint „SYSTEM FAIL“, sowie die Nummer des Elements,<br />
welches die Störung auslöste.<br />
Der Bediener quittiert die Störung durch Betätigung der Taste, wodurch die<br />
Störungs-Reset-Routine startet. Fehlt diese, so bricht <strong>ECCO</strong> das Programm ab und<br />
geht in den manuellen Modus.<br />
Notstop<br />
Im Gegensatz zur Störung ist der Notstop in allen Betriebsarten aktiv. Üblicherweise<br />
fungiert als eine Software-Bedingung ein physikalischer Notstop-Kreis, welcher<br />
selbständig die Anlage schützt.<br />
Die Bedingungen für den Software-Notstop sind vom Programmierer frei wählbar.<br />
Tritt eine Bedingung auf, so werden alle Tasks (mit Ausnahme der Hintergrund-<br />
Tasks) abgebrochen und die Notstop-Sequenz gestartet. Diese ist vom Programmierer<br />
frei wählbar, setzt jedoch üblicherweise nur alle Ausgänge tief.<br />
Nach Ablauf der Notstop-Sequenz erscheint auf dem Display „Emergency Stop“ zusammen<br />
mit der Nummer der Bedingung, die den Notstop auslöste, und die „Fail“<br />
Taste leuchtet.<br />
Nachdem die Notstop-Schalter (sofern nötig) zurückgesetzt und die Notstop-<br />
Bedingung beseitigt wurde, wird der Notstop mit der „Fail“ Taste quittiert, worauf die<br />
Notstop-Reset-Sequenz startet. Sofern nichts Anderes programmiert, wechselt<br />
<strong>ECCO</strong> darauf in den manuellen Modus.<br />
Systemfehler<br />
Systemfehler sind entweder „gewöhnlich“, indem der Bediener den Fehler bestätigen<br />
und das Programm weiterführen kann, oder „fatal“, was bedeutet, dass <strong>ECCO</strong> das<br />
Programm für ungültig erklären muss und ein neues Programm geladen werden<br />
muss.<br />
Ein genauer Beschrieb der Systemfehler findet sich im Anhang 5. 6 „Systemfehler“.<br />
Funktionsmodus<br />
Im Funktionsmodus können parameterlose Funktionen ausgewählt werden. Dazu<br />
wird zuerst mit in den Funktionsmodus gewechselt, dann über die<br />
direkte Nummer (also z.B. für die Funktion 1.2 die Tastenfolge ) oder<br />
mit den Pfeiltasten die gewünschte Funktion ausgewählt. Der Text, welcher die<br />
Funktion in der aktuellen Landessprache wählt, wird angezeigt, um die Funktion<br />
einfacher auswählen zu können. Mit wird die Funktion danach gestartet.<br />
Der Funktionsmodus dient dazu, parameterlose Funktionen zu testen, Funktionen mit<br />
Parametern über kapselnde Funktionen aufzurufen und dem Benutzer gewisse<br />
Einricht-Funktionalität anzubieten.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 17/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
In den Funktionsmodus kann jederzeit (also in den Modi manueller Betrieb,<br />
Stationen- und Automatikbetrieb) gewechselt werden, wobei im Stationen- und<br />
Automatikbetrieb das laufende Programm zuerst mit gestoppt werden muss.<br />
Debugging mit dem Terminal<br />
<strong>ECCO</strong> eignet sich hervorragend für Rapid-Prototyping und Evolutional Programming.<br />
Dies wird insbesondere auch dadurch erreicht, dass es in <strong>ECCO</strong> einfach ist,<br />
mechanische, elektrische oder logische Fehler auszumachen; diverse Tools unterstützen<br />
dabei den Programmierer. Ein einfaches, jedoch erstaunlich nützliches Werkzeug<br />
das Terminal selbst; seine Möglichkeiten werden nachfolgend kurz aufgezeigt.<br />
Anwenderprogramme lassen sich fast beliebig mit der Taste unterbrechen<br />
(Hintergrund-Tasks laufen jedoch weiter, wodurch beispielsweise Sicherheits- und<br />
Überwachungsfunktionen erhalten bleiben). Die Meldung „PROGRAMM STOPPED“<br />
erscheint, und es wird in den Diagnostik-Modus gewechselt. Die Tasten und<br />
leuchten. Durch Drücken der Taste würde das Programm abgebrochen<br />
und könnte nicht mehr weitergefahren werden.<br />
Mit und wird zwischen den einzelnen Bedingungen gewechselt, auf<br />
die das Programm wartet: schaltet zur nächsten Bedingung weiter,<br />
zur ersten. Hat durch die letzte Bedingung erreicht, so wird danach keine Bedingung<br />
mehr angezeigt. Mit wird das unterbrochene Programm fortgesetzt.<br />
Aufstarten nach einem Absturz<br />
Um <strong>ECCO</strong> nach einem Absturz (zB. des Betriebssystems) erfolgreich aufzustarten,<br />
ohne Gefahr zu laufen, dadurch Folgefehler auszulösen, Register zu überschreiben<br />
oder die Integrität der Verbundenen Maschine zu gefährden, sind folgende Schritte<br />
nötig:<br />
1. PC und <strong>ECCO</strong>-Konfigurator aufstarten.<br />
2. Sobald der Konfigurator aufgestartet ist, diesen schliessen.<br />
3. <strong>ECCO</strong>-Konfigurator und dann Anwenderprogramm mittels „Start <strong>ECCO</strong>“<br />
starten.<br />
4. Es kann sein, dass ein Hinweis bezüglich inkonsistentem Tracer-File erscheint.<br />
Der Hinweis kann quittiert werden. Das <strong>ECCO</strong> Anwenderprogramm startet nun<br />
wie gewohnt.<br />
Um die Gefahr von Abstürzen zu reduzieren und so die Gefahr inkonsistenter Daten<br />
zu minimieren, sollte der verwendete Rechner stets mit einer UPS betrieben werden,<br />
das Betriebssystem stets auf dem neuesten Stand (inklusive Service-Packs und<br />
Patches) sein, und <strong>ECCO</strong> niemals „abgeschossen“ werden. <strong>ECCO</strong> also stets über<br />
die Beenden-Funktion schliessen; dadurch wird nicht nur eine korrekte Sicherung der<br />
Daten gewährleistet, sondern es wird auch sichergestellt, dass die maschinen- und<br />
feldbusseitige Hardware korrekt heruntergefahren wird, was insbesondere bei<br />
Profibus Master-Karten vor Fehlkonfiguration schützt.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 18/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
3. 5. Die Programmierumgebung<br />
In den vorherigen Abschnitten wurde die <strong>ECCO</strong>-Umgebung beschrieben, wie sie ein<br />
Maschinenbediener antrifft. In den nachfolgenden Abschnitten wird auf verschiedene<br />
Aspekte der Programmierung in <strong>ECCO</strong> eingegangen; daher dient dieser Abschnitt<br />
als Bindeglied, indem er auf die Programmierumgebung und die zur Programmierung<br />
notwendigen Werkzeuge eingeht.<br />
Werkzeuge zur Konfiguration einzelner Elemente, wie PacTest für den PAC, werden<br />
in den jeweiligen Abschnitten beschrieben.<br />
UltraEdit<br />
UltraEdit ist ein vielseitiger und leistungsfähiger Editor, welcher von <strong>ECCO</strong><br />
unterstützt wird. UltraEdit wird von IDM Computer Solutions vertrieben; für weitere<br />
Informationen siehe [11].<br />
Compiler<br />
Wie jeder Compiler ist auch der <strong>ECCO</strong> Compiler ein konsolenbasierter Compiler,<br />
dessen exakte Funktion über eine Reihe von Schaltern festgelegt werden kann. Die<br />
verwendete Syntax ist dabei:<br />
eccocmp.exe <br />
dabei beideuten:<br />
Zu kompilierende Datei. Bei einigen Schaltern optional.<br />
Optionale Schalter, welche die exakte Funktion festlegen.<br />
Die möglichen Schalter sind:<br />
-debug Generiert eine Datei, welche vom Debugger benötigt wird. Soll<br />
also der Debugger verwendet werden, muss dieser Schalter<br />
angegeben sein.<br />
-edit Schreibt alle Fehlermeldungen des Kompilier-Vorgangs in eine<br />
Datei namens hderr.err. Der Schalter ist nur noch aus Kompatibilitätsgründen<br />
vorhanden.<br />
-help Ist nicht angegeben, so wird eine Liste mit allen<br />
Befehlen und Anweisungen generiert. Wenn <br />
angegeben ist, dann wird zu jedem Compiler-Fehler die<br />
entsprechende Hilfe ausgegeben.<br />
-io Überprüft, dass das Programm keine Eingänge, Ausgänge,<br />
Merker oder Fehlermerker verwendet, die nicht unter .IO_TEXT<br />
angegeben wurden. Fehlermeldungen werden (mit Angabe der<br />
fehlerhaften Zeile) für nicht angegebene Elemente erzeugt.<br />
-lang Wählt die verwendete Landessprache (im ) für ZPoint aus.<br />
kann 1,2 oder 3 sein.<br />
-list Erzeugt eine Datei, bei welcher Quell- und Ziel-Code<br />
gemeinsam angezeigt werden. Dient ausschliesslich zur<br />
Funktionskontrolle des Compilers durch die <strong>Horsch</strong> <strong>Elektronik</strong><br />
<strong>AG</strong>.<br />
-map Generiert eine Datei unter .map, in welcher alle globalen<br />
und lokalen Label aufgelistet werden.<br />
-optio Diese Option hat keinerlei Auswirkungen und ist nur noch aus<br />
Kompatibilitätsgründen vorhanden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 19/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
-pb Strenge Überprüfungen, ob das Anwenderprogramm und die<br />
Deklarationen konsistent sind.<br />
-phelp Wie –help, nur dass nach jeder Ausgabe auf eine Aktion des<br />
Benutzers (z.B. Tastendruck) gewartet wird.<br />
-reg Überprüft, dass alle globalen Register im .IO_TEXT als<br />
Kommentar aufgeführt sind, analog zu –io.<br />
-slc Erlaubt die Verwendung alter Slave-Syntax. Im Compiler wird<br />
der Schalter aus Kompatibilitätsgründen unterstützt; die Syntax<br />
ist aber in <strong>ECCO</strong> ungültig. Daher sollte der Schalter nicht mehr<br />
verwendet werden.<br />
-statinit Kompiliert den .STATISTIC-Block für StatREAD.<br />
-trap Diese Option hat keinerlei Auswirkungen und ist nur noch aus<br />
Kompatibilitätsgründen vorhanden.<br />
-ultra Wird benötigt, wenn der Compiler aus UltraEdit32 integriert<br />
aufgerufen wird. Die Fehlermeldungen werden entsprechend für<br />
UltraEdit32 angepasst.<br />
Loader<br />
Beim Entwickeln und Austesten von Software müssen oftmals viele „verbesserte“<br />
Versionen eines Programms in kurzer Folge geladen werden. Statt jedesmal <strong>ECCO</strong><br />
zu beenden und neu zu starten, kann mit dem Loader im manuellen Modus oder im<br />
Notstop von <strong>ECCO</strong> das neue Programm direkt geladen werden. Diverse Schalter<br />
ermöglichen es, den Loader über die Kommandozeile so zu konfigurieren, dass der<br />
Ladevorgang automatisch ausgeführt wird.<br />
Der Aufruf ist:<br />
eccoload <br />
wobei die zu ladende Datei (allenfalls mit Pfad) bezeichnet. Mögliche<br />
Schalter sind:<br />
-B,,,<br />
<br />
Angabe der Schnittstellenkonfiguration beim Laden über eine<br />
serielle Schnittstelle. Die Angabe -B19200,n,8,1 bedeutet<br />
dabei, 19'200 Baud Datenrate, keine Paritätsbits, acht Datenund<br />
ein Stopp-Bit.<br />
-C Gibt die serielle Schnittstelle beim Laden über eine serielle<br />
Schnittstelle an. So wird mit -C2 die Schnittstelle COM2 des<br />
PCs verwendet.<br />
-P40 –S7 Muss bei seriellen Schnittstellen immer genau so angegeben<br />
werden. Aus Kompatibilitätsgründen vorhanden, in <strong>ECCO</strong> aber<br />
ohne Funktion.<br />
-E IP-Adresse an, zu der das Programm geladen wird.<br />
Der Loader bietet eine interaktive<br />
Oberfläche, über die alle Optionen auch<br />
über das graphische Interface ausgewählt<br />
werden können. Wird der Loader<br />
ohne Optionen aufgerufen, so erscheint<br />
zunächst die nebenstehend gezeigte<br />
Warnung. Sie bedeutet, dass der Ladevorgang<br />
nicht automatisch durchgeführt<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 20/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
werden kann, da gewisse Parameter fehlen; dies ist bei manueller Eingabe natürlich<br />
zu erwarten.<br />
Der eigentliche Ladeschirm wird in der nebenstehenden Graphik gezeigt. Neben der<br />
Wahl der Verbindung kann lediglich ausgewählt werden, ob Informationen nach<br />
erfolgtem Laden angezeigt werden<br />
sollen – dies wird durch das Kästchen<br />
„Info after download“ ausgewählt.<br />
Fortgeschrittenere Einstellungen werden<br />
im Dialog „Settings“ vorgenommen. Hier<br />
können die Konfigurationen für die serielle<br />
Schnittstelle eingegeben werden,<br />
sowie die IP Adresse beim Laden über<br />
ein TCP/IP Netzwerk. Als drittes kann<br />
zuunterst die zu ladende Datei<br />
eingetragen werden.<br />
Wird auf dem Ladebildschirm Download<br />
gewählt, lädt der Loader das Programm<br />
über die angegebene Verbindung in den<br />
Steuerungs-PC. Ein blauer Balken zeigt<br />
den Fortschritt an. Wurde eine Ladeinfo<br />
verlangt, so wird diese nach beendetem<br />
Laden angezeigt, wie in der Graphik<br />
rechts gezeigt.<br />
Debugger<br />
Der Debugger ist quasi ein Allzweck-Werkzeug, um Programme zu debuggen und im<br />
Betrieb zu überwachen. Dazu bietet er verschiedene Funktionen, beispielsweise das<br />
Lesen des Betriebszustands und aller Register, Merker, Ein- und Ausgänge, das<br />
Setzen der Betriebsart und aller Variablen, die auch im Programm geändert werden<br />
können. Er ist im Anhang 5. 8 „Der <strong>ECCO</strong> Debugger“ beschrieben.<br />
Profiler<br />
Der Profiler ist ein Programm zur Visualisierung der Befehlsabläufe eines <strong>ECCO</strong> Anwenderprogramms<br />
in Abhängigkeit der Zeit. Es ermöglicht, die Verzahnung einzelner<br />
Befehle parallel laufender Tasks und die exakte Ausführungsdauer zu bestimmen.<br />
Damit ist der Profiler ein ideales Werkzeug zur Taktzeitoptimierung. Er ist im Anhang<br />
5. 9 „Der <strong>ECCO</strong> Profiler“ dokumentiert.<br />
3. 6. Ein minimales Programm<br />
Die Programmzeilen, welche in diesem Abschnitt gezeigt werden, zeigen das<br />
minimale Gerüst, welches ein gültiges <strong>ECCO</strong> Programm ausmacht. Dabei werden<br />
diese Deklarationen und Label verwendet, welche unter den angegebenen<br />
Seitenzahlen genauer erläutert werden:<br />
47 .ADDRESS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 21/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
49 .CODE_OFF<br />
52 .END<br />
60 .LIMITS<br />
63 .MAX_<strong>ECCO</strong><br />
64 .OWN_<strong>ECCO</strong><br />
69 .PROJECT<br />
76 .SETLABEL<br />
88 .TEXT<br />
255 BACKPGM<br />
259 HPPGM<br />
260 NRMPGM<br />
261 NSPGM<br />
262 NSRESP<br />
263 STPGM<br />
264 STRESP<br />
Das minimale <strong>ECCO</strong> Programm:<br />
.CODE_OFF 0<br />
.PROJECT 1001 ; wählbare Projektnummer<br />
.MAX_<strong>ECCO</strong> 1<br />
.OWN_<strong>ECCO</strong> 1<br />
.LIMITS <strong>ECCO</strong>1, I1001-1008 ; Steuereung & Eingänge<br />
O1001-1008, ; Ausgänge<br />
F1001-1056, ; Merker<br />
D1001-1008, ; Fehlermerker<br />
T1, ; globale Timer<br />
X1, ; Funktionen: Zeilen<br />
Y1, ; Funktionen: Spalten<br />
Z1, ; Zeitwerte<br />
S1, ; Stationen<br />
W1, ; Display-Routinen<br />
J1, ; Strings<br />
P1 ; Funktionsprozeduren<br />
.ADDRESS 0<br />
NULL:<br />
.TEXT “<strong>ECCO</strong> Minimalprogramm Version 1.00”<br />
.ADDRESS 2<br />
.ADDRESS 26<br />
.SETLABEL STRESP<br />
.SETLABEL NSRESP<br />
.SETLABEL NRMPGM<br />
.SETLABEL STPGM<br />
.SETLABEL NSPGM<br />
.SETLABEL NULL<br />
.SETLABEL NULL<br />
.SETLABEL NULL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 22/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
.SETLABEL NULL<br />
.SETLABEL HPPGM<br />
.SETLABEL BACKPGM<br />
.ADDRESS 1210<br />
BACKPGM: ; Background Programm<br />
CLOSE<br />
NSRESP: ; Notstop Restart Programm<br />
CLOSE<br />
STRESP: ; Störungs Restart Programm<br />
CLOSE<br />
STPGM: ; Störungs-Programm<br />
CLOSE<br />
NSPGM: ; Notstop Programm<br />
CLOSE<br />
NRMPGM: ; Normierungs-Programm<br />
CLOSE<br />
HPPGM: ; Hauptprogramm<br />
CLOSE<br />
.END ; immer letzte Programmzeile<br />
Jedes <strong>ECCO</strong> Programm muss mindestens diese Elemente beinhalten.<br />
Schauen wir uns nun die einzelnen Elemente und Blöcke an:<br />
Die erste Instruktion gibt einen Offset zur Relokation an und ist bei <strong>ECCO</strong> immer<br />
zwingend 0. <strong>ECCO</strong>’s Vorgänger verwendeten hier andere Werte, daher muss bei der<br />
Portierung das Argument geändert werden.<br />
Danach folgen Angaben zur kundenseitigen Projektnummer des Programms und zur<br />
Anzahl der verbundenen <strong>ECCO</strong>-Steuerungen, sowie die Adresse der Steuerung im<br />
Verbund. Da das angegebene Programm für sich alleine läuft (beziehungsweise<br />
nichts tut), sind MAX_<strong>ECCO</strong> und OWN_<strong>ECCO</strong> je 1. Wie Steuerungen verbunden werden,<br />
welche Werte dann zu verwenden sind, und worauf dann zu achten ist, wird im<br />
Abschnitt 3. 14 „Kommunikation zwischen Steuerungen“ ausführlich erklärt.<br />
Im .LIMITS-Block werden diverse Begrenzungen angegeben, welche es dem Compiler<br />
erlauben, das resultierende Programm optimal zu übersetzen.<br />
Darauf folgt die erste von vier .ADDRESS Anweisungen. Diese geben dem Compiler<br />
vor, wie das Programm aufgebaut wird und sind immer genau wie angegeben zu verwenden.<br />
Man beachte, dass in früheren Versionen andere Adress-Werte angegeben<br />
werden mussten; sie sind bei einer Portierung anzupassen.<br />
Mit dem Befehl .TEXT wird der Text angegeben, welcher beim Starten des Programms<br />
auf dem Display angezeigt wird. Üblicherweise beinhaltet der Text eine<br />
Versionsnummer, damit der Bediener sicher ist, dass die aktuellste Programmversion<br />
geladen wurde.<br />
Der Rest der Programms besteht aus zwei Teilen, welche beim Minimalprogramm<br />
fast gleich gross sind: Zuerst werden Label deklariert, danach ihre Funktion programmiert.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 23/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Die Deklaration würde es erlauben, den einzelnen Labels andere Namen zu geben.<br />
Davon wird jedoch abgeraten, da solche Programme schwer verständlich werden.<br />
Die elf .SETLABEL-Instruktionen sollten daher immer wörtlich kopiert werden.<br />
Die Funktion der einzelnen Funktionen ist im Minimalprogramm minimal. In üblichen<br />
Programmen beginnt hier die eigentliche Arbeit.<br />
3. 7. Funktionen, Tasks und Prozeduren<br />
In diesem Abschnitt wird erklärt, wie der <strong>ECCO</strong> Programmierer seine Aufgabe in<br />
mehrere kleinere Teile zerlegen kann, und welche Hilfsmittel <strong>ECCO</strong> ihm dazu bietet.<br />
Es geht also um die grossen Funktionsblöcke, nicht um die Programmierung einzelner<br />
Geräte oder um Befehle.<br />
Funktionen<br />
Wie jede halbwegs moderne Programmiersprache verfügt auch <strong>ECCO</strong> über<br />
Funktionen. Eine Funktion ist dabei ein zusammengehörender Programmblock, welcher<br />
ein bestimmtes Teil-Problem löst.<br />
Konkret können in <strong>ECCO</strong> Funktionen mit Parametern versehen werden, um Lösungen<br />
allgemein und widerverwendbar zu gestalten. Funktionen werden im Programmtask<br />
(mehr dazu weiter unten) mit CALLF gestartet und enden mit der RETF Instruktion.<br />
Sie können verschachtelt werden, so dass eine Funktion eine zweite aufrufen<br />
kann; dabei sind bis zu vier solche Verschachtelungen möglich.<br />
Funktionen müssen im .FUNCTIONS Block definiert werden. Die Definition besteht<br />
aus der Position (als Zeile und Spalte) zum Aufruf vom Terminal aus, der erwarteten<br />
Anzahl von Argumenten und einem Text zur Beschreibung der Funktion.<br />
Mit dem CALLF-Befehl werden die Argumente, wie unten beschrieben, kopiert, die<br />
Funktion gestartet und der bisherige Task deaktiviert. Sobald die Funktion beendet,<br />
also auf RETF trifft, werden die Argumente zurückkopiert (sofern sie im aufrufenden<br />
Task keine Konstanten waren) und der aufrufende Task nach dem CALLF weiter bearbeitet.<br />
Wird eine parameterlose Funktion vom Display aus gestartet, so können bis zu vier<br />
Funktionen ineinander verschachtelt werden. Im Programmablauf können mehr<br />
Funktionen verschachtelt werden, wobei jede Funktion einen freien Task benötigt.<br />
Somit beschränkt die Zahl der vorhandenen Tasks die Verschachtelung von<br />
Funktionen.<br />
Der CALLF-Befehl scheint auf den ersten Blick etwas umständlich, dies ermöglicht<br />
jedoch grossartige Möglichkeiten:<br />
CALLF #, I, O, F,<br />
D, [, ]<br />
Mit den Offset-Feldern können Eingänge, Ausgänge, Merker und Fehlermerker in<br />
den Befehlen L_INP, L_OUTP und L_JMPCOND verschoben und somit parametrisiert<br />
werden. Danach folgen die 32-bit Argumente und zuletzt die 16-bit Argumente, beide<br />
entsprechend der Funktions-Deklaration. Die Argumente werden in lokale Register<br />
kopiert, weshalb der Funktionstask bis zu 32 LV und bis zu 32 LW Register hat.<br />
<strong>ECCO</strong> bietet die ungewöhnliche, aber äusserst hilfreiche Möglichkeit, parameterlose<br />
Funktionen direkt vom Terminal aus zu starten. Damit können beispielsweise<br />
Funktionen direkt getestet werden, oder Kalibrations- oder Inbetriebnahmeroutinen in<br />
Funktionen verpackt manuell gestartet werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 24/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Funktionen können nicht von überall aufgerufen werden; dies wird nachfolgend (konkret<br />
auf Seite 26) genau dokumentiert.<br />
Tasks<br />
SPS-Steuerungen im Allgemeinen und <strong>ECCO</strong> im Speziellen sollen nicht nur eine<br />
Funktion aufs Mal erledigen, sondern mehrere. Die Lösung liegt in der Verwendung<br />
von Tasks. Ein Task ist eine Programmkette, also eine Folge von Instruktionen, welche<br />
nacheinander abgearbeitet werden. Da mehrere Tasks gleichzeitig aktiv sein<br />
können, wird so die gewünschte Parallelität erreicht.<br />
Zum Verwenden und zur Verwaltung von Tasks werden nur fünf Befehle benötigt:<br />
107 CLOSE<br />
175 OPEN<br />
230 TASK_KILL<br />
231 TASK_OPEN<br />
232 TASK_STEP<br />
Ein neuer Task wird mit dem Befehl OPEN oder TASK_OPEN eröffnet. Ein Backgroundtask<br />
kann dabei nur einen Backgroundtask, ein Programmtask nur einen Programmtask<br />
öffnen. Der aufrufende Task wird dabei nicht unterbrochen, wodurch der<br />
aufrufende und aufgerufene Task parallel und gleichzeitig arbeiten.<br />
Ein Task kann sich selber mit dem CLOSE Befehl schliessen. Gegenüber SMC42<br />
wurden in <strong>ECCO</strong> die Möglichkeiten zur Manipulation von Tasks massiv erweitert. Wie<br />
bereits erwähnt können Tasks nun auch mit TASK_OPEN geöffnet werden, ein Task<br />
kann einen weiteren mit TASK_KILL beenden (Programmierer lieben es, dies als<br />
„abschiessen“ zu bezeichnen) und die Geschwindigkeit der Ausführung kann mit<br />
TASK_STEP reduziert werden.<br />
Die Synchronisation von Tasks wird in <strong>ECCO</strong> durch Mutexes im EXCL-Befehl<br />
realisiert. In den meisten Fällen wird dies aber gar nicht benötigt, da sämtliche<br />
Schreib- und Rechenoperationen atomar sind, und durch geschickte Ausschluss-<br />
Regeln der Zugriff auf das Terminal selbstsynchronisert ist (mehr dazu im Abschnitt<br />
3. 11 „Anzeige und Eingabe“), ebenso wie Fehlermerker. Diese Ausschluss-Regeln<br />
werden üblicherweise als Priorität der Task-Gruppen bezeichnet. Das genaue<br />
Prioritäts-Diagramm ist in Anhang 5. 2 „Priorität“ abgebildet.<br />
Label<br />
<strong>ECCO</strong> verwendet Sprungmarken, so genannte Labels, um Verzweigungen und<br />
Sprünge zu ermöglichen. Jeder Anfang eines Programmblocks (also beispielsweise<br />
einer Funktion, eines Tasks oder einer Fehlermerker-Routine) verfügt über ein Label,<br />
das dem <strong>ECCO</strong> Compiler den Start angibt.<br />
Natürlich können auch innerhalb eines Programmblocks Labels verwendet werden,<br />
um innerhalb des Blocks zu verzweigen oder um den Block erst ab dem späteren<br />
Punkt auszuführen.<br />
Solche Label sind global, das heisst, dass sie von jeder Stelle des Programms<br />
ersichtlich (und erreichbar) sind. Oft will man das aber nicht; ein Label soll nur innerhalb<br />
des Programmblocks sichtbar sein, so dass der gleiche Label-Name mehrmals<br />
verwendet werden kann, was gerade bei grossen Programmen zwingend ist. <strong>ECCO</strong><br />
unterstützt lokale Labels durch die .LOCAL Anweisung.<br />
Die nachfolgende Aufzählung gibt eine Übersicht über die Labels und ihre<br />
Verwendung.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 25/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
BACKPGM<br />
ERROR_PROTOTYPE<br />
HOT_TASK/HOT_END<br />
HPPGM<br />
NRMPGM<br />
NSPGM<br />
NSRESP<br />
PROG_BEG<br />
STPGM<br />
STRESP<br />
Zwingende Labels; sie werden mit .SETLABEL vorgegeben<br />
und werden im Abschnitt 4. 4 „Label“ ausführlich beschrieben.<br />
Diese Label deklarieren die Startpunkte für standardmässig<br />
vorgegebene Funktionalität wie den Programmbetrieb,<br />
Background-Tasks oder die Behandlung von Notstop und<br />
Störung.<br />
@ Alle Label, die mit dem @-Zeichen beginnen, sind Display-<br />
Tasks.<br />
# Alle Label, die mit dem #-Zeichen beginnen, geben den Start<br />
des entsprechenden Funktionstasks an.<br />
& Alle Label, die mit dem &-Zeichen beginnen, sind Fehler-<br />
Handler, also Tasks, welche ausgeführt werden, wenn der<br />
dazugehörige Fehler-Merker hoch gesetzt wird.<br />
$ Mit dem $-Zeichen beginnen lokale Label, die nur zwischen<br />
.LOCAL Anweisungen sichtbar sind.<br />
Erlaubte Aufrufe<br />
<strong>ECCO</strong> und der <strong>ECCO</strong> Compiler überprüfen, dass Aufrufe „sinnvoll“ sind; daher gibt<br />
es gewisse Beschränkungen, in welchen Programmblöcken gewisse andere Blöcke<br />
aufgerufen werden dürfen. Die nachfolgende Tabelle zeigt diese Zusammenhänge<br />
genau.<br />
Erlaubt in Task<br />
Befehl Ruft auf PGM BG PSL Disp Fehler Func<br />
CALL Routine � �<br />
CALLD Displaytask � �<br />
CALLF Funktionstask � � � �<br />
NUM_INP (Zahleneingabe) � � �<br />
OPEN Programmtask �<br />
OPEN Backgroundtask �<br />
OUTP Fehlertask � � � � � �<br />
SET_PSL PSL-Seite � � � � �<br />
TASK_OPEN Programmtask �<br />
TASK_OPEN Backgroundtask �<br />
3. 8. Register und Merker<br />
Register sind Speicherbereiche zum Aufnehmen von Zahlen oder Zeichenketten.<br />
Demgegenüber sind Merker (und verwandte Konstrukte wie Eingänge, Ausgänge<br />
oder Fehlermerker) Wahrheitswerte, also 1-bit Werte mit den beiden Zuständen L<br />
und H. Da Zeichenketten im nächsten Abschnitt beschrieben werden, werden in<br />
diesem Abschnitt nur die Register für Zahlwerte behandelt. Registern wie Merkern ist<br />
dann gemeinsam, dass auf sie die logischen Operatoren AND, NOT, OR und XOR<br />
wirken können; bei Registern wird dabei das Ergebnis bitweise gebildet.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 26/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Numerische Register<br />
Register gibt es in verschiedenen Varianten, die sich in ihrem Einsatzgebiet und der<br />
Wortbreite unterscheiden:<br />
AV Array bestehend aus 16-bit Elementen. Bis zu 256 Arrays, je bis zu 32767<br />
Elementen. Muss im .ARRAYS Block definiert werden.<br />
AW Array bestehend aus 32-bit Elementen. Bis zu 256 Arrays, je bis zu 32767<br />
Elementen. Muss im .ARRAYS Block definiert werden.<br />
C Counter. Der Einsatz von Zählern in neuen Programmen wird nicht mehr<br />
empfohlen. Besitzt eine interne Wortbreite von 16bit.<br />
FW Fliesskomma-Konstante. Ist eine gewöhnliche Konstante, bei welcher der<br />
Dezimalpunkt um vier Stellen verschoben wurde. Wird bei .SET_CONST definiert<br />
und im Zusammenhang mit Slaves und dem PAC verwendet.<br />
KV 16bit Konstante. Es sind bis zu 512 KV Konstanten möglich, die im<br />
.SET_CONST Block definiert werden.<br />
KW 32bit Konstante. Es sind bis zu 512 KW Konstanten möglich, die im<br />
.SET_CONST Block definiert werden.<br />
LV Lokales 16-bit Register einer Display-Routine oder einer Funktion. Bis zu 32<br />
Register möglich, die genaue Anzahl hängt von der Deklaration der Funktion<br />
oder Display-Routine ab.<br />
LW Lokales 32-bit Register einer Display-Routine oder einer Funktion. Bis zu 32<br />
Register möglich, die genaue Anzahl hängt von der Deklaration der Funktion<br />
oder Display-Routine ab.<br />
RV Globale 16bit Register. Die Anzahl hängt von .LIMITS ab, höchstens jedoch<br />
32767.<br />
RW Globale 32bit Register. Die genaue Anzahl wird in .LIMITS deklariert,<br />
höchstens jedoch 32767.<br />
SR Variable Strings. Die Anzahl wird in .LIMITS festgelegt, beträgt jedoch<br />
maximal 4096.<br />
ST Konstanter String in einer Landessprache. Bis zu 2048 Strings pro Sprache<br />
möglich.<br />
SW Systemregister. Die genaue Bedeutung der einzelnen Register befindet sich<br />
im Anhang 5. 4 „Systemregister“.<br />
T Globaler Timer. Bis zu 255 möglich, wobei die Obergrenze in .LIMITS<br />
festgelegt wird.<br />
ZW Zeitwert. Die genaue Anzahl hängt von .LIMITS ab, maximal jedoch 49.<br />
Indirekte Adressierung<br />
Wenn ein Wert in einem Register abgelegt wird, so wird dieses üblicherweise bereits<br />
bei der Kompilierung festgelegt. Dieses Festlegen heisst direkte Adressierung, da die<br />
Registeradresse direkt angegeben wird. Ein Beispiel ist RV001, was das erste RV-<br />
Register angibt.<br />
Indirekte Adressierung erlaubt es hingegen, die Adresse erst zur Laufzeit festzulegen.<br />
Andere Bezeichnungen sind Referenzen oder Pointer; die Idee ist in jedem<br />
Fall, die Adresse eines Werts in einem eigenen Register abzulegen. Damit können<br />
äusserst leistungsfähige Algorithmen implementiert werden, jedoch neigen Programme<br />
mit indirekter Adressierung zur Unleserlichkeit. Ein Beispiel ist RV(RV002). Um<br />
das genaue Register zu kennen, muss zuerst der Wert von RV002 bekannt sein. Hat<br />
RV002 den Wert 1, so greift die indirekte Adressierung auf den Wert RV001 zu.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 27/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Gegenüber der direkten Adressierung zwar sicher weniger einfach zu lesen (und<br />
daher auch fehleranfälliger), da jedoch RV002 zur Laufzeit ändern kann, sind so auf<br />
einfache Art beispielsweise Typenumschaltungen realisierbar.<br />
Konkret ermöglichen RV, RW, LV, LW, SW und SR Register indirekte Adressierung. Das<br />
Adressregister ist in runden Klammern zum Registertyp zu setzen, wie in<br />
RW(LV001).<br />
Arrays<br />
Arrays, eingedeutscht manchmal auch mit „Felder“ bezeichnet, sind Gruppen aus<br />
zusammengehörigen numerischen Elementen. Beispielsweise könnte der Zustand<br />
einer Baugruppe durch 20 Werte beschrieben werden; statt also 20 RW Register zu<br />
verwenden, kann man auch ein AW Array mit 20 Elementen verwenden. Der Vorteil<br />
letzterer Methode ist, dass die Werte klarer gruppiert sind und das Programm somit<br />
lesbarer wird. Zusätzlich können Arrays auch als Ganzes kopiert werden, womit der<br />
Zustand im Beispiel sehr einfach gespeichert werden kann.<br />
Ein Array als Ganzes wird wie ein Register bezeichnet, somit ist AV001 das erste<br />
Array mit 16-Bit Elementen, AW001 das erste Array mit 32-Bit Elementen. Um auf ein<br />
einzelnes Element im Array zuzugreifen, wird dessen Position, der Index, in runden<br />
Klammern angegeben. Somit ist AV001(002) das zweite Element (mit 16-Bit Wortbreite)<br />
aus dem Array AV001. Bei Arrays stellen die runden Klammern somit keine<br />
indirekte Adressierung dar, sondern verweisen auf das Element im Array, welches<br />
aber indirekt angegeben sein kann.<br />
Deklaration von Registern<br />
Grundsätzlich müssen Register nicht deklariert werden, viele Zusatzprogramme zu<br />
<strong>ECCO</strong> ermöglichen es jedoch, zusätzliche Informationen (wie die Bedeutung oder<br />
die Funktion des Registers) auszugeben, wenn das Register zuvor im .IO_TEXT<br />
Block als Kommentar deklariert wurde. Weitere Informationen dazu finden sich bei<br />
den Erläuterungen zu .IO_TEXT Block ab Seite 57.<br />
Merker – Eingänge, Ausgänge, Merker, Fehlermerker<br />
Merker gibt es in vier Varianten, und zwar E oder I für Eingänge, A oder O für Ausgänge,<br />
F oder M für Merker, und D für Fehlermerker. Zum Setzen (bei Eingängen<br />
natürlich nicht möglich) wird der Befehl OUTP verwendet. So werden mit<br />
OUTP M100 H, A100 L<br />
der Merker M100 hoch-, und der Ausgang A100 tiefgesetzt.<br />
Sind Merker oder Fehlermerker deklariert, so müssen die NSDEF- und STDEF-<br />
Bedingungen angegeben werden.<br />
Eine nützliche Besonderheit von <strong>ECCO</strong> sind Fehlermerker. Fehlermerker sind<br />
Merker (also 1bit Speichern mit den beiden Zuständen L und H) mit dazugehörender<br />
Handler-Funktion. Wird ein Fehlermerker gesetzt, so startet die <strong>ECCO</strong> Laufzeit-<br />
Umgebung den dazugehörenden Handler. <strong>ECCO</strong>’s Prioritätsmodell garantiert dabei<br />
die notwendige Exklusivität. Konkret heisst das:<br />
1. Ist bereits ein Fehlertask aktiv, so wird der neue solange verzögert, bis der alte<br />
beendet. Es ist somit immer höchstens ein Fehlertask aktiv.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 28/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
2. Ein Fehlertask wird nur vom Notstop unterbrochen. Im normalen Betrieb ist<br />
somit Ununterbrechbarkeit garantiert.<br />
3. Mit dem Starten des Fehlertasks wird der Displaytask sofern vorhanden unterbrochen,<br />
dieser wird nach dem Beenden des Fehlertasks wieder neu (von Anfang<br />
an) gestartet.<br />
4. Ist beim Starten des Fehlertasks kein Displaytask aktiv, so wird die aktive PLS-<br />
Seite eingefroren, das heisst, die Seite wird unterbrochen und nach Beenden<br />
des Fehlertasks wieder von Vorne gestartet.<br />
5. Der Fehlertask läuft parallel zu den übrigen Tasks und Background-Tasks.<br />
6. Der Fehlermerker bleibt bis zum Beenden des Fehlertasks hoch. Mit dem Beenden<br />
geht er tief. Ein Task kann somit das Beenden des Fehlertasks abwarten,<br />
indem er den Fehlermerker mit INP überprüft.<br />
7. Ruft ein Fehlertask einen weiteren auf, so wird der erst dann ausgeführt, wenn<br />
der erste beendet hat.<br />
8. Der Fehlertask schliesst mit RETE. Damit werden die oben beschriebenen<br />
Restaurationen vorgenommen.<br />
Fehlermerker werden im .IO_TEXT Block deklariert. Dort wird auch das Label für<br />
den Fehler-Handler angegeben.<br />
3. 9. Arbeiten mit Strings<br />
Strings, auch Zeichenketten genannt, sind genau das: Objekte, um Texte einfach<br />
und bequem zu verwenden. <strong>ECCO</strong> unterstützt folgende String-Operationen:<br />
57 .IO_TEXT / .END_IO_TEXT<br />
85 .STRING_REG / .END_STRING_REG<br />
86 .STRINGS / .END_STRINGS<br />
166 LEN_STR<br />
167 MID_STR<br />
201 SEND_SR<br />
202 SET_LANG<br />
208 SLV_RCV_STR<br />
209 SLV_SND_STR<br />
210 SMOV<br />
217 STR_ADD<br />
218 STR_ADD_ASCII<br />
220 STR_ADD_NR<br />
221 STR_TO_ASCII<br />
222 STR_TREAT<br />
223 STR_VAL<br />
Selbstverständlich unterstützen auch alle Display-Befehle (wie WRITE) Strings.<br />
In <strong>ECCO</strong> gibt es konstante Strings, welche zur Laufzeit nicht verändert werden<br />
können und entweder bei den Instruktionen direkt mit Anführungszeichen begrenzt<br />
sind oder in einem ST Register enthalten sind. Demgegenüber können variable<br />
Strings, welche immer in einem SR Register gespeichert werden, zur Laufzeit<br />
verändert werden, um beispielsweise mehrsprachige Anzeigen oder komplexe<br />
Ausgaben zu erleichtern.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 29/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Benannte konstante Strings werden im .STRINGS Block länderspezifisch definiert.<br />
Im nachfolgenden Beispiel werden so zwei konstante Strings benannt, welche in<br />
diesem Abschnitt bei den weiteren Beispielen verwendet werden.<br />
.STRINGS GER<br />
ST001 = “Hallo ”<br />
ST002 = “Welt”<br />
.END_STRINGS<br />
Variable Strings, welche für die Ausgabe eines Datums, einer Uhrzeit oder eines<br />
Registers verwendet werden sollen, müssen deklariert werden. Dadurch wird eine Art<br />
Typenprüfung für die Ausgabefunktionen realisiert. Auch hier wieder ein Beispiel:<br />
.STRING_REG<br />
SR100-109=D ; 10 variable Datum-Strings<br />
SR110-119=T ; 10 variable Zeit-Strings<br />
SR120-129=R ; 10 var. Register-Strings<br />
.END_STRING_REG<br />
Variable Strings können, wie ihr Name schon ausdrückt, verändert werden.<br />
Einerseits Nachrichten ausgetauscht werden mit Slaves oder anderen Steuerungen,<br />
andererseits können zur Laufzeit neue Texte verfasst werden. Im Gegensatz zu<br />
konstanten Strings können sie indirekt adressiert werden.<br />
Das Austauschen von Strings mit den Befehlen SEND_SR, SLV_RCV_STR und<br />
SLV_SND_STR wird ausführlich im Abschnitt 3. 14 „Kommunikation“ behandelt.<br />
Das Verfassen eigener Strings ist in <strong>ECCO</strong> ganz einfach und wird nachfolgend erläutert.<br />
Mit dem SMOV Befehl werden andere Strings, mit Anführungszeichen begrenzte<br />
Texte oder die bezeichnenden Texte eines Eingangs, Ausgangs, Merkers<br />
oder Fehlermerkers zugewiesen. Die bezeichnenden Texte wurden zuvor im<br />
.IO_TEXT Block definiert. Dabei wird auch die Mehrsprachigkeit beachtet, wie sie im<br />
Abschnitt 3. 13 „Internationalisierung“ genauer erläutert wird.<br />
Die Befehle STR_ADD, STR_ADD_ASCII und STR_ADD_NR führen einem bestehenden<br />
variablen String weitere Teile hinzu. Diese Befehle lassen sich am Besten mit<br />
einem Beispiel aufzeigen:<br />
MOV RV001, 69 ; ASCII-Zeichen ‘E’<br />
SMOV SR001, “” ; lösche SR001<br />
STR_ADD SR001, “Signal ” ; Text nun “Signal ”<br />
STR_ADD_ASCII SR001, RV001 ; Text nun “Signal E”<br />
STR_ADD_NR SR001, 3, RV001 ; Text nun “Signal E069”<br />
STR_ADD SR001, “-2.” ; Text nun “Signal E069-2.”<br />
Das mittlere Argument der STR_ADD_NR Instruktion gibt also die Anzahl der Stellen<br />
an. Die verwendete Zeichensatztabelle des STR_ADD_ASCII Befehls findet sich bei<br />
diesem Befehl ab Seite 218.<br />
Mit den Befehlen LEN_STR, MID_STR, STR_TO_ASCII und STR_VAL können<br />
eingelesene Strings analysiert und auseinander genommen werden. LEN_STR gibt<br />
die Länge des Strings, also die Anzahl der Zeichen im String zurück. Mit<br />
STR_TO_ASCII kann ein einzelnes ASCII-Zeichen ausgelesen werden, während<br />
STR_VAL versucht, aus dem Anfang des Strings eine Zahl einzulesen. Mit MID_STR<br />
kann ein Teil aus einem String ausgeschnitten werden; so kann beispielsweise ein<br />
anzuzeigender Text aus einer empfangenen Nachricht genommen werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 30/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
3. 10. Ein- und Ausgänge<br />
<strong>ECCO</strong> dient zur Steuerung von grösseren und grossen Anlagen zur automatischen<br />
Fertigung, daher ist die erste und einfachste Funktionalität das Lesen und Setzen<br />
von Ein- und Ausgängen. Im Abschnitt 3. 8 „Register und Merker“ wurden Ein- und<br />
Ausgänge bereits kurz erwähnt, in diesem Abschnitt wird nun genauer darauf eingegangen<br />
und gezeigt, wie Ein- und Ausgänge konkret gelesen und geschrieben<br />
werden.<br />
Es können die gleichen Befehle zum Lesen, Ändern und Schreiben von Merkern,<br />
Fehlermerkern, Ein- und Ausgängen verwendet werden. Abhängig von der genauen<br />
Art werden dabei natürlich unterschiedliche Ergebnisse erzielt, also nur beim<br />
Schreiben eines Ausgangs auch tatsächlich ein Ausgang geschrieben, und somit<br />
beispielsweise ein Ventil geöffnet.<br />
Mit dem OUTP Befehl wird geschrieben; natürlich geht das bei Eingängen nicht, da ja<br />
dort der Sensor oder sonst eine externe Komponente den logischen Wert vorgibt.<br />
Wird ein Fehlermerker hoch gesetzt, so startet der dazugehörige Fehlerhandler, bei<br />
dessen Ende der Fehlermerker wieder tief gesetzt wird.<br />
Soll der Programmablauf solange verzögert werden, bis alle angegebenen Merker<br />
das angegebene Niveau erreicht haben, wird dazu der INP Befehl verwendet. Der<br />
Programmierer muss dabei vorsichtig sein, dass die Bedingungen auch tatsächlich je<br />
erfüllt werden, da sonst das Programm stehen bleibt. Somit blockiert<br />
INP E100 H, E100 L<br />
da ein Eingang niemals gleichzeitig hoch und tief sein kann!<br />
Soll nicht gewartet, sondern je nach Zustand verzweigt werden, so kann dazu der<br />
JMPCOND Befehl verwendet werden. So verzweigt das Beispiel<br />
JMPCOND E100 H, $E100H<br />
nur dann zum lokalen Label $E100H, wenn der Eingang hoch ist. Sonst, also wenn<br />
der Eingang tief ist, fällt das Programm durch und fährt auf der nächsten Zeile weiter.<br />
Mit dem TINP Befehl kann der „gewöhnliche“ INP Befehl überwacht werden, so dass<br />
nach einer gewissen (vom Programmierer frei wählbaren) Zeit eine Fehlerroutine<br />
ausgelöst wird, die beispielsweise dem Bediener angibt, warum die Anlage still steht.<br />
Profibus DP<br />
<strong>ECCO</strong> unterstützt Profibus DP, das heisst Ein- und Ausgänge können von <strong>ECCO</strong><br />
über Profibus angesteuert werden. Die von <strong>ECCO</strong> dazu benötigten Informationen<br />
werden aus dem .PROFIBUS_DEF Block entnommen. Somit steht im <strong>ECCO</strong><br />
Programm ein zentraler Ort zur Konfiguration des Busses und der einzelnen<br />
Komponenten zur Verfügung.<br />
Der Profibus wird mit dem BUS_ON Befehl aktiviert und mit dem BUS_OFF Befehl<br />
deaktiviert. Dabei wird jedesmal der <strong>ECCO</strong> Lizenz Dongle kontrolliert, um sicher zu<br />
stellen, dass die Rechte zur Benutzung von Profibus auch tatsächlich vorliegen.<br />
Es wird empfohlen, Profibus Master-Karten mit Watchdog-Funktion zu verwenden,<br />
beispielsweise Modelle der Firma Hilscher, da damit ein sicheres Anhalten der<br />
Anlage auch bei einem Absturz von <strong>ECCO</strong> oder dem Betriebssystem gewährleistet<br />
bleibt.<br />
Neben Ein- und Ausgängen können über Profibus können auch „intelligente“<br />
Teilnehmer wie Messsensoren, IDEX Schreib-/Leseeinheiten und natürlich der PAC<br />
gesteuert werden. Alle so angeschlossenen Teilnehmer haben eine Stationsadresse,<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 31/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
die zwischen 0 und 125 liegen darf. Diese Adresse muss an der Station eingestellt<br />
werden, beispielsweise softwaretechnisch oder mit Schaltern erfolgen. Jede Station<br />
belegt einen bestimmten Adressbereich. Dabei dürfen sich die verschiedenen<br />
Adressbereiche nicht überschneiden; um die Zykluszeiten minimal zu halten, ist es<br />
ratsam, die Adressen möglichst lückenlos aneinander zu reihen.<br />
<strong>ECCO</strong> unterstützt bis zu vier Profibus Master in einer Steuerung.<br />
CPLink<br />
<strong>ECCO</strong> wird oft auf Beckhoff Industrie-PC’s eingesetzt. Diese können ein abgesetztes<br />
Panel haben, welches über zwei maximal 100m lange Kabel mit dem Rechner verbunden<br />
ist. Diese Kabel übertragen nicht nur Energie zur Speisung und Video- und<br />
Tastatursignal, sondern können auch die Signale von angeschlossenen Tasten übermitteln.<br />
Das Protokoll, das all dies ermöglicht, heisst CPLink.<br />
<strong>ECCO</strong> unterstützt CPLink, um die Tasten anzusteuern, die sich am Panel befinden.<br />
Dazu werden die Tasten in der .CPLINK_MAP_DEF Deklaration einzelnen Ein- und<br />
Ausgängen zugeordnet. Neben den Treibern der CPLink-Karte muss Beckhoff Twin-<br />
Cat CP parallel laufen, damit <strong>ECCO</strong> die Tasten korrekt ansprechen kann. Es werden<br />
bis zu drei CPLink-Karten unterstützt.<br />
Dongle & Lizenz<br />
In den industriellen Umgebungen, in denen <strong>ECCO</strong> eingesetzt wird, gibt es wenig<br />
Sinn, Software „pro PC“ zu lizenzieren: Ob sich eine Software auf einem PC befindet<br />
oder nicht, sollten nicht Lizenzfragen sondern die Anforderungen des Einsatzes entscheiden.<br />
Die <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> hat sich daher für einen ungewöhnlich kundenfreundlichen<br />
Weg entschieden: Die <strong>ECCO</strong> Software ist frei verfügbar, wird jedoch<br />
durch einen Dongle geschützt. Somit können <strong>ECCO</strong> und die dazugehörenden Tools<br />
auf beliebig vielen Rechnern installiert werden, der industrielle Einsatz wird jedoch<br />
physikalisch durch den Dongle begrenzt.<br />
Sobald <strong>ECCO</strong> auf einen Profibus oder CPLink zugreifen soll, überprüft es, ob durch<br />
den Dongle die nötigen Rechte vorhanden sind. Nur dann wird der Zugriff ausgeführt.<br />
Zu jedem Dongle gibt es eine Lizenzdatei namens license.key, das zu diesem<br />
physikalischen Dongle gehört, das heisst, sie können nicht untereinander vertauscht<br />
werden. Das Lizenzfile muss im selben Verzeichnis wie <strong>ECCO</strong> installiert werden.<br />
3. 11. Anzeige und Eingabe<br />
Folgende Befehle können zur schwarz-weiss Ausgabe auf dem Display verwendet<br />
werden:<br />
113 DATEDISP<br />
132 HP_DATEDISP<br />
139 HP_REGDISP<br />
140 HP_TIMEDISP<br />
142 HP_WRITE<br />
187 REGDISP<br />
230 TIMEDISP<br />
251 WRITE<br />
Zusätzlich dienen eine ganze Reihe weiterer Befehle zur farbigen Ausgabe auf dem<br />
Display:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 32/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
106 CDATEDISP<br />
113 CREGDISP<br />
115 CTIMEDISP<br />
116 CWRITE<br />
129 HP_CDATEDISP<br />
132 HP_CREGDISP<br />
134 HP_CTIMEDISP<br />
136 HP_CWRITE<br />
Zuletzt existiert noch ein Befehl zur Eingabe vom Display. Dieser Befehl ist:<br />
173 NUM_INP<br />
Letztlich kann mit den folgenden Befehlen der Bildschirm (oder Teile davon) gelöscht<br />
werden:<br />
109 CLS<br />
110 CLS_WIN<br />
131 HP_CLS_WIN<br />
Auf den ersten Blick scheint dies eine unübersichtliche Fülle von Befehlen zu sein;<br />
20 Befehle, welche sich nur mit dem Display beschäftigen, wie soll da der Programmierer<br />
den Überblick behalten?<br />
Doch ganz so schwierig ist die Sache nun auch wieder nicht. Die zentrale Erkenntnis<br />
ist, dass es eigentlich nur vier Ausgabe-Befehle gibt, welche jeweils vier Varianten<br />
auftreten.<br />
Die vier Befehle sind:<br />
DATEDISP Gib ein Datum aus REGDISP Gib ein Register aus<br />
TIMEDISP Gib eine Uhrzeit aus WRITE Schreibe einen String<br />
Die vier Varianten (als Präfix zum Befehl) sind:<br />
Niederprioritär einfarbig C Niederprioritär farbig<br />
HP_ Hochprioritär einfarbig HP_C Hochprioritär farbig<br />
Mit dieser Aufteilung kann nun jeder der 16 Ausgabe-Befehle zerlegt und einfach<br />
analysiert werden. So bedeutet beispielsweise HP_CWRITE „Schreibe hochprioritär<br />
und in Farbe einen String auf das Display“.<br />
Um zu verstehen, wozu hochprioritäre Ausgabebefehle verwendet werden, muss<br />
<strong>ECCO</strong>’s Prioritäten-Modell betrachtet werden. Im Abschnitt 5. 2 „Priorität“ wird dieses<br />
im Detail vorgestellt. Hier werden lediglich die für die Ein- und Ausgabe relevanten<br />
Punkte aufgezeigt.<br />
In <strong>ECCO</strong> können grundsätzlich mehrere, von einander unabhängige Tasks gleichzeitig<br />
laufen. Da es jedoch nur einen Display gibt, stellt dieser eine gemeinsame<br />
Ressource dar; die verschiedenen Tasks können nicht nach belieben darauf zugreifen,<br />
sondern müssen sich untereinander absprechen, man spricht von synchronisieren.<br />
Dies wird zum grössten Teil von der <strong>ECCO</strong> Laufzeit-Umgebung erledigt, der<br />
Programmierer muss lediglich die zur Verfügung gestellten Funktionen korrekt<br />
verwenden.<br />
Da zu jedem Zeitpunkt jeweils nur ein Task auf den Display zugreifen darf, existieren<br />
mehrere spezielle Tasks für den Display-Zugriff, von denen jeweils genau einer aktiv<br />
ist und somit auf den Display zugreifen darf.<br />
Es können mehrere PSL-Tasks ausprogrammiert werden, von denen höchstens<br />
einer auf ein mal aktiv ist. Ein PSL-Task dient dazu, Prozessinformationen<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 33/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
anzuzeigen; der Benutzer kann auswählen, welche Informationen das im Detail sind.<br />
Man spricht daher auch von PSL-Seiten. Der ausgewählte PSL-Task ist nur dann<br />
aktiv, wenn kein Display- oder Fehler-Task aktiv ist.<br />
Display-Tasks haben eine höhere Priorität als PSL-Tasks und dienen vorwiegend<br />
dazu, Werte und Einstellungen vom Maschinen-Operator abzufragen. Es kann nur<br />
ein Display-Task aufs Mal aktiv sein. Normale Programmtasks können Display-Tasks<br />
aufrufen, die <strong>ECCO</strong> Laufzeit-Umgebung sorgt für die nötige Synchronisation. Ist zum<br />
Zeitpunkt des Aufrufs ein Fehler- oder anderer Display-Task aktiv, so wird die<br />
Ausführung verzögert, bis dem nicht mehr so ist. Sonst kann der Display-Task<br />
beginnen und der gerade aktive PSL-Task wird unterbrochen. Nach dem Ende des<br />
Display-Tasks wird dieser PSL-Task wieder von Anfang an abgearbeitet.<br />
Noch höhere Priorität haben Fehlertasks, die, wie der Name andeutet, Fehler<br />
behandeln. Wie bei Display-Tasks ist jeweils höchstens ein Fehlertask aufs Mal aktiv.<br />
Ein aktiver Fehlertask unterbricht Display- und PSL-Task und lässt diese nach<br />
seinem Ende wieder von Anfang an beginnen.<br />
Diese Regeln gewährleisten einen vollständigen und wohldefinierten Bildschirm-<br />
Aufbau; dieser wird durch die niederprioritären Display-Befehle realisiert. Nun<br />
existieren jedoch Situationen, in denen ein Programmierer die Umgehung dieser<br />
Ordnung wünscht: in einem solchen Fall kann er auf die hochprioritären Ausgabe-<br />
Befehle zurückgreifen, die in jedem Fall angezeigt werden.<br />
PSL-Seiten werden mit . angegeben, was dem Bediener<br />
ermöglicht, mit den Pfeiltasten zwischen den einzelnen PSL-Seiten zu navigieren.<br />
Eine spezielle Position nimmt die Seite 0.0 ein: Diese Seite wird immer beim Start<br />
automatisch aktiviert, wenn noch keine Pfeiltaste betätigt wurde. Genauere Informationen<br />
befindet sich beim Beschrieb von .PSL / .END_PSL.<br />
Der NUM_INP Befehl kann neben Displaytasks auch in Fehler- und normalen<br />
Programmtasks verwendet werden; davon wird jedoch abgeraten, da die Programme<br />
unleserlich werden. Die Abfrage von Werten sollte Displaytasks vorbehalten bleiben.<br />
3. 12. Flusskontrolle<br />
Ein typisches Programm soll nicht nur irgend etwas tun, sondern soll vor Allem auf<br />
seine Umgebung reagieren können. Wie in den meisten Programmiersprachen wird<br />
das auch in <strong>ECCO</strong> durch Flusskontrolle realisiert, also Befehle, die bestimmen,<br />
welche Befehle als nächstes ausgeführt werden; im Speziellen Bedingungen und<br />
deterministische Schlaufen und zusätzlich Überwachung.<br />
In diesem Abschnitt werden zuerst kurz die Befehle für strukturierte und unstrukturierte<br />
Bedingungen und Schlaufen aufgelistet. Dies ist aus zwei Gründen bewusst<br />
kurz gehalten, einerseits weil jeder Programmierer diese Konzepte bereits kennt und<br />
daher nicht mehr erläutert braucht, andererseits weil die Befehle in der Referenz<br />
nochmals ausführlich erklärt werden.<br />
Die Überwachung wird ausführlich erklärt, da dieses Konzept weniger bekannt ist.<br />
Strukturierte Bedingungen<br />
Eine strukturierte Bedingung ist eine Bedingung, wie sie für strukturierte Programmierung<br />
verwendet wird. Sie zeichnet sich dadurch aus, dass keine Label verwendet<br />
werden müssen, da die Blöcke, welche durch die Bedingung ausgewählt werden,<br />
vom strukturierten Befehl abgrenzt werden. <strong>ECCO</strong> kennt vier Befehle für strukturierte<br />
Bedingungen.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 34/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
118 DO / DO_WHILE / DO_WHILENOT<br />
149 IF / IFNOT / ELSE / END_IF<br />
165 L_SWITCH / CASE / DEFAULT / END_SWITCH<br />
229 SWITCH / CASE / DEFAULT / END_SWITCH<br />
248 WHILE / WHILENOT / END_WHILE<br />
Unstrukturierte Bedingungen und Sprungbefehl<br />
Neben den Befehlen zur strukturierten Programmierung kennt <strong>ECCO</strong> noch die etwas<br />
„altmodischeren“ unstrukturierten Befehle. Bei diesen liegt es am Programmierer, die<br />
Struktur des Programms durch Label deutlich zu machen. Es sind so gesehen<br />
Sprungbefehle, bei denen der Sprung bei erfüllter Bedingung ausgeführt wird. Daher<br />
wird auch der gewöhnliche, „bedingungslose“ Sprungbefehl hier aufgeführt.<br />
154 JMPCOND<br />
155 JMPTIM<br />
156 JPBIT<br />
157 JPEQ<br />
158 JPGT<br />
159 JPLT<br />
160 JUMP<br />
163 L_JMPCOND<br />
Überwachung<br />
Überwachung ist ein Konzept, welches sich in den wenigsten Programmiersprachen<br />
findet. Daher sei es hier etwas ausführlicher erläutert.<br />
Oftmals will man sicherstellen, dass einige Programmzeilen, welche zusammen eine<br />
logische Funktion bilden, überwacht werden, also sofort abgebrochen werden, wenn<br />
eine Bedingung erfüllt ist. In den meisten Programmiersprachen müsste dazu jeder<br />
Befehl einzeln überwacht werden, was einen bedeutsamen Arbeitsaufwand darstellt<br />
und das resultierende Programm unleserlich macht. Da <strong>ECCO</strong> jedoch Befehle zur<br />
Überwachung bereitstellt, ist das einfach umzusetzen.<br />
Ein einfaches Beispiel soll den Vorteil aufzeigen: Zum Transport eines Werkstücks<br />
sollen drei Zylinder nacheinander geschaltet werden. So weit, so einfach. Tritt<br />
jedoch zu irgendeinem Zeitpunkt ein Fehler an der pneumatischen Versorgung auf,<br />
so muss die Bewegung stoppen und auf eine bestimmte Art behandelt werden. Ist<br />
der Weg versperrt, so muss das auf eine andere Art behandelt werden. Dauert das<br />
Fahren zu lange, so ist eine dritte Behandlung anzuwenden.<br />
Offensichtlich ist das nicht mehr so einfach. Damit der Programmieraufwand jedoch<br />
begrenzt und die Programmstruktur ersichtlich bleibt, bietet <strong>ECCO</strong> genau für solche<br />
Probleme zwei Befehle:<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
234 TINP<br />
Zusätzlich werden veraltete (und leistungsschwächere) Überwachungsbefehle weiter<br />
unterstützt, sollten aber in neuen Programmen nicht länger verwendet werden.<br />
Überwachungen dürfen nicht verschachtelt werden und keine Ketten aufrufen.<br />
Sprünge sind nur innerhalb des überwachten Bereichs erlaubt. Das bedeutet, dass<br />
innerhalb einer Überwachung die folgenden Befehle immer verboten sind:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 35/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
101 CALL<br />
102 CALLD<br />
104 CALLF<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
189 RET<br />
190 RETD<br />
191 RETE<br />
192 RETF<br />
275 TIMETRAP / END_TIMETRAP<br />
234 TINP<br />
276 TRAP / IF_TRAP / END_TIMETRAP<br />
3. 13. Internationalisierung<br />
<strong>ECCO</strong> Steuerungen werden in die ganze Welt geliefert – vielleicht mit Ausnahme der<br />
Antarktika. Daher ist der Wunsch, verschiedene Sprachen unterstützen zu können,<br />
besonders gross. In <strong>ECCO</strong> wird dies sehr einfach erreicht, indem Strings sprachspezifisch<br />
programmiert werden können, und im Betrieb zwischen den einzelnen<br />
Sprachen umgeschaltet werden kann. In diesem Abschnitt wird erklärt, wie die<br />
Internationalisierung erreicht wird, und worauf der Programmierer dabei achten<br />
muss.<br />
Um ein SPS-Programm für mehrere Sprachen zu erstellen, müssen zuerst folgende<br />
Deklarationen internationalisiert werden:<br />
55 .FUNCTIONS / .FUNC_END<br />
57 .IO_TEXT / .END_IO_TEXT<br />
59 .LANGU<strong>AG</strong>ES<br />
79 .STATIONS / STATION / .END_STATIONS<br />
80 .STATISTIC / GROUP / .END_STATISTIC<br />
84 .STOP_IO_TEXT<br />
86 .STRINGS / .END_STRINS<br />
92 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
Zuerst müssen die verwendeten Sprachen mit der .LANGU<strong>AG</strong>ES Deklaration festgelegt<br />
werden. Die übrigen Deklarationen sind wie gewöhnlich nicht zwingend; werden<br />
sie jedoch verwendet, so muss für jede Sprache ein Deklarationsblock vorhanden<br />
sein. Dazu wird jeweils im Kopf die Sprache für den Rest angegeben, also beispielsweise:<br />
.LANGU<strong>AG</strong>ES GER, ENG<br />
.STRINGS GER<br />
ST001 = “Dies ist eine Zeichenkette”<br />
ST002 = “Mehr Text”<br />
.END_STRINGS<br />
.STRINGS ENG<br />
ST001 = “This is a string”<br />
ST002 = “Additional text”<br />
.END_STRINGS<br />
Zwischen den einzelnen Sprachen wird mit dem SET_LANG Befehl umgeschaltet:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 36/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
202 SET_LANG<br />
Der Programmierer muss bei der Internationalisierung darauf achten, keine direkten<br />
Strings (also mit Anführungszeichen begrenzte Zeichenketten) auszugeben, da diese<br />
natürlich nicht übersetzt werden können. Bei allen Display-Befehlen sollten daher<br />
konstante oder dynamische Strings verwendet werden.<br />
Die <strong>ECCO</strong> Laufzeit-Umgebung sorgt dafür, dass alle benutzerprogrammierten<br />
Fehler- und Systemmeldungen in der aktuellen Sprache angezeigt werden.<br />
3. 14. Kommunikation zwischen Steuerungen<br />
Wie bereits mehrfach erwähnt entfaltet <strong>ECCO</strong> seine volle Stärke bei der Steuerung<br />
grosser und hochkomplexer Anlagen der Automatisierung. Oft sind solche Anlagen<br />
jedoch so gross, dass der Wunsch nach mehreren unabhängig betriebener Steuerungen<br />
besteht. <strong>ECCO</strong> unterstützt dies, indem es Möglichkeiten zur Kommunikation<br />
zwischen solchen Steuerungen anbietet.<br />
Zur Kommunikation dienen folgende Deklarationen und Befehle:<br />
60 .LIMITS<br />
63 .MAX_<strong>ECCO</strong><br />
64 .OWN_<strong>ECCO</strong><br />
91 .UNLOCK / .END_UNLOCK<br />
198 SEND_IO<br />
200 SEND_REG<br />
201 SEND_SR<br />
250 WR_TIME<br />
<strong>ECCO</strong> verlangt nur einige wenige Deklarationen, um mit verbundenen Steuerungen<br />
kommunizieren zu können. Die IP Adresse wird im <strong>ECCO</strong> Konfigurator gewählt, so<br />
dass Adress-Änderungen keine Anpassungen des <strong>ECCO</strong> Programms benötigen.<br />
Zuerst müssen die Anzahl der verbundenen Steuerungen und die eigene Adresse im<br />
Verbund angegeben werden: .MAX_<strong>ECCO</strong> für die Zahl der Steuerungen, .OWN_<strong>ECCO</strong><br />
für die eigene Adresse.<br />
Mit der .LIMITS Deklaration werden die Eigenschaften der verbundenen Steuerung<br />
angegeben. Dabei muss nur ein reduzierter Block angegeben werden, wie dies im<br />
Beschrieb zum .LIMITS Deklaration erläutert wird.<br />
Zuletzt müssen die Elemente angegeben werden, auf welche fremde Steuerungen<br />
zugreifen dürfen. Dazu dient der .UNLOCK Block. Alle anderen (also alle nicht angegebenen)<br />
Elemente sind so automatisch vor dem Überschreiben geschützt.<br />
Zur eigentlichen Kommunikation muss eine Konvention beachtet werden: Jede<br />
Steuerung kann bis zu 999 Eingänge und 999 Ausgänge haben. Die Steuerung, auf<br />
welche sich der Ein- oder Ausgang bezieht, wird mit dem Tausender angegeben,<br />
wobei bei der eigenen, lokalen Steuerung der Tausender fehlt. Somit ist A201 der<br />
eigene Ausgang 201, A2201 der Ausgang 201 der verbundenen Steuerung 2.<br />
Mit den Befehlen SEND_IO, SEND_REG und SEND_SR können die entsprechenden<br />
Elemente in eine fremde Steuerung geschrieben werden. Zusätzlich kann mit<br />
WR_TIME die Zeit (also die Computer-Uhr) synchronisiert werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 37/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
3. 15. Statistik und ZPoint<br />
Unter dem Begriff Statistik wird von <strong>ECCO</strong>-Programmierern und -Anwendern<br />
typischerweise mehr als die reine Datenerfassung und -Auswertung verstanden.<br />
Auch Maschinenparametrierung und Anbindung an eine ERP-Lösung wird unter den<br />
Begriff Statistik gepackt. In diesem Abschnitt wird der Begriff Statistik ebenso breit<br />
verstanden, um die Sprechweise der Kunden beizubehalten.<br />
<strong>ECCO</strong> unterstützt zwei solcher Statistik-Programme. Einerseits das von der <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong> entwickelte und für <strong>ECCO</strong> optimierte StatREAD, andererseits ZPoint,<br />
welches von der Firma AMS Engineering entwickelt und vertrieben wird.<br />
StatREAD<br />
Die StatREAD Toolsuite zeichnet sich durch einfache Bedienung und hohe<br />
Verständlichkeit aus. Durch diese Werkzeuge wird ein frei wählbarer PC zum<br />
Maschinenleitstand, der die <strong>ECCO</strong> Steuerung parametrisieren kann und Messwerte<br />
und Schichtdaten dem Benutzer graphisch anzeigen kann.<br />
Für weitere Informationen sei auf die Dokumentation verwiesen:<br />
[6] STATREAD – User’s Guide, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.26, 1997.<br />
[7] STATREAD + STATCALC – Configuration and Technical Documentation,<br />
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.26, 1997.<br />
ZPoint<br />
ZPoint fungiert als Schnittstelle zwischen der ERP-Software und dem <strong>ECCO</strong><br />
Maschinenprogramm. Ähnlich wie StatREAD können der Maschinenzustand und<br />
Auftragsdaten verwaltet werden, daneben bietet ZPoint insbesondere Analyse-,<br />
Optimierungs- und Verwaltungsfunktionalität, um auch einen grossen Maschinenpark<br />
effizient und automatisch verwalten zu können.<br />
Durch die höhere Flexibilität von ZPoint ist es wesentlich schwieriger zu Bedienen als<br />
StatREAD und benötigt daneben wesentlich mehr Informationen aus dem <strong>ECCO</strong><br />
Programm, wodurch der Programmieraufwand massiv steigt. Daher sollte der Einsatz<br />
von ZPoint nur gemeinsam mit einem ZPoint System Integrator vorgenommen<br />
werden.<br />
Gateway und der Gateway Administrator<br />
Zum Anbinden von ZPoint an <strong>ECCO</strong> wird ein Gateway verwendet. Früher war das<br />
eine eigene Karte, heute ist das ein Software-Modul der <strong>ECCO</strong> Laufzeitumgebung.<br />
Dieser Gateway wird von <strong>ECCO</strong> mit Daten beschrieben und stellt diese ZPoint<br />
asynchron zur Verfügung, so dass die Taktzeit durch ZPoint nicht unnötig<br />
beeinträchtigt wird.<br />
Mit Hilfe des Gateway Administrator Werkzeugs können sowohl alte SMC42<br />
Gateways als auch der <strong>ECCO</strong> Gateway verwaltet werden.<br />
Nach dem Starten mit GwyAdmin<br />
erscheint eine Seite mit mehrheitlich<br />
deaktivierten Schaltflächen. Mit der<br />
Schaltfläche „Cancel“ wird das Tool<br />
beendet; mit „File import“ eine ZPoint<br />
Konfiguration (eine Datei namens<br />
export., wobei eine<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 38/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Landessprache darstellt) geladen;<br />
nach Eingabe einer IP Adresse wird<br />
das Tool mittels „Connect“ mit dem<br />
Gateway verbunden. Dabei wird auch<br />
die Konfiguration mit dem Gateway<br />
abgeglichen und mit einer Meldung<br />
quittiert.<br />
Nun sind alle Schaltflächen<br />
verfügbar, zusätzlich werden<br />
Informationen zum Gateway<br />
angezeigt. Die Schaltfläche „Config<br />
compare“ vergleicht die im Tool<br />
geladene Konfiguration mit der im<br />
Gateway (die Funktionalität wurde<br />
beim Verbinden bereits implizit ausgeführt).<br />
Über „Download“ kann eine<br />
neue Konfiguration in den Gateway<br />
geladen werden, und „Status“ zeigt<br />
den Zustand im Detail an, wie in<br />
nebenstehender Graphik gezeigt.<br />
Mit den Schaltflächen „Clear Data<br />
Puffer“, „Invalidate RAM“ und „Clear<br />
Config Data“ können verschiedene Bereiche des Speichers im Gateway gelöscht<br />
werden, und zwar nur der Datenpuffer, Alles (wird erst beim nächsten Aufstarten<br />
ausgeführt) und den Bereich mit der Konfiguration respektive.<br />
Die letzte Schaltfläche ist mit „Show DB“ bezeichnet und öffnet ein Fenster, welches<br />
mehr als nur die Daten im Gateway anzeigt; über dieses Feature können auch Werte<br />
gesetzt werden, beispielsweise um während einer ersten Inbetriebnahme-Phase<br />
auch ohne ZPoint auszukommen. Die nachfolgende Abbildung zeigt das „Show DB“<br />
Fenster.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 39/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Über die „Start“/„Stop“ Schaltfläche kann ausgewählt werden, ob der Bereich im<br />
Gateway gelesen werden soll (es sind dann keine Änderungen möglich, wie abgebildet),<br />
oder ob kein Bereich gelesen werden soll, wodurch Änderungen möglich sind.<br />
In der linken oberen Ecke kann der überwachte Bereich ZPoint-üblich angegeben<br />
werden; daneben rechts können Werte geschrieben werden.<br />
Darunter wird der überwachte Speicher angezeigt, wobei zuerst jeweils zwei 16-Bit<br />
Werte angegeben sind, gefolgt vom resultierenden 32-Bit Wert. Die angegebenen<br />
Offset-Nummern fassen so jeweils vier 16-Bit oder zwei 32-Bit Werte zusammen.<br />
3. 16. Der PAC<br />
Der PAC ist ein Gerät zur Prozess-Regelung und -Kontrolle, Messwert-Erfassung<br />
und integrierte Datenerfassung. Der PAC erlaubt es, die Steuerung in <strong>ECCO</strong> von der<br />
eigentlichen Regelung zu trennen. Dadurch werden einerseits die <strong>ECCO</strong>-Programme<br />
kürzer und einfacher, andererseits können auch komplexe Regelalgorithmen einfach<br />
eingesetzt werden; zusätzlich wird erst noch die Prozess-Sicherheit massiv gesteigert!<br />
Der PAC erlaubt die gleichzeitige Regelung von zwei unabhängigen Servo-Achsen,<br />
vier Kraft/Weg- oder Signal/Zeit-Messungen, bietet verschiedene Regelalgorithmen,<br />
Hardware-Watchdog, Schleppfehler-Überwachung und erlaubt das Speichern von<br />
Kurven mit bis zu 500 Messpunkten. Weitere Informationen und Hinweise zur Anwendung<br />
des PAC entnehmen Sie bitte dem PAC Handbuch.<br />
In <strong>ECCO</strong> wird der PAC über den Befehl PAC angesteuert. Dieser ist einfach einzusetzen<br />
und dennoch äusserst leistungsvoll: Die benötigten Argumente können aus<br />
einem Array gelesen, respektive in ein Array geschrieben werden. Die Konfiguration<br />
der Anzahl der Elemente wird durch .PAC_DEF einmal an zentraler Stelle vorgenommen.<br />
65 .PAC_DEF / .END_PAC_DEF<br />
179 PAC<br />
[5] PAC Handbuch, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.01, 2001.<br />
[9] PACTest <strong>Manual</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.00, 2002.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 40/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
4. BEFEHLE<br />
4. 1. Konventionen<br />
Nachfolgend sind die in diesem <strong>Manual</strong> verwendeten Konventionen angegeben, und<br />
zusätzlich werden die allgemeinen Möglichkeiten aufgezeigt. Diese stellen keine<br />
eigenen Befehle dar, erweitern jedoch ähnlich die Funktionalität von <strong>ECCO</strong> oder<br />
erhöhen den Benutzerkomfort.<br />
Lesen der Syntax<br />
Die verwendete Syntax beschränkt sich auf ein paar wenige Elemente:<br />
Texte in spitzen Klammern sind Felder, die vom Benutzer<br />
passend auszufüllen sind.<br />
[Option] In eckigen Klammern sind optionale Felder und Texte. Der<br />
Benutzer kann je nach Anwendungsfall entscheiden, ob er von<br />
einer solchen Option Gebrauch machen will.<br />
Zeilen Die Verwendung von Zeilen ist wie in <strong>ECCO</strong> selbst geregelt:<br />
Endet eine Zeile mit einem Komma, so wird der Befehl auf der<br />
nächsten Zeile fortgesetzt (könnte also auch auf der gleichen<br />
Zeile weitergeführt werden); ohne Komma folgt ein neuer Befehl<br />
“Anführungszeichen”<br />
oder ein Schlüsselwort, und der Zeilenwechsel ist zwingend.<br />
In der Syntax und den Beispielen werden Zeichenketten durch<br />
unterschiedlich aussehenden Zeichen begrenzt. Dies ist jedoch<br />
nur aufgrund typographischer Gegebenheiten der Fall, es sind<br />
in jedem Fall die doppelten Anführungszeichen der "<br />
Taste zu<br />
verwenden!<br />
Alle weiteren Elemente sind wörtlich abzutippen.<br />
RV, RW, LV, LW und SW Register ermöglichen indirekte Adressierung, das heisst, dass<br />
die Nummer, welche das verwendete Register angibt, nicht als Zahl wie in RW100<br />
angegeben wird, sondern aus einem 16-Bit Register vom Typ RV, LV oder KV<br />
stammt. Das Adressregister ist dann in runden Klammern zum Registertyp zu setzen,<br />
wie in RW(LV001). Indirekte Adressierung ist im Abschnitt 3. 8 „Register und Merker“<br />
ausführlicher beschrieben.<br />
Bei Arrays stellen die runden Klammern keine indirekte Adressierung dar, sondern<br />
verweisen auf das Element im Array. Das Element im Array kann als Zahl oder indirekt<br />
angegeben werden, ohne dass sich die Schreibweise ändert.<br />
Beachte, dass nicht alle Register bei allen Befehlen verwendet werden dürfen, und<br />
dass bei gewissen Befehlen indirekte Adressierung verboten ist. Die Befehle weisen<br />
jeweils darauf hin.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 41/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
4. 2. Systematische Befehlsreferenz<br />
Allgemeine Vereinbarungen und Definitionen<br />
47 .ADDRESS<br />
49 .CODE_OFF<br />
59 .LANGU<strong>AG</strong>ES<br />
60 .LIMITS<br />
63 .MAX_<strong>ECCO</strong><br />
64 .OWN_<strong>ECCO</strong><br />
66 .PASSWORD<br />
69 .PROJECT<br />
76 .SETLABEL<br />
79 .STATIONS / STATION / .END_STATIONS<br />
88 .TEXT<br />
Deklarationen<br />
48 .ARRAYS / .END_ARRAYS<br />
50 .DISPLAYS / .DISP_END<br />
55 .FUNCTIONS / .FUNC_END<br />
57 .IO_TEXT / .END_IO_TEXT<br />
65 .PAC_DEF / .END_PAC_DEF<br />
70 .PROTECTED / .END_PROTECTED<br />
74 .SET_CONST / .END_CONST<br />
77 .SLCE_DEF / .END_SLCE_DEF<br />
78 .SLCS_DEF / .END_SLCS_DEF<br />
85 .STRING_REG / .END_STRING_REG<br />
86 .STRINGS / .END_STRINGS<br />
91 .UNLOCK / .END_UNLOCK<br />
Programmdefinitionen<br />
52 .END<br />
62 .LOCAL<br />
71 .PSL / .END_PSL<br />
172 NSDEF<br />
216 STDEF<br />
Aufrufen und Beenden von Tasks<br />
101 CALL<br />
102 CALLD<br />
104 CALLF<br />
107 CLOSE<br />
272 DISABLE_STOP / ENABLE_STOP<br />
175 OPEN<br />
181 POWER_OFF<br />
189 RET<br />
190 RETD<br />
191 RETE<br />
192 RETF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 42/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
274 STEND<br />
230 TASK_KILL<br />
231 TASK_OPEN<br />
232 TASK_STEP<br />
Sprünge und strukturierte Programmierung<br />
118 DO / DO_WHILE / DO_WHILENOT<br />
149 IF / IFNOT / ELSE / END_IF<br />
154 JMPCOND<br />
155 JMPTIM<br />
156 JPBIT<br />
157 JPEQ<br />
158 JPGT<br />
159 JPLT<br />
160 JUMP<br />
163 L_JMPCOND<br />
165 L_SWITCH / CASE / DEFAULT / END_SWITCH<br />
229 SWITCH / CASE / DEFAULT / END_SWITCH<br />
248 WHILE / WHILENOT / END_WHILE<br />
Überwachte Befehle und Timer<br />
53 .ERROR_CODE_START<br />
54 .ERROR_FL<strong>AG</strong>_OFFSET<br />
89 .TINP_TEXT / .END_TINP_TEXT<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
205 SETTIM<br />
275 TIMETRAP / END_TIMETRAP<br />
234 TINP<br />
276 TRAP / IF_TRAP / END_TRAP<br />
247 WAITIM<br />
Ein- und Ausgänge, Merker und Fehlermerker<br />
96 AND<br />
121 EXCL<br />
152 INP<br />
161 L_INP<br />
164 L_OUTP<br />
168 MOV<br />
171 NOT<br />
176 OR<br />
178 OUTP<br />
252 XOR<br />
Registerbefehle<br />
95 ABS<br />
96 AND<br />
97 BMOV<br />
100 CALC<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 43/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
166 MOV<br />
171 NOT<br />
176 OR<br />
198 SEARCH<br />
204 SETBIT<br />
252 XOR<br />
Stringbefehle<br />
85 .STRING_REG / .END_STRING_REG<br />
86 .STRINGS / .END_STRINGS<br />
166 LEN_STR<br />
167 MID_STR<br />
202 SET_LANG<br />
210 SMOV<br />
217 STR_ADD<br />
218 STR_ADD_ASCII<br />
220 STR_ADD_NR<br />
221 STR_TO_ASCII<br />
222 STR_TREAT<br />
223 STR_VAL<br />
Befehle zum Einlesen von Datum und Zeit<br />
183 RD_DATE<br />
184 RD_HOUR<br />
186 RD_TIME<br />
187 RD_WEEK<br />
Kommunikation zwischen Steuerungen<br />
198 SEND_IO<br />
200 SEND_REG<br />
201 SEND_SR<br />
250 WR_TIME<br />
Verwenden von Profibus & CPLink<br />
50 .CPLINK_MAP_DEF / .END_CPLINK_MAP_DEF<br />
67 .PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF<br />
98 BUS_OFF<br />
99 BUS_ON<br />
Display: Ein- und Ausgabe<br />
71 .PSL / .END_PSL<br />
106 CDATEDISP<br />
109 CLS<br />
110 CLS_WIN<br />
113 CREGDISP<br />
115 CTIMEDISP<br />
116 CWRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 44/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
117 DATEDISP<br />
120 END_NUM_INP<br />
122 GET_PSL<br />
129 HP_CDATEDISP<br />
131 HP_CLS_WIN<br />
132 HP_CREGDISP<br />
134 HP_CTIMEDISP<br />
136 HP_CWRITE<br />
137 HP_DATEDISP<br />
139 HP_REGDISP<br />
140 HP_TIMEDISP<br />
142 HP_WRITE<br />
173 NUM_INP<br />
187 REGDISP<br />
203 SET_PSL<br />
230 TIMEDISP<br />
251 WRITE<br />
Speichern von Arrays<br />
193 SAVE_ARRAY<br />
Servo-Befehle für Slave und PAC<br />
151 INM<br />
177 OUTA<br />
179 PAC<br />
193 SCALE_AD<br />
196 SCALE_DA<br />
221 SV_COM<br />
225 SV_CONST<br />
226 SV_FIL<br />
227 SV_READ<br />
228 SV_TRJ<br />
Slave-Befehle<br />
206 SLCE<br />
207 SLCS<br />
208 SLV_RCV_STR<br />
209 SLV_SND_STR<br />
Spezialbefehle für IDEX Systeme<br />
143 ID_INIT<br />
144 ID_READ<br />
145 ID_REG_RD<br />
146 ID_REG_WR<br />
147 ID_STATUS<br />
148 ID_WRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 45/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Spezialbefehle für das VI-Terminal<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
Befehle für Statistik-Puffer<br />
108 CLR_PUFFER<br />
169 MOV_PUFFER<br />
170 NEW_PUFFER<br />
182 PUFFER<br />
185 RD_PUFFER<br />
211 STAT_CLR<br />
212 STAT_PUFFER<br />
213 STAT_QUEUE<br />
214 STAT_TAKT<br />
Produktionsüberwachung und Statistik mit STATREAD<br />
80 .STATISTIC / GROUP / .END_STATISTIC<br />
197 SCHICHT<br />
273 STAT_SEND<br />
215 STCKZAHL<br />
Produktions- und Betriebsüberwachung mit ZPoint<br />
92 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
123 GW_DD<br />
124 GW_DW<br />
125 GW_MSG<br />
126 GW_QUEUE<br />
126 GW_RD_DD<br />
128 GW_RD_DW<br />
253 ZPOINT_STATE<br />
Zählerbefehle (veraltet)<br />
266 CTRDEC<br />
267 CTRDISP<br />
268 CTREQ<br />
269 CTRINC<br />
270 CTRPRES<br />
271 CTRRES<br />
4. 3. Alphabetische Befehlsreferenz<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 46/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ADDRESS<br />
.ADDRESS<br />
Definiert die erste Adresse, also die Position des Speichers, des nachfolgenden<br />
Codes.<br />
Syntax:<br />
.ADDRESS <br />
Felder:<br />
Adresse des nachfolgenden Codes in hexadezimaler Notation.<br />
Bemerkungen:<br />
Die folgenden vier Adress-Anweisungen müssen genau so vorhanden sein:<br />
.ADDRESS 0 ; vor NULL<br />
NULL:<br />
.ADDRESS 2 ; vor PROG_BEG<br />
PROG_BEG:<br />
.ADDRESS 26 ; vor .SETLABEL<br />
.SETLABEL STRESP<br />
.END_STATIONS<br />
.ADDRESS 1210 ; nach .END_STATIONS<br />
Bei den SMC4x Steuerungen mussten andere Adresswerte angegeben werden.<br />
Daher ist bei Software-Portierungen auf eine korrekte Änderung zu achten.<br />
Siehe auch:<br />
76 .SETLABEL<br />
79 .STATIONS / STATION / .END_STATIONS<br />
259 PROG_BEG<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 47/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ARRAYS / .END_ARRAYS<br />
.ARRAYS / .END_ARRAYS<br />
Innerhalb dieser Compileranweisung werden Arrays mit ihrer Grösse deklariert.<br />
Möglich sind Arrays mit 16bit Elementen (AV) und Arrays mit 32bit Elementen (AW).<br />
Syntax:<br />
.ARRAYS<br />
[AW=]<br />
[AV=]<br />
.END_ARRAYS<br />
Felder:<br />
AW 32-bit Array, dessen Grösse in Elementen angegeben wird.<br />
AV 16-bit Array, dessen Grösse in Elementen angegeben wird.<br />
Anzahl der Elementen im Array. Jedes Array verfügt über die<br />
Elemente 1 bis . Wird versucht, auf ein nicht deklariertes<br />
Element zuzugreifen, tritt der Systemfehler 65 auf.<br />
Bemerkungen:<br />
Es können bis zu 256 AW und 256 AV Arrays deklariert werden, jedes mit bis zu<br />
32767 Elementen.<br />
Beispiel:<br />
.ARRAYS<br />
AV001 = 20 ; AV001(1) – AV001(20)<br />
AW001 = 100 ; Array mit 100 32bit Werten<br />
AW002 = 20 ; und eines mit 20 Elementen<br />
.END_ARRAYS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 48/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .CODE_OFF<br />
.CODE_OFF<br />
Gibt den Offset des Programms an. Der Offset ist konstant für jede Steuerungsgeneration.<br />
Syntax:<br />
.CODE_OFF 0<br />
Bemerkungen:<br />
Bei den SMC4x Steuerungen musste ein Offset von –810000 angegeben werden.<br />
Bei Software-Portierungen ist auf eine korrekte Änderung zu achten.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 49/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .CPLINK_MAP_DEF / .END_CPLINK_MAP_DEF<br />
.CPLINK_MAP_DEF / .END_CPLINK_MAP_DEF<br />
Beschreibt eine CPLink Anbindung in <strong>ECCO</strong>.<br />
Syntax:<br />
.CPLINK_MAP_DEF , “”<br />
INPUTS<br />
B, [-] [, [-]]<br />
[B, [-] [, [-]]]<br />
OUTPUTS<br />
B, [-] [, [-]]<br />
[B, [-] [, [-]]]<br />
.END_CPLINK_MAP_DEF<br />
Felder:<br />
Nummer der CPLINK Karte. Gültige Werte sind 1 bis 3.<br />
Text, der bei einem Fehler der Komponente angezeigt wird.<br />
Byte im Prozessabbild. Muss in fortlaufender Reihenfolge<br />
stehen.<br />
Zugeordnete Ein- resp. Ausgangs-Adresse (also ohne den<br />
Buchstaben E, I, A oder O) zum Bit im . Jedes <br />
fasst genau 8 , wobei das LSB ganz links (zuerst) steht.<br />
Nicht verwendete Bits werden mit 0 gekennzeichnet, Bereiche<br />
werden mit „-“ verbunden.<br />
Bemerkungen:<br />
Um eine CPLink-Karte betreiben zu können muss TwinCat CP parallel zu <strong>ECCO</strong><br />
laufen.<br />
Beispiel:<br />
.CPLINK_MAP_DEF 1, “CPLink Karte 1”<br />
INPUTS<br />
B0, 501-508<br />
B1, 509, 510, 0, 0, 0, 0, 0, 0<br />
OUTPUTS<br />
B0, 501-508<br />
B1, 509, 510, 511, 512, 0, 0, 0, 0<br />
.END_CPLINK_MAP_DEF<br />
Siehe auch:<br />
67 .PROFIBUS_DEF / .MASTER /.END_PROFIBUS_DEF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 50/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .DISPLAYS / .DISP_END<br />
.DISPLAYS / .DISP_END<br />
Definiert die Display-Tasks mit ihren Labels und der Anzahl der Argumente.<br />
Syntax:<br />
.DISPLAYS<br />
@,.<br />
[@,.]<br />
.DISP_END<br />
Felder:<br />
Label des Display-Tasks mit bis zu 15 Zeichen.<br />
Anzahl der verwendeten 32bit Parameter.<br />
Anzahl der verwendeten 16bit Parameter.<br />
Bemerkungen:<br />
Die Anzahl der Definitionen muss mit dem unter .LIMITS angegebenen Wert<br />
übereinstimmen.<br />
Es können bis zu 32 32bit Parameter und 32 16bit Parameter verwendet werden. Der<br />
Display-Task wird im Programm mittels CALLD aufgerufen, womit auch die<br />
benötigten Parameter übergeben werden. Display-Tasks unterbrechen PSL-Tasks<br />
und dienen vorwiegend zur Interaktion mit dem Benutzer (wie das Abfragen von<br />
Werten oder durch Auswahlmenüs).<br />
Wird ein Display-Task unterbrochen (beispielsweise durch einen Fehler-Task) so<br />
wird anschliessend der Display-Task von vorne gestartet, um einen vollständigen,<br />
wohldefinierten Bildaufbau zu gewährleisten.<br />
Beispiel:<br />
Das folgende Beispiel definiert 3 Displaytasks, einer ohne Parameter, einer mit<br />
einem 16bit Parameter und einer mit der maximal zulässigen Anzahl Parameter.<br />
.DISPLAYS<br />
@MAIN_MENU ,0.0 ; keine Parameter<br />
@DISP_1 ,0.1 ; ein 16bit Parameter<br />
@DISP_MAX ,32.32 ; mehr geht nicht<br />
.DISP_END<br />
Siehe auch:<br />
60 .LIMITS<br />
71 .PSL<br />
102 CALLD<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 51/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .END<br />
.END<br />
Weist den Compiler an, dass dies die letzte Programmzeile ist.<br />
END<br />
Syntax:<br />
Bemerkungen:<br />
Nachfolgende Zeilen werden nicht kompiliert; damit ist es möglich, schrittweise<br />
einzelne Programmteile in die Kompilierung einfliessen zu lassen oder zuvor<br />
auszublenden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 52/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ERROR_CODE_START<br />
.ERROR_CODE_START<br />
Dient zur automatischen Generierung von Fehlernummern beim TINP Befehl.<br />
Syntax:<br />
.ERROR_CODE_START <br />
Felder:<br />
Basis für die automatische Generierung von Fehlernummern,<br />
also in dem Fall, in dem im TINP Befehl keine Fehlernummer<br />
angegeben wird. Zahl zwischen 5000 und 25000.<br />
Bemerkungen:<br />
Wird im TINP Befehl die Basis für den Fehlerwert angegeben, so muss dieser um<br />
mindestens soviel kleiner als sein, wie der TINP Befehl Bedingungen<br />
überwacht. Damit wird sichergestellt, dass sich automatisch generierte und manuell<br />
angegebene Fehlernummern nicht überschneiden und eineindeutig sind.<br />
Beachte, dass dieser Befehl zwischen den Anweisungen .ADDRESS 0 und<br />
.TINP_TEXT stehen muss.<br />
Beispiel:<br />
.ERROR_CODE_START 10000<br />
Siehe auch:<br />
47 .ADDRESS<br />
89 .TINP_TEXT / .END_TINP_TEXT<br />
234 TINP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 53/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ERROR_FL<strong>AG</strong>_OFFSET<br />
.ERROR_FL<strong>AG</strong>_OFFSET<br />
Separiert die Bereiche der Fehlermerker für ZPoint.<br />
Syntax:<br />
.ERROR_FL<strong>AG</strong>_OFFSET <br />
Felder:<br />
Eine Konstante vom Typ KV oder KW.<br />
Bemerkungen:<br />
Werden mehrere <strong>ECCO</strong> Steuerungen von einer gemeinsamen ZPoint Anbindung<br />
bedient, so entsteht das Problem, dass die Fehlertexte und Fehlermerker der<br />
einzelnen Steuerungen sich überschneiden.<br />
Der Wert der Konstante muss in .SET_CONST deklariert werden, und diese<br />
Anweisung muss hinter dem .SET_CONST Block stehen.<br />
Dieser Compileranweisung bewirkt, dass alle Einträge der Fehlermerker-Nummern<br />
um den Offset verschoben werden.<br />
Die Fehlermeldung muss entsprechend angepasst werden.<br />
Beispiel:<br />
Das Beispiel zeigt zuerst die Verwendung dieses Befehls, dann das Generieren der<br />
Fehlermeldung. RV1507 ist dabei das entsprechende Register zur Kommunikation<br />
mit ZPoint.<br />
.ERROR_FL<strong>AG</strong>_OFFSET KV100<br />
; Fehlerhandler, der eine Fehlermeldung an ZPoint generiert<br />
&ERROR_D020:<br />
CALC RV1507, KV100 + 20<br />
RETE<br />
Siehe auch:<br />
74 .SET_CONST / .END_CONST<br />
92 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 54/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .FUNCTIONS / .FUNC_END<br />
.FUNCTIONS / .FUNC_END<br />
Definiert Funktionen. Sind mehrere Landessprachen definiert, muss zu jeder<br />
Landessprache ein eigener solcher Funktionsblock vorhanden sein.<br />
Syntax:<br />
.FUNCTIONS []<br />
#, ., ., “”<br />
[#, ., ., “”]<br />
.FUNC_END<br />
Felder:<br />
Sprache (durch drei Buchstaben gekennzeichnet) für diesen<br />
Funktionsblock. Optional, falls nur eine Sprache definiert ist.<br />
Sprachneutrales Funktions-Label, bis zu 15 Zeichen lang.<br />
Funktionszeile (Zahl zwischen 1 und 40) zur Navigation mit den<br />
Pfeiltasten.<br />
Funktionsspalte (Zahl zwischen 1 und 40) zur Navigation mit<br />
den Pfeiltasten.<br />
Anzahl der verwendeten 32bit Parameter.<br />
Anzahl der verwendeten 16bit Parameter.<br />
Text mit bis zu 25 Zeichen zur Beschreibung der Funktion in der<br />
Landessprache.<br />
Bemerkungen:<br />
Ein Funktions-Task kann von einem Programm-Task mittels CALLF gestartet werden<br />
und endet mit dem RETF Befehl. Da jede Funktion den Platz eines freien Tasks<br />
einnimmt, beschränkt die Zahl freier Tasks die maximale Verschachtelung.<br />
Ein Funktions-Task ohne Parameter kann im Funktionsmodus auch vom<br />
Benutzerterminal aus gestartet werden, indem er entweder mit den Pfeiltasten oder<br />
durch die Eingabe von . und der „=“-Taste ausgewählt wird, und dann<br />
mit der „Start“-Taste gestartet wird. Weil nur Funktions-Tasks ohne Parameter vom<br />
Benutzerterminal aus gestartet werden können, ist es sinnvoll, die Funktionen in der<br />
ersten Funktionsspalte ohne Parameter zu deklarieren und dann von dieser Funktion<br />
aus die anderen Funktionen derselben Funktionszeile aufzurufen.<br />
Sogenannte „Funktionsprozeduren“ mit .=0.0 können nicht vom<br />
Display aus gestartet werden.<br />
Beispiel:<br />
.FUNCTIONS GER<br />
;Station 1<br />
#FUNC1_1, 1.1, 0.0, “Station 1 Menü”<br />
#FUNC1_2, 1.2, 1.8, “Station 1 Funktion 2”<br />
#FUNC1_3, 1.3, 0.1, “Station 1 Funktion 3”<br />
;Station 2<br />
#FUNC2_1, 2.1, 0.0, “Station 2 nur Menü”<br />
.FUNC_END<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 55/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .FUNCTIONS / .FUNC_END<br />
Siehe auch:<br />
59 .LANGU<strong>AG</strong>ES<br />
60 .LIMITS<br />
104 CALLF<br />
192 RETF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 56/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .IO_TEXT / .END_IO_TEXT<br />
.IO_TEXT / .END_IO_TEXT<br />
Beschreibt Ein- und Ausgänge, Merker und Fehlermerker in der angegebenen<br />
Landessprache.<br />
Syntax:<br />
.IO_TEXT []<br />
[ “”]<br />
[ ]<br />
[ “”]<br />
[ ]<br />
[ “”, &]<br />
[ , &]<br />
[; ]<br />
.END_IO_TEXT<br />
Felder:<br />
Sprache (durch drei Buchstaben gekennzeichnet) für diesen<br />
Block. Optional, falls nur eine Sprache definiert ist.<br />
Eingang oder Ausgang. Ein Block von Eingängen respektive<br />
Ausgängen kann durch „-“ beschrieben werden.<br />
Ein Merker (mit dem Kennbuchstaben M oder F). Ein Block von<br />
Merkern kann durch „-“ beschrieben werden.<br />
Ein Fehlermerker (mit dem Kennbuchstaben D).<br />
Ein Register (RV, RW), Timer (T), Zähler (C) oder Zeitwert (CW).<br />
Fehlerlabel, das bei Setzen des Merkers aktiviert wird.<br />
Der bezeichnende Text in der Landessprache. Maximal 120<br />
Zeichen.<br />
Ein variables String-Register vom Typ SR. Dazu muss der<br />
.STRING_REG Block vor diesem Block stehen. Damit wird eine<br />
variable Bezeichnung des Elementes ermöglicht.<br />
Bemerkungen:<br />
Zu jeder Landessprache muss ein eigener solcher IO_TEXT Block bestehen.<br />
Zusätzlich sollten hier auch die verwendeten Register (RV und RW), Timer (T), Zähler<br />
(C) und Zeitwerte (CW) als Kommentare aufgeführt sein, um im Debugger (und<br />
ähnlichem) einen Bezeichner zu haben.<br />
Beispiel:<br />
.IO_TEXT GER<br />
A001 “AL Türe”<br />
A002 SR1002<br />
A003-O999 “Freie Ausgänge”<br />
E001 “NOT_AUS”<br />
I002-E999 “Freie Einänge”<br />
M100 “Hochdruck erreicht”<br />
D201 “Druckalarm”, &Error_201<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 57/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .IO_TEXT / .END_IO_TEXT<br />
;RW1001 Druck in Bar<br />
;C1011 Stückzahl-Zähler<br />
.END_IO_TEXT<br />
Siehe auch:<br />
59 .LANGU<strong>AG</strong>ES<br />
60 .LIMITS<br />
84 .STRING_REG / .END_STRING_REG<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 58/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .LANGU<strong>AG</strong>ES<br />
.LANGU<strong>AG</strong>ES<br />
Definiert bis zu drei Landessprachen, zwischen denen zur Laufzeit umgeschaltet<br />
werden kann.<br />
Syntax:<br />
.LANGU<strong>AG</strong>ES [, [,]]<br />
Felder:<br />
Sprachbezeichner der ersten Sprache.<br />
optional: Sprachbezeichner der zweiten Sprache.<br />
optional: Sprachbezeichner der dritten Sprache.<br />
Die Sprachbezeichner bestehen aus jeweils genau drei Buchstaben.<br />
Bemerkungen:<br />
Fehlt diese Anweisung, wird Deutsch GER verwendet.<br />
Beispiel:<br />
.LANGU<strong>AG</strong>ES GER, ENG ; Deutsch und Englisch<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 59/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .LIMITS<br />
.LIMITS<br />
Legt diverse Limiten fest, um den Programmspeicher optimal zu nutzen, und um die<br />
Abgrenzung zwischen verschiedenen Steuerungen zu definieren.<br />
Syntax:<br />
Eigene Steuerung:<br />
.LIMITS , , , , ,<br />
, , , , ,<br />
, , , , <br />
Fremde Steuerung:<br />
.LIMITS , , , , <br />
Felder:<br />
Beschriebene <strong>ECCO</strong> Station. Format: <strong>ECCO</strong> mit 1bis<br />
15.<br />
Bereich der Eingänge. Format: E- oder<br />
I-. Der Tausender des Bereichs muss der<br />
SMC-Nummer entsprechen. Die verbleibenden drei Stellen von<br />
müssen um 1 grösser als eine durch 16 teilbare Zahl<br />
sein, die von müssen durch 16 teilbar sein.<br />
Bereich der Ausgänge. Format: A- oder<br />
O-. Der Tausender des Bereichs muss der<br />
SMC-Nummer entsprechen. Die verbleibenden drei Stellen von<br />
müssen um 1 grösser als eine durch 16 teilbare Zahl<br />
sein, die von müssen durch 16 teilbar sein.<br />
Bereich der Merker. Format: F- oder<br />
M-. Der Tausender des Bereichs muss der<br />
SMC-Nummer entsprechen. Die verbleibenden drei Stellen von<br />
müssen um 1 grösser als eine durch 8 teilbare Zahl<br />
sein, die von müssen durch 8 teilbar sein.<br />
Bereich der Fehlermerker. Format: D-. Der<br />
Tausender des Bereichs muss der SMC-Nummer entsprechen.<br />
Die verbleibenden drei Stellen von müssen um 1<br />
grösser als eine durch 8 teilbare Zahl sein, die von <br />
müssen durch 8 teilbar sein.<br />
Anzahl globaler 16bit Timer der Steuerung. Format: T mit<br />
1 bis 255.<br />
Anzahl der Zeilen für Funktionen. Definiert die Limite für<br />
.FUNCTIONS. Format: X mit 1 bis 40.<br />
Anzahl der Spalten für Funktionen. Definiert die Limite für<br />
.FUNCTIONS. Format: Y mit 1 bis 40.<br />
Anzahl ZW Zeitwerte der Steuerung. Format: Z mit 1 bis<br />
49.<br />
Anzahl der Stationen. Format: S mit 1 bis 9999.<br />
Anzahl der Display-Routinen. Format: W mit 1 bis 512.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 60/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .LIMITS<br />
Anzahl der SR Strings. Format: J mit 1 bis 4096.<br />
Anzahl der in .FUNCTIONS definierten Funktionsprozeduren.<br />
Format: P mit 1 bis 1024.<br />
Nach dem Komma, welches zwei Felder trennt, kann jeweils ein Kommentar<br />
und/oder eine neue Zeile eingefügt werden.<br />
Bemerkungen:<br />
Bei den SMC4x-Seteuerungen mussten weitere Limiten zur Ansteuerung des CAN-<br />
Bus angegeben werden und einige Felder hatten eine leicht andere Bedeutung. Bei<br />
Software-Portierungen ist auf eine korrekte Änderung zu achten.<br />
Weiter ist zu beachten, dass die Steuerungen nicht mehr mit SMC, sondern mit<br />
<strong>ECCO</strong> bezeichnet werden.<br />
Von den fremden Steuerungen müssen eigentlich nur diejenigen deklariert werden,<br />
mit denen auch kommuniziert wird.<br />
Beachte, dass der durch RV, RW, AV und AW belegte Speicher nicht grösser als 512kB<br />
sein darf. Der Compiler überprüft dies und meldet eine allfällige Verletzung mit einem<br />
Fehler.<br />
Beispiel:<br />
Deklariert zwei Steuerungen, die eigene als <strong>ECCO</strong>1 und eine zweite als <strong>ECCO</strong>2.<br />
.MAX_<strong>ECCO</strong> 2 ; Verbundene Steuerungen<br />
.OWN_<strong>ECCO</strong> 1 ; Eigene Steuerung ist <strong>ECCO</strong>1<br />
.LIMITS <strong>ECCO</strong>1, ; Eigene Steuerung<br />
I1001-1480, ; Eingänge<br />
O1001-1800, ; Ausgänge<br />
F1001-1200, ; Merker<br />
D1001-1200, ; Fehlermerker<br />
T19, ; Globale Timer 16bit<br />
X8, ; Funktionen: Zeilenzahl<br />
Y4, ; Funktionen: Spaltenzahl<br />
Z5, ; Zeitwerte<br />
S4, ; Stationen<br />
W20, ; Anzahl Display-Routinen<br />
J12, ; Strings<br />
P50 ; Funktionsprozeduren: Anzahl<br />
.LIMITS <strong>ECCO</strong>2, ; Fremde Steuerung<br />
I2001-2192, O2001-2192, F2001-2400, D2001-2008<br />
Siehe auch:<br />
52 .FUNCTIONS<br />
63 .MAX_<strong>ECCO</strong><br />
64 .OWN_<strong>ECCO</strong><br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 61/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .LOCAL<br />
.LOCAL<br />
Startet einen neuen Bereich für lokale Labels.<br />
Syntax:<br />
.LOCAL<br />
Bemerkungen:<br />
Lokale Labels beginnen mit dem $ Zeichen.<br />
In Display-, Error- und Funktionstasks ist der Befehl .LOCAL nicht erlaubt. Es wird<br />
aber automatisch beim Aufruf ein neuer lokaler Bereich erzeugt, so dass lokale<br />
Labels verwendet werden können.<br />
Beispiel:<br />
Das Beispiel zeigt zwei Stationen mit der Verwendung von lokalen Blöcken.<br />
STAT01:<br />
.LOCAL<br />
$S1:<br />
OUTP A101 H<br />
JMPCOND E501 L, $S1<br />
OUTP A102 L<br />
CLOSE<br />
STAT02:<br />
.LOCAL<br />
$S1:<br />
OUTP A102 H<br />
JMPCOND E502 L, $S1<br />
OUTP A101 L<br />
CLOSE<br />
Der Vorteil liegt darin, dass der Programmtext kopiert werden kann und nur in den<br />
Details angepasst werden muss.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 62/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .MAX_<strong>ECCO</strong><br />
.MAX_<strong>ECCO</strong><br />
Spezifiziert die Anzahl der verbundenen <strong>ECCO</strong>-Steuerungen.<br />
Syntax:<br />
.MAX_<strong>ECCO</strong> <br />
Felder:<br />
Anzahl; Zahl zwischen 1 und 9.<br />
Bemerkungen:<br />
Fehlt dieser Befehl oder passt nicht zu den Angaben von .LIMITS und<br />
.OWN_<strong>ECCO</strong>, so wird ein Compiler-Fehler generiert.<br />
Bei älteren Versionen hiess dieser Befehl .MAX_SMC, der Befehl ist also bei<br />
Portierungen anzupassen.<br />
Beispiel:<br />
.MAX_<strong>ECCO</strong> 1<br />
Siehe auch:<br />
60 .LIMITS<br />
64 .OWN_<strong>ECCO</strong><br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 63/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .OWN_<strong>ECCO</strong><br />
.OWN_<strong>ECCO</strong><br />
Spezifiziert die eigene Adresse der <strong>ECCO</strong>-Steuerung.<br />
Syntax:<br />
.OWN_<strong>ECCO</strong> <br />
Felder:<br />
Eigene <strong>ECCO</strong>-Adresse.<br />
Bemerkungen:<br />
Fehlt dieser Befehl oder passt nicht zu den Angaben von .LIMITS und<br />
.MAX_<strong>ECCO</strong>, so wird ein Compiler-Fehler generiert.<br />
In früheren Programmversionen hiess dieser Befehl .OWN_SMS; bei Portierungen ist<br />
auf eine korrekte Änderung zu achten.<br />
Beispiel:<br />
.OWN_<strong>ECCO</strong> 1<br />
Siehe auch:<br />
60 .LIMITS<br />
63 .MAX_<strong>ECCO</strong><br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 64/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PAC_DEF / .END_PAC_DEF<br />
.PAC_DEF / .END_PAC_DEF<br />
Deklariert PAC Befehle.<br />
Syntax:<br />
.PAC_DEF<br />
, , <br />
[ , , ]<br />
.END_PAC_DEF<br />
Felder:<br />
Name des Befehls. Dies ist ein Bezeichner, welcher im PAC<br />
Befehl verwendet wird.<br />
Charakteristische Nummer des Befehls.<br />
Anzahl der Argumente, welche vom PAC gelesen werden.<br />
Anzahl der Argumente, welche an den PAC gesendet werden.<br />
Bemerkungen:<br />
Dieser Block ist aus der Dokumentation zum PAC zu kopieren, um die<br />
ordnungsgemässe Funktion sicherzustellen.<br />
Beachte, dass zwischen und kein Komma steht.<br />
Siehe auch:<br />
179 PAC<br />
[5] PAC Handbuch, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.01, 2001.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 65/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PASSWORD<br />
.PASSWORD<br />
Das Passwort soll sicherstellen, dass nur berechtigte Benutzer Ausgänge, Merker<br />
oder Fehlermerker am Terminal ändern können.<br />
Syntax:<br />
.PASSWORD <br />
Felder:<br />
Passwort-Zahl im Bereich 0 bis 65535.<br />
Bemerkungen:<br />
Im manuellen Modus oder im gestoppten Automatikmodus wird vom Bediener die<br />
Eingabe dieses Passworts verlangt, sofern er Ausgänge, Merker oder Fehlermerker<br />
verändern will. Das eingegebene Passwort bleibt gültig bis zum nächsten Start im<br />
Automatik- oder Stationsmodus.<br />
Soll keine Passwort-Abfrage stattfinden, so ist dieser Befehl auszulassen.<br />
Beispiel:<br />
.PASSWORD 12345<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 66/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF<br />
.PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF<br />
Beschreibt die PROFIBUS Karte in <strong>ECCO</strong>.<br />
Syntax:<br />
.PROFIBUS_DEF , <br />
FILE “”<br />
[ID_IO , “”<br />
[INPUTS<br />
B, [-] [, [-]]<br />
[B, [-] [, [-]]]]<br />
[OUTPUTS<br />
B, [-] [, [-]]<br />
[B, [-] [, [-]]]] ]<br />
[ID_PAC , , “”]<br />
[ID_IDEX , , , , , “”]<br />
[ID_SLV , , , , “”,<br />
“”]<br />
.END_PROFIBUS_DEF<br />
Felder:<br />
Nummer der PROFIBUS Karte. Gültige Werte sind 1 bis 4.<br />
Text, der bei einem Fehler der Komponente angezeigt wird.<br />
Dateiangabe zum SyCon PB_File.<br />
Byte im Prozessabbild. Muss in der gleichen Reihenfolge wie in<br />
der SyCon Datei stehen.<br />
Zugeordnete Ein- resp. Ausgangs-Adresse (also ohne den<br />
Buchstaben E, I, A oder O) zum Bit im . Jedes <br />
fasst genau 8 , wobei das LSB ganz links (zuerst) steht.<br />
Nicht verwendete Bits werden mit 0 gekennzeichnet, Bereiche<br />
werden mit „-“ verbunden.<br />
ID der Komponente am PROFIBUS. Muss mit der Angabe aus<br />
SyCon übereinstimmen und ist eine Zahl zwischen 1 und 125.<br />
ID der Komponente in <strong>ECCO</strong>. Beachte, dass die PAC’s, die<br />
Slaves und die VI-Terminals je einen eigenen ID-Raum<br />
aufweisen.<br />
Antenne. Zahl zwischen 1 und 2. An Baluff IDEX Geräte können<br />
zwei Antennen je Auswerteinheit angeschlossen werden. In<br />
<strong>ECCO</strong> erhält dabei jede Antenne eine eigene ID-Nummer.<br />
Erstes Input-Byte im Prozessabbild. Dieser Wert ist aus der<br />
SyCon-Konfiguration zu entnehmen; Zahl zwischen 0 und 2047.<br />
Erstes Output-Byte im Prozessabbild. Dieser Wert ist aus der<br />
SyCon-Konfiguration zu entnehmen; Zahl zwischen 0 und 2047.<br />
Serielle Schnittstelle an dem PROFIBUS Slave. Nummer<br />
zwischen 1 und 21. An einem entsprechenden Buskoppler mit<br />
eigener Adresse können mehrere serielle Klemmen<br />
angeschlossen werden, welche in <strong>ECCO</strong> je eine eigene <br />
erhalten; zur Unterscheidung und zur eindeutigen Zuordnung<br />
wird dieses Feld benötigt.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 67/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF<br />
Bezeichner des angeschlossenen Slaves. Der Bezeichner ist<br />
der Dokumentation zum Slave zu entnehmen.<br />
Die Parameter zur seriellen Schnittstelle. Die Zeichenkette ist<br />
kanonisch aufgebaut und unten der Vollständigkeit halber<br />
wiedergegeben.<br />
Das Feld hat das Format:<br />
, , , <br />
Diese Felder haben dabei die übliche Bedeutung und möglichen Werte:<br />
Baud Rate. Mögliche Raten sind 1200, 2400, 4800, 9600 und<br />
19200 Baud.<br />
Angabe, ob und wie ein Parity-Check durchgeführt wird. Gültige<br />
Werte sind e für even, u für uneven und n für no Parity.<br />
Anzahl der Datenbits pro Wort. Gültige Werte sind 7 und 8<br />
Datenbits.<br />
Anzahl der Stopbits pro Wort. Gültige Werte sind 1 und 2<br />
Stopbits.<br />
Beachte, dass nicht alle Kombinationen zulässig sind. Es wird empfohlen, den Wert<br />
aus der Dokumentation zum Slave zu übernehmen.<br />
Die Bezeichner für sind zur Zeit VI, P<strong>AG</strong>O, MARKER, BARCODE, ELV und<br />
DEFAULT. Diese Liste kann jedoch erweitert werden, wenn neue Slaves unterstützt<br />
werden.<br />
Bemerkungen:<br />
Es können bis zu 30 PAC’s und 30 Slaves angeschlossen werden. Die Slaves und<br />
die PAC’s haben unabhängig voneinander die <strong>ECCO</strong> ID’s 1 bis 30; die VI-Terminals<br />
die ID’s 1 bis 15, wobei die ID mit der am Terminal eingestellten ID übereinstimmen<br />
muss. Es können bis zu 30 serielle Klemmen angeschlossen werden.<br />
Die Kommunikation ist nur gewährleistet, wenn sie mit der verwendeten Hardware<br />
übereinstimmt und mit den Einstellungen aus SyCon korrespondiert.<br />
Für jedes ID_IO Element ist mindestens ein INPUTS oder OUTPUS Block<br />
anzugeben. Die Reihenfolge muss die gleiche wie in der SyCon Datei sein. Die<br />
einzelnen Elemente werden in der jeweiligen Dokumentation genauer erläutert.<br />
Beispiel:<br />
.PROFIBUS_DEF 1, HILSCHER<br />
FILE “project.pb”<br />
ID_IO 5, “Beckhoff Slave 1”<br />
INPUTS<br />
B0, 001-008<br />
OUTPUTS<br />
B0, 001-008<br />
ID_PAC 7, 16, “PAC Achse links”<br />
ID_PAC 8, 17, “PAC Achse rechts”<br />
ID_IDEX 15, 1, 2, 402, 405, “IDEX Lesekopf Station 1”<br />
ID_SLV 22, 1, 1, VI, “9600,e,7,1”, “VI-Terminal”<br />
.END_PROFIBUS_DEF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 68/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PROJECT<br />
.PROJECT<br />
Spezifiziert die Projekt-Nummer.<br />
Syntax:<br />
.PROJECT <br />
Felder:<br />
Projekt-Nummer im Bereich 1 bis 65535.<br />
Bemerkungen:<br />
Kann verwendet werden, um eine kundenspezifische Projektnummer anzugeben.<br />
Beispiel:<br />
.PROJECT 1001<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 69/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PROTECTED / .END_PROTECTED<br />
.PROTECTED / .END_PROTECTED<br />
Schützt Ausgänge, variable Strings, Merker, Fehlermerker und Register vor dem<br />
lokalem Überschreiben.<br />
Syntax:<br />
.PROTECTED<br />
[-]<br />
[[-]]<br />
.END_PROTECTED<br />
Felder:<br />
Ein Ausgang, Merker, Fehlermerker, variabler String oder<br />
Register (RV oder RW). Dieses Element wird geschützt.<br />
optional: Dient zum Angeben eines Bereiches. In diesem Fall<br />
werden alle Elemente zwischen und <br />
geschützt. Ist eine Zahl ohne Kennbuchstaben.<br />
Bemerkungen:<br />
Die Überschreibung könnte von einem PC Programm (TSTRS, Debugger) oder vom<br />
Bedienterminal aus erfolgen. Im Falle einer versuchter Überschreibung eines<br />
geschützten Elementes wird am Bedienerterminal wird eine Fehlermeldung<br />
angezeigt und PC Programme erhalten ein Fehlertelegramm.<br />
Beispiel:<br />
.PROTECTED<br />
A001-032<br />
A193<br />
M100<br />
D101-199<br />
SR010-099<br />
SR200<br />
RV001<br />
RW101<br />
.END_PROTECTED<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 70/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PSL / .END_PSL<br />
.PSL / .END_PSL<br />
Beschreibt eine PSL-Bildschirmseite.<br />
Syntax:<br />
.PSL .<br />
<br />
.END_PSL<br />
Felder:<br />
Die Zeile der PSL-Seite, die beschrieben wird. Gültige Werte<br />
sind unten beschrieben.<br />
Die Spalte der PSL-Seite, die beschrieben wird. Gültige Werte<br />
sind unten beschrieben.<br />
Der zur Seite gehörende Programm-Code. Es dürfen nur die<br />
weiter unten aufgeführten Befehle verwendet werden.<br />
Die Adressierung nach . erlaubt die Navigation zwischen<br />
verschiedenen PSL-Seiten mit den Pfeiltasten am Benutzerterminal. Die Seiten sind<br />
so angeordnet:<br />
0.0<br />
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10<br />
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10<br />
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10<br />
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10<br />
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10<br />
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10<br />
7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10<br />
8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10<br />
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10<br />
10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10<br />
Es sind nur die folgenden Befehle im Block einer PSL-Seite erlaubt:<br />
ABS AND BMOV CALC CDATEDISP<br />
CLS CLS_WIN CREGDISP CTIMEDISP CTRDEC<br />
CTRDISP CTREQ CTRINC CTRPRES CTRRES<br />
CWRITE DATEDISP DO GET_PSL IF<br />
IFNOT INM INP JMPCOND JMPTIM<br />
JPEQ JPGT JPLT JUMP MOV<br />
NOT OR RD_DATE RD_PUFFER RD_TIME<br />
REGDISP SCALE_AD SCALE_DA SEND_IO SEND_REG<br />
SEND_SR SET_LANG SET_PSL SETBIT SETTIM<br />
SMOV SWITCH TIMEDISP VI_CLRKEY VI_DATE<br />
VI_JMPKEY VI_RDISP VI_READ VI_TIME VI_WRITE<br />
WAITIM WHILE WRITE XOR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 71/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PSL / .END_PSL<br />
Bemerkungen:<br />
Die Seiten sind von 1.1 bis 10.10 numeriert.<br />
Eine spezielle Position nimmt die Seite 0.0 ein: Diese Seite wird immer beim Start<br />
aktiviert, wenn noch keine Pfeiltaste betätigt wurde. Sinnvollerweise wird hier nur ein<br />
Befehl zum Löschen des Displays oder eine allgemeine Maschineninformation<br />
programmiert.<br />
Wenn das Programm beim Befehl .END_PSL angelangt ist, findet ein Sprung zum<br />
Beginn der PSL-Seite statt.<br />
Im Automatenmodus ist immer genau ein PSL-Task aktiv und muss nicht vom<br />
Hauptprogramm gestartet werden. Der PSL-Task wird gestoppt, sobald ein Display-<br />
oder Fehler-Task aktiv ist. Wenn kein Display- oder Fehler-Task mehr aktiv ist,<br />
beginnt der PSL-Task vom Anfang des Blocks an zu laufen.<br />
Um nicht unnötig Prozessorresourcen für den PSL-Task zu verwenden, wird<br />
empfohlen, im Block einen Timer einzubauen, der rund 2 bis 5 Sekunden<br />
verzögert.<br />
Beispiel:<br />
Dieses Beispiel zeigt, wie mit dem PSL-Task Produktionsdaten angezeigt werden:<br />
.PSL 1.1<br />
CLS_WIN 0, 110 ; Lösche benötigten Platz<br />
WRITE 1, 60, 1, “Register 1001:”<br />
WRITE 1, 70, 1, “Register 1002:”<br />
$LOOP_11: ; Aktualisiere nur was nötig<br />
REGDISP 15,60, 1, RW1001, “#9.0.0# dez”<br />
REGDISP 15,70, 1, RW1002, “#9.0.0# dez”<br />
SETTIM T0, 300 ; Warte 3 Sekunden<br />
WAITIM T0<br />
JUMP $LOOP_11 ; Aktualisiere Werte<br />
.END_PSL<br />
Siehe auch:<br />
60 .LIMITS<br />
95 ABS<br />
96 AND<br />
97 BMOV<br />
98 CALC<br />
106 CDATEDISP<br />
109 CLS<br />
110 CLS_WIN<br />
113 CREGDISP<br />
115 CTIMEDISP<br />
266 CTRDEC<br />
267 CTRDISP<br />
268 CTREQ<br />
269 CTRINC<br />
270 CTRPRES<br />
271 CTRRES<br />
116 CWRITE<br />
113 DATEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 72/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .PSL / .END_PSL<br />
118 DO / DO_WHILE / DO_WHILENOT<br />
122 GET_PSL<br />
149 IF / IFNOT / ELSE / END_IF<br />
151 INM<br />
152 INP<br />
154 JMPCOND<br />
155 JMPTIM<br />
157 JPEQ<br />
158 JPGT<br />
159 JPLT<br />
160 JUMP<br />
166 MOV<br />
171 NOT<br />
176 OR<br />
183 RD_DATE<br />
184 RD_PUFFER<br />
186 RD_TIME<br />
187 REGDISP<br />
193 SCALE_AD<br />
196 SCALE_DA<br />
198 SEND_IO<br />
200 SEND_REG<br />
201 SEND_SR<br />
202 SET_LANG<br />
203 SET_PSL<br />
204 SETBIT<br />
205 SETTIM<br />
210 SMOV<br />
229 SWITCH / CASE /DEFAULT / END_SWITCH<br />
230 TIMEDISP<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
247 WAITIM<br />
248 WHILE / WHILENOT / END_WHILE<br />
250 WRITE<br />
252 XOR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 73/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .SET_CONST / .END_CONST<br />
.SET_CONST / .END_CONST<br />
Definiert Konstanten, welche auch Aliases für Slaves sein können.<br />
Syntax:<br />
.SET_CONST<br />
[KW = ]<br />
[KV = ]<br />
[FW = ]<br />
[KV = ]<br />
.END_CONST<br />
Felder:<br />
Zahl im Bereich 1 bis 512 für KW und KV, im Bereich 1 bis 128<br />
für FW.<br />
Wert, mit dem die Konstante belegt wird. Bei KV eine 16-bit<br />
Zahl, bei KW eine 32-bit Zahl und bei FW eine Art Fliesskomma-<br />
Zahl.<br />
Alias für einen Regel-Slave.<br />
Das Format für ist:<br />
.<br />
Dabei ist<br />
Entweder SV, DA oder AD.<br />
Adresse des Slaves. Zahl zwischen 1 und 15.<br />
Adresse des Servos oder des Wandlers auf dem Slave.<br />
Bemerkungen:<br />
Als Regel-Slave wird meist ein PAC der Firma <strong>Horsch</strong> <strong>AG</strong> eingesetzt.<br />
Konstanten vom Typ FW sind Fliesskomma-Konstanten mit vier Nachkomma-Stellen.<br />
Sie werden als Fixkomma-Ersatz bei Regel-Slaves und dem PAC verwendet. Es<br />
können bis zu 512 KW, 512 KV und zusätzlich 128 FW deklariert werden.<br />
Beispiel:<br />
.SET_CONST<br />
; 16 bit Ganzzahl-Konstanten<br />
KV001 = 1<br />
KV002 = 2<br />
; 32 bit Ganzzahl-Konstanten<br />
KW101 = 123456789<br />
KW102 = -2<br />
; Fliesskomma-Zahlen<br />
FW001 = 3.1416<br />
; PAC<br />
KV003 = SV1.1 ; Slave 1, Servo 1<br />
KV004 = DA1.1 ; Slave 1, A/D-Wandler<br />
KV005 = AD2.1 ; Slave 2, D/A-Wandler<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 74/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .SET_CONST / .END_CONST<br />
.END_CONST<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 75/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .SETLABEL<br />
.SETLABEL<br />
Schreibt die Adresse eines Programmlabels in das compilierte Programm.<br />
Syntax:<br />
.SETLABEL <br />
Felder:<br />
Label, dessen Adresse hierhin geschrieben wird.<br />
Bemerkungen:<br />
Der Befehl wird nur zusammen mit dem .ADDRESS Befehl verwendet, um eine<br />
Programmtabelle für das compilierte Programm zusammenzustellen. Er ist wie folgt<br />
zu verwenden:<br />
.ADRESS 26<br />
.SETLABEL STRESP ; Störung-Restart Programm<br />
.SETLABEL NSRESP ; Notstop-Restart Programm<br />
.SETLABEL NRMPGM ; Normierungs-Programm<br />
.SETLABEL STPGM ; Störungs-Programm<br />
.SETLABEL NSPGM ; Notstop-Programm<br />
.SETLABEL NULL ; frei<br />
.SETLABEL NULL ; frei<br />
.SETLABEL NULL ; frei<br />
.SETLABEL NULL ; frei<br />
.SETLABEL HPPGM ; Haupt-Programm<br />
.SETLABEL BACKPGM ; Background-Programm<br />
Siehe auch:<br />
47 .ADDRESS<br />
255 BACKPGM<br />
259 HPPGM<br />
260 NRMPGM<br />
261 NSPGM<br />
262 NSRESP<br />
263 STPGM<br />
264 STRESP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 76/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .SLCE_DEF / .END_SLCE_DEF<br />
.SLCE_DEF / .END_SLCE_DEF<br />
Ermöglicht die Verwendung von beschreibenden Bezeichnern im SLCE Befehl.<br />
Syntax:<br />
.SLCE_DEF<br />
<br />
[ ]<br />
.END_SLCE_DEF<br />
Felder:<br />
Beschreibender Bezeichner, bis zu 30 Zeichen lang.<br />
Wert für . Die genaue Bedeutung hängt vom<br />
verwendeten Regel-Slave ab.<br />
Bemerkungen:<br />
Beachte, dass zwischen und kein Komma steht, sondern<br />
lediglich ein (oder mehrere) Leerzeichen.<br />
Beispiel:<br />
.SLCE_DEF<br />
Minimum_Zone1 36<br />
Maximum_Zone1 37<br />
Wert_an_irgendeinem_Punkt 38<br />
.END_SLCE_DEF<br />
Siehe auch:<br />
78 .SLCS_DEF / .END_SLCS_DEF<br />
206 SLCE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 77/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .SLCS_DEF / .END_SLCS_DEF<br />
.SLCS_DEF / .END_SLCS_DEF<br />
Ermöglicht die Verwendung von beschreibenden Bezeichnern im SLCS Befehl.<br />
Syntax:<br />
.SLCS_DEF<br />
<br />
[ ]<br />
.END_SLCS_DEF<br />
Felder:<br />
Beschreibender Bezeichner, bis zu 30 Zeichen lang.<br />
Wert für . Die genaue Bedeutung hängt vom<br />
verwendeten Regel-Slave ab.<br />
Bemerkungen:<br />
Beachte, dass zwischen und kein Komma steht, sondern<br />
lediglich ein (oder mehrere) Leerzeichen.<br />
Beispiel:<br />
.SLCS_DEF<br />
Unteres_Limit 1<br />
Oberes_Limit 2<br />
Aufzeichnungslaenge 10<br />
Noch_ein_Befehl 11<br />
.SLCS_DEF<br />
Siehe auch:<br />
77 .SLCE_DEF / .END_SLCE_DEF<br />
207 SLCS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 78/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STATIONS / STATION / .END_STATIONS<br />
.STATIONS / STATION / .END_STATIONS<br />
Weist den Stationen ein Label und einen Text in Landessprache zu.<br />
Syntax:<br />
.STATIONS []<br />
STATION , “”<br />
[STATION , “”]<br />
.END_STATIONS<br />
Felder:<br />
Label (bestehend aus drei Buchstaben) der Landessprache. Für<br />
jede in .LANGU<strong>AG</strong>ES definierte Sprache muss ein eigener<br />
solcher Stations-Block vorhanden sein. Ist nur eine Sprache<br />
definiert, so ist die Angabe der Sprache optional.<br />
Programm-Label, bei dem der zugehörige Code beginnt.<br />
Text-Beschrieb für die Station in der Landessprache.<br />
Bemerkungen:<br />
Um eine Station (aus dem <strong>Manual</strong>modus) vom Terminal aus zu starten, muss zuerst<br />
die „STAT“-Taste gedrückt werden. Danach gibt es zwei Möglichkeiten: „VALUE“-<br />
Taste, gefolgt von der Stationsnummer und der „=“-Taste; oder durch Suchen über<br />
die Pfeiltasten. Auf dem Benutzerterminal erscheint jeweils der . Die Station<br />
wird mit der „START“-Taste gestartet.<br />
Der soll den Bediener über die Funktion der gewählten Station informieren<br />
und ist somit eine wichtige Information.<br />
Um das Blättern mit der Pfeiltaste zu ermöglichen, müssen alle Stationen aufgeführt<br />
werden.<br />
Beispiel:<br />
.STATIONS GER<br />
STATION STAT1, “S1 Laden”<br />
STATION STAT2, “S2 Operation”<br />
STATION STAT3, “S3 Entladen”<br />
.END_STATIONS<br />
Siehe auch:<br />
59 .LANGU<strong>AG</strong>ES<br />
60 .LIMITS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 79/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STATISTIC / GROUP / .END_STATISTIC<br />
.STATISTIC / GROUP / .END_STATISTIC<br />
Dient zur Konfiguration von STATREAD.<br />
Syntax:<br />
.STATISTIC []<br />
GROUP , “” [, , , ]<br />
VAL ., , , ,<br />
“”<br />
PRM ., , , ,<br />
, , , ,<br />
, “”<br />
.END_STATISTIC<br />
Felder:<br />
Label der Landessprache, bestehend aus drei Buchstaben. Für<br />
jede in .LANGU<strong>AG</strong>ES definierte Sprache muss ein eigener<br />
solcher Block vorhanden sein. Ist nur eine Sprache definiert, so<br />
ist die Angabe der Sprache optional. Ist keine Sprache<br />
deklariert (die .LANGU<strong>AG</strong>ES Anweisung fehlt), so wird Deutsch<br />
GER angenommen.<br />
Nummer der Statistik-Gruppe. Wert zwischen 1 und 20.<br />
Zeichenkette als Bezeichner für die Statistik-Gruppe, den<br />
Messwert oder den Parameter in der Landessprache, bis zu 30<br />
Zeichen lang.<br />
optional: Beliebiger Pfad und Dateiname für die Serienummer-<br />
Datenbank. Wird dieses Feld angegeben, so müssen auch<br />
und angegeben sein.<br />
optional: Position des Eintrags innerhalb der Serienummer-<br />
Datenbank. Ist angegeben, muss auch dieses Feld<br />
angegeben sein.<br />
optional: Schlüssel-Länge innerhalb der Serienummer-<br />
Datenbank. Ist angegeben, muss auch dieses Feld<br />
angegeben sein.<br />
Nummer des Messwerts. Zahl zwischen 1 und 255.<br />
Datentyp des Messwerts oder Parameters. Gültige Bezeichner<br />
mit ihrer Bedeutung werden weiter unten angegeben.<br />
Anzahl der Dezimalstellen zur Darstellung von Fixpunkt-Zahlen.<br />
Flag, das angibt, ob eine statistische Auswertung erfolgen soll.<br />
0 steht dabei für NEIN, 1 für JA.<br />
Nummer des Parameters. Zahl zwischen 0 und 255.<br />
Benötigte Sicherheitsstufe zur Änderung des Parameters als<br />
Zahl im Bereich 0 bis 9. Die genaue Bedeutung wird weiter<br />
unten gegeben.<br />
Register für den Sollwert. Die Bedeutung der Notation ist weiter<br />
unten angegeben.<br />
Register für den oberen Grenzwert. Die Bedeutung wird weiter<br />
unten gezeigt.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 80/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STATISTIC / GROUP / .END_STATISTIC<br />
Register für den unteren Grenzwert. Die Bedeutung wird weiter<br />
unten gezeigt.<br />
Register für die obere Eingreif-Grenze. Die Bedeutung wird<br />
weiter unten gezeigt.<br />
Register für die untere Eingreif-Grenze. Die Bedeutung wird<br />
weiter unten gezeigt.<br />
Für sind folgende Bezeichner möglich:<br />
CODE Fehlercode. Ganzzahl, die den Bearbeitungsprozess beschreibt.<br />
DATE Datum in Tagen seit dem 1. Januar 1980. Wird in STATREAD<br />
mit Datum bezeichnet.<br />
FIXED Vorzeichenbehaftete Fixpunkt-Zahl, mit von gegebener<br />
Anzahl Nachkomma-Stellen. Wird in STATREAD mit Float<br />
bezeichnet.<br />
LONG Vorzeichenbehaftete Zahl.<br />
MACHINE Maschinen-Nummer. Ganzzahl, welche die Anlage beschreibt.<br />
Wird in STATREAD mit Mach-Nr bezeichnet.<br />
PART_NO Eindeutige Werkstück-EDV-Nummer. Wird in STATREAD mit<br />
EDV-Nr bezeichnet.<br />
SER_NO -ter Teil der Werkstück-Serienummer. ist dabei eine<br />
Ziffer. Wird in STATREAD mit Ser-Nr bezeichnet.<br />
TIME Zeit in Sekunden seit Mitternacht mit zwei Nachkommastellen<br />
für die Auflösung von Hundertstel-Sekunden. Wird in<br />
STATREAD mit Uhrzeit bezeichnet.<br />
TIME_VAL Zeitdauer-Wert in Sekunden mit zwei Nachkommastellen für die<br />
Auflösung von Hundertstel-Sekunden. Wird in STATREAD mit<br />
Zeit bezeichnet.<br />
verwendet fünf Sicherheitsstufen. Damit werden nicht alle möglichen<br />
Stufen in STATREAD verwendet. Der Benutzer braucht mindestens folgende Stufe,<br />
um die angegebenen Tätigkeiten ausführen zu dürfen:<br />
4 Parameter kreieren und modifizieren<br />
Register-Sets kreieren und modifizieren<br />
3 Auftrags-Nummern kreieren und modifizieren<br />
Reset-Zeit der Fehlerquote ändern<br />
2 Aktuelle Parameter setzen, ausdrucken und ansehen<br />
Register-Sets an Steuerung übermitteln und ausdrucken<br />
Fehler-Log löschen<br />
Zurücksetzen einer Fehlerquote<br />
Reset-Zeit der Fehlerquote aktivieren und deaktivieren<br />
1 Auftrags-Nummern übermitteln und löschen<br />
Eintrag in der History vornehmen<br />
0 Eigenes Passwort ändern<br />
Für , , , und wird eine<br />
von der Norm abweichende Notation verwendet, welche nicht nur das zu<br />
verwendende RW Register angibt, sondern auch, ob überhaupt ein solches Register<br />
benötigt wird. Mögliche Werte sind:<br />
-1 Es wird kein Register in <strong>ECCO</strong> für den Wert verwendet (es<br />
werden also auch keine Daten übertragen); zudem kann in<br />
STATREAD der Wert nicht eingegeben werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 81/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STATISTIC / GROUP / .END_STATISTIC<br />
0 Es wird kein Register in <strong>ECCO</strong> für den Wert verwendet (es<br />
werden also auch keine Daten übertragen), es kann aber in<br />
STATREAD ein Wert eingegeben werden, welcher dann<br />
beispielsweise zur statistischen Auswertung verwendet werden<br />
kann.<br />
1 bis 2047 Der Parameter wird an die <strong>ECCO</strong> Steuerung übertragen und im<br />
RW Register mit der entsprechenden Nummer abgelegt.<br />
Bemerkungen:<br />
Dieser Block dient zur Konfiguration der STATREAD Statistik wird innerhalb des<br />
<strong>ECCO</strong> Programms. Anhand dieser Informationen kann der Compiler direkt die .INI<br />
Dateien für STATREAD generieren.<br />
Soll die Auswertung nicht durch STATREAD erfolgen, so wird dieser Block nicht<br />
benötigt.<br />
Die PRM Parameter dienen zur dynamischen Konfiguration der Anlage (somit<br />
Eingabe-Werte sind), während die VAL Werte Messresultate übertragen (und somit<br />
Ausgabe-Werte sind).<br />
Die folgenden Befehle werden im Zusammenhang mit der STATREAD Statistik<br />
verwendet:<br />
CLR_PUFFER MOV_PUFFER NEW_PUFFER POWER_OFF PUFFER<br />
RD_PUFFER SCHICHT STAT_CLR STAT_SEND STAT_TAKT<br />
STCKZAHL<br />
Zu jedem Parameter mit Soll-Wert können oberer und unterer Grenzwert und obere<br />
und untere Eingreif-Grenze angegeben werden. Der Unterschied zwischen den<br />
Grenzwerten und den Eingreif-Grenzen liegt darin, dass alle Werkstücke, bei denen<br />
der Parameter ausserhalb des Bereichs der Grenzwerte ist, als Ausschuss gelten.<br />
Demgegenüber dienen die Eingreif-Grenzen mehr als „Warnung“, ausserhalb derer<br />
der Programmierer korrektive Massnahmen ausprogrammieren kann (wie Auto-<br />
Kalibration). Werden somit Eingreif-Grenzen spezifiziert, sollten sie innerhalb des<br />
Bereichs der Grenzwerte liegen.<br />
Beispiel:<br />
Das Beispiel beschriebt eine Anlage mit einer Statistik-Gruppe.<br />
.STATISTIC GER<br />
GROUP 1, “Gruppe 1”, H:\SerNos\ser.btr, 1, 2<br />
VAL 1.1, PART_NO, 0, 0, “Werkstück-Nummer”<br />
VAL 1.2, DATE, 0, 0, “Datum”<br />
VAL 1.3, CODE, 0, 0, “Fehlercode”<br />
VAL 1.4, TIME_VAL, 2, 1, “Takt-Zeit”<br />
VAL 1.5, FIXED, 3, 1, “Wert (3 Dezimalstellen)”<br />
PRM 1.0, LONG, 0, 4, 610,611,612,-1,-1, “Prm 1”<br />
PRM 1.5, LONG, 0, 3, 615, 0, 0,-1,-1, “Wert zu Val1.5”<br />
.END_STATISTIC<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 82/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STATISTIC / GROUP / .END_STATISTIC<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
108 CLR_PUFFER<br />
169 MOV_PUFFER<br />
170 NEW_PUFFER<br />
179 POWER_OFF<br />
182 PUFFER<br />
184 RD_PUFFER<br />
197 SCHICHT<br />
208 STAT_CLR<br />
212 STAT_SEND<br />
214 STAT_TAKT<br />
215 STCKZAHL<br />
[6] STATREAD – User’s Guide, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.26, 1997.<br />
[7] STATREAD + STATCALC – Configuration and Technical Documentation,<br />
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.26, 1997.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 83/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STOP_IO_TEXT<br />
.STOP_IO_TEXT<br />
Begrenzt die Ausgabe von IO Texten bei der Ausgabe im „Stop“ Modus.<br />
Syntax:<br />
.STOP_IO_TEXT <br />
Felder:<br />
Anzahl Zeichen, auf den die Ausgabe begrenzt wird.<br />
Bemerkungen:<br />
Anwenderprogramme lassen sich fast beliebig mit der „Stop“-Taste unterbrechen.<br />
Sobald das Programm anhält, erscheint die Meldung „PROGRAMM STOPPED“ und<br />
die „Esc“- und „OK“-Tasten leuchten; zudem zeigt die Laufzeit-Umgebung die<br />
Eingänge an, auf welche das Programm wartet. Mit diesem Befehl wird die<br />
Bezeichnung eben dieser Eingänge beschränkt.<br />
In allen anderen Situationen (beispielsweise beim SMOV Befehl) wird aber der<br />
vollständige IO Text verwendet.<br />
Beispiel:<br />
.STOP_IO_TEXT 90 ; beschränke IO-Texte bei<br />
; “Stop” auf 90 Zeichen.<br />
Siehe auch:<br />
57 .IO_TEXT / .END_IO_TEXT<br />
210 SMOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 84/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STRING_REG / .END_STRING_REG<br />
.STRING_REG / .END_STRING_REG<br />
Deklariert das Format eines variablen Strings.<br />
Syntax:<br />
.STRING_REG<br />
SR[-] = <br />
[SR[-] = ]<br />
.END_STRING_REG<br />
Felder:<br />
Erstes SR Register, dessen Typ angegeben wird.<br />
Art des Formates des Strings. Gültige Bezeichner sind unten<br />
aufgeführt.<br />
optional: Letztes SR Register, dessen Typ in dieser Zeile<br />
angegeben wird.<br />
Mögliche Bezeichner von sind:<br />
D Datumsformat, wie es beispielsweise von DATEDISP verwendet<br />
wird: #jjjj/mm/tt#.<br />
R Registerformat, wie es beispielsweise von REGDISP verwendet<br />
wird: #8.4.2#.<br />
T Zeitformat, wie es beispielsweise von TIMEDISP verwendet<br />
wird: #hh:mm:ss:pp#.<br />
Bemerkungen:<br />
Strings sind bis zu 120 Zeichen lang, wobei der Formatstring in den ersten 30<br />
Zeichen auftauchen muss.<br />
Da Strings ohne Formatierung keinen Bezeichner haben, werden sie hier<br />
nicht aufgeführt. Der Block muss vor .IO_TEXT stehen.<br />
Beispiel:<br />
.STRING_REG<br />
SR100-199=R<br />
SR200-249=T<br />
SR250-259=D<br />
.END_STRING_REG<br />
Siehe auch:<br />
57 .IO_TEXT / .END_IO_TEXT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 85/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STRINGS / .END_STRINGS<br />
.STRINGS / .END_STRINGS<br />
Dieser Compileranweisung definiert die konstanten Strings in einer Landessprache.<br />
Syntax:<br />
.STRINGS []<br />
ST = “”<br />
[ST = “”]<br />
.END_STRINGS<br />
Felder:<br />
Label (bestehend aus drei Buchstaben) der Landessprache. Für<br />
jede in .LANGU<strong>AG</strong>ES definierte Sprache muss ein eigener<br />
solcher Block vorhanden sein. Ist nur eine Sprache definiert, so<br />
ist die Angabe der Sprache optional.<br />
ST Bezeichner des Strings, dem der zugewiesen wird. Zur<br />
Numerierung siehe unten.<br />
Text, der dem Bezeichner zugewiesen wird.<br />
Bemerkungen:<br />
Bis zu 2048 Strings können für jede Landessprache definiert werden. Die<br />
Numerierung der Strings beginnt mit 1 und wird jedesmal um 1 ohne Lücken<br />
inkrementiert.<br />
Je nach Einsatz enthält der Formatanweisungen oder nicht. Diese werden<br />
bei den Ausgabe-Befehlen erläutert.<br />
CDATEDISP CREGDISP CTIMEDISP CWRITE DATEDISP<br />
HP_CDATEDISP HP_CREGDISP HP_CTIMEDISP HP_CWRITE HP_DATEDISP<br />
HP_REGDISP HP_TIMEDISP HP_WRITE NUM_INP REGDISP<br />
TIMEDISP VI_DATE VI_TIME VI_WRITE WRITE<br />
Beispiel:<br />
.STRINGS GER<br />
ST001 = “String ohne Formatanweisung.”<br />
ST002 = “String mit #8.4.2# Format.”<br />
.END_STRINGS<br />
Siehe auch:<br />
59 .LANGU<strong>AG</strong>ES<br />
106 CDATEDISP<br />
113 CREGDISP<br />
115 CTIMEDISP<br />
116 CWRITE<br />
117 DATEDISP<br />
129 HP_CDATEDISP<br />
132 HP_CREGDISP<br />
134 HP_CTIMEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 86/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .STRINGS / .END_STRINGS<br />
136 HP_CWRITE<br />
132 HP_DATEDISP<br />
139 HP_REGDISP<br />
140 HP_TIMEDISP<br />
142 HP_WRITE<br />
173 NUM_INP<br />
187 REGDISP<br />
230 TIMEDISP<br />
238 VI_DATE<br />
244 VI_TIME<br />
246 VI_WRITE<br />
250 WRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 87/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .TEXT<br />
.TEXT<br />
Gibt einen kurzen Text zur Bezeichnung des Programms an.<br />
Syntax:<br />
.TEXT “”<br />
Felder:<br />
Text, der zur Bezeichnung des Programms verwendet wird.<br />
<strong>ECCO</strong> zeigt diesen Text automatisch bei der Initialisierung,<br />
nach dem Laden eines Programmes und nach dem Einschalten<br />
der Stromversorgung an.<br />
Bemerkungen:<br />
Diese Anweisung ermöglicht es, einen Text zu definieren, der beim Aufstarten des<br />
Programms auf der untersten Zeile am Terminal angezeigt wird. Typisch ist dies das<br />
Datum und die Versionsnummer der Software.<br />
Beispiel:<br />
.TEXT “BASE_200 Rev.1.01, 01.01.2004/autor”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 88/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .TINP_TEXT / .END_TINP_TEXT<br />
.TINP_TEXT / .END_TINP_TEXT<br />
Definiert die Parameter-Übergabe für den TINP Befehl.<br />
Syntax:<br />
.TINP_TEXT<br />
TIMEOUT <br />
CONDITION <br />
IO_TEXT <br />
REGISTER <br />
.END_TINP_TEXT<br />
Felder:<br />
Wird vom Betriebssystem mit dem Text “TIMEOUT AT LINE:<br />
#6.0.0#?” initialisiert.<br />
Gerät der TINP Befehl in einen Timeout, dann schreibt das<br />
Betriebssystem in dieses Register die erste nicht erfüllte<br />
Bedingung.<br />
Gerät der TINP Befehl in einen Timeout, dann schreibt das<br />
Betriebssystem in dieses Register den .IO_TEXT der ersten<br />
nicht erfüllten Bedingung in der gewählten Landessprache.<br />
Register vom Typ RW in welches das Betriebssystem die Zeile<br />
schreibt, in der der TINP Befehl einen Timeout hatte.<br />
Bemerkungen:<br />
Das genaue Zusammenspiel zwischen diesem Befehl und .ERROR_CODE_START,<br />
ERROR_PROTOTYPE, TINP, Fehlermerker und variablen Strings wird im TINP Befehl<br />
erläutert.<br />
Die Position dieses Befehls wird im Beispiel gezeigt und ist zwingend.<br />
Bei der Portierung alter Programme ist darauf zu achten, dass in SMC42<br />
ein Register vom Typ RV sein musste; in <strong>ECCO</strong> muss es nun ein RW Register sein.<br />
Beispiel:<br />
Dieser Befehl wird kanonisch wie folgt verwendet:<br />
.ADDRESS 0<br />
NULL:<br />
.ERROR_CODE_START 25000 ; Min. Val. 5000, Max. 25000<br />
.TINP_TEXT<br />
TIMEOUT SR0101 ;TIMEOUT AT LINE<br />
CONDITION SR0102 ;1ST UNMATCHED CONDITION<br />
IO_TEXT SR0103 ;IO_TEXT OF THE UNM. COND<br />
REGISTER RW0069 ;<strong>ECCO</strong> PROGRAM LINE NUMBER<br />
.END_TINP_TEXT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 89/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .TINP_TEXT / .END_TINP_TEXT<br />
Siehe auch:<br />
47 .ADDRESS<br />
52 .ERROR_CODE_START<br />
57 .IO_TEXT / .END_IO_TEXT<br />
255 ERROR_PROTOTYPE<br />
234 TINP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 90/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .UNLOCK / .END_UNLOCK<br />
.UNLOCK / .END_UNLOCK<br />
Ermöglicht das Setzen von Ausgängen, Registern, variablen Strings, Fehlermerker<br />
und Merker durch fremde <strong>ECCO</strong> Steuerungen.<br />
Syntax:<br />
.UNLOCK<br />
[-]<br />
[[-]]<br />
.END_UNLOCK<br />
Felder:<br />
Ein Ausgang, Merker, Fehlermerker, variabler String oder<br />
Register (RV oder RW). Dieses Element wird freigegeben.<br />
optional: Dient zum Angeben eines Bereiches. In diesem Fall<br />
werden alle Elemente zwischen und <br />
freigegeben. Ist eine Zahl ohne Kennbuchstaben.<br />
Bemerkungen:<br />
Ausgänge, Merker, Fehlermerker, variable Strings und Register sind vor der<br />
Überschreibung aus einer vernetzten SMC Steuerung automatisch geschützt; das<br />
Überschreiben muss explizit durch diesen Befehl erlaubt werden.<br />
Wird versucht, ein nicht freigegebenes Element zu überschreiben, dann wird bei der<br />
<strong>ECCO</strong>-Steuerung, die den Versuch zu überschreiben unternommen hat, die<br />
Fortsetzung der Programmzeile gestoppt, bis eine Unterbrechung im zugehörigen<br />
TIMETRAP, TRAP oder durch Auslösung des Notstops erfolgt. Dadurch laufen<br />
zumindest die übrigen Tasks weiter, auch wenn die fremde Steuerung nicht läuft.<br />
Beachte, dass keine Elemente mit .UNLOCK für den Fernzugriff freigegeben werden<br />
dürfen, die mit .PROTECTED lokal geschützt werden.<br />
Beispiel:<br />
.UNLOCK<br />
A001-032<br />
A193<br />
M100<br />
D101-199<br />
SR100<br />
RV001<br />
RW101<br />
.END_UNLOCK<br />
Siehe auch:<br />
70 .PROTECTED / .END_PROTECTED<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 91/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
.ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
Definiert die diversen Parameter zur Kommunikation mit der ZPoint-Software.<br />
Syntax:<br />
.ZPOINT []<br />
ANL<strong>AG</strong>E “”, <br />
[RACK , ]<br />
GS , , , ,<br />
, , , “”<br />
M ., , ,<br />
, , , “”<br />
PRM .., ,<br />
“”<br />
EW .., ,<br />
“”<br />
VAL .., , ,<br />
“”<br />
.END_ZPOINT<br />
Felder:<br />
Label der Landessprache, bestehend aus drei Buchstaben. Für<br />
jede in .LANGU<strong>AG</strong>ES definierte Sprache muss ein eigener<br />
solcher Block vorhanden sein. Ist nur eine Sprache definiert, so<br />
ist die Angabe der Sprache optional. Ist keine Sprache<br />
deklariert (die .LANGU<strong>AG</strong>ES Anweisung fehlt), so wird Deutsch<br />
GER angenommen.<br />
Name der Anlage für die ZPoint-Software als String (bis zu 40<br />
Zeichen lang) in Landessprache.<br />
Anzahl der Grundsysteme der Anlage. Abhängig von der ZPoint<br />
Version.<br />
Datenbaustein-Nummer des Koppel-Bereiches. Es können bis<br />
zu 64 verschiedene Datenbausteine betrieben werden.<br />
Identifikation des Gateways, falls mehrere Gateways verwendet<br />
würden.<br />
Nummer des Grundsystem-Nummer. Zahl zwischen 1 und<br />
.<br />
Anzahl der Module in diesem Grundsystem, bis zu 56 möglich.<br />
Basis der Register-Nummer für den Registerblock<br />
Bedienvorgaben/Sollwerte.<br />
Basis der Flag-Nummer für den reservierten Merker-Block.<br />
Statistik-Gruppe der Produktionsdaten. Eine Zahl im Bereich 0<br />
bis 20, wobei 0 „keine Statistikdaten“ bedeutet.<br />
Name des Grundsystems in Landessprache, bis zu 40 Zeichen<br />
lang.<br />
Modul-Nummer, zwischen 0 und des<br />
Grundsystems. In PRM, EW und VAL Angaben bedeutet eine 0<br />
das Grundsystem, während die übrigen Zahlen auf ein<br />
tatsächliches Modul zeigen.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 92/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
Name des Moduls in Landessprache, bis zu 40 Zeichen lang.<br />
Parameter-Nummer. Die Nummer des Parameters ergibt implizit<br />
den Speicherplatz innerhalb des Koppelbausteins zu ZPoint.<br />
Die Parameter sind von 1 an lückenlos zu numerieren, wobei<br />
die Obergrenze durch die ZPoint-Rezeptur festgelegt wird.<br />
RW oder RV Register, das abgebildet wird.<br />
Name des Parameters als Text in Landessprache mit bis zu 40<br />
Zeichen.<br />
Nummer des Einstellwertes. Die Nummer jedes Einstellwertes<br />
ergibt implizit den Speicherplatz innerhalb des Koppel-<br />
Bausteins zu ZPoint.<br />
Name des Einstellwertes als Text in Landessprache, bis zu 40<br />
Zeichen lang.<br />
Nummer des Wertes im Bereich 1 bis 255. Die Nummer des<br />
Wertes ergibt implizit den Speicherplatz innerhalb des<br />
Koppelbausteins zu ZPoint.<br />
Datentyp des Wertes. Möglich ist S für vorzeichenbehaftet<br />
(signed) und U für vorzeichenlos (unsigned).<br />
Anzahl der Dezimalstellen für die Darstellung in Festkomma-<br />
Schreibweise.<br />
Name des Wertes in Landessprache, bis zu 40 Zeichen lang.<br />
Bemerkungen:<br />
ZPoint ist eine Produktions-Überwachungs- und Betriebssteuerungs-Software. Mit ihr<br />
ist es möglich, die Einstellwerte und Produktionsparameter der mit <strong>ECCO</strong><br />
gesteuerten Anlage zentral zu verwalten und zu ändern, und Messwerte,<br />
Produktionszeiten und weitere Angaben aus <strong>ECCO</strong> abzulegen.<br />
ZPoint kommuniziert mit <strong>ECCO</strong> über die sogenannte Gateway Funktionalität, welche<br />
automatisch die benötigten Werte der <strong>ECCO</strong> Register automatisch von und nach<br />
ZPoint transferiert. Zusätzlich werden die Produktdaten (in ZPoint VAL genannt) über<br />
Puffer an ZPoint übertragen.<br />
Ein Gateway ist die physikalische Schnittstelle und der logische Container der<br />
Statistikgruppen. Üblicherweise entspricht ein Grundsystem einer von <strong>ECCO</strong><br />
gesteuerten Anlage und ein Modul einer Station. Die genaue Zuteilung hat jedoch in<br />
jedem Fall der Kunde passend zu seiner ZPoint Konfiguration vorzunehmen.<br />
Bei der Verwendung von ZPoint sind unbedingt die einschlägigen Richtlinien und<br />
kundenseitigen Vorgaben einzuhalten.<br />
Die nachfolgenden Befehle werden zur Kommunikation mit ZPoint verwendet:<br />
.ERROR_FL<strong>AG</strong>_OFFSET GW_DD GW_DW GW_MSG GW_RD_DD<br />
GW_RD_DW MOV_PUFFER NEW_PUFFER PUFFER STAT_TAKT<br />
Die STATREAD Software bietet gewisse Funktionen in einer einfacheren und<br />
übersichtlicheren Form an.<br />
Beispiel:<br />
.ZPOINT GER<br />
ANL<strong>AG</strong>E “DEMO-ANL<strong>AG</strong>E”, 1<br />
RACK 108, 1<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 93/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
; 1 GS mit 2 Modulen, DB_No 109, Gateway ID 1, Register ...<br />
; ... ab RV/RW1900, Merker ab M0700, Statistikgruppe 1<br />
GS 1, 2, 109, 1, 1900, 0700, 1, “DEMO”<br />
; 2 Module<br />
M 1.1, 100, 1, 1910, 0710, 0, “MODUL 1”<br />
M 1.2, 101, 1, 1920, 0720, 0, “MODUL 2”<br />
; Parameter (2 zum GS, je 3 zu den Modulen)<br />
PRM 1.0.1, RW1500, “TYP”<br />
PRM 1.0.2, RW1510, “SOLL-TAKTZEIT”<br />
PRM 1.1.1, RW1521, “PARAMETER 1 FÜR MODUL 1”<br />
PRM 1.1.2, RW1522, “PARAMETER 2 FÜR MODUL 1”<br />
PRM 1.1.3, RW1523, “PARAMETER 3 FÜR MODUL 1”<br />
PRM 1.2.1, RW1524, “PARAMETER 1 FÜR MODUL 2”<br />
PRM 1.2.2, RW1525, “PARAMETER 2 FÜR MODUL 2”<br />
PRM 1.2.3, RW1526, “PARAMETER 3 FÜR MODUL 2”<br />
; Einstellwerte<br />
EW 1.0.1, RW1001, “IRGENDEIN OFFSET”<br />
EW 1.0.2, RW1002, “SONST EIN EINSTELLWERT”<br />
; Produktdaten<br />
VAL 1.0.1, S, 0, “TEIL-NUMMER”<br />
VAL 1.0.2, S, 3, “IRGENDEINE LÄNGE”<br />
.END_ZPOINT<br />
Siehe auch:<br />
52 .ERROR_FL<strong>AG</strong>_OFFSET<br />
59 .LANGU<strong>AG</strong>ES<br />
80 .STATISTIC / GROUP / .END_STATISTIC<br />
123 GW_DD<br />
124 GW_DW<br />
125 GW_MSG<br />
126 GW_RD_DD<br />
128 GW_RD_DW<br />
169 MOV_PUFFER<br />
170 NEW_PUFFER<br />
182 PUFFER<br />
214 STAT_TAKT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 94/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ABS<br />
ABS<br />
Weist den absoluten Betrag des Quellregisters dem Zielregister zu.<br />
Syntax:<br />
ABS , <br />
Felder:<br />
Zielregister vom Typ AV, AW, RV, RW, LV, LW oder ZW.<br />
Quellregister vom Typ AV, AW, RV, RW, LV, LW, KV, KW oder ZW.<br />
Bemerkungen:<br />
Bei Arrays können nur einzelne Elemente als Quelle oder Ziel dienen.<br />
Beispiel:<br />
MOV RW001, -5<br />
ABS RW002, RW001 ; RW002 = +5<br />
ABS AV001(1), AV001(2)<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 95/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> AND<br />
AND<br />
Der Zielwert entspricht der logischen UND-Verknüpfung aller angegebenen<br />
Quellwerten.<br />
Syntax:<br />
AND , [, ]<br />
oder<br />
AND , [, ]<br />
Felder:<br />
Ein Ausgang, Merker oder Fehlermerker.<br />
Ein Ausgang, Eingang, Merker oder Fehlermerker.<br />
Ein Register vom Typ AV, AW, RV, RW, LV, LW oder ZW.<br />
Ein Register (AV, AW, RV, RW, LV, LW, ZW, KV oder KW) oder ein<br />
direkter Zahlwert. Muss die gleiche Bitbreite wie <br />
aufweisen.<br />
Bemerkungen:<br />
Eine Vermischung von Registern einerseits und I/O’s und Merker andererseits ist<br />
nicht möglich.<br />
Bei I/O’s und Merker ist das Ziel genau dann H, wenn alle Quellen H sind. Bei Registern<br />
wird das Ergebnis bitweise gebildet; ein Ziel-Bit ist genau dann 1, wenn alle<br />
Quell-Bits 1 sind. Ist nur eine Quelle angegeben, entspricht das Ergebnis der Quelle.<br />
Das Ziel darf nicht eine der Quellen sein; es dürfen nur Ein- und<br />
Ausgänge der eigenen Steuerung angegeben sein.<br />
Beispiele:<br />
Der Ausgang A024 ist nur dann hoch gesetzt, wenn die Eingänge E010 bis E014<br />
hoch sind.<br />
AND A024, E010, E011, E012, E013, E014<br />
Das zweite Beispiel zeigt die Verwendung mit Registern.<br />
MOV LW001, 42 ; 101010(b)<br />
MOV LW002, 36 ; 100100(b)<br />
AND LW003, LW001,LW002 ; AND 100000(b) = 32<br />
AND LW004, LW001, 7 ; niedrigste Bits nach LW004<br />
; 010(b) = 2<br />
Siehe auch:<br />
171 NOT<br />
176 OR<br />
252 XOR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 96/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> BMOV<br />
BMOV<br />
Kopiert eine bestimmte Anzahl von Elementen von einem Array in ein anderes.<br />
Syntax:<br />
BMOV , , <br />
Felder:<br />
Der erste Index in dem Array, in welches kopiert wird.<br />
Der erste Index des Arrays, aus welchem kopiert wird.<br />
Anzahl der zu kopierenden Elementen. Ein Zahlwert, ein AV<br />
Element oder ein LV, RV oder KV Register.<br />
Bemerkungen:<br />
Sollten Arrayelemente nicht deklariert oder indirekt adressierte Register nicht<br />
vorhanden sein, wird der Systemfehler 65 „INDEX out of range“ generiert.<br />
Werden AW Elemente in ein AV Array kopiert, so werden die höherwertigen Bits<br />
abgeschnitten; im umgekehrten Fall wird vorzeichenbehaftet aufgefüllt.<br />
Beispiele:<br />
Kopiert die Elemente 10 bis 12 aus dem Array AV002 in die Elemente 1 bis 3 des<br />
Arrays AV001.<br />
BMOV AV001(1), AV002(10), 3<br />
; AV001(1)
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> BUS_OFF<br />
BUS_OFF<br />
Beendet die Überwachung der Kommunikation einer Profibus Master Karte.<br />
Syntax:<br />
BUS_OFF <br />
Felder:<br />
Master Karte, welche beendet wird; Zahl zwischen 1 und 10.<br />
Bemerkungen:<br />
Das SW-Register, welches das Zugriffs-Recht für die angegebene Karte beinhaltet,<br />
wird auf Null zurückgesetzt. Das SW-Register hat die Adresse 40+.<br />
Beispiel:<br />
BUS_OFF 1 ; Beendet die Überwachung der<br />
; Komm. der ersten Karte und<br />
; setzt SW041 zurück.<br />
Siehe auch:<br />
67 .PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF<br />
99 BUS_ON<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 98/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> BUS_ON<br />
BUS_ON<br />
Startet die Watchdog-Überwachung der Kommunikation einer Profibus Master Karte.<br />
Syntax:<br />
BUS_ON <br />
Felder:<br />
Master Karte, welche gestartet wird; Zahl zwischen 1 und 10.<br />
Bemerkungen:<br />
Zum Aufstarten der Überwachung der entsprechenden Profibus Karte werden die<br />
Rechte aus dem USB Key ausgelesen. Liegen die benötigten Rechte nicht vor, so<br />
kann sich <strong>ECCO</strong> jederzeit und ohne Meldung aufhängen.<br />
Der Systemmerker M027 zeigt an, ob der USB Key vorhanden ist. Ist der Key<br />
vorhanden (und M027 somit H), so beinhaltet das Systemregister SW040 die<br />
Seriennummer des Keys.<br />
Die Systemregister SW041 bis SW050 zeigen an, ob eine Master Karte überwacht<br />
wird. Dazu beinhaltet das Systemregister mit der Adresse 40+ den Wert in<br />
SW040, wenn die Karte überwacht wird, und Null sonst.<br />
Beispiel:<br />
Das Beispiel versucht den Watchdog für die erste Master Karte nur dann zu starten,<br />
wenn der USB Key vorhanden ist. Ist der Befehl erfolgreich, so wird in SW041 die<br />
Seriennummer der Rechte stehen, um den Erfolg anzuzeigen.<br />
IF M027 H<br />
BUS_ON 1<br />
END_IF<br />
Siehe auch:<br />
67 .PROFIBUS_DEF / .MASTER / .END_PROFIBUS_DEF<br />
98 BUS_OFF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 99/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CALC<br />
CALC<br />
Führt eine Berechnung aus.<br />
Syntax:<br />
CALC , <br />
Felder:<br />
Register, in welches das Resultat geschrieben wird, vom Typ<br />
RV, RW, LV, LW, AV oder AW.<br />
Erster Operand. Ein SW, RV, RW, LV, LW, AV, AW, KV, KW oder ZW<br />
Register.<br />
Operator. Es sind die Grundoperationen +, -, * und / erlaubt.<br />
Zweiter Operand. Zusätzlich zu den in erlaubten<br />
Möglichkeiten ist auch ein direkter Zahlwert erlaubt.<br />
Bemerkungen:<br />
Ist das Zielregister 16 Bit breit, werden allfällig höherwertige Bits<br />
abgeschnitten.<br />
Es findet keine Überwachung für numerische Überläufe statt. Die Überwachung<br />
beschränkt sich lediglich auf Division mit Null.<br />
Beispiele:<br />
Verdoppelt den Wert in LW001 und schreibt das Resultat in LW002.<br />
CALC LW002, LW001 * 2<br />
Und gleich nochmals.<br />
CALC LW002, LW001 + LW001<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 100/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CALL<br />
CALL<br />
Verzweigt in eine Routine.<br />
Syntax:<br />
CALL <br />
Felder:<br />
Routine, zu der verzweigt wird.<br />
Bemerkungen:<br />
Ruft eine Routine auf, die bei dem unter definierten Namen startet. Die<br />
Routine wird mit dem RET-Befehl abgeschlossen, worauf das Programm unmittelbar<br />
nach dem CALL- Befehl weiterfährt.<br />
Es können maximal 16 Routinen verschachtelt werden.<br />
Für die Routine werden keine eigenen lokalen Register angelegt, die Routine „teilt<br />
sich“ somit die lokalen Register mit seinem Aufrufer. Wie auf Seite 26 gezeigt, darf<br />
CALL nur in einem Programmtask oder Backgroundtask verwendet werden. Innerhalb<br />
einer Überwachung ist der Befehl nicht erlaubt.<br />
Beispiel:<br />
Der Task STAT01 ruft die Routine SUB1 auf, die rein gar nichts macht.<br />
STAT01: ; aufrufender Task<br />
CALL SUB1 ; ruft SUB1 auf<br />
CLOSE<br />
SUB1: ; aufgerufene Routine<br />
RET ; macht gar nichts<br />
Siehe auch:<br />
175 OPEN<br />
189 RET<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 101/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CALLD<br />
CALLD<br />
Ruft einen Display-Task auf.<br />
Syntax:<br />
CALLD @, I, O, F,<br />
D, [, ]<br />
Felder:<br />
Label des Display-Tasks mit bis zu 15 Zeichen.<br />
Offset für die Eingänge, Ausgänge, Merker und Fehlermerker<br />
respektive, um den die entsprechenden Angaben in den<br />
Befehlen L_INP, L_OUTP und L_JMPCOND verschoben werden.<br />
muss ein Vielfaches von 8 sein.<br />
Übergebenes Argument vom Typ RV, RW, LV, LW, KV oder KW.<br />
Es müssen genau so viele Argumente wie in .DISPLAYS deklariert<br />
angegeben werden.<br />
Bemerkungen:<br />
Dieser Befehl startet den Displaytask beginnend beim @, welcher den<br />
aktuellen Task (ein normaler Programmtask oder ein Funktionstask) deaktiviert.<br />
Bei den Argumenten müssen zuerst die 32bit Argumente angegeben werden. Dabei<br />
wird das erste Argument in LW001 kopiert, das zweite in LW002 und so<br />
weiter. Danach folgen die 16bit Argumente, wobei das erste 16bit Argument LV001<br />
zugewiesen wird, das zweite LV002 und so weiter. Wichtig ist, dass nur 32bit Werte<br />
als 32bit Argumente, und 16bit Werte als 16bit Argumente verwendet werden dürfen.<br />
Es gibt demzufolge bis zu 32 LV und bis zu 32 LW Register im Displaytask.<br />
Alle Argumente werden am Ende des Display-Tasks (bei RETD) zurück geschrieben,<br />
sofern nicht schreibgeschützt ist (wie bei Konstanten oder Systemregister).<br />
Innerhalb eines Displaytasks dürfen keine Sprünge über die Taskgrenzen (bestimmt<br />
durch @ und das zugehörige RETD) erfolgen und keine weiteren Displaytasks<br />
oder Funktionstasks aufgerufen werden. Wird der RETD Befehl erreicht, so<br />
werden die Argumente wie oben beschrieben zurück kopiert, danach der Task,<br />
welcher den Displaytask aufrief, wieder aktiviert.<br />
Displaytasks dienen dazu, Bildschirm-Ausgaben und –Eingaben in einem klar<br />
definierten Umfeld vorzunehmen, und werden meist verwendet, um vom Bediener<br />
Parameter und Ähnliches abzufragen. Es ist höchstens ein Displaytask aktiv, der<br />
eine höhere Priorität als ein PSL-Task hat und diesen somit unterdrückt. Er kann von<br />
einem Fehlertask unterbrochen werden; nach dessen Ende wird er von Anfang an<br />
abgearbeitet, um einen definierten Bildschirmaufbau zu gewährleisten.<br />
Innerhalb einer Überwachung ist der Befehl nicht erlaubt. Wie auf Seite 26 gezeigt,<br />
ist der Befehl nur in einem normalen Programmtask oder einer Funktion erlaubt.<br />
Beispiel:<br />
Das Beispiel zeigt musterhaft die Verwendung des Displays. Dazu muss der<br />
Displaytask zuerst im .DISPLAYS Block deklariert werden:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 102/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CALLD<br />
.DISPLAYS<br />
@DISP1, 1.0 ; nur ein 32Bit Argument<br />
.DISP_END<br />
Der Displaytask kann dann implementiert werden:<br />
@DISP1:<br />
; tu was auch immer.<br />
; LW001 enthält das erste (und einzige) Argument.<br />
RETD<br />
Der Aufruf sieht dann folgendermassen aus:<br />
CALLD @DISP1, I0, O0, F0, D0, RW030<br />
Siehe auch:<br />
50 .DISPLAYS<br />
101 CALL<br />
161 L_INP<br />
163 L_JMPCOND<br />
164 L_OUTP<br />
190 RETD<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 103/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CALLF<br />
CALLF<br />
Ruft einen Funktions-Task auf.<br />
Syntax:<br />
CALLF #, I, O, F,<br />
D, [, ]<br />
Felder:<br />
Label des Funktions-Tasks mit bis zu 15 Zeichen.<br />
Offset für die Eingänge, Ausgänge, Merker und Fehlermerker<br />
respektive, um den die entsprechenden Angaben in den<br />
Befehlen L_INP, L_OUTP und L_JMPCOND verschoben werden.<br />
muss ein Vielfaches von 8 sein.<br />
Übergebenes Argument vom Typ RV, RW, LV, LW, KV oder KW.<br />
Bemerkungen:<br />
Bei den Argumenten müssen zuerst die 32bit Argumente angegeben werden. Dabei<br />
wird das erste Argument in LW001 kopiert, das zweite in LW002 und so<br />
weiter. Danach folgen die 16bit Argumente, wobei das erste 16bit Argument LV001<br />
zugewiesen wird, das zweite LV002 und so weiter. Wichtig ist, dass nur 32bit Werte<br />
als 32bit Argumente, und 16bit Werte als 16bit Argumente verwendet werden dürfen.<br />
Sämtliche Argumente werden am Ende des Funktionstasks zurückgeschrieben,<br />
sofern keine Konstante ist.<br />
Funktionen müssen im .FUNCTIONS Block deklariert sein. Abhängig von dieser hat<br />
der Funktionstask bis zu 32 LV und bis zu 32 LW Register.<br />
Mit diesem Befehl werden die Argumente, wie oben beschrieben, kopiert, der neue<br />
Funktionstask gestartet und der bisherige Task deaktiviert. Sobald der Funktionstask<br />
beendet, also auf RETF trifft, werden die Argumente zurückkopiert (sofern sie im aufrufenden<br />
Task keine Konstanten waren) und der aufrufende Task nach dem CALLF<br />
weiter bearbeitet. Wie auf Seite 26 gezeigt, kann der aufrufende Task kann ein<br />
Programm-, Background-, Error- oder Funktionstask sein. Innerhalb einer Überwachung<br />
ist der Befehl nicht erlaubt. Wurde die Funktion aus einem Backgroundtask<br />
aufgerufen, dürfen keine Displaybefehle oder CALLD verwendet werden.<br />
Beispiel:<br />
Das Beispiel zeigt einen Funktionstask. Die Beispiel-Deklaration ist:<br />
.FUNCTIONS<br />
#Funktion, 0.0, 1.2, “Beispiel-Funktion”<br />
.FUNC_END<br />
Der Funktionstask ist dann beispielsweise:<br />
#Funktion:<br />
; hier stehen LW001 und LV001, LV002 zur Verfügung<br />
RETF<br />
Aufgerufen wird das dann mit:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 104/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CALLF<br />
CALLF #Funktion, I0, O0, F0, D0, RW001, KV001, RV001<br />
Siehe auch:<br />
52 .FUNCTIONS / .FUNC_END<br />
101 CALL<br />
102 CALLD<br />
161 L_INP<br />
163 L_JMPCOND<br />
164 L_OUTP<br />
192 RETF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 105/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CDATEDISP<br />
CDATEDISP<br />
Schreibt das Datum aus einem Register in Farbe auf das Display.<br />
Syntax:<br />
CDATEDISP , , , , ,<br />
<br />
Felder:<br />
Spalte, ab der das Datum geschrieben wird. Gültige Werte<br />
liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie in den Abbildungen Seite 280 gezeigt.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
Register, welches das auszugebende Datum beinhaltet, vom<br />
Typ RW, AW oder LW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
hat folgendes Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
jjjj Schreibt das Jahr vierstellig.<br />
jj Schreibt das Jahr zweistellig.<br />
mm Schreibt den Monat zweistellig, also 01 für Januar bis 12 für<br />
Dezember.<br />
tt Schreibt den Tag im Monat zweistellig.<br />
Bemerkungen:<br />
Um das Datum in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Beispiel:<br />
Das Beispiel liest das Datum ein und gibt es dann rot aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
CDATEDISP 1, 20, 1, 2, RW101, “Heute ist: #tt/mm/jj#”<br />
Siehe auch:<br />
115 CTIMEDISP<br />
117 DATEDISP<br />
129 HP_CDATEDISP<br />
186 RD_TIME<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 106/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CLOSE<br />
CLOSE<br />
Schliesst einen parallelen Task.<br />
Syntax:<br />
CLOSE<br />
Bemerkungen:<br />
Trifft eine parallele Taktkette während dem Ablauf auf diesen Befehl, so wird dieser<br />
Task sofort geschlossen. Der Task verschwindet auch aus der aktiven Taskliste im<br />
Debugger.<br />
Beispiel:<br />
Beschreibt eine Station (also einen Task, welcher die Funktion einer Station<br />
realisiert), die nichts macht.<br />
STAT_NOTHING:<br />
CLOSE ; bereits fertig<br />
Aufrufen kann man diese Station mit<br />
OPEN STAT_NOTHING<br />
Siehe auch:<br />
175 OPEN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 107/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CLR_PUFFER<br />
CLR_PUFFER<br />
Löscht einen Datenpuffer.<br />
Syntax:<br />
CLR_PUFFER <br />
Felder:<br />
Ein Register vom Typ RV, RW, AV, AW, LV oder LW, der den zu<br />
löschenden Puffer (im Bereich 0 bis 199) angibt.<br />
Bemerkungen:<br />
Der Befehl darf nicht verwendet werden, wenn mit ZPoint gearbeitet wird.<br />
Existiert der Puffer nicht (weil ausserhalb des gültigen Bereichs liegt oder<br />
nicht angelegt wurde), so passiert nichts.<br />
Beispiel:<br />
NEW_PUFFER RV101, RW100, 1 ; Speichert RW100 an der<br />
; Adresse 1 in einem neuen<br />
; Puffer, auf den dann RV101<br />
; zeigt.<br />
CLR_PUFFER RV101 ; Lösche diesen Puffer<br />
Siehe auch:<br />
80 .STATISTIC / GROUP / .END_STATISTIC<br />
170 NEW_PUFFER<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 108/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CLS<br />
CLS<br />
Löscht den ganzen Bildschirm auf dem Terminal.<br />
CLS<br />
Syntax:<br />
Bemerkungen:<br />
Dieser Befehl ist identisch mit<br />
CLS_WIN 0, 200<br />
CLS ist zu bevorzugen, da er keine Annahme über die Grösse des Displays macht.<br />
Siehe auch:<br />
110 CLS_WIN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 109/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CLS_WIN<br />
CLS_WIN<br />
Löscht eine Anzahl Zeilen auf dem Bildschirm.<br />
Syntax:<br />
CLS_WIN , <br />
Felder:<br />
Erste Zeile des Bereichs, der gelöscht wird. Gültige Werte<br />
liegen im Bereich 0 bis 199.<br />
Letzte Zeile des Bereichs, der gelöscht wird. Gültige Werte<br />
liegen im Bereich 1 bis 200.<br />
muss zwingend grösser als sein.<br />
Bemerkungen:<br />
Bei der Portierung von alten Programmen ist zu beachten, dass die neuen Terminals<br />
eine höhere Zeilenanzahl haben.<br />
Beispiele:<br />
Das erste Beispiel löscht den Inhalt des Bildschirms zwischen den Zeilen 32 und 64.<br />
CLS_WIN 32, 64<br />
Das zweite Beispiel löscht den ganzen Bildschirm und ist somit identisch mit CLS:<br />
CLS_WIN 0, 200<br />
Siehe auch:<br />
109 CLS<br />
129 HP_CLS_WIN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 110/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> COND_TRAP / IF_COND / END_COND_TRAP<br />
COND_TRAP / IF_COND / END_COND_TRAP<br />
Ermöglicht die Zustandsüberwachung mehrerer Befehle und das Behandeln von<br />
mehreren Bedingungen.<br />
Syntax:<br />
COND_TRAP [, ]<br />
<br />
IF_COND [- ]<br />
<br />
[IF_COND [- ]<br />
]<br />
END_COND_TRAP<br />
Felder:<br />
Ein (oder mehrere) Ausgänge, Eingänge, Merker oder<br />
Fehlermerker mit dem gewünschten Niveau (H oder L); wenn<br />
das Niveau nicht mehr erfüllt ist, wird der entsprechende<br />
ausgeführt. Zudem ist es möglich, an erster Stelle<br />
einen Zeitwert (Zahl mit Dauer in 10ms Einheiten) anzugeben.<br />
Es sind bis zu 32 Bedingungen möglich.<br />
Code, der durch den Befehl überwacht wird.<br />
Zahl, die angibt, zu welcher der <br />
gehört.<br />
optional: Ermöglicht, dass der mehrere<br />
Bedingungen zusammenfassend behandeln kann.<br />
gibt dann die höchste des<br />
Bereichs an.<br />
Code, der ausgeführt wird, wenn die zugehörige <br />
bei der Überwachung von ausgelöst wurde.<br />
Bemerkungen:<br />
Die Befehlsgruppen TRAP und TIMETRAP sind leistungsschwächere Alternativen zu<br />
diesem Befehl.<br />
Zu jeder Bedingung muss zwingend ein IF_COND Block stehen, der die<br />
entsprechende Bedingung behandelt.<br />
Überwachungen dürfen nicht verschachtelt werden und keine weiteren synchronen<br />
Tasks aufrufen. Sprünge sind nur innerhalb des überwachten Bereichs erlaubt.<br />
Beispiel:<br />
Das Beispiel zeigt eine einfache Achsüberwachung:<br />
OUTP A123 H, A124 H ; Starte Achsen<br />
COND_TRAP 100, E120 L, A123 H, A124 H<br />
INP E121 H ; warte auf Endposition<br />
IF_COND 1 ; Zeit (1 Sek) abgelaufen<br />
; Handle Zeitüberlauf<br />
IF_COND 2 ; E120->H: Weg versperrt<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 111/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> COND_TRAP / IF_COND / END_COND_TRAP<br />
; Handle versperrten Weg<br />
IF_COND 3-4 ; A123->L oder A124->L<br />
; Handle Ventilsperre<br />
END_COND_TRAP<br />
Siehe auch:<br />
275 TIMETRAP / END_TIMETRAP<br />
276 TRAP / IF_TRAP / END_TRAP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 112/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CREGDISP<br />
CREGDISP<br />
Formatiert und schreibt den Wert in einem Register auf das Display in Farbe.<br />
Syntax:<br />
CREGDISP , , , , ,<br />
<br />
Felder:<br />
Spalte, ab der der Text geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
Auszugebender Wert. Ein Register vom Typ SW, RV, RW, AV, AW,<br />
LV, LW, KV, KW oder ZW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Formatierung in kann angegeben werden als:<br />
“[Text] #..# [Text]”<br />
Dabei bedeuten:<br />
Anzahl der Stellen, die für die Ausgabe auf dem Display<br />
reserviert werden. Ein negativer Wert ermöglicht die<br />
linksbündige Ausgabe (mit der Anzahl Stellen des Betrages).<br />
Anzahl der Nachkommastellen des auszugebenden Wertes.<br />
Anzahl der auszugebenden Nachkomma-Stellen<br />
optional: Zusätzlicher unformatierter Text.<br />
Bemerkungen:<br />
Durch die Zahlenformatierung ist es möglich, implizit mit Fixkomma-Zahlen zu<br />
arbeiten.<br />
Beachte, dass die überschüssigen Nachkommastellen abgeschnitten (und nicht<br />
gerundet) werden.<br />
Beispiel:<br />
MOV RW001, 204567<br />
CREGDISP 1, 20, 1, 1, RW001, “Wert: #8.4.2# mm”<br />
; Gibt “Wert: 20.45 mm”<br />
; schwarz aus<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 113/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CREGDISP<br />
Siehe auch:<br />
132 HP_CREGDISP<br />
187 REGDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 114/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTIMEDISP<br />
CTIMEDISP<br />
Gibt die Zeit in Farbe auf dem Display aus, welche in einem Register gespeichert<br />
wurde.<br />
Syntax:<br />
CTIMEDISP , , , , ,<br />
<br />
Felder:<br />
Spalte, ab der der formatierte Text geschrieben wird. Gültige<br />
Werte liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie in den Abbildungen Seite 280 gezeigt.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
Ein RW, AW oder LW Register mit der auszugebenden Zeit.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
kann bis zu 120 Zeichen beinhalten und hat folgendes Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
hh Schreibt die Stunde im 24-Stunden-Format zweistellig wie in 08.<br />
mm Schreibt die Minute zweistellig.<br />
ss Schreibt die Sekunde zweistellig.<br />
pp Schreibt die Hundertstel-Sekunde zweistellig.<br />
Bemerkungen:<br />
Um die Zeit in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Beispiel:<br />
Das Beispiel liest die Zeit ein und gibt sie dann grün aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
CTIMEDISP 1, 20, 1, 8, RW100, “Zeit: #hh:mm#”<br />
Siehe auch:<br />
106 CDATEDISP<br />
111 DATEDISP<br />
134 HP_CTIMEDISP<br />
186 RD_TIME<br />
232 TIMEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 115/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CWRITE<br />
CWRITE<br />
Gibt einen String in Farbe aus.<br />
Syntax:<br />
CWRITE , , , ,<br />
[, ,] <br />
Felder:<br />
Spalte, ab der geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante von . Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
optional: Position in , ab der dieser ausgegeben wird.<br />
Damit ist es möglich, einzelne Teile einer Zeichenkette<br />
auszugeben. Das erste Zeichen ist an Position 1.<br />
optional: Länge des auszugebenden Stücks aus .<br />
Muss angegeben werden, wenn angegeben ist, und<br />
darf sonst nicht angegeben sein.<br />
Auszugebender Text, bis zu 120 Zeichen lang. Entweder ein ST<br />
oder SR Register oder ein mit Anführungszeichen begrenzter<br />
Text.<br />
und müssen so gewählt sein, dass sie die Länge von <br />
nicht überschreiten. Sind und nicht angegeben, so wird der<br />
ganze String ausgegeben.<br />
Beispiele:<br />
CWRITE 1, 10, 1, 2, “Hello World in RED”<br />
Das zweite Beispiel zeigt, wie der Befehl verwendet werden kann, um Teile von IO-<br />
Texten auszugeben. Dazu stehe in .IO_TEXT beispielsweise:<br />
E001, “AL UEBERWACHUNG NOT-AUS/AUS LEVEL E0 E001”<br />
Dann kann die Ausgabe wie folgt aussehen:<br />
SMOV SR0201, E001<br />
CWRITE 0, 150, 2, 1, 35, 8, SR0201<br />
; gibt “E0 E001” schwarz aus<br />
Siehe auch:<br />
136 HP_CWRITE<br />
251 WRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 116/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> DATEDISP<br />
DATEDISP<br />
Schreibt das Datum aus einem Register.<br />
Syntax:<br />
DATEDISP , , , , <br />
Felder:<br />
Spalte, ab der das Datum geschrieben wird. Gültige Werte<br />
liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Register, welches das auszugebende Datum beinhaltet, vom<br />
Typ RW, AW oder LW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
hat folgendes Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
jjjj Schreibt das Jahr vierstellig.<br />
jj Schreibt das Jahr zweistellig.<br />
mm Schreibt den Monat zweistellig, also 01 für Januar bis 12 für<br />
Dezember.<br />
tt Schreibt den Tag im Monat zweistellig.<br />
Bemerkungen:<br />
Um das Datum in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Beispiel:<br />
Das Beispiel liest das Datum ein und gibt es dann in zwei Möglichkeiten aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
DATEDISP 1, 20, 1, RW101, “Heute ist: #tt/mm/jj#”<br />
DATEDISP 1, 30, 1, RW101, “Jahr: #jjjj#”<br />
Siehe auch:<br />
132 HP_DATEDISP<br />
140 HP_TIMEDISP<br />
186 RD_TIME<br />
230 TIMEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 117/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> DO / DO_WHILE / DO_WHILENOT<br />
DO / DO_WHILE / DO_WHILENOT<br />
Wiederholt einen Programmblock solange, wie die angegebene Bedingung erfüllt ist.<br />
Syntax:<br />
DO<br />
<br />
DO_WHILE <br />
oder<br />
DO<br />
<br />
DO_WHILE <br />
oder<br />
DO<br />
<br />
DO_WHILENOT <br />
Felder:<br />
Programmblock, der ausgeführt wird.<br />
Eine vergleichende Bedingung, die festlegt, ob der ein<br />
weiteres Mal ausgeführt wird.<br />
Logische Bedingung oder ein Timer, die festlegt, ob der <br />
ein weiteres Mal ausgeführt wird.<br />
ist wie folgt aufgebaut:<br />
<br />
Dabei bedeuten:<br />
Eine direkt angegeben Zahl oder ein Register vom Typ SW, RV,<br />
RW, AV, AW, LV, LW, KV, KW, C, T oder ZW. Es ist somit möglich<br />
(wenn auch nicht besonders nützlich) zwei Timer miteinander zu<br />
vergleichen.<br />
Der Vergleichsoperator , =, = oder .<br />
ist entweder ein Timer, oder ein (oder mehrere) Ausgänge, Eingänge,<br />
Merker oder Fehlermerker mit dem gewünschten Niveau (H oder L).<br />
Bemerkungen:<br />
Im Gegensatz zum WHILE Befehl wird hier der immer mindestens einmal<br />
ausgeführt, da die Bedingung erst nach dem Ausführen überprüft wird.<br />
DO_WHILE mit Ein-, Ausgängen und Merker springt nur dann zurück, wenn alle<br />
Niveaus korrekt sind; DO_WHILENOT springt zurück, solange nicht alle Niveaus erfüllt<br />
sind.<br />
Wird dieser Befehl dazu verwendet, dauernd eine Werte aus externe Steuerung<br />
abzufragen, ist darauf zu achten, dass diese Steuerung und der verwendete<br />
Datenbus nicht überlastet wird. Typischerweise wird dies verhindert, indem nach<br />
jeder Anfrage während einer kurzen Dauer gewartet wird. Es dürfen nur Ein- und<br />
Ausgänge einer externen Steuerung abgefragt werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 118/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> DO / DO_WHILE / DO_WHILENOT<br />
Beispiele:<br />
Das erste Beispiel zeigt die Verwendung von Vergleichen.<br />
MOV LV001, 100<br />
DO<br />
CALC LV001, LV001 – 1 ; Durchlaufe Schlaufe 100 mal<br />
DO_WHILE LV001 > 0<br />
Das zweite Beispiel zeigt die übliche Verwendung eines Timers.<br />
SETTIM T0, 100 ; warte 1 Sekunde<br />
DO<br />
; Tu was auch immer<br />
DO_WHILENOT T0<br />
Das letzte Beispiel zeigt Verwendung von Eingängen, Ausgängen und Merker. Die<br />
Schleife wird nur wiederholt, wenn alle vier Bedingungen erfüllt sind.<br />
DO<br />
; Tu was auch immer<br />
DO_WHILE E101 L, E102 H, A200 H, M100 L<br />
Siehe auch:<br />
248 WHILE / WHILENOT /END_WHILE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 119/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> END_NUM_INP<br />
END_NUM_INP<br />
Bricht die Eingabe von NUM_INP ab.<br />
Syntax:<br />
END_NUM_INP<br />
Bemerkungen:<br />
Der Befehl ist typischerweise nur zum Abbrechen einer überwachten Eingabe<br />
sinnvoll, kann aber auch Task übergreifend eingesetzt werden. Der Eingabe-Wert<br />
von NUM_INP bleibt auf seinem ursprünglichen Wert.<br />
Beispiel:<br />
Das Beispiel zeigt den üblichen Einsatz: Der Befehl verhindert, dass eine Anlage<br />
aufgrund fehlender Eingabe stehenbleibt.<br />
COND_TRAP 500 ; gib Benutzer 5s zur Eingabe<br />
NUM_INP 1, 20, 1, LV001, “Wert: #4.2.2#”<br />
IF_COND 1 ; Handle Zeitüberschreibtung<br />
END_NUM_INP ; Brich Eingabe ab<br />
OUTP D0100 H ; und starte Fehlertask<br />
INP D0100 L<br />
END_COND_TRAP<br />
Siehe auch:<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
173 NUM_INP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 120/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> EXCL<br />
EXCL<br />
Ermöglicht den exklusiven Zugriff auf eine Ressource.<br />
Syntax:<br />
EXCL L<br />
Felder:<br />
Ein Ausgang oder Merker, der den exklusiven Zugriff steuert.<br />
Bemerkungen:<br />
Ermöglicht den gegenseitigen Ausschluss mehrerer Taktketten beim Zugriff auf<br />
gemeinsame Ressourcen wie Unterprogramme, PSL-Tasks oder Register.<br />
Alle Tasks, die auf die Ressource zugreifen wollen, beginnen mit der EXCL-Abfrage,<br />
welche wartet, bis tief ist. Ist diese Bedingung erfüllt, wird der <br />
automatisch, selbständig und atomar hochgesetzt. Dadurch wird verhindert, dass<br />
eine zweite wartende Kette auf die Ressource zugreifen kann.<br />
Am Ende des kritischen Bereiches muss der Merker oder Ausgang tiefgesetzt<br />
werden, damit nun andere Tasks die Ressource benützen können.<br />
Das Prüfen auf L und Setzen auf H sind zwei untrennbar verknüpfte Operationen und<br />
werden gleichzeitig ausgeführt. Nur dadurch ist ein gegenseitiger Ausschluss<br />
gewährleistet.<br />
Der Ausgang für darf nicht aus einer externen Steuerung stammen.<br />
Beispiel:<br />
Beispiel mit zwei Tasks, die auf die gemeinsame Subroutine zugreifen wollen.<br />
TASK1:<br />
; Unkritischer Abschnitt<br />
EXCL M050 L ; Ab hier kritisch! M033 -> H<br />
CALL SUB_PROG1<br />
OUTP M050 L ; Kritischer Teil fertig<br />
CLOSE<br />
TASK2:<br />
EXCL M050 L<br />
; Unkritischer Abschnitt<br />
; Ab hier kritisch! M033 -> H<br />
CALL SUB_PROG1<br />
OUTP<br />
CLOSE<br />
M050 L ; Kritischer Teil fertig<br />
SUB_PROG1:<br />
; ... ; gemeinsame Resource<br />
RET<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 121/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GET_PSL<br />
GET_PSL<br />
Liest die aktuelle PSL-Seite ein.<br />
Syntax:<br />
GET_PSL <br />
Felder:<br />
Ein RV oder LV Register, in das codiert die Adresse der<br />
aktuellen PSL-Seite geschrieben wird.<br />
Bemerkungen:<br />
Der Wert von entspricht 256*Zeile + Spalte der PSL-Seite. So ist zeigt also<br />
der Wert 515=2*256+3 auf die PSL-Seite 2.3.<br />
In den meissten Fällen interessiert der Wert nicht, da im späteren Programmverlauf<br />
nur die PSL-Seite mit SET_PSL wieder hergestellt werden soll.<br />
Wird keine PSL-Seite angezeigt, so liefert der Befehl die zuletzt angewählte Seite<br />
zurück.<br />
Beispiel:<br />
GET_PSL RV008<br />
Siehe auch:<br />
71 .PSL<br />
203 SET_PSL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 122/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GW_DD<br />
GW_DD<br />
Schreibt einen 32-bit Wert (in der Intel 80x86-Sprache mit DD bezeichnet) in einen<br />
Datenbaustein des ZPoint Gateways.<br />
Syntax:<br />
GW_DD ., , <br />
Felder:<br />
Nummer des Grundsystems.<br />
Nummer des Moduls.<br />
Speicherposition innerhalb des Datenbausteins. Gültige Werte<br />
liegen im Bereich 0 bis 65535.<br />
Zu sendender Wert. Ein Register vom Typ LW, RW, AW, KW oder<br />
ZW.<br />
Beispiel:<br />
Sendet den Wert Null an die Speicherposition 44 im ZPoint-Modul 61.<br />
MOV LW001, 0<br />
GW_DD 1.61, 44, LW001<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
124 GW_DW<br />
125 GW_MSG<br />
126 GW_RD_DD<br />
128 GW_RD_DW<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 123/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GW_DW<br />
GW_DW<br />
Schreibt einen 16-bit Wert (in der Intel 80x86-Sprache mit DW bezeichnet) in einen<br />
Datenbaustein des ZPoint Gateways.<br />
Syntax:<br />
GW_DW ., , <br />
Felder:<br />
Nummer des Grundsystems.<br />
Nummer des Moduls.<br />
Speicherposition innerhalb des Datenbausteins. Gültige Werte<br />
liegen im Bereich 0 bis 65535.<br />
Zu sendender Wert. Ein Register vom Typ LV, LW, RV, RW, AV,<br />
AW, KW oder ZW.<br />
Bemerkungen:<br />
Vorsicht: In <strong>ECCO</strong> Bezeichnet der Buchstabe W bei Registern 32-bit Breite. Dieser<br />
Befehl schreibt aber nur 16 Bit, da in Intel 80x86-Sprache DW für 16-bit Register<br />
steht.<br />
Beispiel:<br />
Sendet den Wert Null an die Speicherposition 46 im ZPoint-Modul 61.<br />
MOV LV001, 0<br />
GW_DW 1.61, 46, LV001<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
123 GW_DD<br />
125 GW_MSG<br />
126 GW_RD_DD<br />
128 GW_RD_DW<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 124/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GW_MSG<br />
GW_MSG<br />
Sendet eine Meldung, also einen beliebigen Wert direkt an ein Gateway.<br />
Syntax:<br />
GW_MSG ., <br />
Felder:<br />
Nummer des Grundsystems.<br />
Nummer des Moduls.<br />
Zu sendende Meldung oder Wert. Ein Register vom Typ LV, LW,<br />
AV, AW, RV, RW, KW oder ZW.<br />
Bemerkungen:<br />
Der Befehl wird verwendet, um eine Nachricht direkt an ein Gateway zu senden,<br />
ohne den Inhalt des Datenbausteins zu verändern. Die Nachricht wird zwar an einen<br />
Datenbaustein (durch .) adressiert, aber vom übergeordneten<br />
Gateway empfangen.<br />
Beispiel:<br />
Sende an das Gateway vom Datenbaustein 1.0 den Wert 1.<br />
MOV LV001, 1<br />
GW_MSG 1.0, LV001<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
123 GW_DD<br />
124 GW_DW<br />
126 GW_RD_DD<br />
128 GW_RD_DW<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 125/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GW_QUEUE<br />
GW_QUEUE<br />
Liefert die Anzahl der gepufferten Nachrichten im Gateway zurück.<br />
Syntax:<br />
GW_QUEUE <br />
Felder:<br />
Register, in das die Anzahl gepufferter Nachrichten geschrieben<br />
wird; vom Typ LV, LW, AV, AW, RV oder RW.<br />
Bemerkungen:<br />
Der Befehl wird verwendet, um sicherzustellen, dass beim Beenden oder einem<br />
Schichtwechsel erst dann weiter gefahren wird, wenn alle Nachrichten aus dem<br />
Gateway ausgelesen wurden.<br />
Beispiel:<br />
Wartet, bis keine Daten mehr vorliegen:<br />
DO<br />
STAT_QUEUE LW001, LW002<br />
GWY_QUEUE LW003<br />
CALC LW004, LW001 + LW003<br />
DO_WHILENOT LW004=0<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
213 STAT_QUEUE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 126/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GW_RD_DD<br />
GW_RD_DD<br />
Liest einen 32-bit Wert (in Intel 80x86-Sprache mit DD bezeichnet) aus einem<br />
Gateway-Datenbaustein.<br />
Syntax:<br />
GW_RD_DD ., , <br />
Felder:<br />
Nummer des Grundsystems.<br />
Nummer des Moduls.<br />
Speicherposition innerhalb des Datenbausteins. Gültige Werte<br />
liegen im Bereich 0 bis 65535.<br />
Register, in das eingelesen wird, vom Typ LW, RW oder AW.<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
123 GW_DD<br />
124 GW_DW<br />
125 GW_MSG<br />
128 GW_RD_DW<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 127/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> GW_RD_DW<br />
GW_RD_DW<br />
Liest einen 16-bit Wert (in Intel 80x86-Sprache mit DW bezeichnet) aus einem<br />
Gateway-Datenbaustein.<br />
Syntax:<br />
GW_RD_DW ., , <br />
Felder:<br />
Nummer des Grundsystems.<br />
Nummer des Moduls.<br />
Speicherposition innerhalb des Datenbausteins. Gültige Werte<br />
liegen im Bereich 0 bis 65535.<br />
Register, in das eingelesen wird, vom Typ LV, LW, AV, AW, RV<br />
oder RW.<br />
Bemerkungen:<br />
Vorsicht: In <strong>ECCO</strong> Bezeichnet der Buchstabe W bei Registern 32-bit Breite. Dieser<br />
Befehl schreibt aber nur 16 Bit, da in Intel 80x86-Sprache DW für 16-bit Register<br />
steht.<br />
Die Konvertierung von 16 auf 32 Bit findet unter Berücksichtigung des Vorzeichens<br />
statt.<br />
Siehe auch:<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
123 GW_DD<br />
124 GW_DW<br />
125 GW_MSG<br />
126 GW_RD_DD<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 128/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CDATEDISP<br />
HP_CDATEDISP<br />
Schreibt das Datum aus einem Register in Farbe auf das Display. Ist hochprioritär,<br />
das heisst, er wird von einem Fehler- oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_CDATEDISP , , , , ,<br />
<br />
Felder:<br />
Spalte, ab der das Datum geschrieben wird. Gültige Werte<br />
liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
Register, welches das auszugebende Datum beinhaltet, vom<br />
Typ RW, AW oder LW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register bis zu 120 Zeichen. Die<br />
zulässige Formatierung wird weiter unten angegeben.<br />
hat folgendes Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
jjjj Schreibt das Jahr vierstellig.<br />
jj Schreibt das Jahr zweistellig.<br />
mm Schreibt den Monat zweistellig, also 01 für Januar bis 12 für<br />
Dezember.<br />
tt Schreibt den Tag im Monat zweistellig.<br />
Bemerkungen:<br />
Um das Datum in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt. Sie eignen sich somit zur Anzeige von<br />
Meldungen, die unter allen Umständen dem Benutzer angezeigt werden müssen.<br />
Beispiel:<br />
Das Beispiel liest das Datum ein und gibt es dann hochprioritär rot aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
HP_CDATEDISP 1, 20, 1, 2, RW101, “Heute ist: #tt/mm/jj#”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 129/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CDATEDISP<br />
Siehe auch:<br />
106 CDATEDISP<br />
115 CTIMEDISP<br />
117 DATEDISP<br />
134 HP_CTIMEDISP<br />
137 HP_DATEDISP<br />
186 RD_TIME<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 130/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CLS_WIN<br />
HP_CLS_WIN<br />
Löscht eine Anzahl Zeilen auf dem Bildschirm. Ist hochprioritär, das heisst, er wird<br />
von einem Fehler- oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_CLS_WIN , <br />
Felder:<br />
Erste Zeile des Bereichs, der gelöscht wird. Gültige Werte<br />
liegen im Bereich 0 bis 199.<br />
Letzte Zeile des Bereichs, der gelöscht wird. Gültige Werte<br />
liegen im Bereich 1 bis 200.<br />
muss zwingend grösser als sein.<br />
Bemerkungen:<br />
Bei der Portierung von alten Programmen ist zu beachten, dass die neuen Terminals<br />
eine höhere Zeilenanzahl haben.<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt. Sie eignen sich somit zur Anzeige von<br />
Meldungen, die unter allen Umständen dem Benutzer angezeigt werden müssen.<br />
Beispiel:<br />
Das Beispiel löscht den Inhalt des Bildschirms zwischen den Zeilen 32 und 64<br />
hochprioritär.<br />
HP_CLS_WIN 32, 64<br />
Siehe auch:<br />
109 CLS<br />
110 CLS_WIN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 131/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CREGDISP<br />
HP_CREGDISP<br />
Formatiert und schreibt den Wert in einem Register auf das Display in Farbe. Ist<br />
hochprioritär, das heisst, der Befehl wird von einem Fehler- oder Displaytask nicht<br />
gesperrt.<br />
Syntax:<br />
HP_CREGDISP , , , , ,<br />
<br />
Felder:<br />
Spalte, ab der der Text geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
Auszugebender Wert. Ein Register vom Typ SW, RV, RW, AV, AW,<br />
LV, LW, KV, KW oder ZW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Formatierung in kann angegeben werden als:<br />
“[Text] #..# [Text]”<br />
Dabei bedeuten:<br />
Anzahl der Stellen, die für die Ausgabe auf dem Display<br />
reserviert werden. Ein negativer Wert ermöglicht die<br />
linksbündige Ausgabe (mit der Anzahl Stellen des Betrages).<br />
Anzahl der Nachkommastellen des auszugebenden Wertes.<br />
Anzahl der auszugebenden Nachkomma-Stellen<br />
optional: Zusätzlicher unformatierter Text.<br />
Bemerkungen:<br />
Durch die Zahlenformatierung ist es möglich, implizit mit Fixkomma-Zahlen zu<br />
arbeiten.<br />
Beachte, dass überschüssigen Nachkommastellen abgeschnitten und nicht gerundet<br />
werden.<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt. Sie eignen sich somit zur Anzeige von<br />
Meldungen, die unter allen Umständen dem Benutzer angezeigt werden müssen.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 132/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CREGDISP<br />
Beispiel:<br />
MOV RW001, 204567<br />
HP_CREGDISP 1, 20, 1, 1, RW001, “Wert: #8.4.2# mm”<br />
; Gibt “Wert: 20.45 mm”<br />
; hochprioritär & schwarz aus<br />
Siehe auch:<br />
113 CREGDISP<br />
139 HP_REGDISP<br />
187 REGDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 133/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CTIMEDISP<br />
HP_CTIMEDISP<br />
Gibt die Zeit, welche in einem Register gespeichert wurde, in Farbe auf dem Display<br />
hochprioritär aus. Hochprioritär heisst, dass der Befehl von einem Fehler- oder<br />
Displaytask nicht gesperrt wird.<br />
Syntax:<br />
HP_CTIMEDISP , , , , ,<br />
<br />
Felder:<br />
Spalte, ab der der formatierte Text geschrieben wird. Gültige<br />
Werte liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
Ein RW, AW oder LW Register, welches die auszugebende Zeit<br />
beinhaltet.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
kann bis zu 120 Zeichen beinhalten und hat folgendes Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
hh Schreibt die Stunde im 24-Stunden-Format zweistellig wie in 08.<br />
mm Schreibt die Minute zweistellig.<br />
ss Schreibt die Sekunde zweistellig.<br />
pp Schreibt die Hundertstel-Sekunde zweistellig.<br />
Bemerkungen:<br />
Um die Zeit in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt. Sie eignen sich somit zur Anzeige von<br />
Meldungen, die unter allen Umständen dem Benutzer angezeigt werden müssen.<br />
Beispiel:<br />
Das Beispiel liest die Zeit ein und gibt sie dann hochprioritär und grün aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
HP_CTIMEDISP 1, 20, 1, 8, RW100, “Zeit: #hh:mm#”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 134/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CTIMEDISP<br />
Siehe auch:<br />
106 CDATEDISP<br />
115 CTIMEDISP<br />
111 DATEDISP<br />
129 HP_CDATEDISP<br />
186 RD_TIME<br />
232 TIMEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 135/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_CWRITE<br />
HP_CWRITE<br />
Gibt einen String in Farbe aus. Ist hochprioritär, das heisst, der Befehl wird von<br />
einem Fehler- oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_CWRITE , , , ,<br />
[, ,] <br />
Felder:<br />
Spalte, ab der geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante von . Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie in den Abbildungen Seite 280 gezeigt.<br />
Farbe für die Ausgabe. Gültige Werte sind 1 bis 13, wie sie in<br />
der Abbildung Seite 280 gezeigt sind.<br />
optional: Position in , ab der dieser ausgegeben wird.<br />
Damit können einzelne Teile einer Zeichenkette auszugeben<br />
werden. Das erste Zeichen ist an Position 1.<br />
optional: Länge des auszugebenden Stücks aus .<br />
Muss angegeben werden, wenn angegeben ist, und<br />
darf sonst nicht angegeben sein.<br />
Auszugebender Text. Entweder ein ST oder SR Register oder<br />
ein mit Anführungszeichen begrenzter Text.<br />
Bemerkungen:<br />
Üblicherweise wird ein Displaybefehl wie WRITE nicht ausgeführt, wenn parallel dazu<br />
ein Fehler- oder Displaytask aktiv ist. Hochprioritäre Displaybefehle wie HP_CWRITE<br />
werden auch unter solchen Umständen ausgeführt und angezeigt. Sie eignen sich<br />
somit zur Anzeige von Meldungen, die unter allen Umständen dem Benutzer<br />
angezeigt werden müssen.<br />
Beispiel:<br />
HP_CWRITE 1, 10, 1, 2, “Hochprioritaer und rot”<br />
Siehe auch:<br />
113 CWRITE<br />
142 HP_WRITE<br />
250 WRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 136/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_DATEDISP<br />
HP_DATEDISP<br />
Schreibt das Datum aus einem Register. Ist hochprioritär, das heisst, er wird von<br />
einem Fehler- oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_DATEDISP , , , , <br />
Felder:<br />
Spalte, ab der das Datum geschrieben wird. Gültige Werte<br />
liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Register, welches das auszugebende Datum beinhaltet, vom<br />
Typ RW, AW oder LW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
hat folgendes Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
jjjj Schreibt das Jahr vierstellig.<br />
jj Schreibt das Jahr zweistellig.<br />
mm Schreibt den Monat zweistellig, also 01 für Januar bis 12 für<br />
Dezember.<br />
tt Schreibt den Tag im Monat zweistellig.<br />
Bemerkungen:<br />
Um das Datum in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt. Sie eignen sich somit zur Anzeige von<br />
Meldungen, die unter allen Umständen dem Benutzer angezeigt werden müssen.<br />
Der Programmierer sollte jedoch hochprioritäre Befehle sparsam einsetzen, da ein<br />
sauberer und wohldefinierter Bildschirm-Aufbau dadurch gefährdet wird.<br />
Beispiel:<br />
Das Beispiel liest das Datum ein und gibt es dann hochprioritär aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
HP_DATEDISP 1, 20, 1, RW101, “Heute ist: #tt/mm/jj#”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 137/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_DATEDISP<br />
Siehe auch:<br />
111 DATEDISP<br />
140 HP_TIMEDISP<br />
186 RD_TIME<br />
230 TIMEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 138/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_REGDISP<br />
HP_REGDISP<br />
Formatiert und schreibt den Wert in einem Register auf das Display. Ist hochprioritär,<br />
das heisst, er wird von einem Fehler- oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_REGDISP , , , , <br />
Felder:<br />
Spalte, ab der der Text geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Auszugebender Wert. Ein Register vom Typ SW, RV, RW, AV, AW,<br />
LV, LW, KV, KW oder ZW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Formatierung in kann angegeben werden als:<br />
“[Text] #..# [Text]”<br />
Dabei bedeuten:<br />
Anzahl der Stellen, die für die Ausgabe auf dem Display<br />
reserviert werden. Ein negativer Wert ermöglicht linksbündige<br />
Formatierung mit der betragsgemässen Anzahl Stellen.<br />
Anzahl der Nachkommastellen des auszugebenden Wertes.<br />
Anzahl der auszugebenden Nachkomma-Stellen<br />
optional: Zusätzlicher unformatierter Text.<br />
Bemerkungen:<br />
Durch die Zahlenformatierung ist es möglich, implizit mit Fixkomma-Zahlen zu<br />
arbeiten. Überschüssige Nachkommastellen werden abgeschnitten – nicht gerundet!<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt.<br />
Beispiel:<br />
MOV RW001, 204567<br />
HP_REGDISP 1, 20, 1, RW001, “Wert: #8.4.2# mm”<br />
; Ausgabe: Wert: 20.45 mm<br />
Siehe auch:<br />
187 REGDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 139/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_TIMEDISP<br />
HP_TIMEDISP<br />
Gibt die Zeit aus, welche in einem Register gespeichert wurde. Der Befehl ist<br />
hochprioritär, das heisst, er wird von einem Fehler- oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_TIMEDISP , , , , <br />
Felder:<br />
Spalte, ab der der formatierte Text geschrieben wird. Gültige<br />
Werte liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Register, welches die auszugebende Zeit beinhaltet. Ist vom<br />
Typ RW, AW oder LW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
hat das Format:<br />
“[Text] ## [Text]”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
hh Schreibt die Stunde im 24-Stunden-Format zweistellig, wie in<br />
08.<br />
mm Schreibt die Minute zweistellig.<br />
ss Schreibt die Sekunde zweistellig.<br />
pp Schreibt die Hundertstel-Sekunde zweistellig.<br />
Bemerkungen:<br />
Um die Zeit in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Üblicherweise wird ein Displaybefehl nicht ausgeführt, wenn parallel dazu ein Fehler-<br />
oder Displaytask aktiv ist. Hochprioritäre Displaybefehle werden auch unter solchen<br />
Umständen ausgeführt und angezeigt. Sie eignen sich somit zur Anzeige von<br />
Meldungen, die unter allen Umständen dem Benutzer angezeigt werden müssen.<br />
Der Programmierer sollte jedoch hochprioritäre Befehle sparsam einsetzen, da ein<br />
sauberer und wohldefinierter Bildschirm-Aufbau dadurch gefährdet wird.<br />
Beispiel:<br />
Das Beispiel liest die Zeit ein und gibt sie dann hochprioritär aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
HP_DATEDISP 1, 20, 1, RW100, “Zeit: #hh:mm#”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 140/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_TIMEDISP<br />
Siehe auch:<br />
111 DATEDISP<br />
132 HP_DATEDISP<br />
186 RD_TIME<br />
230 TIMEDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 141/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HP_WRITE<br />
HP_WRITE<br />
Gibt einen String aus. Ist hochprioritär, das heisst, der Befehl wird von einem Fehler-<br />
oder Displaytask nicht gesperrt.<br />
Syntax:<br />
HP_WRITE , , , <br />
Felder:<br />
Spalte, ab der geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante von . Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Auszugebender Text. Entweder ein ST oder SR Register oder<br />
ein mit Anführungszeichen begrenzter Text.<br />
Bemerkungen:<br />
Üblicherweise wird ein Displaybefehl wie WRITE nicht ausgeführt, wenn parallel dazu<br />
ein Fehler- oder Displaytask aktiv ist. Hochprioritäre Displaybefehle wie HP_WRITE<br />
werden auch unter solchen Umständen ausgeführt und angezeigt. Sie eignen sich<br />
somit zur Anzeige von Meldungen, die unter allen Umständen dem Benutzer gezeigt<br />
werden müssen.<br />
Beispiel:<br />
HP_WRITE 1, 10, 1, “Hello World” ; ist hochprioritär<br />
Siehe auch:<br />
250 WRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 142/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ID_INIT<br />
ID_INIT<br />
Initialisiert einen IDEX Datenträger.<br />
Syntax:<br />
ID_INIT , <br />
Felder:<br />
Adresse der IDEX Station, deren Datenträger initialisiert wird.<br />
Gültige Werte sind im Bereich 1 bis 30.<br />
Label, zu dem beim Auftreten eines Fehlers verzweigt wird.<br />
Bemerkungen:<br />
Setzt den gesamten Dateninhalt sowie die interne Prüfsumme des Datenträgers auf<br />
0. Dieser Befehl wird vorzugsweise dann eingesetzt, wenn der Werkstückträger mit<br />
einem neuen Werkstück beladen wird.<br />
Beispiel:<br />
Initialisiert den Datenträger an der IDEX-Station 3. Verzweigt bei einem Fehler zum<br />
Label $IDEX_ERROR.<br />
ID_INIT 3, $IDEX_ERROR<br />
Siehe auch:<br />
144 ID_READ<br />
145 ID_REG_RD<br />
146 ID_REG_WR<br />
147 ID_STATUS<br />
148 ID_WRITE<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 143/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ID_READ<br />
ID_READ<br />
Liest eine Anzahl Register aus dem Datenträger in den Zwischenpuffer.<br />
Syntax:<br />
ID_READ , , , <br />
Felder:<br />
Adresse der IDEX Station, deren Datenträger gelesen wird.<br />
Gültige Werte sind im Bereich 1 bis 30.<br />
Erste, tiefste Registernummer im IDEX Datenpuffer. Die Grösse<br />
des Puffers ist abhängig vom verwendeten Gerät; der Wert<br />
kann dem <strong>Manual</strong> zur Anbindung entnommen werden.<br />
Anzahl der Register, die in einem Schritt vom Werkstückträger<br />
in den IDEX Datenpuffer eingelesen werden. Gültige Werte im<br />
Bereich 1 bis 15.<br />
Label, zu dem beim Auftreten eines Fehlers verzweigt wird.<br />
Bemerkungen:<br />
Ist so falsch gewählt, dass ein IDEX-Register ausserhalb des gültigen<br />
Bereichs gelesen würde, so wird für Elemente unterhalb des gültigen Bereichs der<br />
Wert des ersten Elementes gelesen, für Elemente oberhalb des gültigen Bereichs<br />
das letzte Element.<br />
Beispiel:<br />
Liest 5 Werte vom Datenträger an der IDEX Adresse 3.<br />
ID_READ 3, 1, 5, $ID_ERROR<br />
; Lese Idex-Reg. 1,2,3,4,5.<br />
Siehe auch:<br />
143 ID_INIT<br />
145 ID_REG_RD<br />
146 ID_REG_WR<br />
147 ID_STATUS<br />
148 ID_WRITE<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 144/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ID_REG_RD<br />
ID_REG_RD<br />
Liest ein IDEX Datenregister in ein <strong>ECCO</strong> Register.<br />
Syntax:<br />
ID_REG_RD , , <br />
Felder:<br />
Adresse der IDEX Station, aus deren Datenpuffer gelesen wird.<br />
Gültige Werte sind im Bereich 1 bis 30.<br />
Auszulesendes Registernummer im IDEX Datenpuffer. Die<br />
Grösse des Puffers ist abhängig vom verwendeten Gerät; der<br />
Wert kann dem <strong>Manual</strong> zur Anbindung entnommen werden.<br />
Das Register, in das eingelesen wird, vom Typ RV, RW, AV, AW,<br />
LV, LW oder ZW.<br />
Bemerkungen:<br />
Wird in ein 16-bit Register eingelesen, so werden die oberen (höherwertigen) Bits<br />
verworfen.<br />
Mit dem Befehl wird nur vom Datenpuffer gelesen; zur Kommunikation mit dem<br />
eigentlichen Baustein auf dem Werkstückträger wird der Befehl ID_READ verwendet.<br />
Beispiel:<br />
Das Beispiel liest zuerst vom Werkstückträger, um dann die Daten aus dem Puffer<br />
weiter zu reichen.<br />
ID_READ 3, 1, 2, $ERROR ; Werkstück -> Datenpuffer<br />
ID_REG_RD 3, 1, RW101 ; Datenpuffer -> <strong>ECCO</strong><br />
ID_REG_RD 3, 2, RW102 ; ID_READ las 2 Register ein<br />
Siehe auch:<br />
143 ID_INIT<br />
144 ID_READ<br />
146 ID_REG_WR<br />
147 ID_STATUS<br />
148 ID_WRITE<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 145/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ID_REG_WR<br />
ID_REG_WR<br />
Schreibt von <strong>ECCO</strong> in den IDEX Datenpuffer.<br />
Syntax:<br />
ID_REG_WR , , <br />
Felder:<br />
Adresse der IDEX Station, in deren Datenpuffer geschrieben<br />
wird. Gültige Werte sind im Bereich 1 bis 30.<br />
Zu beschreibendes Register im IDEX Datenpuffer. Die Grösse<br />
des Puffers ist abhängig vom verwendeten Gerät; der Wert<br />
kann dem <strong>Manual</strong> zur Anbindung entnommen werden.<br />
Eine Zahl oder ein Register vom Typ RV, RW, AV, AW, LV, LW,<br />
KV, KW oder ZW.<br />
Bemerkungen:<br />
Mit diesem Befehl werden die Daten erst in den Datenpuffer geschrieben; von dort<br />
müssen sie mit dem Befehl ID_WRITE auf den Datenträger geschrieben werden.<br />
Beispiel:<br />
ID_REG_WR 3, 1, RW100 ; <strong>ECCO</strong> -> Datenpuffer<br />
ID_REG_WR 3, 2, 12345 ; <strong>ECCO</strong> -> Datenpuffer<br />
ID_WRITE 3, 1, 2, $ERROR ; Beschreibe Datenträger<br />
Siehe auch:<br />
143 ID_INIT<br />
144 ID_READ<br />
145 ID_REG_RD<br />
147 ID_STATUS<br />
148 ID_WRITE<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 146/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ID_STATUS<br />
ID_STATUS<br />
Liefert Statusinformationen zum IDEX Datenträger.<br />
Syntax:<br />
ID_STATUS , <br />
Felder:<br />
Adresse der IDEX Station, deren Status abgefragt wird. Gültige<br />
Werte sind im Bereich 1 bis 30.<br />
Register, in das die Statusinformation geschrieben wird, vom<br />
Typ RV, RW, AV, AW, LV oder LW.<br />
Bemerkungen:<br />
Die in zurückgegebene Statusinformation ist hardware-abhängig. Es ist<br />
daher die entsprechende Dokumentation zu konsultieren.<br />
Beispiel:<br />
ID_STATUS 1, LW100<br />
Siehe auch:<br />
143 ID_INIT<br />
144 ID_READ<br />
145 ID_REG_RD<br />
146 ID_REG_WR<br />
148 ID_WRITE<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 147/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ID_WRITE<br />
ID_WRITE<br />
Schreibt vom IDEX Datenpuffer auf den Datenträger.<br />
Syntax:<br />
ID_WRITE , , , <br />
Felder:<br />
Adresse der IDEX Station, deren Datenträger beschrieben wird.<br />
Gültige Werte sind im Bereich 1 bis 30.<br />
Erste, tiefste Registernummer im IDEX Datenpuffer. Die Grösse<br />
des Puffers ist abhängig vom verwendeten Gerät; der Wert<br />
kann dem <strong>Manual</strong> zur Anbindung entnommen werden.<br />
Anzahl der Register, die in einem Schritt in den Werkstückträger<br />
geschrieben werden. Gültige Werte im Bereich 1 bis 15.<br />
Label, zu dem beim Auftreten eines Fehlers verzweigt wird.<br />
Bemerkungen:<br />
Tritt ein Schreibfehler auf, so kann der Speicher des Datenträgers korrumpiert<br />
werden. Die Fehlerbehandlung bei kann den Speicherzustand und<br />
die mögliche Fehlerursache mittels ID_STATUS ermitteln.<br />
Ist so falsch gewählt, dass ein IDEX-Register ausserhalb des gültigen<br />
Bereichs beschrieben würde, so greift das <strong>ECCO</strong> Betriebssystem korrigierend ein, so<br />
dass kein Fehler auftritt.<br />
Beispiel:<br />
Das Beispiel beschreibt zwei IDEX Register, die dann auf den Datenträger an der<br />
IDEX Station 3 geschrieben werden. Tritt im letzten Schritt ein Fehler auf, so wird<br />
zum $ERROR Label verzweigt.<br />
ID_REG_WR 3, 1, 1234567 ; <strong>ECCO</strong> -> Datenpuffer<br />
ID_REG_WR 3, 2, LW101 ; <strong>ECCO</strong> -> Datenpuffer<br />
ID_WRITE 3, 1, 3, $ERROR ; Datenpuffer -> Datenträger<br />
Siehe auch:<br />
143 ID_INIT<br />
144 ID_READ<br />
145 ID_REG_RD<br />
146 ID_REG_WR<br />
147 ID_STATUS<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 148/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> IF / IFNOT / ELSE / END_IF<br />
IF / IFNOT / ELSE / END_IF<br />
Führt Programmblöcke abhängig von einer Bedingung aus.<br />
Syntax:<br />
IF <br />
<br />
[ELSE<br />
]<br />
END_IF<br />
oder<br />
IF <br />
<br />
[ELSE<br />
]<br />
END_IF<br />
oder<br />
IFNOT <br />
<br />
[ELSE<br />
]<br />
END_IF<br />
Felder:<br />
Eine vergleichende Bedingung, die festlegt, ob <br />
oder ausgeführt wird.<br />
Ein Timer, oder ein (oder mehrere) logische Bedingungen. Legt<br />
fest, ob oder ausgeführt wird.<br />
Code, der ausgeführt wird, wenn die Bedingung zutrifft.<br />
optional: Code, der ausgeführt wird, wenn die Bedingung nicht<br />
zutrifft.<br />
ist wie folgt aufgebaut:<br />
<br />
Dabei bedeuten:<br />
Eine direkt angegeben Zahl oder ein Register vom Typ SW, RV,<br />
RW, AV, AW, LV, LW, KV, KW oder ZW.<br />
Der Vergleichsoperator , =, = oder .<br />
ist entweder ein Timer (wie T002), oder ein (oder mehrere)<br />
Ausgänge, Eingänge, Merker oder Fehlermerker mit dem gewünschten Niveau (H<br />
oder L).<br />
Bemerkungen:<br />
IF führt den genau dann aus, wenn erfüllt ist oder<br />
wenn alle Bedingungen erfüllt sind. Ein Timer ist genau dann wahr, wenn er nicht<br />
abgelaufen ist.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 149/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> IF / IFNOT / ELSE / END_IF<br />
IFNOT führt den genau dann aus, wenn nicht alle Bedingungen erfüllt<br />
sind.<br />
Bei Bedingungen können die Befehle IF und IFNOT gegeneinander ausgetauscht<br />
werden, wenn gleichzeitig und vertauscht werden.<br />
Der Block hat weniger Möglichkeiten als in den DO / DO_WHILE und<br />
WHILE / END_WHILE Befehlen, da dort auch Zähler C und Timer T verglichen<br />
werden können.<br />
Wird dieser Befehl dazu verwendet, dauernd eine Werte aus externe Steuerung<br />
abzufragen, ist darauf zu achten, dass diese Steuerung und der verwendete<br />
Datenbus nicht überlastet wird. Typischerweise wird dies verhindert, indem nach<br />
jeder Anfrage während einer kurzen Dauer gewartet wird. Es dürfen nur Ein- und<br />
Ausgänge aus einer externen Steuerung in einem Befehl abgefragt werden.<br />
Beispiele:<br />
Das erste Beispiel zeigt die Verwendung mit Vergleichen.<br />
IF RW100=1<br />
; Was auch immer bei RW100=1 getan werden muss<br />
ELSE<br />
; Was auch immer bei RW1001 getan werden muss<br />
END_IF<br />
Das zweite Beispiel zeigt, wie mit einem Timer einfach überprüft werden kann, ob<br />
eine Operation „schnell“ ausgeführt wurde.<br />
SETTIM T0, 100 ; Erlaube der Operation 1s<br />
; Hierhin kommt die Operation<br />
IF T0<br />
CWRITE 1, 10, 1, 8, “Schnell”<br />
ELSE<br />
CWRITE 1, 10, 1, 2, “Langsam”<br />
END_IF<br />
Das dritte Beispiel zeigt die Verwendung von IF mit Bedingungen.<br />
IF E100 H, E101 L<br />
MOV LV001, 1<br />
ELSE<br />
MOV LV001, 2<br />
END_IF<br />
Das letzte Beispiel ist identisch mit dem zweiten, verwendet aber den IFNOT Befehl.<br />
IFNOT E100 H, E101 L<br />
MOV LV001, 2<br />
ELSE<br />
MOV LV001, 1<br />
END_IF<br />
Siehe auch:<br />
118 DO / DO_WHILE / DO_WHILENOT<br />
248 WHILE / WHILENOT / END_WHILE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 150/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> INM<br />
INM<br />
Liest einen Messwert aus einem Regel-Slave oder PAC.<br />
Syntax:<br />
INM , AD.<br />
oder<br />
INM , <br />
Felder:<br />
Register, in dem der Messwert abgelegt wird, vom Typ LW, AW,<br />
oder RW.<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Kanal des A/D-Eingangs, der eingelesen wird. Der gültige<br />
Bereich hängt von ab.<br />
Angabe des A/D-Eingangs, als LV, AV, RV oder KV Register.<br />
Es ist =256*+.<br />
Beispiel:<br />
INM RW101, AD4.2<br />
Das zweite Beispiel macht genau das Gleiche:<br />
MOV LV001, 1026 ; 1026 = 4*256+2<br />
INM RW101, LV001<br />
Siehe auch:<br />
166 MOV<br />
177 OUTA<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 151/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> INP<br />
INP<br />
Wartet, bis alle Bedingungen erfüllt sind.<br />
Syntax:<br />
INP [, ]<br />
Felder:<br />
Ausgang, Eingang, Merker oder Fehlermerker mit dem<br />
gewünschten Niveau (H oder L). Es können beliebig viele<br />
Bedingungen angegeben werden.<br />
Für kann ein Bereich angegeben werden. Damit hat <br />
folgende Syntax:<br />
[- ] <br />
Dabei bedeuten:<br />
A oder O für Ausgang, E oder I für Eingang, F oder M für<br />
Merker, D für Fehlermerker. entspricht der<br />
normalen Schreibweise für einen Ausgang, Eingang, Merker<br />
oder Fehlermerker.<br />
Adresse als Zahl. Ist nicht angegeben, so entspricht<br />
das der normalen Schreibweise für einen Ausgang, Eingang,<br />
Merker oder Fehlermerker.<br />
optional: Dient zum Angeben eines Bereiches. In diesem Fall<br />
werden alle Elemente zwischen und <br />
überprüft. Ist eine Zahl.<br />
Niveau, auf welches überprüft wird. H oder L.<br />
Bemerkungen:<br />
In Funktions- und Displaytasks kann der L_INP Befehl verwendet werden.<br />
Wird dieser Befehl dazu verwendet, dauernd eine Werte aus externe Steuerung<br />
abzufragen, ist darauf zu achten, dass diese Steuerung und der verwendete<br />
Datenbus nicht überlastet wird. Typischerweise wird dies verhindert, indem nach<br />
jeder Anfrage während einer kurzen Dauer gewartet wird. Es dürfen nur Ein- und<br />
Ausgänge aus einer externen Steuerung in jedem Befehl abgefragt werden.<br />
Beispiel:<br />
INP E101 L, E102 H, A200 L, A202 H<br />
Das zweite Beispiel ist mit dem ersten identisch, geht aber über mehrere Zeilen<br />
INP E101 L, ; Hier kann angegeben werden,<br />
E102 H, ; warum genau diese Ein- und<br />
A200 L, ; Ausgänge überprüft werden.<br />
A202 H ; Kein Komma am Ende!<br />
Das dritte Beispiel zeigt die Verwendung von Bereichen:<br />
INP E100-110 H, E300-303 L<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 152/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> INP<br />
Das vierte Beispiel zeigt, wie eine Busüberlastung durch den Befehl<br />
INP E2001 L, E2002 H, M2300 L<br />
verhindert werden kann:<br />
WHILENOT E2001 L, E2002 H, M2300 L<br />
SETTIM T0, 10<br />
WAITIM T0<br />
END_WHILE<br />
Siehe auch:<br />
161 L_INP<br />
205 SETTIM<br />
247 WAITIM<br />
248 WHILE / WHILENOT / END_WHILE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 153/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JMPCOND<br />
JMPCOND<br />
Verzweigt, wenn alle Bedingungen erfüllt sind<br />
Syntax:<br />
JMPCOND , [,] <br />
Felder:<br />
Ausgang, Eingang, Merker oder Fehlermerker mit dem<br />
gewünschten Niveau (H oder L). Es können beliebig viele<br />
Bedingungen angegeben werden.<br />
Label, zu dem verzweigt wird, wenn alle Bedingungen erfüllt<br />
sind.<br />
Bemerkungen:<br />
In Funktions- und Display-Tasks kann der L_JMPCOND Befehl verwendet werden.<br />
Wird dieser Befehl dazu verwendet, dauernd eine Werte aus externe Steuerung<br />
abzufragen, ist darauf zu achten, dass diese Steuerung und der verwendete<br />
Datenbus nicht überlastet wird. Typischerweise wird dies verhindert, indem nach<br />
jeder Anfrage während einer kurzen Dauer gewartet wird. Es dürfen nur externe Ein-<br />
und Ausgänge aus einer Steuerung je Befehl abgefragt werden.<br />
Beispiel:<br />
Das Beispiel zeigt die Verwandtschaft mit dem IFNOT Befehl.<br />
JMPCOND E101 L, $TRUE ; IFNOT E101 L<br />
MOV RW101, 1 ; MOV RW101, 1<br />
JUMP $END<br />
$TRUE: ; ELSE<br />
MOV RW101, 0 ; MOV RW101, 0<br />
$END: ; END_IF<br />
Siehe auch:<br />
149 IF / IFNOT / ELSE / END_IF<br />
160 JUMP<br />
163 L_JMPCOND<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 154/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JMPTIM<br />
JMPTIM<br />
Verzweigt, wenn der Timer abgelaufen ist.<br />
Syntax:<br />
JMPTIM , <br />
Felder:<br />
Timer, der überprüft wird. T0 ist der lokale Timer, die Timer<br />
T001 bis T255 sind global.<br />
Label, zu dem verzweigt wird, wenn der Timer abgelaufen ist.<br />
Bemerkungen:<br />
Die Zahl der globalen Timer wird im .LIMITS Block angegeben. Es stehen daher<br />
höchstens 255 globale Timer zur Verfügung. Die globalen Timer müssen alle 3-stellig<br />
notiert sein (also T001).<br />
Beispiel:<br />
Das Beispiel wartet 200ms, bis es weiterfährt.<br />
SETTIM T0, 20<br />
$LOOP:<br />
JMPTIM T0, $END<br />
JUMP $LOOP<br />
$END:<br />
Siehe auch:<br />
60 .LIMITS<br />
160 JUMP<br />
205 SETTIM<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 155/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JPBIT<br />
JPBIT<br />
Verzweigt, wenn ein einzelnes Bit in einem Register 1 (also gesetzt, hoch) ist.<br />
Syntax:<br />
JPBIT , , <br />
Felder:<br />
Register, bei dem ein Bit überprüft wird. Vom Typ RV, RW, AV,<br />
AW, LV, LW, KV oder KW.<br />
Position des zu überprüfenden Bits. Gültiger Bereich ist 0 bis<br />
31.<br />
Label, zu dem verzweigt wird, wenn das Bit 1 ist.<br />
Beispiel:<br />
JPBIT RW(LV001), 0, $ODD ; Wenn ungerade, verzweige<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 156/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JPEQ<br />
JPEQ<br />
Verzweigt bei Gleichheit.<br />
Syntax:<br />
JPEQ , , <br />
Felder:<br />
Register vom Typ SW, RV, RW, AV, AW, LV, LW, KV, KW oder ZW.<br />
Eine direkte Zahl oder ein .<br />
Label, zu dem bei Gleichheit verzweigt wird.<br />
Bemerkungen:<br />
Register mit unterschiedlicher Bitbreite werden nach ihrem Wert verglichen.<br />
Beispiel:<br />
JPEQ RW001, 20, $LABEL ; verzweige, wenn RW001=20<br />
Siehe auch:<br />
158 JPGT<br />
159 JPLT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 157/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JPGT<br />
JPGT<br />
Verzweigt, wenn das erste Argument grösser als das zweite ist.<br />
Syntax:<br />
JPGT , , <br />
Felder:<br />
Register vom Typ SW, RV, RW, AV, AW, LV, LW, KV, KW oder ZW.<br />
Eine direkte Zahl oder ein .<br />
Label, zu dem bei Gleichheit verzweigt wird.<br />
Bemerkungen:<br />
Werte unterschiedlicher Bitbreite werden nach ihrem Wert verglichen.<br />
Beispiel:<br />
JPGT RW001, 20, $LABEL ; verzweige, wenn RW001>20<br />
Siehe auch:<br />
157 JPEQ<br />
159 JPLT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 158/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JPLT<br />
JPLT<br />
Verzweigt, wenn das erste Argument kleiner als das zweite ist.<br />
Syntax:<br />
JPLT , , <br />
Felder:<br />
Register vom Typ SW, RV, RW, AV, AW, LV, LW, KV, KW oder ZW.<br />
Eine direkte Zahl oder ein .<br />
Label, zu dem bei Gleichheit verzweigt wird.<br />
Bemerkungen:<br />
Werte unterschiedlicher Bitbreite werden nach ihrem Wert verglichen.<br />
Beispiel:<br />
JPLT RW001, 20, $LABEL ; verzweige, wenn RW001
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> JUMP<br />
JUMP<br />
Springt zum angegebenen Label.<br />
Syntax:<br />
JUMP <br />
Felder:<br />
Label, zu dem gesprungen wird.<br />
Bemerkungen:<br />
Der JUMP Befehl darf in Display-, Funktions- und Fehler-Tasks nur für Sprünge<br />
innerhalb des Tasks verwendet werden. Dies wird bei der Compilierung überprüft.<br />
Diese Regel gilt auch für mit CALL aufgerufene Unterprogramme, wird aber vom<br />
Compiler nicht überprüft, sondern führt bei Missachtung zu einem Laufzeit-Fehler.<br />
In strukturierten Programmen sollte und kann JUMP vermieden werden.<br />
Beispiel:<br />
Wiederhole einen Programmblock endlos.<br />
OUT M100 H<br />
$LABEL:<br />
XOR A100, A100, M100 ; wechsle jedesmal das Niveau<br />
SETTIM T0, 100 ; und warte 1 Sekunde<br />
WAITIM T0<br />
JUMP $LABEL<br />
Siehe auch:<br />
101 CALL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 160/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> L_INP<br />
L_INP<br />
Wartet, bis alle Bedingungen erfüllt sind. Die Bedingungen sind mit einem impliziten<br />
Offset versehen.<br />
Syntax:<br />
L_INP [, ]<br />
Felder:<br />
Ausgang, Eingang, Merker oder Fehlermerker mit dem<br />
gewünschten Niveau (H oder L). Es können beliebig viele<br />
Bedingungen angegeben werden.<br />
Für kann ein Bereich angegeben werden. Damit hat <br />
folgende Syntax:<br />
[- ] <br />
Dabei bedeuten:<br />
A oder O für Ausgang, E oder I für Eingang, F oder M für<br />
Merker, D für Fehlermerker. entspricht der<br />
normalen Schreibweise für einen Ausgang, Eingang, Merker<br />
oder Fehlermerker.<br />
Adresse als Zahl. Ist nicht angegeben, so entspricht<br />
das der normalen Schreibweise für einen Ausgang, Eingang,<br />
Merker oder Fehlermerker.<br />
optional: Dient zum Angeben eines Bereiches. In diesem Fall<br />
werden alle Elemente zwischen und <br />
überprüft. Ist eine Zahl.<br />
Niveau, auf welches überprüft wird. H oder L.<br />
Bemerkungen:<br />
Dieser Befehl kann nur in Funktions- und Displaytasks verwendet werden. Im<br />
Unterschied zum „gewöhnlichen“ INP Befehl wird hier implizit ein Offset addiert,<br />
welcher beim Aufruf mittels CALLD oder CALLF angegeben wurde.<br />
Wird versucht, auf Ein- oder Ausgänge fremder (externer) Steuerungen zuzugreifen,<br />
so gibt die Steuerung einen Fehler aus.<br />
Beispiele:<br />
L_INP E101 L, E102 H, A200 L, A202 H<br />
Das zweite Beispiel ist mit dem ersten identisch, geht aber über mehrere Zeilen<br />
L_INP E101 L, ; Hier kann angegeben werden,<br />
E102 H, ; warum genau diese Ein- und<br />
A200 L, ; Ausgänge überprüft werden.<br />
A202 H ; Kein Komma am Ende!<br />
Das dritte Beispiel zeigt die Verwendung eines Bereichs:<br />
L_INP E101-109 H<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 161/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> L_INP<br />
Siehe auch:<br />
102 CALLD<br />
104 CALLF<br />
152 INP<br />
154 JMPCOND<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 162/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> L_JMPCOND<br />
L_JMPCOND<br />
Verzweigt, wenn alle Bedingungen erfüllt sind. Die Bedingungen sind mit einem<br />
impliziten Offset versehen.<br />
Syntax:<br />
L_JMPCOND
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> L_OUTP<br />
L_OUTP<br />
Setzt den Wert von Ausgängen, Merker und Fehlermerker. Diese sind mit einem<br />
impliziten Offset versehen.<br />
Syntax:<br />
L_OUTP [, ]<br />
Felder:<br />
Ausgang, Merker oder Fehlermerker. Kann auch ein Bereich<br />
sein.<br />
L oder H.<br />
hat folgende Syntax:<br />
[- ]<br />
Dabei bedeuten:<br />
A oder O für Ausgang, F oder M für Merker, D für Fehlermerker.<br />
entspricht der normalen Schreibweise für einen<br />
Ausgang, Merker oder Fehlermerker.<br />
Adresse als Zahl. Ist nicht angegeben, so entspricht<br />
das der normalen Schreibweise für einen Ausgang, Merker oder<br />
Fehlermerker.<br />
optional: Dient zum Angeben eines Bereiches. In diesem Fall<br />
werden alle Elemente zwischen und gesetzt.<br />
Ist eine Zahl.<br />
Bemerkungen:<br />
Dieser Befehl kann nur in Funktions- und Displaytasks verwendet werden. Im<br />
Unterschied zum „gewöhnlichen“ OUTP Befehl wird hier implizit ein Offset addiert,<br />
welcher beim Aufruf mittels CALLD oder CALLF angegeben wurde.<br />
Wird versucht, auf Ausgänge fremder (externer) Steuerungen zuzugreifen, so gibt die<br />
Steuerung einen Fehler aus.<br />
Beispiel:<br />
Die effektiven Ausgänge und Merker hängen von den impliziten Offsets ab.<br />
L_OUTP A100 H, A101-107 L, M100 H<br />
Siehe auch:<br />
178 OUTP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 164/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> L_SWITCH / CASE / DEFAULT / END_SWITCH<br />
L_SWITCH / CASE / DEFAULT / END_SWITCH<br />
Ermöglicht die Auswahl eines Programmblocks aus bis zu 256 möglichen, abhängig<br />
von einem Argument. Dies ist eine Variante zum SWITCH Befehl.<br />
Syntax:<br />
L_SWITCH <br />
CASE [, ]<br />
<br />
[CASE [, ]<br />
]<br />
[DEFAULT<br />
]<br />
END_SWITCH<br />
Felder:<br />
Register, dessen Wert die Auswahl vornimmt; vom Typ SW, RV,<br />
RW, AV, AW, LV, LW, KV oder KW. Der Wert muss zwischen 0 und<br />
255 liegen, sonst wird kein ausgeführt, sondern mit<br />
dem nächsten Befehl nach dem L_SWITCH Block<br />
weitergefahren.<br />
Ein direkter Wert, oder ein KV oder KW Register, zwischen 0 und<br />
255.<br />
Programmcode, der ausgeführt wird, wenn der Wert in<br />
dem der CASE- oder DEFAULT-<br />
Anweisung entspricht.<br />
Bemerkungen:<br />
Der Wert in wird im L_SWITCH getestet und wenn er mit einem CASE-<br />
Wert übereinstimmt, wird der betreffende CASE-Programmblock gestartet und an<br />
dessen Ende auf die END_SWITCH Zeile gesprungen. Wenn der Wert zu keinem<br />
CASE-Wert passt, wird der DEFAULT-Programmblock ausgeführt. Fehlt das<br />
DEFAULT-Label, wird direkt auf die END_SWITCH Zeile gesprungen.<br />
Haben mehrere Konstanten den gleichen Wert, so wird dies vom Compiler<br />
während der Übersetzung mit einem Fehler gemeldet.<br />
Der Unterschied zum SWITCH Befehl liegt darin, dass der Compiler eine<br />
Sprungtabelle für die 256 möglichen Werte anlegt. Dadurch wird der Befehl deutlich<br />
schneller, allerdings wächst auch die Programmlänge.<br />
Siehe auch:<br />
229 SWITCH / CASE / DEFAULT / END_SWITCH<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 165/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> LEN_STR<br />
LEN_STR<br />
Liefert die Länge einer Zeichenkette.<br />
Syntax:<br />
STR_TO_ASCII , <br />
Felder:<br />
Register, in das die Länge geschrieben wird. Ein Register vom<br />
Typ RV, RW, AV, AW, LV oder LW.<br />
Zeichenkette. Ein variabler SR oder konstanter ST String.<br />
Beispiel:<br />
SMOV SR100, “1234567890”<br />
MOV LV001, 100<br />
LEN_STR LV002, SR100 ; LV002 ist nun 10<br />
LEN_STR LV002, SR(LV001) ; geht auch indirekt<br />
Siehe auch:<br />
210 SMOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 166/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> MID_STR<br />
MID_STR<br />
Schneidet einen Teil aus einer Zeichenkette aus.<br />
Syntax:<br />
MID_STR , , , <br />
Felder:<br />
SR Register, in das der ausgeschnittene Teil gespeichert wird.<br />
Zeichenkette, aus der ein Teil ausgeschnitten wird; ein variabler<br />
SR oder konstanter ST String.<br />
Position in Quelle, ab der der Teil ausgeschnitten wird. Kann als<br />
direkte Zahl oder als RV, RW, AV, AW, LV oder LW Register<br />
angegeben werden.<br />
Anzahl der Zeichen, die ausgeschnitten werden, und somit die<br />
neue Länge von ; vom Typ RV, RW, AV, AW, LV oder LW,<br />
oder eine direkte Zahl.<br />
Bemerkungen:<br />
Der durch und angegebene Bereich muss vollständig innerhalb<br />
von liegen.<br />
Beispiel:<br />
SMOV SR100, “abcd”<br />
MID_STR SR101, SR100, 2,2 ; SR101 ist nun “bc”<br />
Siehe auch:<br />
210 SMOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 167/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> MOV<br />
MOV<br />
Schreibt den Wert in der Quelle in das angegebene Ziel.<br />
Syntax:<br />
MOV , <br />
oder<br />
MOV , <br />
Felder:<br />
Ziel-Register vom Typ RV, RW, AV, AW, LV, LW oder ZW.<br />
Quelle, deren Wert in geschrieben wird. Eine<br />
direkte Zahl oder ein Register vom Typ RV, RW, AV, AW, LV, LW,<br />
KV, KW, ZW oder SW.<br />
Ein Ausgang, Merker oder Fehlermerker, der gesetzt wird.<br />
Ein Eingang, Ausgang, Merker oder Fehlermerker, dessen<br />
logisches Niveau in kopiert wird.<br />
Bemerkungen:<br />
Beachte: Register werden mit MOV gesetzt, Eingänge, Ausgänge, Merker und<br />
Fehlermerker mit OUTP; MOV dient in dem Fall nur zum Kopieren.<br />
Beispiele:<br />
Das erste Beispiel kopiert ein Systemregister in ein lokales, damit der Wert<br />
weiterverarbeitet werden kann.<br />
MOV LW001, SW5 ; Projekt Nummer<br />
Das zweite Beispiel setzt den Ausgang gleich wie den angegebenen Eingang.<br />
MOV A200, E200<br />
Siehe auch:<br />
97 BMOV<br />
178 OUTP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 168/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> MOV_PUFFER<br />
MOV_PUFFER<br />
Übermittelt einen Datenpuffer an die Statistik-Einheit.<br />
Syntax:<br />
MOV_PUFFER , , <br />
Felder:<br />
Zu übertragender Datenpuffer. Ein Register vom Typ RV, RW,<br />
AV, AW, LV oder LW, dessen Wert (die Nummer des Datenpuffers)<br />
durch den Befehl NEW_PUFFER gesetzt wurde.<br />
Statistik-Gruppe der Daten. Ein RV, RW, AV, AW, LV, LW, KV oder<br />
KW Register oder eine direkte Zahl, jeweils zwischen 1 und 20.<br />
Maschinentakte mit STAT_TAKT, bis der Puffer übertragen und<br />
endgültig aus <strong>ECCO</strong> gelöscht wird.<br />
Bemerkungen:<br />
Ist grösser als 1, so wird beim nächsten STAT_TAKT der Puffer noch nicht<br />
an die Statistik-Einheit übertragen. Damit wird es möglich, die Produktionsdaten zu<br />
einem Werkstück erst dann zu übertragen, wenn das Werkstück am Ende aller<br />
Stationen angelangt ist.<br />
Davon wird jedoch abgeraten, da die Programme unnötig umständlich werden und<br />
erhöhte Vorsicht bei der Synchronisierung einzelner Tasks gefordert ist (da dann nur<br />
noch ein STAT_TAKT für alle Stationen der Gruppe verwendet werden darf).<br />
Beispiel:<br />
Das Beispiel zeigt die typische Verwendung des Befehls, unter der Annahme, dass<br />
RV001 auf den zu übertragenden Puffer zeigt, und dass die Daten zur Gruppe 2<br />
gehören.<br />
MOV_PUFFER RV001, 2, 1<br />
STAT_TAKT<br />
Siehe auch:<br />
170 NEW_PUFFER<br />
214 STAT_TAKT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 169/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NEW_PUFFER<br />
NEW_PUFFER<br />
Eröffnet einen neuen Statistik-Datensatz.<br />
Syntax:<br />
NEW_PUFFER , , <br />
Felder:<br />
Register, in welches vom Befehl die Referenznummer des<br />
Datensatzes (als Zahl zwischen 0 und 199) geschrieben wird.<br />
Ein RV, RW, AV, AW, LV oder LW Register.<br />
Wert, der im neu angelegten Puffer in abgelegt wird.<br />
Ein Register vom Typ RV, RW, AV, AW, LV, LW, KV, KW oder ZW<br />
oder eine direkte Zahl.<br />
Datensatz-Adresse. Adresse im neu angelegten Puffer, in dem<br />
abgelegt wird, als Zahl zwischen 1 und 255.<br />
Bemerkungen:<br />
Es können bis zu 200 Datensätze gleichzeitig bearbeitet werden. In einem Statistik-<br />
Datensatz werden alle relevanten Messwerte, welche zu einem bestimmten<br />
Werkstück gehören, gespeichert. Jeder Datensatz kann bis zu 255 Messwerte<br />
enthalten, die innerhalb des Datensatzes adressiert sind.<br />
Wird versucht, mehr als 200 Datensätze gleichzeitig offen zu halten, so wird das<br />
Systemflag M003 (Puffer voll) hoch gesetzt.<br />
Beispiel:<br />
NEW_PUFFER RW012, LW001, 1 ; Eröffnet neuen Puffer und<br />
; weist darin dem Messwert #1<br />
; den Wert aus LW001 zu.<br />
Siehe auch:<br />
108 CLR_PUFFER<br />
169 MOV_PUFFER<br />
182 PUFFER<br />
184 RD_PUFFER<br />
212 STAT_PUFFER<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 170/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NOT<br />
NOT<br />
Der Zielwert entspricht der logischen NICHT-Verknüpfung der angegebenen Quelle.<br />
Syntax:<br />
NOT , <br />
oder<br />
NOT , <br />
Felder:<br />
Ein Ausgang, Merker oder Fehlermerker.<br />
Ein Ausgang, Eingang, Merker oder Fehlermerker.<br />
Ein Register vom Typ AV, AW, RV, RW, LV oder LW.<br />
Ein Register (AV, AW, RV, RW, LV, LW, ZW, KV oder KW) oder ein<br />
direkter Zahlwert. Muss die gleiche Bitbreite wie <br />
aufweisen.<br />
Bemerkungen:<br />
Eine Vermischung von Registern einerseits und I/O’s und Merker andererseits ist<br />
nicht möglich.<br />
Bei I/O’s und Merker ist das Ziel genau dann H, wenn die Quellen L ist. Bei Registern<br />
wird das Ergebnis bitweise gebildet; ein Ziel-Bit ist genau dann 1, wenn das Quell-Bit<br />
0 ist, sonst ist es 0. Sind mehrere Quellen angegeben, so wird nur die letzte zur Bildung<br />
des Ergebnis berücksichtigt.<br />
Das Ziel darf nicht gleichzeitig die Quelle sein. und<br />
dürfen nicht auf ein Element einer fremden (externen) Steuerung zugreifen.<br />
Beispiele:<br />
Das erste Beispiel zeigt die Verwendung bei I/O’s.<br />
NOT A024, E024<br />
Das zweite Beispiel zeigt die Verwendung mit Registern.<br />
MOV LW001, 42 ; 0..0 101010(b)<br />
NOT LW002, LW001 ; NOT 1..1 010101(b) = -43<br />
Siehe auch:<br />
96 AND<br />
176 OR<br />
252 XOR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 171/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NSDEF<br />
NSDEF<br />
Definiert die Notstop-Bedingung.<br />
Syntax:<br />
NSDEF [, ]<br />
Felder:<br />
Ein Eingang, Ausgang, Merker oder Fehlermerker, der den<br />
Notstop auslöst, wenn er das angegebene Niveau (L oder H)<br />
aufweist. Es sind bis zu 48 Bedingungen möglich.<br />
Bemerkungen:<br />
Der Notstop wird ausgelöst, wenn eine der Bedingungen erfüllt ist; es ist also eine<br />
logische ODER-Verknüpfung.<br />
Das Notstop-Programm beginnt beim NSPGM Label.<br />
Sind Merker oder Fehlermerker deklariert, so muss eine NSDEF- und STDEF-<br />
Bedingung angegeben werden.<br />
Beispiel:<br />
Notstop wird ausgelöst, wenn A101 oder A102 hoch sind, oder wenn der Merker<br />
M025 tief ist.<br />
NSDEF A101 H, A102 H, M205 L<br />
Siehe auch:<br />
261 NSPGM<br />
216 STDEF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 172/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NUM_INP<br />
NUM_INP<br />
Liest einen formatierten Wert in ein Register ein.<br />
Syntax:<br />
NUM_INP , , , , <br />
Felder:<br />
Spalte, ab der geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Register, in welches der Wert eingelesen wird; vom Typ RV, RW,<br />
AV, AW, LV, LW oder ZW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Formatierung in kann angegeben werden als:<br />
“[Text] #..# [Text]”<br />
Dabei bedeuten:<br />
Anzahl der Stellen, die für die Ausgabe auf dem Display<br />
reserviert werden. Negative Werte bedeuten linksbündig;<br />
positive rechtsbündig.<br />
Anzahl der Nachkommastellen des auszugebenden Wertes.<br />
Anzahl der auszugebenden Nachkomma-Stellen<br />
optional: Zusätzlicher unformatierter Text.<br />
Bemerkungen:<br />
Der Befehl zeigt den Inhalt in an (ist somit bis zu diesem Punkt identisch<br />
mit REGDISP), und wartet dann auf die Eingabe der neuen Wertes durch den<br />
Bediener, die mit der „=“-Taste abgeschlossen wird. Der neue Wert wird darauf<br />
zugewiesen.<br />
Der Befehl kann vom Programm durch den Befehl END_NUM_INP abgebrochen<br />
werden. behält dann den ursprünglichen Wert.<br />
Durch die Zahlenformatierung ist es möglich, implizit mit Fixkomma-Zahlen zu<br />
arbeiten.<br />
Da bei älteren Terminals die Eingabe nur dann korrekt angezeigt wird, wenn Schriftgrösse<br />
1 verwendet wird, und die Eingabe rechts in steht, wird empfohlen,<br />
keine grösseren Schriften zu verwenden oder der Formatierung nachfolgende Texte<br />
anzugeben.<br />
Es gibt keinen Befehl, um die Eingabe farbig zu gestalten. Der Befehl darf nur in den<br />
Tasks gemäss der Übersicht auf Seite 26 eingesetzt werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 173/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NUM_INP<br />
Beispiel:<br />
MOV RW001, 204567<br />
NUM_INP 1, 20, 1, RW001, “Wert: #8.4.2# mm”<br />
; Ausgabe: Wert: 20.45 mm<br />
; gibt der Benutzer nun 10.12= ein, so ist danach RW001=101200<br />
Siehe auch:<br />
120 END_NUM_INP<br />
187 REGDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 174/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> OPEN<br />
OPEN<br />
Öffnet eine neue parallele Kette, einen Task.<br />
Syntax:<br />
OPEN <br />
Felder:<br />
Label der aufzurufenden Tasks. Jedes globale Label, welches<br />
keinen Funktionstask oder Fehlermerker definiert, kann aus<br />
einem Background- oder Programmtask mittels OPEN gestartet<br />
werden.<br />
Bemerkungen:<br />
Der neue Task läuft unabhängig von der Kette, aus welcher sie aufgerufen wurde.<br />
Die Synchronisierung zwischen zwei Tasks erfolgt vorzugsweise über den EXCL<br />
Befehl.<br />
Ein paralleler Task wird mittels CLOSE beendet.<br />
Der Befehl TASK_OPEN liefert zusätzlich die absolute Nummer des aufgerufenen<br />
Tasks zurück. Ein Backgroundtask öffnet einen Backgroundtask, ein Programmtask<br />
einen Programmtask, wie auf Seite 26 gezeigt.<br />
Beispiel:<br />
Beispiel, bei dem ein Task einen anderen aufruft.<br />
TASK1:<br />
OPEN TASK2<br />
CLOSE<br />
TASK2:<br />
; Hierhin kommt der Programmtext<br />
CLOSE<br />
Siehe auch:<br />
106 CLOSE<br />
121 EXCL<br />
230 TASK_OPEN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 175/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> OR<br />
OR<br />
Der Zielwert entspricht der logischen ODER-Verknüpfung aller angegebenen<br />
Quellwerten.<br />
Syntax:<br />
OR , [, ]<br />
oder<br />
OR , [, ]<br />
Felder:<br />
Ein Ausgang, Merker oder Fehlermerker.<br />
Ein Ausgang, Eingang, Merker oder Fehlermerker.<br />
Ein Register vom Typ AV, AW, RV, RW, LV, LW oder ZW.<br />
Ein Register (AV, AW, RV, RW, LV, LW, ZW, KV oder KW) oder ein<br />
direkter Zahlwert. Muss die gleiche Bitbreite wie <br />
aufweisen.<br />
Bemerkungen:<br />
Eine Vermischung von Registern einerseits und I/O’s und Merker andererseits ist<br />
nicht möglich.<br />
Bei I/O’s und Merker ist das Ziel genau dann L, wenn alle Quellen L sind. Bei Registern<br />
wird das Ergebnis bitweise gebildet; ein Ziel-Bit ist genau dann 0, wenn alle<br />
Quell-Bits 0 sind. Ist nur eine Quelle angegeben, entspricht das Ergebnis der Quelle.<br />
Das Ziel darf nicht eine der Quellen sein. Es darf nicht auf ein<br />
Element einer fremden (externen) Steuerung zugegriffen werden.<br />
Beispiele:<br />
Der Ausgang A024 ist dann hoch gesetzt, wenn einer der Eingänge E010 bis E014<br />
hoch ist.<br />
OR A024, E010, E011, E012, ; Kann über mehrere Zeilen<br />
E013, E014 ; gehen (Beachte das Komma)<br />
Das zweite Beispiel zeigt die Verwendung mit Registern.<br />
MOV LW001, 42 ; 101010(b)<br />
MOV LW002, 36 ; 100100(b)<br />
OR LW003, LW001,LW002 ; OR 101110(b) = 46<br />
Siehe auch:<br />
96 AND<br />
171 NOT<br />
252 XOR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 176/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> OUTA<br />
OUTA<br />
Schreibt einen Wert auf den D/A-Kanal eines Regel-Slaves oder PAC’s.<br />
Syntax:<br />
OUTA AD., <br />
oder<br />
OUTA , <br />
Felder:<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Kanal des D/A-Ausgangs, auf den ausgegeben wird. Der gültige<br />
Bereich hängt von ab.<br />
Ein direkter Zahlwert oder ein Register vom Typ RV, RW, AV, AW,<br />
LV, LW, KV, KW oder ZW.<br />
Angabe des D/A-Ausgangs, als LV, AV, RV oder KV Register.<br />
Es ist =256*+.<br />
Beispiel:<br />
OUTA AD4.2, RW101<br />
Das zweite Beispiel macht das genau Gleiche.<br />
MOV LV001, 1026 ; 1026 = 4*256+2<br />
OUTA LV001, RW101<br />
Das letzte Beispiel zeigt den Befehl bei der Verwendung von Arrays.<br />
OUTA AV001(1), AV001(KV001)<br />
Siehe auch:<br />
151 INM<br />
166 MOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 177/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> OUTP<br />
OUTP<br />
Setzt den Wert von Ausgängen, Merker und Fehlermerker.<br />
Syntax:<br />
OUTP [, ]<br />
Felder:<br />
Ausgang, Merker oder Fehlermerker. Es kann auch ein Bereich<br />
angegeben werden.<br />
L oder H.<br />
hat folgende Syntax:<br />
[- ]<br />
Dabei bedeuten:<br />
A oder O für Ausgang, F oder M für Merker, D für Fehlermerker.<br />
entspricht der normalen Schreibweise für einen<br />
Ausgang, Merker oder Fehlermerker.<br />
Adresse als Zahl. Ist nicht angegeben, so entspricht<br />
das der normalen Schreibweise für einen Ausgang, Merker oder<br />
Fehlermerker.<br />
optional: Dient zum Angeben eines Bereiches. In diesem Fall<br />
werden alle Elemente zwischen und gesetzt.<br />
Ist eine Zahl.<br />
Bemerkungen:<br />
In einem Display- oder Funktions-Task kann der L_OUTP-Befehl verwendet werden.<br />
Wird dieser Befehl dazu verwendet, Werte einer externen Steuerung zu setzen, so ist<br />
darauf zu achten, dass diese Steuerung und der verwendete Datenbus nicht<br />
überlastet wird. Typischerweise wird dies verhindert, indem nach jedem Befehl<br />
während einer kurzen Dauer gewartet wird. Zusätzlich darf jeder OUTP Befehl nur mit<br />
einer einzigen Steuerung kommunizieren.<br />
Beispiele:<br />
OUTP A101 H, A102 L, ; Verwendeung über mehrere<br />
M350 H, M351 H ; Zeilen (Beachte das Komma)<br />
Das zweite Beispiel ist identisch mit dem ersten, verwendet jedoch einen Bereich:<br />
OUTP A101 H, A102 L, M350-351 H<br />
Siehe auch:<br />
164 L_OUTP<br />
166 MOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 178/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> PAC<br />
PAC<br />
Kommuniziert mit einem PAC.<br />
Syntax:<br />
PAC , [, [,]] [, < , [,]]<br />
Felder:<br />
Nummer des PAC’s, mit dem kommuniziert wird. Ein RV, LV, KV<br />
Register oder eine direkte Zahl. Gültige Werte sind 1 bis 30.<br />
Bezeichner für den Befehl aus dem .PAC_DEF Block.<br />
Eingangs-Register. Entweder ein Array, oder Register vom Typ<br />
RV, RW, LV oder LW.<br />
Ausgangs-Register. Entweder ein Array, oder Register vom Typ<br />
RV, RW, LV, LW, KV, KW oder direkte Zahlen.<br />
Die Anzahl der Eingangs- und Ausgangs-Argumente wird aus dem Befehl im<br />
.PAC_DEF Block entnommen.<br />
Bei Arrays ist das erste Element mit anzugeben, wie in AV001(3). Der Befehl<br />
verwendet das angegebene Element und die notwendige Anzahl nachfolgender<br />
Elemente aus dem Array.<br />
Bemerkungen:<br />
Die Vermischung von Registern und Arrays in den Ein- und Ausgangs-Listen ist nicht<br />
erlaubt und wird vom Compiler während der Übersetzung mit einem Fehler<br />
abgefangen.<br />
Der Compiler überprüft, ob die korrekte Anzahl an Argumenten angegeben ist.<br />
Jedes Argument (in der PAC Dokumentation Feld genannt) ist 32 Bit breit und<br />
vorzeichenbehaftet.<br />
Beispiel:<br />
Nur ein Register (LV012) wird an den PAC 16 geschrieben.<br />
PAC 16, POS_FRC_ABORT,
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> PAC<br />
Siehe auch:<br />
65 .PAC_DEF / .END_PAC_DEF<br />
[5] PAC Handbuch, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.01, 2001.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 180/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> POWER_OFF<br />
POWER_OFF<br />
Beendet <strong>ECCO</strong>.<br />
Syntax:<br />
POWER_OFF<br />
Bemerkungen:<br />
Allfällig anstehende Daten (Statistik, ZPoint, Anfragen externer Steuerungen, ...)<br />
werden noch behandelt, es werden aber keine neuen Befehle mehr ausgeführt und<br />
keine neuen Anfragen mehr beantwortet. Sobald keine Daten mehr anstehen,<br />
beendet <strong>ECCO</strong> zum PC Betriebssystem.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 181/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> PUFFER<br />
PUFFER<br />
Fügt einen Messwert einem bestehenden Statistik-Datensatz hinzu.<br />
Syntax:<br />
PUFFER , , <br />
Felder:<br />
Datenpuffer. Register, dessen Wert (die Nummer des Puffers)<br />
durch den Befehl NEW_PUFFER gesetzt wurde. Ein RV, RW, AV,<br />
AW, LV oder LW Register.<br />
Wert, der im Puffer in abgelegt wird. Ein<br />
Register vom Typ RV, RW, AV, AW, LV, LW, KV, KW oder ZW oder<br />
eine direkte Zahl.<br />
Datensatz-Adresse. Adresse im Puffer , in dem<br />
abgelegt wird, als Zahl zwischen 1 und 255.<br />
Bemerkungen:<br />
In einem Statistik-Datensatz werden alle relevanten Messwerte, welche zu einem<br />
bestimmten Werkstück gehören, gespeichert. Jeder Datensatz kann bis zu 255<br />
Messwerte enthalten, die innerhalb des Datensatzes adressiert sind.<br />
Messwerte können aus dem Puffer mit RD_PUFFER gelesen werden.<br />
Beispiel:<br />
NEW_PUFFER RW012, LW001, 1 ; Eröffnet neuen Puffer und<br />
; weist darin dem Messwert #1<br />
; den Wert aus LW001 zu.<br />
PUFFER RW012, LW002, 2 ; Weist nun dem Messwert #2<br />
; den Wert aus LW002 zu.<br />
Siehe auch:<br />
170 NEW_PUFFER<br />
184 RD_PUFFER<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 182/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RD_DATE<br />
RD_DATE<br />
Liest Tag, Monat und Jahr ein.<br />
Syntax:<br />
RD_DATE , , <br />
Felder:<br />
Register vom Typ RV, RW, AV, AW, LV oder LW, in das der<br />
aktuelle Tag (als Zahl zwischen 1 und 31) eingelesen wird.<br />
Register vom Typ RV, RW, AV, AW, LV oder LW, in das der<br />
aktuelle Monat (als Zahl zwischen 1 und 12) eingelesen wird.<br />
Register vom Typ RV, RW, AV, AW, LV oder LW, in welches das<br />
aktuelle Jahr vierstellig eingelesen wird.<br />
Beispiel:<br />
; Lese Tag, Monat und Jahr<br />
RD_DATE LW001, LW002, LW003<br />
Siehe auch:<br />
186 RD_TIME<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 183/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RD_HOUR<br />
RD_HOUR<br />
Liest Stunden, Minuten und Sekunden ein.<br />
Syntax:<br />
RD_HOUR , , <br />
Felder:<br />
Die Stundenzahl der aktuellen Uhrzeit. Ein RV, RW, LV, LW, AV<br />
oder AW Register.<br />
Die Minutenzahl der aktuellen Uhrzeit. Ein RV, RW, LV, LW, AV<br />
oder AW Register.<br />
Die Sekundenzahl der aktuellen Uhrzeit. Ein RV, RW, LV, LW, AV<br />
oder AW Register.<br />
Beispiel:<br />
RD_HOUR LW001, LW002, LW003<br />
; LW001: Stunden<br />
; LW002: Minuten<br />
; LW003: Sekunden<br />
Siehe auch:<br />
186 RD_TIME<br />
187 RD_WEEK<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 184/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RD_PUFFER<br />
RD_PUFFER<br />
Liest einen Messwert aus einem Statistik-Datensatz.<br />
Syntax:<br />
RD_PUFFER , , <br />
Felder:<br />
Datenpuffer. Register, dessen Wert (die Nummer des Puffers)<br />
durch den Befehl NEW_PUFFER gesetzt wurde. Ein RV, RW, AV,<br />
AW, LV oder LW Register.<br />
Register, in das der Messwert in geschrieben wird, vom<br />
Typ RV, RW, AV, AW, LV oder LW.<br />
Datensatz-Adresse. Adresse im Puffer , dessen Wert<br />
gelesen wird, als Zahl zwischen 1 und 255.<br />
Bemerkungen:<br />
In einem Statistik-Datensatz werden alle relevanten Messwerte, welche zu einem<br />
bestimmten Werkstück gehören, gespeichert. Jeder Datensatz kann bis zu 255<br />
Messwerte enthalten, die innerhalb des Datensatzes adressiert sind.<br />
Messwerte werden mit NEW_PUFFER und PUFFER in den Puffer geschrieben. Wenn<br />
unter kein Wert abgelegt wurde, so wird 0 zurückgegeben.<br />
Beispiel:<br />
NEW_PUFFER RW012, LW001, 1 ; Eröffnet neuen Puffer und<br />
; weist darin dem Messwert #1<br />
; den Wert aus LW001 zu.<br />
RD_PUFFER RW012, RW101, 1 ; Lese den Wert wieder ein.<br />
Siehe auch:<br />
170 NEW_PUFFER<br />
182 PUFFER<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 185/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RD_TIME<br />
RD_TIME<br />
Liest Zeit und Datum ein.<br />
Syntax:<br />
RD_TIME , <br />
Felder:<br />
Aktuelle Uhrzeit der Systemuhr. Ein Register vom Typ RW, AW,<br />
LW oder ZW.<br />
Aktuelles Datum. Ein RW, AW oder LW Register.<br />
Bemerkungen:<br />
Die Werte in den beiden Registern sind eine maschinennahe Codierung der Zeit und<br />
des Datums; um sie lesbar auszugeben werden die Funktionen DATEDISP,<br />
HP_DATEDISP, HP_TIMEDISP, TIMEDISP, VI_DATE und VI_TIME verwendet.<br />
Wird im Feld ein RW, AW oder LW Register angegeben, so beträgt die<br />
Auflösung eine Sekunde. Wird jedoch ein ZW Register angegeben, so beträgt die<br />
Auflösung eine Hundertstel-Sekunde; ZW Register eignen sich somit beispielsweise<br />
zur Angabe von Zykluszeiten.<br />
Der Wert im Register entspricht der Anzahl der Tage seit dem 1. Januar<br />
1980.<br />
Beispiel:<br />
RD_TIME LW001, LW002 ; Lese Zeit und Datum ein<br />
TIMEDISP 1, 10, 1, LW001, “ Zeit: #hh:mm#”<br />
DATEDISP 1, 20, 1, LW002, “Datum: #tt.mm.jjjj#”<br />
Siehe auch:<br />
111 DATEDISP<br />
132 HP_DATEDISP<br />
140 HP_TIMEDISP<br />
183 RD_DATE<br />
230 TIMEDISP<br />
238 VI_DATE<br />
244 VI_TIME<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 186/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RD_WEEK<br />
RD_WEEK<br />
Liest Kalenderwoche und Wochentag ein.<br />
Syntax:<br />
RD_WEEK , <br />
Felder:<br />
Kalenderwoche; ein RV, RW, LV, LW, AV oder AW Register.<br />
Wochentag; ein RV, RW, LV, LW, AV oder AW Register.<br />
Bemerkungen:<br />
Der Wochentag wird „europäisch“ angegeben, so dass die Woche am Montag bei 1<br />
beginnt und am Sonntag mit 7 aufhört.<br />
Beispiel:<br />
RD_WEEK LW001, LW002 ; Kalenderwoche und Wochentag<br />
Siehe auch:<br />
184 RD_HOUR<br />
186 RD_TIME<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 187/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> REGDISP<br />
REGDISP<br />
Formatiert und schreibt den Wert in einem Register auf das Display.<br />
Syntax:<br />
REGDISP , , , , <br />
Felder:<br />
Spalte, ab der der Text geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Auszugebender Wert. Ein Register vom Typ SW, RV, RW, AV, AW,<br />
LV, LW, KV, KW oder ZW.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Formatierung in kann angegeben werden als:<br />
“[Text] #..# [Text]”<br />
Dabei bedeuten:<br />
Anzahl der Stellen, die für die Ausgabe auf dem Display<br />
reserviert werden. Ein negativer Wert ermöglicht linksbündige<br />
Formatierung mit der betragsgemässen Anzahl Stellen.<br />
Anzahl der Nachkommastellen des auszugebenden Wertes.<br />
Anzahl der auszugebenden Nachkomma-Stellen<br />
optional: Zusätzlicher unformatierter Text.<br />
Bemerkungen:<br />
Durch die Zahlenformatierung ist es möglich, implizit mit Fixkomma-Zahlen zu<br />
arbeiten.<br />
Beachte, dass die überschüssigen Nachkommastellen abgeschnitten (und nicht<br />
gerundet) werden.<br />
Beispiel:<br />
MOV RW001, 204567<br />
REGDISP 1, 20, 1, RW001, “Wert: #8.4.2# mm”<br />
; Ausgabe: Wert: 20.45 mm<br />
Siehe auch:<br />
139 HP_REGDISP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 188/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RET<br />
RET<br />
Beendet eine Routine.<br />
RET<br />
Syntax:<br />
Bemerkungen:<br />
Beendet eine mit CALL aufgerufene Routine und kehrt zum aufrufenden Programm<br />
zurück; das heisst, als nächstes wird der Befehl nach den CALL ausgeführt.<br />
Beispiel:<br />
Der Task STAT01 ruft die Routine SUB1 auf, die rein gar nichts macht.<br />
STAT01: ; aufrufender Task<br />
CALL SUB1 ; ruft SUB1 auf<br />
; nach dem RET hier weiter<br />
CLOSE<br />
SUB1: ; aufgerufene Routine<br />
RET ; macht gar nichts<br />
Siehe auch:<br />
101 CALL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 189/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RETD<br />
RETD<br />
Beendet einen Display-Task.<br />
Syntax:<br />
RETD<br />
Bemerkungen:<br />
Beendet einen mit CALLD aufgerufenen Display-Task und kehrt zum aufrufenden<br />
Programm zurück; das heisst, als nächstes wird der Befehl nach den CALLD<br />
ausgeführt.<br />
Die Argumente des Display-Tasks werden wie unter CALLD beschrieben zurück<br />
kopiert.<br />
Beispiel:<br />
Ein umfassenderes Beispiel findet sich in der Beschreibung des CALLD Befehls.<br />
@DISP1_TASK:<br />
; Funktionalität<br />
RETD ; Beende @DISP1_TASK<br />
Siehe auch:<br />
102 CALLD<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 190/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RETE<br />
RETE<br />
Beendet einen Fehler-Task und setzt den zugehörigen Fehlermerker tief.<br />
Syntax:<br />
RETE<br />
Bemerkungen:<br />
Der Fehler-Task wird automatisch gestartet, wenn der zugehörige Fehlermerker hoch<br />
gesetzt wird, beispielsweise durch den OUTP Befehl.<br />
Der Fehler-Task hat die höchste Priorität beim Beschreiben des Displays. Davon<br />
abhängig ist auch das Verhalten nach den RETE Befehls: Der zuvor aktive Display -<br />
Task wird von Anfang an wieder abgearbeitet, so dass ein konsistenter Aufbau des<br />
Bildschirms gewährleistet ist.<br />
Beachte, dass ein Fehler-Task nie unterbrochen wird. Tritt im Displaytask ein Fehler<br />
auf, wird er entweder erst nach dem RETE gestartet, oder es wird ein Notstop<br />
ausgelöst.<br />
Es existiert kein Befehl wie CALLE, da ein Fehlertask automatisch mit dem Setzen<br />
des Fehlermerkers gestartet wird (respektive, wenn zur Zeit bereits ein Fehler<br />
behandelt wird, erst dann, wenn letzter mit RETE beendet).<br />
Beispiel:<br />
Das Beispiel zeigt den Einsatz von Fehlermerkern am Beispiel des Fehlermerkers<br />
D100. Die Definition des Fehlermerkers in .IO_TEXT sieht dabei wie folgt aus:<br />
.IO_TEXT<br />
D100 “Test-Fehler D100”, &ERROR_D100<br />
.END_IO_TEXT<br />
Der Fehlerhandler hat dann den folgenden Rumpf:<br />
&ERROR_D100:<br />
; Handle den Fehler hier<br />
RETE<br />
Schliesslich kann der Fehler im Programm wie folgt ausgelöst werden:<br />
OUTP D100 H ; Löse den Fehler aus<br />
INP D100 L ; und warte auf Quittierung<br />
Siehe auch:<br />
57 .IO_TEXT / .END_IO_TEXT<br />
178 OUTP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 191/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> RETF<br />
RETF<br />
Beendet einen Funktions-Task.<br />
Syntax:<br />
RETF<br />
Bemerkungen:<br />
Beendet einen mit CALLF aufgerufenen Funktions-Task und kehrt zum aufrufenden<br />
Programm zurück; das heisst, als nächstes wird der Befehl nach den CALLF<br />
ausgeführt. Argumente, sofern sie im aufrufenden Programm nicht schreibgeschützt<br />
sind, werden zurück kopiert.<br />
Wurde der Funktions-Task vom Display aus gestartet, dann kehrt der Kontrollfluss<br />
zum Auswahlmodus auf dem Display zurück.<br />
Siehe auch:<br />
52 .FUNCTIONS / .FUNC_END<br />
104 CALLF<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 192/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SAVE_ARRAY<br />
SAVE_ARRAY<br />
Speichert ein Array auf die Festplatte.<br />
Syntax:<br />
SAVE_ARRAY <br />
Felder:<br />
Erstes Array-Element, direkt oder indirekt adressiert, ab dem<br />
das AV oder AW Array gespeichert wird.<br />
Der Dateiname wird kanonisch gebildet nach:<br />
_______.arr<br />
Dabei bedeuten:<br />
Das verwendete Array.<br />
Jahreszahl, vierstellig.<br />
Monat, ein- oder zweistellig zwischen 1 und 12.<br />
Tag im Monat, ein- oder zweistellig zwischen 1 und 31.<br />
Stunde, ein- oder zweistellig zwischen 0 und 23.<br />
Minute, ein- oder zweistellig zwischen 0 und 59.<br />
Sekunde, ein- oder zweistellig zwischen 0 und 59.<br />
Millisekunde mit bis zu drei Stellen, zwischen 0 und 999.<br />
Beispiel:<br />
Wurde am 10. Januar 2005 um genau 17:23:05 Uhr der Befehl<br />
SAVE_ARRAY AV100(5)<br />
ausgeführt, und hatte das Array genau 10 Elemente, die jeweils den Wert ihres Index<br />
hatten, so wurde eine Datei namens<br />
AV(100)_2005_1_10_17_23_5_0.arr<br />
erzeugt, mit folgendem Inhalt:<br />
5 ;AV(100)(5)<br />
6 ;AV(100)(6)<br />
7 ;AV(100)(7)<br />
8 ;AV(100)(8)<br />
9 ;AV(100)(9)<br />
10 ;AV(100)(10)<br />
Siehe auch:<br />
48 .ARRAYS / .END_ARRAYS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 193/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SCALE_AD<br />
SCALE_AD<br />
Skaliert den Analog-Eingang eines Regel-Slaves oder PAC.<br />
Syntax:<br />
SCALE_AD , , <br />
oder<br />
SCALE_AD AD., , <br />
Felder:<br />
Adresse des Analog-Eingangs. Ein RV, AV, LV oder KV<br />
Register.<br />
Adresse des Regel-Slaves oder PAC. Zahl zwischen 1 und 30.<br />
Adresse des AD-Wandlers auf dem . Die Zahl der<br />
vorhandenen AD-Eingänge ist modell-abhängig.<br />
Untergrenze, das heisst Rückgabewert für die untere Sättigung.<br />
Ein RV, RW, AV, AW, LV, LW, KV, KW Register oder eine direkte<br />
Zahl.<br />
Obergrenze, das heisst Rückgabewert für die obere Sättigung.<br />
Ein RV, RW, AV, AW, LV, LW, KV, KW Register oder eine direkte<br />
Zahl.<br />
Es ist =256*+.<br />
Bemerkungen:<br />
Der erfasste Wertebereich bei einem Regel-Slave ist 0 bis 4095. Ohne Skalierung<br />
entspricht 0 dem analogen Signal von -10 Volt, und 4095 entspricht einer Spannung<br />
von +10 V.<br />
Beim PAC wird ein 14-Bit Wandler verwendet, womit der Wertebereich zwischen 0<br />
und 16383 liegt. Ohne Skalierung entspricht 0 dem analogen Signal von -10 Volt,<br />
und 16383 entspricht einer Spannung von +10 V.<br />
Durch die Skalierung mit diesem Befehl können die Werte in „vernünftigen“ Benutzer-<br />
Einheiten (wie Newton für Kräfte oder Pascal für Drücke) ausgelesen werden.<br />
Beispiele:<br />
Soll beispielsweise das Signal einer Kraft eingelesen werden, bei dem –10V -4000N<br />
und +10V +4000N entspricht, so kann durch das nachfolgende Beispiel der Wert<br />
direkt in Newton eingelesen werden, wodurch im Prozess eine umständliche<br />
Skalierung entfällt.<br />
SCALE_AD AD1.1, -4000, +4000<br />
Das zweite Beispiel ist identisch zum ersten.<br />
MOV LV001, 257 ; 257=256*1+1<br />
MOV LV002, -4000<br />
MOV LV003, +4000<br />
SCALE_AD LV001, LV002, LV003<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 194/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SCALE_AD<br />
Siehe auch:<br />
74 .SET_CONST / .END_CONST<br />
166 MOV<br />
196 SCALE_DA<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 195/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SCALE_DA<br />
SCALE_DA<br />
Skaliert den Analog-Ausgang eines Regel-Slaves oder PAC.<br />
Syntax:<br />
SCALE_DA , , <br />
oder<br />
SCALE_DA DA., , <br />
Felder:<br />
Adresse des Analog-Ausgangs. Ein RV, AV, LV oder KV<br />
Register.<br />
Adresse des Regel-Slaves oder PAC. Zahl zwischen 1 und 30.<br />
Adresse des DA-Wandlers auf dem . Die Zahl der<br />
vorhandenen DA-Ausgänge ist modell-abhängig.<br />
Untergrenze, das heisst Rückgabewert für den unteren<br />
Grenzwert. Ein RV, RW, AV, AW, LV, LW, KV, KW Register oder<br />
eine direkte Zahl.<br />
Obergrenze, das heisst Rückgabewert für den oberen<br />
Grenzwert. Ein RV, RW, AV, AW, LV, LW, KV, KW Register oder<br />
eine direkte Zahl.<br />
Es ist =256*+.<br />
Bemerkungen:<br />
Der darstellbare Wertebereich bei einem Regel-Slave ist 0 bis 4095. Ohne<br />
Skalierung entspricht 0 dem analogen Signal von -10 Volt, und 4095 entspricht einer<br />
Spannung von +10 V.<br />
Beim PAC wird ein 14-Bit Wandler verwendet, womit der Wertebereich zwischen 0<br />
und 16383 liegt. Ohne Skalierung entspricht 0 dem analogen Signal von -10 Volt,<br />
und 16383 entspricht einer Spannung von +10 V.<br />
Beispiel:<br />
Soll beispielsweise das Signal für ein Proportionalventil ausgegeben werden, bei<br />
dem –10V –300Bar und +10V +300Bar entspricht, so kann durch das nachfolgende<br />
Beispiel der Wert in Bar direkt gesetzt werden, wodurch im Prozess eine<br />
umständliche Skalierung entfällt.<br />
SCALE_DA AD1.1, -300, +300<br />
Siehe auch:<br />
74 .SET_CONST / .END_CONST<br />
193 SCALE_AD<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 196/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SCHICHT<br />
SCHICHT<br />
Meldet STAT_READ einen Schichtwechsel.<br />
Syntax:<br />
SCHICHT , , , <br />
Felder:<br />
Statistik-Gruppe, an die der Schichtwechsel übertragen wird.<br />
Ein RV, RW, AV, AW, LV, LW, KV oder KW Register oder eine<br />
direkte Zahl, jeweils zwischen 1 und 20.<br />
Maschinentakte mit STAT_TAKT, bis der Schichtwechsel<br />
übertragen wird; Zahl zwischen 1 und 127.<br />
Schichtführer, codiert als beliebige 16 Bit Zahl (0 bis 65535). Ein<br />
RV, RW, AV, AW, LV, LW, KV oder KW Register.<br />
Maschinenführer, codiert als beliebige 16 Bit Zahl (0 bis 65535).<br />
Ein RV, RW, AV, AW, LV, LW, KV oder KW Register.<br />
Bemerkungen:<br />
Die Codierungen für Schicht- und Maschinenführer werden vom Kunden gemäss<br />
seinen Schichtplänen vorgenommen.<br />
Werden für oder Werte ausserhalb des Bereichs<br />
angegeben, so werden die höherwertigen Bits verworfen.<br />
Beispiel:<br />
Das Beispiel weist am Ende des gegenwärtigen Taktes der Statistik-Gruppe 8 den<br />
neuen Schichtführer codiert in RW297 und den neuen Maschinenführer codiert in<br />
RW298 zu.<br />
SCHICHT 8, 1, RW297, RW298<br />
Siehe auch:<br />
214 STAT_TAKT<br />
215 STCKZAHL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 197/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SEARCH<br />
SEARCH<br />
Sucht ein Element in einem Array.<br />
Syntax:<br />
SEARCH , , <br />
Felder:<br />
Register, in das die Position des gefundenen Elementes<br />
geschrieben wird; vom Typ RV, RW, AV, AW, LV, oder LW. Liefert<br />
0 zurück, wenn kein Element gefunden wurde.<br />
Startposition im AV oder AW Array, zusammen mit dem zu<br />
durchsuchenden Array. Das Array wird ab der Position<br />
durchsucht.<br />
Wert, der gesucht wird; ein RV, RW, AV, AW, LV, LW, KV oder KW<br />
Register, oder eine direkte Zahl.<br />
Bemerkungen:<br />
Der Suchalgorithmus hat O(n) Laufzeit.<br />
Haben mehrere Elemente den Wert , wird irgendeine Position<br />
zurückgegeben.<br />
Beispiel:<br />
Sucht in den Elementen in AW001 ab Position 30 ein Element mit Wert 55.<br />
SEARCH LV001, AW001(30), 55<br />
Siehe auch:<br />
48 .ARRAYS / .END_ARRAYS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 198/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SEND_IO<br />
SEND_IO<br />
Liest oder schreibt Eingänge, Ausgänge, Merker oder Fehlermerker einer fremden<br />
<strong>ECCO</strong> Steuerung in eigene Eingänge, Ausgänge, Merker oder Fehlermerker.<br />
Syntax:<br />
SEND_IO [, ], , [, ]<br />
Felder:<br />
Eingang, Ausgang, Merker oder Fehlermerker der fremden<br />
<strong>ECCO</strong> Steuerung.<br />
Das Zeichen < für Schreiben, > für das Lesen.<br />
Eingang, Ausgang, Merker oder Fehlermerker der eigenen<br />
<strong>ECCO</strong> Steuerung.<br />
Es können bis zu 30 I/O’s angegeben werden; dabei müssen gleich viele eigene wie<br />
fremde angegeben sein.<br />
Bemerkungen:<br />
Vorsicht vor den Kommas, die begrenzen.<br />
Die Voraussetzung für das Kopieren ist, dass die Elemente in der Steuerung, wohin<br />
geschrieben wird, nicht im .PROTECTED Block aufgeführt und damit beschreibbar<br />
sind; sonst wird der Systemfehler 69 ausgelöst.<br />
Beachte, dass der Tausender bei I/O’s die Steuerung angibt, somit ist A3004 der<br />
vierte Ausgang der Steuerung 3. Es darf in einem Befehl jeweils nur mit einer<br />
fremden Steuerung kommuniziert werden.<br />
Beispiel:<br />
SEND_IO A3003, >, A026 ; Lese Steuerung 3 A3003<br />
; in eigenes A026<br />
SEND_IO A3012, M3018, M3019,
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SEND_REG<br />
SEND_REG<br />
Liest oder schreibt Register einer fremden <strong>ECCO</strong>-Steuerung in die eigene<br />
Steuerung.<br />
Syntax:<br />
SEND_REG <strong>ECCO</strong>, [, ], ,<br />
[, ]<br />
Felder:<br />
Nummer der fremden <strong>ECCO</strong>-Steuerung.<br />
Register der fremden Steuerung. Es können LV, LW, RV, RW, KW<br />
und ZW Register gesendet; RV, RW und ZW empfangen werden.<br />
Das Zeichen < für Schreiben; > für das Lesen.<br />
Eigenes Register. Es können LV, LW, RV, RW, KW und ZW<br />
Register gesendet; RV, RW und ZW empfangen werden.<br />
Es können bis zu 30 Register angegeben werden; dabei müssen gleich viele eigene<br />
wie fremde angegeben sein.<br />
Indirekte Adressierungen sind verboten, damit der Compiler bereits gewisse<br />
Überprüfungen mit .UNLOCK und .PROTECTED vornehmen kann.<br />
Bemerkungen:<br />
Vorsicht vor den Kommas, die begrenzen.<br />
Die Voraussetzung für das Kopieren ist, dass die Elemente in der Steuerung, wohin<br />
geschrieben wird, nicht im .PROTECTED Block aufgeführt und damit beschreibbar<br />
sind; sonst wird der Systemfehler 69 ausgelöst.<br />
Beim Portieren aus SMC42 ist zu beachten, dass die fremde Steuerung nicht mehr<br />
durch SMC, sondern durch <strong>ECCO</strong> kennzeichnet wird.<br />
Umwandlung von 16-Bit Typen auf 32-Bit Typen wird vorzeichenbehaftet<br />
durchgeführt; im umgekehrten Fall werden die höherwertigen Bits notfalls<br />
abgeschnitten.<br />
Beispiel:<br />
Schreibt zwei eigene Register in die Steuerung 3.<br />
SEND_REG <strong>ECCO</strong>3, RW101, RW201, , RW5100, RW4100<br />
Siehe auch:<br />
60 .LIMITS<br />
69 .PROTECTED / .END_PROTECTED<br />
91 .UNLOCK / .END_UNLOCK<br />
198 SEND_IO<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 200/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SEND_SR<br />
SEND_SR<br />
Ermöglicht das Kopieren von variablen Strings zwischen Steuerungen.<br />
Syntax:<br />
SEND_SR <strong>ECCO</strong>, , , , <br />
Felder:<br />
Nummer der fremden <strong>ECCO</strong>-Steuerung. Grundsätzlich sind die<br />
Werte 1 bis 15 möglich, die fremde Steuerung muss aber unter<br />
.LIMITS deklariert worden sein.<br />
Nummer der Landessprache. Zahl zwischen 0 und 3, wobei 0<br />
die gegenwärtige Landessprache wählt, während die Werte 1<br />
bis 3 die jeweilige Sprache auswählen.<br />
SR Register der fremden Steuerung.<br />
Das Zeichen < für Schreiben, > für das Lesen.<br />
Eigenes SR Register.<br />
Bemerkungen:<br />
Vorsicht vor den Kommas, die begrenzen.<br />
Die Voraussetzung für das Kopieren ist, dass die Elemente in der Steuerung, wohin<br />
geschrieben wird, nicht im .PROTECTED Block aufgeführt, aber im .UNLOCK Block<br />
angegeben und damit beschreibbar sind; sonst wird der Systemfehler 69 ausgelöst.<br />
Beim Portieren aus SMC42 ist zu beachten, dass die fremde Steuerung nicht mehr<br />
durch SMC, sondern durch <strong>ECCO</strong> kennzeichnet wird.<br />
Beispiel:<br />
Schreibt eigenes Register SR100 nach SR200 der Steuerung 3 in der Sprache 1.<br />
SEND_SR <strong>ECCO</strong>3, 1, SR200, , SR100<br />
Siehe auch:<br />
60 .LIMITS<br />
69 .PROTECTED / .END_PROTECTED<br />
91 .UNLOCK / .END_UNLOCK<br />
198 SEND_IO<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 201/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SET_LANG<br />
SET_LANG<br />
Wählt die aktuelle Landessprache aus.<br />
Syntax:<br />
SET_LANG <br />
Felder:<br />
Label (bestehend aus drei Buchstaben) der Landessprache.<br />
Bemerkungen:<br />
Die Texttabellen in .FUNCTIONS, .IO_TEXT, .STATIONS, .STATISTIC, .STRINGS<br />
und .ZPOINT müssen so ausgefüllt sein, dass jedes verwendete Element einen Text<br />
in der neuen Landessprache zugeordnet hat. Diese Bedingung wird bereits vom<br />
Compiler überprüft, und Verletzungen werden mit einem Fehler gemeldet.<br />
Beispiel:<br />
SET_LANG ENG ; Wechsle auf Englisch<br />
Siehe auch:<br />
52 .FUNCTIONS / .FUNC_END<br />
57 .IO_TEXT / .END_IO_TEXT<br />
59 .LANGU<strong>AG</strong>ES<br />
77 .STATIONS / STATION / .END_STATIONS<br />
80 .STATISTIC / .END_STATISTIC<br />
84 .STRINGS / .END_STRINGS<br />
89 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 202/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SET_PSL<br />
SET_PSL<br />
Aktiviert eine PSL-Seite.<br />
Syntax:<br />
SET_PSL <br />
Felder:<br />
Ein RV, LV oder KV Register oder eine direkte Angabe der PSL<br />
Seite.<br />
Die direkte Angabe hat das Format:<br />
PS.<br />
mit<br />
Die Zeile der PSL-Seite, die aktiviert wird.<br />
Die Spalte der PSL-Seite, die aktiviert wird.<br />
Es gilt =256*+.<br />
Bemerkungen:<br />
Der Wert in den Registern interessiert oft nicht, da er nur verwendet wird, um eine<br />
alte Seite, die mit GET_PSL „gesichert“ wurde, wiederherzustellen.<br />
Beispiel:<br />
Speichert die gegenwärtige PSL-Seite, um dann die Seite 3.4 aufzurufen (wozu auch<br />
immer). Am Ende wird die ursprüngliche PSL-Seite wiederhergestellt.<br />
GET_PSL LV001<br />
SET_PSL PS3.4<br />
; Hierhin käme zB. der Code zu einem Fertigungsschritt<br />
SET_PSL LV001 ; Stelle PSL-Seite wieder her<br />
Siehe auch:<br />
71 .PSL / .END_PSL<br />
122 GET_PSL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 203/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SETBIT<br />
SETBIT<br />
Setzt oder löscht ein Bit ein einem Register.<br />
Syntax:<br />
SETBIT , , <br />
Felder:<br />
Register, bei dem ein Bit gesetzt oder gelöscht wird. Vom Typ<br />
RV, RW, AV, AW, LV oder LW.<br />
Position des zu überprüfenden Bits.<br />
L, falls das Bit auf 0 gesetzt werden soll; H, falls das Bit auf 1<br />
gesetzt werden soll.<br />
Bemerkungen:<br />
Die Position muss kleiner sein als die Bitbreite: somit ist der gültige Bereich<br />
für ein 16-Bit Register 0 bis 15, und 0 bis 31 für ein 32-Bit Register.<br />
Die gleiche Funktionalität kann auch durch eine Bitmaske erreicht werden.<br />
Beispiel:<br />
Das Beispiel zeigt zunächst den SETBIT Befehl, danach wird die gleiche<br />
Funktionalität mit einer Bitmaske realisiert.<br />
SETBIT RW100, 8, H<br />
OR RW100, RW100, 256 ; 256 = 100000000 (b)<br />
; setzt also Bit 8 hoch<br />
SETBIT RW100, 1, L<br />
AND RW100, RW100, -3 ; -3 = 1..1 01 (b)<br />
; setzt also Bit 1 tief<br />
Siehe auch:<br />
96 AND<br />
176 OR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 204/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SETTIM<br />
SETTIM<br />
Setzt einen Timer.<br />
Syntax:<br />
SETTIM , <br />
Felder:<br />
Timer, der gesetzt wird. T0 ist der lokale Timer, die Timer T001<br />
bis T255 sind global.<br />
Ein direkter Zahlwert oder ein RV, LV oder KV Register. Der<br />
Wert wird in 10 Millisekunden-Einheiten angegeben.<br />
Bemerkungen:<br />
Die globalen Timer müssen alle 3-stellig notiert sein (also T001).<br />
Beispiel:<br />
Das Beispiel wartet eine Sekunde, bis es weiterfährt.<br />
SETTIM T0, 100<br />
$LOOP :<br />
JMPTIM T0, $CONTINUE<br />
JUMP $LOOP<br />
$CONTINUE:<br />
Siehe auch:<br />
155 JMPTIM<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 205/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SLCE<br />
SLCE<br />
Empfängt einen Wert aus einem Slave.<br />
Syntax:<br />
SLCE , , <br />
Felder:<br />
Slave, von dem empfangen wird. Ein direkter Zahlwert oder ein<br />
RV, AV, LV oder KV Register.<br />
Das Kommando, welches dem Slave vorgibt, was eingelesen<br />
wird. Die genaue Bedeutung ist abhängig vom verwendeten<br />
Slave.<br />
Register, in welches eingelesen wird; vom Typ RV, RW, AV, AW,<br />
LV, LW oder ZW.<br />
Bemerkungen:<br />
ist eine Zahl, deren Bedeutung vom verwendeten Slave abhängt. Um<br />
den Code lesbarer zu gestalten, kann die Zahl mit dem .SLCE_DEF Befehl einem<br />
beschreibenden Bezeichner zugeordnet werden, welcher dann als <br />
verwendet werden kann.<br />
Der Befehl darf nicht für den PAC verwendet werden; dafür dient der PAC Befehl.<br />
Slaves sind externe Geräte wie Nadelpräger, Drucker oder Scanner.<br />
Die Befehle SLCE und SLCS sind sehr Hardware-nah. Oft existieren Befehle, welche<br />
einen spezifischen Teil besser, komfortabler und benutzerfreundlicher realisieren.<br />
Beispiele:<br />
SLCE 1, 5, LW101 ; Lese von Slave 1<br />
; mit Kommando 5 nach LW101<br />
Das zweite Beispiel ist mit dem ersten identisch, wenn im .SLCE_DEF Block dem<br />
Bezeichner Wert5 der Wert 5 zugeordnet wurde.<br />
SLCE 1, Wert5, LW101<br />
Siehe auch:<br />
77 .SLCE_DEF / .END_SLCE_DEF<br />
179 PAC<br />
207 SLCS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 206/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SLCS<br />
SLCS<br />
Gibt einen Wert an einen Slave aus.<br />
Syntax:<br />
SLCS , , <br />
Felder:<br />
Slave, an den ausgegeben wird. Ein direkter Zahlwert oder ein<br />
RV, AV, LV oder KV Register.<br />
Das Kommando, welches dem Slave vorgibt, wie zu<br />
verstehen ist. Die genaue Bedeutung ist abhängig vom<br />
verwendeten Slave.<br />
Register, dessen Wert gesendet wird; vom Typ RV, RW, AV, AW,<br />
LV, LW KV, KW, FW oder ZW.<br />
Bemerkungen:<br />
ist eine Zahl, deren Bedeutung vom verwendeten Slave abhängt. Um<br />
den Code lesbarer zu gestalten, kann die Zahl mit dem .SLCS_DEF Befehl einem<br />
beschreibenden Bezeichner zugeordnet werden, welcher dann als <br />
verwendet werden kann.<br />
Der Befehl ist beim PAC nicht erlaubt, da dort der Befehl PAC verwendet wird.<br />
Slaves sind externe Geräte wie ein Drucker oder ein Scanner.<br />
Die Befehle SLCE und SLCS sind sehr Hardware-nah. Oft existieren Befehle, welche<br />
einen spezifischen Teil besser, komfortabler und benutzerfreundlicher realisieren.<br />
Beispiele:<br />
SLCS 2, 1, RW110 ; Schreibe RW110 an Slave 2<br />
; mit Befehl 1<br />
Das zweite Beispiel ist mit dem ersten identisch, wenn im .SLCE_DEF Block dem<br />
Bezeichner FahrePosition der Wert 1 zugeordnet wurde.<br />
SLCS 2, FahrePosition, RW110<br />
Siehe auch:<br />
78 .SLCS_DEF / .END_SLCS_DEF<br />
179 PAC<br />
206 SLCE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 207/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SLV_RCV_STR<br />
SLV_RCV_STR<br />
Empfängt einen String von einen Slave.<br />
Syntax:<br />
SLV_RCV_STR , , <br />
Felder:<br />
Adresse des Slaves als Zahl zwischen 1 und 30, oder ein LV,<br />
RV oder KV Register.<br />
Formatierung für den String als Zahl zwischen 1 und 255. Die<br />
Bedeutung der Formatierung hängt von ab.<br />
Variabler SR String, in den der empfangene Text geschrieben<br />
wird.<br />
Bemerkungen:<br />
Der Befehl wartet, bis ein neuer Text vom Slave empfangen wurde und schreibt<br />
diesen dann in das angegebene .<br />
Die Bedeutung von ist der Dokumentation zum jeweiligen Slave zu<br />
entnehmen.<br />
Beim Standard-Slave kann folgende Werte die nachfolgende Bedeutung:<br />
1 wird direkt aus dem Puffer gelesen.<br />
2 wird von den Zeichen und eingeschlossen<br />
als . Der Empfang endet<br />
erst beim Empfang von .<br />
3 wird von den Zeichen und eingeschlossen<br />
zu . Der Empfang endet erst<br />
beim Empfang von .<br />
Die einschliessenden Zeichen werden weggeschnitten und der Empfang erst<br />
beendet, wenn das abschliessende Zeichen empfangen wurde. Beim Format 1<br />
werden nur jeweils neue Pufferdaten eingelesen.<br />
Beispiele:<br />
SLV_RCV_STR 1, 1, SR201 ; Ergebnis Slave-abhängig<br />
Das zweite Beispiel hat das gleiche Ergebnis wie das erste, verwendet aber indirekte<br />
Adressierung.<br />
MOV LV001, 201<br />
SLV_RCV_STR 1, 1, SR(LV001)<br />
Siehe auch:<br />
166 MOV<br />
209 SLV_SND_STR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 208/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SLV_SND_STR<br />
SLV_SND_STR<br />
Sendet einem Slave einen String.<br />
Syntax:<br />
SLV_SND_STR , , <br />
Felder:<br />
Adresse des Slaves als Zahl zwischen 1 und 30, oder ein LV,<br />
RV oder KV Register.<br />
Formatierung für den String als Zahl zwischen 1 und 255. Die<br />
Bedeutung der Formatierung hängt von ab.<br />
Ein SR oder ST String oder ein durch Anführungszeichen<br />
begrenzter Text.<br />
Bemerkungen:<br />
Wird ein ST Register angegeben, so wird der Text der gegenwärtig ausgewählten<br />
Landessprache verwendet, wie er mit .STRINGS definiert wurde.<br />
Die Bedeutung von ist der Dokumentation zum jeweiligen Slave zu<br />
entnehmen.<br />
Beim Standard-Slave kann folgende Werte die nachfolgende Bedeutung:<br />
1 wird unverändert gesendet.<br />
2 wird von den Zeichen und eingeschlossen<br />
zu .<br />
3 wird von den Zeichen und eingeschlossen<br />
zu .<br />
Die einschliessenden Zeichen werden vor dem Senden hinzugefügt.<br />
Beispiel:<br />
SLV_SND_STR 1, 1, “Hallo Welt”<br />
Siehe auch:<br />
86 .STRINGS / .END_STRINGS<br />
208 SLV_RCV_STR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 209/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SMOV<br />
SMOV<br />
Weist einem variablen String einen Text je Sprache zu.<br />
Syntax:<br />
SMOV , <br />
Felder:<br />
Ziel-Register vom Typ SR.<br />
Ein ST oder SR Register, ein mit Anführungszeichen begrenzter<br />
Text, oder ein Eingang, Ausgang, Merker oder Fehlermerker,<br />
dessen .IO_TEXT Text übernommen wird.<br />
Bemerkungen:<br />
Das exakte Verhalten des Befehls hängt von ab. Ist ein SR<br />
oder ST Register oder ein .IO_TEXT Text, dann werden für die Texte in<br />
allen Landessprachen passend übernommen; beim Umschalten der Landessprache<br />
wird automatisch umschalten. Wird hingegen ein mit Anführungszeichen<br />
begrenzter Text angegeben, so wird dieser Text für alle Sprachen verwendet.<br />
Beispiele:<br />
Das erste Beispiel weist den .IO_TEXT Text des Ausgangs A100 dem SR100 zu.<br />
SMOV SR100, A100 ; Richtige Übersetzungen in<br />
; allen Landessprachen<br />
Das zweite Beispiel weist den angegebenen Text zu.<br />
SMOV SR101, “Hallo” ; Gleicher Text für alle<br />
; Landessprachen<br />
Siehe auch:<br />
57 .IO_TEXT / .END_IO_TEXT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 210/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STAT_CLR<br />
STAT_CLR<br />
Löscht die Einträge in einem Datenpuffer.<br />
Syntax:<br />
STAT_CLR <br />
Felder:<br />
Zu löschende Statistik-Gruppe. Ein RV, RW, AV, AW, LV, LW, KV<br />
oder KW Register oder eine direkte Zahl, jeweils zwischen 1 und<br />
20. Der Wert 0 löscht alle Statistik-Gruppen.<br />
Bemerkungen:<br />
Der Befehl löscht alle Einträge der Statistik-Gruppe, sofern sie nicht bereits<br />
übertragen wurden. Er wird beispielsweise für Teile verwendet, welche noch nicht<br />
fertig montiert sind und aus der Maschine entfernt werden müssen.<br />
Beispiel:<br />
STAT_CLR 8 ; Lösche die Einträge der<br />
; Statistik-Gruppe 8<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 211/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STAT_PUFFER<br />
STAT_PUFFER<br />
Liefert die Anzahl der verwendeten und freien Statistik-Puffer.<br />
Syntax:<br />
STAT_PUFFER , <br />
Felder:<br />
Register, in das die Anzahl der verwendeten Statistik-Puffer<br />
geschrieben wird, vom Typ RV, RW, LV oder LW.<br />
Register für die Anzahl der freien Statistik-Puffer, vom Typ RV,<br />
RW, LV oder LW.<br />
Bemerkungen:<br />
Da es 200 Statistik-Puffer gibt, gilt +=200.<br />
Beispiel:<br />
STAT_PUFFER LV001, LV002 ; Verwendet, Frei<br />
Siehe auch:<br />
213 STAT_QUEUE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 212/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STAT_QUEUE<br />
STAT_QUEUE<br />
Liefert die Anzahl der verwendeten und freien Datensätze.<br />
Syntax:<br />
STAT_QUEUE , <br />
Felder:<br />
Register, in das die Anzahl der verwendeten Datensätze<br />
geschrieben wird, vom Typ RV, RW, LV oder LW.<br />
Register für die Anzahl der freien Datensätze, vom Typ RV, RW,<br />
LV oder LW.<br />
Bemerkungen:<br />
Datensätze sind ein Zwischenspeicher zwischen den Daten-Puffern und der<br />
eigentlichen Statistik-Software (STATREAD oder Zpoint). Sie speichern die vom<br />
Programm gesendeten Statistik-Daten solange, bis sie von der Statistik-Software,<br />
beziehungsweise dem entsprechenden Gateway ausgelesen werden.<br />
Da es 24’000 Datensätze gibt, gilt +=24000.<br />
Beispiel:<br />
STAT_QUEUE LV001, LV002 ; Verwendet, Frei<br />
Siehe auch:<br />
212 STAT_PUFFER<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 213/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STAT_TAKT<br />
STAT_TAKT<br />
Informiert die Statistik-Einheit, dass die angegebene Statistik-Gruppe weitergetaktet<br />
wird.<br />
Syntax:<br />
STAT_TAKT <br />
Felder:<br />
Statistik-Gruppe der zu taktenden Daten. Ein RV, RW, AV, AW,<br />
LV, LW, KV oder KW Register oder eine direkte Zahl, jeweils<br />
zwischen 1 und 20.<br />
Bemerkungen:<br />
Soll die Statistik-Gruppe nicht augenblicklich übertragen werden (MOV_PUFFER bietet<br />
die Möglichkeit dazu), so ist auf die saubere Synchronisation der verschiedenen<br />
beteiligten Stationen und Tasks zu achten.<br />
Beispiel:<br />
Taktet die zweite Statistik-Gruppe (und überträgt sie, falls der Zähler auf Null<br />
dekrementiert wird).<br />
STAT_TAKT 2<br />
Siehe auch:<br />
169 MOV_PUFFER<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 214/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STCKZAHL<br />
STCKZAHL<br />
Liest Ist- und Sollzahlen einer Statistik-Gruppe aus Statread ein.<br />
Syntax:<br />
STCKZAHL , , <br />
Felder:<br />
Statistik-Gruppe der zu taktenden Daten. Ein RV, RW, AV, AW,<br />
LV, LW, KV oder KW Register oder eine direkte Zahl, jeweils<br />
zwischen 1 und 20.<br />
Ein RW, AW oder LW Register, in dem die Ist-Zahl abgelegt wird.<br />
Ein RW, AW oder LW Register, in dem die Soll-Zahl abgelegt wird.<br />
Bemerkungen:<br />
Zusätzlich setzt dieser Befehl den Merker M004 hoch, wenn eine neue Ordergruppe<br />
bereit ist. Die Ordergruppe ist eine auftragsspezifische Gruppeneigenschaft, die die<br />
Statistik-Gruppe mit einem Auftrag verknüpft. Durch das Hochsetzen des Merkers<br />
wird somit ein Auftragswechsel angezeigt.<br />
Dieser Befehl kann bei Zpoint nicht verwendet werden.<br />
Beispiel:<br />
Liest die aktuelle Stückzahl und die Sollstückzahl der Statistik-Gruppe 8 ein.<br />
STCKZAHL 8, RW100, RW101 ; Ist-Zahl -> RW100<br />
; Soll-Zahl -> RW101<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 215/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STDEF<br />
STDEF<br />
Definiert die Störungs-Bedingung.<br />
Syntax:<br />
STDEF [, ]<br />
Felder:<br />
Ein Eingang, Ausgang, Merker oder Fehlermerker, der das<br />
Störungsprogramm startet, wenn er das angegebene Niveau (L<br />
oder H) aufweist. Es können bis zu 48 Bedingungen angegeben<br />
werden.<br />
Bemerkungen:<br />
Das Störungsprogramm, beginnend beim STPGM Label, wird ausgeführt, wenn eine<br />
der Bedingungen erfüllt ist; es ist also eine logische ODER-Verknüpfung.<br />
Im Gegensatz zum Notstop, der immer ausgelöst wird, wird die Störungsbedingung<br />
nur überwacht und allenfalls ausgelöst, wenn die Steuerung im Automaten- oder<br />
Stationenbetrieb ist.<br />
Sind Merker oder Fehlermerker deklariert, so muss eine NSDEF- und STDEF-<br />
Bedingung angegeben werden.<br />
Beispiel:<br />
Im Beispiel tritt eine Störung auf, wenn A101 oder A102 hoch sind, oder wenn der<br />
Merker M025 tief ist.<br />
STDEF A101 H, A102 H, M205 L<br />
Siehe auch:<br />
172 NSDEF<br />
263 STPGM<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 216/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_ADD<br />
STR_ADD<br />
Fügt einen String einem anderen String hinzu.<br />
Syntax :<br />
STR_ADD , <br />
Felder:<br />
Variabler SR String, an den angefügt wird.<br />
Ein ST oder SR Register, oder ein mit Anführungszeichen<br />
begrenzter Text, dessen Inhalt an hinzugefügt wird.<br />
Beispiel:<br />
SMOV SR200, “” ; Leere SR200<br />
STR_ADD SR200, “Hallo ” ; SR200 enthält nun “Hallo ”<br />
MOV LV001, 200<br />
STR_ADD SR(LV001), “Welt” ; SR200 = “Hallo Welt”<br />
Siehe auch:<br />
84 .STRING_REG / .END_STRING_REG<br />
86 .STRINGS / .END_STRINGS<br />
210 SMOV<br />
218 STR_ADD_ASCII<br />
220 STR_ADD_NR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 217/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_ADD_ASCII<br />
STR_ADD_ASCII<br />
Fügt ein als ASCII-Code angegebenes Zeichen einem String hinzu.<br />
Syntax:<br />
STR_ADD_ASCII , <br />
Felder:<br />
Variabler SR String, an den angefügt wird.<br />
Ein LV, LW, RV, RW, KV, KW, AV oder AW Register, dessen<br />
absoluter Betrag im Bereich 0 bis 255 das anzufügende Zeichen<br />
repräsentiert.<br />
Bemerkungen:<br />
Die verwendete Zeichentabelle (also die Interpretation der einzelnen Zeichen) ist<br />
grundsätzlich abhängig vom Empfänger (Slave, Drucker oder ähnliches). Für das<br />
Display gelten folgende Zeichentabellen:<br />
(Screen-Shots aus <strong>ECCO</strong>:<br />
Verwendete Codierung ist<br />
Terminal-850)<br />
Beispiel:<br />
SMOV SR200, “Hallo ” ; SR200 enthält nun “Hallo ”<br />
STR_ADD_ASCII SR200, 87 ; ASCII-Zeichen W<br />
STR_ADD_ASCII SR200, 101 ; ASCII-Zeichen e<br />
STR_ADD_ASCII SR200, 108 ; ASCII-Zeichen l<br />
STR_ADD_ASCII SR200, 116 ; ASCII-Zeichen t<br />
WRITE 1, 10, 1, SR200 ; Ausgabe: “Hallo Welt”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 218/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_ADD_ASCII<br />
Siehe auch:<br />
84 .STRING_REG / .END_STRING_REG<br />
86 .STRINGS / .END_STRINGS<br />
210 SMOV<br />
217 STR_ADD<br />
220 STR_ADD_NR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 219/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_ADD_NR<br />
STR_ADD_NR<br />
Fügt eine Zahl einem String hinzu.<br />
Syntax:<br />
STR_ADD_NR , , <br />
Felder:<br />
Variabler SR String, an den die angefügt wird.<br />
Anzahl der auszugebenden Stellen als Zahl zwischen 1 und 12.<br />
Weist mehr Stellen als auf, so wird links<br />
abgeschnitten; weist weniger Stellen auf, so werden<br />
die führenden freien Stellen mit Nullen aufgefüllt.<br />
Ein LV, LW, RV, RW, KV, KW, AV oder AW Register, dessen<br />
absoluter Betrag angefügt wird.<br />
Beispiel:<br />
SMOV SR200, “” ; Leere SR200<br />
MOV LV001, 1<br />
STR_ADD_NR SR200, 2, LV001 ; SR200 = “01”<br />
MOV LV001, 45678<br />
STR_ADD_NR SR200, 3, LV001 ; SR200 = “01678”<br />
Siehe auch:<br />
84 .STRING_REG / .END_STRING_REG<br />
86 .STRINGS / .END_STRINGS<br />
210 SMOV<br />
217 STR_ADD<br />
218 STR_ADD_ASCII<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 220/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_TO_ASCII<br />
STR_TO_ASCII<br />
Liefert den ASCII-Wert eines Zeichens.<br />
Syntax:<br />
STR_TO_ASCII , , <br />
Felder:<br />
Register, in das der ASCII-Wert des Zeichens geschrieben wird.<br />
Ein Register vom Typ RV, RW, AV, AW, LV oder LW.<br />
Zeichenkette, deren -tes Zeichen konvertiert wird.<br />
Ein variabler SR oder konstanter ST String.<br />
Position des Zeichens innerhalb von . Kann als<br />
direkte Zahl oder als RV, RW, AV, AW, LV oder LW Register<br />
angegeben werden.<br />
Bemerkungen:<br />
Der Wert in ist im Bereich 0 bis 255; oder -1, falls nicht auf ein<br />
Zeichen in zeigt. Bei dem Befehl STR_ADD_ASCII wird die verwendete<br />
Zeichensatz-Tabelle angezeigt.<br />
Beispiel:<br />
SMOV SR100, “abcd”<br />
STR_TO_ASCII LV001, SR100, 1 ; LV001 ist nun 97<br />
STR_TO_ASCII LV001, SR100, 5 ; LV001 ist nun -1<br />
Siehe auch:<br />
218 STR_ADD_ASCII<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 221/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_TREAT<br />
STR_TREAT<br />
Behandelt einen String.<br />
Syntax:<br />
STR_TREAT , , <br />
Felder:<br />
Ein SR Register, in das das Resultat der Behandlung<br />
geschrieben wird.<br />
SR Zeichenkette, die behandelt wird.<br />
Art der Behandlung; ein RV, RW, AV, AW, LV oder LW Register.<br />
Kann auch zur Rückgabe verwendet werden.<br />
Mögliche Werte von sind:<br />
1 Bildet in die HEX4_1 Prüfsumme aus .<br />
2 Bildet in die HEX4_2 Prüfsumme aus . Dient<br />
besonders dazu, bei fortlaufenden 11-stelligen Zahlen in<br />
zu garantieren, dass bis zu 40’000 keine zwei<br />
Zahlen die gleiche Prüfsumme haben.<br />
3 Bildet in die DEC4 Prüfsumme aus .<br />
10 Schreibt die Zahl in hexadezimal in .<br />
100 Vergleicht mit und schreibt 0 in ,<br />
wenn die beiden Strings gleich sind, sonst 1.<br />
Beispiel:<br />
SMOV SR100, “12345”<br />
SMOV SR101, SR100<br />
MOV LV001, 100<br />
STR_TREAT SR100, SR101, LV100<br />
; LV100 ist nun 0, da gleich<br />
Siehe auch:<br />
210 SMOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 222/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STR_VAL<br />
STR_VAL<br />
Wandelt einen String in eine Zahl um.<br />
Syntax:<br />
STR_VAL , <br />
Felder:<br />
Register mit dem Zahlwert aus , ein RV, RW, AV, AW, LV<br />
oder LW Register.<br />
SR Zeichenkette, die umgewandelt wird.<br />
Bemerkungen:<br />
Liefert nur die Zahl möglichst links in , wobei jedoch führende Nullen nicht<br />
beachtet werden. Ist die Zahl in wertmässig zu gross, so wird Null zurück<br />
gegeben; dies ist ab elf Dezimalstellen immer der Fall.<br />
Beispiel:<br />
SMOV SR100, “ 1 2”<br />
STR_VAL RW100, SR100 ; RW100 wird 1<br />
Siehe auch:<br />
210 SMOV<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 223/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SV_COM<br />
SV_COM<br />
Sendet einen Befehl ohne Argumente an einen Servo-Controller auf einem Regel-<br />
Slave oder PAC.<br />
Syntax :<br />
SV_COM , <br />
oder<br />
SV_COM SV., <br />
Felder:<br />
Angabe des Servo-Controllers, als RV, AV, LV oder KV Register.<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Servo-Controller auf dem , an den <br />
gesendet wird.<br />
Bezeichner für den Befehl. Gültige Bezeichner sind in der<br />
Dokumentation zum jeweiligen Regel-Slave oder PAC<br />
aufgeführt; zusätzlich sind sie im Anhang 5. 7 „Befehle an<br />
Servo-Slaves und PAC“ zusammengestellt.<br />
Es ist =256*+.<br />
Beispiel:<br />
Initialisiert den Servo-Regler.<br />
SV_COM SV1.2, RESET<br />
Siehe auch:<br />
225 SV_CONST<br />
226 SV_FIL<br />
227 SV_READ<br />
228 SV_TRJ<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 224/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SV_CONST<br />
SV_CONST<br />
Sendet eine Anweisung mit einem Argument an einen Servo-Controller auf einem<br />
Regel-Slave oder PAC.<br />
Syntax:<br />
SV_CONST , , <br />
oder<br />
SV_CONST SV., , <br />
Felder:<br />
Angabe des Servo-Controllers, als RV, AV, LV oder KV Register.<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Servo-Controller auf dem , an den <br />
gesendet wird.<br />
Bezeichner für den Befehl. Gültige Bezeichner sind in der<br />
Dokumentation zum jeweiligen Regel-Slave oder PAC<br />
aufgeführt; zusätzlich sind sie im Anhang 5. 7 „Befehle an<br />
Servo-Slaves und PAC“ zusammengestellt.<br />
Ein Register vom Typ RV, RW, AV, AW, LV, LW, FW, KV oder KW,<br />
oder eine direkte Zahl. Der zulässige Wertebereich ist abhängig<br />
von .<br />
Es ist =256*+.<br />
Beispiel:<br />
Setzt den maximalen Schleppfehler für den ersten Servo-Controller im PAC 16.<br />
SV_CONST SV16.1, PERR, FW016<br />
Siehe auch:<br />
217 SV_COM<br />
226 SV_FIL<br />
227 SV_READ<br />
228 SV_TRJ<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 225/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SV_FIL<br />
SV_FIL<br />
Setzt die Filter-Parameter eines Servo-Controllers auf einem Regel-Slave oder PAC.<br />
Syntax:<br />
SV_FIL , , <br />
oder<br />
SV_FIL SV., , <br />
Felder:<br />
Angabe des Servo-Controllers, als RV, AV, LV oder KV Register.<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Servo-Controller auf dem , bei dem gesetzt<br />
wird.<br />
Parameter, der von gesetzt wird. Mögliche Bezeichner<br />
werden weiter unten angegeben.<br />
Ein Register vom Typ RV, RW, AV, AW, LV, LW, KV oder KW, oder<br />
eine direkte Zahl. Zulässige Werte sind im Bereich 0 bis 32767.<br />
Es ist =256*+.<br />
Mögliche Bezeichner für sind:<br />
P Proportionalitäts-Konstante<br />
I Integrations-Konstante<br />
D Differential-Konstante<br />
IL Integrations-Limite<br />
IL_MAX Integrations-Limite bei maximaler Geschwindigkeit. Dieser<br />
Bezeichner ist nur beim PAC gültig.<br />
Ungültige Bezeichner werden vom Compiler mit einem Fehler abgefangen.<br />
Bemerkungen:<br />
Alle Filterparameter können an den Regel-Slave oder PAC gesendet und mit dem<br />
Befehl SV_COM Kommando UDF aktiviert werden.<br />
Beispiel:<br />
Setzt die Proportionalkonstante und aktiviert dann den neuen Parameter im Regler.<br />
SV_FIL SV1.1, P, KV100 ; Setze P-Anteil<br />
SV_COM SV1.1, UDF ; Aktiviere neue Parameter<br />
Siehe auch:<br />
217 SV_COM<br />
225 SV_CONST<br />
227 SV_READ<br />
228 SV_TRJ<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 226/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SV_READ<br />
SV_READ<br />
Liest einen Wert von einem Servo-Controller eines Regel-Slaves oder PAC aus.<br />
Syntax:<br />
SV_READ , , <br />
oder<br />
SV_READ SV., , <br />
Felder:<br />
Angabe des Servo-Controllers, als RV, AV, LV oder KV Register.<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Servo-Controller auf dem , an den <br />
gesendet wird.<br />
Bezeichner für das auf dem Servo-Controller auszulesende<br />
Register. Gültige Bezeichner sind in der Dokumentation zum<br />
jeweiligen Regel-Slave oder PAC aufgeführt; zusätzlich sind sie<br />
im Anhang 5. 7 „Befehle an Servo-Slaves und PAC“<br />
zusammengestellt.<br />
<strong>ECCO</strong> Register, in welches der Wert eingelesen wird. Ein RW,<br />
AW oder LW Register.<br />
Es ist =256*+.<br />
Bemerkungen:<br />
Ist kein gültiger Bezeichner, so erzeugt der Compiler einen Fehler.<br />
Beispiel:<br />
Liest den Status aus.<br />
SV_READ SV1.2, STATUS, LW001<br />
Siehe auch:<br />
217 SV_COM<br />
225 SV_CONST<br />
226 SV_FIL<br />
228 SV_TRJ<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 227/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SV_TRJ<br />
SV_TRJ<br />
Sendet einen Bewegungsparameter an einen Servo-Controller auf einem Regel-<br />
Slave oder PAC.<br />
Syntax:<br />
SV_TRJ , , <br />
oder<br />
SV_TRJ SV., , <br />
Felder:<br />
Angabe des Servo-Controllers, als RV, AV, LV oder KV Register.<br />
Slave-Nummer. Zahl zwischen 1 und 30 für Regel-Slaves und<br />
PAC.<br />
Servo-Controller auf dem , an den gesendet<br />
wird.<br />
Bezeichner für den Bewegungsparameter. Gültige Bezeichner<br />
sind in der Dokumentation zum jeweiligen Regel-Slave oder<br />
PAC aufgeführt; zusätzlich sind sie im Anhang 5. 7 „Befehle an<br />
Servo-Slaves und PAC“ zusammengestellt.<br />
Ein Register vom Typ RV, RW, AV, AW, LV, LW, KV oder KW, oder<br />
eine direkte Zahl. Der zulässige Wertebereich ist abhängig von<br />
.<br />
Es ist =256*+.<br />
Bemerkungen:<br />
Der Befehl hat seinen Namen aus der Tatsache, dass jeder Bewegungsparameter<br />
einen Teil der vorgegebenen Trajektorie definiert.<br />
Ist kein gültiger Wert, so meldet dies der Compiler mit einem Fehler.<br />
Beispiel:<br />
Setzt die absolute Position zurück und startet die Bewegung des ersten Servo-<br />
Controllers im PAC 16.<br />
SV_TRJ SV16.1, X, 0<br />
SV_COM SV16.1, STT ; Start Motion Befehl<br />
Siehe auch:<br />
217 SV_COM<br />
225 SV_CONST<br />
226 SV_FIL<br />
227 SV_READ<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 228/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> SWITCH / CASE / DEFAULT / END_SWITCH<br />
SWITCH / CASE / DEFAULT / END_SWITCH<br />
Ermöglicht die Auswahl eines Programmblocks aus mehreren möglichen, abhängig<br />
von einem Argument.<br />
Syntax:<br />
SWITCH <br />
CASE [, ]<br />
<br />
[CASE [, ]<br />
]<br />
[DEFAULT<br />
]<br />
END_SWITCH<br />
Felder:<br />
Register, dessen Wert die Auswahl vornimmt; vom Typ SW, RV,<br />
RW, AV, AW, LV, LW, KV oder KW.<br />
Ein direkter Wert, oder ein KV oder KW Register.<br />
Programmcode, der ausgeführt wird.<br />
Bemerkungen:<br />
Der Wert in wird im SWITCH getestet und wenn er mit einem CASE-<br />
Wert übereinstimmt, wird der betreffende CASE-Programmblock <br />
gestartet und an dessen Ende auf die END_SWITCH Zeile gesprungen. Wenn der<br />
Wert zu keinem CASE-Wert passt, wird der DEFAULT-Programmblock ausgeführt.<br />
Fehlt das DEFAULT-Label, wird direkt auf die END_SWITCH Zeile gesprungen.<br />
Haben mehrere Konstanten den gleichen Wert, so meldet der Compiler<br />
dies mit einem Fehler bei der Übersetzung.<br />
Es können über 25 SWITCH Blöcke verschachtelt werden.<br />
Beispiel:<br />
SWITCH RV110<br />
CASE 0, 1, 2<br />
WRITE 1, 20, 1, “Auswahl 1”<br />
CASE KV110, KV111, ; CASE-Statement über …<br />
3, 4 ; ... zwei Zeilen<br />
WRITE 1, 20, 1, “Auswahl 2”<br />
DEFAULT<br />
WRITE 1, 20, 1, “Default-Fall”<br />
END_SWITCH<br />
Siehe auch:<br />
165 L_SWITCH / CASE / DEFAULT / END_SWITCH<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 229/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TASK_KILL<br />
TASK_KILL<br />
Beendet asynchron einen Programm- oder Backgroundtask.<br />
Syntax:<br />
TASK_KILL <br />
Felder:<br />
Ein RV, RW, AV oder AW Register, das die absolute Nummer des<br />
zu beendenden Tasks beinhaltet.<br />
Die Zuordnung der absoluten Tasknummer ist wie folgt:<br />
1 - 128 Programmtask.<br />
161 Aktiver PSL-Task.<br />
162 Aktiver Displaytask.<br />
163 Aktiver Fehlertask.<br />
164 - 167 Funktionstask.<br />
170 Hot-Task.<br />
171 - 255 Backgroundtask.<br />
Bemerkungen:<br />
Es können mit diesem Befehl nur ein Programm- oder Backgroundtask beendet werden.<br />
Ist der zu beendende Task zur Zeit blockiert, da er einen Kind-Task aufgerufen<br />
hat, so wird auch augenblicklich der Kind-Task beendet. Wurde der angegebene<br />
Task erfolgreich geschlossen, so schreibt die <strong>ECCO</strong> -1 in . Wird<br />
versucht, einen Task zu schliessen, der nicht existiert oder kein Background- oder<br />
Programmtask ist, so wird nicht verändert, dafür steht in SW014 die<br />
Zeilennummer dieser Instruktion; in jedem Fall fährt der Befehl danach auf der<br />
nächsten Zeile weiter.<br />
Das Systemregister SW014 wird üblicherweise vor und nach dem Befehl ausgelesen,<br />
um zu sehen, ob der Befehl erfolgreich ausgeführt wurde. Typischerweise wird<br />
vom Befehl TASK_OPEN übernommen.<br />
Beispiel:<br />
Das Beispiel (beispielsweise in einem Programmtask) öffnet einen Task namens<br />
DemoTask und killt ihn sofort.<br />
TASK_OPEN RW100, DemoTask<br />
TASK_KILL RW100<br />
Siehe auch:<br />
231 TASK_OPEN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 230/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TASK_OPEN<br />
TASK_OPEN<br />
Öffnet einen Task und liefert dessen absolute Nummer zurück.<br />
Syntax:<br />
TASK_OPEN , <br />
Felder:<br />
Ein RV, RW, AV oder AW Register, in das die absolute Nummer<br />
des aufgerufenen Tasks geschrieben wird.<br />
Label der aufzurufenden Tasks. Jedes globale Label, welches<br />
mit OPEN aufrufbar ist, kann aus einem Background- oder<br />
Programmtask mittels TASK_OPEN gestartet werden.<br />
beinhaltet die absolute Nummer des aufgerufenen Tasks, wie sie<br />
auch vom Debugger angezeigt wird. Die Zuordnung ist dabei wie folgt:<br />
1 - 128 Programmtask.<br />
161 Aktiver PSL-Task.<br />
162 Aktiver Displaytask.<br />
163 Aktiver Fehlertask.<br />
164 - 167 Funktionstask.<br />
170 Hot-Task.<br />
171 - 255 Backgroundtask.<br />
Bemerkungen:<br />
Der neue Task läuft unabhängig von der Kette, aus welcher sie aufgerufen wurde.<br />
Funktionell verhält sich dieser Befehl identisch zu OPEN. Dies betrifft auch die Tasks,<br />
in denen der er verwendet werden darf, also in einem Background- oder Programmtask,<br />
wie auf Seite 26 beschrieben.<br />
Ein paralleler Task wird mittels CLOSE beendet.<br />
Die absolute Nummer in kann zu Anzeigezwecken verwendet<br />
werden, oder als Argument für den Befehl TASK_KILL, mit dem Tasks asynchron<br />
beendet werden können.<br />
Beispiel:<br />
TASK_OPEN AW002(7), DEMO_TASK<br />
Siehe auch:<br />
106 CLOSE<br />
175 OPEN<br />
230 TASK_KILL<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 231/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TASK_STEP<br />
TASK_STEP<br />
Ermöglicht es, den aktuellen Task mit reduzierter Geschwindigkeit zu betreiben.<br />
Syntax:<br />
TASK_STEP <br />
Felder:<br />
Der Zeitspanne, welche zwischen zwei Instruktionen jeweils<br />
gewartet wird, in 10ms Schritten.<br />
Bemerkungen:<br />
Oft ist es hilfreich, einen unwichtigen Task zu bremsen, um den wichtigeren Tasks<br />
die Systemressourcen freizuhalten, oder um bei älteren, portierten Programmen die<br />
Ausführungs-Geschwindigkeit zu reduzieren, damit ältere Hardware nicht überfordert<br />
wird.<br />
Nach diesem Befehl wird im aktuellen Task nur noch ein Befehl alle<br />
*10ms ausgeführt. Soll der aktuelle Task mit der normalen Geschwindigkeit<br />
arbeiten, ist Null zu setzen.<br />
Beispiele:<br />
TASK_STEP 10 ; Verzögerung 100ms; dh. Nur<br />
; ein Befehl alle 100ms.<br />
Um zur normalen Geschwindigkeit zurückzukehren:<br />
TASK_STEP 0<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 232/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TIMEDISP<br />
TIMEDISP<br />
Gibt die Zeit aus, welche in einem Register gespeichert wurde.<br />
Syntax :<br />
TIMEDISP , , , , <br />
Felder:<br />
Spalte, ab der der formatierte Text geschrieben wird. Gültige<br />
Werte liegen im Bereich 0 bis 60.<br />
Zeile; Unterkante der Ausgabe. Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Ein RW, AW oder LW Register, welches die auszugebende Zeit<br />
beinhaltet.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
hat folgendes Format:<br />
“[] ## []”<br />
In der Formatierung sind folgende Formatbezeichner möglich:<br />
hh Schreibt die Stunde im 24-Stunden-Format zweistellig wie in 08.<br />
mm Schreibt die Minute zweistellig.<br />
Ss Schreibt die Sekunde zweistellig.<br />
Pp Schreibt die Hundertstel-Sekunde zweistellig.<br />
Bemerkungen:<br />
Um die Zeit in ein Register einzulesen, wird der Befehl RD_TIME benötigt.<br />
Beispiel:<br />
Das Beispiel liest die Zeit ein und gibt sie dann aus.<br />
RD_TIME RW100, RW101 ; Lese Zeit und Datum<br />
TIMEDISP 1, 20, 1, RW100, “Zeit: #hh:mm#”<br />
Siehe auch:<br />
111 DATEDISP<br />
132 HP_DATEDISP<br />
140 HP_TIMEDISP<br />
186 RD_TIME<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 233/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TINP<br />
TINP<br />
Wartet mit Zeitüberwachung, bis alle Bedingungen erfüllt sind.<br />
Syntax:<br />
TINP , [,] [, ],<br />
[, ] [, ]<br />
Felder:<br />
Ausgang, Eingang, Merker oder Fehlermerker der eigenen<br />
Steuerung mit dem gewünschten Niveau (H oder L). Es können<br />
bis zu 8 Bedingungen angegeben werden.<br />
Dauer der Überwachung in 10 ms Einheiten. Ein direkter<br />
Zahlwert oder ein RV, LV oder KV Register.<br />
optional: Ein Merker oder Fehlermerker, der hochgesetzt wird,<br />
wenn die im Befehl abläuft.<br />
Ein RV Register, in welches falls nötig der Fehlercode<br />
geschrieben wird.<br />
optional: Basis für den Fehlercode. Ein RV Register.<br />
optional: Ausgang, Eingang, Merker oder Fehlermerker mit<br />
gewünschtem Niveau (H oder L). Ist angegeben<br />
und wahr, so startet die Zeitdauer neu, und die Überwachung<br />
beginnt erst wieder in dem Moment, in dem nicht<br />
mehr erfüllt ist.<br />
Läuft die ab, während noch nicht alle Bedingungen erfüllt sind, dann startet<br />
<strong>ECCO</strong> den entsprechenden Fehler-Handler: entweder wird dieser über den Handler-<br />
Merker hochgesetzt, oder, wenn fehlt, der ERROR_PROTOTYPE gestartet.<br />
Ist ein gewöhnlicher Merker, so muss ein anderer Task den Ablauf der<br />
feststellen und den Merker wieder tief setzen.<br />
Der zugewiesene Wert muss für das gesamte Programm ein<br />
eineindeutiger Wert sein.<br />
Ist angegeben, so muss der Wert mindesten 1 sein, und muss so klein<br />
sein, dass der Wert für kleiner als der in .ERROR_CODE_START<br />
angegebene Wert bleibt. Ist also .ERROR_CODE_START 10000 und sind vier<br />
Bedingungen angegeben, dann darf höchstens 9996 sein.<br />
Ohne Angabe von generiert <strong>ECCO</strong> bei jeder TINP <br />
automatisch einen neuen Fehlercode. Diese sind fortlaufend, wobei der niedrigste<br />
Wert durch die Compileranweisung .ERROR_CODE_START festgelegt wird.<br />
Bemerkungen:<br />
Dieser Befehl ist die überwachte Variante zum INP Befehl. In einem TRAP Block<br />
kann mit INP das gleiche Resultat erzielt werden. TINP wird in solchen Situationen<br />
jedoch bevorzugt, da die Syntax kompakter ist.<br />
Der Kontrollfluss für diesen Befehl verläuft nach folgendem Diagramm:<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 234/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TINP<br />
Nachdem die Fehlerbedingung behandelt wurde, führt die Laufzeit-Umgebung den<br />
Befehl nochmals aus. Damit wird gewährleistet, dass der nachfolgende Code nur<br />
ausgeführt wird, wenn erfüllt ist.<br />
Beispiele:<br />
Das erste Beispiel zeigt die Verwendung eines Fehlermerkers:<br />
TINP E100 H, 100, D100, RV1075<br />
; Aktiviere D100, wenn E100<br />
; nicht innerhalb 1s H ist.<br />
Das zweite Beispiel zeigt die Verwendung eines gewöhnlichen Merkers. Ein paralleler<br />
Task muss darauf reagieren und den Merker wieder tief setzen.<br />
TINP E100 H, 100, M100, RV1075<br />
Das dritte Beispiel zeigt die Verwendung mit dem ERROR_PROTOTYPE als Fehlerhandler<br />
und explizitem . Beachte, dass RV1075 den Wert 237<br />
zugewiesen wird, wenn nach Ablauf der Zeit die vierte Bedingung nicht erfüllt ist.<br />
TINP E0224 H, E0236 L, A0231 H, A0255 H, 100,<br />
RV1075, 234<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 235/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TINP<br />
Das letzte Beispiel zeigt die Verwendung eines blockierenden Merkers. Die Überwachungsdauer<br />
von 200 ms fängt erst an, wenn M0901 tiefgeht.<br />
TINP E0456 L, 20, RV1075, M0901 H<br />
Siehe auch:<br />
52 .ERROR_CODE_START<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
255 ERROR_PROTOTYPE<br />
152 INP<br />
276 TRAP / IF_TRAP / END_TRAP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 236/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_CLRKEY<br />
VI_CLRKEY<br />
Löscht den Tastenpuffer eines VI-Terminals.<br />
Syntax:<br />
VI_CLRKEY , <br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Label, zu dem verzweigt wird, wenn bei der Kommunikation mit<br />
dem Terminal ein Fehler auftritt.<br />
Beispiel:<br />
VI_CLRKEY 1, $VI_ERR ; Lösche Tastenpuffer von<br />
; VI-Terminal 1; bei Fehlern<br />
; gehe zu $VI_ERR<br />
Siehe auch:<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 237/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_DATE<br />
VI_DATE<br />
Schreibt das Datum aus einem Register auf ein VI-Terminal.<br />
Syntax:<br />
VI_DATE , , , ,<br />
<br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Die Zeile auf dem VI-Terminal. Gültige Werte werden weiter<br />
unten erläutert.<br />
Ein RW, AW oder LW Register, welches das auszugebende<br />
Datum beinhaltet.<br />
Label, zu dem verzweigt wird, wenn bei der Kommunikation mit<br />
dem Terminal ein Fehler auftritt.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Zeile hat folgende Bedeutung:<br />
1 Erste Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
2 Zweite Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
3 Ausgabe auf einem Drucker, der an der Druckerschnittstelle<br />
angeschlossen ist; Texte länger als 50 Zeichen werden<br />
abgeschnitten. Die Steuerzeichen \n, \f und \\ können<br />
verwendet werden, um eine neue Zeile, eine neue Seite oder<br />
einen Backslash zu drucken.<br />
Alle anderen Zeilenzahlen werden vom Compiler mit einem Fehler abgefangen.<br />
Für die Formatierung in sind folgende Formatbezeichner möglich:<br />
jjjj Schreibt das Jahr vierstellig.<br />
Jj Schreibt das Jahr zweistellig.<br />
Mm Schreibt den Monat zweistellig, also 01 für Januar bis 12 für<br />
Dezember.<br />
Tt Schreibt den Tag im Monat zweistellig.<br />
Bemerkungen:<br />
Der Befehl ist quasi das VI-Pendant zum DATEDISP-Befehl für das Display.<br />
Beispiel:<br />
RD_TIME LW001, LW002 ; Lese Zeit und Datum<br />
VI_DATE 1, 1, LW002, $VI_ERROR, “Datum: #tt.mm.jjjj#”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 238/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_DATE<br />
Siehe auch:<br />
111 DATEDISP<br />
186 RD_TIME<br />
237 VI_CLRKEY<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 239/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_JMPKEY<br />
VI_JMPKEY<br />
Wartet auf einen Tastendruck an einem VI-Terminal.<br />
Syntax:<br />
VI_JMPKEY , , , <br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Bit-Codierung der Tasten. Das Bit 0 steht für die Taste 1, Bit 1<br />
für Taste 2, Bit 2 für Taste 3 und Bit 3 für Taste 4.<br />
Verzweigt zum angegebenen Label, wenn eine in <br />
angegebenen Tasten gedrückt wurde. Sonst fällt der Befehl<br />
durch.<br />
Label, zu dem verzweigt wird, wenn bei der Kommunikation mit<br />
dem Terminal ein Fehler auftritt.<br />
Bemerkungen:<br />
Der Befehl wartet, bis eine Taste auf dem Terminal gedrückt wurde; wurde bereits<br />
vorgängig eine Taste gedrückt, verzweigt der Befehl augenblicklich. Entspricht die<br />
gedrückte Taste einer der mit codierten Tasten, verzweigt das Programm<br />
zum angegebenen , sonst fällt es durch, das heisst, es springt auf die<br />
nächste Zeile.<br />
Beispiel:<br />
Das Beispiel gibt auf dem Display 1 aus, wenn die Taste 1 gedrückt wurde, sonst 2.<br />
VI_CLRKEY 1, $VI_ERR ; Löscht bereits gedr. Tasten<br />
VI_JMPKEY 1, 1, $KEY1, $VI_ERR<br />
VI_WRITE 1, 1, $VI_ERR,“2” ; wenn nicht 1 gedrückt<br />
JUMP $END<br />
$KEY1:<br />
VI_WRITE 1, 1, $VI_ERR,“1” ; wenn Taste 1 gedrückt<br />
$END:<br />
Siehe auch:<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
241 VI_RDISP<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 240/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_RDISP<br />
VI_RDISP<br />
Formatiert und schreibt einen Wert auf das VI-Terminal.<br />
Syntax:<br />
VI_RDISP , , , ,<br />
<br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Die Zeile auf dem VI-Terminal. Gültige Werte werden weiter<br />
unten erläutert.<br />
Eine direkte Zahl oder ein RV, RW, AV, AW, LV, LW, KV, KW oder<br />
ZW Register.<br />
Label, zu dem verzweigt wird, wenn bei der Kommunikation mit<br />
dem Terminal ein Fehler auftritt.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Zeile hat folgende Bedeutung:<br />
1 Erste Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
2 Zweite Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
3 Ausgabe auf einem Drucker, der an der Druckerschnittstelle<br />
angeschlossen ist; Texte länger als 50 Zeichen werden<br />
abgeschnitten. Die Steuerzeichen \n, \f und \\ können<br />
verwendet werden, um eine neue Zeile, eine neue Seite oder<br />
einen Backslash zu drucken.<br />
Alle andere Zeilenzahlen werden vom Compiler mit einem Fehler abgefangen.<br />
Die Formatierung in kann angegeben werden als:<br />
“[Text] #..# [Text]”<br />
Dabei bedeuten:<br />
Anzahl der Stellen, die für die Ausgabe auf dem Display<br />
reserviert werden. Ein negativer Wert ermöglicht linksbündige<br />
Formatierung mit der betragsgemässen Anzahl Stellen.<br />
Anzahl der Nachkommastellen des auszugebenden Wertes.<br />
Anzahl der auszugebenden Nachkomma-Stellen<br />
optional: Zusätzlicher unformatierter Text.<br />
Bemerkungen:<br />
Durch die Zahlenformatierung ist es möglich, implizit mit Fixkomma-Zahlen zu<br />
arbeiten.<br />
Beachte, dass die überschüssigen Nachkommastellen abgeschnitten (und nicht<br />
gerundet) werden.<br />
Der Befehl ist quasi das VI-Pendant zum REGDISP-Befehl für das Display.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 241/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_RDISP<br />
Beispiel:<br />
MOV LV100, 120<br />
VI_RDISP 1, 1, LV100, $VI_ERR, “Wert: #4.2.2#”<br />
; Gibt “Wert: 1.20” aus<br />
Siehe auch:<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 242/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_READ<br />
VI_READ<br />
Liest den Tastenpuffer eines VI-Terminals ein.<br />
Syntax:<br />
VI_READ , , <br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Register, in welches der Tastenpuffer eingelesen wird; vom Typ<br />
RV, RW, AV, AW, LV, LW oder ZW. In steht der Bit-<br />
Code mit Bit 0 für die Taste 1, Bit 1 für die Taste 2, Bit 2 für die<br />
Taste 3 und Bit 3 für die Taste 4.<br />
Label, zu dem bei einem Fehler verzweigt wird.<br />
Bemerkungen:<br />
Im Gegensatz zum Befehl VI_JMPKEY wartet dieser Befehl nicht darauf, dass eine<br />
Taste gedrückt wurde. Er eignet sich somit für Fälle, in denen abhängig von der<br />
gedrückten Taste mehrere unterschiedliche Aktionen ausgeführt werden müssen.<br />
Beispiel:<br />
VI_CLRKEY 1, $VI_ERR<br />
DO<br />
VI_READ 1, LV001, $VI_ERR ; warte, bis Benutzer eine<br />
DO_WHILE LV001=0 ; Taste drückt<br />
SWITCH LV001<br />
CASE 1 ; Taste 1 gedrückt<br />
VI_WRITE 1, 1, $VI_ERR, “Taste 1 gedrückt”<br />
CASE 2 ; Taste 2 gedrückt<br />
VI_WRITE 1, 1, $VI_ERR, “Taste 2 gedrückt”<br />
CASE 4 ; Taste 3 gedrückt<br />
VI_WRITE 1, 1, $VI_ERR, “Taste 3 gedrückt”<br />
CASE 8 ; Taste 4 gedrückt<br />
VI_WRITE 1, 1, $VI_ERR, “Taste 4 gedrückt”<br />
END_SWITCH<br />
Siehe auch:<br />
118 DO / DO_WHILE / DO_WHILENOT<br />
229 SWITCH / CASE / DEFAULT /END_SWITCH<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
244 VI_TIME<br />
246 VI_WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 243/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_TIME<br />
VI_TIME<br />
Gibt auf einem VI-Terminal die Zeit aus, die in einem Register gespeichert wurde.<br />
Syntax:<br />
VI_TIME , , , ,<br />
<br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Die Zeile auf dem VI-Terminal. Gültige Werte werden weiter<br />
unten erläutert.<br />
Ein RW, AW oder LW Register, das die auszugebende Uhrzeit<br />
beinhaltet.<br />
Label, zu dem verzweigt wird, wenn bei der Kommunikation mit<br />
dem Terminal ein Fehler auftritt.<br />
Formatierter Text. Entweder mit Anführungszeichen begrenzter<br />
Text oder ein ST oder SR Register. Die zulässige Formatierung<br />
wird weiter unten angegeben.<br />
Die Zeile hat folgende Bedeutung:<br />
1 Erste Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
2 Zweite Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
3 Ausgabe auf einem Drucker, der an der Druckerschnittstelle<br />
angeschlossen ist; Texte länger als 50 Zeichen werden<br />
abgeschnitten. Die Steuerzeichen \n, \f und \\ können<br />
verwendet werden, um eine neue Zeile, eine neue Seite oder<br />
einen Backslash zu drucken.<br />
Alle anderen Zeilenzahlen werden vom Compiler mit einem Fehler abgefangen.<br />
Für die Formatierung in sind folgende Formatbezeichner möglich:<br />
hh Schreibt die Stunde im 24-Stunden-Format zweistellig wie in 08.<br />
mm Schreibt die Minute zweistellig.<br />
Ss Schreibt die Sekunde zweistellig.<br />
Pp Schreibt die Hundertstel-Sekunde zweistellig.<br />
Bemerkungen:<br />
Der Befehl ist quasi das VI-Pendant zum TIMEDISP-Befehl für das Display.<br />
Beispiel:<br />
RD_TIME LW001, LW002 ; Lese Zeit und Datum<br />
VI_TIME 1, 1, LW002, $VI_ERROR, “Zeit: #hh:mm#”<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 244/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_TIME<br />
Siehe auch:<br />
186 RD_TIME<br />
230 TIMEDISP<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
243 VI_READ<br />
246 VI_WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 245/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> VI_WRITE<br />
VI_WRITE<br />
Schreibt eine Zeichenkette auf das VI-Terminal.<br />
Syntax:<br />
VI_WRITE , , , <br />
Felder:<br />
Adresse des VI-Terminals. Zahl zwischen 1 und 15.<br />
Die Zeile auf dem VI-Terminal. Gültige Werte werden weiter<br />
unten erläutert.<br />
Label, zu dem verzweigt wird, wenn bei der Kommunikation mit<br />
dem Terminal ein Fehler auftritt.<br />
Auszugebender Text. Entweder ein mit Anführungszeichen<br />
begrenzter Text oder ein ST oder SR Register.<br />
Die Zeile hat folgende Bedeutung:<br />
1 Erste Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
2 Zweite Display-Zeile; Texte länger als 20 Zeichen werden<br />
abgeschnitten.<br />
3 Ausgabe auf einem Drucker, der an der Druckerschnittstelle<br />
angeschlossen ist; Texte länger als 50 Zeichen werden<br />
abgeschnitten. Die Steuerzeichen \n, \f und \\ können<br />
verwendet werden, um eine neue Zeile, eine neue Seite oder<br />
einen Backslash zu drucken.<br />
Alle anderen Zeilenzahlen werden vom Compiler mit einem Fehler abgefangen.<br />
Bemerkungen:<br />
Der Befehl ist quasi das VI-Pendant zum WRITE-Befehl für das Display.<br />
Beispiel:<br />
VI_WRITE 1, 1, $VI_ERROR, “Hallo Leute!”<br />
Siehe auch:<br />
237 VI_CLRKEY<br />
238 VI_DATE<br />
240 VI_JMPKEY<br />
241 VI_RDISP<br />
243 VI_READ<br />
244 VI_TIME<br />
246 VI_WRITE<br />
251 WRITE<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 246/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> WAITIM<br />
WAITIM<br />
Wartet, bis ein Timer abgelaufen ist.<br />
Syntax:<br />
WAITIM <br />
Felder:<br />
Timer. T0 ist der lokale Timer, die Timer T001 bis T255 sind<br />
global.<br />
Bemerkungen:<br />
Die globalen Timer müssen alle 3-stellig notiert sein (also T001).<br />
Der Befehl wartet, bis sich der Timer auf 0 dekrementiert hat, und fährt erst dann fort.<br />
Beispiel:<br />
SETTIM T0, 100 ; T0 soll 1s warten<br />
WAITIM T0 ; warte diese Sekunde<br />
Siehe auch:<br />
155 JMPTIM<br />
205 SETTIM<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 247/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> WHILE / WHILENOT / END_WHILE<br />
WHILE / WHILENOT / END_WHILE<br />
Wiederholt einen Programmblock so lange, wie die angegebene Bedingung erfüllt ist.<br />
Syntax:<br />
WHILE <br />
<br />
END_WHILE<br />
oder<br />
WHILE <br />
<br />
END_WHILE<br />
oder<br />
WHILENOT <br />
<br />
END_WHILE<br />
Felder:<br />
Eine vergleichende Bedingung, die festlegt, ob der ein<br />
weiteres Mal ausgeführt wird.<br />
Programmblock, der ausgeführt wird.<br />
Logische Bedingung oder ein Timer, die festlegt, ob der <br />
ein weiteres Mal ausgeführt wird.<br />
ist wie folgt aufgebaut:<br />
<br />
Dabei bedeuten:<br />
Eine direkt angegeben Zahl oder ein Register vom Typ SW, RV,<br />
RW, AV, AW, LV, LW, KV, KW, C, T oder ZW. Es ist somit möglich<br />
(wenn auch nicht besonders nützlich) zwei Timer miteinander zu<br />
vergleichen.<br />
Der Vergleichsoperator , =, = oder .<br />
ist entweder ein Timer oder ein (oder mehrere) Ausgänge, Eingänge,<br />
Merker oder Fehlermerker mit dem gewünschten Niveau (H oder L).<br />
Bemerkungen:<br />
Im Gegensatz zum DO / DO_WHILE Befehl kann der Block hier auch gar<br />
nicht ausgeführt werden, wenn die Bedingung bereits zu Beginn nicht erfüllt ist.<br />
WHILE mit Ein-, Ausgängen und Merker führt den nur dann ein weiteres Mal<br />
aus, wenn alle Niveaus korrekt sind; WHILENOT führt ihn solange aus, bis alle<br />
Niveaus erfüllt sind.<br />
Wird dieser Befehl dazu verwendet, dauernd eine Werte aus externe Steuerung<br />
abzufragen, ist darauf zu achten, dass diese Steuerung und der verwendete<br />
Datenbus nicht überlastet wird. Typischerweise wird dies verhindert, indem nach<br />
jeder Anfrage während einer kurzen Dauer gewartet wird. Es darf in jedem Befehl nur<br />
mit einer externen Steuerung kommuniziert werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 248/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> WHILE / WHILENOT / END_WHILE<br />
Beispiele:<br />
Das erste Beispiel zeigt die Verwendung von Vergleichen.<br />
MOV LV001, 100<br />
WHILE LV001 > 0<br />
CALC LV001, LV001 – 1 ; Durchlaufe Schlaufe 100 mal<br />
END_WHILE<br />
Das zweite Beispiel zeigt die übliche Verwendung eines Timers.<br />
SETTIM T0, 100 ; warte 1 Sekunde<br />
WHILENOT T0<br />
; Tu was auch immer<br />
END_WHILE<br />
Das letzte Beispiel zeigt Verwendung von Eingängen, Ausgängen und Merker. Die<br />
Schleife wird nur dann ausgeführt, wenn alle vier Bedingungen erfüllt sind.<br />
WHILE E101 L, E102 H, A200 H, M100 L<br />
; Tu was auch immer<br />
END_WHILENOT<br />
Siehe auch:<br />
118 DO / DO_WHILE / DO_WHILENOT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 249/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> WR_TIME<br />
WR_TIME<br />
Sendet die aktuelle Systemzeit an eine vernetzte Steuerung.<br />
Syntax:<br />
WR_TIME <strong>ECCO</strong><br />
Felder:<br />
Nummer der fremden <strong>ECCO</strong>-Steuerung. Grundsätzlich eine<br />
Zahl wischen 1 und 15; die fremde Steuerung muss zudem<br />
unter .LIMITS deklariert worden sein.<br />
Bemerkungen:<br />
Schreibt die eigene, aktuelle Systemzeit in die vernetzte Steuerung, deren<br />
Systemzeit (im Betriebssystem) dadurch aktualisiert wird.<br />
Beispiel:<br />
WR_TIME <strong>ECCO</strong>2 ; Aktualisiere Systemzeit von<br />
; <strong>ECCO</strong>2<br />
Siehe auch:<br />
60 .LIMITS<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 250/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> WRITE<br />
WRITE<br />
Gibt einen String aus.<br />
Syntax:<br />
WRITE , , , <br />
Felder:<br />
Spalte, ab der geschrieben wird. Gültige Werte liegen<br />
im Bereich 0 bis 60.<br />
Zeile; Unterkante von . Gültige Werte liegen im Bereich<br />
0 bis 200.<br />
Grösse der verwendeten Schriftart. Gültige Werte sind 1 bis 5<br />
und 17 bis 21, wie sie in den Abbildungen Seite 280 gezeigt<br />
sind.<br />
Auszugebender Text. Entweder ein ST oder SR Register oder<br />
ein mit Anführungszeichen begrenzter Text.<br />
Beispiel:<br />
WRITE 1, 10, 1, “Hello World”<br />
Siehe auch:<br />
142 HP_WRITE<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 251/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> XOR<br />
XOR<br />
Der Zielwert entspricht der logischen EXKLUSIV-ODER-Verknüpfung der Quellen.<br />
Syntax :<br />
XOR , [, ]<br />
oder<br />
XOR , [, ]<br />
Felder:<br />
Ein Ausgang, Merker oder Fehlermerker.<br />
Ein Ausgang, Eingang, Merker oder Fehlermerker.<br />
Ein Register vom Typ AV, AW, RV, RW, LV, LW oder ZW.<br />
Ein Register (AV, AW, RV, RW, LV, LW, ZW, KV oder KW) oder ein<br />
direkter Zahlwert. Muss die gleiche Bitbreite wie <br />
aufweisen.<br />
Bemerkungen:<br />
Die EXKLUSIV-ODER-Verknüpfung wird auch ANTI-ÄQUIVALENZ oder BIT-PLUS<br />
genannt.<br />
Bei I/O’s und Merker ist das Ziel genau dann H, wenn genau eine Quelle H ist. Bei<br />
Registern wird das Ergebnis bitweise gebildet; ein Ziel-Bit ist genau dann 1, wenn<br />
eine ungerade Anzahl Quell-Bit 1 ist. Eine Vermischung von Registern einerseits und<br />
I/O’s und Merker andererseits ist nicht möglich. Ist nur eine Quelle angegeben, so<br />
entspricht das Ergebnis der Quelle.<br />
Das Ziel darf nicht eine der Quellen sein. Der Befehl akzeptiert<br />
nur genau zwei Quellen. Sowohl wie auch müssen Elemente der<br />
eigenen Steuerung sein.<br />
Beispiele:<br />
Der Ausgang A024 ist dann hoch gesetzt, wenn die Eingänge E010 und E011<br />
ungleich sind.<br />
XOR A024, E010, E011<br />
Das zweite Beispiel zeigt die Verwendung mit Registern.<br />
MOV LW001, 42 ; 101010(b)<br />
MOV LW002, 36 ; 100100(b)<br />
XOR LW003, LW001, LW002 ; XOR 001110(b) = 14<br />
Siehe auch:<br />
96 AND<br />
171 NOT<br />
176 OR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 252/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ZPOINT_STATE<br />
ZPOINT_STATE<br />
Meldet, ob die Steuerung mit Zpoint verbunden ist.<br />
Syntax :<br />
ZPOINT_STATE <br />
Felder:<br />
LW, RW oder AW Register, in den der Zustand von Zpoint<br />
geschrieben wird.<br />
Mögliche Antwort-Werte sind:<br />
0 Steuerung ist nicht mit Zpoint verbunden.<br />
1 Steuerung ist mit Zpoint verbunden.<br />
Siehe auch:<br />
92 .ZPOINT / ANL<strong>AG</strong>E / RACK / .END_ZPOINT<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 253/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
4. 4. Label<br />
Label werden in <strong>ECCO</strong> als Einstiegspunkte verwendet, um bei gewissen Situationen<br />
vorprogrammierte Reaktionen auszulösen. <strong>ECCO</strong> erlaubt es oftmals, den Namen<br />
eines Labels über den .SETLABEL Befehl zu ändern. Davon wird jedoch dringend<br />
abgeraten, da solche Programme viel unleserlicher werden.<br />
<strong>ECCO</strong> verwendet folgende Label, welche auf den angegebenen Seiten genauer<br />
beschrieben werden. Es ist zu beachten, dass nicht alle Label in jedem Fall<br />
verwendet werden müssen.<br />
255 BACKPGM<br />
255 ERROR_PROTOTYPE<br />
257 HOT_TASK / HOT_END<br />
259 HPPGM<br />
260 NRMPGM<br />
261 NSPGM<br />
262 NSRESP<br />
263 STPGM<br />
264 STRESP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 254/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> BACKPGM<br />
BACKPGM<br />
Label des Background Programms.<br />
Syntax:<br />
BACKPGM:<br />
<br />
CLOSE<br />
Felder:<br />
Code des Background Programms.<br />
Bemerkungen:<br />
Im Gegensatz zu normalen Programm-Tasks laufen Background-Tasks immer. Die<br />
Laufzeitumgebung startet daher den ersten Background-Task beim BACKPGM Label<br />
schon zu Beginn.<br />
Üblicherweise werden in die eigentlichen Background-Tasks mit OPEN<br />
gestartet; dieser Block dient daher als Haupt-Block, da nur Background-Tasks<br />
Backgound-Tasks starten dürfen.<br />
Siehe auch:<br />
175 OPEN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 255/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> ERROR_PROTOTYPE<br />
ERROR_PROTOTYPE<br />
Definiert die allgemeine Fehlerroutine zum TINP Befehl.<br />
Syntax:<br />
ERROR_PROTOTYPE:<br />
<br />
CLOSE<br />
Felder:<br />
Der Code, der ausgeführt wird, wenn die angegebene Zeitdauer<br />
im TINP Befehl überschritten wird und im TINP Befehl kein<br />
behandelnder Fehlermerker angegeben ist.<br />
Bemerkungen:<br />
Die allgemeine Fehlerroutine wird nur gestartet, wenn keine andere Fehlerroutine<br />
aktiv ist, und wird sonst solange verzögert, bis keine Fehlerroutine mehr aktiv ist.<br />
Am besten befindet sich diese Routine möglichst weit oben im Programmtext, da nur<br />
die nachfolgenden Routinen, Tasks und Unterprogramme von ihrer Funktionalität<br />
profitieren. Im ganzen Programm darf diese Routine nur einmal vorkommen (was klar<br />
ist, da globale Labels grundsätzlich einmalig sein müssen).<br />
Beispiel:<br />
Zeigt den typischen ERROR_PROTOTYPE, welcher die Argumente aus dem<br />
.TINP_TEXT-Block während einer Sekunde anzeigt.<br />
.TINP_TEXT<br />
TIMEOUT SR0101 ; TIMEOUT AT LINE<br />
CONDITION SR0102 ; 1 st UNMATCHED CONDITION<br />
IO_TEXT SR0103 ; IO_TEXT OF THE UNM. COND<br />
REGISTER RW0069 ; <strong>ECCO</strong> PROGRAM LINE NUMBER<br />
.END_TINP_TEXT<br />
ERROR_PROTOTYPE:<br />
REGDISP 1, 80, 1, RW069, SR0101<br />
WRITE 1, 90, 1, SR0102<br />
WRITE 1, 100, 1, SR0103<br />
REGDISP 1, 110, 1, RV072, “ERROR NR = #4.0.0#”<br />
SETTIM T0,100 ; RV072 USED BY ALL TINP TO<br />
WAITIM T0 ; TRANSFER THE ERROR NUMBER.<br />
CLOSE<br />
Siehe auch:<br />
89 .TINP_TEXT / .END_TINP_TEXT<br />
234 TINP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 256/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HOT_TASK / HOT_END<br />
HOT_TASK / HOT_END<br />
Definiert den hochprioritären Task.<br />
Syntax:<br />
HOT_TASK:<br />
<br />
HOT_END<br />
Felder:<br />
Programmblock des Hot-Tasks.<br />
Es sind nur die folgenden Befehle im Block des Hot-Tasks erlaubt:<br />
AND CALC CTRDEC CTRINC CTRPRES<br />
CTRRES IF IFNOT MOV NOT<br />
OR OUTP SETBIT SWITCH XOR<br />
Bemerkungen:<br />
Üblicherweise liest <strong>ECCO</strong> in jedem Schritt die Eingänge, macht bei jedem eröffneten<br />
Task einen Programmschritt und setzt die Ausgänge. Beim Hot-Task werden<br />
dagegen alle Programmschritte jedesmal komplett ausgeführt, bevor die Ausgänge<br />
gesetzt werden. Er eignet sich für hochprioritäre und kritische Aufgaben wie Sicherheitsabfragen<br />
oder dem Takten eines Transportbandes oder eines Rundtisches. Es<br />
darf in jedem Programm höchstens einen Hot-Task geben.<br />
Um ein Hängenbleiben des Systems zu verhindern, sind nur die oben aufgeführten<br />
Befehle im Hot-Task erlaubt.<br />
Der Programmblock sollte möglichst kurz gehalten sein, da seine Ausführungszeit zu<br />
jedem Systemdurchgang addiert wird.<br />
Beispiel:<br />
Im Beispiel ist A123 der Ausgang zum Schalten eines Rundtakt-Tisches, der nur<br />
unter gewissen Bedingungen getaktet werden darf.<br />
HOT_TASK:<br />
AND A123, E133, E134, E135<br />
END_HOT<br />
Siehe auch:<br />
96 AND<br />
98 CALC<br />
266 CTRDEC<br />
269 CTRINC<br />
270 CTRPRES<br />
271 CTRRES<br />
149 IF / IFNOT / ELSE / END_IF<br />
166 MOV<br />
171 NOT<br />
176 OR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 257/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HOT_TASK / HOT_END<br />
178 OUTP<br />
204 SETBIT<br />
229 SWITCH / CASE / DEFAULT / END_SWITCH<br />
252 XOR<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 258/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> HPPGM<br />
HPPGM<br />
Startet zu Beginn des Automaten-Betriebs.<br />
Syntax:<br />
HPPGM:<br />
<br />
CLOSE<br />
Felder:<br />
Code, welcher im Automaten-Betrieb abgearbeitet wird.<br />
Bemerkungen:<br />
Die Laufzeitumgebung startet einen ersten Programm-Task beim HPPGM Label, wenn<br />
der Benutzer den Automaten-Betrieb startet. Üblicherweise werden in die<br />
eigentlichen Programm-Tasks mit OPEN gestartet; dieser Block dient daher als<br />
Haupt-Block.<br />
Siehe auch:<br />
175 OPEN<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 259/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NRMPGM<br />
NRMPGM<br />
Beginn des Normierungs-Programms.<br />
Syntax:<br />
NRMPGM:<br />
<br />
CLOSE<br />
Felder:<br />
Code der Normierung.<br />
Bemerkungen:<br />
Die Normierung wird beim Aufstarten der Steuerung ausgeführt, um die Anlage in<br />
einen klar definierten Zustand zu setzen und alle externen Geräte und Regler zu<br />
kalibrieren.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 260/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NSPGM<br />
NSPGM<br />
Beginn des Notstop-Programms.<br />
Syntax:<br />
NSPGM:<br />
<br />
CLOSE<br />
Felder:<br />
Programm, welches bei einem Notstop ausgeführt wird. Dieses<br />
sollte alle Ausgänge tief setzen und Achsen, Regler und externe<br />
Geräte anhalten. Die einschlägigen gesetzlichen Vorschriften<br />
sind zwingend einzuhalten!<br />
Bemerkungen:<br />
Die Notstop-Bedingungen werden der <strong>ECCO</strong> Laufzeit-Umgebung im NSDEF Befehl<br />
mitgeteilt. Tritt eine der Bedingungen auf, so werden alle Programm-, Funktions-,<br />
Display- und Fehlertasks abgebrochen; lediglich Background-Tasks bleiben erhalten.<br />
Die Laufzeit-Umgebung startet zusätzlich die Notstop-Prozedur beginnend beim<br />
NSPGM Label.<br />
Sobald das Notstop-Programm beendet hat (also beim CLOSE Befehl angekommen<br />
ist), erscheint auf dem Display die Meldung „EMERGENCY STOP“ und die „Fail“-<br />
Taste leuchtet. Der Benutzer muss den Notstop zurücksetzen (durch Freigeben aller<br />
Sicherheitselemente und Lösen Notstop-Taster) und am Terminal quittieren.<br />
Drückt der Bediener die „C“-Taster, statt dass er den Notstop quittiert, so wird das<br />
Programm ungültig und ein neues Programm muss geladen werden.<br />
Nach der Quittierung des Notstops startet die Laufzeit-Umgebung das Notstop-<br />
Restart-Programm beginnend beim NSRESP-Label.<br />
Siehe auch:<br />
172 NSDEF<br />
262 NSRESP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 261/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> NSRESP<br />
NSRESP<br />
Beginn des Notstop-Restart-Programms.<br />
Syntax:<br />
NSRESP:<br />
<br />
CLOSE<br />
Felder:<br />
Code, der von der Notstop-Restart-Prozedur ausgeführt wird.<br />
Bemerkungen:<br />
Nachdem der Benutzer einen Notstop quittiert hat wird die Notstop-Restart-Prozedur<br />
vom NSRESP-Label an aufgerufen. Ohne besondere Massnahmen wird nach ihrem<br />
Ende in den manuellen Modus gewechselt.<br />
Durch diese Prozedur kann der Programmierer die nötigen Arbeiten nach einem<br />
Notstop vornehmen, also den entstandenen Ausschuss geordnet entsorgen, Achsen<br />
zurückzusetzen und nötigenfalls neu zu kalibrieren, die Anlage zu entleeren und so<br />
weiter. Zusätzlich kann der Programmierer auch nach all diesen Schritten die Anlage<br />
neu aufstarten lassen, indem er sie durch Setzen von M035 in den Automatenmodus<br />
überführt.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 262/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STPGM<br />
STPGM<br />
Beginn des Programms, das bei einer Störung aufgerufen wird.<br />
Syntax:<br />
STPGM:<br />
<br />
CLOSE<br />
Felder:<br />
Code, der bei einer Störung abgearbeitet wird. Es sind die<br />
einschlägigen gesetzlichen Vorschriften zwingend einzuhalten!<br />
Bemerkungen:<br />
Im Gegensatz zu einem Notstop wird die Störung (definiert durch STDEF) nur im<br />
Stationen- und Automatenbetrieb überwacht, demzufolge taucht nur dann eine<br />
Störung auf. Ansonsten wird eine Störung gleich wie ein Notstop behandelt.<br />
Tritt eine der Bedingungen auf, so werden alle Programm-, Funktions-, Display- und<br />
Fehlertasks abgebrochen; lediglich Background-Tasks bleiben erhalten. Die Laufzeit-<br />
Umgebung startet zusätzlich die Störungs-Prozedur beginnend beim STPGM Label.<br />
Sobald das Störungs-Programm beendet hat, erscheint auf dem Display die Meldung<br />
„SYSTEM FAIL“ und die „Fail“-Taste leuchtet. Der Benutzer muss die<br />
Störungsursache beheben und die Störung am Terminal quittieren.<br />
Drückt der Bediener die „C“-Taster, statt dass er quittiert, so wird das Programm<br />
ungültig und ein neues Programm muss geladen werden.<br />
Nach der Quittierung der Störung startet die Laufzeit-Umgebung das Störungs-<br />
Restart-Programm beginnend beim STRESP-Label.<br />
Siehe auch:<br />
261 NSPGM<br />
216 STDEF<br />
264 STRESP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 263/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STRESP<br />
STRESP<br />
Beginn des Störungs-Restart-Programms.<br />
Syntax :<br />
STRESP :<br />
<br />
CLOSE<br />
Felder :<br />
Code, der von der Störungs-Restart-Prozedur ausgeführt wird.<br />
Bemerkungen:<br />
Im Gegensatz zu einem Notstop wird die Störung (definiert durch STDEF) nur im<br />
Stationen- und Automatenbetrieb überwacht, demzufolge taucht nur dann eine<br />
Störung auf. Ansonsten wird eine Störung gleich wie ein Notstop behandelt.<br />
Nachdem der Benutzer eine Störung quittiert hat wird die Störungs-Restart-Prozedur<br />
vom STRESP-Label an aufgerufen. Ohne besondere Massnahmen wird nach ihrem<br />
Ende in den manuellen Modus gewechselt.<br />
Durch diese Prozedur kann der Programmierer die nötigen Arbeiten nach einer<br />
Störung vornehmen, also den entstandenen Ausschuss geordnet entsorgen, Achsen<br />
zurückzusetzen und nötigenfalls neu zu kalibrieren, die Anlage zu entleeren und so<br />
weiter. Zusätzlich kann der Programmierer auch nach all diesen Schritten die Anlage<br />
neu aufstarten lassen, indem er sie durch Setzen von M035 in den Automatenmodus<br />
überführt.<br />
Siehe auch:<br />
262 NSRESP<br />
216 STDEF<br />
263 STPGM<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 264/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
4. 5. Veraltete Befehle<br />
Die nachfolgenden Befehle werden zwar noch unterstützt, sollten aber in neuen<br />
Projekten nicht länger eingesetzt werden, da sie in zukünftigen Revisionen völlig<br />
entfernt werden können.<br />
266 CTRDEC<br />
267 CTRDISP<br />
268 CTREQ<br />
269 CTRINC<br />
270 CTRPRES<br />
271 CTRRES<br />
272 DISABLE_STOP / ENABLE_STOP<br />
272 STAT_SEND<br />
274 STEND<br />
275 TIMETRAP / END_TIMETRAP<br />
276 TRAP / IF_TRAP / END_TRAP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 265/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTRDEC<br />
CTRDEC<br />
Dekrementiert einen Zähler.<br />
Syntax:<br />
CTRDEC <br />
Felder:<br />
Zähler, der verringert wird. Zähler haben den Kennbuchstaben<br />
C.<br />
Bemerkungen:<br />
Ist der Zähler bereits 0, so wird ein Systemfehler generiert, da ein Zähler nie kleiner<br />
als 0 sein kann.<br />
Beispiel:<br />
CTRDEC C020 ; C020 ist nun 1 kleiner<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 266/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTRDISP<br />
CTRDISP<br />
Zeigt den Inhalt eines Zählers auf dem Display an.<br />
Syntax:<br />
CTRDISP <br />
Felder:<br />
Zähler, der angezeigt wird. Zähler haben den Kennbuchstaben<br />
C.<br />
Bemerkungen:<br />
Der Inhalt des Zählers wird auf der ersten Linie des Displays angezeigt.<br />
Beispiel:<br />
CTRDEC C020 ; zeigt Inhalt von C020 an<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 267/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTREQ<br />
CTREQ<br />
Vergleicht zwei Zähler miteinander und verzweigt bei Gleichheit.<br />
Syntax:<br />
CTREQ , , <br />
Felder:<br />
Der erste Zähler, der verglichen wird. Zähler haben den<br />
Kennbuchstaben C.<br />
Der zweite Zähler.<br />
Label, zu dem bei Gleichheit gesprungen wird.<br />
Beispiel:<br />
CTREQ C020, C021, $GLEICH<br />
; hierhin kommt der Code für Ungleichheit<br />
; evtl. mit einem JUMP abgeschlossen<br />
$GLEICH:<br />
; hierhin kommt der Code bei Gleichheit<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 268/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTRINC<br />
CTRINC<br />
Inkrementiert einen Zähler.<br />
Syntax:<br />
CTRINC <br />
Felder:<br />
Zähler, der um 1 erhöht wird. Zähler haben den Kennbuchstaben<br />
C.<br />
Bemerkungen:<br />
Hat ein Zähler bereits den Wert 65535, so wird ein Fehler ausgelöst, da ein Zähler<br />
nie grösser als 65535 sein kann.<br />
Beispiel:<br />
CTRINC C020 ; C020 ist nun 1 grösser<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 269/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTRPRES<br />
CTRPRES<br />
Setzt einen Zähler auf einen vorgegebenen Wert.<br />
Syntax:<br />
CTRPRES , <br />
Felder:<br />
Zähler, der gesetzt wird. Zähler haben den Kennbuchstaben C.<br />
Wert, auf den der Zähler gesetzt wird. Ist entweder eine Zahl<br />
zwischen 0 und 65535, oder ein RV, LV oder KV Register.<br />
Bemerkungen:<br />
Um einen Zähler auf 0 zu setzen, dient der Befehl CTRRES.<br />
Beispiel:<br />
CTRPRES C020, RV002 ; Weist C020 Wert in RV002 zu<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 270/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> CTRRES<br />
CTRRES<br />
Setzt einen Zähler auf Null zurück.<br />
Syntax:<br />
CTRRES <br />
Felder:<br />
Zähler, der zurückgesetzt wird. Zähler haben den Kennbuchstaben<br />
C.<br />
Beispiel:<br />
CTRRES C000 ; setzt den lokalen Zähler 0<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 271/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> DISABLE_STOP / ENABLE_STOP<br />
DISABLE_STOP / ENABLE_STOP<br />
Verhindert, dass ein Programmblock vom Anwender über die „STOP“-Taste gestoppt<br />
werden kann.<br />
Syntax:<br />
DISABLE_STOP<br />
<br />
ENABLE_STOP<br />
Felder:<br />
Programmblock, zwischen dem die „STOP“-Taste wirkungslos<br />
ist.<br />
Bemerkungen:<br />
Die Befehle sind nur in einem Programm-Task zulässig.<br />
Wird die „STOP“-Taste nach dem Befehl DISABLE_STOP gedrückt, so wird das<br />
Programm bis zum Befehl ENABLE_STOP weiter bearbeitet. Erst jetzt stoppt das<br />
Programm – nun aber umgehend.<br />
Wird der Befehl DISABLE_STOP zweimal programmiert, muss auch der Befehl<br />
ENABLE_STOP zweimal programmiert werden, um den Effekt zu neutralisieren.<br />
Tritt ein ENABLE_STOP vor einem DISABLE_STOP auf, respektive wurde die „STOP“-<br />
Taste nicht zuvor deaktiviert, so hat ENABLE_STOP keinerlei Auswirkungen.<br />
Es wird empfohlen, diesen Befehl nicht länger zu verwenden, da eine ungenügende<br />
Programmierung (ein vergessenes ENABLE_STOP) zu kaum nachvollziehbaren<br />
Fehlern führt.<br />
Beispiel:<br />
Im Beispiel kann der INP-Befehl nicht gestoppt werden.<br />
DISABLE_STOP<br />
INP E010 H, E011 L<br />
ENABLE_STOP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 272/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STAT_SEND<br />
STAT_SEND<br />
Sendet einen Wert direkt an die Statistik-Einheit.<br />
Syntax:<br />
STAT_SEND , , , <br />
Felder:<br />
Statistik-Gruppe der Daten. Ein RV, RW, AV, AW, LV, LW, KV oder<br />
KW Register oder eine direkte Zahl, jeweils zwischen 1 und 20.<br />
Maschinentakte mit STAT_TAKT, bis übertragen und<br />
endgültig aus <strong>ECCO</strong> gelöscht wird.<br />
Datensatz-Adresse. Adresse in der Statistik-Gruppe, in der der<br />
abgelegt wird, als Zahl zwischen 1 und 255.<br />
Der Wert, der in gespeichert wird; in einem RV, AW, LW,<br />
ZW oder KW Register.<br />
Bemerkungen:<br />
Der Befehl wurde eingesetzt, bevor die leistungsfähigeren Puffer Befehle verfügbar<br />
waren. Er erlaubt es, den Inhalt eines einzelnen Registers an eine Statistikgruppe zu<br />
senden.<br />
Die Angabe der Taktzahl vor dem endgültigen Ablegen ist nötig, um einem<br />
Werkstück an verschiedenen Stationen Messwerte zuzuordnen, welche aber am<br />
Schluss in einem einzigen Datensatz abgelegt werden.<br />
Der Befehl darf zwar mit Zpoint verwendet werden, ist jedoch kaum brauchbar.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 273/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> STEND<br />
STEND<br />
Beendet die angegebene Station.<br />
Syntax:<br />
STEND <br />
Felder:<br />
Nummer der Station, die beendet wird. Muss im unter .LIMITS<br />
angegebenen Bereich liegen.<br />
Bemerkungen:<br />
Trifft das Programm im Stationsbetrieb auf diesen Befehl, so wird die betreffende<br />
Station beendet, das heisst, dass der Task, der mit aufgerufen wurde,<br />
geschlossen wird. In allen anderen Betriebszuständen hat der Befehl keinerlei<br />
Auswirkungen.<br />
Beispiel:<br />
STEND 5 ; Schliesse Station 5<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 274/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TIMETRAP / END_TIMETRAP<br />
TIMETRAP / END_TIMETRAP<br />
Ermöglicht die zeitliche Überwachung mehrerer Befehle.<br />
Syntax :<br />
TIMETRAP , <br />
<br />
END_TIMETRAP<br />
Felder:<br />
Zeit, nach der ausgelöst wird, wenn das<br />
Programm immer noch abarbeitet; in 10 Millisekunden.<br />
Eine direkte Zahl oder ein RV, LV oder KV Register.<br />
Label, zu dem verzweigt wird, wenn der Trap ausgelöst wurde.<br />
Programmcode, der überwacht wird.<br />
Bemerkungen:<br />
Diese Anweisung wird verwendet, um einen oder mehrere Befehle zeitlich zu<br />
überwachen. Läuft die unter spezifizierte Zeit ab, bevor END_TIMETRAP<br />
erreicht ist, springt das Programm zum angeführten . Gelangt das<br />
Programm zum Befehl END_TIMETRAP, bevor die Zeit abgelaufen ist, fährt es auf<br />
der nachfolgenden Zeile weiter.<br />
Mit dem TRAP Befehl steht eine strukturierte Alternative zur Verfügung. Mit dem<br />
COND_TRAP Befehl existiert zudem eine leistungsfähigere und strukturierte<br />
Alternative.<br />
Überwachungen dürfen nicht verschachtelt werden und keine synchronen Tasks aufrufen.<br />
Sprünge sind nur innerhalb des überwachten Bereichs erlaubt.<br />
Beispiel:<br />
Das Beispiel zeigt die Verwendung dieses Befehls, und die Entsprechung mittels<br />
TRAP. Es wartet auf einen Eingang, jedoch höchstens eine Sekunde.<br />
TIMETRAP 100, $FAIL ; TRAP 100<br />
INP E100 H ; INP E100 H<br />
END_TIMETRAP<br />
JUMP $CONT<br />
$FAIL: ; IF_TRAP<br />
OUTP D100 H ; OUTP D100 H<br />
$CONT: ; END_TRAP<br />
Siehe auch:<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
234 TINP<br />
276 TRAP / IF_TRAP / END_TRAP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 275/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> TRAP / IF_TRAP / END_TRAP<br />
TRAP / IF_TRAP / END_TRAP<br />
Ermöglicht die zeitliche Überwachung mehrerer Befehle.<br />
Syntax :<br />
TRAP <br />
<br />
IF_TRAP<br />
<br />
END_TRAP<br />
Felder:<br />
Zeit, nach welcher ausgeführt wird, wenn das<br />
Programm immer noch abarbeitet; in 10 Millisekunden.<br />
Eine direkte Zahl oder ein RV, LV oder KV Register.<br />
Programmcode, der überwacht wird.<br />
Programmcode, der bei einem ausgelösten Trap ausgeführt<br />
wird.<br />
Bemerkungen:<br />
Die Ausführung beginnt mit dem Programmblock. Ist nach dessen Ende die<br />
in gesetzte Dauer noch nicht abgelaufen, wird als nächstes die dem<br />
END_TRAP folgende Programmzeile ausgeführt. Wenn aber die während der<br />
Ausführung des Programmblocks abläuft, wird dieser abgebrochen und der<br />
Programmblock ausgeführt.<br />
Mit dem Befehl COND_TRAP steht ein vielseitigerer Befehl zur Verfügung.<br />
Überwachungen dürfen nicht verschachtelt werden und keine synchronen Tasks aufrufen.<br />
Sprünge sind nur innerhalb des überwachten Bereichs erlaubt.<br />
Beispiel:<br />
TRAP 100 ; Dauere höchstens 1 Sekunde<br />
INP E100 H ; warte bis E100 H ist<br />
IF_TRAP<br />
OUTP A101 L ; Handle den Trap<br />
END_TRAP<br />
Siehe auch:<br />
111 COND_TRAP / IF_COND / END_COND_TRAP<br />
275 TIMETRAP / END_TIMETRAP<br />
234 TINP<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 276/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
4. 6. Nicht länger unterstützte Befehle<br />
Die nachfolgenden Befehle werden nicht länger unterstützt und generieren Compiler-<br />
Fehler.<br />
.BIT_RATE<br />
.CAN_DEVICE / .END_CAN_DEVICE<br />
.EXT_IO<br />
.WATCHDOG_OFF<br />
CAN_CHECK<br />
CAN_COM_BITRATE<br />
CAN_COM_BUS<br />
CAN_MSG<br />
CAN_OFF<br />
CAN_ON<br />
GET_CAN_ARRAY<br />
GET_CAN_DEV<br />
ID_INP<br />
ID_OUTP<br />
STOP_LOCK<br />
VI_COM<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 277/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. ANHÄNGE<br />
5. 1. Zustandsdiagramm<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 278/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. 2. Priorität<br />
5. 3. Farben und Schriftarten auf dem Display<br />
Das <strong>ECCO</strong>-Display verfügt über fünf verschiedene Schriftarten und 13 Farben zur<br />
Anzeige. Zusätzlich kann die Ausgabe invertiert werden, so dass die Schrift in der<br />
Farbe des Hintergrundes über einem farbigen Balken liegt. Die nachfolgenden<br />
Abbildungen zeigen Muster für den Einsatz der Farben und der Schriftarten.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 279/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 280/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. 4. Systemregister<br />
Systemregister werden durch den Bezeichner SW identifiziert. Freie SW-Register<br />
haben in der aktuellen Version von <strong>ECCO</strong> keine Bedeutung, können jedoch in<br />
späteren Versionen verwendet werden.<br />
SW001 Nummer des letzten Systemfehlers. Die Bedeutung der Werte<br />
wird in Anhang 5. 6 „Systemfehler“ gegeben.<br />
SW002 Letzter p_indx. Dies ist der Programmpointer zum letzten Fehler<br />
und wird benötigt, um den Fehler mit dem Debugger ausfindig<br />
zu machen.<br />
SW003 MAX_<strong>ECCO</strong>: maximale Zahl verknüpfter <strong>ECCO</strong> Steuerungen,<br />
wie sie im .MAX_<strong>ECCO</strong>-Befehl angegeben wurde.<br />
SW004 OWN_<strong>ECCO</strong>: Adresse der eigenen <strong>ECCO</strong>-Steuerung, wie sie<br />
im .OWN_<strong>ECCO</strong>-Befehl angegeben wurde.<br />
SW005 Projektnummer des Programms, wie durch den .PROJECT-<br />
Befehl vorgegeben.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 281/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
SW006 Aktuell an DP-IDEX Systemen vorhandene Datenträger. Eine<br />
Bitmaske, bei der ein Bit genau dann 1 ist, wenn ein Datenträger<br />
bei der Antenne vorhanden ist und mit ihm kommuniziert<br />
werden kann.<br />
SW007 Anzahl der Systemzyklen seit dem letzten Notstop, die beim<br />
Beschreiben des Monitors gewartet werden mussten. Ist der<br />
Wert ungleich 0, dann weist das darauf hin, dass die Anzeige<br />
nicht ausreichend wartet.<br />
SW008 Anzahl deklarierter Eingänge (Wert zwischen 1 und 992).<br />
SW009 Anzahl deklarierter Ausgänge (Wert zwischen 1 und 992).<br />
SW010 Anzahl deklarierter Merker (Wert zwischen 1 und 992).<br />
SW011 Anzahl deklarierter Fehlermerker (Wert zwischen 1 und 992).<br />
SW012 Anzahl tatsächlicher Eingänge.<br />
SW013 Anzahl tatsächlicher Ausgänge.<br />
SW014 Erfolg des letzten TASK_KILL Befehls. Dabei bedeutet 0, dass<br />
der Befehl seit dem letzten Notstop nie verwendet wurde, -1,<br />
dass die Operation erfolgreich war, und alle anderen Werte geben<br />
die Zeilennummer des letzten Befehls an und zeigen damit,<br />
dass die Operation nicht erfolgreich war.<br />
SW015 Nummer des Profibus Master, von dem der letzte Profibus<br />
Fehler ausging (Wert zwischen 1 und 4).<br />
SW016 Nummer des Slaves, von dem der letzte Profibus Fehler<br />
ausging (Werg zwischen 1 und 125).<br />
SW017 Anzahl ZW Zeitwerte (Wert zwischen 1 und 49).<br />
SW018 Der maximale X-Wert für Funktionen, wie durch .LIMITS deklariert<br />
(Wert zwischen 0 und 40).<br />
SW019 Der maximale Y-Wert für Funktionen, wie durch .LIMITS deklariert<br />
(Wert zwischen 0 und 40).<br />
SW020 Anzahl Stationen, wie durch .LIMITS deklariert (Wert zwischen<br />
0 und 9999).<br />
SW021 Anzahl der konstanten Strings (also der ST Strings).<br />
SW022 Anzahl der RW Register.<br />
SW023 Anzahl der RV Register.<br />
SW024 frei<br />
SW025 Anzahl der AW Arrays (Wert zwischen 0 und 256).<br />
SW026 Anzahl der AV Arrays (Wert zwischen 0 und 256).<br />
SW027 <strong>ECCO</strong> Compilerversion. Die oberen Bits geben den Typ (SMC<br />
40 bis <strong>ECCO</strong>) an, die unteren die Compilerversion als fortlaufende<br />
Zahl. Diese Zahl wird beim Laden von der Laufzeitumgebung<br />
geprüft, um keine falsch kompilierten Programme zu<br />
laden.<br />
SW028 <strong>ECCO</strong> Laufzeitversion. Korrespondiert mit SW027.<br />
SW029 Gibt den Zustand im TINP-Befehl an. Der Befehl ist äusserst<br />
komplex und kann zur Ausführung in verschiedenen Zuständen<br />
sein. Dieses Systemregister gibt dann eben diesen Zustand an.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 282/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
SW030 Index der ersten <strong>ECCO</strong>-Steuerung, bei der bei M0031 H ein<br />
Kommunikationsfehler auftrat. Da der SEND_REG-Befehl keine<br />
Systemfehler ausgibt, bleibt der Befehl unter Umständen einfach<br />
hängen (wenn die fremde Steuerung ausgeschaltet ist).<br />
Durch Überwachung kann dies abgefangen werden. SW030<br />
zeigt dann auf die Steuerung, und im SW-Register mit Adresse<br />
30+SW030 ist der Fehler-Grund angegeben.<br />
SW031 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>1. –1, falls<br />
kein Fehler anliegt.<br />
SW032 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>2. –1, falls<br />
kein Fehler anliegt.<br />
SW033 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>3. –1, falls<br />
kein Fehler anliegt.<br />
SW034 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>4. –1, falls<br />
kein Fehler anliegt.<br />
SW035 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>5. –1, falls<br />
kein Fehler anliegt.<br />
SW036 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>6. –1, falls<br />
kein Fehler anliegt.<br />
SW037 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>7. –1, falls<br />
kein Fehler anliegt.<br />
SW038 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>8. –1, falls<br />
kein Fehler anliegt.<br />
SW039 Erster Fehlercode bei der Kommunikation mit <strong>ECCO</strong>9. –1, falls<br />
kein Fehler anliegt.<br />
SW040 Lizenzcode aus dem USB Key.<br />
SW041 Beinhaltet den Lizenzcode aus SW040, wenn Profibus Master 1<br />
überwacht wird, sonst 0.<br />
SW042 Beinhaltet den Lizenzcode aus SW040, wenn Profibus Master 2<br />
überwacht wird, sonst 0.<br />
SW043 Beinhaltet den Lizenzcode aus SW040, wenn Profibus Master 3<br />
überwacht wird, sonst 0.<br />
SW044 Beinhaltet den Lizenzcode aus SW040, wenn Profibus Master 4<br />
überwacht wird, sonst 0.<br />
SW045 – SW056 frei<br />
SW057 Aktive Slaves. Bitmaske, die angibt, mit welchen Slaves<br />
kommuniziert werden kann.<br />
SW058 Anzahl Fehler der PAC Überwachung seit dem letzten Notstop.<br />
SW059 Programmindex p_indx beim letzten PAC-Fehler. Wird verwendet,<br />
um den Fehler im Debugger ausfindig zu machen.<br />
SW060 Fehlernummer, die der PAC beim letzten PAC-Fehler lieferte.<br />
SW061 In früheren Versionen der Laufzeitumgebung erzeugten Kommunikationsfehler<br />
mit dem PAC Systemfehler. Da jedoch Softwarepakete<br />
von Drittanbieten (namentlich ZPoint) damit nicht<br />
zurechtkamen, werden die Systemfehler nicht länger erzeugt;<br />
die Fehlernummer, die ein Systemfehler erzeugen würde, wird<br />
aus Kompatibilitätsgründen diesem Systemregister zugewiesen.<br />
SW062 PAC Nummer des PAC mit dem letzten PAC-Fehler.<br />
SW063 Eindeutige Identifikationsnummer aus dem USB Key.<br />
SW064 Zahl der von PAC_STATE wiederholten Befehle.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 283/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
SW065 Anzahl vom PAC empfangener Prüfsummenfehler (Fehler 79).<br />
SW066 Anzahl von <strong>ECCO</strong> empfangener Prüfsummenfehler (Fehler 80).<br />
SW067 Anzahl falscher Anzahl Parameter im PAC (Fehler 81).<br />
SW068 Anzahl vom PAC nicht erkannten Befehle (Fehler 82).<br />
SW069 Anzahl Telegramme vom PAC mit falscher Telegramm-Länge<br />
(Fehler 83).<br />
SW070 Anzahl der Zeitüberläufe bei der Kommunikation mit dem PAC<br />
(Fehler 84).<br />
SW071 Anzahl der nicht interpretierbaren Antworten des PAC (Fehler<br />
85).<br />
SW072 Anzahl vom PAC gesendeter ungültiger Werte (Fehler 86).<br />
SW073 Anzahl interner PAC-Fehler (Fehler 88).<br />
SW074 frei<br />
SW075 – SW078 Input Lesezeit in Promille für Profibus Master 1 bis 4, wenn das<br />
Systemflag M039 gesetzt wurde. Dient zur IO-Timing Analyse.<br />
SW079 frei<br />
SW080 – SW083 Output Schreibzeit in Promille für die Profibus Master 1 bis 4,<br />
wenn das Systemflag M039 gesetzt wurde. Dient zur IO-Timing<br />
Analyse.<br />
SW084 frei<br />
SW085 Baluff Lese/Schreib Zykluszeit für alle angeschlossenen IDEX<br />
Systeme in Zehntels-Promille, wenn M039 hoch ist. Baluff IDEX<br />
Geräte dürfen nur an einer Profibus Master Karte angeschlossen<br />
sein; daher reicht ein Systemregister zur Timing-Analyse.<br />
Systemregister werden oft im Debugger verwendet, um Programme zu debuggen<br />
oder zu optimieren.<br />
Die Systemregister SW058–SW062 werden üblicherweise zusammen verwendet.<br />
Insbesondere bei der automatischen Parametrisierung mit Betriebssteuerungs-<br />
Programmen kann es vorkommen, dass diese dem <strong>ECCO</strong> Programm unsinnige<br />
PAC-Parameter übermitteln, die dieser mit einem Fehler verweigert. Im Debugger<br />
kann das dann einfach festgestellt werden, da SW062 den fraglichen PAC angibt, und<br />
SW059 es ermöglicht, die Koppel-Instruktion zu ermitteln.<br />
Die Systemregister SW064–SW073 beinhalten die Anzahl der entsprechenden Ereignisse<br />
seit dem letzten Notstop.<br />
5. 5. Systemmerker<br />
Systemmerker sind von der Schreibweise her gewöhnliche Merker, werden also mit M<br />
oder F gekennzeichnet. Einige Systemmerker sind jedoch schreibgeschützt (in der<br />
nachfolgenden Tabelle wird das mit RO für „read only“ gekennzeichnet).<br />
M001 RO Position des virtuellen Schlüsselschalters auf dem Display.<br />
M002 Speicher voll. Im Gegensatz zu SMC-Steuerungen weist dies<br />
bei PC-Steuerungen auf ein schwerwiegendes Fehlverhalten<br />
den Systems hin.<br />
M003 Statistik-Puffer voll.<br />
M004 RO Neue Order-Nummer bereit.<br />
M005 RO Manueller Betrieb.<br />
M006 RO Stationsbetrieb.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 284/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
M007 RO Automatischer Betrieb.<br />
M008 RO Programm gestoppt.<br />
M009 RO Programm gestartet.<br />
M010 RO Systemfehler vorhanden.<br />
M011 RO Notstop ausgelöst.<br />
M012 Programmstop-Merker, blockiert Funktionstasks (im Gegensatz<br />
zu M025).<br />
M013 RO Fehlertask aktiv.<br />
M014 RO Displaytask aktiv.<br />
M015 RO Funktionsmodus aktiv.<br />
M016 Warnung vor vollem Puffer. Das Flag wird hoch gesetzt, wenn<br />
mehr als 80% des Statistik-Puffers belegt ist.<br />
M017 Starte Tracer.<br />
M018 Programm-Tace frei.<br />
M019 Background-Trace frei.<br />
M020 PSL-Trace frei.<br />
M021 Display-Task-Trace frei.<br />
M022 Fehler-Trace frei.<br />
M023 Funktions-Task-Trace frei.<br />
M024 RO Tracer aktiv.<br />
M025 Programmstop-Merker, erlaubt Funktionstasks (im Gegensatz<br />
zu M012).<br />
M026 Frei. Kann in zukünftigen Versionen als Systemmerker verwendet<br />
werden und sollte in <strong>ECCO</strong>-Programmen ungenutzt bleiben.<br />
M027 RO Profibus aktiviert.<br />
M028 RO Profibus Kommunikationsfehler.<br />
M029 Objektfehler am Zpoint Gateway.<br />
M030 Timeout des Zpoint Gateways.<br />
M031 Fehler der PAC-Kommunikation.<br />
M032 RO Zpoint Gateway vorhanden.<br />
M033 RO Kommunikation mit anderen <strong>ECCO</strong> Steuerungen möglich.<br />
M034 Merker, um manuellen Betrieb zu setzen.<br />
M035 Merker, um automatischen Betrieb zu setzen. Falls dies nicht<br />
ausgeführt werden darf, wird das Flag einfach zurück gesetzt.<br />
M036 Merker, um die „Start“-Taste zu setzen und ihre Funktion auszulösen.<br />
Falls sie nicht ausgeführt werden darf, wird das Flag<br />
einfach zurück gesetzt.<br />
M037 Merker, um die „Stop“-Taste zu setzen und ihre Funktion auszulösen.<br />
Falls sie nicht ausgeführt werden darf, wird das Flag<br />
einfach zurück gesetzt.<br />
M038 Merker, um die „Fail“-Taste zu setzen und ihre Funktion auszulösen.<br />
Falls sie nicht ausgeführt werden darf, wird das Flag<br />
einfach zurück gesetzt.<br />
M039 Profibus IO-Timing Analyse; die Resultate werden in den<br />
Systemregistern SW075–SW083 zusammengetragen.<br />
M040 – M049 Frei. Kann in zukünftigen Versionen als Systemmerker verwendet<br />
werden und sollte in <strong>ECCO</strong>-Programmen ungenutzt bleiben.<br />
Die übrigen Merker (mit einer Nummer über 50) können frei verwendet werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 285/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. 6. Systemfehler<br />
Tritt in <strong>ECCO</strong> ein Systemfehler auf, so erscheint eine Nachricht mit folgendem<br />
Aufbau:<br />
p_index = <br />
SYSTEM FAIL<br />
STOP at system error No.: <br />
<br />
<br />
Dabei bedeuten:<br />
Der Programmpointer. Sein Wert zeigt auf die Zeile im<br />
compilierten Programm. Die Anzeige wird im Debugger<br />
verwendet, um die fragliche Zeile zu finden.<br />
Der Systemfehler. Die Werte werden weiter unten gegeben.<br />
, Genauere Beschreibung zum Systemfehler.<br />
<br />
Systemfehler sind entweder „gewöhnlich“, indem der Bediener den Fehler bestätigen<br />
und das Programm weiterführen kann, oder „fatal“, was bedeutet, dass <strong>ECCO</strong> das<br />
Programm für ungültig erklären muss und ein neues Programm geladen werden<br />
muss.<br />
Die nachfolgende Tabelle gibt Auskunft über die einzelnen Systemfehler, ob sie fatal<br />
sind, die Displaymeldung und ihre Bedeutung:<br />
1 Fatal compiler type or<br />
version<br />
Das Programm wird nicht als ein gültiges<br />
Programm erkannt; die <strong>ECCO</strong> Laufzeit-<br />
Umgebung nimmt an, dass es mit einer<br />
falschen Compilerversion (oder für ein<br />
anderes System) übersetzt wurde.<br />
2 unknown loop variable Systemkonflikt mit einer unbekannten<br />
Schleifen-Variable. Bedeutet meist, dass<br />
das Programm fehlerhaft compiliert<br />
3 invalid function<br />
address<br />
wurde.<br />
Die Funktion kann nicht gestartet<br />
werden, da ihre Startadresse unbekannt<br />
ist. Die Funktionsdeklaration oder der<br />
Aufruf sind falsch, oder das Programm<br />
wurde fehlerhaft compiliert.<br />
4 parametric function Es wurde versucht, eine Funktion mit<br />
call<br />
Argumenten vom Display aus zu starten.<br />
5 function mode disabled Bei einem fehlerhaften oder Programm<br />
wird der Funktionsmodus unterbrochen.<br />
6 function not defined Die Funktion ist nicht deklariert und wird<br />
daher auch nicht gestartet.<br />
7 station not defined Die Station ist nicht deklariert und wird<br />
8 PROFIBUS hardware<br />
error<br />
daher auch nicht gestartet.<br />
Schwerer Fehler bei der Kommunikation<br />
am Profibus, beispielsweise weil ein Teilnehmer<br />
fehlt oder die Profibus Master-<br />
Karte defekt ist.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 286/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
9 STRING out of range Fehlerhafte Zeichenkette. Oft fehlen die<br />
schliessenden Anführungszeichen.<br />
10 PROFIBUS license Der USB Key fehlt oder besitzt nicht die<br />
invalid<br />
nötigen Rechte.<br />
11 invalid task address Die angegebene Adresse, an welcher ein<br />
Task starten sollte, ist ungültig.<br />
12 type bits err,<br />
Eine ungültige Instruktion wurde vom<br />
L_JMPCOND<br />
Befehl L_JMPCOND generiert. Rund um<br />
diesen Fehler sind die Instruktionen zu<br />
verifizieren.<br />
13 Fatal function call in error Aus dem Fehlertask darf keine Funktion<br />
aufgerufen werden. Ebenso kann bei<br />
einem unterbrochenen Programm kein<br />
Fehlertask aufgerufen werden.<br />
14 func.disp.command Display-Befehle sind in einer von einem<br />
error<br />
Fehlertask aufgerufenen Funktion nicht<br />
erlaubt. Der Fehler tritt aber nie auf, da<br />
Fehlertasks keine Funktionen aufrufen<br />
dürfen (Systemfehler 13).<br />
15 NUM_INP in bg, psl, In Background-, PSL- oder Funktions-<br />
func<br />
tasks darf NUM_INP nicht verwendet<br />
werden.<br />
16 Fatal not legal command Tritt auf, wenn das Programm auf eine<br />
illegale Instruktion trifft. Typischerweise<br />
ein Folgefehler, bei welcher der erste<br />
Fehler behoben werden muss. Trifft der<br />
Befehl sonst auf, wäre dies ein Zeichen<br />
für fehlerhafte Hardware.<br />
17 Fatal CALLD while ERROR_TASK Da ein Fehlertask eine höhere Priorität<br />
als ein Displaytask hat, darf dieser nicht<br />
in einem Fehlertask aufgerufen werden.<br />
18 string too long Ein String konnte nur unvollständig<br />
übertragen werden. Entweder ist die<br />
Zeichenkette übermässig lang oder<br />
falsch abgeschlossen.<br />
19 wrong register<br />
Tritt auf, wenn zu einem Befehl<br />
assigned<br />
unzulässige Register oder Argumente<br />
angegeben sind. Wird meist schon vom<br />
Compiler abgefangen.<br />
20 data over(under)flowed Bei einer Berechnung geschah ein<br />
21 wrong task type for<br />
Overflow respektive Underflow.<br />
Der Befehl OPEN kann nur in normalen<br />
open<br />
Tasks und Background-Tasks verwendet<br />
werden.<br />
22 Fatal too many nested<br />
Es dürfen nur vier Funktionsprozeduren<br />
CALLF-s<br />
verschachtelt werden.<br />
23 Fatal no task free for CALLF Es ist kein freier Task vorhanden, um die<br />
Funktionsprozedur zu öffnen. Da dies<br />
bedeutet, dass bereits zu viele Tasks<br />
offen sind, wird das ganze Programm ungültig<br />
erklärt.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 287/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
24 Fatal main does not exist Die Main-Karte war in früheren<br />
Systemen verantwortlich für die Statistik-<br />
Anbindung und Kommunikation. In den<br />
modernen PC-Systemen ist das in der<br />
Laufzeit-Umgebung integriert und weist<br />
auf ein Problem im untergeordneten Betriebssystem<br />
hin.<br />
25 too many nested calls Es dürfen höchstens 16 CALL Aufrufe<br />
verschachtelt werden.<br />
26 Fatal RETURN without CALL Das Programm traf auf eine RET-<br />
Instruktion, obwohl der Block nicht durch<br />
CALL gestartet wurde. Dies zeigt auf ein<br />
27 type bits error in<br />
L_INP<br />
gravierendes Problem.<br />
Eine ungültige Instruktion wurde vom<br />
Befehl L_INP generiert. Die Zeilen rund<br />
um den Fehler sind zu verifizieren.<br />
28 slave return error Der Slave antwortete auf einen Befehl<br />
mit eine unerwarteten Anzahl an Return-<br />
Argumenten. Meist bedeutet dies, dass<br />
ein falscher Slave-Befehl verwendet<br />
wurde.<br />
29 wrong AD number Ein PAC verfügt nur über vier A/D-<br />
Wandler. Die Adressierung durch die<br />
fehlerhafte Instruktion ist zu prüfen.<br />
30 Fatal division by zero Im CALC Befehl wurde versucht, eine<br />
Division durch Null zu berechnen.<br />
31 wrong DA number Ein PAC verfügt nur über vier D/A-<br />
Wandler. Die Adressierung durch die<br />
32 Fatal too many tasks open<br />
>128<br />
fehlerhafte Instruktion ist zu prüfen.<br />
Es ist kein freier Task vorhanden, um<br />
einen weiteren Task zu öffnen. Da dies<br />
bedeutet, dass bereits zu viele Tasks<br />
offen sind, wird das ganze Programm<br />
ungültig erklärt.<br />
33 Fatal too many bgnds >85 Es ist kein freier Background-Task vorhanden,<br />
um einen weiteren Task zu öffnen.<br />
Da dies bedeutet, dass bereits zu<br />
viele Tasks offen sind, wird das ganze<br />
Programm ungültig erklärt.<br />
34 wrong task type, CLOSE CLOSE wurde falsch verwendet. Fehler-,<br />
Funktions- und Display-Tasks dürfen<br />
nicht mit CLOSE beendet werden, ebenso<br />
alle Prozeduren, die mit CALL gestartet<br />
wurden.<br />
35 wrong task type, stend Der (veraltete) Befehl STEND darf nur im<br />
Stations-Betrieb verwendet werden.<br />
36 counter overflow Der (veraltete) Befehl CTRINC löste<br />
>65535<br />
einen Overflow aus.<br />
37 counter underflow
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
38 vi_term comm_device<br />
err<br />
Es wurde versucht, mit einem der VI-<br />
Befehle auf ein aneres als ein VI-Gerät<br />
zuzugreifen.<br />
39 idex comm_device err Es wurde versucht, mit einem IDEX-<br />
Befehl auf ein anderes als ein IDEX-<br />
40 enable_stop, wrong<br />
Gerät zuzugreifen.<br />
Der Befehl ENABLE_STOP darf nur in<br />
task<br />
Programm-Tasks verwendet werden.<br />
41 disable_stop, wrong Der Befehl DISABLE_STOP darf nur in<br />
type<br />
Programm-Tasks verwendet werden.<br />
42 wrong task type, CALL An der fraglichen Stelle darf CALL nicht<br />
verwendet werden.<br />
43 wrong task type, RET An der fraglichen Stelle darf RET nicht<br />
verwendet werden.<br />
44 wrong task type, RETF An der fraglichen Stelle darf RETF nicht<br />
verwendet werden. RETF beendet nur<br />
Funktions-Prozeduren.<br />
45 wrong task type, CALLF An der fraglichen Stelle darf CALLF nicht<br />
verwendet werden.<br />
46 wrong task type, CALLD An der fraglichen Stelle darf CALLD nicht<br />
verwendet werden.<br />
47 wrong task type, RETD An der fraglichen Stelle darf RETD nicht<br />
verwendet werden. RETD beendet nur<br />
den Display-Task.<br />
48 wrong task type, RETE An der fraglichen Stelle darf RETE nicht<br />
verwendet verden. RETE kann nur einen<br />
Fehler-Task beenden.<br />
49 type bits error L_OUTP Eine ungültige Instruktion wurde durch<br />
den Befehl L_OUTP generiert. Rund um<br />
den Fehler sind die Instruktionen zu<br />
verifizieren.<br />
50 wrong SLAVE number Der PAC oder Slave wurde falsch adressiert;<br />
es wurde also eine Adresse angegeben,<br />
an der kein Slave oder PAC<br />
deklariert ist.<br />
51 - 59 reserviert für CAN-Bus.<br />
60 Fatal DP-RAM checksum error Ein fataler Fehler der Hardware oder des<br />
zu Grunde liegenden Betriebssystems ist<br />
aufgetreten.<br />
61 - 62 reserviert für CAN-Bus.<br />
63 GATEWAY reply error Fehler bei der Kommunikation mit dem<br />
Zpoint Gateway.<br />
64 wrong data type Der in der Instruktion angegebene<br />
65 INDEX out of range<br />
Datentyp wird nicht unterstützt.<br />
Bei indirekter Adressierung oder bei<br />
Arrays wurde ein Element ausgewählt,<br />
dass nicht existiert.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 289/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
66 wrong string format Das Format des verwendeten Strings ist<br />
falsch. Die Formatierung sowie auch die<br />
Deklaration des dynamischen Strings<br />
sind zu verifizieren.<br />
67 SR variable is empty Der angegebene variable String ist leer.<br />
68 reserviert.<br />
69 wrong slave nr /<br />
command<br />
Der angegebene Slave ist ungültig oder<br />
der Slave-Befehl ist falsch oder wird<br />
nicht erkannt.<br />
70 wrong DPRAM data count Falsche Anzahl von Daten-Elementen im<br />
DP-RAM bei der Kommunikation mit<br />
einem PAC. Mögliche Ursachen sind ein<br />
Kommunikations-Fehler oder fehlerhafte<br />
Deklarationen in.PAC_DEF.<br />
71 wrong slave response Die Antwort des Slaves wird von der<br />
Laufzeit-Umgebung nicht verstanden,<br />
oder der Slave konnte den gesendeten<br />
72 Fatal programm invalid by<br />
D999<br />
Befehl nicht verstehen.<br />
Durch Hochsetzen des Fehlermerkers<br />
D999 (z.B. durch den Debugger) wird ein<br />
Programm für ungültig erklärt. Der<br />
Bediener wünscht als quasi den fatalen<br />
Fehler.<br />
73 Fatal program index invalid Der Befehl JUMP versucht an eine<br />
ungültige Stelle zu verzweigen, meist<br />
wegen eines Compiler-Fehlers.<br />
74 TINP allocation failed Die Laufzeit-Umgebung kann TINP nicht<br />
ausführen, da zu wenig freier Speicher<br />
zur Verfügung steht.<br />
75 TINP not allowed Der TINP Befehl darf im Programm nur<br />
in Backround-, Funktions- und normalen<br />
76 slv QUITT and COMM<br />
zero<br />
Tasks verwendet werden.<br />
Fehler bei der Kommunikation mit Slave<br />
oder PAC. Konkret erwartet die Laufzeit-<br />
Umgebung eine Antwort, der Regler<br />
jedoch einen Befehl.<br />
77 write to slv comm err Fehler bei der Kommunikation mit einem<br />
Slave oder PAC. Die Nummer des<br />
Befehls wird nicht verstanden.<br />
78 wrong slave response Fehler bei der Kommunikation mit einem<br />
Slave oder PAC. Die Laufzeit-Umgebung<br />
kann die Antwort nicht verwenden.<br />
79 - 86 PAC Profibus Überwachung. Lösen keinen<br />
Systemfehler aus.<br />
87 wrong PAC number Die verwendete PAC-Nummer ist falsch.<br />
88 PAC Profibus Überwachung. Löst keinen<br />
Systemfehler aus.<br />
Die Systemfehler-Nummern 79 bis 88 werden von der PAC Profibus Überwachung<br />
verwendet. Mit Ausnahme des Fehlers 87 lösen sie keinen Systemfehler aus,<br />
sondern verändern lediglich SW001, die Nummer des letzten Systemfehlers. Zudem<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 290/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
wird der Befehl wiederholt. Die Bedeutung kann aus folgender Tabelle entnommen<br />
werden:<br />
79 checksum error received in<br />
PAC<br />
80 checksum error received in<br />
<strong>ECCO</strong><br />
81 wrong parameter received in<br />
PAC<br />
82 wrong commands received in<br />
PAC<br />
83 wrong byte counts received<br />
in <strong>ECCO</strong><br />
Der PAC erhielt ein Paket mit falscher<br />
Prüfsumme; vermutlich aufgrund eines<br />
Übertragungsfehlers.<br />
<strong>ECCO</strong> erhielt vom PAC ein Paket mit<br />
einer falschen Prüfsumme; vermutlich<br />
ein Übertragungsfehler.<br />
<strong>ECCO</strong> sendete ungültige Parameter.<br />
Dies löst keinen eigentlichen Systemfehler<br />
aus, sondern lässt den Task auf der<br />
fehlerhaften Instruktion stehen.<br />
<strong>ECCO</strong> sendete einen ungültigen Befehl.<br />
Dies löst keinen Systemfehler aus, sondern<br />
lässt einfach den Task auf der<br />
fehlerhaften Instruktion stehen.<br />
Der PAC sendete eine falsche Anzahl<br />
Antwortbytes. Dies weist auf einen<br />
Fehler in .PAC_DEF hin.<br />
84 timeout Zeitüberlauf bei der Kommunikation mit<br />
dem PAC.<br />
85 unknown PAC answer <strong>ECCO</strong> kann die Antwort des PAC nicht<br />
interpretieren; vermutlich aufgrund eines<br />
86 wrong values received from<br />
Übertragungsfehlers.<br />
Werte in der Antwort des PAC sind<br />
PAC<br />
ungültig.<br />
88 internal PAC error Interner PAC-Fehler.<br />
Die Anzahl der aufgetretenen Fehler kann aus den entsprechenden Systemregistern<br />
ermittelt werden.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 291/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. 7. Befehle an Servo-Slaves und PAC<br />
Die Befehle zur Konfiguration und zum Betrieb von Servo-Slaves oder dem PAC<br />
werden mit einem Baugruppen-spezifischen Bezeichner verwendet; dieser<br />
Bezeichner ist quasi ein Befehl innerhalb des Befehls und wird hier zu jedem Befehl<br />
erläutert.<br />
Folgende Befehle sind davon betroffen:<br />
221 SV_COM<br />
225 SV_CONST<br />
227 SV_READ<br />
228 SV_TRJ<br />
Bezeichner bei SV_COM<br />
SV_COM , <br />
Slave PAC<br />
DFH � � (Define Home). Die momentane Position wird zum<br />
Ursprung (Wert 0).<br />
DYLIM_OFF � Dynamische Berechnung des Integrallimits aus.<br />
DYLIM_ON � Dynamische Berechnung des Integrallimits ein.<br />
HALT � � Stoppt die geregelte Achse mit der programmierten<br />
Beschleunigung.<br />
INIT_B � � Sucht den Referenzinitiator rückwärts.<br />
INIT_F � � Sucht den Referenzinitiator vorwärts.<br />
MOFF � � Stoppt die geregelte Achse durch Setzen des<br />
Sollwertes auf 0V, also spannungslos.<br />
P_MODE � � Regelung im Positioniermodus. (Default-Verhalten)<br />
R4_OFF � Relais 4 (Reserve) aus.<br />
R4_ON � Relais 4 (Reserve) ein.<br />
RESET � � Initialisiere Servo-Regler. Alle Werte werden auf die<br />
Werkseinstellungen zurückgesetzt.<br />
S � S-Kurve.<br />
SIP � � Speichere Position bei nächstem Index-Impuls.<br />
ST_OFF � Statistik aus.<br />
ST_ON � Statistik ein.<br />
STOP � � Stoppt die Achse mit maximaler Beschleunigung.<br />
STT � � Die aktuellen Bewegungsparameter (gesetzt durch den<br />
Befehl SV_TRJ) werden aktualisiert und der Antrieb der<br />
geregelten Achse startet.<br />
SV_OFF � � Servoverstärker aus; das entsprechende Relais fällt ab.<br />
SV_ON � � Servoverstärker ein; das entsprechende Relais zieht<br />
an.<br />
T � Trapezkurve.<br />
UDF � � Die neuen Filterparameter (gesetzt mit dem Befehl<br />
SV_FIL) werden aktiviert.<br />
VB_MODE � � Regelung im Geschwindigkeits-Modus rückwärts.<br />
VF_MODE � � Regelung im Geschwindigkeits-Modus vorwärts.<br />
Z � Max_Min Werte auf 0 zurück setzen.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 292/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Bezeichner bei SV_CONST<br />
SV_CONST , , <br />
Slave PAC<br />
PERR � � Maximal zulässiger Schleppfehler. Wird der Wert<br />
überschritten, so wird der Motor angehalten und das<br />
zugehörige Relais fällt ab.<br />
PF � � Proportionalfaktor, um in benutzerdefinierten Einheiten<br />
arbeiten zu können. soll ein FW Register sein.<br />
Es gilt: PF = Messauflösung / Benutzereinheit.<br />
POS_OFFSET � � Offset-Korrektur des Messystems in Benutzereinheiten.<br />
Wird beim Nullen der Achse zurückgesetzt.<br />
POS_TIME � � Zulässige Zeit zur Positionierung der Achse in<br />
Hundertstel-Sekunden. Wird die Soll-Position in der<br />
angegebenen Zeit nicht erreicht, wird das TIME-Bit im<br />
STATUS Register gesetzt.<br />
POS_TOL � � Positionstoleranz. Die Achse muss innerhalb der<br />
Toleranz positioniert sein, damit das POSOK-Bit im<br />
STATUS Register gesetzt wird.<br />
ZV � � Geschwindigkeit, mit welcher der Referenzinitiator<br />
angefahren wird.<br />
ZVS � � Geschwindigkeit, mit welcher vom Referenzinitiator<br />
weggefahren wird.<br />
Bezeichner bei SV_READ<br />
SV_READ , , <br />
Slave PAC<br />
D � Differenzial-Faktor.<br />
D_POS � � Soll-Position.<br />
D_VEL � � Soll-Geschwindigkeit.<br />
I � Integral-Faktor.<br />
IL � � Wert der Integrationslimite.<br />
IL_IN � Limit für den Integral-Faktor.<br />
IL_MAX � Maximales Limit für Integral-Faktor.<br />
IND_POS � � Wert des Index Positionsregisters.<br />
MAX_ISUM � Maximaler Wert des Integral-Anteils.<br />
MAX_PERR � Maximaler Positionsfehler.<br />
MAX_RPOS � Maximale Position.<br />
MAX_RVEL � Maximale Geschwindigkeit.<br />
MAX_VERR � Maximaler Geschwindigkeits-Fehler.<br />
MIN_ISUM � Minimaler Wert des Integral-Anteils.<br />
MIN_PERR � Minimaler Positionsfehler.<br />
MIN_RPOS � Minimale Position.<br />
MIN_RVEL � Minimale Geschwindigkeit.<br />
MIN_VERR � Minimaler Geschwindigkeits-Fehler.<br />
NA � Negative Beschleunigung beim Anfahren.<br />
ND � Negative Beschleunigung beim Bremsen.<br />
NEW_STATUS � Neues Statusregister. Die genaue Bedeutung ist dem<br />
Handbuch zum PAC zu entnehmen.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 293/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Slave PAC<br />
P � Proportional-Faktor.<br />
PA � Positive Beschleunigung beim Anfahren.<br />
PD � Positive Beschleunigung beim Bremsen.<br />
PERR � Wert des Positionsfehlers.<br />
R_POS � � Ist-Position.<br />
R_VEL � � Ist-Geschwindigkeit.<br />
REGISTER � � Bitfeld, welches den Zustand des Servo-Reglers<br />
angibt. Die Bedeutung der einzelnen Bits ist weiter<br />
unten angegeben.<br />
STATUS � � Bitfeld, welches den Zustand des Servo-Reglers angibt<br />
und dazu dient, die Kommunikation zu überprüfen. Die<br />
Bedeutung der einzelnen Bits wird weiter unten<br />
angegeben.<br />
SUM_ABS_<br />
� Summe der absoluten Positionsfehler. Kann zur<br />
PERR<br />
Optimierung der Filterparameter verwendet werden.<br />
V_ERR � Wert des momentanen Geschwindigkeits-Fehlers.<br />
VEL_MAXIN � Wert der vom Benutzer angegebenen maximalen<br />
Geschwindigkeit.<br />
Das Bitfeld, welches REGISTER zurück liefert, hat folgende Bedeutung:<br />
Bit 31 Servo-Stop. Wird von STT zurückgesetzt; hoch, wenn ein Endschalter<br />
erreicht wurde.<br />
Bit 30 Time-Bit. Wird von STT zurückgesetzt; hoch, wenn die Position in der<br />
gegebenen Zeit nicht erreicht wurde.<br />
Bit 29 Pos-Bit. Wird von STT zurückgesetzt; hoch, wenn die Bremsrampe<br />
fertig gefahren wurde und die Achse innerhalb der Positionierungs-<br />
Toleranz ist.<br />
Bit 28 Hoch, wenn die Achse initialisiert wurde.<br />
Bit 27 Endschalter E2 (positive Richtung) für Servo-Regler 3.<br />
Bit 26 Endschalter E1 (negative Richtung) für Servo-Regler 3.<br />
Bit 25 Endschalter E2 (positive Richtung) für Servo-Regler 2.<br />
Bit 24 Endschalter E1 (negative Richtung) für Servo-Regler 2.<br />
Bit 23 (Reserviert)<br />
Bit 22 Freigabe für Verstärker von Servo 3 erteilt.<br />
Bit 21 Freigabe für Verstärker von Servo 2 erteilt.<br />
Bit 20 Freigabe für Verstärker von Servo 1 erteilt.<br />
Bit 19 Endschalter E2 (positive Richtung) für Servo-Regler 1.<br />
Bit 18 Endschalter E1 (negative Richtung) für Servo-Regler 1.<br />
Bit 17 Referenzinitiator für Servos 2 und 3 initialisiert.<br />
Bit 16 Referenzinitiator für Servo 1 initialisiert.<br />
Bit 15 Host Interrupt.<br />
Bit 14 Beschleunigung geladen (aber noch nicht aktualisiert).<br />
Bit 13 UDF ausgeführt (Filter noch nicht aktualisiert).<br />
Bit 12 Positive Richtung; vorwärts.<br />
Bit 11 Regelung im Geschwindigkeits-Modus.<br />
Bit 10 Am Ziel.<br />
Bit 9 Aus nach übermässigem Positionsfehler.<br />
Bit 8 8-Bit Ausgabe-Modus.<br />
Bit 7 Motor aus.<br />
Bit 6 Interrupt: Breakpoint erreicht.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 294/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Bit 5 Interrupt: Übermässiger Positionsfehler.<br />
Bit 4 Interrupt: Numerischer Überlauf.<br />
Bit 3 Interrupt: Index-Impuls erfasst.<br />
Bit 2 Interrupt: Trajektorie abgeschlossen.<br />
Bit 1 Interrupt: Falscher oder ungültiger Befehl.<br />
Bit 0 Erfasse nächsten Index-Impuls (beim SIP Befehl).<br />
Das Bitfeld, welches STATUS zurück liefert, hat folgende Bedeutung:<br />
Bit 7 Motor aus.<br />
Bit 6 Interrupt: Breakpoint erreicht.<br />
Bit 5 Interrupt: Übermässiger Positionsfehler.<br />
Bit 4 Interrupt: Numerischer Überlauf.<br />
Bit 3 Interrupt: Index-Impuls erfasst.<br />
Bit 2 Interrupt: Trajektorie abgeschlossen.<br />
Bit 1 Interrupt: Falscher oder ungültiger Befehl.<br />
Bit 0 Busy-Bit. Beschäftigt; am Arbeiten.<br />
Weiterführende Informationen sind dem Datenblatt des Servo-Reglers zu<br />
entnehmen:<br />
[4] LM628 Precision Motion Controller Datasheet, National Semicondctor,<br />
erhältlich unter http://www.national.com/ds/LM/LM628.pdf.<br />
Bezeichner bei SV_TRJ<br />
SV_COM , , <br />
Slave PAC<br />
A � � Setzt die absolute Beschleunigung (wird nur akzeptiert,<br />
wenn die Achse gestoppt ist, und muss stets grösser<br />
Null sein).<br />
AR � � Setzt die relative Geschwindigkeit (wird nur akzeptiert,<br />
wenn die Achse gestoppt ist, und muss stets grösser<br />
Null sein).<br />
NA � Setzt die negative Beschleunigung beim Anfahren.<br />
NAR � Setzt die relative negative Beschleunigung beim<br />
Anfahren.<br />
ND � Setzt die negative Beschleunigung beim Bremsen.<br />
NDR � Setzt die relative negative Beschleunigung beim<br />
Bremsen.<br />
PA � Setzt die positive Beschleunigung beim Anfahren.<br />
PAR � Setzt die relative positive Beschleunigung beim<br />
Anfahren.<br />
PD � Setzt die negative Beschleunigung beim Bremsen.<br />
PDR � Setzt die relative negative Beschleunigung beim<br />
Bremsen.<br />
V � � Setzt die absolute Geschwindigkeit (muss stets grösser<br />
Null sein).<br />
VR � � Setzt die relative Geschwindigkeit (muss stets grösser<br />
Null sein).<br />
X � � Setzt die absolute Position, den Weg.<br />
XR � � Setzt die relative Position, den Weg.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 295/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. 8. Der <strong>ECCO</strong> Debugger<br />
Der <strong>ECCO</strong> Debugger ist ein Windows Programm, mit dem sich der Programmablauf<br />
eines <strong>ECCO</strong> Anwenderprogramms testen lässt. Mit Hilfe dieser Software ist es möglich,<br />
sich alle Befehlszeilen anzeigen zu lassen, die im Moment abgearbeitet werden.<br />
Einrichten des Debuggers<br />
Der Debugger wird standardmässig mit <strong>ECCO</strong> installiert und kann über das Start-<br />
Menü gestartet werden. Damit der Debugger eine Verbindung zu <strong>ECCO</strong> aufnehmen<br />
kann, muss zuerst die Schnittstelle konfiguriert werden. Die Einstellungen finden sich<br />
im unter „<strong>ECCO</strong>“ im Menupunkt „Settings“. Solange die Steuerung nicht ändert, müssen<br />
die Einstellungen nicht erneut eingegeben<br />
werden.<br />
Es bestehen drei Möglichkeiten, den Debugger<br />
mit <strong>ECCO</strong> zu verbinden. Zunächst gibt es die<br />
Möglichkeit „Serial line connection“: Hier müssen<br />
unter „Port-Nr.“ die Nummer des Anschlusses<br />
angegeben werden, an welchem der<br />
Debugger über das Nullmodem-Kabel angeschlossen<br />
ist, und die korrekte Baudrate. Die<br />
anderen Punkte müssen in der Regel nicht<br />
geändert werden.<br />
Als zweites gibt es die Möglichkeit „Ethernet<br />
connection“: Diese Verbindung benötigt lediglich<br />
die IP-Adresse des Rechners, auf dem<br />
<strong>ECCO</strong> abläuft. Diese Möglichkeit wird empfoh-<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 296/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
len, wenn <strong>ECCO</strong> auf einem anderen Rechner als der Debugger läuft.<br />
Zuletzt steht noch der Punkt „Memory Connection“ zur Auswahl: Sind der Debugger<br />
und das <strong>ECCO</strong>-Programm auf demselben Rechner installiert, kann diese Option verwendet<br />
werden. Sie konfiguriert sich selbständig.<br />
Zusätzlich muss die Datei mit dem Quelltext ausgewählt werden, damit der Debugger<br />
diesen anzeigen kann. Das Programm muss entsprechend kompiliert worden sein.<br />
Task auswählen<br />
Es gibt zwei Arten in das Fenster zu<br />
gelangen, in dem die momentan aktiven<br />
Tasks angezeigt werden. Die erste<br />
Variante ist im Menu „Navigation“ unter<br />
„Task selection“ die Auswahl zu aktivieren.<br />
Die zweite Variante besteht im Drücken der<br />
Taste „F8“. Beide Varianten führen zum<br />
selben Ergebnis, welches nebenstehend<br />
gezeigt ist.<br />
Das Auswahl-Fenster zeigt die Anzahl der<br />
momentan aktiven Tasks an, sowie die<br />
gegenwärtigen Programmzeilen der einzelnen<br />
Tasks; dessen Art wird durch die farbige<br />
Buchstabenkombination gezeigt. Ebenso<br />
wird dargestellt, welcher Task durch<br />
welchen blockiert wird.<br />
„Refresh“ aktualisiert die Angaben im Fenster.<br />
Mit „OK“ gelangt man zur markierten<br />
Zeile im Debuggerfenster, wo der gesamte<br />
Quellcode eingesehen werden kann.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 297/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Will man eine Befehlszeile genauer betrachten, kann man diese in der Taskauswahl<br />
anklicken. Sie bleibt dann blau markiert. Um den Quellcode anzusehen, reicht es,<br />
„OK“ zu drücken. Der ausgesuchte Befehl wird dann mit roter Schrift hervorgehoben<br />
und die Zeile grau hinterlegt.<br />
Aktuellen Taskpointer neu einlesen<br />
Durch Drücken von „F5“ liest der Debugger den aktuellen Befehl des aktuell<br />
ausgewählten Task ein.<br />
Um ein Gefühl für den zeitlichen Ablauf zu erfalten, kann der aktuelle Taskpointer<br />
zudem permanent eingelesen werden. Dafür existiert die Tastenkombination „Ctrl<br />
F5“. Damit liest der Debugger permanent den Taskpointer ein. Es ist jedoch zu<br />
beachten, dass der Debugger nicht alle ausgeführten Befehle einzulesen vermag;<br />
das kann nur der Tracer!<br />
Um zum nächsten parallel ablaufenden Task umzuschalten, gibt es zwei<br />
Möglichkeiten. Entweder über das Menu „Navigation“ mit dem Punkt „Next Task<br />
display“, oder über die Tastenkombination „Alt T“. Beim Umschalten aktualisiert<br />
Debugger die Taskpointer nicht.<br />
Menustruktur<br />
Das Menu „File“ ist in 3 Bereiche unterteilt. Im<br />
ersten Bereich sind die Befehle zum Öffnen und<br />
Einloggen angeordnet. Im mittleren Bereich<br />
werden die zuletzt verwendeten <strong>ECCO</strong><br />
Quelldateien aufgelistet. Der Punkt „Cancel“<br />
beendet den Debugger.<br />
Mit „Open“ wird der Quelltext des aktuellen<br />
Programms eingelesen. Dabei handelt es sich um<br />
die vom Programmierer erstellte .ecc Datei.<br />
Der Befehl „Info Menu“ sollte Informationen zum<br />
vorliegenden <strong>ECCO</strong>-File ausgeben; diese Funktionalität<br />
ist jedoch nicht implementiert.<br />
Mittels „Login“ loggt sich der Benutzer ein. Nur als<br />
eingeloggter User kann er den Zustand in der<br />
angeschlossenen <strong>ECCO</strong> ändern.<br />
Das Menu „Navigation“ beherbergt die Befehle,<br />
die im Fenster des Debuggers benötigt werden.<br />
Die oberen drei Punkte sind jederzeit einsetzbar,<br />
die beiden letzten nur dann, wenn Verbindung zu<br />
einer <strong>ECCO</strong>-Steuerung besteht.<br />
Der Menupunkt „<strong>ECCO</strong>“ beinhaltet die gesamte Kommunikation mit der <strong>ECCO</strong><br />
Steuerung. Einzelne, nicht selbsterklärende Befehle werden nachfolgend erläutert.<br />
Das Untermenu „Reading“ ermöglicht das Lesen von Eingängen, Ausgängen,<br />
Merkern, Fehlermerkern, RV, RW, AV, AW, SW und SR Registern aus der<br />
angeschlossenen Steuerung.<br />
Das Untermenu „Writing“ öffnet ein Untermenu zum Beschreiben von Ausgängen,<br />
Merkern, Fehlermerkern, RV, RW, AV, AW und SR Registern. Um Werte in einer <strong>ECCO</strong><br />
schreiben zu können muss der Benutzer eingeloggt sein.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 298/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
„Status“ öffnet ein neues Fenster, welches den<br />
Betriebszustand der <strong>ECCO</strong> anzeigt.<br />
Der Befehl „Register Limits“ zeigt die im <strong>ECCO</strong>-<br />
Programm definierten Limiten der RV- und RW-<br />
Register an.<br />
„<strong>ECCO</strong> Terminal control“ öffnet ein Fenster, mit<br />
dem man die <strong>ECCO</strong>-Steuerung fern bedienen<br />
kann. Der Befehl ist quasi die aktive Variante zu<br />
„Status“. Man kann zum Beispiel die laufende<br />
<strong>ECCO</strong> stoppen, um ein neues Programm zu<br />
laden. Die Fernbedienung kann nur zwischen dem<br />
Automatik- und dem manuellen Modus hin- und<br />
herwechseln. Da der Zustand der <strong>ECCO</strong><br />
verändert werden kann bedarf das Benutzen<br />
dieser Funktion ein Einloggen.<br />
Der Menupunkt „Regsave“ speichert die<br />
Registerwerte in ein File und ermöglicht<br />
gleichzeitig das Zurücklesen.<br />
Der Menupunkt „View“ weist die für Windows-<br />
Programme typischen Befehle zum Öffnen und<br />
Anordnen von Fenstern auf. Der Menupunkt<br />
„Extras“ ermöglicht es zuletzt, Compiler und Loader aus dem Debugger zu bedienen,<br />
so dass der Debugger zur umfassenden Entwicklungsumgebung würde.<br />
Für zusätzliche Informationen sei auf die Dokumentation [8] verwiesen.<br />
5. 9. Der <strong>ECCO</strong> Profiler<br />
Der <strong>ECCO</strong> Profiler ist ein Windows Programm, das die Befehlsabläufe eines <strong>ECCO</strong><br />
Anwenderprogramms in Abhängigkeit der Zeit visualisiert. Damit ist es möglich, zeitliche<br />
Abläufe von Befehlsfolgen in <strong>ECCO</strong> aufzuzeigen und zu analysieren. So kann<br />
man Probleme, die durch die zeitliche Verzahnung einzelner Befehle auftreten, einfach<br />
erkennen und beheben. Zusätzlich erleichtert der Profiler die Taktzeitoptimierung<br />
auch komplexer Hochleistungs-Anlagen.<br />
In den Vorgängergenerationen las der Profiler eine dezidierte Hardware-Komponente<br />
aus, die Tracer hiess. Dieser Tracer erfasste die Daten in Echtzeit aus der Steue-<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 299/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
rung. In <strong>ECCO</strong> ist dieses Konzept mehrheitlich beibehalten worden, wenngleich der<br />
Tracer nur mehr eine Softwarekomponente ist, welche in <strong>ECCO</strong> integriert wurde.<br />
Das Vorgehen zum generieren einer Trace-Aufzeichnung besteht grob darin, den<br />
Tracer zu aktivieren, die Aufzeichnung bei Bedarf (also beispielsweise bei einem<br />
interessanten Ereignis) zu stoppen und dann auszulesen.<br />
Eine Trace-Aufzeichnung kann rund 130 Tausend Ereignisse beinhalten; ein zyklischer<br />
Buffer sorgt dafür, dass die aktuellsten Ereignisse erfasst werden.<br />
Starten und Konfigurieren<br />
Im Startmenu befindet sich ein Eintrag, über den<br />
der Profiler gestartet werden kann. Nach dem<br />
Starten ist der Profiler leer, da noch kein Target<br />
geöffnet wurde. Ein Target ist die Verknüpfung<br />
zwischen einzulesendem Trace-File und dem<br />
Quelltext des Anwender-Programms.<br />
Um überhaupt Trace-Files einlesen zu können,<br />
muss beim ersten Start die Schnittstelle zu<br />
<strong>ECCO</strong> konfiguriert werden. Die so aufgebaute<br />
Verbindung kann über eine serielle Schnittstellt,<br />
über TCP/IP oder über DP-RAM erfolgen.<br />
Der Punkt „Serial Port“ aktiviert und konfiguriert<br />
die serielle Schnittstelle. Die „Port Nr.“ entspricht dem COM-Port, an welchem der<br />
Tracer über das Nullmodem-Kabel angeschlossen ist. Die Baudrate, die Parität und<br />
die Bits je Wort müssen mit der Konfiguration des Tracers übereinstimmen. Bei<br />
Fehlern wird beim Schliessen des Fensters oder beim Versuch Daten zu lesen eine<br />
Fehlermeldung erscheinen.<br />
Für eine TCP/IP-Verbindung genügt es, die Adresse der <strong>ECCO</strong>, dessen Tracer<br />
ausgelesen werden soll, in das Feld „TCP/IP address“ einzutragen.<br />
Der letzte Punkt „Internal memory connection“ ermöglicht es, den Tracer der <strong>ECCO</strong><br />
auf dem lokalen PC über DP-RAM auszulesen. Diese Verbindungsart ist selbstkonfigurierend.<br />
Um einen Trace einzulesen, ist es, wie bereits<br />
geschrieben, notwendig, dass ein Target angelegt<br />
wurde. Das Target legt sozusagen das Ziel<br />
fest, das anschliessend analysiert werden soll.<br />
Das Target enthält spezifische Informationen<br />
über den Trace. Um ein neues Target zu erstellen,<br />
wird unter „Datei“ der Menupunkt<br />
„Neues Target“ gewählt.<br />
Voraussetzungen für ein korrektes Target sind,<br />
dass das Sourcefile und das Debugfile sich im<br />
selben Verzeichnis befinden, und dass ein gültiges<br />
Sourcefile gewählt ist. Ein gültiges<br />
Sourcefiles ist ein Anwenderprogramm,<br />
welches auf der auszulesenden <strong>ECCO</strong>-<br />
Steuerung lauffähig ist.<br />
Da zu einem Target mehrere Aufzeichnungen<br />
abgelegt werden können, wird zudem das Ver-<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 300/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
zeichnis angegeben, in dem dies geschehen soll. Dazu kann unter „Durchsuchen“<br />
einfach irgendeine Datei im gewünschten Verzeichnis markiert werden.<br />
Nach erfolgreichem Ausfüllen des Dialog-Feldes und Bestätigen mit OK fragt der<br />
Profiler, wohin das Target gespeichert werden soll.<br />
Der Profiler ist jetzt bereit für den ersten Trace. Um die Einstellungen zu überprüfen<br />
kann unter „Tracer“ der Menupunkt „Konfiguration“ gewählt werden. Damit lässt sich<br />
auch die Auflösung beim Auslesen beeinflussen.<br />
Aufzeichnen und Auslesen eines Trace<br />
In <strong>ECCO</strong> wird das Aufzeichnen durch verschiedene Systemflags beeinflusst. Dies<br />
sind namentlich:<br />
M017 Trace Programm, bei H.<br />
M018 Programmtasks nicht tracen, falls H.<br />
M019 Backgroundtasks nicht tracen, falls H.<br />
M020 PSL-Trace nicht tracen, falls H.<br />
M021 Displaytask nicht tracen, falls H.<br />
M022 Fehlertask nicht tracen, falls H.<br />
M023 Funktionstask nicht tracen, falls H.<br />
Um eine Aufzeichnung zu starten, wird zunächst festgelegt, was aufgezeichnet werden<br />
soll und was nicht, indem die Merker M018 bis M023 entsprechend gesetzt werden.<br />
Danach wird die Aufzeichnung gestartet, indem der Merker M017 hoch gesetzt<br />
wird. Die Aufzeichnung wird beendet, sobald der Merker M017 tief gesetzt wird; dies<br />
geschieht automatisch im Systemfehler. Ansonsten kann der Merker natürlich über<br />
das Terminal oder den Debugger gesetzt werden, ebenso wie direkt vom Anwenderprogramm.<br />
Indem nur die Tasks aufgezeichnet werden, die interessieren, steigt die Aufzeichnungsdauer<br />
der verbleibenden Tasks an.<br />
Ist der Profiler korrekt konfiguriert und besitzt ein passendes Target, dann kann man<br />
über das Menü „Tracer“ oder über den Button die Daten auslesen. Falls der Datenpuffer<br />
im Tracer leer ist, wird der Vorgang mit einer entsprechenden Meldung<br />
abgebrochen.<br />
Da das Auslesen längere Zeit beanspruchen kann, insbesondere über die serielle<br />
Verbindung, erscheint während dem Auslesen ein Dialog, der über den Fortschritt informiert;<br />
konkret über die Anzahl der schon übertragenen Programmschritte und die<br />
voraussichtlich noch verbleibende Zeit. Mit einer seriellen Schnittstelle kann bei<br />
38’400 Baud die Übertragung über 6 Minuten dauern. Eine laufende Datenübertragung<br />
kann jederzeit abgebrochen werden. Die bis zum Abbruch gelesenen Daten<br />
werden dann aber ignoriert.<br />
Arbeiten mit einer Trace-Aufzeichnung<br />
Nachdem eine Trace-Aufzeichnung vom Target ausgelesen oder eine gespeicherte<br />
Aufzeichnung direkt eingelesen wurde, kann sie analysiert werden, was ja die eigentliche<br />
Aufgabe im Profiler darstellt.<br />
For jeden Task wird dessen Tasknummer angegeben; die Zuordnung wurde dabei<br />
von <strong>ECCO</strong> vorgenommen. Sie wird beim Befehl TASK_OPEN auf Seite 231 ausführlich<br />
besprochen.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 301/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Die einzelnen Befehle werden farbig dargestellt. Die Farbzuordnung kann angezeigt<br />
werden, indem mit der rechten Maustaste das Popup-Menu geöffnet und daraus der<br />
Befehl „Farblegende“ ausgewählt wird.<br />
Wenn nach dem Auslesen das neue Fenster erscheint, ist der gesamte Wertebereich<br />
sichtbar. Das Programm stellt die Daten mit minimalem Zoom dar. Mit den Tasten<br />
Plus und Minus auf dem numerischen Block kann man zoomen. Zudem lässt sich<br />
über die Pfeiltasten der angezeigte Bereich verschieben. Nachfolgend eine Übersicht<br />
über die verwendeten Tasten:<br />
+ Plus Hineinzoomen (nur auf dem numerischen Block).<br />
– Minus Rauszoomen (nur auf dem numerischen Block).<br />
� Eine Auflösung nach rechts.<br />
� Eine Auflösung nach links.<br />
Ctrl � Eine Seitenbreite nach rechts.<br />
Ctrl � Eine Seitenbreite nach links.<br />
� Eine Tasknummer nach oben.<br />
� Eine Tasknummer nach unten.<br />
PgUp Eine Seite nach oben.<br />
PgDn Eine Seite nach unten.<br />
Home Zum Anfang (Beginn der Aufzeichnung oben).<br />
End Zum Ende (Ende der Aufzeichnung unten).<br />
Durch Doppelklick auf einen Programmschritt erscheint der Quelltext. Da das Quelltextfenster<br />
nur dann in den Vordergrund tritt, wenn es noch nicht offen ist, muss man,<br />
damit es immer im Vordergrund bleibt, im Kontextmenü den Punkt „Quellcode im<br />
Vordergrund“ markieren. Die zum Programmschritt gehörende Zeile ist im Quellcodefenster<br />
grau hinterlegt.<br />
Im Kontextmenu kann zudem das Step-<br />
Info Fenster geöffnet werden. Dieses enthält<br />
genaue Angaben über den Schritt, an<br />
welchem sich der Mauszeiger beim Öffnen<br />
des Kontextmenüs befand.<br />
Die Statuszeile enthält Informationen über<br />
den Namen des aktiven Targets und die<br />
aktuelle Position des Mauszeigers in Sekunden. Dies ist die Zeit seit dem Ausführen<br />
des ersten Befehls des Traces und stimmt mit jener der X-Achse überein. Dieses<br />
Feld kann wichtig sein, falls man den Sichtbereich nach unten scrollt und so die<br />
Beschriftung der X-Achse verschwindet. So ist es trotzdem möglich, die aktuelle<br />
Position im Feld zu bestimmen.<br />
Schrittweises Betrachten eines Tasks<br />
Um das genaue Ablaufverhalten eines einzelnen Tasks nachvollziehen zu können,<br />
besteht die Möglichkeit zur schrittweisen Analyse der einzelnen gespeicherten<br />
Programmschritte.<br />
Wenn ein Befehl durch Doppelklicken mit der linken Maustaste ausgewählt wurde,<br />
markiert ihn der Profiler, indem der Programmschritt in der Zeitdarstellung schwarz<br />
überstrichen wird. Durch Betätigen der Taste „F10“ kann die schwarze Markierung<br />
zum nächsten Programmschritt verschoben werden. Dadurch wird im Quellcode-<br />
Fenster automatisch die diesem Schritt entsprechende Programmzeile markiert.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 302/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
Ausführung einer Programmzeile<br />
Oft interessiert, wann eine bestimmte Programmzeile ausgeführt wurde. Dies ist im<br />
Profiler einfach möglich, indem im Quelltext-Fenster die gewünschte Programmzeile<br />
markiert und im Kontext-Menü „Programmschritte hervorheben“ gewählt wird. Jede<br />
Ausführung dieser Befehlszeile wird nun im Zeitdiagramm mit rot überstrichen.<br />
Die Markierungen sind in jeder Zoom-Stufe sichtbar, so dass sie immer entdeckt<br />
werden.<br />
5. 10. Application Programming Interface<br />
<strong>ECCO</strong> verfügt über eine ausgereifte API, welche es einem Programmierer ermöglicht,<br />
auf einfache Art und Weise mit eigenen Programmen auf die <strong>ECCO</strong> zuzugreifen,<br />
um so die Funktionalität für die eigenen Bedürfnisse zu erweitern. Sie stellt dem<br />
Entwickler eine einheitliche, offene Programmierschnittstelle zur Kommunikation mit<br />
den Steuerungen der Firma <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong> zur Verfügung.<br />
Diese API nennt sich SMC_API und ist in groben Zügen vom Interface her abwärtskompatibel<br />
mit den Versionen älterer Generationen.<br />
Die 32bit Windows-Anwendung kann in einer beliebigen Programmiersprache<br />
entwickelt werden, sofern diese den Aufruf von DLL’s erlaubt. Die Anwendung<br />
kommuniziert dann mit der <strong>ECCO</strong>-Steuerung über die exportierten Funktionen der<br />
API, welche als DLL implementiert ist.<br />
High-Level Funktionen dienen zur direkten Ausführung bestimmter Aktionen unter<br />
Angabe der entsprechenden Parameter. Zusätzlich existieren Low-Level Funktionen,<br />
welche lediglich ein von der Applikation vorbereitetes Datentelegramm an die <strong>ECCO</strong><br />
Steuerung weiterleiten.<br />
Das API unterstützt das gleichzeitige Öffnen mehrerer verschiedener Schnittstellen<br />
durch eine oder mehrere Applikationen. Alle geöffneten Schnittstellen können dann<br />
ohne spezielle Synchronisation gleichzeitig verwendet werden, also auch durch mehrere<br />
Threads. Nicht unterstützt wird das mehrfache Öffnen einer Schnittstelle durch<br />
den selben oder einen anderen Prozess.<br />
Für weitere Informationen sei auf die Dokumentation der SMC_API in [12] verwiesen.<br />
SMC_API für SMC-Steuerungen<br />
Die nachfolgende Übersicht gibt Auskunft über die von der Firma <strong>Horsch</strong> <strong>Elektronik</strong><br />
<strong>AG</strong> unterstützten Versionen für die SMC-Steuerungen.<br />
SMC42 SMC_API.dll, 19.06.2002; keine Versionsnummer angegeben<br />
SMC42-800k SMC_API.dll, 01.12.2004; Version 1.5.0.1<br />
Für <strong>ECCO</strong> muss jeweils die vom Setup installierte Version verwendet werden, daher<br />
erübrigt sich eine Angabe.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 303/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
5. 11. Bibliographie<br />
Weiterführende Literatur über spezifische Slaves und ihre Anbindung:<br />
[1] Anbindung Balluff IDEX BIS S 6002 und BIS C 6002 an <strong>ECCO</strong>, <strong>Horsch</strong><br />
<strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
[2] Anbindung P<strong>AG</strong>O-Drucker an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02,<br />
2004.<br />
[3] Anbindung VI Terminal an <strong>ECCO</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 0.02, 2004.<br />
[4] LM628 Precision Motion Controller Datasheet, National Semicondctor,<br />
erhältlich unter http://www.national.com/ds/LM/LM628.pdf.<br />
Literatur zur Verwendung des PAC:<br />
[5] PAC Handbuch, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.01, 2001.<br />
Zur Verwendung der Statistik-Sortware STATREAD und ZPoint:<br />
[6] STATREAD – User’s Guide, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.26, 1997.<br />
[7] STATREAD + STATCALC – Configuration and Technical Documentation,<br />
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.26, 1997.<br />
Zu den Hilfsprogrammen von <strong>ECCO</strong>:<br />
[8] <strong>ECCO</strong> Debugger, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.00, 2004.<br />
[9] PACTest <strong>Manual</strong>, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, Version 1.00, 2002.<br />
[10] <strong>ECCO</strong> Profiler, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, 2005.<br />
[11] UltraEdit32, IDM Computer Solutions. http://www.ultraedit.com/index.php.<br />
Shareware-Programm (zur Zeit der Drucklegung).<br />
Zur SMC_API:<br />
[12] SMC_API für Win32, <strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong>, 2000.<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 304/305 -
<strong>Horsch</strong> <strong>Elektronik</strong> <strong>AG</strong><br />
6. GÜLTIGE VERSION<br />
Version dieses <strong>Manual</strong>s: 1.03<br />
Version Datum Autor Beschreibung<br />
1.03 19.12.05 MC Nachführungen und Ergänzungen<br />
1.02 15.08.05 MC Nachführung der Änderungen an <strong>ECCO</strong><br />
1.01 04.05.05 MC Verbesserungen und neue Befehle<br />
1.00 02.12.04 MC Erstes Release<br />
0.07 30.11.04 MC Verbesserung der Anhänge und Einführung<br />
0.06 21.09.04 MC Arbeiten am Feinschliff<br />
0.05 10.09.04 MC Arbeiten am Feinschliff<br />
0.04 13.08.04 MC Arbeiten am Feinschliff<br />
0.03 29.07.04 MC Überarbeitungen & Korrekturen<br />
0.02 17.06.04 MC Überarbeitungen & Korrekturen<br />
0.01 10.06.04 MC Übertragung vom SMC42 Systemhandbuch<br />
Aktuelle Software-Versionen:<br />
<strong>ECCO</strong> 5.03 <strong>ECCO</strong>Setup.exe 06.12.2005 Version: 5.03<br />
Build: 19.12.05<br />
Installieren Sie die Software nur mit dem Setup-Programm und kopieren Sie niemals<br />
Dateien direkt, um Versionskonflikte zu verhindern. Verwenden Sie bitte ausschliesslich<br />
die aktuellste Software-Version, erhältlich unter http://www.horsch.ch<br />
19.12.05 – Ver.: 1.03 <strong>ECCO</strong> Referenz - 305/305 -