22.02.2013 Aufrufe

ECCO Manual 1.03.pdf - Horsch Elektronik AG

ECCO Manual 1.03.pdf - Horsch Elektronik AG

ECCO Manual 1.03.pdf - Horsch Elektronik AG

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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 -

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!