Programmiertool für CAN-Displays

    Stand: 2023-09-06 (YYYY-MM-DD)

Inhalt

  1. Programmiertool für CAN-Displays
    1. Einleitung
      1. Schlagwortverzeichnis ("A bis Z")
      2. Kontext- und Kommando-spezifische Hilfsfunktion
      3. Warenzeichen, Haftungsausschluß, Juristisches
    2. Installation
      1. Hinweise für Anwender von Windows 7 (evtl. auch für "Vista")
      2. Nach der Installation: Überprüfen ob ein Firmware-Update nötig ist
      3. Programmstart mit und ohne 'Disclaimer'
        1. Entfernen der Anzeige des 'Disclaimers' beim Programmstart
    3. Das Hauptfenster
      1. Das Hauptmenü des Programmiertools
      2. Die Statuszeile
      3. Einstellungen des zu programmierenden Terminals (CAN-Parameter, etc)
      4. Einstellungen des Programmiertools
      5. Grafischer Editor für Anzeigeseiten
    4. LCD-Simulator und geräteabhängige LCD-Auswahl
      1. Geräteauswahl und LCD-Einstellungen (Auflösung, Farbmodell, Quer/Hochformat)
    5. Kommunikations-Kanäle
      1. SDO-Kanäle
      2. PDO-Kanäle
      3. Generische CAN-Signal-Kanäle ("CANdb")
      4. Kanal für LIN-Bus-Signale (wird nicht mehr aktiv unterstützt)
      5. Kanal für openABK-Variablen und -Mailboxen (Client-Seite) (wird nicht mehr aktiv unterstützt)

    6. Applikations-Variablen
      1. Eigenschaften von Anzeige-Variablen
      2. Auffinden aller Referenzen (Bezüge) einer Variable
      3. Variablen mit Verknüpfung per CAN-Datenbank (*.dbc, *.arxml)
      4. Variablen mit Anbindung an CANopen
        1. Variablen an SDO-Kanälen (CANopen)
        2. Variablen an PDO-Kanälen (CANopen)
        3. Variablen im "eigenen" CANopen-OD des Terminals
        4. Verwendung von "index" und "subindex" bei CANopen
      5. Variablen mit Anbindung an 'openABK'
      6. Data-Breakpoints (Überwachung bestimmter Schreibzugriffe auf eine bestimmte Variable)

    7. Einstellungen (Registerkarte und Dialoge im Programmiertool)
      1. Einstellungen im rechten Teil der Registerkarte 'Einstellungen'
        1. Einstellungen des Programmiertools
        2. Auswahl von Verzeichnissen
      2. Einstellungen im linken Teil der Registerkarte 'Einstellungen'
        1. Terminal-Konstanten (erster Teil der tabellarischen Ansicht)
        2. Terminal-Einstellungen (zweiter Teil der tabellarischen Ansicht)
      3. Erweiterte CAN-Bus Parameter (einstellbar per Dialog)
      4. Allgemeine Terminal-Optionen
      5. Optionales Setup (früher nur per System-Setup am Gerät konfigurierbar)
      6. Kontrolle der unterstützten Grafikfunktionen (supported graphic functions)
      7. Einfügen einer Datei-Beschreibung
      8. Simulation der Speicherkarte (im PC, als Ersatz für die Speicherkarte im 'echten Gerät')
      9. Kontrolle der in einer Applikation verwendeten 'externen' Dateien

    8. Anlegen eines Text-Arrays (veraltet, für Geräte ohne Script)

    9. Definition von Anzeigeseiten (Referenz)
      1. Einleitung zu den programmierbaren Anzeigeseiten mit
          Übersicht der verfügbaren Anzeige-Elemente
      2. Kopf einer Seitendefinition
      3. Manuelle Definition von Anzeige-Elementen
      4. Eigenschaften einer Anzeige-Zeile
      5. Der Format-String mit Backslash-Sequenzen und HTML-ähnlichen 'tags'
      6. Editierfelder (auf programmierten Anzeigeseiten)
      7. Buttons (graphische Schaltflächen, z.T. mit Touch-Funktion)
      8. Tabellen (als graphische Anzeige- und Bedienelemente)
      9. Icons (Bitmap-Grafiken)
      10. Verwendung von Anzeige-Zeilen als Menü
      11. Balkendiagramme (optional)
      12. Y(t)- und X/Y-Diagramme (optional)
      13. Mehrzeilige Text-Panels (für die Script-Sprache)
      14. Grafik-Panels (zur Anzeige von per Script erzeugten Canvas-Grafiken)
      15. Einfügen anderer graphischer Elemente auf einer Anzeigeseite
      16. Überlappende und bewegte Grafik
      17. Touchscreen-Unterstützung (für bestimmte Terminals)
      18. Mehrsprachige Applikationen (und deren Realisierung)

    10. Der "einfache" Editor für Anzeigeseiten
      1. Die Toolbar des graphischen Seiten-Editors
      2. Dialog für alphanumerische Anzeigeelemente
      3. Einfügen und Bearbeiten von Polygonen
      4. Einfügen eines Zeigerinstruments (Analog-Instrument)

    11. Übersicht Event – Definitionen
      1. Das Event-Definitions-Fenster
      2. Die Event-Definitions-Sprache
        1. Tastatur-Ereignisse
        2. Timer
      3. Globale und Lokale Events
      4. Global Event Catalog
      5. Eine Alternative zu 'Events' : Die Script-Sprache (nur für Geräte mit 32-bit CPU)

    12. Assistenten
      1. Assistent zum Erstellen einfacher Anwendungen
      2. Dialog zur Auswahl von Variablen auf einer Anzeigeseite
      3. Dialog zum 'Verlinken' von Menüs
      4. Assistent 'Alle Seiten prüfen und korrigieren'
      5. Katalog zur Auswahl von 'globalen' Event-Definitionen (veraltet)
      6. Galerie für Anzeigeseiten (veraltet)

    13. Anzeige-Seiten-Übersicht ("all pages")

    14. Importieren von Bildern (Symbole, Bitmaps, Icons)
      1. Reservieren von Speicher für Icons (und andere Spezialfunktionen)
      2. Flexible Speicheraufteilung
      3. Ermitteln des Flash-Speicher-Bedarfs im Zielsystem

    15. Benutzerdefinierte Zeichensätze

    16. Debugging
      1. Watch-Fenster
      2. Fenster zum Testen von Kommandos
      3. Abspielen von CAN-Logfiles für den Display-Simulator (CAN Logfile Player)
        1. Starten des CAN-Logfile-Players
        2. Unterdrücken bestimmter CAN-Messages im Logfile-Player
        3. Automatischer Stopp des Logfile-Players bei gestopptem Script
      4. CAN Message Generator / Bus Simulator
      5. Wireshark-kompatible 'Packet Capture'-Funktion

    17. CANopen-Konfiguration
      1. CANopen SYNC - Konfiguration
      2. CANopen NMT - Konfiguration
      3. Geräte mit 'CANopen V4' (dies sind die meisten Terminals mit 32-Bit CPU)
      4. Das CANopen Object Dictionary (OD)
      5. PDO-Mapping per Programmiertool (nur für Geräte mit CANopen V4)
      6. EDS-Dateien (electronic device specification)
      7. EDS/DCF-Generator zur Übernahme der CANopen-Konfiguration in SPS-Programme (z.B. CoDeSys)

    18. Übertragung der Applikation ins das Zielsystem
      1. Übertragen der Applikation per Speicherkarte
      2. Übertragung der Applikation per CAN, RS232, Ethernet
        1. Übertragung per CAN / CANopen
        2. Übertragung per Ethernet / LAN (UDP)
      3. Firmware-Update
      4. Screen Snapshot per CAN  (oder HTTP?)
      5. Übertragen anderer Dateien (File Transfer Utility)
      6. Das CAN-Interface im/am PC
      7. USB-nach-Seriell-Adapter (Virtual COM Ports)
      8. Fernsteuerung (für Geräte ohne eigene Tastatur)
      9. Übertragen anderer Dateien (mit dem File Transfer Utility)

    19. Das System-Menü im Terminal
      1. Display-, Audio-, CAN-Bus-, und andere Einstellungen
      2. Netzwerk-Konfiguration (TCP/IP, UDP, etc)
      3. Ein- und Ausschalten des Gerätes; automatisches 'Aufwecken' z.B. per CAN
      4. Freischaltung von Sonderfunktionen
      5. Storage Directory (unter 'System Menu' / 'Diagnostics' abrufbar)
      6. Fernbedienung des System-Menüs per Terminalprogramm (für Geräte ohne Tastatur)

    20. Die Fehler-Anzeige-Seite ("Fehler & Meldungen")
      1. Sprung zur Fehlerursache per Mausklick
      2. Fehlerklassen und weitere angezeigte Meldungen (CAN, CANopen, ..)
      3. Anzeige der Trace-Historie unter 'Fehler & Meldungen'


  2. Der Display-Kommando-Interpreter
    1. Numerische Ausdrücke (expressions)
      1. Feste Zahlenwerte (Konstanten)
      2. Verknüfungsoperatoren (numeric operators)
      3. Variablen als Teil eines numerischen Ausdrucks
      4. Inspizieren von Interpreter-Ausdrücken per Maus
    2. Interpreter-Funktionen
      1. Alphabetisch sortierte Übersicht der Interpreterfunktionen
      2. Funktionen zum Abfragen der Tastatur
        1. Detailierte Beschreibung der Funktionen 'kh' und 'kc' (spezielle Tastaturfunktionen)
        2. Von der Funktion "kc" gelieferte System-Tastencodes
      3. Arithmetische und andere Funktionen
      4. Konvertierungsfunktionen 'val' (value) und 'eval' (evaluate)
      5. CANopen-spezifische Funktionen
        1. PDO-Funktionen des UPT-Display-Interpreters
        2. SDO-Zugriffsfunktionen
        3. CANopen-SYNC-Funktionen
      6. Generische CAN-Funktionen: CAN-Status-Abfrage, CAN-Empfang, CAN-Senden
      7. String-Funktionen
      8. String-Ausdrücke (String Expressions)
      9. Funktionen zur Abfrage der Echtzeituhr (real time clock)
      10. Timer-Funktionen und -Kommandos
      11. Bit-Abzähl-Funktion ("nbit")
      12. Funktionen zum Zugriff auf nichtflüchtige Werte (nv[0..31])
      13. Funktionen zum Lesen der digitalen und analogen Eingänge (onboard)
      14. Funktionen zur Abfrage des Drehknopfes (rotary encoder, rot.xxx)
      15. Funktionen zur Abfrage eines analogen Joysticks (optional ! )
    3. Interpreter-Kommandos
      1. Übersicht Interpreter-Kommandos
      2. Grafik-Kommandos
      3. Kommandos zum Starten / Stoppen von Timern
      4. Page-Scan-Modus (pscan)
      5. Das Zuweisungs-Kommando (assign, @)
      6. Ansteuern digitaler Ausgänge (on-board, optional)
      7. "System"-Funktionen und -Kommandos des Interpreters (Audio, Indikatoren, Shutdown, Reboot, Spannungen, Temperaturen, ...)
      8. Weitere spezielle Interpreter-Kommandos

  3. Der Script-Editor / Compiler / Debugger (nur für bestimmte Geräte mit 32-Bit-CPU)

  4. Anhang
    1. Verschlüsselung der CVT/UPT-Datei (Applikation)
    2. Handbücher zu den programmierbaren Terminals (PDF-Format)
    3. Boot-Screen (optional beim Einschalten angezeigte Bitmap-Grafik)
    4. SDO-Fehlercodes
    5. CANopen-Objekte im Terminal (nur für Geräte mit CANopen)
    6. SDO-Fehlercodes (nur für Geräte mit CANopen)
    7. Oft gestellte Fragen (FAQ; separates Dokument)
    8. Troubleshooting
    9. Glossar
    10. Kontaktaufnahme mit dem Autor
    11. Versionshistorie der UPT-Familie

Programmiertool für CAN-Terminals

Einleitung

Diese Datei ist Teil des Online-Hilfesystems für Programmiertools für UPT (User Programmable Terminals mit CANopen) und für Geräte ohne CANopen (wie z.B. MKT-View II, III, IV).

Der ursprüngliche Zweck und die Designziele für die ersten Geräte waren:

  • vom CAN-Bus empfangene Signale skalieren und in numerischer Form auf dem Display anzeigen
  • zwischen mehreren programmierbaren Anzeigeseiten umschalten (z.B. 'Motor', 'Getriebe', 'Bremsen'), per Tasten steuerbar
  • Senden spezieller ("programmierbarer") CAN-Telegramme, ausgelöst durch den Bediener
  • schnelles Booten (wenige Sekunden zwischen Einschalten und Anzeige der ersten programmierten Seite)
  • geringer Preis (die ersten Geräte arbeiteten mit 8-Bit-CPU und einem LCD mit 128 * 64 Pixeln)
Später wurden weitere Features hinzugefügt, z.B.:
  • graphische Anzeige- und Steuerelemente wie Bitmaps, Schaltflächen, Balkendiagramme, Tabellen
  • ein im Programmiertool integrierter Simulator zum Entwickeln von Applikationen ohne 'echte' Hardware
  • eine Script-Sprache, mit der die Anzeige- und Steuerelemente miteinander, und mit der 'Außenwelt' verknüpft werden können
  • Unterstützung für größere und farbige Displays (z.B. TFTs mit bis zu 800 * 480 Pixeln)

Das Programmiertool eignet sich auch (noch) für ältere Geräte wie z.B. UPT-515 oder MKT-View "Plus", deren Firmware allerdings seit 2008 nicht mehr weiterentwickelt wird. Hinweise in der Dokumentation wie z.B. 'nur für Geräte mit 32-Bit-CPU' sollen andeuten, daß eine bestimmte Funktion auf älteren Geräten (mit 8-Bit-CPU wie beim UPT-515, bzw 16-Bit-CPU beim MKT-View) nicht verfügbar ist.


Beispiel eines anwenderprogrammierbaren CAN-Displays : MKT-View III (mit 2*CAN und Ethernet).
Eine Liste mit weiteren vom Programmiertool unterstützten Geräten finden Sie in der Feature-Matrix.

Für den schnellen Einstieg empfiehlt sich z.B. die Präsentation des Programmiertools, in der zahlreiche Verweise in die vorliegende Online-Hilfe enthalten sind.

Einige der in diesem Handbuch beschriebenen Funktionen sind erst seit
  2023-09-06
verfügbar ( = Kompilationsdatum im ISO-Format, gilt für Firmware und Programmiertool) .


Hinweis: Änderungen in der Dokumentation werden immer erst am englischsprachigen "Master" vorgenommen, und dann -beizeiten- ins Deutsche übersetzt.

Schlagwortverzeichnis ("A bis Z") und Hinweise zum Hilfesystem

Eine schnelle Übersicht der wichtigsten Funktionen finden Sie im alphabetisch sortierten Schlagwortverzeichnis.
Ein druckbares Handbuch finden Sie im Verzeichnis "DOKU" ( leider etwas veraltet), ebenso eine druckbare Beschreibung des im Terminal vorhandenen Systemmenüs, und eine Beschreibung der Besonderheiten von Terminals mit CAN-Datenbank-Import (statt CANopen).

Tip: Wenn Sie Firefox als Browser verwenden, wird dieses Dokument beim Öffnen der Hilfe aus dem Programmiertool automatisch an die passende Stelle gescrollt, was die Verwendung sehr erleichtert. Das gleiche funktionierte auch mit IE6. Seit IE7 funktioniert dies nicht mehr... es liegt an Ihnen, einen geeigneten Browser zu installieren.

Der Aufruf des HTML-Browsers ist frei definierbar (unabhängig vom "Standardbrowser"). Rufen Sie dazu im Hauptmenü des Programmiertools den Eintrag "Hilfe" auf, und wählen dort die Funktion "Kommandozeile für HTML-Browser" auf.


(Beispiel zum Aufruf des beim Autor unter "P:\Iron_Browser" installierten Browsers)

Kontext-und Kommando-spezifische Hilfsfunktion

Kontext-sensitive Hilfe:

  • Drücken Sie F1 wenn Sie Hilfe zu einer Komponente des Programmiertools bzw der Benutzeroberfläche benötigen, z.B. wozu das "display property"-Fenster dient. Bevor Sie F1 drücken, klicken Sie auf ein Steuerelement (um den "Eingabefokus" darauf zu setzen).
    Entsprechendes gilt für das Hauptmenü des Programmiertools:
    Offnen Sie das Menü (per Maus oder Tastatur), und drücken Sie F1 um Hilfe zum momentan selektierten Menüpunkt zu erhalten. Eigene Hilfeseiten existieren allerdings nur für die 'nichttrivialen' Funktionen - erwarten Sie z.B. keine Hilfe zum Menü 'Datei / Beenden'.

Hilfe zu bestimmten Interpreterkommandos:

  • Drücken Sie F2 wenn Sie Hilfe zu einem der Interpreter-Kommandos des UPT's brauchen.
    Bei einfachen Editierfeldern platzieren Sie den blinkenden Cursor auf dem Kommando, zu dem Sie Hilfe brauchen, und drücken dann F2.
    Bei "Tabellen", klicken Sie in die Zelle mit dem Kommando, lassen den Mauszeiger dort stehen, und drücken dann F2.
    Das Programmiertool versucht dann, den Inhalt des Eingabefeldes zu analysieren (an der Stelle wo der Cursor steht), und eine dazu passende Hilfeseite aufzurufen.

Hinweise zur "spezifischen Hilfsfunktion":

  • Dies funktioniert nur, wenn das Hauptfenster(!) des Programmiertools den Fokus hat. Sie erkennen dies (bei den meisten PCs) am blaugefärbten Fenstertitel.
  • Das Programmiertool öffnet die Hilfeseiten im auf dem PC installierten HTML-Browser (z.B. Firefox) in einem neuen Tab (Registerkarte), und versucht den Browser zum Sprung in das passende Kapitel zu motivieren (per Textmarke). Leider sind manche Browser (z.B. Internet Explorer 7) nicht in der Lage, per Kommandozeile an die gewünsche Stelle im geladenen Dokument zu springen. Siehe Tipp in der Einleitung.
Neuere Geräte mit mindestens 4.3"-Display und großem Flash-Speicher (ab MKT-View III) verfügen über ein internes Hilfesystem, welches am Gerät aus dem System-Menü heraus aufgerufen werden kann. Im internen Hilfesystem finden Sie u.A. Informationen zum System-Menü / Setup, Netzwerkeinstellungen, aber nichts zum Thema 'Programmentwicklung'. Die in der Gerätefirmware 'fest eingebauten' Hilfeseiten können ggf. applikationsabhängig erweitert werden. Ein Beispiel dazu finden Sie nach der Installation des Programmiertools in dessen Unterverzeichnis 'fonts'(!), Datei index.htm. Das interne Hilfesystem kann auch per Script (system.show_help) geöffnet werden. Details zum Dateiformat für eigene Hilfeseiten finden Sie hier.

Weitere Informationen (Beispielprogramme, Übersetzungen in andere Sprachen, Links zu Gerätebeschreibungen, Druckbares etc) finden Sie im Index oder auf der MKT-Website.

Warenzeichen, Haftungsausschluß, Juristisches..

In dieser Beschreibung verwendete Namen oder Logos sind möglichwerweise Warenzeichen oder eingetragene Warenzeichen ihrer jeweiligen Eigner, auch wenn sie in dieser Beschreibung nicht entsprechend gekennzeichnet sind. Entsprechendes kann für copyright-geschütztes Material zutreffen. Ein fehlendes ®(r) oder ©(c) erlaubt daher keinen Rückschluss auf ein eventuell vorhandenes Warenzeichen / Trademark, Copyright, oder dergleichen.
Sollten Sie Inhaber eines Trademarks oder Copyrights eines der in dieser Beschreibung verwendeten Namens sein, der in der folgenden Auflistung fehlt, bitten wir (MKT Systemtechnik) um einen Hinweis per E-Mail an info@mkt-sys.de.

CANdb® is registered trademark of Vector Informatik GmbH.
NTCAN API is copyright (c) by ESD electronic system design GmbH.
PCAN Dongle and the PCAN API is copyright (c) by PEAK-Service GmbH.
Microsoft, Windows, Win95, WinNT, WinXP
® are registered trademarks of Microsoft Corporation.
The Hershey fonts are a collection of vector fonts developed circa 1967 (!)
by Dr. Allen Vincent Hershey while working at the U.S. National Bureau of Standards.

Die Software wird mit den begleitenden Materialien (Dokumentation, Hilfesystem, PDF-Dateien) "wie sie ist" ("as-is") und ohne jede Gewährleistung für Funktion, Kompatibilität, Korrektheit oder Fehlerfreiheit zur Verfügung gestellt.
Für jedweden direkten oder indirekten Schaden - insbesondere Schaden an anderer Software, Schaden an Hardware, Schaden durch Nutzungsausfall und Schaden durch Funktionsuntüchtigkeit der Software, kann der Autor nicht haftbar gemacht werden. Ausschließlich der Benutzer haftet für die Folgen der Benutzung dieser Software.
Diese Software wurde mit größter Sorgfalt entwickelt, jedoch können Fehler niemals ausgeschlossen werden. Es kann daher keine Gewähr für die Sicherheit Ihrer Daten übernommen werden.
Das Programmiertool wird vom Hersteller (MKT Systemtechnik) kostenlos zur Verfügung gestellt. Für die dazugehörige Hardware gelten die Bedingungen des Kaufvertrages (siehe Kontakt / Impressum / ABGs auf der Website des Herstellers).

THERE ARE NO OTHER WARRANTIES, EITHER EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE,
WITH RESPECT TO THE SOFTWARE, THE ACCOMPANYING
WRITTEN MATERIALS, AND ANY ACCOMPANYING HARDWARE.

MKT Systemtechnik
Haßkamptraße 75-77
32257 Bünde (Germany)

Phone: 05223/493933-0
Fax: 05223/493933-20

Web: http://www.mkt-sys.de

Nutzungsbedingungen, Hinweise

Diese Soft- und dazugehörige Hardware kann ein CAN-Netzwerk steuern oder beeinflussen. Ähnliches gilt für den Einsatz im lokalen Netzwerk (Ethernet, Ethercat, und ähnlichen zukünftig unterstützten Bussystemem). Der Einsatz kann daher zu schweren Schäden führen. Aus diesem Grund dürfen nur Personen, die die möglichen Konsequenzen des Einsatzes dieses Produktes verstanden haben, es verwenden.

Die Haftung des Herstellers ist auf die Hardware beschränkt, sie bezieht sich nicht auf die Folgen seines Einsatzes in einem CAN-Netzwerk. Weder MKT Systemtechnik noch deren Beschäftigte oder Partner können für den unsachgemäßen Gebrauch dieses Produktes haftbar gemacht werden.

Aktivitäten mit hohem Gefahrenpotential

Die Software ist nicht fehlertolerant und wurde nicht entworfen, hergestellt oder dafür vorgesehen, sie zum Gebrauch oder Weiterverkauf als Online-Steuerung in sicherheitskritischen Umgebungen einzusetzen, wie sie etwa für ausfallsichere Systeme erforderlich sind, wie sie zur Kontrolle von Kernkraftwerken, zur Flugnavigation oder in Kommunikationssystemen des Luftverkehrs, medizinischen Geräten, oder Waffensystemen zum Einsatz kommen, in denen der Ausfall der Software direkt zum Tode, Körperverletzungen, oder anderen ernsthaften Schädigungen der Umwelt ("Aktivitäten mit hohem Gefahrenpotential") führen könnte. MKT Systemtechnik schließt jegliche Art einer ausdrücklichen oder implizierten Garantie zur Eignung von Aktivitäten mit hohem Gefahrenpotential aus.

Wenn Sie mit den obigen Einschränkungen nicht einverstanden sind, de-installieren Sie die Software und senden die Hardware UMGEHEND an den Lieferanten zurück. Der Kaufpreis, den Sie für das Gerät bezahlt haben, wird Ihnen dann erstattet. Kunden von MKT Systemtechnik wenden sich bitte per Email an den Hersteller, info@mkt-sys.de .


Installation des Programmiertools

Laden Sie sich das zur Hardware passende Programmiertool von MKT Systemtechnik herunter. Als Anwender von Geräten mit Parametrierung der CAN-Kommunikation per "CAN-Datenbank" benötigen Sie den Installer namens 'InstallCANdbTerminal.exe'. Als Anwender von Geräten mit CANopen V4 benötigen Sie den Installer 'InstallUptTool2.exe'. Als Anwender von Geräten mit 'sehr altem CANopen' (V3, z.B. UPT515) verwenden Sie den Installer 'InstallUptTool1.exe'.

Den Grund, warum es mittlerweile drei verschiedene Programmiertools gibt, finden Sie (bei Interesse..) hier .

Bei Problemen mit dem Aufruf des HTML-Browsers (z.B. Firefox, Chrome / Iron, oder im äußersten Notfall "Internet Explorer") nicht korrekt, können Sie die Kommandozeile zum Aufruf des Browsers (mit Übergabe der zu öffnenden Datei) wie hier beschrieben ändern. Als Browser für das Hilfesystem des Programmiertools kann so auch ein Programm verwendet werden, welches momentan nicht als "Standard-Browser" eingerichtet ist.

Hinweis für Nutzer von Windows Vista / 7 / 8 / 10

Bitte beachten Sie, dass sowohl das installierte Programm wie auch Updates generell als Administrator auszuführen sind ! Bitte beachten Sie, dass der 'Installer' in einigen (zum Glück seltenen) Fällen als Administrator auszuführen ist. Anderfalls können (eventuell) einige Dateien nicht im 'Windows'-Verzeichnis abgelegt werden können.

Beispiel: Update des ‚CAN-Terminal Programming Tools’

  1. Programm starten (rechte Maustaste > Als Administrator ausführen)
  2. Menüpunkt Hilfe / Auf Updates prüfen (per Browser)
  3. Wählen Sie im Browser-Fenster den Link in der Zeile
      Please download update here,
    wenn eine entsprechende Aufforderung angezeigt wird.
    Abhängig vom Browser wählen Sie z.B. "Speichern unter".
  4. Schließen Sie das Programmiertool bevor Sie das heruntergeladene Update (z.B. 'InstallCANdbTerminal.exe') starten !
  5. Installieren Sie das Update aus dem Download-Ordner Ihrer
    lokalen Festplatte (rechte Maustaste > Als Administrator ausführen) !
  6. Folgen Sie den Anweisungen. Danach starten Sie das ‚CAN-Terminal Programming Tool‘ neu,
    Sie arbeiten nun mit der aktuellsten Version.

Durch eine geänderte Methode zum Speichern der Konfigurationsdatei (seit Dezember 2019 wieder im Verzeichnis der Applikation) sollte ein Betrieb mit Administratorrechten nicht mehr nötig sein.  Der folgende Tipp ist nur nötig, wenn Sie das Programmiertool unter Windows 7/8/10 im Windows-"Programm"-Verzeichnis installiert haben.

Grund für die Notwendigkeit eines (lokalen) Administrator-Accounts unter Windows 7/8/10:
Im Gegensatz zu früheren Windows-Versionen ist es aus schwer nachvollziehbaren Gründen einer Anwendung nicht mehr erlaubt, Dateien in "ihrem eigenen" Verzeichnis auf der Festplatte zu beschreiben. Die 'Anzeigeprogramme', die bei der Installation des Programmiertools als Beispiele mitgeliefert werden, werden vom Installationsscript traditionell in ein Unterverzeichnis des Programmiertools kopiert (statt, wie Microsoft es gerne hätte, irgendwo unter "Dokumente und Einstellungen", "Eigene Dateien", "Alle Benutzer", "Documents", "Public Documents" oder ähnlichem Unfug).

Um den unter "Windows Vista" vorprogrammierten Ärger mit 'Vorhängeschlössern' () oder (unter späteren Windows-Versionen) nicht schreibbaren Dateien im "Programm"-Verzeichnis zu vermeiden:

Installieren Sie das Programm nicht im vom Microsoft vorgesehenen Verzeichnis ("Programme", "Program Files", oder wo auch immer).
Stattdessem installieren Sie das Programm dort, wo Sie später uneingeschränkte Schreibrechte haben, d.h. außerhalb des von Microsoft diktierten Verzeichnisses für 'Programme'.
Beispiel (auf einem 'deutschen' PC):

Statt der Installation unter
"C:\Programme\MKT\xyz",   (alias   "C:\Program Files\MKT\xyz", oder was auch immer..),
installieren Sie die MKT-Software z.B. unter
"C:\MKT\UPT_ProgTool2"       (für Geräte mit CANopen)
"C:\MKT\CANdbTerminalProgTool"     (für Geräte mit Konfiguration per CAN-Datenbank)
Unter 'Vista' und Windows 7 war auf diese Weise möglich, die selbsterstellten UPT-Anzeigeprogramme (*.upt, *.cvt) dort zu speichern, wo bereits die mitgelieferten Beispielprogramme standen - und zwar ohne nervtötende System-Nachfragen und Vorhängeschlösser ().

Nach der Installation finden Sie die mitgelieferten Beispielprogramme dann in den folgenden Verzeichnissen (unabhängig von der verwendeten Windows-Version .. XP,7,8,10..):
c:\MKT\CANdbTerminalProgTool\programs(enthält weitere Unterverzeichnisse für verschiedene Displays)
c:\MKT\CANdbTerminalProgTool\programs\script_demos(Beispiele für Geräte mit Script-Sprache)
c:\MKT\CANdbTerminalProgTool\programs\MKTview2(Beispiele für MKT-View II / III, z.g.T. ohne Scripte)
c:\MKT\CANdbTerminalProgTool\programs\MKTview4(Beispiele für MKT-View IV, z.g.T. mit Scripten)

Falls Sie den 'neuen Regeln' von Microsoft folgen, und "Ihre Dateien" in dem von Microsoft dafür vorgesehenen Verzeichnis ablegen wollen, können Sie die Verzeichnisse (Dateipfade) nach der Installation des Programmiertools auf dessen Registerkarte 'Settings' ändern. Ob dafür z.B. das Verzeichnis "C:\Dokumente und Einstellungen\All Users\Oder auch nicht\Anwendungsdaten\Irgendwer\Irgendwo\Irgendwas\..." zu verwenden wäre, klären Sie ggf. mit dem System-Administrator.

Weitere Informationen zu den vom Programmiertool verwendeten Verzeichnissen (Directories) finden Sie auf der Registerkarte Einstellungen (des Programmiertools).

Nach der Installation: Überprüfen ob ein Firmware-Update nötig ist

Da nach der Installation eines neuen Programmiertools i.A. auch neue Funktionen verfügbar sind, muss in vielen Fällen auch die Geräte-Firmware aktualisiert werden, um auch dort die neuen Funktionen nutzen zu können (andernfalls würden z.B. im Simulator auf dem PC Funktionen verfügbar sein, die in Geräten mit alter Firmware nicht funktionieren).
Tipp:
Beim Aufruf der Funktion 'Auf Update prüfen (per Browser)' im Menü 'Hilfe' wird Ihnen auch ein Auszug aus der Versionshistorie mit den letzten Änderungen angezeigt. Diese Änderungen beziehen sich nicht nur auf das Programmiertool, sondern auch auf die Geräte-Firmware.
Falls der Aufruf des Browsers aus dem Hilfe-Menü nicht funktioniert, können Sie die entsprechende Webseite über den folgenden Link auch 'von hier' erreichen:
www.mkt-sys.de/check4update/ctptwin1.htm
Zum Ermitteln des Firmware-Kompilations-Datums rufen Sie am Gerät das System-Menü auf, indem Sie (hier am Beispiel der MKT-View-Familie) die zweite und dritte Funktionstaste gleichzeitig drücken, und (im Gegensatz zum 'normalen' Aufruf des System-Menüs) gedrückt halten bis das Kompilationsdatum im Display angezeigt wird.

Beispiel:
 MKT-View III  with CANdb + Logger
   
 ISO-Date: 2013-07-22 16:24:00
 Software: art11392 V0.2.4-1     
      (...)
 Compiled: Jul 24 2013 (RV)
      (...)
   press ENTER to quit

Bedeutung:
'ISO-Date' ist das aktuelle Datum und Uhrzeit im ISO-Format. Dies hat nichts mit dem Kompilationsdatum der Firmware zu tun !
'Software' ist die Identifikation der Geräte-Firmware, mit Software-Artikel-Nummer von MKT, und der Versionsnummer.
'Compiled' ist das Kompilationsdatum der Geräte-Firmware. Details dazu im folgenden Unterkapitel.
Wenn sich die Versionsnummer von Firmware und Programmiertool unterscheiden, wird dringend empfohlen, auch die Geräte-Firmware zu aktualisieren. Dazu bietet sich -je nach Gerät- der CAN-Bus, die RS-232-Schnittstelle, die Ethernet-Schnittstelle (per TCP/IP und Web-Interface), oder die Speicherkarte an.

Details zum Durchführen eines Firmware-Updates finden Sie nach der Installation des Programmiertools in dessen Unterverzeichnis 'firmware' in der Datei fwupdate.htm . Im gleichen Verzeichnis finden Sie auch die Firmware-Dateien für die wichtigsten programmierbaren Displays von MKT.

Wurde das Programmiertool wie im vorhergehenden Kapitel empfohlen installiert, finden Sie die Gerätefirmware im Verzeichnis
c:\MKT\CANdbTerminalProgTool\firmware(für Geräte mit 'DBC', z.B. MKT-View II / III / IV)
c:\MKT\UPT_ProgTool2\firmware(für Geräte mit CANopen, z.B. UPT128, UPT800 )

In einigen Fällen sind für die gleiche Hardware sowohl eine 'DBC' (CANdb)- als auch CANopen-Firmware-Variante verfügbar - siehe Feature-Matrix.

                       
(Links zur Feature-Matrix - Klicken Sie auf ein Bild, um zu erfahren ob für das Gerät eine "CANdb" oder "CANopen"-Firmware verfügbar ist)


Details zum Firmware-Kompilations-Datum
Das Kompilationsdatum wird beim Übersetzen der Geräte-Firmware (und des Programmiertools) automatisch eingefügt. In den 'Terminal-Konstanten' wird dieses Datum im ISO-Format angezeigt (s.U.). Das Programmiertool benötigt diese Information, um z.B. Funktionen, die im Zielsystem nicht implementiert sind, bei der Erstellung des Anzeigeprogramms nicht zur Auswahl anzubieten. Es kann anhand des Kompilationsdatums erkennen, ob die Geräte-Firmware 'neuer' oder 'älter' als das Programmiertool ist.

Beispiel:

Am 27. November 2009 wurde die Syntax für viele graphische Anzeige-Elemente (z.B. Bargraphen und Buttons) erweitert. Die Breite und Höhe eines Anzeige-Elements wird seitdem in zwei eigenen Spalten ("W" = Breite in Pixel und "H" = Höhe in Pixel) in der Definitionstabelle eingegeben. Bei Geräten mit älterer Firmware (z.B. "MKT-View Plus") existiert diese Möglichkeit nicht.

Aus dem Grund zeigt das Programmiertool die Spalten "W" und "H" nur dann an, wenn das Kompilationsdatum der Firmware im zu programmierenden Gerät größer oder gleich 20091127 (ISO8601-Format, YYYY-MM-DD) ist.

Ursprünglich wurde das Programmiertool immer per Kommunikationskanal (CAN, RS-232) direkt mit dem zu programmierenden Gerät verbunden, und hatte dadurch die Möglichkeit, z.B. per CAN das Kompilationsdatum aus dem angeschlossenen Gerät abzufragen.

Bei der mittlerweile üblichen Übertragung "per Datei" auf einer Speicherkarte besteht diese Möglichkeit nicht mehr, da keine Daten vom Gerät zum PC übertragen werden können !

Da die Übertragung "per Datei" nur in Richtung Programmiertool -> Anzeigegerät erfolgen kann, muss das Programmiertool notfalls manuell über den Firmwarestand des zu programmierenden Gerätes informiert werden (das Firmware-Kompilationsdatum kann beim Aufruf des Systemmenüs im Gerät ausgelesen werden). Details zum Systemmenü finden Sie in Dokument Nr. 85115.

Beispiel: "Altes" MKT-View (MKT-View "Plus"), Firmware #11089 .
Kompilationsdatum 2008-12-02 (Anzeige "Compiled: Dec  2 2008" in der grauenhaften Notation des C-Compilers)
Im Programmiertool darf dann unter "Settings"..."Terminal constants"..."Firmware compilation date" allerhöchstens der Wert 20081202 stehen.
Per Mausklick auf das Kompilationsdatum (numerischer Wert im ISO-8601-Format) kann dies gegebenenfalls korrigiert werden.
Anderfalls könnte Ihnen das Programmiertool beim Erstellen der Konfiguration Funktionen anbieten, die in der verwendeten Firmware noch nicht existieren !

Ob für Ihr Gerät eine neuere (aktuellere) Firmware verfügbar ist, erfahren Sie im einfachsten Fall über das Menü "Hilfe" .. "Check for Update", oder notfalls (falls Ihr Internet-Browser nicht kooperiert) in der Datei readme.txt im Unterverzeichnis "firmware" nach der Installation des aktuellen Programmiertools .

Bekannte Probleme mit älterer Firmware sind z.g.T. in den Release Notes beschrieben.

Siehe auch:

  Firmware-Update, Software-Versions-Historie (Online-Link) .


Programmstart mit und ohne 'Disclaimer'

Nach der Installation startet das Programmiertool zunächst mit der Anzeige eines 'Disclaimers' (Haftungsausschluss und Nutzungsbedingungen).
In diesem Dialogfenster kann der Benutzer des Programmiertools bereits seine Sprache, und den selbsteingeschätzten Kenntnisstand auswählen (alias 'Benutzerprofil', Neuling / fortgeschrittener Anwender / Experte):


Anzeige des "Disclaimers" beim Start des Programmiertools

Das Benutzerprofil kann auch nach dem Programmstart geändert werden (im Hauptmenü unter "Optionen").

Entfernen der Anzeige des 'Disclaimers' beim Programmstart
Wenn Sie den Haftungsausschluß akzeptieren, und sich über die möglichen Konsequenzen des Einsatzes dieser Software im Klaren sind, können Sie die Anzeige des "Disclaimers" beim Programmstart entfernen.

Wählen Sie dazu im Hauptmenü den Eintrag "Werkzeuge"..."Warnhinweis beim Programmstart entfernen".

Sie werden dann nach einem Passwort gefragt. Geben Sie den Text
      i agree
("ich akzeptiere") ein, und klicken auf OK. Sie werden dann beim nächsten Programmstart nicht mehr vom "Disclaimer"-Bildschirm begrüßt. Bei Eingabe eines falschen Passwortes wird der Disclaimer wieder aktiv.


Das gleiche Dialogfenster wird auch für die Passwort-Eingabe in anderen Situationen verwendet, z.B. beim Firmware-Update.

Das Hauptfenster

Das Hauptfenster des Programmiertools erscheint (nach dem Entfernen des 'Disclaimers') direkt nach Programmstart.
Abhängig vom gewählten Anwenderprofil ("Neuling"/"fortgeschrittener Anwender"/"Experte") könnten einige Elemente der Benutzeroberfläche vorübergehend verborgen sein.

Es enthält außer dem Hauptmenü verschiedene Seiten ("Registerkarten" bzw tab sheets), mit folgendem Inhalt:
  • Definition von Kommunikationskanälen
  • weitere optionale Registerkarten, je nach unterstützten Kommunikationsprotokollen, hier z.B. CANopen oder CANdb
  • Definition von Variablen die mit Kommunikationskanälen verbunden sein könnten
  • Definition von Anzeigeseiten die später vom UPT (etc) angezeigt werden sollen
  • Import von Icons (kleinen Grafikbildern)
  • Anzeige einer Übersicht aller von Ihnen programmierten Anzeigeseiten
  • Anzeigen und Ändern einiger Systemparameter (general settings) des Terminals und des Programmiertools
  • Anzeige von Fehlermeldungen in einer Fehlerhistorie (evtl. auch andere Meldungen)

Am unteren Rand des Hauptfensters sehen Sie die Statuszeile, in der wichtige Systemzustände und die letzte Fehlermeldung angezeigt wird.

Zurück zur Übersicht



Das Hauptmenü des Programmiertools

Das Hauptmenü des Programmiertools enthält die üblichen Funktionen zum Laden und Speichern von Dateien, zum Editieren, für die Programmübertragung, und zum Einstellen von Optionen des Programmiertools. Hier nur eine kurze Übersicht:
Datei
Applikation (*.upt bzw *.cvt) aus Datei laden, als Datei speichern, Paßwortschutz  für die Applikation einstellen
Assistent
Assistenten zum Erstellen einfacher Anwendungen, Dialog zum Verlinken der Menüs im Terminal, Dialog zum Ersetzen von Variablen
Bearbeiten
Enthält eine globale Suchfunktion zur Textsuche auf allen Event-Definitionen, allen Anzeigeseiten, und in allen Quelltextzeilen der Script-Sprache; eine Funktion zum Erzeugen einer neuen Anzeigeseite; und andere Funktionen zum Bearbeiten der programmierbaren Anzeigeseiten. Viele weitere Funktionen zum "Bearbeiten" sind in Popup-Menüs enthalten, die durch Anklicken verschiedener Steuerelemente mit der rechten Maustaste geöffnet werden können !
Transfer
Übertragen der Applikation ins Terminal, Firmware-Update, Auswahl der seriellen Schnittstelle
Ansicht
Umschalten zu verschiedenen Fenstern des Programmiertools:
    LCD-Simulator, Überwachte Ausdrücke, Test-Kommando-Fenster, Datei-Referenzen.
Optionen
Dient zum Ändern verschiedener Einstellungen des Programmiertools, Abfrage der unterstützte Grafik-Funktionen, Speicheraufteilung (im Terminal), und einiger Optionen die das Erscheinungsbild der Benutzeroberfläche des Programmiertool beeinflussen:

Benutzerprofil "Neuling" :
Kann nur einfache numerische Anzeigen konfigurieren, verwendet fast ausschliesslich den graphischen Editor,
und sieht (im Programmiertool) nur die elementaren Registerkarten zur Erstellung einer sehr einfachen Anzeigekonfiguration.

Benutzerprofil "fortgeschrittener Anfänger" :
Kann prinzipiell zu allen Registerkarten umschalten (inkl. Script), sieht aber beim Start des Programmiertools den graphischen Editor statt der tabellarischen Anzeige-Definitionen (dessen Registerkarten ihm aber, im Gegensatz zum 'Neuling', alle zur Verfügung stehen).

Benutzerprofil "Experte" :
Der Experte möchte in erster Linie nicht Anzeige-Elemente per Maus im graphischen Editor hin- und herschieben, sondern ist das Arbeiten mit Tabellen, Pixel-Koordinaten, Quelltexten (Script) und den kreativen Möglichkeiten des Format-Strings gewohnt.
Dem Experten werden daher beim Start des Programmiertools alle Registerkarten angezeigt.

Die Auswahl des o.g. Benutzerprofils kann bereits vor dem Öffnen des Hauptfensters im 'Disclaimer' erfolgen.

Werkzeuge ("Tools")
Interne und externe Hilfsprogramme aufrufen, die z.T. zusätzlich zum Programmiertool installiert werden können, z.B. Font-Editor, CAN-Logger-Utility, CAN Bus Simulator, usw.
Icon
Grafik-Import aus Bitmap-Dateien

Run, Stop, Reset
Die auf dem PC simulierte Applikation starten, stoppen, und das Programm zurücksetzen.
Hinweis: Nur bei gestoppter Simulation kann die Applikation editiert werden.
Die Funktion 'Reset' (im Hauptmenü des Programmiertools) simuliert einen Power-On-Reset (bzw. 'Kaltstart') des simulierten Zielsystem. 'Run' setzt die Programmausführung an der Stelle fort, an dem sie per 'Stop' (oder durch Auflaufen auf einen Haltepunkt) unterbrochen wurde.

Hilfe
Hilfeseiten zu verschiedenen Themengebieten aufrufen. Setzt einen installierten HTML-Browser voraus, funktioniert aber ohne Internet-Zugang

zurück zur Beschreibung des Hauptfensters



Die Statuszeile des Hauptfensters

Am unteren Rand des Hauptfensters befindet sich die Statuszeile, in der einige Informationen über den aktuellen Systemzustand und die letzte Meldung angezeigt wird, in bestimmten Situationen auch eine Übertragungs-Fortschritts-Anzeige (bei "Transfer in progress" etc).

Durch Anklicken des "Simulator"-Buttons kann das Fenster des LCD-Simulators geöffnet werden (falls es noch nicht sichtbar ist).

Das zweite Panel von links (hier mit der Aufschrift "Running") zeigt den aktuellen Zustand des Programmiertools bzw des eingebauten Firmware-Simulators. Mögliche Anzeigen sind:

  • Running: Die Applikation läuft grade (d.h. sie wird vom Firmware-Simulator abgearbeitet)
  • Stopped: Die Applikation wurde angehalten (z.B. beim Verschieben von Anzeigeelementen im LCD-Simulator, aber auch nach Auslösen eines Programm- oder Daten-Haltepunktes)
  • Transfer: Es findet momentan eine Program-Übertragung statt.

Das rechte Feld in der Statuszeile zeigt -wenn vorhanden- die letzte Fehler- oder Systemmeldung an, z.B. die erfolreiche Initialisierung des CAN-Interfaces.
Das rechte Feld in der Statuszeile dient auch für die Anzeige von Informationen des 'Wortes' (oder Teil eines numerischen Ausdrucks) unter dem Mauszeiger, wenn dieser wie hier beschrieben in einer der Definitionstabellen (z.B. Definition von Anzeigezeilen) bewegt wird. Die Anzeige von Fehlermeldungen hat in der Statuszeile Priorität vor der Anzeige von 'Informationen' zum Objekt unter dem Mauszeiger. Um von der Anzeige des letzten Fehlers wieder zurück zur Mauszeiger-Info-Anzeige umzuschalten klicken Sie einmal in das rechte Feld der Statuszeile. Ein Doppelklick auf eine Fehlermeldung in der Statuszeile schaltet auf die Registerkarte Fehler und Meldungen um.

Zu Testzwecken kann mit Hilfe der Statuszeile auch eine Kommandozeile an den in der UPT-Firmware enthaltenen Kommando-Interpreter gesendet werden. Geben Sie dazu das Kommando in das Meldungsfeld (rechts) ein, und beenden die Eingabe mit der Eingabetaste.

Zurück zur Beschreibung des Hauptfensters



LCD-Simulator und geräteabhängige LCD-Auswahl

Das Fenster des LCD-Simulators zeigt den Inhalt des LC-Displays des Terminals an, den Sie sehen würden, wenn Sie Ihre Anwendung bereits in das Terminal geladen hätten.

Screenshot LCD-Simulator

In den meisten Fällen zeigt dieses Fenster die aktuelle Seite der UPT-Applikation an.

Solange das Simulatorfenster den "Eingabefokus" hat (meistens erkennbar am blauen Fenstertitel), werden alle Tastatureingaben von der PC-Tastatur zum Terminal-Simulator durchgereicht.

Dies ermöglicht es, die Funktion Ihrer Anwendung zu testen, incl. der Navigation durch Menüs, der benutzerdefinierten Event-Handler und so weiter.

Das Fenster des LCD-Simulators kann unabhängig vom Hauptfenster bewegt und vergrößert werden. Es kann zu Vorführungen auch zum "Full-Screen" maximiert werden. Das Panel unterhalb des simulierten Displays zeigt den Zustand eventuell vorhandener Leuchtdioden, digitaler Ein- und Ausgänge an. Wenn diese Anzeigen nicht benötigt werden, oder der Platz auf dem PC-Bildschirm knapp wird, können Sie das untere Panel im Menü des Simulators auch abschalten.

Durch Klick in das Simulator-Fenster mit der linken Maustaste können Sie (im Modus "Editieren") einzelne Textzeilen selektieren und verschieben. Das Hauptfenster des Programmiertools schaltet dann automatisch zur Registerkarte Anzeige-Definition  ("Seite N") um, auf der Sie alle Eigenschaften der grade selektierten Anzeige-Zeile sehen und einstellen können.

Zum Verschieben einer Anzeigezeile auf dem simulierten LCD halten Sie die linke Maustaste gedrückt, während Sie die Maus langsam verschieben (dies funktioniert bei "normalen" Anzeigeelementen, bei denen die X/Y-Position in der Anzeige-Definitions-Tabelle einstellbar ist).

Bei der Simulation von Geräten mit Touchscreen dient die linke Maustaste als Ersatz für den "Finger" (bzw. Touch-Pen) auf der Sensorfläche. Ob das simulierte Gerät über einen Touchscreen verfügt, kann im Dialogfenster für die unterstützten Grafik-Funktionen eingestellt werden.

Durck Klick in das Simulator-Fenster mit der rechten Maustaste wird ein Popup-Menü geöffnet, welches Ihnen Funktionen zum Einfügen verschiedener Anzeigeelemente bietet, und wo z.B. die Simulation des Drehknopfes durch das Mausrad konfiguriert werden kann. Die Option 'Immer im Vordergrund' (stay on top) ist hilfreich, wenn nur ein einziger Monitor am PC angeschlossen ist, und der Platz auf dem Bildschirm bei der Programmentwicklung knapp wird - speziell beim Debuggen im Script-Editor. So bleibt der Simulator sichtbar, auch wenn das Hauptfenster maximiert ist und den (Windows-)Fokus hat.

Bei vielen überlappenden Grafik-Elementen kann es schwierig sein, per Mausklick das gewünschte Element zu 'erwischen'. Daher kann die Selektion alternativ auch per Maus-Scrollrad(!) erfolgen, während der Eingabefokus in der Definitionstabelle (im Hauptfenster) liegt.
Um nicht nur das aktuell selektierte Element, sondern alle auf der aktuellen Seite befindlichen Anzeige-Elemente (bzw. deren rechteckige Flächen) zu markieren, drücken Sie die Control-Taste (bzw. 'Strg' auf einer deutschen Tastatur). Die rechteckigen Bereiche werden dann transparent mit verschiedenen Farben markiert, mit der Nummer der Definitionszeile jeweils in der oberen linken Ecke der Farbmarkierung:


Anzeige im LCD-Simulator mit mehreren transparent markierten Elementen.
Der Simulator kann dies 'immer', 'nie', oder bei gedrückter Strg-Taste anzeigen.

Unabhängig von den oben gezeigten transparenten Markierungen versucht das Programmiertool beim Mausklick in den LCD Simulator (bei gestoppter Simulation) die Definition des angeklickten Grafikelements auf der aktuellen Seite zu finden, und schaltet bei Erfolg auf die entsprechende Registerkarte um. Dies wird meistens die Tabelle unter Anzeigezeilen-Definitionen sein, gelegentlich (z.B. beim Zeichnen mehrere Icons per Kommandozeile) aber auch die Tabelle unter Weitere Kommandos. In beiden Fällen wird der Teil der Kommandozeile oder des Format-Strings, mit dem der angeklickte Grafikbereich gezeichnet wurde, in der Definitionstabelle grün markiert.

Sie können den Inhalt des simulierten LCDs in die Windows-Zwischenablage (clipboard) kopieren. Klicken Sie dazu auf den 'Menü'-Button des Simulators, und wählen die Funktion Bild in Zwischenablage kopieren. So können "Schnappschüsse" aus dem LCD-Simulator in eigene Dokumente übernommen werden, z.B. für Handbücher und Beschreibungen für den Bediener. Bei bestimmten Geräten (mit aktivem CAN-Bus) können Bildschirm-Schnappschüsse vom echten Terminal als Bitmap-Datei ausgelesen werden - siehe Beschreibung "Snapshot via CAN" .

Falls die Einstellungen des LCD-Simulators nicht mit dem Zielgerät übereinstimmen, rufen Sie den Dialog zum Einstellen des LCD-Simulators auf (dazu gehören die Dimensionen des LC-Displays und das Farbmodell).

Tip zum "Rahmen" bzw. Hintergrundbild des LCD-Simulators:
Um Schaltflächen oder andere Grafikobjekte genau neben den Funktionstasten des Terminals auszurichten, schalten Sie das passende Hintergrundbild im LCD-Simulator ein (im Menü des Simulators). Im Unterverzeichnis backgrounds ("Hintergründe", s.U.) finden Sie das zu einigen Front-Panels passende Bild. Andernfalls (z.B. bei kundenspezifischen Tastaturen):
Bei kundenspezifischen Tastaturen wird i.A. nur die Oberfläche anders bedruckt, die Position der Tasten aber nicht geändert. Daher eignen sich die Hintergrundbilder der Standard-Tastaturen normalerweise auch für kundenspezifische Tastaturen. Zur Not können Sie sich einen eigenen Simulator-"Rahmen" per Malprogramm als Bitmap-Datei erstellen. Beachten Sie dabei, daß der schwarz umrahmte Bereich des LCDs exakt der Größe des simulierten Displays (in Pixeln) entsprechen muß. Alles innerhalb des LCD-Rahmens bleibt weiß.
Für ein selbst erzeugtes Hintergrundbild (lcdsim_XYZ.bmp) muss auch die dazu passende Beschreibungsdatei (lcdsim_XYZ.txt) angelegt werden. Darin sind u.A. die Koordinaten der per Maus anklickbaren Tasten enthalten. Ein gutes Beispiel finden Sie in der Beschreibungsdatei des Hintergrundbilds für das MKT-View II .

Anno 2013 enthielt der Installer für das Programmiertool die folgenden 'Standard'-Hintergrundbilder, und einige wenige anwenderspezifische Designs:

lcdsim_128_64.bmp, u.A. für UPT 515 (128*64 Pixel)

lcdsim_128_160.bmp,
u.A. für HBG 18 (128*160 Pixel)

lcdsim_abe167.bmp, für 'ABE' handheld (128*64 Pixel)

lcdsim_320_240.bmp, für alte MKT-Views, 320*240 Pixel

lcdsim_scandi320.bmp,
für OEM design (320*240)

lcdsim_mktview_2.bmp, für MKT-View II/III, 480*272 Pixel

lcdsim_dt85.bmp, für DT85, 320*240 Pixel
Platz für ein weiteres Design..
lcdsim_no_background.bmp :

Wählen Sie diese Datei wenn kein
Hintergrundbild angezeigt werden soll.

Zurück zur Übersicht



Geräteauswahl und LCD-Einstellungen (Auflösung, Farbmodell, Quer/Hochformat)

Das UPT-Programmiertool unterstützt sehr unterschiedliche Displays. Normalerweise erkennt das Tool den Typ des angeschlossenen Displays selbst, wenn ein Programm zwischen PC und Display übertragen wird. Alle nötigen Informationen über das Display werden dann aus dem angeschlossenen Gerät gelesen und in der UPT-Programdatei mit abgelegt. Wenn Sie eine UPT-Programmdatei von der Festplatte laden, werden die LCD-Einstellungen daher i.A. automatisch angepaßt.

Wenn Sie allerdings keine Möglichkeit haben, das Programmiertool direkt mit dem Zielsystem (target) zu verbinden, müssen Sie den Typ des verwendeten Displays selbst einstellen (sonst könnte die Anzeige im LCD-Simulator stark von dem abweichen, was Sie später auf den echten Terminal sehen..). Um dies zu tun, starten Sie den folgenden Einstelldialog (aus dem Hauptmenü unter "Optionen"..."Geräteauswahl / LCD-Eigenschaften"):

Einige Beispiele:

HBG35_CM3:
Handbediengerät mit 3.5" TFT-Bildschirm, 240 * 320 Pixel (Hochformat), TFT mit 65535 Farben (16 Bit/Pixel), 21-Tasten mit "Nussecken"-Cursorblock. "CM3" steht für die CPU-Familie "ARM Cortex-M3", in diesem Fall ein LPC1788.

MKT-View II, Landscape (Querformat)
Gerät für den Einsatz im KFz, Bildschirm mit 480 * 272 Pixel, TFT mit 256 Farben (8 Bit/Pixel), Touchscreen.
Dieses Gerät wurde vom MKT-View III mit schnellerer CPU abgelöst.

MKT-View II, Portrait (Hochformat)
Bildschirm mit 272 * 480 Pixel, sonst wie oben (identisches Gerät, nur um 90° oder 270° verdrehte Einbaulage).
Siehe auch: Auswahl der Drehrichtung für den 'Portrait-Modus' im Geräte-Setup.

MKT-View III, Landscape (Querformat) und Portrait (Hochformat)
Bildschirm mit 480 * 272 bzw 272 * 480 Pixel, 4.3"-TFT mit 65535 Farben (16 Bit/Pixel). Nachfolger vom MKT-View II mit deutlich schnellerer CPU (Cortex-M3).

MKT-View IV, Landscape (Querformat) und Portrait (Hochformat)
Bildschirm mit 800 * 480 bzw 480 * 800 Pixel, 7"-TFT mit 65535 Farben (16 Bit/Pixel). Funktionalität ähnlich wie MKT-View II/III, aber schnellere CPU (Cortex-M4F mit Hardware-Fliesskommaheinheit).

MKT-View V, Landscape (Querformat) und Portrait (Hochformat)
Nachfolger vom MKT-View III mit wesentlich schnellerer CPU und mindestens einem CAN-FD-fähigem CAN-Interface.

UPT 320 "Color":
Gerät für den Einbau im Schaltschrank, mit 5.7" - Bildschirm mit 320 * 240 Pixel, TFT mit 65536 Farben (16 bit / pixel), Touchscreen, Drehknopf, ARM CPU, Tastatur mit 6 (?) Funktionstasten.
Ersatz für das nicht mehr produzierbare "UPT 167 Color". Firmware verfügbar für CAN / CANdb (#11352) und für CANopen (#11353) .

UPT 800:
7" - Anzeige-Panel mit 800 * 480 Pixel ("WXGA"), TFT mit 65536 Farben (16 bit / pixel), Touchscreen, ARM CPU, aber weder Drehknopf noch Tastatur.
Für Einbau in Schaltschrank. Bislang (2011-11) nur als Prototyp mit "CANdb"-verfügbar. Firmware #11372 (für Controller Typ LPC2478).

UPT515:
Altes Gerät mit monochromen (grünlichem) LCD-Bildschirm, 128 * 64 Pixel, 8-Bit-CPU (8051-Derivat).

UPT 167 "monochrom":
Altes Gerät mit Monochrom-LCD (schwarz/weiß), 320 * 240 Pixel, 16-Bit-CPU (C167).

UPT 167 "Color":
Altes Gerät mit 5.7"-Passiv(!)-Farb-LCD, 320 * 240 Pixel, 4 Bit/Pixel (16 Farben).
Wird nicht mehr produziert (2009); Ersatz durch MKT-View III oder "UPT 320 Color".

MKT-View, MKT-View "+", CANdb oder CANopen:
Historisches Gerät für den Einbau im KFZ. Monochromer Bildschirm (schwarz/weiß), 320 * 240 Pixel, 16-Bit-CPU (C167). Optionaler CAN-Logger (beim MKT-View "Plus").

MKT-View "+", CANdb oder CANopen, Hochformat (bzw "Portrait Mode")
Wie oben, allerdings 240 Pixel (Breite) * 320 Pixel (Höhe) .

Eine aktuelle Liste verfügbarer Anzeigegeräte finden Sie nur auf der MKT-Webseite.

Siehe auch: Feature matrix (für verschiedene Terminals), General settings (tab), Unterstützte Grafikfunktionen (Dialog), Inhaltsübersicht



Kommunikations-Kanäle

Die Registerkarte "Channels" dient zur Definition der Kommunikationskanäle, die das Terminal benötigt um mit anderen Geräten im CANopen-Netzwerk zu arbeiten (aus diesem Grund fehlt diese Seite im Programmiertool für Geräte mit "CANdb-Parametrierung")

Es gibt verschiedene Arten von Kommunikationskanälen:

  • SDO-Kanal (Service Data Object)
    eine "langsame" device-to-device - Verbindung nach CANopen, mit der der Zugriff auf das sogenannte object dictionary eines Gerätes möglich ist. Viele verschiedene Objekte können auf diese Weise durch einen einzigen SDO-Kanal angesprochen werden !
  • PDO-Kanal (Process Data Object)
    ein "schneller" Kommunikations-Kanal mit dem Prozeßdaten (z.B.digitale Eingänge, analoge Sensordaten usw) im CANopen-Netzwerk transportiert werden.
  • 'Signale' die in einer CAN-Datenbank (z.B. *.dbc- oder *.arxml-Datei) definiert sind, ohne spezielles Übertragungsprotokoll. Details zu Variablen, die (über ihre Kanalnummer) mit CAN-Signalen verknüpft sind, finden Sie hier. Derartige Kanäle stehen nur im Programmiertool für Terminals mit CANdb-Funktionalität zur Verfügung, an dieser Stelle wird nicht weiter darauf eingegangen.
  • Kanal für LIN-Bus-Signale
    Bei Geräten mit einem optionalen LIN-Bus-Monitor dient Kanalnummer 31 als Kennung für Variablen, die mit (jeweils einem) LIN-Bus-Signal verbunden sind. Der Aufbau der 'Datenbits' im LIN-Bus-Frame werden intern wie beim CAN-Bus beschrieben. Bis auf die Kanalnummer ähnelt die Definition eines LIN-Signals daher einem per CAN-DBC beschriebenenen CAN-Bus-Signal (geplant: Ersatz der DBC-Datei durch eine LDF-Datei).
  • Kanal für openABK-Variablen und -Mailboxen (Client-Seite)
    Variablen, die der optionale openABK-Client im Terminal aktiv von einem abgesetzten openABK-Server anfordern (d.h. z.B. per DAQ-Liste auslesen) soll, erhalten in der Variablen-Definitions-Tabelle Kanalnummer 32. Details zum Thema openABK finden Sie in einem separaten Dokument.

Bei Variablen wird der Typ eines Kommunikationskanals indirekt durch die Kanalnummer festgelegt (falls die Variable über einen Kommunikationskanal mit der "Außenwelt" kommuniziert).

Hinweis: Das Terminal sollten an PDO-Kanäln nur "lauschen". Es kann keine Sendung eines PDO-Telegramms von einem anderen Gerät anfordern (denn dies könnte schwere Probleme hervorrufen, den CAN-Identifier dürfen immer nur von einem einzigen Netzknoten gesendet werden ...)

Sie müssen (außer bei "CANdb") wenigstens einen Kommunikationskanal für jedes Gerät definieren, mit dem das Terminal kommunizieren soll. Die Kanäle werden später benötigt um Werte aus anderen Geräten in Variablen des Terminal-Programms zu übertragen.

Siehe auch:

Zurück zur Übersicht



SDO-Kanäle

Hinweis:
SDO-Kanäle werden nur von bestimmten Terminals unterstützt - siehe "Feature Matrix" .

SDO-Kanäle bieten eine vielseitige aber relativ langsame Punkt-zu-Punkt (device-to-device) -Verbindung mit der Daten aus dem Objektverzeichnis (object dictionary) eines CANopen-Gerätes ausgetauscht werden können.

Sie müssen die CAN-Identifier aller benötigten SDO-Kanäle definieren, über die das Terminal später (als Client) kommunizieren soll.  Sie können dazu -wenn vorhanden- ein CANopen-Konfigurationstool verwenden, oder die folgende SDO-Kanal-Definitionstabelle:

Sie können die benötigten CAN-Identifier in der Beschreibung des Gerätes finden, welches einen bestimmten SDO-Kanal bietet, oder im CANopen Draft Standard 301 (CiA "DS301"). Die meisten E/A-Module (I/O-devices) verwenden den sogenannten (und kaum ins Deutsche übersetzbaren :) "pre-defined connection set" mit den folgenden CAN-Identifiern (die in DS301 sinnigerweise "COB-IDs" genannt werden).

SDO(server->client) : CAN-Identifier = (1408+node-ID) = 1409...1535

SDO(client->server) : CAN-Identifier = (1536+node-ID) = 1537..1663

Alle hier gezeigten CAN-Identifier sind dezimal notiert. Der "client->server"-ID wird vom Client (in diesem Fall das UPT) zum Server (zum Beispiel ein I/O-Modul) gesendet wird um die Übertragung zu starten (initiate a transfer, hier "request"). Der "server->client"-ID wird im Antworttelegramm vom Server zum Client verwendet. Falls Sie die hexadezimale Notation bevorzugen, können Sie dies unter "ID format" einstellen.

Tip: Wenn Sie in der oben abgebildeten Tabelle alle Zellen löschen, und nur die Server Node ID's eingeben (d.h. Knotennummer der SDO-Server, die der im Terminal eingebaute SDO-Client ansprechen soll). Klicken Sie danach auf "Apply" (Anwenden), und das Programmiertool ergänzt die CAN-IDENTIFIER (COB-Id's) so daß diese dem "predefined connection set" entsprechen.

Vorsicht, Falle !
Ein SDO-Kanal ist immer nur eine "Punkt-zu-Punkt"-Verbindung zwischen genau zwei Partnern. Sie müssen sicherstellen, daß sie nur SDO-Verbindungen verwenden die noch nicht von anderen Geräten "in Beschlag" genommen sind. Wenn ein einfaches E/A-Modul beispielsweise nur einen einzigen SDO-Kanal bietet und dieser bereits von einem anderen Gerät (z.B. PLC, SPS, Antriebsregler etc) belegt ist, dann dürfen Sie diesen SDO-Kanal nicht für das TERMINAL verwenden !
Grund: Dies würde schwere Kollisionen und Protokollverstöße im CANopen-Netzwerk verursachen, auch auf Bus-Ebene, weil ein bestimmter CAN-Identifier immer nur von einem einzigen Knoten gesendet werden darf - und das ist beim im Fachchinesisch 'default SDO' genannten Kanal immer der CANopen-Master. Nur wenige CANopen-Slaves verfügen über mehr als einen SDO-Kanal, um per SDO auch von anderen Knoten per SDO ansprechbar zu sein).

Im alten UPT515 musste immer eine Variable über einen SDO-Kanal mit einem anderen Gerät im Netzwerk verbunden sein.
Beim "MKT-View mit CANopen" und anderen (neueren) UPT's mit 16- oder 32-Bit-CPU können direkte SDO-Lesezugriffe auch direkt per Interpreterfunktion sdo(<index>.<subindex>, <Datentyp>) durchgeführt werden, ohne Verwendung einer Variablen.

Siehe auch:




PDO-Kanäle

Hinweis:
PDO-Kanäle werden nur von bestimmten Terminals unterstützt - siehe "Feature Matrix" .

PDO-Kanäle stellen einen "schnellen" Übertragungskanal für Prozeßdaten mit hoher Priorität dar, z.B. für digitale Eingänge, analoge Sensordaten usw. Ein PDO-Telegram kann verschiedene Werte enthalten (falls das sendende Gerät "variables PDO-mapping" bietet). Weitere Informationen sind dem CANopen-Standard zu entnehmen, der von der CiA veröffentlicht wurde.

Im Gegensatz zur SDO-Kommunikation stellt ein einzelner PDO-Kanal immer eine Einbahnstraße dar, d.h. die Übertragungsrichtung ist im Betrieb nicht umschaltbar !

Die folgende Tabelle im Programmiertool dient zur Definition aller PDO-Kanäle ("RX" und "TX", aus der Sicht des Terminals):

Definieren Sie für jeden verwendeten PDO-Kanal:

Im (alten) UPT515 sollte eine Variable verwendet werden, um Werte aus einem PDO-Kanal aufzunehmen, bzw um Werte in zu sendenden PDO-Kanal einzusetzen.

Im (neueren) UPT II (z.B. UPT128, UPT320, UPT800) existieren spezielle Variablen im CANopen-Objektverzeichnis, deren einziger Zweck es ist in PDOs gemappt zu werden. Diese speziellen Variablen werden durch ihren CANopen-Index und -Subindex adressiert. Da diese Variablen immer exisiteren, sind sie auch in der EDS-Datei beschrieben, und sind daher auch für CANopen-Konfigurationstools transparent. Näheres dazu im Dokument zu CANopen "V4" .

Äußerste Vorsicht ist geboten, wenn Sie PDO-Telegramme in ein Ihnen unbekanntes Netzwerk senden wollen ! Das Senden falscher Identifier kann katastrophale Folgen haben, darum konnte das UPT ursprünglich auch keine PDOs senden sondern nur empfangen (diese Einschränkung mußte aufgehoben werden, weil jemand das Anzeigeterminal auch als Steuerungszentrale einsetzen wollte). Üblicherweise wird zur Konfiguration eines CANopen-Netzwerk ein entsprechendes Konfigurationstool eingesetzt, mit dem -unter anderem - auch alle Prozessdatenkanäle definiert werden. Bei Geräten mit CANopen V4 (siehe Feature Matrix) werden die PDOs daher ausschliesslich über die dafür im CANopen-Kommunikationsprofil vorgesehenden Objekte konfiguriert, so daß die PDO-Parameter auch für das Konfigurationstool zugänglich sind. Weitere Informationen dazu finden Sie in einem gesonderten Dokument.

In einem CAN-Netz ist es nicht zulässig, daß mehrere Geräte ("Knoten") Telegramme mit dem gleichen CAN-Identifier senden. Auch aus diesem Grunde sollte das Terminal ursprünglich nur an PDO-Kanälen "lauschen" aber selber keine PDOs senden.
PDO-Kanal-Definitionen können notfalls auch zur Laufzeit mit dem UPT-Interpreter beeinflußt werden. Siehe PDO-Funktionen.

Siehe auch:



PDO-CAN-Identifier
Sie müssen die CAN-Identifiers aller verwendeten PDO-Kanäle (die das Terminal empfangen oder senden soll) definieren. Die Identifier-Werte finden Sie in der Beschreibung des Gerätes, das ein bestimmtes PDO-Telegramm sendet, oder im CANopen Draft Standard 301 (CiA "DS301"). Die meisten I/O-Geräte verwenden ein sogenanntes "pre-defined connection set" mit den folgenden Definitionen für PDO-CAN-Identifier (die in DS301 "COB-IDs" genannt werden):

PDO1(tx) : CAN-Identifier = (384+node-ID)10 = 385...511

PDO1(rx) : CAN-Identifier = (512+node-ID)10 = 513...639

PDO2(tx) : CAN-Identifier = (640+node-ID)10 = 641...767

PDO2(rx) : CAN-Identifier = (768+node-ID)10 = 769...895

Die hier gezeigten CAN-Identifier sind dezimal notiert. Beachten Sie, daß "tx/rx" (Senden/Empfangen) in dieser Tabelle aus der Sicht des Gerätes zu sehen sind, die den PDO zur Verfügung stellt (dies ist nicht das Terminal ! Das Terminal ist nur der "Nutzer" !). Ein "tx"-PDO wird z.B. von einem I/O-device gesendet und vom UPT empfangen. Zulässige node-IDs (Knotennummern) sind 1..127. Einfache Geräte wie I/O-Module verwenden oft einen DIP-Schalter um den Node-ID einzustellen.

Beispiel:
Sie wollen den Zustand der digitalen Eingänge eines E/A-Moduls empfangen. Das Modul verwendet PDO1(tx) um Prozeßdaten zu senden, in denen die Zustände der digitalen Eingänge enthalten sind. Der Node-ID des E/A-Moduls möge "1" sein, der resultierende CAN-Identifier ist daher (384+1)=385(decimal).
Um diesen PDO mit dem Terminal zu empfangen, wollen Sie beispielsweise(!) den ersten PDO-Kanal des UPTs verwenden. Geben Sie den Wert "385" in der Spalte "CAN-ID of PDO" ein. Das UPT wird nun in der Lage sein, ein PDO-Telegramm mit diesem Identifier zu empfangen, und Sie können ein paar Variablen definieren die von Teilen des PDO-Telegramms (als Eingangswert) "gespeist" werden.

Hinweis:
Wird die 'Knotennummer' (node-ID) eines CANopen-Gerätes geändert, dann ändern sich auch die CAN-Identifier für die Prozessdatenkommunikation. (Dies ist in CANopen CiA "DS301" als 'predefined connection set' spezifiziert; s.O.). Sollte die Applikation für einen oder mehrere PDOs vom 'predefined connection set' abweichende CAN-Identifier erfordern, setzten Sie bitte erst die neue Node-ID im Gerät und im Programmiertool (wodurch die meisten CAN-IDs wieder auf Defaultwerte gesetzt werden, nicht nur für die PDOs), und ändern danach die CAN-Identifier für die Prozessdatenkommunikation auf der Registerkarte 'Kanäle' (Channels), Unterregister 'PDO', wie im oben gezeigten Screenshot.
Dies ist z.B. immer dann nötig, wenn mehrere CANopen-Slaves miteinander Daten per PDO austauschen sollen, ohne Umweg über den CANopen-Master. Dies wird in der CANopen-Fachliteratur auch als 'PDO-Linking' bezeichnet.

Bei Terminals mit CANopen V4 (seit April 2005, siehe Feature-Matrix) können die PDO-Parameter nicht per Interpreter modifiziert werden, sondern ausschliesslich durch die entsprechenden Objekte im CANopen-Object-Dictionary !

DO-Übertragungsrichtung (transmission direction)
Alle Geräte mit CANopen können PDOs nicht nur empfangen, sondern auch senden. Aus diesem Grund müssen Sie nun auch definieren, ob ein PDO aus Sicht des Terminals empfangen(1), gesendet(2) wird oder passiv bleibt(0). Bei Geräten mit CANopen V4 ist die Sende- oder Empfangrichtung aller PDO-Kanäle dagegen fest vorgegeben (wie bei einem "normalen" CANopen-Gerät). Siehe Feature-Matrix !

Hinweis: "Transmit" und "Receive" muß aus Sicht des Terminals gesehen werden !

PDO-Übertragungsart (transmission type)

Geräte mit CANopen-Protokoll unterstützten die meisten sogenannten "PDO transmission types".

Der PDO transmission type wird durch einen numerischen Wert definiert. Die Werte stammen aus CiA DS301.
Weitere Informationen finden Sie im CANopen Standard 'CiA 301', ehemals "DS 301", in der Beschreibung der Objekte 1400h-15FFh (PDO Communication Parameter), "Description of transmission type". Hier ein Auszug aus DS 301 V4.0:
PDO
Transmission Type

Cyclic

Acyclic

Synchronous

Asynchronous

RTR only
0   X X    
1-240 X
X    
241-251 reserved          
252     X   X
253       X X
254       X  
255       X  

Beschreibung einiger PDO-"transmission types", wurde aus verschiedenen Gründen nicht aus dem Englischen übersetzt:

  • A transmission type of zero means that the message shall be transmitted synchronously with the SYNC object but not periodically (?????).
  • A value between 1 and 240 means that the PDO is transferred synchronously and cyclically, the transmission type indicating the number of SYNC which are necessary to trigger PDO transmissions/receptions.
  • The transmission types 252 and 253 mean that the PDO is only transmitted on remote transmission request. The UPT treats both 252 and 253 exactly the same way.
  • Transmission type 254 is "manufacturer specific" (which is not defined yet).
  • Transmission type 255 is "defined in the decive profile" (which does not exist here).
  • For transmission types 254 and 255 you can use a PDO's Event Timer for cyclic (but not sync-related) transmissions. See transmission cycle .
Die Auswahl des 'Transmission Types' wird seit August 2013 durch den Dialog zum Einstellen der PDO-Kommunikations-Parameter erleichtert.

PDO Transmission Cycle (Übertragungszyklus)
Der 'PDO transmission cycle' (CANopen-Bezeichnung) wird für zyklische PDO-Übertragungen ohne SYNC-Objekt verwendet.

Dies funktioniert ähnlich wie der in CANopen DS301 V4.0 beschriebene "Event Timer", siehe Beschreibung von Objekt 0x1400, Subindex 5.

Hinweis: Seit September 2001 kann der Übertragungszyklus eines PDOs auch per UPT-Interpreter während der "Laufzeit" umprogrammiert werden. Siehe PDO-Funktionen.

NUR FÜR UPT515: Spezielle Flags in PDO-Kanal-Definitionen
Diese "Flags" wurden für "sehr spezielle PDOs mit festem Inhalt" implementiert.

Nur der letzte PDO-Kanal kann als "System-Zustands-PDO" betrieben werden, indem der FLAG-Wert auf "1" gesetzt wird.

Der "System-Zustands-PDO" hat den folgenden Inhalt:

  • Byte[0] = UPT run mode (1 = Normalbetrieb, etc)
  • Byte[1] = digitale Onboard-Eingänge
  • Byte[2] = Nummer der aktuell angezeigten Display-Seite
  • Byte[3] = Key-Matrix[0], die "ersten" 8 Tasten aus Sicht des Tastaturtreibers.
  • Byte[4] = Key-Matrix[1], die "nächsten" 8 Tasten aus Sicht des Tastaturtreibers.
Im Normalfall lassen Sie den FLAG-Wert auf Null. Nur dann kann das flexible TX-PDO-Mapping für Variablen genutzt werden. Der oben beschriebene 'feste' System-Zustands-PDO existiert nur im alten "UPT515" mit 8-Bit-CPU. Alle neueren UPTs (mit CANopen und 16- oder 32-Bit-CPU) verwenden grundsätzlich flexibles PDO-Mapping, welches ausschliesslich über die PDO-Mapping-Objekte eingestellt wird. Aus diesem Grund wird das oben beschriebene "feste" Mapping dort nicht mehr benötigt, und ist in der Tat nicht mehr in der Firmware implementiert.
Hinweis: Frühe Mustergeräte vom Typ 'UPT128' wurden mit einer Folientastatur mit der Aufschrift 'UPT515' ausgeliefert. In der Tat wird im UPT128 aber eine leistungsfähige 32-Bit-CPU verwendet, statt (wie beim "echten", alten UPT515) ein 8051-kompatibler 8-Bit-Controller.

PDO Mapping
Bei CANopen bedeutet 'PDO mapping' im Wesentlichen die Definition des 'Inhalts eines PDO-Telegramms' (CAN-Datenfeld mit Prozessdaten).
Die Beschreibung dieses recht komplexen Themas finden Sie in einem eigenen Dokument.



Applikations-Variablen (Display-Variablen)

Die Registerkarte "Variablen" des Programmiertools dient zur Definition aller Variablen, die im Terminal verwendet werden sollen.

Alle Variablen haben bestimmte Eigenschaften, die in einer Definitionstabelle eingestellt werden können.

Die meisten Variablen Ihres Anzeigeprogramms werden wohl mit einem Kommunikationskanal verbunden sein, sie können allerdings auch als rein "interne" Variablen zur Aufnahme von Hilfs- und Zwischenwerten verwendet werden.

 

Hinweise:

  • Auf alle "Display-Variablen" kann per Interpreter zugegriffen werden, denn eine Variable kann als Teil eines numerischen Ausdrucks verwendet werden.

  • Der Name einer Variablen muß immer mit einem Großbuchstaben beginnen, und er durfte bei alten Geräten nicht mehr als 8 Buchstaben umfassen. Bei Geräten mit CANdb-Funktionalität sind mindestens zu 16 Zeichen zulässig (abzulesen unter "General Settings", Konstante "max var name length").

  • Für Script-Variablen gilt diese Beschränkung nicht ! Script-Variablen werden nicht auf der Registerkarte 'Variablen', sondern im Script-Quelltext deklariert.

  • Variablen, deren Werte (ohne CANopen) vom CAN-Bus empfangen werden sollen, enthalten in der Tabellenspalte 'Signaldefinition' alle Informationen, die das Gerät später zum Decodieren der CAN-Daten benötig. Die Spezifikation dieser 'Signaldefinition' (für CAN) finden Sie hier.

  • Um einer Display-Variablen während der Laufzeit "programmgesteuert" einen neuen Wert zuzuweisen, verwenden Sie das Assign-Kommando ("@"). Sinnvoll ist dies i.A. nur bei Variablen, die ihren Wert nicht von einem Kommunikationskanal erhalten.

  • Display-Variablen können zur Laufzeit am Gerät inspiziert werden. Wählen Sie dazu im System-Menu, Untermenü "Diagnostics", die Funktion "Display Variables". Mit den Cursortasten, Drehknopf oder Joystick können Sie die Liste von Display-Variablen durchscrollen.

  • Um den Wert eines CANopen-Objektes auf dem Bildschirm anzuzeigen, ist es nicht nötig, dieses Objekt mit einer Variablen zu verbinden. Die Anzeige kann auf das Objekt (im 'eigenen' CANopen-Objektverzeichnis) auch direkt per CANopen index and -subindex ( obd(index.subindex) ) ansprechen.

Verwandte Themen:

Eigenschaften von Anzeige-Variablen

Anzeige-Variablen können in der folgenden Tabelle definiert werden (am linken Rand der Registerkarte "Variablen", bzw. "Variables" im unten gezeigten Screenshot).
Script-Variablen werden dagegen ausschliesslich im Script-Quelltext deklariert.
Netzwerk-Variablen sind eine Untermenge der Anzeige-Variablen, deren Definition z.B. aus einer DBC-Datei ("CANdb") importiert wurde, oder auf die (bei Geräten mit CANopen) per SDO 'von außen' zugegriffen werden kann.


(Beispiel einer Tabelle mit Variablendeklarationen; hier mit CANopen)

Eigenschaften einer Variablen sind:

  • Name : Bei kleinen Systemen (z.B. UPT515) bis zu 8 Zeichen, sonst 16 Zeichen
  • OD-Index (Object Dictionary Index) : Nur für CANopen. Damit kann die Variable mit dem 'eigenen' CANopen-Objektverzeichnis des Terminals verbunden werden.
    Details hier .
  • Kanal : Damit wird definiert, ob und wie diese Variable mit der Außenwelt verbunden ist :
    0...4 = SDO-Client (CANopen), 5...9 = SDO-Server (CANopen), 10..19 = PDO (CANopen),
    30 = per Datenbank (*.dbc, "CANdb") definiertes CAN-Signal (kein CANopen)
    31 = mit einem LIN-Bus-Signal verbundene Variable
    32 = per openABK-CLIENT aktiv von einem externen Server anzufordernde Variable
    33 = reserviert für openABK-Sonderfunktionen
    34...99 = reserviert für zukünftige Kommunikationskanäle
    100...149 = reserviert für Geräte mit mehr als 5 CANopen SDO clients
    150...199 = reserviert für Geräte mit mehr als 5 RPDOs (Receive-PDOs)
    200...249 = reserviert für Geräte mit mehr als 5 RPDOs (Receive-PDOs)
    250...254 = reserviert für zukünftige, "exotische" Kanaltypen
    255 = diese Variable ist nicht mit der Aussenwelt verbunden (sie existiert nur "intern")
  • Channel-params (Kanalparameter): PDO / SDO / CANdb_signal_definition (abhängig vom Kanaltyp; bei nicht verbundenen Variablen ohne Funktion)
  • Update Time (bzw "Zykluszeit" bei CAN-Signalen)
  • Data Type (Datentyp): Nur für 'interne' Variablen frei wählbar !
  • Unit (Einheit) : Nur für 'CANdb'; dort ist die physikalische Einheit in der Datenbank definiert
  • Access Rights (Zugriffsrechte): 0=nur Lesen, 1=Lesen/Schreiben, 3=nur Schreiben
  • Flags: Wird, wenn nötig, automatisch vom Programmiertool ausgefüllt
  • Value Table (Wertetabelle): Wird i.A. für CAN-Signale aus Datenbanken übernommen,
        um 'besondere' Werte nicht numerisch, sondern als Zeichenkette anzuzeigen.
    Syntax: <decimal value 1>=<display string 1>,<decimal value 2>=<display string 2>, ..
    Beispiel: 255=SNA,0=off,1=idle,2=normal,3=max dry,4=max reheat,5=combat
    Stimmt der CAN-Rohwert mit einem der hier definierten Werte überein, dann kann anstelle der üblichen numerischen Anzeige die entsprechende Zeichenkette angezeigt werden (z.B. "SNA" = "Signal Not Available" statt 255 oder "off" statt 0).
    Setzen Sie dazu die Basis in der Definition des Anzeige-Elements statt auf '10' (für dezimal) auf Null (=Anzeige wenn möglich aus Tabelle, sonst dezimal).
    Wertetabellen können notfalls auch im Programmiertool selbst (statt in der CAN-Datenbank) editiert werden. Klicken Sie dazu doppelt in die entsprechende Zelle in der Spalte 'Value Table'. Dadurch wird ein übersichtlicheres Editorfenster geöffnet, in dem je ein Wertepaar pro Zeile angezeigt wird (links der dezimale Wert, rechts der entsprechende Text für die Anzeige).

    Siehe auch: Decodierung von CAN-Signalen mit Wertetabellen (Funktionsbeschreibung).
  • Default Value: Anfangswert, falls der Wert nicht per Kommunikationskanal gesetzt wird.
  • min, max: Grenzwerte (limits), um den Wert für die Anzeige und beim Editieren zu begrenzen
  • factor, divisor, offset: Skalierungsparemeter (scaling) zur Umrechnung des per CAN(db) übertragenen Rohwertes in einen physikalischen Wert.
  • DAQ-Kanalnummer (DAQ = data acquisition unit; optional; Details hier )
  • Während der Laufzeit kann eine Variable gültig oder ungültig sein. Dies kann per Interpreter oder Script per <Variablenname>.va ("valid") abgefragt werden.

Während der Simulation (im Programmiertool) können in einer zusätzlichen Spalte der Tabelle auch die aktuellen Werte aller Variablen angezeigt werden. Setzen Sie dazu die Option Zeige aktuelle Werte in der Tabelle (letzte Spalte) im Kontext-Menü auf der Registerkarte Variablen.
Alternativ kann der aktuelle Wert (wie in anderen Tabellen) auch per Mausbewegung über der Zelle mit dem Variablennamen inspiziert werden.

Viele Eigenschaften einer Variable können auf dem "property"-Panel eingestellt werden:

Auf einige der hier gezeigten Variablen-Komponenten kann auch während der Laufzeit des Terminals per Interpreter oder per Script zugegriffen werden.

Aktualisierungszeit von Display-Variablen ('Update-Time' oder auch 'Sendezyklus')
Die Aktualisierungszeit einer Variablen definiert, wie oft die Variable durch ihren "Eingangskanal" aktualisiert werden soll. Dies funktioniert i.A. nur bei Variablen, die aktiv per Kommunikationskanal von einem externen Gerät angefordert werden.

Beispiel:

Eine Variable ist per SDO mit dem Analogeingang eines E/A-Moduls verbunden, und die Aktualisierungszeit ist auf "500" gesetzt.

In diesem Fall wird das Terminal (nach Möglichkeit!) alle 500 Millisekunden ein Anforderungstelegramm ("read request") per SDO SDO an das E/A-Modul senden. Sobald das E/A-Modul darauf antworted (mit einem "read response"-Telegram), wird der neue Wert aus dem Antworttelegramm übernommen und in einen 32-Bit-Wert für die Variable konvertiert.


Nur für Variablen die per importierter Datenbank (*.dbc) mit CAN-"Signalen" verbunden sind:
Hier bedeutet 'update time' eher 'Übertragungszyklus'. Manche CAN-Rahmen ("Messages") könnten nur APERIODISCH (oder "sehr selten") übertragen werden.
Bei (aus Sicht des Displays) zu sendenden CAN-Signalen definiert der Wert in der Spalte 'Upd-Time' den Sendezyklus (für periodisch gesendete CAN-Telegramme).

Der Sendezyklus kann notfalls auch per Kommando während der Laufzeit geändert werden, z.B.:
      ThreeSines1.cy := 0;    // Turn off the periodic transmission
       ThreeSines1.cy := 300;  // Periodically transmit every 300 ms
(Quelle: Beispielprogramm ?/programs/CdbSendT.cvt, Seite 4)

Datentyp einer Variablen
Der Datentyp einer Variablen definiert das interne Speicherformat und den zulässigen Wertebereich (falls es eine numerische Variable ist). Das UPT515 unterstützte seinerzeit nur numerische Datentypen nach dem CANopen-Standard, aber keine Fließkommazahlen. Fast alle Werte wurden beim UPT515 intern in 32-Bit-Integerzahlen umgewandelt (dies ist das Format für alle Variablen und numerischen Ausdrücke im UPT-Interpreter). Alle neueren Geräte mit 16- oder 32-Bit-CPU (MKT-View II,III,IV) unterstützen Fließkommawerte.

Die Datentypen in der Variablen-Deklarations-Tabelle des Programmiertools verwenden (aus historischen Gründen) die im CANopen-Standard spezifizierten Datentypen, selbst wenn das Terminal kein CANopen (sondern z.B. per "CAN-Datenbank definierte Signale") verwendet:

Indicator /
Type Name
Code (dezimal,
frei nach CANopen)
Beschreibung des Datentyps
Hinweise
UNKNOWN 0 unknown
BOOL 1 BOOLEAN
I8 2 8 bit SIGNED integer (MIT Vorzeichenbit)
I16 3 16 bit SIGNED integer (MIT Vorzeichenbit)
I32 4 32 bit SIGNED integer (MIT Vorzeichenbit)
U8 5 8 bit UNSIGNED integer (OHNE Vorzeichenbit)
U16 6 16 bit UNSIGNED integer (OHNE Vorzeichenbit)
U32 7 32 bit UNSIGNED integer (OHNE Vorzeichenbit)
F32 8 32 bit floating point (Fliesskommazahl) vom UPT515 nicht unterstützt
STR 9 "visible" string ("druckbare" Zeichenkette)
OCT 10 Octet string ( eine CANopen-Spezialität ! ) noch nicht unterstützt

Wenn eine Variable mit einem "CAN-Signal" verbunden ist, wird ihr Typ im Programmiertool nur als 'S' (signed) oder 'U' (unsigned) statt der oben aufgelisteten Codes angezeigt. Intern wird der Wert aber in den am besten geeigneten Typ umgewandelt, z.B. von 'S' in einen Fließkommawert, wenn das CAN-Signal mit einen entsprechenden Skalierungsfaktor definiert ist.

Die noch exotischeren CANopen-Datentypen (wie z.B.  0x0C, "time of day") werden bislang weder von den programmierbaren Terminals, noch vom Programmiertool unterstützt.

Tipp: Der Datentyp einer Variablen kann ggf. auch während der Laufzeit mit der Variablen-Komponente "ty" (type) abgefragt werden. Um aus dem numerischen Code einen Indikator zu machen, verwenden Sie die Funktion type2str() (type-to-string). Ähnliches gilt in der Script-Sprache für jede Variable, deren Typ bei der Erstellung der Applikation noch unbekannt ist ("anytype").

Zugriffsrechte einer Variablen
Die Eigenschaft "Zugriffsrechte" einer Variablen ("access rights" nach CANopen) definieren, ob sie per Zugriffskanal gelesen und/oder modifiziert werden darf.
Beispiel:
Eine Variable ist dem Analogausgang eines E/A-Moduls per SDO verbunden, und Sie wollen den den Spannungswert des Ausgangs mit dem Terminal einstellen. Nach dem Ändern des Wertes der entsprechenden Variablen (durch Editieren in einem Eingabefeld oder durch Zuweisen eines neuen Wertes mit dem assign-Kommando), wird das Terminal einen Schreibbefehl ("write request"-Telegramm) per SDO zum E/A-Modul senden, damit dieses den neuen Wert auf dem D/A-Wandler ausgibt. Zu diesem Zweck muß die Variable mindestens SCHREIBBAR sein.

Eine Variable mit "read-only"-Zugriff wird niemals per Kommunikationskanal an ein externes Gerät gesendet (selbst wenn der Kanal dazu in der Lage wäre).

Eine Variable mit "write-only"-Zugriff wird niemals per Kommunikationskanal von einem externen Gerät ausgelesen.

Die Zugriffsrechte einer Variablen werden i.A. als numerische Werte nach CANopen-Standard codiert.

Zulässige Werte sind (bei CANopen):
0 = Read Only
1 = Read/Write
2 = Write Only

Bei Variablen, die mit CAN-Signalen verbunden sind, zeigt die Spalte "Access" lediglich an, ob das Signal aus Sicht des Terminals empfangen oder gesendet wird (Empfang ist dabei der Normalfall, Senden wird erst mit einer neuen Firmware ab November oder Dezember 2009 möglich sein) :

Mögliche Werte in der Spalte "Access" für Variablen, die mit je einem CAN-Signal verbunden sind:
RX = Das Terminal empfängt dieses Signal (und alle anderen Signale, die im gleichen CAN-Telegramm enthalten sind !)
TX = Das Terminal sendet dieses Signal (und, zwangsläufig, alle anderen Signale die im gleichen CAN-Telegramm enthalten sind !)
Im Gegensatz zu CANopen sind kombinierte Schreib-/Lesezugriffe vollkommen unmöglich,
da in der CAN-Datenbasis (CANdb-Datei) keine Protokolle definiert sind, die für derartige Zugriffe nötig wären !

Diese Werte sehen Sie auch in der Combo-Liste auf dem "property"-Panel einer Variablen im Programmiertool.

Auffinden aller Referenzen (Bezüge) einer Variable

In komplexen Anzeigeprogrammen stellt sich gelegentlich die Frage, wo (bzw. ob) eine Variable verwendet wird.
Eine Möglichkeit um dies herauszufinden ist die Suche nach dem Variablennamen per Texteditor in der Programmdatei (*.upt oder *.cvt).
Alternativ kann auch das Programmiertool nach allen Referenzen (d.h. "Verwendungen" oder "Bezügen") einer Anzeige-Variablen suchen. Diese Funktion kann über das Kontext-Menü der Variablen-Deklarations-Tabelle aufgerufen werden:
  • Klicken Sie auf die zu suchende Variable in der Variablen-Definitions-Tabelle (z.B. "Tank1Level", s.U.),
  • Klicken Sie auf den 'Menü'-Button oberhalb der Tabelle, oder klicken Sie mit der rechten Maustaste erneut in die Tabelle.
Im daraufhin angezeigten Kontextmenü wählen Sie die Funktion 'Suche nach Bezügen auf Variable "XYZ" in der Applikation':


(Screenshot des Kontext-Menüs in der Variablen-Deklarations-Tabelle)

Das Programmiertool sucht dann nach dem ausgewählten Variablennamen, und zwar in ...

Die Suchergebnisse werden in einem neuen Fenster angezeigt, z.B.:


(Screenshot der Ergebnisanzeige der 'Suche nach Variablen-Referenzen")

Eine ähnliche Funktion wie die oben vorgestellte Suche nach Variablennamen ist die 'globale' Textsuche, die u.A. über das Hauptmenü des Programmiertools ('Bearbeiten' .. 'Suche (global)') oder aus dem Kontext-Menü des Script-Editors aufgerufen wird.
Im Gegensatz zur Variablen-Suche werden bei der Textsuche auch Zeichenketten in Anführungszeichen, d.h. String-Konstanten, durchsucht.

Per Mausklick in eine der Ergebniszeilen im oben gezeigten Anzeigefenster schaltet das Programmiertool zu der Registerkarte / Tabelle / Quelltextzeile um, in der die Variable (bzw. der gesuchte Text) gefunden wurde.
Lediglich Text in Anführungszeichen, d.h. Zeichenkonstanten, sind von der Suche ausgeschlossen.
Diese Funktion bietet eine schnelle Übersicht über alle 'Verwendungen' (Referenzen, Bezüge, Verweise,..) auf eine bestimmte Variable. So können z.B. verwaiste (nicht mehr verwendete) Variablen erkannt werden.
Um das modale Fenster zu schließen, klicken Sie abschließend auf 'Ok' oder 'Cancel'.

Die Suchergebnisse werden neben dem oben gezeigten Fenster auch auf der Registerkarte 'Fehler' ( → 'Fehler und Meldungen') angezeigt. Von dort können sie z.B. per Copy and Paste in eigene Dokumentationen übernommen werden. Per Doppel- oder Rechtsklick auf ein Suchergebnis unter 'Fehler & Meldungen' kann ebenfalls zur Fundstelle (Display-Seite, Script-Quelltext, etc) umgeschaltet werden. Durch Umschalten zwischen den Registerkarten 'Script' und 'Fehler' kann bequem zwischen Quelltext und der Liste aller Fundstellen (als 'Navigationshilfe') gewechselt werden.

Eine ähnliche 'globale Suche' (d.h. auf allen Seiten, in Definitionen von Anzeige-Elementen, Ereignissen, usw.) kann auch aus anderen Kontext-Menüs aufgerufen werden, z.B. aus der Display-Definitions-Tabelle, der Event-Definitions-Tabelle, und aus dem CAN-Simulator.

  Zurück zur Übersicht 'Applikations-Variablen'

Siehe auch: Deklaration von Script-Variablen .

Variablen mit Verknüpfung per CAN-Datenbank

Nur für bestimmte Terminals mit der Fähigkeit CAN-Signale zu empfangen !
NICHT FUER TERMINALS MIT CANopen-kompatiblen Protokollen !

Details zu Variablen, die mit CAN-Signalen gekoppelt sind,
finden Sie in einer externen Datei (bitte diesem Link folgen).


Wenn eine Display-Variable per Kommunikationskanal ohne CANopen mit einem CAN - Signal verbunden ist, stehen in der Spalte "message/signal definition" in der Variablendefinitionstabelle alle Informationen, die das Terminal später (zur Laufzeit) benötigt um dieses Signal zu empfangen und den Wert aus dem empfangenen CAN-Telegramm zu isolieren. Dies ist recht kompliziert und hat nichts mit CANopen zu tun (wo die Telegrammstruktur i.A. genau festgelegt ist) ! In der Variablendefinitionstabelle wird in der Spalte "Signaldefinition" das folgende Format für CAN-Signale verwendet:

<Bus-Nummer>,<CAN-Identifier>,<Position des LSBits>,<Anzahl Datenbits>,<INTEL-/MOTOROLA-Flag>,<Signaltyp>

Darin ist

Bus-Nummer
1 oder 2, falls das Gerät zwei physikalische CAN-Interfaces hat (wie z.B. beim MKT-View II/III/IV);
   evtl. auch 3 oder 4, falls das Gerät CAN-via-UDP oder LIN unterstützt.
Beim MKT-View II / III / IV sind "CAN1" und "CAN2" am entsprechend beschrifteten Adapterkabel verfügbar.
Die oben genannten "Bus-Nummern" werden normalerweise schon beim Import einer CAN-Datenbank festgelegt, denn bereits vor der Auswahl des Dateinamens wird auf der Registerkarte "CAN" der entsprechende Bus ("CAN1" bis "CAN4") ausgewählt. Notfalls (wenn die CAN-Datenbank nicht mehr verfügbar ist) kann die Bus-Nummer auch nachträglich noch auf der Registerkarte "Variablen" editiert werden.

CAN-Identifier bzw. LIN-Frame-Identifier
= 3- oder 8-ziffriger hexadezimaler Wert, je nach Verwendung von 11- oder 29-bit-Identifiern. Bei LIN muss der Frame-Identifier zwischen 0 und 63 liegen.

Position des LSBits
Komplizierter als Sie vielleicht vermuten ! Die Bedeutung dieses Signalparameters wird in einem anderen Dokument erklärt.
Bei CAN und LIN werden die Datenbits von 0 bis 63 numeriert, da in beiden Fällen maximal 8 Datenbytes per 'Frame' möglich sind.

Anzahl Datenbits
.. wird ebenfalls im o.g. Dokument erläutert.
Übliche Werte sind z.B. 8 (beim Datentyp "Byte"), 16 ("Integer, kurz"), 32 ("Integer, lang").

Flag INTEL- / MOTOROLA-Format
..einer der Gründe warum die Verarbeitung von CAN-Signalen so kompliziert ist... Details hier.

Signaltyp
U = Unsigned (Signal wird auf dem CAN-Bus als vorzeichenlose Ganzzahl übertragen)
S = Signed (Signal wird auf dem CAN-Bus als vorzeichenbehaftete Ganzzahl übertragen)
F = Float (Signal wird auf dem CAN-Bus als 32-Bit-Fliesskommawert übertragen)
D = Double (Signal wird auf dem CAN-Bus als 64-Bit-Fliesskommawert übertragen)

Zusätzlich könnten bei bestimmten Signalen noch weitere Definitionen hinzukommen, z.B. bei GEMULTIPLEXTEN Signalen (je nach Inhalt der CAN-Datenbasis) .

Versuchen Sie nicht, die Definition eines CAN-Signals hier (in der Variablendefinitionstabelle des UPTs) selbst zu ändern ! Es ist zwar möglich, alle nötigen Informationen auf der Registerkarte 'Variablen' direkt einzugeben; wir raten aber dringend davon ab. Sinnvollerweise verwendet man einen externen CANdb-Editor (CAN Database Editor), mit dem zunächst alle Messages und Signale im (nicht-CANopen-)Netzwerk beschrieben werden. Nach dem Erstellen der Datenbank importieren Sie die CANdb-Datei (*.dbc) dann im Programmiertool, wie in diesem separaten Dokument beschrieben. Dies erfolgt auf der Registerkarte CAN (nicht auf der Registerkarte Variablen !) :


( Anzeige einer CAN-Datenbasis; weitere Details hier )

Das Importieren der Datenbasis wird im bereits erwähnten externen Dokument genauer beschrieben.

Siehe auch:


Variablen mit CANopen-Anbindung

Die in diesem Unterkapitel beschriebenen Funktionen stehen nur in der CANopen-Variante von Firmware und Programmiertool zur Verfügung !
Im PKW wird üblicherweise kein CANopen, sondern per Datenbank (*.dbc, *.arxml) definierte 'Container' wie CAN-Messages mit vom Hersteller des Steuergerätes selbstdefinierten Identifiern verwendet.
Bei Nutzfahrzeugen, Lastkraftwagen, und in der Automatisierungstechnik ist dagegen CANopen recht verbreitet.

Variablen an SDO-Kanälen
Hinweis:
SDO-Kanäle werden nur von bestimmten Terminals unterstützt - siehe "Feature Matrix" .

Eine Variable kann per SDO-Kanal mit irgendeinem "Objekt" in einem anderen Gerät im CANopen-Netzwerk verbunden werden.

Diese "Objekte" eines CANopen-konformen Geräts sind im sogenannten "Objektverzeichnis" (object dictionary) enthalten. Jedes Objekt innerhalb eines CANopen-Dictionaries wird durch seinen Objekt-Index und -Subindex characterisiert .

Diese Parameter werden auf dem folgenden Panel definiert, welches im Programmiertool angezeigt wird wenn die aktuell bearbeitete Variable mit einem SDO-Kanal verbunden ist:

Um eine Variable mit einem Objekt eines CANopen-konformen Gerätes zu verbinden, müssen Sie folgendes definieren:

  • die SDO-Kanalnummer (die das UPT mit einem bestimmten Gerät verbindet)
  • den Index und Subindex des zu verbindenden Objekts (a la CANopen)
  • den Datentyp des Objekts (z.B. "INTEGER 16")
  • die Zugriffsrechte (z.B. "read only")

Hinweis: Bei manchen Geräten besteht (seit Juli 2004) die Möglichkeit, auch ohne Verknüpfung mit einer Variablen, einzelne Werte per SDO-Kanal zu lesen und zu schreiben. Dazu dient die Interpreterfunktion "sdo".


Variablen an PDO-Kanälen
Hinweis:
PDO-Kanäle werden nur von bestimmten Terminals unterstützt - siehe "Feature Matrix" .

Der Eingangswert einer Variablen kann mit dem Teil eines PDO-Kanal verbunden werden. (Ein PDO-Telegramm kann bis zu 8 Datenbytes enthalten, und i.A. wird nur ein Teil des Datenfelds mit einer bestimmten UPT-Variablen verbunden!)

Um eine UPT-Variable mit einem PDO-Kanal zu verbinden, müssen Sie folgendes definieren:

  • die "UPT-interne" Nummer des PDO-Kanals
  • die Anzahl Datenbits die aus dem PDO in die Variable übertragen werden sollen
  • Die Bitnummer des ersten zur Variablen gehörenden Datenbits (welches bei CANopen immer das niederwertige Bit darstellt)
  • den Datentyp des Objekts

Diese Parameter werden auf dem folgenden Panel definiert, welches automatisch erscheint wenn die aktuell bearbeitete Variable mit einem PDO-Kanal verbunden ist:

Hinweise:

  • Beim "UPT-2" (mit CANopen V4, z.B. UPT320) verwenden Sie für das PDO-Mapping besser die im CANopen-Objektverzeichnis immer vorhandenen PDO-mapbaren Variablen . Zum Zugriff darauf verwenden Sie die Interpreterfunktion obd(<Index>.<Subindex>) . Diese speziellen Variablen haben den Vorteil, dass sie in der EDS-Datei beschrieben sind, d.h. ihre Existenz ist (im Gegensatz zu den selbstdefinierten Variablen) jedem CANopen-Konfigurationstool bekannt - was die Konfiguration des Netzwerks erheblich vereinfacht !
  • Nur 1-Bit-Parameter dürfen an beliebiger Bitposition im PDO-Datenfeld stehen.
  • 8-, 16-, 24- oder 32-bit-Parameter müssen im PDO-Datenfeld an einer BYTE-GRENZE beginnen, daraus ergibt sich daß die "Nummer des Datenbits im PDO" immer ein Vielfaches von 8 sein muß ! (Die Bitzählung beginnt immer bei "0", nicht bei "1" wie in manchen Müsli-Programmiersprachen ;-)
  • Parameter mit mehr als 8 Datenbits werden immer in der Reihenfolge "niederwertiges Byte zuerst" übertragen, was im CANopen-Standard immer der Fall ist (auch wenn Sie lieber Motorola-CPUs einsetzen, bei CAN hat sich wohl INTEL durchgesetzt)

Verwandte Themen: Kommunikationskanäle , SDO-Kanäle , PDO-Kanäle .

Verbinden von Variablen mit dem "eigenen" CANopen-Object-Dictionary des Terminals
In neueren Anzeigegeräten mit CANopen (siehe Feature-Matrix) können bestimmte Objekte im CANopen-OD direkt in PDO-Kanäle gemappt werden. Diese Objekte können (über ihren CANopen-Index und -Subindex) auch direkt mit den Display-Variablen verbunden werden. Der Interpreter kann ebenfalls direkt über den Objektindex auf das eigene CANopen-Objektverzeichnis des Gerätes zugreifen (siehe 'obd'-Funktion), was aber wegen der bei CANopen üblichen hexadezimalen Schreibweise der Indizes nicht jedermanns Sache ist. Aus dem Grund ist es möglich, bestimmte CANopen-Objekte auch mit einer Display-Variablen zu verbinden (-> Eingabe von OD-Index in der Tabelle mit den Variablendeklarationen; im weiter unten folgenden Screenshot rot markiert).
Jeder Lesezugriff auf eine so deklarierte Variable greift dann in der Tat auf das CANopen-Objektverzeichnis zu; und ein Schreibzugriff (@Variablenname = Wert) führt intern zu einem Schreibzugriff auf das entsprechende CANopen-Objekt.
Ist das entsprechende Objekt in einen TPDO gemappt, kann die formelle Variablenzuweisung sogar zum Senden des Prozessdatentelegramms führen. Dies hängt allerdings vom 'Transmission Type' des PDOs ab.

Um die Verbindung von Display-Variablen mit dem CANopen-OD herzustellen, bietet sich seit April 2010 folgender Ablauf an:  
Zunächst ein Doppelklick in die Definitionstabelle in der Spalte mit dem Titel OD-Index (bzw. Drücken der Enter-Taste, wenn eine Zelle in dieser Tabellenspalte markiert ist) :

Closeup of the VAR-def-table, OD-Index column

Per Doppelklick auf diese Zelle wird das folgende Dialogfenster geöffnet, in dem alle geeigneten CANopen-Objekte, mit hexadezimalem OD-Index und der (leider unspezifischen(*) ) Beschreibung des Objektes aufgelistet sind :

Screenshot of the CANopen OD Index Selection Dialog

War die Display-Variable bereits vor dem Aufruf des Dialogfensters mit einem Objekt im CANopen-OD verbunden, wird der ensprechende Listeneintrag markiert (wie hier in blauer Farbe).

Tip:
Wenn Sie bereits mit CANopen vertraut sind, ist Ihnen bestimmt sofort aufgefallen, daß die Indizes nach der Formel 0x4000 + < CANopen-Datentyp > berechnet werden; Datentyp "4" bedeutet bei CANopen "32-bit signed integer".

Wenn vor dem Aufruf des Dialogs noch kein CANopen-Objekt mit der Display-Variablen verbunden war, wählt das Programm automatisch ein Objekt mit 'möglichst gut passendem Datentyp' (als Vorerinstellung; falls noch freie Subindizes im Objekt verfügbar sind). Jedes Objekt im Bereich 0x4001 bis 0x4009 verfügt über mindestens 10 Subindizes (je nach Firmware / Option "Monster-OD" auch bis zu 40). Insgesamt stehen also bis zu 360 'Speicherplätze' mit unterschiedlichen Datentypen zur Verfügung.

Nach dem Schließen des Dialogfensters per "OK" wählt das Programmiertool automatisch den nächsten freien Subindex des ausgewählten Objektes. Wäre z.B. Objekt 4004.01 und 4004.2 schon durch andere Variablen belegt, würde das Programmiertool automatisch Objekt 4004 Subindex 3 verwenden. Dies ist nach dem Schließen des Dialogfensters in der Variablen-Definitions-Tabelle sichtbar, und kann ggf manuell editiert werden.

Display-Variablen, die wie oben beschrieben mit dem CANopen-OD gekoppelt sind, sind für die 'Außenwelt' immer sichtbar, d.h. die Werte in diesen Variablen können über das Netzwerk gelesen oder geändert werden. Normalerweise werden solche externen Verbindungen bei CANopen mit einem speziellen Tool konfiguriert (z.B. dem CANopen Configuration Manager, mit dem nicht nur ein einzelner CAN-Knoten, sondern ein komplettes Netzwerk konfiguriert wird). Fast immer werden dazu PDO (Prozessdatenobjekte) verwendet, mit denen die CAN-Knoten im 'Normalbetrieb' (operational mode) Daten miteinander austauschen. Nur in Sonderfällen werden auch im Normalbetrieb SDO (Servicedatenobjekte) für die Kommunikation zwischen CANopen-Geräten eingesetzt, da die vorhandenen SDO-Server i.A. für den CANopen-Master reserviert sind.

Zurück zur Übersicht der Eigenschaften von Display-Variablen .

(*)
Leider können die Objekte im CANopen-Object-Dictionary keine 'sprechenden' Namen haben, denn die Namen von CANopen-Objekten sind leider nicht variabel (zumindest nicht im EDS-File). Aus dem Grund finden Sie im EDS-File nur nichtssagene Namen wie z.B. "Application Vars 32 bit signed" für Objekt 0x4004 .
Für den Einsatz mit externer SPS-Konfigurationssoftware (z.B. CoDeSys) kann das UPT-Programmiertool (2) allerdings auch eine sogenannte DCF-Datei (device configuration file) zu erzeugen, in der dann tatsächlich die "sprechenden" Variablennamen enthalten sind (d.h. die Namen der Variablen, nicht die Default-Namen der CANopen-Objekte). Details zum DCF-Generator finden Sie hier .

Verwendung von "index" und "subindex" bei CANopen
Wenn eine Variable per SDO (CANopen Service-Daten-Objekt) mit der Außenwelt verbunden werden soll, müssen Sie den Index und Subindex des zu verbindenden Objekts kennen.

Die "Objekte" eines CANopen-konformen Geräts sind im sogenannten "Objektverzeichnis" (object dictionary) enthalten. Jedes Objekt innerhalb eines CANopen-Dictionaries wird durch seinen Objekt-Index und Subindex definiert.

Der Objekt-Index ist ein 16-bit-Wert der normalerweise hexadezimal notiert wird. Hexadezimale Werte müssen beim UPT immer den Prefix "0x" oder "$" erhalten, andernfalls würde der Interpreter sie als Dezimalzahlen auffassen.

Der Subindex ist ein 8-bit-Wert, er wird oft für Arrays mit bis zu 255 Elementen oder für strukturierte Objekte mit bis zu 255 Komponenten verwendet.

Beispie: Ein E/A-Modul nach CANopen-DS401 mit 5 digitalen Eingängen enthält das Object 0x6020, welches den aktuellen Zustand der digitalen Eingänge repräsentiert. Subindex 0 dieses Objekts würde dann den Inhalt "5" haben, was hier "5 digitale Eingänge" bedeutet. Subindex 1 würde dann den aktuellen Zustand des ersten digitalen Eingangs liefern, Subindex 2 den Zustand des zweiten Eingangs und so weiter.

Index und Subindex von CANopen-Objekten sind oftmals im Gerätehandbuch angegeben. Für viele Objekte eines CANopen-konformen Gerätes finden Sie die benötigten Informationen auch im sogenannten Device Profile . Es gibt device profiles für verschiedene Typen von CANopen-Geräteklassen, zum Beispiel:

DS401: Device Profile for I/O Modules

  • digital in- and outputs
  • analog in- and outputs

Im folgenden werden einige oft verwendete Objekte angeführt. Eine Übersetzung aus dem Englischen haben wir uns (noch?) erspart...
DS401, Digital In- and outputs
DS401 specifies the CANopen Device Profile for I/O-Modules. If you want to connect any of these objects via SDO to a variable of your terminal program, you have to know the object’s index and subindex. Here are some of the specified objects:

Digital Inputs and Outputs
Index (hex)
Name

Subindizes

Type

Access
0x6000 Read State [of] 8 Input Lines 0,1 .. max.4 Unsigned8 ro
0x6006 Input Interrupt Mask [for] 8 Input Lines, any change 0, 1.. max.4 Unsigned8 rw
0x6020 Read State [of] 1 Input Line 0, 1.. max.32 Unsigned8,
Boolean
ro
0x6100 Read State [of] 16 Input Lines 0, [1, 2] Unsigned16 ro
0x6120 Read State [of] 32 Input Lines 0, max. 1 Unsigned32 ro
0x6200 Write State [for] 8 Output Lines 0, 1..max.4 Unsigned8 rw
0x6206 Fault Mode [for] 8 Output Lines 0, 1..max 4 Unsigned8 rw
0x6207 Fault State [for] 8 Output Lines 0, 1..max 4 Unsigned8 rw
0x6220 Write State [for] 1 Ouput Line 0,
1.. max.32
Unsigned8,
Boolean
rw
0x6250 Fault Mode [for] 1 Output Line 0,
1..max.32
Unsigned8,
Boolean
rw
0x6260 Fault State [for] 1 Output Line 0,
1..max.32
Unsigned8,
Boolean
rw
0x6300 Write State [for] 16 Output Lines 0,
1..max.2
Unsigned8,
Unsigned16
rw
0x6306 Fault Mode [for] 16 Output Lines 0,
1..max 2
Unsigned8,
Unsigned16
rw
0x6307 Fault State [for] 16 Output Lines 0,
1..max 4
Unsigned8,
Unsigned16
rw
0x6320 Write State [for] 32 Output Lines 0,
max.1
Unsigned8,
Unsigned32
rw
0x6326 Fault Mode [for] 32 Output Lines 0,
max 1
Unsigned8,
Unsigned32
rw
0x6327 Fault State [for] 32 Output Lines 0,
max 1
Unsigned8,
Unsigned32
rw
         
         

 DS401, Analog In- and outputs
DS401 specifies the CANopen Device Profile for I/O-Modules. If you want to connect any of these objects via SDO to a variable of your terminal program, you have to know the object’s index and subindex. Here are some of the specified objects:

Analog Inputs and Outputs
Index (hex) Name Subindizes Type Access
0x6401 Reads value of the input

channel (not converted)

0

1 [... 4]

Unsigned 8

Unsigned16

ro
0x6411 Writes value of the output channel (not converted) 0

1 [... 4]

Unsigned8

Unsigned 16

rw
0x6420 Set Analogue Input Range
0

1 [... 4]

Unsigned8

Unsigned 16

rw
0x6421 Determines which events cause an interrupt for a specific channel 0

1 [... 4]

Unsigned 8

Unsigned 8

rw
0x6423 Globally enable/disable Interrupt 0 Boolean rw
0x6424 When enabled, interrupt triggered when analogue input rises above this value (not converted) 0

1 [... 4]

Unsigned8

Unsigned 32

rw
0x6425 When enabled, interrupt triggered when analogue input falls below this value (not converted) 0

1 [... 4]

Unsigned8

Unsigned 32

rw
0x6426 When enabled, interrupt triggered when analogue changes by more than this value from previous reading (rising or falling) (not converted) 0
1 [...4]
Unsigned8,
Unsigned 32
rw
0x6443 Output Fault Mode 0,1 Unsigned8 rw
0x6444 Default Output Fault value (unconverted) 0

1

Unsigned 8

Unsigned 32

rw


Variablen mit Anbindung an 'openABK'

Nur für Terminals mit openABK-Konnektivität !
Mangels Interesse an openABK sind diesbezüglich keine weiteren Entwicklungen geplant.

Um Variablen mit einem openABK-kompatiblen 'Logger' (oder Gateway zwischen CAN-Bus und openABK/Ethernet) auszutauschen, enthält das Programmiertool einen minimalistischen openABK-Client. Dieser kann auch verwendet werden, um die in einem (beliebigen) openABK-Server vorhandenen Variablen zu ermitteln (per HTTP), und sie zur Liste der bereits in der Applikation vorhandenen 'Display-Variablen' hinzuzufügen.

Wählen Sie dazu im Hauptmenü des Programmiertools den Eintrag Transfer, openABK, und im Untermenü die Funktion Definition von Variablen und Mailboxen aus einem openABK-Server lesen.

Nach dem Auslesen der Informationen aus dem openABK-Server schaltet das UPT-Programmiertool in ein neues Fenster um, in dem u.A. die auf dem openABK-Server vorhandenen Variablen mit den UPT-Display-Variablen (bzw den Variablen im MKT-Gateway) verknüpft werden können. Details zu diesem hochgradig 'openABK-spezifischen' Thema finden Sie in der Dokumentation der openABK-Funktionen separaten Dokument.


(Screenshot : Registerkarte 'openABK-Variablen' im UPT-Programmiertool)

Siehe auch (zum Thema 'openABK') :
    OpenABK-'Discovery' (Protokoll zum Auffinden von openABK-Geräten im Netzwerk),
    openABK-Support für programmierbare Displays und Gateways von MKT Systemtechnik.

Data-Breakpoints (Überwachung bestimmter Schreibzugriffe auf eine bestimmte Variable)

Für die Fehlersuche während einer Simulation kann die Ausführung des Programms gestoppt werden, wenn beim Schreibzugriff auf eine bestimmte Variable ein bestimmter Wert (bzw. Wertebereich) gesetzt werden soll. Um einen solchen 'Data-Breakpoint' zu definieren, klicken Sie zunächst auf der Registerkarte 'Variablen' mit der rechten Maustaste auf den gewünschten Namen.
Im daraufhin angezeigten Kontext-Menü wählen Sie die Funktion
Setze Data-Breakpoint auf Zuweisungen an 'XYZ'
  (darin ist 'XYZ' der Name einer in der Tabelle definierten Variablen)

Im daraufhin angezeigten Dialog geben Sie den Wert oder Wertebereich ein, bei dessen Zuweisung an die Variable die Simulation angehalten werden soll.
Wird der 'max'-Wert (nach dem Komma) weggelassen bzw. gelöscht, dann wird der zugewiesene Wert nicht mit einem Bereich sondern mit einem einzelnen Wert verglichen.

Wird dann irgendwo (z.B. in den globalen oder lokalen Events) ein neuer Wert per Interpreter im 'Abbruch'-Bereich an die Variable zugewiesen, dann schaltet das Programm (bzw. die Simulation) augenblicklich in den Zustand 'gestoppt' um. Eine entsprechende Meldung (mit dem alten und neuen Wert der Variablen) wird dann unter Fehler & Meldungen angezeigt, z.B.:

  Data breakpoint fired on global event 12 when setting XYZ = 123.4 .

oder (wenn die Zuweisung nicht in einem 'Globalen Event' sondern auf einer bestimmten Display-Seite erfolgte):
  Data breakpoint fired on page 13, line 14, when setting XYZ = 123.4 .

Hinweis zur Funktionsweise:
Der so gesetzte Data-Breakpoint funktioniert ähnlich wie ein flankengetriggertes Oszilloskop. Der "Trigger" (in diesem Fall Programmabbruch mit Meldung) erfolgt nur, wenn der alte Wert der Variablen außerhalb, und der neue Wert der Variablen innerhalb des oben beschriebenen Wertebereiches liegt. Beim Setzen eines neuen Breakpoints wird der momentane Wert aus der Variablen als "vorheriger Wert" intern gespeichert.
Nach dem Setzen des Data-Breakpoints wird dieser in der in Variablen-Definition-Tabelle als Kreisfläche in der ersten Spalte (mit dem Titel 'Nr') angezeigt. Die Farbe hängt vom Zustand ab:
grau : Breakpoint noch 'passiv', weil noch keine Auswertung erfolgte
gelb : Breakpoint ist 'scharf', hat aber noch nicht ausgelöst
 rot  : Breakpoint hat 'ausgelöst'

Dank der oben beschriebenen Flankentriggerung kann die Simulation nach Stop per Data-Breakpoint einfach durch Anklicken des dann mit 'Gestoppt' beschrifteten Panels in der Statuszeile fortgesetzt werden. Das Programm wird danach erst wieder stoppen, wenn der Wert der Variablen zunächst außerhalb, und dann wieder innerhalb des Wertebereichs für den Haltepunkt läuft.

Wie auch bei 'Code Breakpoints' (in diesem Fall: Breakpoints in globalen oder lokalen Events) kann das Programm nach dem Auslösen eines Data-Breakpoints im Einzelschritt-Betrieb (per Funktionstaste F11) fortgesetzt werden.


Einstellungen (auf Registerkarten und in Dialogen des Programmiertool)

Die wichtigsten Parameter können im Programmiertool auf der Registerkarte 'Einstellungen' kontrolliert und geändert werden. Im linken Teil finden Sie z.g.T. Einstellungen, die bei der Übertragung mit dem zu programmierenden Gerät synchroniziert oder auf Kompatibilität geprüft werden.
Im rechten Teil der hier gezeigten Registerkarte finden Sie Einstellungen, die für eine erfolgreiche Übertragung (z.B. per CAN) zum programmierbaren Gerät "passen" müssen:


Screenshot mit Registerkarte 'Einstellungen' (Settings)


Einstellungen im rechten Teil der Registerkarte 'Einstellungen'

Die Panels im rechten Teil der Registerkarte 'Einstellungen' enthalten Einstellungen, die das Programmiertool, aber nicht das damit erstellte Programm betreffen.
Einstellungen des Programmiertools
Im oberen rechten Panel mit dem Titel 'Einstellungen des Programmiertools' können folgende Parameter eingestellt werden (einige davon mit Hilfe zusätzlicher Dialogfenster, die in später folgenden Kapiteln noch vorgestellt werden):
  • Konfiguration des CAN-Interfaces (Klicken Sie zunächst auf 'Auswahl + Einstellung', falls Sie ein CAN-Interface am PC betreiben),
  • CAN-Bus Parameter für die Kommunikation mit dem am PC per CAN-Bus angeschlossenen Gerätes (Baudrate, evtl. weitere Parameter für CAN-FD)
  • Auswahl der seriellen Schnittstelle am PC (z.B. "COM1"), falls das Programm per RS-232 übertragen werden soll.
    An diesem Port kann auch eine GPS-Maus angeschlossen werden, um mit dem PC / Programmiertool ein GPS-fähiges Gerät zu emulieren (inkl. der Echtzeitverarbeitung von 'echten' GPS-Daten);
  • Baudrate für die serielle Schnittstelle, die das Programmiertool zum Übertragen der Applikation, aber auch für das File Transfer Utility verwenden soll.
    Hinweis: Nicht alle in der Liste aufgeführten Baudraten sind für alle Geräte verwendbar. Alte Geräte mit 8-Bit-CPU funktionieren mit maximal 19200 Bit/Sekunde, und Baudraten wie 230400 oder 460800 Bit/Sekunde funktionieren nur mit einem geeigneten Interface auf der PC-Seite (z.B. USB<->RS-232 Adapter aka "Virtual COM Port").
  • Node ID des zu programmierenden Terminals (falls das Programm per CANopen/SDO übertragen werden soll)
  • Node-ID des Programmiertools (falls das Programmiertool selbst als CANopen-Slave addressierbar sein soll, zum Testen + Simulieren),
  • Einstellen, ob und wie das Programmiertool im Simulatorbetrieb Töne erzeugt (üblicherweise per Soundkarte)
  • Konfiguration des im Programmiertool emulierbaren Web-Servers.
    Da der Betrieb eines Web-Servers Ärger mit der Firewall des PCs verursachen könnte, ist diese Option per Default abgeschaltet.
    Neben der Option 'Embedded Web Server emulieren' wird auf diesem Panel auch die vom Emulator verwendete (TCP-)Port-Nummer eingestellt. Diese Port-Nummer (i.A. 80 für den HTTP-Server) gilt nur für die Emulation auf dem PC ! Der Web-Server im 'echten' Gerät wird über dessen 'Netzwerk-Setup' konfiguriert.
    Mit dem Button 'TEST' (rechts neben der Port-Nummer) wird der HTML-Browser gestartet, um eine Verbindung mit dem auf dem gleichen PC laufenden Server aufzubauen (127.0.0.1) .

Auswahl von Verzeichnissen

Unterhalb der 'Einstellungen des Programmiertools' finden Sie eine Liste mit Verzeichnissen, die das Programmiertool zum Speichern bestimmter Dateien nutzt.

Zu den einstellbaren Dateipfaden und Unterverzeichnissen ("Directories") zählen:

  • das Verzeichnis, in dem Ihre Terminal-Applikation(en) abgelegt werden (per Default 'programs', nicht zu verwechseln mit dem Windows-Folder "Programme" !),
  • das Verzeichnis mit dem Hilfesystem im HTML-Format (welches Sie vermutlich nie ändern werden.. im Gegensatz zur Auswahl des HTML-Browsers),
  • das Verzeichnis, aus dem Icons importiert werden. Stellen Sie dieses Verzeichnis passend ein, um sich eine Menge Zeit durch nervtötende Mausklicks im Windows-Datei-Auswahl-Dialog zu ersparen, wenn eine neue Grafik in die UPT-Applikation importiert werden soll),
  • das Verzeichnis für Script-Include-Dateien,
  • das 'Galerie'-Verzeichnis,
  • das Verzeichnis mit anwenderdefinierten Zeichensätzen ('fonts'),
  • Verzeichnispfad und Programmname des optional installierten Font-Editors (damit das Programmiertool diesen direkt starten kann),
  • Verzeichnispfad und Programmname des CAN-Logger-Utilities ( " "  " .. ),
  • das Verzeichnis mit Audio-Dateien (wave files), damit das Programmiertool auch Terminals mit Audio-Wiedergabe simulieren kann,
  • das Verzeichnis für die Simulation der Speicherkarte für die Entwicklung komplexerer Applikationen ohne 'echte' Hardware.

Hinweis: Die oben gezeigten 'Directory'-Einstellungen werden automatisch verworfen, wenn ein neues Programmiertool in einem anderen Verzeichnis auf der Festplatte installiert wird als bei der vorherigen Version.
Die Directory-Einstellungen können auf die 'Default'-Werte gesetzt werden (wie nach einer Neu-Installation), indem die folgende Datei im 'Windows'- Verzeichnis gelöscht wird (zumindest unter Windows XP war dies möglich):

  • Programmiertool für Anzeigegeräte mit 'CANopen' : C:\WINDOWS\MKT_CANopenTerminalProgTool.ini
  • Programmiertool für Anzeigegeräte mit 'CANdb'     : C:\WINDOWS\MKT_CANdbTerminalProgTool.ini
Die Directory-Einstellungen werden in den oben angeführten Konfigurationsdateien im Abschnitt '[Directories]' gespeichert .
Keines der Programmiertools von MKT verlässt sich auf die Windows-Registry, um dort 'wichtige' Daten zu speichern.

Einstellungen im linken Teil der Registerkarte 'Einstellungen'

Die Panels im linken Teil der Registerkarte 'Einstellungen' zeigen die Konfiguration des aktuell angeschlossenen Gerätes, bzw. des zu programmierenden Gerätes dar.


Linker Teil der Registerkarte 'Einstellungen'

Parameter werden hier tabellarisch angezeigt. Für die bequeme Bedienung sind für viele Werte aber eigene Einstelldialoge vorhanden, die beim Anklicken eines bestimmten Parameters (z.B. CAN-Baudrate für Bus 1, 2, 3, 4) automatisch geöffnet werden.

Terminal-Konstanten (erster Teil der tabellarischen Ansicht)
Die Werte im oberen Teil der Tabelle unter 'Terminal-Konstanten, Einstellungen, nichtflüchtige Werte' im linken Teil der Registerkarte 'Einstellungen' sind nur für die Simulation und die Programmerstellung in Programmiertool wichtig. Einträge in dieser Tabelle sorgen z.B. dafür, dass das Programmiertool keine Funktionen anbietet, die vom zu programmierenden Gerät nicht unterstützt werden.
Im Normalfall kümmert sich das Programmiertool selbst um die notwändigen Einträge; fast alle Einstellungen werden beim Up/Download per CAN automatisch synchronisiert. Wird allerdings die Konfiguration nur per Speicherkarte vom Programmiertool in das programmierbare Gerät übertragen, dann hat das Programmiertool keine Möglichkeit, den Inhalt dieser Tabelle aus dem Gerät auszulesen - die Einträge sind aus dem Grund notfalls manuell editierbar :

Im oberen Teil der Tabelle ("Konstanten") enthalten sind:

  • das Kompilationsdatum der Geräte-Firmware (wichtig zur Vermeidung von Versions-Konflikten)
  • die maximal mögliche Anzahl von Anzeigeseiten
  • die maximal mögliche Anzahl von Zeilen im Text-Array
  • und weitere, nur in Ausnahmefällen modifizierbare Parameter

Die in der Tabelle angezeigte Anzahl Icons (number of icons) ist die Anzahl momentan in der Applikation vorhandener Icons (wird automatisch ermittelt). Die maximale Anzahl von Icons ist i.A. nicht spezifizierbar; sie hängt von der Größe der Icons ab. Definierbar ist lediglich die Größe des für Icons zu reservierenden Speichers; dazu dient ein besonderer Einstelldialog.

Bei alten Geräten (z.B. UPT515 und MKT-View "Plus") kann die Anzahl Anzeigeseiten oder Anzahl Textzeilen angeklickt werden, um die Speicheraufteilung zu ändern. Beim Doppelklick auf die entsprechende Zelle in der Parameterliste (untere Tabelle) erscheint, passend zum Typ des angeklickten Parameters, z.B. auch zum Einstellen der Tastenkombination für das System-Menü oder für die Speicheraufteilung. Bei neueren Geräten (mit 32-Bit-CPU) ist -dank dynamischer Speicherverwaltung- diese Einstellung unnötig, bzw. hat keine Funktion.

Um die Defaultwerte des nichtflüchtigen Speichers (non-volatile numeric array) zu ändern, scrollen Sie die "Parameter"-Liste nach unten bis Sie die entsprechenden Werte sehen. Klicken Sie dann auf den gewünschten Eintrag um ein kleines Editierfenster zu öffnen, in dem Sie den Wert ändern können.

Die "Terminal-Konstanten" (constants) können bis auf wenige Ausnahmen nicht editiert werden, sie werden hier nur zu Ihrer Information angezeigt. Weil mittlerweile eine große Vielzahl verschiedener Firmware-Versionen und -Varianten existiert, versucht das Programmiertool bei jedem Up- oder Download diese Informationen aus dem angeschlossenen Terminal zu lesen. Zu den "Terminal-Konstanten" gehören unter anderem:

  • Hardware-Profil, z.B. "MKTVIEW_3"
  • Software-Profil, z.B. "CVTv1" für Geräte mit CAN, aber ohne CANopen (ehemals: Can-View-Terminal), und ohne CAN-FD
  • Firmware-Kompilations-Datum
  • maximale Anzahl von SDO-Kommunikations-Kanälen (nur für Geräte mit CANopen)
  • maximale Anzahl von PDO-Kommunikations-Kanälen (nur für Geräte mit CANopen)
  • maximale Anzahl von Display-Variablen
  • maximale Größe des Script-Quelltextes (in kByte, hardwarespezifisch, und bei der Erstellung dieses Dokuments noch unbekannt)
  • maximale Länge eines Format-String (der auch als statischer Text oder Menüeintrag verwendet werden kann)
  • maximale Länge einer event-"condition" (Bedingung einer Ereignis-Abfrage)
  • maximale Länge einer event-"reaction" (Reaktionsdefinition, als Quelltext für den Interpreter)
  • maximale Anzahl von "globalen" Events (meistens 20 oder mehr)
  • maximale Anzahl von Definitionszeilen pro Anzeigeseite (z.B. 15 beim "alten" UPT515)
  • maximale Anzahl von Display-Seiten ohne "Spezialitäten" (wie dem Text-Array und Icon-Speicher, meistens 100 Pages)
  • maximale Länge eines Seiten-Namens (meistens 8)
  • maximale Länge eines Variablen-Namens (ehemals 8, meistens aber 12)
  • maximale Anzahl von Zeilen im Text-Array (meistens 1024)
  • maximale Anzahl von Icons, falls eine Begrenzung durch den Speicher-Manager erfolgt
  • Art der Flash-Speicher-Verwaltung (statisch/flexibel)
  • Display-Typ: 1=monochrome, 4=color with 4 bits/pixel
  • Breite des Displays: 128 pixel beim "UPT515", 320 bei "UPT167","MKT-VIEW","IPE-VIEW"
  • Höhe des Displays: 64 pixel beim "UPT515", 240 bei "UPT167","MKT-VIEW","IPE-VIEW"
  • Unterstützte Zeichensätze als Bit-Kombination aus den Zeichensatz-Nummern.
    Dieser Parameter kann notfalls modifiziert, z.B. wenn bekannt ist, dass im verwendeten Gerät mehr Zeichensätze existieren als im Programmiertool (oder der *.cvt-Datei) hinterlegt war. Wie bei vielen Parametern kann auch hier per Doppelklick ein spezieller Dialog geöffnet werden:


    Dialog zur Kontrolle der vom Gerät unterstützten Zeichensätze


  • und eine Vielzahl weiterer "Infos", die nur für Software-Entwickler wichtig sind..

Im Normalfall (d.h. wenn ein Standard-Gerät mit aktueller Standard-Firmware verwendet wird), werden alle Informationen, die das Programmiertool über die verwendete Hard- und Firmware kennen muss, bereits bei der Anwahl des Zielsystems passend eingestellt. Verwenden Sie dazu (im Hauptmenü) die Funktion Optionen...Geräteauswahl/LCD-Einstellungen.

Terminal-Einstellungen (zweiter Teil der tabellarischen Ansicht)
Links unten auf der Registerkarte 'Einstellungen' befindet sich die Tabelle 'Terminal-Einstellungen':

Die dort einstellbaren Parameter sind:

Siehe auch:  Optionales Setup (LCD, Automatik für die Hintergrundbeleuchtung, Audio)
        Allgemeine Terminal-Optionen (Boot-Meldungen, Tastenkombination für Setup, ..)
        Netzwerk-Setup im Systemmenü des Gerätes
        Übersicht .

Erweiterte CAN-Bus Parameter (einstellbar per Dialog)

Abhängig von der Hardware stehen bis zu vier 'logische' CAN-Schnittstellen zur Verfügung, wobei i.A. nur CAN 1 und CAN 2 phyikalisch (direkt am Gerät) verfügbar sind.
Die Schnittstellen CAN 3 und CAN 4 sind wahlweise über ein externes Gateway (CAN-via-UDP) als CAN- oder LIN-Port nutzbar.
Die Verwendung und Konfiguration der CAN- bzw. LIN-Schnittstellen erfolgt per Dialog im Programmiertool:

Screenshot 'CAN Bit Timing Parameters' (dialog)    

Zum Öffnen dieses Dialogfenster dient die Funktion Optionen .. CAN-/LIN-Bus-Einstellungen im Hauptmenü des Programmiertools.
Details zur Verwendung der Ports CAN 3 oder CAN 4 als LIN-Interface finden Sie hier.
Die Konfiguration des optionalen UDP/CAN-Gateways für CAN 3 oder CAN 4 wird hier beschrieben.

Bei neueren Geräten sind folgende CAN-Bus-Parameter konfigurierbar:

Baudrate
Gerundete CAN-Baudrate in kBit/Sekunde. Die Baudrate "666" entspricht 666.66666 kBit/Sekunde; "83" entspricht 83.33333 kBit/Sekunde. Alle anderen CAN-Baudraten sind nicht gerundete Integer-Zahlen.

Position of Sample Point (Position des Abtastpunktes)
Beschreibt die Position des Abtastpunktes innerhalb eines CAN-Datenbits, als prozentuale Angabe (relativ zur Bitlänge). Übliche Werte sind 80 ... 83 Prozent, wobei 83 % i.A. 83.3333 % sind. Bei den meisten Geräten mit CANopen hat dieser Parameter keinen Effekt.

Sync Jump Width (SJW)
Weite eines Synchronisationssprungs beim Empfang, gemessen in Vielfachen eines Abtast-Intervalls (tq, time quanta). Jedes CAN-Datenbit wird im CAN-Controller in möglichst viele Abtastintervalle aufgeteilt (im Automobilbereich oft "BTL-Zyklen" genannt, d.h. Bit-Timing-Logik-Zyklen). Die resultierende Länge des Synchronisationssprunges ist daher leider hardwareabhängig, liegt aber (fast) immer zwischen 10 und 20 Abtastintervallen.
Die tatsächlich realisierte Anzahl von Abtast-Intervallen kann nur im Gerät untersucht werden, siehe Kapitel "CAN Bit Timing Parameters" in Dokument Nr. 85115 (PDF) .

Flexible Data Rate (FD)
Bitrate für das 'schnelle' Datenfeld bei 'CAN FD' mit Bitraten-Umschaltung. Übliche CAN-FD-Bitraten sind 1000, 2000 oder 4000 kBit/Sekunde, in Ausnahmefällen (wenn es Kabel, Steckverbinder, und die Transceiver auf beiden Seiten erlauben) auch 8000 kBit/Sekunde.
Dieses Feld ist nur bei Geräten verfügbar, deren CAN-Controller und -Transceiver neben "Classic CAN" auch CAN FD unterstützen, z.B. MKT-View V.
Um CAN FD auch für die schnelle Übertragung zwischen Programmiertool und MKT-View (V) zu verwenden, muss auch das CAN-Interface am PC 'CAN FD' unterstützen, und auf der Registerkarte 'Einstellungen des Programmiertools' eine geeignete Kombination von Bitraten für die Arbitrierungs- und Datenphase eingestellt werden.. Dies ist momentan (2020-02) nur mit CAN-Interfaces von Kvaser möglich (getestet mit 'Kvaser Hybrid 2*CAN/LIN').
Bei der Geräteauswahl wird die Information, ob CAN FD für das verwendete Gerät verfügbar ist, aus einer internen Datenbank in das Geräteprofil übernommen. Beispiel: Der für das MKT-View V ursprünglich vorgesehene i.MX RT1064 verfügt über drei CAN-Controller, von denen leider nur einer CAN FD unterstützt. In dem Fall würde die Geräte-Firmware den CAN-FD-fähigen Controller (bei NXP "FlexCAN3" genannt) als ersten logischen CAN-Port ("CAN 1") verwenden.
Siehe auch: Hinweise zur Unterstützung von CAN FD im MKT-View V.

Activate the following flags, and include them in the config :
Mit dieser Option werden ("ausnahmsweise") beim Übertragen der Konfiguration (*.cvt) in das zu programmierende Gerät die dort im System-Setup-Menü konfigurierten Werte überschrieben. Ist diese Option nicht gesetzt, bleiben die unten aufgelisteten Werte im System-Setup unverändert. Zu den für CAN relevanten Flags gehören:

Enable Transmit and Acknowledge
Ermöglicht das Senden von CAN-Telegrammen, und Acknowledge-Bits.
Ist diese Option nicht gesetzt, wird der CAN-Knoten zum 'passiven Lauscher' (Listen-Only-Mode).
Hinweis: Diese Option existiert nur in Geräten mit geeigneter CAN-Hardware bzw. geeignetem CAN-Controller !

Active Terminator (Resistor)
Schaltet den in manchen Geräten (z.B. MKT-View II) vorhandenen schaltbaren Abschlusswiderstand ein, mit dem das Gerät den CAN-Bus mit der zum Wellenwiderstand des verwendeten Kabels passenden Impedanz (i.A. 120 Ohm) reflektionsfrei abschliessen kann.
Hinweis: Diese Option existiert nur in Geräten mit geeigneter CAN-Hardware bzw. geeignetem CAN-Controller, z.B. MKT-View II / III / IV !

Siehe auch:



Dialog 'Allgemeine Terminal-Optionen'

(Ursprünglich nur für "UPT" = user programmable terminal,
mittlerweile auch für MKT-View u.A. verwendet)

Der Einstelldialog "Allgemeine Terminal-Optionen" dient zum Einstellen einiger Parameter, die später beim Übertragen der Applikation in das programmierte Gerät benötigt werden. Dieser Dialog kann u.A. durch Anklicken des entsprechenden Eintrags im Hauptmenü unter "Optionen" geöffnet werden.

 

Die Option Enable System Menu / Aufruf des System-Menüs zulassen kann abgeschaltet werden, wenn Sie sicher sind daß Sie (oder der Bediener des Terminals) die Funktionen im UPT-Systemmenü nicht brauchen (z.B. weil Sie die Tastenkombination F2+F3 in Ihrem UPT-Programm verwenden oder weil Sie nicht wollen, daß der Bediener im Systemmenü herumspielt ;-).
Selbst wenn die Option "Enable System Menu" abgeschaltet ist, können Sie noch ins Systemmenü gelangen, wenn beim Einschalten des Gerätes die Tasten F2+F3 gedrückt gehalten werden (dann ist allerdings das "Anwenderprogramm" noch nicht geladen, und "kritische" oder "geheime" Daten sind nicht einsehbar).

Die Option Enable Debugging ist nur für den Entwickler der Geräte-Firmware vorgesehen. Sie sollten diese Option abgeschaltet lassen.

Die Option Readout Protection (Ausleseschutz) verhindert, dass die Applikation später aus dem Terminal per CAN oder RS-232 zurückgelesen werden kann. Bitte beachten Sie, dass diese Option erst bei Geräten mit Firmware ab Kompilationsdatum 2009-05-20 funktioniert, da diese Funktion erst im Mai 2009 implementiert wurde.

Mit der Option Bootup Display können Meldungen kurz nach dem Einschalten des Displays erlaubt bzw. unterdrückt werden. Dazu zählt u.A. der beim Compilieren des Scripts durchlaufende Text, Meldungen beim Starten des CAN-Loggers, und diverse Popup-Fenster beim Initialisieren verschiedener Netzwerk-Protokolle (z.B. Meldung der eigenen IP-Adresse nach Zuweisung per DHCP, Verbindungsaufbau für CAN-via-UDP, etc). Die gleiche Einstellung ist auch 'am Gerät' (unter 'System Setup' / 'Display') verfügbar. Siehe auch: Hinweise zur Anzeige eines eigenen Logos ("Boot-Screen").

Die Option Auto-Scale for larger display resolutions (automatisches Anpassen an höhere Display-Auflösungen) sollte gesetzt werden, wenn in der Applikation keine 'pixelgenauen' Grafikausgaben nötig sind, und ein beispielsweise für 320 * 240 Pixel entwickeltes Anzeigeprogramm ohne Änderungen auch auf einem 480*272-Pixel-Display laufen soll (ohne daß dabei Platz auf dem Display verschenkt wird). Siehe auch FAQs zum Umstieg vom älteren MKT-View auf das neuere MKT-View II / III .

Die Tastenkombination zum Aufruf des UPT-System-Menüs kann nun vom Programmiertool aus geändert werden, weil die alte (feste) Kombination F2+F3 mit der Anwendung eines Kundens kollidierte) . Seien Sie vorsichtig mit dieser Option, denn nicht alle Tastenkombinationen können bei allen Geräten abgefragt werden (speziell bei Geräten mit gemultiplexter Tastatur-Abfrage). Falls Sie hier eine "unmögliche" Tastenkombination eingegeben haben, können Sie das UPT-System-Menu nur durch Drücken von F2+F3 während des Einschaltens erreichen, oder (einen Ethernet-Anschluss vorausgesetzt) per Telnet-Verbindung.

Siehe auch:

Kontrolle der unterstützten Grafikfunktionen (Dialog), LCD-Einstellungen (Dialog),
Optionales Setup (Beleuchtung, etc), Speicheraufteilung,
Einstellungen (Registerkarte) .

Optionales Setup (früher nur per System-Setup am Gerät konfigurierbar)

Bei manchen Geräten (z.B. MKT-View II/III/IV) kann das Display auch optional per Programmiertool konfiguriert werden. Bei älteren Geräten (mit älterer Firmware) konnten die hardware-spezifischen Einstellen nur mit Hilfe des System-Menüs im Terminal geändert werden (per System Setup / Display Setup / LCD Dimming) .

Um den folgenden Konfigurations-Dialog zu öffnen, wählen Sie im Hauptmenü des Programmiertools die Funktion Optionen  ... Display Setup .

Screenshot 'Optional Display Setup'

Wichtig: Beim Übertragen der Display-Applikation (*.upt bzw. *.cvt) in das Zielsystem werden diese Einstellungen nur übertragen, wenn die Option (Checkmark) 'Include these settings when downloading the configuration' im oben gezeigten Dialogfenster gesetzt ist. Andernfalls wird das 'Optionale Setup' weder in der UPT / CVT-Datei gespeichert, noch übertragen. Das Programmiertool bleibt dadurch mit älteren Firmware-Versionen kompatibel. In einigen Fällen ist es auch nicht erwünscht, die individuellen Einstellungen (die vom Bediener möglicherweise aus gutem Grund im Systemmenü des Gerätes geändert wurden) beim Laden der Display-Applikation wieder zu überschreiben.

Beim Übertragen einer *.UPT oder *.CVT-Datei, in der die Option 'Include these settings...' gesetzt ist, werden die alten Einstellungen im System-Setup (EEPROM) einmal überschrieben. Danach können sie, solange das System-Menü nicht per 'General Settings' gesperrt wurde, vom Benutzer jederzeit wieder angepasst werden.

Hinweis: Der Wirkungsgrad mancher LCD-Hintergrundbeleuchtungen (i.A. weiße LEDs, bei älteren Geräten auch CFL) kann altersbedingt, oder durch Wechsel der Display-Technologie, variieren. Die gleichen 'Brightness'-Einstellungen können daher bei verschiedenen Geräten zu unterschiedlichen Helligkeiten führen !

Details zur Tag/Nacht-abhängigen Steuerung der Hintergrundbeleuchtung finden Sie in der Beschreibung des System-Setups, siehe Dokument Nr. 85115 .

Siehe auch: Feature matrix (für verschiedene Geräte), General settings (tab), Auswahl der Drehrichtung für den 'Portrait-Modus' im Geräte-Setup,   Übersicht

Kontrolle der unterstützten Grafikfunktionen (supported graphic functions)

Abhängig von der verwendeten Hardware und dem Firmwarestand kann das Zielsystem ("Terminal") einige der folgenden Grafikfunktionen unterstützen :

Das folgende Dialogfenster kann aus dem Hauptmenü des Programmiertools oder durch Anklicken der entsprechenden Zeile auf der Registerkarte "General Settings" geöffnet werden:

Wenn eine Kontrollmarkierung in diesem Dialogfenster nicht gesetzt ist, bedeutet das nicht unbedingt dass die entsprechende Funktion nicht zur Verfügung steht ! Die Information, welche Funktionen vom Zielgerät unterstützt werden, ist in der Anwendungsdatei (*.upt bzw. *.cvt) enthalten. Nach dem Laden einer "alten Anwendung" ( *.upt oder *.cvt) könnte z.B. angezeigt werden, daß keine "Buttons" unterstützt werden, obwohl dies mit der "neuen" Firmware möglich ist. Der Grund ist: zum Zeitpunkt, als die Applikation erstellt wurde, gab es diese Funktion möglicherweise noch nicht ! Aus diesem Grund können Sie das Verzeichnis der "unterstützten Funktionen" zur Not manuell ändern (*). Normalerweise werden dies beim Auslesen(!) einer Applikation aus dem Terminal (per CAN-Bus) aktualisiert, und die Kontrollmarkierungen im oben abgebildeten Dialogfenster entsprechend gesetzt.

(*) Vorsicht: Setzen Sie keine Häkchen vor Funktionen, die vom verwendeten Terminal (bzw dessen Firmware) tatsächlich nicht unterstützt werden ! Nach dem Download der Applikation ins "echte" Terminal könnte die Anzeige im Display fehlerhaft sein, oft erscheint im Display dann der "Quelltext" der nicht unterstützten Grafikfunktion !
Eine Übersicht, welches Terminal (mit welcher Firmware) welche Funktionen bietet, finden Sie in der Feature-Matrix .

Die Option "Breite und Höhe von Anzeigeelementen in zusätzliche Spalten anzeigen" ist nicht manuell wählbar. Sie hängt einzig und allein vom Kompilationsdatum der Gerätefirmware ab. Diese kann notfalls manuell auf der Registerkarte "Einstellungen" (Settings) eingetragen werden, z.B. wenn keine bidirektionale Übertragung zwischen Programmiertool und zu programmierendem Gerät möglich ist (sondern nur per Speicherkarte).
Geräte mit Firmware-Kompilationsdatum vor 2009-11-27 unterstützten die Breite und Höhe von Anzeigeelementen nur innerhalb der Parameterliste von Buttons oder Bargraphen (und sind daher veraltet, bzw. können für neuere Geräte erstellte Programme nicht mehr verarbeiten).

Siehe auch: General UPT options (Dialog), LCD-Einstellungen (Dialog)Speicheraufteilung (Dialog) .

Einfügen einer Datei-Beschreibung

Die 'Dateibeschreibung' ist eine frei definierbare, in der UPT-Datei (*.UPT bzw *.CVT) enthaltene Zeichenkette. Diese sollte kurz genug sein, um bei der Anzeige im 'Applikations-Selektor' in eine Zeile auf dem Bildschirm zu passen. Das Script-Demo 'AppSelector.cvt' zeigt diese Zeichenkette in einer Liste statt des 'DOS'-Dateinamens an, da ein DOS-Dateiname auf 8+3 Zeichen begrenzt ist.

Hintergrundinformation:
Um Probleme mit Softwarepatenten bei "langen Dateinamen auf FAT-32-Systemen" zu umgehen, unterstützt das Dateisystem in den programmierbaren Geräten keine "langen Dateinamen". Als Ersatz dient daher vom Entwickler frei definierbare 'Dateibeschreibung', die nicht im Directory der Speicherkarte, sondern in der Datei selbst gespeichert wird.

Beispiel (aus dem Demo 'AppSelector', in dem eine Tabelle zur Anzeige aller auf der Speicherkarte gefundenen *.cvt - Dateien, oder deren Beschreibungen, verwendet wird):

Die Dateibeschreibung kann per Programmiertool im Menü 'Datei'...'Beschreibung' definiert werden :


Beim Aufruf des System-Menüs (Drücken von F2 und F3) wird u.A. auch die Dateibeschreibung (im Feld "App-Info") angezeigt. Dadurch kann mit einem Blick kontrolliert werden, ob im Gerät wirklich die für eine bestimmte Messaufgabe, Testfahrt, etc vorgesehene Applikation geladen wurde, falls sich die Applikation nicht selbst durch eine entsprechende Anzeigeseite identifiziert.
Das Script kann diese Zeichenkette als display.app_info auslesen.

Für Entwickler:
Die Dateibeschreibung wird im nicht verschlüsselten Teil der Datei ("Kopf") abgelegt, denn nur so kann das Script im "App-Selektor" diese Information aus der Datei extrahieren. Beispiel:
; File:  c:\MKT\CANdbTerminalProgTool\programs\Brake_T1.cvt
; Saved: 2015-03-05 11:12:13
; Type:  program file for user programmable terminal
; Producer: programming tool compiled Mar  5 2015
Description="Bremsentest, Strecke 1"
Encryption=0
PwdHint1=""
Password1=""
Das Script im 'App-Selektor' verwendet die Funktion file.read zum Extrahieren der Dateibeschreibung aus einer *.cvt- oder *.upt-Datei.


Simulation der Speicherkarte (im PC, als Ersatz für die Speicherkarte im 'echten Gerät')

Um komplexere Applikationen (z.B. mit Zugriff auf Dateien per Script) ohne spezielle Hardware am PC zu entwickeln, kann die im 'echten Gerät' vorhandene Speicherkarte durch ein frei wählbares Unterverzeichnis auf der Festplatte des PCs ersetzt werden (Parameter "Simulated MC" auf dem Panel "Directories").

Um das Einsetzen / Entfernen der Speicherkarte zu simulieren, wählen Sie im Hauptmenü des Programmiertools unter 'Optionen' die Funktion

    'Simulierte Speicherkarte'     (schaltet zwischen 'Eingesetzt' und 'ENTFERNT' um).




Kontrolle der in einer Applikation verwendeten 'externen' Dateien

Manche Display-Anwendungen (Applikationen bzw "Programme") verwenden während ihrer Laufzeit externe, z.B. auf einer Speicherkarte oder im FLASH-Speicher des Terminals abgelegte Dateien, z.B. bestimmte Audio-Dateien, die während des Betriebes wiedergegeben werden sollen.

Wenn Sie derartige Anwendungen an Dritte weitergeben wollen (Kunden, Kollegen,..), vergessen Sie nicht, alle von der Anwendung benötigten 'externen' Dateien ebenfalls weiterzugeben, bzw diese bei der Auslieferung in das Gerät zu laden.

Um diese Aufgabe zu erleichtern, bietet das Programmiertool die Möglichkeit, die von einem Programm verwendeten Dateien während der Simulation, oder beim Aufruf der Funktion 'Alle Anzeigeseiten prüfen' zu ermitteln. Das Ergebnis kann per "Ansicht" .. "Externe Datei-Referenzen" im Hauptmenü des Programmiertools angezeigt werden :

screenshot 'file reference table'

Jede Zeile in dieser Liste enthält den Namen einer offensichtlich verwendeten Datei, die Nummer der Anzeigeseite (auf der die Datei verwendet wurde), die Zeilennummer innerhalb der Anzeigeseite oder Event-Definition, und das Datum der letzten Verwendung im ISO-8601-Format (JJJJMMDD) - was nichts mit dem Erstellungsdatum der Datei zu tun hat !

Wird die Datei-Historie nicht mehr benötigt, kann sie mit der Schaltfläche 'Löschen' (am unteren Rand des oben gezeigten Anzeigefensters) gelöscht werden.

Sie können notfalls neue Einträge manuell hinzufügen oder entfernen. Laden Sie die UPT- (bzw CVT-) Datei dazu mit einem Text-Editor, und suchen nach dem Abschnitt 'Audio- and other  files (REFERENCES)', z.B. :

; ----- Audio- and other files (REFERENCES) -----
a file0="dog.wav"   pn=0 li=1 da=20091207
a file1="puppy.wav" pn=0 li=2 da=20091207
a file2="sheep.wav" pn=0 li=3 da=20091207
Darin ist
pn = page number (Seitennummer), li = 'line of page' (Zeilennummer), und da = Datum im ISO-Format.

Die Datei-Referenz-Liste ist auf maximal 64 Einträge begrenzt (bedingt durch die Firmware, bzw den zur Ablage reservierten FLASH-Speicher).

Das Auffinden aller Datei-Referenzen mag trivial erscheinen, ist es aber nicht. Beachten Sie folgendes Beispiel :

audio.play( "msg" + str("***",AudioMsgNumber) + ".wav" )

Darin soll 'AudioMsgNumber' eine numerische Variable sein, deren Wert sich zur Laufzeit per Kommunikationskanal (SDO, PDO, CAN-Signal, etc etc) ändern kann. Das Programmiertool ist nicht in der Lage, alle mit dem oben gezeigten String-Ausdruck 'berechneten' Dateinamen zu erraten. Selbst während einer Simulator-Sitzung werden nicht immer alle möglichen Werte von 'AudioMsgNumber' auftreten. Darum:
Falls Sie derartige Kommandos verwenden, stellen Sie eine Liste aller eventuell benötigten Dateien zusammen, und geben Sie diese zusammen mit der UPT- (oder CVT-) Datei weiter, bzw. laden alle benötigten Dateien vor der Auslieferung eines Gerätes.

Anwenderdefinierte Zeichensätze könnten strenggenommen auch zu den 'externen Dateien' gezählt werden. Dies ist aber momentan nicht der Fall (2009-12-07). Eine Liste der von der Applikation verwendeten Zeichensätze finden Sie nicht in der oben gezeigten Datei-Referenz-Liste, sondern in der in einem anderen Kapitel beschriebenen Liste mit den benutzerdefinierten Zeichensätzen .


Anlegen eines Text-Arrays (ohne Script, im Programmiertool)

Das Text-Array ist eine eindimensionale Liste von Zeichenketten, die Sie in Ihrer Anwendung einsetzen können um -abhängig von einem numerischen Wert- verschiedene Text-Meldungen auf dem Display anzeigen können.

Um das Text-Array nutzen zu können, müssen Sie im Programmiertool definieren wieviel Speicher dazu verwendet werden soll. Bei alten Geräten (mit 8- oder 16-Bit-CPU, z.B. MKT-View "Plus") mussten dafür einige Anzeigeseiten geopfert werden, um mehr Speicher für weitere Textzeilen zu erhalten. Bei neueren Geräten (mit flexibler Verwaltung des FLASH-Speichers) ist dies nicht mehr nötig.

Die Anzahl benötigter Textzeilen stellen Sie folgendermaßen ein:
Im Hauptmenü des Programmiertools: Optionen ... Speicheraufteilung  ... max. Zeilen im Textarray .
Weitere Infos zur Speicherreservierung finden Sie hier.

Um auf einzelne Zeilen des Textarrays zuzugreifen, verwenden Sie die entsprechenden String-Funktionen des Interpreters.

Ein einfaches Beispiel für Text-Arrays finden Sie im zweiten Demoprogramm.
 

Tip:
Wenn Sie lediglich zwei oder drei Textalternativen (z.B. "ok"-"zu heiß" - "zu kalt") in Abhängigkeit von einem numerischen Wert anzeigen wollen, bietet sich dazu auch das "arithmetische if-then-else" innerhalb eines Format-Strings an. Dies wird im Kapitel BUTTONS(!) beschrieben.

Siehe auch:

  • Popup-Fenster : kann zur Anzeige von Zeichenketten verwendet werden, die während der Laufzeit per CAN-Bus an das Anzeigeterminal gesendet werden (das "Popup-Fenster" arbeitet dann wie ein "Terminal im Terminal", zur Anzeige beliebiger Textmeldungen).
  • String-Funktionen des Display-Interpreters
  • Konstanten-Arrays in der Script-Sprache (elegantere Alternative zu den Text-Arrays, wenn Scripte verfügbar sind)

Zum Anfang

Definition von Anzeigeseiten (Referenz)

Die Registerkarte "Page Definition" dient zur Definition einer einzelnen Anzeigeseite. Auf jeder Anzeigeseite können mehrere Anzeige-Elemente platziert werden. Dieser wichtige Teil des Programmiertools ist in weitere Unter-Register gegliedert, die im weiteren Verlauf erläutert werden. Neben der unten gezeigten Definition in Tabellenform verfügt das Programmiertool über einen später beschriebenen grafischen Editor.

screenshot Display Page Definitions
(Definition einer Anzeigeseite im Programmiertool; hier in Tabellenform)

Einleitung zu den programmierbaren Anzeigeseiten

Eine Anzeigeseite besteht aus..

Neben der oben gezeigten Tabellenform können Anzeigeseiten auch mit einem graphischen Editor bearbeitet werden (mehr dazu später) :

screenshot Display Page Definitions
(Definition einer Anzeigeseite im Programmiertool; hier mit dem graphischen Editor)

Nach dem Start zeigt das Programmiertool 'Seite Null' Ihrer Applikation an (wie das 'echte' Gerät nach dem Einschalten).
Um im Programmiertool zu einer anderen Anzeigeseite Ihres Terminal-Programms umzuschalten, verwenden Sie die roten Pfeil-Buttons (,rechts oben) oder die Anzeigeseiten-Übersicht (page overview), auf der Sie alle bereits programmierten Seiten sehen können. Zur Seitenumschaltung im Terminal bieten sich Buttons, Menüs, selbstdefinierte Ereignisse, Script, oder Page-Scan-Sequenzen an. Doch zunächst zur Beschreibung aller Elemente, die zu einer Anzeigeseite gehören...

Kopf einer Seitendefinition

Der Kopf einer Seitendefinition enthält die Eigenschaften einer Anzeigeseite, die nicht an ein spezifisches Anzeigeelement gebunden sind.

Dazu gehören:

  • der NAME der Seite. Ersetzen Sie den automatisch erzeugten Namen bitte durch einen sprechenden Namen,
    z.B. "MainMenu" statt "page2". Dabei sind i.A. maximal 8 Buchstaben zulässig !
  • das Flag "Diese Seite immer KOMPLETT neu zeichnen"
  • das Flag "Bildschirm NICHT automatisch löschen (nur per Kommando)"
    (in diesem Fall wird der Bildschirm nicht automatisch vor dem Zeichnen der Anzeige-Elemente gelöscht, sondern nur durch einen entsprechenden Befehl im Script oder per Display-Interpreter).
  • das Flag "Bildschirm NICHT aktualisieren wenn Tastaturpuffer voll"
    (wodurch die Seitenumschaltung bei alten Geräten wie z.B. MKT-View / MKT-View "Plus" beschleunigt werden konnte)
  • das Flag "Tastaturpuffer NICHT löschen wenn diese Seite aufgerufen wird"
  • das Flag "Umlaufende Tastatursteuerung"
    (d.h. beim Navigieren z.B. per Cursor "Up" springt der Fokus vom ersten zum letzten Feld)
  • das Flag "Invertierter Bildschirm"
    (nur bei alten Monochrom-Displays verfügbar): Weiße Schrift auf schwarzem Hintergrund statt schwarzer Schrift auf weißem Hintergrund.
    Bei Farbdisplays stattdessem die 'Default-Farben' verwenden !)
  • die Option "Seite gehört zur "pscan"-Sequenz"
  • das Aktualisierungsintervall (in Millisekunden): Optionale Reduktion der Seiten-Aktualisierungsrate. Verwendung z.B. wenn auf einer Seite ein numerischer Wert angezeigt wird, der sich sehr oft ändert (was die Lesbarkeit bei alten Passiv-LCDs, z.B. im MKT-View / MKT-View "Plus", besonders bei Kälte erschwerte).
  • Textfarbe, Hintergrundfarbe (Default, Tag/Nacht-Farbschema): Nur für Farbdisplays. Prinzip, Verwendung und ein Beispiel finden Sie in einem anderen Kapitel.
  • Spezieller Hintergrund: Hier kann ein optionaler Befehl zum Löschen des Hintergrundes (vor dem Aufbau der Seite) eingegeben werden. Andernfalls wird der Hintergrund der Seite beim ersten Aufruf mit der Hintergrundfarbe gefüllt ( wie "Clear Screen"). Hinweis: Das Kommando zum Füllen des Hintergrundes sollte den *gesamten* Hintergrund löschen, nicht nur einen Teil davon. Andernfalls bleiben Teile der vorherigen Bildschirmseite sichtbar. Beispiel: Kommando zum Füllen mit einem Farbverlauf (gradient fill).
  • die Grafikauflösung für die diese Seite entworfen wurde,
    und die Option, ob diese Seite gegebenenfalls automatisch für die Auflösung des tatsächlich verwendeten Displays angepasst (skaliert) werden darf.


(Screenshot 'Definitions-Kopf einer programmierbaren Display-Seite')

Bei gesetzter Option "..immer komplett neu zeichnen" wird bei jedem Hauptschleifendurchlauf die Anzeigeseite komplett neu gezeichnet. Dies erfordert ein hohes Maß an Rechenzeit, kann aber bei bestimmten Seiten nötig sein, z.B. bei überlappender oder bewegter Grafik (damit die bewegten Objekte keine "Schleifspur" hinterlassen). Eine komplette Seiten-Aktualisierung beinhaltet das Löschen des Bildschirms.

Eine typische Display-Aktualisierung mit der Option 'immer KOMPLETT neu zeichnen' dauerte bei alten Geräten mit 8-Bit-CPU circa 250 Millisekunden. Daraus ergab sich eine Screen-Aktualisierungsrate von mindestens 4 Updates pro Sekunde. Bei neueren Geräten (z.B. MKT-View III / IV / V) liegen die Aktualsierungsraten i.A. bei 10 bis 50 Hz (abhängig vom Inhalt der Anzeigeseite).

Wenn die Option 'immer KOMPLETT neu zeichnen' nicht aktiviert ist, werden nur die Anzeigezeilen neu gezeichnet in denen sich (vermutlich) etwas geändert hat. Dadurch wird etwas Rechenzeit eingespart, und die Update-Frequenz steigt deutlich an.

Als Alternative zur Option 'immer KOMPLETT neu zeichnen' kann unter 'Eigenschaften einer Anzeigezeile' die Option '(ein einzelnes Element) immer neu zeichnen' gesetzt werden, um ein bestimmtes Element ständig neu zu zeichnen (auch wenn sich aus Sicht des Interpreters der 'Wert' in der entsprechenden Zeile nicht geändert hat). Näheres dazu im Abschnitt 'Eigenschaften einer Anzeige-Zeile'.

Manuelle Definition von Anzeige-Elementen

Zum Einfügen von Anzeigeelementen klicken Sie (im einfachsten Fall) mit der rechten Maustaste in das simulierte LC-Display, und wählen aus, was sie dort einfügen wollen. Das Programmiertool fügt dann eine neue Anzeige-Definitions-Zeile zur unten beschriebenen Definitionstabelle hinzu. Für sehr einfache Anwendungen (bei denen die direkte Eingabe des Quelltextes nicht nötig ist), können Sie alternativ zur hier beschriebenen Eingabemöglichkeit auch den "einfachen" Anzeigeseiten-Editor verwenden.
Fortgeschrittene Anwender bevorzugen die direkte (manuelle) Eingabe in der folgenden Tabelle.

Alle Anzeigezeilen einer Seitendefinitionen werden als Tabelle auf der Registerkarte "Display Lines" angezeigt:

Die Tabelle auf der linken Seite zeigt alle derzeit definierten Anzeigezeilen (innerhalb der aktuellen Anzeigeseite).
Rot hinterlegte Zellen in dieser Tabelle deuten auf Fehler hin, die beim letzten Aufruf der Funktion 'Alle Seiten prüfen und korrigieren' (im Hauptmenü unter 'Assistent') erkannt wurden, z.B. Verwendung von nicht definierten Variablen (in der Spalte 'Var/Formel').

Hinweis:
Wenn Ihnen diese Tabelle zu kompliziert vorkommt, benutzen Sie stattdessem das weiter unten beschriebene Panel (rechts neben der Tabelle) zur Definition eines einzelnen Anzeige-Elements,
oder verwenden Sie statt der tabellarischen Eingabe den graphischen Editor.
Die Tabelle wird von Experten viel verwendet und sehr geschätzt... wir hoffen, daß Sie auch bald zu den Experten zählen !

Die Buttons unterhalb der Tabelle dienen zum Bearbeiten des Tabelleninhalts. INSERT, DELETE, COPY und PASTE beziehen sich auf komplette Anzeigezeilen. Mit dem Button "MORE" kann ein Popup-Menü geöffnet werden, auf dem weitere Möglichkeiten angezeigt werden (auch durch Rechts-Klick in die Tabelle zu öffnen).

Die Tabellenspalten (bzw. Editierfelder) "X" und "Y"
definieren die Position des oberen linken Eckpunktes des in dieser Zeile definierten Elementes, gemessen in Pixel (bezogen auf den Grafikbildschirm des Terminals).
Statt der numerischen Eingabe von Pixelkoordinaten empfiehlt sich die Verwendung des graphischen Editors .

Die Spalten "W" und "H"
definieren die Breite und Höhe einiger (nicht aller!) Anzeige-Elemente. Einheit: Pixel. Bei 'normalen' alphanumerischen Anzeigezeilen haben diese Felder keine Funktion, denn die Größe eines Anzeigeelements ergibt sich aus der Anzahl Buchstaben, dem verwendeten Zeichensatz, und Zoom-Faktor. Aus dem Grund sind die Einträge under "W" und "H" für die Anzeige von "normalen Textfeldern" oft leer (es sei denn, Text soll z.B. rechtsbündig oder zentriert angezeigt werden).
Bei Geräten mit Firmware-Kompilations-Datum vor 2009-11-27 (ISO, YYYY-MM-DD; z.b: MKT-View "Plus") werden die Spalten "W" und "H" im Programmiertool nicht angezeigt, denn Geräte mit derart alter Firmware unterstützen diese Funktion nicht. Im Zweifelsfall vergleichen Sie bitte das Firmware-Kompilations-Datum im Systemmenü des verwendeten Gerätes, und auf der Registerkarte "Settings" (Einstellungen) des Programmiertools unter 'Firmware compilation date'. Wenn keine direkte Verbindung (per CAN oder seriellem Port) zwischen Programmiertool und programmierbarem Gerät aufgebaut werden kann, hat das Programmiertool keine Möglichkeit, das Firmware-Kompilations-Datum zu "erfragen" !
Im graphischen Editor kann die Größe durch Ziehen der unteren rechten Ecke (kleines Quadrat) geändert werden.

Die Spalte "Name"
Hat ein Anzeigeelement einen eigenen Namen, kann per Interpreter oder per Script darauf zugegriffen werden, um z.B. die Farbe während der Laufzeit zu ändern. Ein Namen (in dieser Spalte!) darf aus maximal 7 Buchstaben bestehen. Sonder- oder Leerzeichen sind nicht erlaubt. Weitere Details stehen hier .

Die Spalte "Text"
dient zur Eingabe des Format-Strings für numerische Anzeigen, oder als Menüzeile. Der Format-String kann auch zur Anzeige von Icons (kleinen Bildern), Bargraphen (Anzeigebalken) , Buttons (graphischen Schaltflächen) oder anderen graphischen Sonderfunktionen eingesetzt werden. Dazu werden sogenannte Backslash-Sequenzen verwendet. Ohne Backslash-Zeichen wird der Text direkt auf dem Display angezeigt.

Die Spalte "Var/Formel" (bzw. "Var/Expr")
enthält normalerweise den Namen einer Variablen, deren Wert in einer Zeile angezeigt oder editiert werden soll. Bei Menüzeilen enthält diese Spalte ein Interpreterkommando welches ausgeführt werden soll wenn der Menüeintrag aktiviert wurde. Der Zahlenwert kann auch in einer Icon-Sequenz zum "bedingten" Invertieren eines Icons verwendet werden (mit der Funktion "v"). Zum Ändern der Zuordnung von Variablen und Anzeigefeldern eignet sich auch die Funktion "Variablen/Signalzuordnung ändern", die Sie im lokalen Menü finden (Button "Mehr"/"More").
Bei Geräten mit 32-Bit-CPU (z.B. MKT-View II/III/IV) kann in der Spalte 'Var/Formel' auch ein numerischer Ausdruck eingegeben werden, der zur Laufzeit ständig neu berechnet wird. Das Ergebnis der Berechnung wird dann in numerischer Form -abhängig vom Format-String- angezeigt.

Die Spalte "Access/HotKey"
definiert die Zugriffsrechte für eine angezeigte/editierte Variable oder eine ‚hotkey‘-Definition falls diese Displayzeile als Menüzeile (menu item) verwendet wird. Mehr darüber in der Beschreibung des 'display line property panels'.

Die Spalten "Draw Mode", "Color", "Font" usw
beeinflussen das Erscheinungsbild der Zeile auf dem Display. Siehe 'Property panel'.

Das "property"-Panel auf der rechten Seite zeigt detailierte Informationen über die aktuell in der Tabelle selektierte Anzeige-Zeile.

Sie können die Eigenschaften einer Anzeigezeile sowohl in der Tabelle als auch auf dem 'property panel' editieren, die Änderung wird jeweils in die "andere" Darstellungsart übernommen.

Um den Inhalt einer Variablen oder eines numerischen Ausdrucks ("Formel") in der Definitionstabelle zu untersuchen, zeigen Sie mit der Maus in die entsprechende Zelle (ohne zu klicken). Wenn der (Display-)Interpreter den Ausdruck unter der Maus auswerten kann, dann wird der Ausdruck und das das berechnete Ergebnis in der Statuszeile am unteren Rand des Hauptfensters angezeigt. Mit der Position des Mauspfeils über dem Ausdruck kann gesteuert werden, welcher Teil davon ausgewertet wird. Details dazu im Kapitel Interpreter.

Wenn das Fenster des LCD-Simulators sichtbar ist, können Sie den Effekt der Änderungen sofort sehen. Wenn beispielsweise die Y-Position eines Textes mit dem Up/Down-Scroller auf dem Property Panel geändert wird, bewegt sich der Text auf dem simulierten LC-Display. Die momentan editierte Anzeigezeile kann mit einem gestrichelten Rechteck im Simulatorfenster markiert werden (per "General Settings" abschaltbar).

Wenn sich einige graphische Elemente auf dem Bildschirm überlappen, muss die Reihenfolge, in der die Elemente gezeichnet werden, beachtet werden ! Die Reihenfolge der Definitionszeilen kann per Maus geändert werden. Dazu bei gedrückter linker Taste einen Eintrag in der Spalte "Nr" nach oben oder unten bewegen. Ein schwarzer horizontaler Markierungsbalken zeigt die Einfügeposition. Diese Tabellen-Zeilen-Verschiebung funktioniert auch in anderen Tabellen des Programmiertools.

Viele Möglichkeiten der Anzeige werden in den Beispielen vorgestellt.

Eigenschaften einer Anzeige-Zeile (display line properties)

Das "display line property"-panel zeigt die Eigenschaften einer einzelnen Display-Zeile (die in der Seitendefinitionstabelle angewählt wurde).

Wenn das simulierte LC-Display sichtbar ist, sehen Sie den Effekt der Änderungen sofort. Wenn Sie zum Beispiel die Y-Position eines angezeigten Textes mit dem up/down-Scroller auf dem "property"-Panel ändern, wandert der Text auf dem simulierten LC-Display.

Eigenschaften einer Anzeige-Zeile (oder ähnlichen graphischen Objekts) sind:

  • X-Position, Y-Position (Position des Elements in Pixel)
  • Breite und Höhe (Größe des Anzeige-Elements in Pixel)
    Details in der Beschreibung der tabellarischen Eingabe (Spalten "W"=Width=Breite und "H"=Höhe).
  • Typ / Text : Zeigt, abhängig von eventuell vorhanden Backslash-Sequenzen im Format-String den Typ des Anzeigeelements an (einfacher Text, Icon, Button, Bargraph, Diagramm, Textpanel, Tabelle, ...).
    Passend zum Typ wird i.A. auch die Registerkarte im mittleren Teil des Panels umgeschaltet ('Text', 'Symbol', ... 'Tabelle' ).
    Eine nachträgliche Änderung des Typs ist nicht ohne weiteres möglich (z.B. wird aus einem 'Button' nicht ohne Weiteres ein Y(t)-Diagramm und umgekehrt)... denn dazu müsste der komplette Format-String modifiziert werden. Wird einem normalen Text z.B. die Backslash-Sequenz \btn vorangestellt (durch direkte Eingabe), dann ändert sich der Typ automatisch von 'Text' nach 'Button' (=graphische Schaltfläche), weil der Inhalt des Editierfeldes 'Text' während der Eingabe laufend analysiert wird. Auch die Anzeige im Simulator wird sofort (während der Eingabe) aktualisiert.
  • Zeichenmodus :
    Bei Monochrom-Displays konnte hier normal, blinkend, invers angewählt werden.
    Bei Farbdisplays ist dieses Feld belanglos, da z.B. blinkender Text nicht unterstützt wird.
  • Text- und Hintergrundfarben (nur bei Farbdisplays).
    Bei Displays mit 256 oder mehr Farben kann eine Farbe per Doppelklick aus der verfügbaren Palette ausgewählt werden.
    Die zweite Hintergrundfarbe dient z.B. zum Erzeugen von Farbverläufen ("gradients") in graphischen Buttons und ähnlichen Objekten, oder für gefüllte Polygonflächen.
    Bei Zeigerinstrumenten kann (seit 2023) die zweite Hintergrundfarbe verwendet werden, um dem Skalenbereich einen vom Rest des Instruments abweichenden Hintergrund zu geben.
    Tipp: Wenn Vorder- und Hintergrungfarbe auf -1 (minus eins) gesetzt, verwendet das Terminal automatisch die Defaultwerte aus dem Kopf einer Seitendefinition. Dadurch kann bequem zwischen Tag- und Nachtdesign umgeschaltet werden, ohne für jede Zeile eine eigene Farbe definieren zu müssen.
    Details zur Verwendung von Farben und zur Tag/Nacht-Umschaltung finden Sie hier.
  • Zeichensatz (font). Fonts Nr. 1 bis 9 sind nichtproportionale Bitmap-Fonts (monospaced), 10 bis 15 benutzerdefiniert, weitere Nummern sind für frei skalierbare, proportionale Vektor-Fonts reserviert:
    1 : Nicht-proportionaler Bitmap-Font mit 4*6 Pixeln
    2 : Nicht-proportionaler Bitmap-Font mit 6*8 Pixeln
    3 : Nicht-proportionaler Bitmap-Font mit 7*12 Pixeln
    4 : Nicht-proportionaler Bitmap-Font mit 8*8 Pixeln
    5 : Nicht-proportionaler Bitmap-Font mit 8*16 Pixeln
    6 : Nicht-proportionaler Bitmap-Font mit 16*16 Pixeln
    7 : Nicht-proportionaler Bitmap-Font mit 16*32 Pixeln
    8 : Nicht-proportionaler Bitmap-Font mit 32*32 Pixeln (nur für 'große' Displays)
    9 : Nicht-proportionaler Bitmap-Font mit 12*24 Pixeln (nur für 'große' Displays)
    10 .. 15 : Benutzerdefinierte Zeichensätze
    21: Vektor-Font 'Hershey Simplex' (mit dünnen Linen)
    22: Vektor-Font 'Hershey Duplex' (mit doppelt gezogenen Linen)
    Per Doppelklick auf das unterstrichene Label 'Font' kann ein Fenster geöffnet werden, in dem alle im Font enthaltene Zeichen tabellarisch angezeigt werden.
    Welche Zeichensätze im verwendeten Gerät tatsächlich vorhanden sind, kann im Programmiertool auf der Registerkarte 'Einstellungen' unter Terminal-Konstanten / 'Unterstützte Zeichensätze' kontrolliert werden.
    Jedes Bit im dort hexadezimal angezeigtem Wert repräsentiert einen der oben aufgelisteten Zeichensätze.

  • Vergrößerungsfaktor für Buchstaben (Zoom). Getrennt für X- (horizontal) und Y-Achse (vertikal) einstellbar.
    Bitmaps und Bitmap-Fonts können nur 1,2,3,4 .. 15-fach vergrößert werden, Vektor-Fonts dagegen im Bereich 0.2 bis 15.9 (d.h. Vektor-Fonts können nicht nur 'feinschrittig' vergrößert, sondern auch verkleinert werden).
  • Variable / Formel / Ausdruck
    In dieser Spalte wird z.B. der Namen der Variablen definiert, deren Wert (oder auch deren Namen) auf dem Bildschirm angezeigt werden soll.
    Bei normalen Textzeilen wird das Format, und eventuell vorlaufender Text durch den bereits erwähnten Format-String definiert.
    Bei Geräten mit 32-Bit-CPU (z.B. MKT-View II, III, IV) kann in dieser Spalte nicht nur eine einfache (Display-)Variable, sondern ein kurzer Ausdruck ("Formel") eingegeben werden, z.B.
        Strom*Spannung
    Für komplexere 'verrechnete Werte' empfiehlt es sich aber, die eigentliche Berechung als Script-Funktion zu implementieren (z.B. 'Leistung'), und diese dann mit dem Prefix 'script.' (wie beim Zugriff auf Script-Variablen aus dem Display-Interpreter) aufzurufen:
        script.Leistung
    mit der folgenden Implementierung der Funktion 'Leistung' (im Script):
       func Leistung
           return display.Strom * display.Spannung;
       endfunc;
    
  • Zugriff (access): Der Wert einer Variablen mit Schreib/Lesezugriff kann auf dem Display editiert werden (nur Integerzahlen !).
    Steht hier "read only", kann der Wert auf dieser Seite nur angezeigt, aber nicht geändert werden.
    Einige Anzeigeelemente (z.B. Balkendiagramme) werden durch 'Schreib/Lesezugriff' ('Access: Read/Write' im oben gezeigten Panel) zu einem interaktiven Bedienelement, so wird z.Baus einem einfachen Balkendiagramm ein per Touchscreen bedienbarer 'Schieber' oder Scrollbalken.
  • Control ID: Wird nur benötigt, wenn Ereignisse (Events) im Zusammenhang mit diesem Steuerelement (Button, Menüzeile, Editierfeld) in der Script-Sprache abgefangen, bzw. verarbeitet werden sollen. Durch diesen "Control ID" (=Identifizierer für ein Steuerelement) kann im Script mit Hilfe der select..case-Anweisung herausgefunden werden, welches Steuerelement das Ereignis ausgelöst hat. Dazu müssen alle Steuerelemente (zumindest alle Steuerelemente auf einer Seite) unterschiedliche IDs erhalten. Es wird dringend empfohlen, als Control-ID keine Zahlenwerte, sondern symbolische Konstanten (deren Werte im Script definiert sind) zu verwenden. Beispiel: Siehe "Button-Event-Demo".
    Ist das Feld 'Control ID' leer, kann das Script keine Benachrichtigung empfangen, wenn mit dem Steuerelement "etwas Besonderes" passiert .

    Per Doppelklick in das oben gezeigte Eingabefeld 'Control ID' kann für das Steuerelement eine im Script definierte Konstanten ausgewählt werden, z.B.:


    Liste mit selbstdefinierten Script-Konstanten,
    nach Doppelklick in das Feld 'Control ID' im Programmiertool.
    Details zu Control-Identifiern finden Sie im Handbuch zur Script-Sprache.

  • "Menüeintrag"
    Durch Setzen dieses Flags wird aus einer normalen Anzeige-Zeile eine Menüzeile. Der Bediener kann sich später mit den Cursortasten durch das Menü auf einer Anzeigeseite bewegen und mit der ENTER-Taste das unter "Variable/Expression/Menu Command" definierte Kommando ausführen (welches meistens aus einem Sprung auf eine andere Anzeigeseite bestehen wird).

  • "immer komplett neu zeichnen"
    Veranlasst den Display-Interpreter, diese Anzeigezeile so oft wie möglich neu zu zeichnen. Verwenden Sie diese Option wenn eine Zeile bestimmte "Nebeneffekte" hat, wie z.B. eine dynamische Textanzeige. Für "normale" Anzeigezeilen deren Inhalt nur vom Wert der dargestellten Variablen abhängt, brauchen Sie diese Option nicht (die UPT-Firmware kümmert sich darum, eine Anzeigezeile neu zu zeichnen wenn sich der WERT der angezeigten Variablen ändert).

  • "per Touchscreen bedienbar" Das Anzeige-Element soll per Touchscreen bedienbar werden.
    Beim Element-Typ 'Tabelle' kann z.B. per Touchscreen innerhalb der Tabelle navigiert werden (d.h. Zellen markiert); bei Buttons die programmierbare Reaktion ausgelöst; Balkendiagramme werden dadurch zum Bedienelement 'Schieber'; Icons (Bilder) können die Funktion von 'Buttons' erhalten; etc.

  • "Text" (Registerkarte im unteren Teil des Panels, für einfache Anzeige/Bedien-Elemente mit dem Typ "Text" oder "Numerisch" ):

Eigenschaften die von einem bestimmten Gerät nicht unterstützt werden, werden auf dem "property"-Panel passiv dargestellt (grau).

Die Zuordnung von Variablen zu Anzeigezeilen kann auch mit dem Variablen-Auswahl-Dialog erfolgen.

Format-String (für die Definition von Anzeige-Elementen)

Der Format-String (Zeichenkette) ist eine der Eigenschaften einer Anzeige-Zeilen-Definition.

Er kann...

  • ein einfacher (fester) Text sein wie z.B. "Hallo, Welt !"
  • spezielle "Platzhalter" wie z.B. "****" für numerische Ziffern enthalten
  • spezielle Backslash-Sequenzen enthalten, wie z.B. \vvvvvvvv zur Anzeige des Variablennamens
  • verwendet werden um Icons anzuzeigen (in backslash-Sequenzen wie "\iMyIcon" )
  • einfache HTML-ähnliche Tags enthalten, z.B. '<u> unterstrichener Text </u>'
  • auch das Aussehen und Verhalten von Editierfeldern bei der Eingabe steuern.

Spezielle Zeichen im Format-String, Backslash-Sequenzen
(Hinweis: Die folgende Liste bezieht sich auf 'moderne' Geräte mit 32-Bit-CPU.
  Ältere Geräte wie z.B. "MKT-View" (mit 16-bit CPU) und "UPT-515" (mit 8-Bit-CPU)
  unterstützten nur einen kleinen Teil aus der folgenden Aufzählung.)


* (Sternchen, Asterisk) wird durch eine Ziffer oder ein Zeichen eines String-Ausdrucks ersetzt.
Bei Fliesskommawerten werden führende Nullen unterdrückt, bei Integer nicht.

# wird, ähnlich wie '*', durch eine Ziffer ersetzt.
Im Gegensatz zu '*' werden führende Nullen IMMER unterdrückt, d.h. durch Leerzeichen ersetzt.

0 (Ziffer Null): Wird -ähnlich wie '*' und '#'- durch eine Ziffer des numerischen Wertes ersetzt.
Im Gegensatz zu den Platzhaltern '*' und '#' werden Nullen NICHT unterdrückt.

. (Punkt) dient als Dezimal-Trennzeichen (auch als 'Dummy' in Integer-Werten).
Siehe auch: Hinweise zu Editierfeldern.

, (Komma im Format-String, nicht in Interpreterkommandos)
dient seit Oktober 2009 als Dezimal-Trennzeichen für deutsche Anwender;
allerdings nur, wenn direkt danach ein Platzhalter für eine Ziffer folgt.

- wird durch das Vorzeichen eines numerischen Wertes ersetzt (+,-)

\\ zeigt eine einzelnes Backslash-Zeichen an

\< zeigt eine öffnende spitze Klammer an (statt diese als HTML-Tag zu interpretieren)

\- zeigt ein Minuszeichen an (kein Platzhalter für das Vorzeichen einer Zahl)

\0 zeigt das Zeichen 'Null' an (kein Platzhalter für die Ziffer einer Zahl)

\ar   align right (rechtsbündige Ausgabe, bezieht sich auf den Rest der Zeichenkette innerhalb ihres Anzeigefelds (*) )
\ac   align center (horizontal und vertikal zentrierte Ausgabe, ebenfalls für den Rest der Zeichenkette (*) )
\ah   align horizontally centered (horizontal zentrierte Ausgabe für den Rest der Zeichenkette (*) )
\av   align vertically centered (vertikal zentrierte Ausgabe für den Rest der Zeichenkette (*) )
\at, \ab : Reserviert für das Aurichten von Feldern auf dem Bildschirm (nicht für den Text innerhalb des Felds)
Nur für Geräte mit 32-Bit CPU und Firmware ab 2013-03-25.
Der rechte und ggf. untere Rand ergibt sich aus der Position ("X","Y") und der festen Größe des Anzeigeelements.
Bei Anzeigeelementen ohne feste Größe verwenden die meisten \a-Sequenzen den rechten und unteren Bildschirmrand als Ende der 'nutzbaren Fläche' zum Ausrichten des Textes.
Das folgende Beispiel aus programs\AlignTst.cvt verwendet farbige Hintergründe um die einzelnen Felder sichtbar zu machen, in denen die Texte ausgerichtet werden:


Format-Strings zur Ausrichtung der oben gezeigten bunten Felder:
\acac:Center \arar:Right \ahah: H-Center
\avav: V-Center \av\arVert+Right \avV-Center,\nmultiple\nlines .


\bar(width,height,flags,ticks,pattern...)
zeichnet einen Anzeigebalken (bargraph)

\btn(width,height, ...)
zeichnet einen Button bzw. Schaltfläche (nur bei bestimmten Geräten verfügbar !)

\chr(N) zeigt ein einzelnes Zeichen mit dem Code N (dezimal). Der aktuelle Zeichensatz wird verwendet. Beispiele:
\chr(65) Buchstabe " a ".
\chr(v) zeichnet das Zeichen mit dem Code (v), der sich aus der Auswertung des numerischen Ausdrucks in der aktuellen Anzeige-Definitions-Zeile ergibt (siehe "v"-Funktion)
\chr(56) zeichnet ein graphisches Symbol für "schnellen Vorlauf". Voraussetzung: der aktuelle Zeichensatz ist  der benutzerdefinierte Zeichensatz "Webd3232" oder ähnlich. Dies ist nur bei bestimmten Terminals möglich. ("Webd3232" ist ein "Webdings"-kompatibler Symbolzeichensatz,  "Webdings" (c) Microsoft Corporation).
Bei einigen Geräten (z.B. MKT-View III,IV) können per chr(N) auch bestimmte Sonderzeichen per Unicode angezeigt werden. Der Zeichencode (N) wird dann vorzugsweise in hexadezimaler Form mit vier Ziffern angegeben, z.B.:   \chr(0x2611)
(zeichnet ein 'Häkchen im Kasten', , vgl. Anzeige von Sonderzeichen in einer Tabelle und Beispiel: Buttons mit Häkchen). Gebräuchlicher als per chr() ist allerdings die Ausgabe von Sonderzeichen im Format \U+<hex> (Backslash-U "plus" hexadezimalem Code).

\cN setzt die Textfarbe für die Ausgabe der nachfolgenden Zeichen auf den numerisch angegebenen Farbwert
Darin sollte N eine der hier spezifizierten Standard-Farben sein.
Beispiel: \c7 setzt die Textfarbe auf Weiss.

\CN setzt die Hintergrundfarbe für die Ausgabe der nachfolgenden Zeichen
Darin sollte N auch hier nur eine der Standard-Farben sein.
Üblicherweise werden Farben nicht zwischen zwei Buchstaben in der gleichen Textzeile umgeschaltet. Die Textfarben werden i.A. nur durch die Eigenschaften der (gesamten) Anzeigezeile festgelegt.
Beispiel: \C0 ("C Null") setzt die Hintergrundfarbe auf Schwarz.


\dia( <diagram-definition> )
Teil einer Diagramm-Definition (nur bei Geräten mit geeigneter Grafikanzeige)


\e( <String-Ausdruck> ) 
String-Ausdruck (expression) statt eines festen Format-Strings. Nur bei Geräten mit 16-Bit-CPU möglich !

\fN schaltet den Zeichensatz innerhalb einer Anzeigezeile um.
Darin ist N die Zeichensatz-Nummer wie auf dem Zeilen-Definitions-Panel. Dies funktioniert auch beim Interpreterkommando "pa", mit dem Text an variablen Koordinaten ausgegeben werden kann.

\fr( x1,y1, x2,y2 )
Zeichnet einen rechteckigen Rahmen. Die Koordinaten sind *relativ* zur Position der Display-Zeile. Beispiel: Menu \M0\fr(-2,-2,260,32)

\fi( x1,y1, x2,y2 )
Zeichnet ein mit der aktuellen Vordergrundfarbe gefülltes Rechteck. Auch hier sind die Koordinaten *relativ* zur Position der Display-Zeile.

\i<Icon-Name>[,<Invert-Flag>]
Fügt ein Icon an der aktuellen Ausgabeposition ein. Diese Sequenz kann vom Programmiertool automatisch erzeugt werden (s.U.), aber auch manuell oder per Script um z.B. Glyphen bei der Übersetzung ('Internationalisierung') einzufügen. Beispiel:
\i"hourglas"   (hier mit Beschränkung auf 8 Buchstaben im Namen, um die Bilddatei gegebenenfalls auch zur Laufzeit von FAT-Dateisystemen ohne 'Long Filenames' laden zu können).

\li( [options] x1,y1, x2,y2 [, x3,y3, ..] )
Zeichnet eine Linie oder einen Pfad (Polygonzug). Auf dem "Pfad" können auch andere Grafikelemente wie geschlossene oder gefüllte Polygone liegen. Die Koordinaten sind *relativ* zur Position der Display-Zeile.
Optionen: w=width(1..3), p=pattern (16 bit für 16 pixel).
Ein Komma zwischen zwei Punkten (Koordinaten) verbindet diese mit einer Linie in der aktuellen Stärke, ein Semikolon nicht.
Wie bei den meisten Anzeigeelementen werden auch beim Zeichnen von Linienzügen oder Polygonen die für das Element definierten Zeichenfarben verwendet:
  • Für durchgezogene Linien wird die Vordergrundfarbe verwendet
    (die bei normalem Text für die Buchstaben verwendet wird);
  • der Hintergrund der rechteckigen Zeichenfläche wird mit der ersten Hintergrundfarbe gefüllt (bzw. "-2" = transparent).
  • gefüllte Polygonflächen ("polyfill") verwenden die zweite Hintergrundfarbe.
Als Teil eines Polygons (oder Linienzugs) kann auch gedrehter Text angezeigt werden. Beispiele:
   \li(0,15, 100,15)                     zeichnet eine Linie, Koordinaten relativ zur Objektposition
   \li(w=2,polyfill(13,44,52,44,32,12))  zeichnet ein gefülltes Dreieck mit Rand (Breite 2 Pixel)
   \li(font=1, "Test" )                  zeichnet einen Text mit dem Vektor-Font "Hershey Simplex"
   \li(font=2, rot=45, "Test" )          zeichnet um 45° (im Uhrzeigersinn) gedrehten Text
Zum Einfügen oder Editieren von Polygonen kann auch der graphische Editor verwendet werden.
Beispiele für Linienzüge mit gefüllten Polygonen (mit einigen Tricks) finden Sie hier.

\mN definiert den Zeichenmodus für alle folgenden Zeichen in der Zeile.
In einer "selektierten" Menüzeile (invertiert), wird der Zeichenmodus automatisch konvertiert. Bei Geräten mit 16-bit CPU kann der Zeichenmodus auch als numerischer Ausdruck in Klammern definiert werden. Die Werte für den Zeichenmodus sind die gleichen wie für das Interpreterkommando dm .

\MN definiert den Zeichenmodus für alle folgenden Zeichen in der Zeile.
Im Gegensatz zu "\m", wird der Zeichenmodus nicht automatisch konvertiert wenn die Zeile als Menüzeile invers dargestellt werden soll.

\n new line (plus carriage return).
Bei "normaler" linksbündiger Ausgabe wird die Ausgabeposition für den folgenden Text wird an den linken Rand (= x-Position aus Zeilendefinition) der folgenden Textzeile gesetzt.

\panel [ ( Optionen ) ]  Mehrzeiliges Text-Panel.
Definiert eine rechteckige Fläche, die per Script-Sprache mit mehrzeiligem Text gefüllt werden kann (wie ein kleines, mehrzeiliges Textdisplay).
Dazu dient (im Script-Programm) das print-Kommando; je nach Ausgabe-Modus. Details zum 'Text-Panel' finden Sie hier.


\s(<condition>)?"<string1>":"<string2>"
Zeigt einen der beiden String-Alternativen in Abhängigkeit von "condition" (z.B. Wertevergleich) an. Folgen Sie dem Link für weitere Informationen.

\script.<Funktionsname>(<Argumenten-Liste>)           (nur für Geräte mit Script-Sprache)
Aufruf einer Script-Funktion, die als Return-Wert eine Zeichenkette liefern muss. Der Return-Wert (String) wird anstelle dieser Backslash-Sequenz eingefügt.
Folgen Sie dem obigen Link für weitere Informationen !

\table( <key=value> )  Anzeige einer Tabelle.
Definiert eine rechteckige Tabelle, die per Script-Sprache mit Daten gefüllt werden kann.
Details zum Anzeige-Element "Tabelle" finden Sie in einem separaten Dokument.

\vvv
Platzhalter für den Namen einer VARIABLEN. Das Backslash-Zeichen wird als Teil des Platzhalters angesehen, daher zeigt "\vvv" die ersten vier(!) Buchstaben des Variablennamens an. Namensvorsätze wie z.B. "script." werden bei der Anzeige übersprungen.

\uuu
Platzhalter für die Einheit (UNIT) einer Variablen. Der Backslash ist Teil des Platzhalters, daher zeigt "\uuu" die ersten vier(!) Buchstaben der Einheit an. Ist die Einheit kürzer als der Platzhalter, wird mit Leerzeichen aufgefüllt.

\U+<hexadezimaler Unicode>
Zeichnet ein einzelnes Unicode-Zeichen, welches durch seinen hexadezimalen Code ("Unicode") definiert wird.
Beispiel (in einen Format-String für den Display-Interpreter): "\U+1F50D Zoom in" .
Der Wert endet beim ersten nicht als Hex-Ziffer auswertbarem Zeichen (i.A. einem Leerzeichen wie im gezeigten Beispiel). Das Beispiel zeichnet ein "nach links zeigendes Vergrößerungsglas", wenn der entsprechende "Codepoint" (U+1F50D = LEFT-POINTING MAGNIFYING GLASS) im aktuellen Zeichensatz enthalten ist).
Eine Übersicht der verfügbaren Unicode-'Sonderzeichen' (und in welchem Zeichensatz diese implementiert sind) finden Sie hier. Zum Zeitpunkt der Erstellung dieser Beschreibung (2018-12-06) waren die meisten Unicode-"Sonderzeichen" (mit Codes über 0x00FF) nur im Zeichensatz 'Hershey Simplex' vorhanden.

\x <hexadezimal codierte Sonderzeichen> (seit Oktober 2009)
Mit Backslash-x beginnt eine hexadezimale Sequenz, ähnlich wie in der Programmiersprache "C". Alle nach Backslash-x folgendenen Zeichen werden als zweiziffige hexadezimale Codes aufgefaßt. Für jeden Code wird dann das entsprechende Zeichen aus dem aktuellen Zeichensatz ausgegeben. Details hier.

\zN
Stellt den Skalierungsfaktor für die Anzeige von Zeichen ein ("Zoom", "Vergrößerung"). Nur verfügbar bei Terminals mit 16-Bit-CPU (also nicht für UPT515). "\z0" stellt wieder den per Programmiertool für die aktuelle Zeile programmierten Wert ein. Um den horizontalen und vertikalen Vergrößerungsfaktor voneinander unabhängig einzustellen, verwenden Sie zwei Ziffern wie in diesem Beispiel:
\z14 Hoch aber schmal \z0 Wieder normal

Einige Beispiele für Format-Strings:

Voltage= *****.** V

Icons: \iF_ok,kd0 \iF_no \iF_stop

Invertiertes Icon, abhängig vom Wert einer Variablen: \iF_stop,(v)

DrawModes: \m0 Normal \m5 Invers \m8 Blink

\s(<condition>)?"<string1>":"<string2>"   Substrings in Abhängigkeit einer Bedingung

Zeigt einen der beiden String-Alternativen in Abhängigkeit von "condition" (z.B. Wertevergleich) an. <String1> wird angezeigt, wenn <condition> einen Wert ungleich 0 (bzw. TRUE nach Vergleich) ergibt, andernfalls <string2> (als 'else'-Zweig).
Der Vergleich sollte die Funktion 'v' verwenden, um auf den Wert der in der aktuellen Anzeigezeile dargestellten Variablen zuzugreifen.
Die Vergleiche können auch verschachtelt werden. Beispiele:

\s(v<15)?"zu kalt":(v>25)?"zu warm":"Temp ok"
Ist 'v' (Wert der Variablen) kleiner als 15, wird 'zu kalt' angezeigt.
Ist 'v' größer als 25, wird 'zu warm' angezeigt.
Andernfalls wird 'Temp ok' angezeigt.

\s(v)1"Mon":2"Tue":3"Wed":4"Thu":5"Fri":6"Sat":7"Sun":"err"
In diesem Beispiel wird <v> nacheinander mit 1, 2, 3,..7 verglichen, bis der passende Wert gefunden wurde.
Wird nichts gefunden, wird in diesem Beispiel der String "err" angezeigt.
Das Fragezeichen (als nachgestellter "if"-Operator) darf hier ausnahmsweise entfallen.

\s(v)0"Null":1"Eins":2"Zwei":"****"
Die Werte 0, 1, 2 werden als Klartext angezeigt,
alle anderen Werte numerisch (dezimal, integer, vier Ziffern).

Tipp: Reichen die Möglichkeiten der Backslash-Sequenz "\s" für eine gegebene Anwendung nicht aus, bietet sich als Alternative der Aufruf einer selbstdefinierten Script-Funktion. Beispiel aus 'Backslash_s_Test.cvt':
func OneTwoThree( int n )
   select n
      case 0 : return "Null";
      case 1 : return "Eins";
      case 2 : return "Zwei";
      case 3 : return "Drei";
      else   : return itoa( n, 4 );
   endselect;
endfunc;
In der Definitionsspalte 'Variable / Formel' würde dann statt der Variablen (z.B. 'X') der folgende Ausdruck zum Aufruf der oben gezeigten Script-Funktion eingetragen:
   script.OneTwoThree( X )
Die von der Funktion 'OneTwoThree' zurückgelieferte Zeichenkette wird dann wie eine normale String-Variable zur Anzeige gebracht, d.h. jeder Buchstabe ersetzt ein Sternchen im Format-String.

\x hexadezimal codierte Sonderzeichen

Mit Backslash-x beginnt eine hexadezimale Sequenz, ähnlich wie in der Programmiersprache "C". Alle nach Backslash-x folgendenen Zeichen werden als zweiziffige hexadezimale Codes aufgefaßt. Für jeden Code wird dann das entsprechende Zeichen aus dem aktuellen Zeichensatz ausgegeben.
Diese Funktion eignet sich besonders um Sonderzeichen anzuzeigen, für die es auf mitteleuropäischen PC-Tastaturen keine Eingabemöglichkeit gibt. Das hexadezimale Zahlensystem macht dies besonders einfach:
Wird der Zeichensatz mit seinen maximal 256 Zeichen in einer Tabelle mit 16 * 16 Feldern angezeigt (oder besser auf Papier ausgedruckt), und...

  • die Spalten dieser Tabelle mit 0..9,a..f beschriftet,
  • die Zeilen der Tabelle mit 0..9,A..F beschriftet,

...dann steht die erste (höherwertige) Ziffer des hexadezimalen Codes für die Tabellenzeile (0..9,A..F); und die zweite (niederwertige) Ziffer für die Tabellenspalte (0..9,a..f). So lassen sich die Codes direkt ablesen.
Für das Terminal spielt es keine Rolle, ob in hexadezimalen Zahlen A..F oder a..f verwendet wird. Wir verwenden hier A..F für die höherwertige Ziffer, und a..7 für die niederwertige Ziffer lediglich um die Lesbarkeit von längeren Hexadezimal-Sequenzen zu verbessern.
Im Gegensatz zu "C" könne die Hex-Sequenzen hier beliebig lang sein. Eine Hex-Sequenz endet mit dem ersten Zeichen, welches keine gültige HEX-Ziffer darstellt (zum Beispiel mit einem Leerzeichen).
Im folgenden Beispiel wird daher 'Hello ' angezeigt, wenn ein normaler (westlicher, alphanumerischer) Zeichensatz für die Ausgabe verwendet wird:
'\x48656c6c6f ' . Um eine Sequenz mit hexadezimal codierten Sonderzeichen in eine Anzeigezeile einzufügen, klicken Sie auf den Mehr-Button im Register Eigenschaften einer Anzeigezeile, und wählen Font Table im dann erscheinenden Dialogfenster:


(klicken Sie in die Zeichenmatrix um Sonderzeichen an die backslash-x-Sequenz anzuhängen)


Hexadezimale Werte über 0x00FF (= dezimal 255) werden bei der Ausgabe vom LCD-Treiber als UNICODE interpretiert. Es stehen bislang aber nur wenige Glyphen wirklich zur Verfügung (und bis dato nur im Zeichensatz 'Hershey Simplex'): Zum Einbetten dieser Zeichen in eine Zeichenkette (für den Display-Interpreter) verwenden Sie die Backslash-Sequenz \U+ ("Unicode"), gefolgt vom hexadezimalen Code ohne Prefix '0x'.

           U+0203C = Unicode Character 'DOUBLE EXCLAMATION MARK'
           U+02190 = Unicode Character 'LEFTWARDS ARROW'  
           U+02191 = Unicode Character 'UPWARDS ARROW'  
           U+02192 = Unicode Character 'RIGHTWARDS ARROW'
           U+02193 = Unicode Character 'DOWNARDS ARROW'
           U+02194 = Unicode Character 'LEFT RIGHT ARROW'
           U+02195 = Unicode Character 'UP DOWN ARROW'  
           U+025AD = Unicode Character 'WHITE RECTANGLE'
           U+025B3 = Unicode Character 'WHITE UP-POINTING TRIANGLE'
           U+025B7 = Unicode Character 'WHITE RIGHT-POINTING TRIANGLE'
           U+025BD = Unicode Character 'WHITE DOWN-POINTING TRIANGLE'
           U+025C1 = Unicode Character 'WHITE LEFT-POINTING TRIANGLE'
           U+02610 = Unicode Character 'BALLOT BOX' (empty "checkbox")
           U+02611 = Unicode Character 'BALLOT BOX WITH CHECK' (checkmarked)
           U+02612 = Unicode Character 'BALLOT BOX WITH X'
           U+1F50D = Unicode Character 'LEFT-POINTING MAGNIFYING GLASS'
           U+1F50E = Unicode Character 'RIGHT-POINTING MAGNIFYING GLASS'
In der Applikation programs/HersheyFont.cvt werden einige der oben aufgeführten Sonderzeichen per \U+xxx zur Anzeige gebracht:

Siehe auch: Unicode per Funktion 'chr()', Benutzerdefinierte Zeichensätze,
        Anzeige von Sonderzeichen in einer Tabelle (per Unicode),
        Beispiel: Buttons mit Häkchen (per Unicode).

HTML-ähnliche 'tags' im Format-String
Geräte mit Firmware ab Oktober 2017 unterstützen HTML-ähnliche 'Tags' im Format-String für die Anzeige. Eine Verschachtelung ist im Gegensatz zu HTML nicht vorgesehen. Bei Erstellung dieser Beschreibung wurden die folgenden Tags unterstützt:
  • <b> fetter Text (bold) </b> (akzeptables Aussehen nur mit Vektor- oder großen Bitmap-Fonts, min. 12*24 Pixel)
  • <i> kursiver Text (italic) </i> (realisiert durch 'schräge Ausgabe', akzeptables Aussehen ebenfalls nur mit großen Zeichen)
  • <u> unterstrichener Text </u>
  • <wN>Text mit einer Linienstärke von N Pixeln</w> (funktioniert nur mit Vektor-Zeichensätzen)
Um die 'spitze Klammer auf' (bzw. das "kleiner-Als"-Zeichen) zu drucken, wird ein einzelner Backslash vorangestellt. Andernfalls könnte die spitze Klammer (bei der Implementierung zukünftiger Tags) fehlgedeutet werden.
Im Gegensatz zu echtem HTML ist der Display-Interpreter nicht 'pingelig', was die Verschachtelung und Kombination der obigen Tags betrifft. Das folgende Beispiel wäre in HTML nicht erlaubt, wird vom Display-Interpreter aber anstandslos akzeptiert:
Dieser Text <b>ist fett, <u>nun auch unterstrichen,</b> nicht mehr fett, </u> nicht mehr unterstrichen.

Muster mit verschiedenen 'fett oder/und kursiv gemachten' Zeichensätzen finden Sie in der Applikation programs/FontDemo.cvt .

Editierfelder (auf programmierten Anzeigeseiten)

Werte von Display- und Script-Variablen können auf dem Display editiert werden, wenn in der Definition des Anzeige-Elements "Schreib/Lese-Zugriff" erlaubt wird. Dieser "Zugriff" bezieht sich auf die mit dem Element verknüpfte Variable.
Das entsprechende Feld wird dadurch per Cursortasten oder Drehknopf selektierbar (ähnlich wie die Option '[v] Menüeintrag' bei Elementen mit Nur-Lese-Zugriff).

Beispiel aus der Applikation programs/EditTest.cvt:

 

Beim MKT-View I (aka "MKT-View Plus") konnten nur ganze Zahlen (Integer-Typen) editiert werden. Beim MKT-View II/III können auch Fliesskommawerte und Zeichenketten (Strings) editiert werden. Aus Kompatibilitätsgründen blieb aber die folgende Besonderheit erhalten:
Beim Editieren von Integer-Variablen kann im Format-String an beliebiger Stelle ein Dezimalpunkt eingefügt werden, um die Zahl auf dem Display wie eine Festkommazahl (fixed point) mit Nachkommaziffern aussehen zu lassen.
Beispiel:
Ein Temperaturwert zwischen -20.0°C ... +70.0°C , der intern als -200 ... 700 in einer Integer-Variablen abgelegt wird, würde mit dem Format-String "+**.*" auf dem Display wie eine Zahl mit einer Nachkommastelle aussehen, obwohl intern nur Ganzzahlen verwendet werden. Wenn sich das Feld im Editiermodus befindet, kann der Bediener nur die drei Ziffernstellen anwählen, aber nicht den Dezimalpunkt selbst.

Hinweise zu Editierfeldern:

  • Die editierte Variable muss Lese- und Schreibzugriff haben; sowohl in der Variablen-Definitions-Tabelle als auch in der Anzeige-Definition.
  • Beim alten MKT-View (1,"Plus") musste die Variable ein Integer-Typ sein, denn das Editieren von "echten" Fliesskommazahlen war mit diesem Gerät nicht möglich.
    Bei MKT-View II, III, IV, und ähnlichen Geräten mit 32-Bit-CPU entfällt diese lästige Einschränkung.
  • Variablen, die mit (aus Sicht des Terminals) "empfangenen" CAN-Signalen verbunden sind, sind nicht editierbar.
  • Um eine Feld in den Editiermodus zu schalten, und um eins von (möglicherweise) mehreren Feldern auf einer Anzeigeseite zu wählen, verwenden Sie -je nach Terminal- die Cursortasten Hoch/Runter bzw. den Drehknopf.
  • Für spezielle Anwendungen können Sie per Interpreterfunktion "mm" abfragen, ob sich ein Feld auf der aktuellen Seite im Zustand "selektiert" oder "editiert" befindet.
  • Wenn ein Editierfeld nicht mit einer Display-Variablen, sondern z.B. mit einer globalen Script-Variablen verbunden ist, dann sind dem Display-Interpreter keine Grenzwerte für das Inkrementieren oder Dekrementieren per Cursor bzw. Drehknopf bekannt. Um beim 'Beginn des Editierens' trotzdem eigene Min- und Max-Werte zu setzen, definieren Sie im Script einen Control-Event-Handler (OnControlEvent), der für das vom Editierfeld gesendete Ereignis "Beginn des Editierens" (evBeginEdit) die situationsabhängigen Grenzwerte in der Systemvariablen display.EditValueMin bzw display.EditValueMax einträgt. Mit dem Ereignis evEndEdit kann das Script z.B. den geänderten Wert auf Plausibilität prüfen und dann übernehmen.
    Dies mag auf den ersten Blick umständlich erscheinen, ist aber sehr flexibel, denn der editierbare Wertebereich kann so zur Laufzeit angepasst werden.


Buttons

Buttons sind graphische Schaltflächen, die bei Betätigung eine frei programmierbare Funktion auslösen.

Als Betätigung eines Buttons zählen:

  • Drücken des dem Button zugeordneten 'Hotkeys'
  • Selektion des Buttons per Cursortasten (oder Drehknopf), mit Anwahl der Enter-Taste
  • Anwahl des Buttons per Touchscreen (optional, nur bei geeigneter Hardware)

Je nach Display-Hardware (TFT, Monochrom, ..) können Buttons verschiedene Farben und Stile zugewiesen werden. Bei TFT-Displays mit mindestens 255 Farben sind auch transparente (oder komplett unsichtbare) Buttons realisierbar, die z.B. als aktive Schaltfläche für den Touchscreen über eine Hintergrundgrafik gelegt werden können.

Details zu den programmierbaren Buttons finden Sie hier .

Tabellen (graphische Anzeige- und Bedienelemente)

Tabellen können -ähnlich wie Buttons- auch als touchscreen-gesteuerte Bedienelemente verwendet werden.
Mit der Backslash-Sequenz "\table" kann eine Tabelle für die Anzeige definiert.
Da eine detailierte Beschreibung den Rahmen dieses Dokumentes sprengen würde, finden Sie die Beschreibung des Anzeige-Elements 'Tabelle' in einem separaten Dokument (table_04.htm).
Das Anzeige-Element 'Tabelle' wird i.A. von Geräten mit 32-Bit-CPU, Touchscreen, und mindestens 480*272-Pixel-Display unterstützt.

Icons (Bitmap-Grafiken als programmierbares Anzeige-Element)

Icons können als einfache graphische Anzeige-Elemente auf den programmierbaren Anzeigeseiten eingefügt werden. Wählen Sie dazu auf der Registerkarte 'Seite #1' (page #x) unter 'Anzeigezeilen-Definitionen' den Button 'Neu...' (links unten). Alernativ können Icons auch mit dem graphischen Editor eingefügt werden.

Intern (in der Seitendefinition) ist ein Icon lediglich eine Backslash-Sequenz im Format-String. Die generelle Syntax ist:

   \i<Icon-Name>

Beispiel (automatisch vom Programmiertool erzeugte Backslash-Sequenz):

   \i"Earth2"

Darin ist "Earth2" der Name einer Grafik, die an einer festen Position angezeigt (wie bei allen anderen graphischen Elementen ist die Position ein Teil der Eigenschaften einer Anzeigezeile ).
Normalerweise müssen alle Icons vor der Verwendung aus geeigneten Bitmap-Dateien importiert werden (Ausnahme: s.U. unter "Hinweise").


(screenshot of the 'icon import' tab)

Innerhalb einer Anzeigezeile können notfalls auch mehrere Icons eingefügt werden. Dazu müssen die entsprechenden Backslash-Sequenzen allerdings manuell eingegenem werden. Die Icons verhalten sich bei der Ausgabe wie normale Buchstaben (Fließtext).

Die Grafik kann innerhalb einer Icon-Definition in Abhängigkeit einer Variablen oder eines numerischen Ausdrucks  umgeschaltet werden, oder (bei monochromen Bitmaps) in Abhängigkeit eines Ausdrucks invertiert werden (d.h. Vorder- und Hintergrundfarbe vertauscht). Beispiel :

(screenshot of the 'proprties' of a display line with an icon)

(Screenshot des 'Property'-Panels einer komplexeren Icon-Definition)

Hinweise zu den Icons :

  • Wenn der Icon-Name in der Sequenz "\i<Icon-Name>" unbekannt ist (weil das Icon nicht auf der the Icon Page definiert wurde, oder wegen Inkompatibilität nicht angezeigt werden kann), wird die gesamte Backslash-Sequenz wie normaler Text angezeigt. Ausnahme:
    Siehe direkt vom Speichermedium ladbare Icons.
  • Sie sollten die Option "diese Zeile immer neu zeichnen" ("always redraw this line") auf dem Display-Zeilen-Property-Panel aktivieren, wenn Sie "invertierbare" Icons in einer Display-Zeile anzeigen.
    Grund: Der Interpreter bekommt möglicherweile nicht mit, dass sich das "Invers-Flag" in der Icon-Sequenz geändert hat, weil das Invertierungs-Flag nur ausgewertet wird wenn die Zeile neu gezeichnet wird.
    Um den Wert aus der Definitionsspalte "Var/expr" zur Steuerung der Invertierung auszuwerten, verwenden Sie die "v"-Funktion.
  • Sie sollten die Option "diese Zeile immer neu zeichnen" setzen, wenn Sie die Sequenz "\m<Draw-Mode>" in einem Format-String verwenden und <DrawMode> ein variabler numerischer Ausdruck ist. Grund: Siehe oben, wie beim Invertierung-Flag.

  • Bei Geräten mit 32-Bit-CPU (z.B. MKT-View II / III / IV) kann die Position von Anzeigeelementen auch während der Laufzeit modifiziert werden
    - siehe Beschreibung der Script-Sprache, Funktion display.elem[].x,y .

  • Bei bestimmten Geräten müssen Icons nicht unbedingt mit dem Programmiertool importiert werden. Sie könnnen stattdessem von einem geeigneten Speichermedium, z.B. einem "Flash-Laufwerk", während der Laufzeit aus einer Bitmap-Datei geladen werden. Verfügbar z.B. im "MIL-Terminal" mit Firmware #11356 (dort kann der 8 MByte große "Audio-Flash" als Ablage für Bitmap-Dateien genutzt werden; die benötigten Bitmap-Dateien müssen vorher per File Transfer Utility dorthin geladen werden). Die Firmware lädt Bitmaps nur dann aus Dateien, wenn deren Namen nicht in der Liste der 'importierten' Icons gefunden wurde.
    Ein Beispiel zur Anzeige von Bildern (Bitmaps), die nicht per Programmiertool in die *.cvt / *.upt - Datei importiert wurden, finden Sie in der Applikation ?/programs/MKTview2/BitmapsFromExternalStorage.cvt .
    Seit 2015-03-25 kann dazu in der Icon-Backslash-Sequenz optional der komplette (Pseudo-)Dateipfad angegeben werden, z.B.:
      \i"memory_card/fant1.bmp"
    Durch Angabe des kompletten (Pseudo-)Dateipfades würde die Datei auch dann vom angegebenen Medium geladen, wenn sie einem anderen Medium (z.B. "font_flash") vorhanden wäre.


    Screenshots aus dem Beispiel 'BitmapsFromExternalStorage.cvt'; links mit, rechts ohne die benötigten Bilddateien auf dem Speichermedium.
    Bei fehlenden Dateien wird der Dateiname statt der Grafik angezeigt.
    Dies ist beabsichtigt, und kein Firmware- sondern ein Applikationsfehler (in diesem Fall "absichtlich herbeigeführt").
    Klicken Sie auf eine Grafik um diese zu vergrößern.

    Wenn Sie trotz der obigen Warnhinweise nicht auf die direkte Anzeige von 'Grafiken aus Dateien' verzichten wollen (oder können), achten Sie darauf, auch alle von Ihrer Anwendung verwendeten Bilddateien zusammen mit der *.cvt / *.upt - Datei auszuliefern, bzw diese per File-Transfer-Utility in die passende Flash-Partition zu laden ! Die Grafiken für das oben gezeigte Beispiel sind im Unterverzeichnis 'sim_mc' ("simulated memory card") enthalten.

  • Bei Farbgrafiken, d.h. Bitmaps mit 4 oder 8 Bit/Pixel, kann eine der 16 oder 256 Farben als 'transparente Farbe' definiert werden. Ein Beispiel dazu finden Sie in der Datei arm7_special\transparent_color_bitmap.cvt. Der zweite Farbwert in der Anzeige-Definiton muss dazu auf -2 (minus Zwei = "transparent") gesetzt werden, und im dritten Farbwert die Farbe der Pixel in der Bitmap-Datei, die bei der Anzeige transparent erscheinen sollen. Im Beispiel (mit Wolfsspinne) erscheinen alle weißen Pixel bei der Anzeige im LCD (TFT) transparent. Diese Funktion steht nur bei Geräten mit 32-Bit CPU (z.B. ARM-7) zur Verfügung.

transparent bitmap demo #1       transparent bitmap demo #2
(Screenshots aus dem 'Transparent Bitmap Demo')

Siehe auch (zum Thema 'Grafik') :
            Importieren von Icons aus Dateien,
            Transparente Buttons,
            überlappende Grafik,
            System-Icons (Indikatoren für Logger, Audio-Recorder, USV),
            Boot-Screen (optional beim Einschalten angezeigte Bitmap-Grafik),
           
Canvas-Objekte ("Leinwand" zum Zeichnen von Grafiken per Script während der Laufzeit).



Verwendung von Anzeige-Zeilen als Menü

Display-Zeilen können auch zur Realisierung eines einfachen "Auswahlmenüs" verwendet werden.

Setzen Sie zu diesem Zweck die Option Menüeintrag in den 'Eigenschaften der Anzeigezeile'. Dadurch wird eine normale Anzeige-Zeile in eine Menüzeile verwandelt, die später mit den CURSOR-Tasten angewählt werden kann (bzw per Drehknopf oder per Touchscreen).

Als nächsten Schritt definieren Sie, was Ihre Applikation tun soll wenn der Bediener die ENTER-Taste drückt während die Menüzeile markiert ist. In den meisten Fällen wird dies ein goto-Kommando sein um zu einer anderen Anzeigeseite zu springen.

Beispiel:
g"Menu2" (unter der Annahme daß Ihr Programm eine Seite namens "Menu2" enthält)

Dieses Kommando muß in der Spalte "Var/Expression" einer Anzeige-Seiten-Definition eingetragen werden. Wenn Sie den Namen der "Zielseite" noch nicht kennen, lassen Sie das Feld zunächst leer. Verwenden Sie später (wenn alle Display-Seiten existieren) den Menü-Link-Dialog, auf dem sie bequem alle Menüsprünge definieren können (der "goto"-Befehl wird dann gegebenenfalls automatisch erzeugt).

Sie können –zusätzlich- einen ‚hotkey‘ für diese Art von Menü auf dem "display line property panel" definieren.

Der UPT-Interpreter bietet einige Funktionen um diese Art von Menüs zu steuern:

  • mi : liefert die Zeilennummer (index, 0..n) des aktuell markierten Menüeintrags (oder Eingabefelds)
  • mm: liefert den aktuellen "Menü-Modus". Dies kann einer der folgenden Werte sein:
    0 = Menü ist "Aus", d.h. der Markierungsbalken ist zur Zeit unsichtbar
    1 = Modus "Selektieren", d.h. der Markierungsbalken ist sichtbar, der Bediener kann ihn per Cursor durch alle "Menüzeilen" auf der aktuellen Seite bewegen.
    Andere "Modi" sind nur für numerische Eingabefelder gültig, z.B. 2 = "Es wird grade ein Wert editiert".

Es gibt auch einige "SET"-Prozeduren mit denen die Menüs programmgesteuert beeinflußt werden können. Die "SET"-Prozeduren haben die gleichen Namen wie die entsprechenden "GET"-Funktionen:

  • mi( <new_item> ) ermöglicht das Setzen des "aktuellen" Menü-Item durch das Interpreterprogramm (z.B. per Event),
  • mm( <new_mode> ) ermöglicht das Setzen des "aktuellen" Menu-Modus' durch das Interpreterprogramm.
Ein UPT-Beispielprogramm für diese Menüfunktionen finden Sie in der Datei \programs\NEWMENUS.UPT .

Hinweis: Wenn Sie eine Displayzeile als ein Menü-Item verwenden, können Sie in dieser Zeile keinen numerischen Wert anzeigen !

Balkendiagramme

Alle Geräte mit grafikfähigem Display unterstützen einzelne Balken-Elemente ("Bargraphen"), die mit Hilfe des grafischen Editors auch zu komplexeren 'dynamischen' Diagrammen zusammengesetzt werden können, z.B.:


Anzeigeseite mit Balkendiagrammen als 'Füllstandsanzeige',
mit transparenten Bitmaps im Vordergrund (als Rahmen).

In Geräten mit Touchscreen können Balkendiagramme auch als Steuerelemente (vertikaler oder horizontaler "Schieberegler") verwendet werden. Die detailierte Beschreibung dieses Anzeige-Elements finden Sie in einem separaten Dokument (bargr_49.htm).

Y(t) und X/Y-Diagramme

Y(t)-Diagramme stellen i.A. den zeitlichen Verlauf eines oder mehrerer Signale dar, z.B.:


Beispiel für ein zweikanaliges Y(t)-Diagramm

Die detailierte Beschreibung dieses Anzeige-Elements finden Sie in einem separaten Dokument (diagr_49.htm).
Y(t)- und X/Y-Diagramme werden mittlerweile von allen Geräten mit 32-Bit-CPU und mindestens 480*272-Pixel-Display unterstützt.

Mehrzeilige Text-Panels (dienen als 'Textbildschirm' für die Script-Sprache)

Mit der Backslash-Sequenz "\panel" können Anzeigeelemente definiert werden, in denen per Script-Sprache farbiger Text angezeigt wird (vergleichbar mit einem 'Textfenster', 'Konsolenfenster' oder auch einem kompletten 'Textbildschirm').
Zur Zeit kann ein solches Text-Panel nur per Script-Sprache gefüllt werden. Dazu dient im Script das Kommando 'print'.
Ohne weitere Angaben (in der optionalen Argumentenliste, d.h. im Klammern) hat ein Text-Panel weder einen Rahmen noch Rand.
Die folgenden Optionen können nach dem Schlüsselwort 'panel' in Klammern definiert werden:
bo= <Breite des äußeren Rahmens (Rands) in Pixeln>
Umgibt das Panel mit einem 'äußeren Rahmen' (outer border), der mit der Vordergrundfarbe des Elements gezeichnet wird.
bi= <Breite des inneren Rahmens (Rands) in Pixeln>
Umgibt das Panel mit einem 'inneren Rahmen' (inner border), der mit der Hintergrundfarbe des Elements gezeichnet wird.


Beispiel:     \panel(bo=6,bi=2)
definiert ein Text-Panel mit einem 6 Pixel breiten äußerem, und einem 2 Pixel breitem innerem Rahmen, wodurch sich die für den Text verbleibende Fläche um 8 Pixel an jedem Rand (oben, unten, links, rechts) verringert.


(Screenshot aus dem Script-Beispiel "GPS-Empfänger-Test")

Um ein bereits auf einer Display-Seite eingefügtes Anzeige-Element in ein mehrzeiliges Text-Panel zu verwandeln, setzen Sie den Typ des Elements auf 'Multi-Line Text Panel' (im Programmiertool auf der Registerkarte 'Seite X'):

screenshot of a 'text panel' definition

Da das Script während des Editierens der Display-Applikation gestoppt ist, können Sie zunächst keinen echten Text auf dem Panel sehen. Um das Aussehen des Panels (im Zusammenhang mit dem verwendeten Zeichensatz) zu kontrollieren, füllt das Programmiertool den Textbereich mit "Dummy-Zeichen". Alle Zeichen innerhalb eines Panels verwenden den gleichen Zeichensatz, wie im oben gezeigten Screenshot zu erkennen ist.

Ein Text-Panel kann nicht nur als Anzeige-, sondern auch als Bedienelement verwendet werden. Es kann beispielweise (mit Hilfe der Script-Sprache) auch auf Touchscreen-Ereignisse reagieren. Details und Beispiele zu diesem Thema finden Sie im Handbuch zur Script-Sprache.

Siehe auch : Handbuch zur Script-Sprache (externer Link, funktioniert leider nur im HTML-basierten Hilfesystem, aber nicht im daraus erzeugten PDF),
script: print, script: gotoxy, script: setcolor .

Grafik-Panels (Anzeige von Canvas-Grafiken)

Bei Geräten mit Script-Sprache kann alternativ zum im vorhergehenden Kapitel beschriebenen Text-Panel auch ein Grafik-Panel eingefügt werden. Dazu dient die Backslash-Sequenz "\canvas" (englisch: "Leinwand"), gefolgt vom Namen eines im Script mit dem Typ 'tCanvas' deklarierten Objektes.
Oft werden 'Canvas'-Objekte auch als Hintergrund-Grafik verwendet, z.B. als Hintergrund eines Diagramms. Die Backslash-Sequenz "\canvas" wird dann nicht benötigt.
Im Gegensatz zu importierten Bildern ("Icons") wird die auf einem Grafik-Panel angezeigte Grafik erst während der Laufzeit per Script erzeugt. Ein einfaches Beispiel dazu finden Sie in der Applikation script_demos/Mandelbrot.cvt (erzeugt die auch als "Apfelmännchen" bekannte Fraktal-Grafik).


Beispiel zur Anzeige eines Canvas-Objektes per Backslash-Sequenz.
Das im Script deklarierte tCanvas-Objekt namens "MyCanvas"
erhält durch diese Definition bereits eine Größe von 748 * 400 Pixeln.

Siehe auch: Datentyp tCanvas (in der Script-Sprache),
                    Funktionen zum Zeichnen auf einer 'Canvas' (Leinwand).

Einfügen anderer graphischer Elemente in einer Anzeigeseite

Die Registerkarte "Other Commands" für eine Display-Seiten-Definition ermöglicht das Einfügen von "speziellen" Anzeige-Kommandos, die sich nicht in das "Zeilen-Tabellen-Schema" pressen ließen. Wahlweise können dort auch "alle" zu einer Anzeigeseite gehörenden Zeilen, Kommandos und Event-Definitionen angezeigt werden (wenn die Checkbox "show all types of commands" aktiviert wird). Hintergrund: Pro Anzeigeseite steht nur eine begrenzte Anzahl von Zeilen+Kommandos+Events zu Verfügung.

Bei modernen Geräten (z.B. MKT-View III / IV) werden 'low-level'-Grafik-Befehle (z.B. dm=draw mode, ic=icon, li=line,...) nicht mehr benötigt. Sie existieren nur noch aus Kompatibilitätsgründen für Geräte ohne Script-Sprache.
Verwenden Sie stattdessem die unten aufgeführten 'high-level'-Elemente, oder (wenn Sie für Ihre Applikation wirklich 'selbst zeichnen' wollen oder müssen), zeichnen Sie per Script in das dafür vorgesehene Canvas-Element.
Siehe auch:
    Bargraphen, Bitmaps, Buttons, Diagramme, Polygone, Zeigerinstrumente, Tabellen (als graphische Elements),
    Auffinden der Definiton von grafischen Elementen per LCD-Simulator.


Überlappende und bewegte Grafik

Für einige "Spezialeffekte" können Sie Anzeigeelemente (Text oder Graphik) im Vordergrund vor anderen Elementen anordnen.

Beispiel: Ein recht großes Icon im Hintergrund und eine Textzeile im Vordergrund (vor dem Icon).

Um diesen Effekt zu erzielen, muß zunächst das Icon gezeichnet werden, und erst danach der Text. Die Reihenfolge, in der gezeichnet wird, ist durch die Zeilennummer in der Anzeige-Seiten-Definition (Tabelle) vorgegeben.

Die erste Zeile in der Definitionstabelle (Zeile "0") wird als erste gezeichnet, danach die zweite Zeile und so weiter. Dies ist allerdings nur so, wenn immer die "komplette Seite" gezeichnet wird !

Wenn Sie wie hier "überlappende" Grafik einsetzen, muss eventuell die Option "redraw page completely" im dem Seiten-Definitions-Kopf gesetzt werden, auch wenn dies die UPT-Applikation etwas verlangsamt. Entsprechendes gilt für bewegte Grafik.

Wird ein graphisches Element allerdings komplett durch ein anderes Element überdeckt (wie im unten angeführten Beispiel), so reicht es im Allgemeinen, nur das Flag 'diese Zeile immer komplett neu zeichnen', statt immer den ganzen Bildschirm neu zu zeichnen - wodurch der Seitenaufbau unnötig verlangsamt werden könnte. Beispiel:

transparent bitmap demo #2
(Screenshot aus dem 'Transparent Bitmap Demo',
file arm7_special\transparent_color_bitmap.cvt)

Bei allen überlappenden Grafiken müssen die überlappenden Elemente in der korrekten Reihenfolge gezeichnet werden. Im oben gezeigten Beispiel (mit den "drei Tanks") werden drei Bargraphen (mit denen die Flüssigkeitsstände in den drei Tanks visualisiert werden) gezeichnet bevor die (transparenten) Tanks darübergelegt werden. Die drei Tanks sind drei identische Bitmaps ("tank1.bmp"); sie müssen mit der bereits erwähnten Option 'diese Zeile immer komplett neu zeichnen' versehen werden (andernfalls würde, bei einer Änderung des Füllstandes, zwar der Bargraph aber nicht der den Bargraphen z.T. überdeckende Tank mit Skala neu gezeichnet).

Um die Reihenfolge des Zeichnens der Anzeigeelemente zu ändern, bewegen Sie den Mauspfeil in die erste Spalte der Anzeigezeilen-Definitions-Tabelle (mit dem Titel "Nr"), drücken Sie die linke Maustaste, und halten Sie sie gedrückt, während sie die Anzeige-Definitions-Zeile in der Tabelle nach oben oder unten verschieben. Zur Erinnerung: Das oberste Anzeigeelement (in 'Definitionszeile Nummer Null') wird als erstes gezeichnet, das letzte Element in der Definitionstabelle zuletzt.

Siehe auch: Übersicht, Selektieren eines 'überlappten' Elements im LCD-Simulator,
        transparente Bitmaps, transparente Buttons, Grafik per Script im OnPageUpdate-Handler.

Touchscreen-Unterstützung

Ob ein bestimmtes Anzeige-Element per Touchscreen bedienbar sein soll, kann während der Applikationsentwicklung unter 'Eigenschaften einer Anzeigezeile' / 'per Touchscreen bedienbar' eingestellt werden.
Die detailierte Beschreibung der Touchscreen-Unterstützung (inkl. Gestensteuerung) finden Sie in einem separaten Dokument (touchscreen_49.htm).


Mehrsprachige Applikationen (und deren Realisierung)

Um eine Anwendung mehrsprachig zu machen, bieten sich mehrere Möglichkeiten an:
  • Duplizieren der selbstdefinierten Anzeigeseiten, mit sprachabhängigem Prefix oder Suffix für die Sprache im Seitennamen, z.B. "Menu_49" für das Hauptmenü in deutscher Sprache, "Menu_01" in englischer Sprache, u.s.w.
    Nachteil:
    In allen Befehlen zur Seitenumschaltung (z.B. "goto") muss auch der Suffix manuell angepasst werden, z.B.
    g "Menu_49" für den Sprung in's deutsche Hauptmenü,
    g "Menu_01" bei englischer Sprache, usw.

    Vorteil:
    Einfach zu realisieren, und in der Seitenübersicht des Programmiertools werden alle Seiten in allen Sprachen angezeigt.

  • Auslagern aller Zeichenketten in eine String-Tabelle (o.Ä.), und Ersatz durch den Aufruf einer selbstdefinierten Script-Funktion (z.B. script.GetText() im Beispiel 'MultiLanguageTest.cvt' oder TranslatePage() im Beispiel 'i18nDemo.cvt', aus dem die weiter unten gezeigten Screenshots stammen).
    Ein Beispiel zur Realisation einer mehrsprachigen Anwendung mit diesem Prinzip finden Sie in der Beschreibung der Script-Sprache im Beispiel MultiLanguageTest.cvt (man beachte die Implementierung der Funktion GetText() im Script, bei dem einige 'hartcodierte' Texte fest im Script vorhanden sind; andere Zeilen werden dagegen zur Laufzeit per Script aus einer 'Übersetzungsdatei' geladen).
    Um z.B. alle Zeichenketten auf der aktuellen Anzeigeseite per Script in eine andere Sprache zu übersetzen (um die Applikation zu 'internationalisieren'), bietet sich der speziell dafür vorgesehende Event-Handler OnPageLoaded() an.

    Nachteile:
    Für den Einstieg recht aufwändig zu programmieren, und (bei Auslagerung der Zeichenketten für die Internationalisierung in eine Textdatei) nicht einfach zu testen, weil nur anhand der Stringtabelle (im Script oder Übersetzungsdatei) nicht zu erkennen ist, ob der übersetzte Text wirklich in allen Sprachen, auf allen Seiten in die entsprechende Anzeige-Elemente (einfache Textfelder, Buttons, usw) passt.
    Ferner: Das Laden von Zeichenketten aus einer 'Übersetzungsdatei' zur Laufzeit kostet etwas Zeit, funktioniert nur bei Geräten mit freigeschalteter Option 'Erweiterte Script-Funktionen' (beinhaltet Funktionen für den Dateizugriff auf der SD-Karte oder auf Dateien im geräteeigenen Flash-Speicher (Pseudo-Verzeichnis "font_flash" oder "audio_flash").

    Vorteil:
    Die Applikation besteht weiterhin aus wenigen Anzeigeseiten, was bei sehr umfangreichen Seiten die Fehlersuche und den Einbau neuer Funktionen erleichtert (weil die "Logik" für eine bestimmte Seite nur einmal vorhanden ist).
Die im Gerät 'fest eingebauten' Zeichensätze (wie auch die 'ladbaren' Zeichensätze) enthalten bislang weder arabische noch fernöstliche Glyphen. Die -bislang- einzige Möglichkeit, um Texte per Script in solche Sprachen zu übersetzen, ist daher die relativ mühsame Umsetzung der entsprechende Glyphen in kleine monochrome Bitmaps, die dann entsprechend der Schreibrichtung von links nach rechts, oder von rechts nach links per Script 'Bitmap für Bitmap' zusammengesetzt werden. Zu dem Zweck kann das Script z.B. eine Kette von Backslash-Sequenzen mit den Namen von Icons für einzelne Buchstaben, Silben, Wörtern oder ganzen Sätzen zusammensetzen. Von einem Anwender wurde dies bereits erfolgreich für eine arabisch / russisch / englisch / deutsche Benutzeroberfläche praktiziert. Dazu wurden über 2200 einzelne Bitmap-Dateien verwendet, die per File-Transfer-Utility im geräteinternen Flash-Speicher (Pseudo-Verzeichnis "audio_flash") abgelegt wurden, um die Applikation auch ohne Speicherkarte betreiben zu können.


Beispiel einer per Script (in script_demos/i18nDemo.cvt) in mehrere Sprachen übersetzten Anzeigeseite.
In dem bewusst einfach gehaltenen Beispiel ist die 'Übersetzungstabelle' fest im Script eingebaut.
Die Applikation besteht daher nur aus der *.cvt-Datei, und funktioniert ohne externe Abhängigkeiten.



Der "einfache" (graphische) Editor für Anzeigeseiten

Der "einfache" (graphische) Editor wurde erst viele Jahre nach der Erstellung des Programmiertools integriert. Er erleichtert z.B. das Positionieren von Anzeige-Elementen, wird aber von fortgeschrittene Anwender für die Programmieren von komplexeren Elementen, z.B. mit Farbumschaltung per Backslash-Sequenz, eher selten verwendet.

Die Toolbar des graphischen Seiten-Editors

Die Toolbar des "einfachen" Anzeigeseiten-Editors enthält die folgenden Funktionen (Buttons) :

 (Pfeil-Werkzeug) : Verschieben, Selektieren oder Bearbeiten von Elementen der Anzeige.
Solange dieses Tool aktiv ist, kann -bei gedrückter linker Maustaste- das markierte Anzeigeelement verschoben werden.
Ein kurzer, einzelner Klick mit der linken Maustaste selektiert ein Objekt zum Ausschneiden / Kopieren / Einfügen.
Um mehrere Elemente zu markieren, halten Sie die STRG-Taste ("Control-Taste") gedrückt, oder ziehen mit der linken Maustaste einen Selektionsrahmen auf. Details zur Mehrfachauswahl folgen unten.
Per Doppelklick wird ein spezieller Einstelldialog gestartet, in dem das markierte Element bearbeitet werden kann.
Elemente mit frei änderbarer Größe erhalten im selektierten Zustand ein kleines Quadrat in der unteren rechten Ecke. Dieses Quadrat kann mit der Maus erfasst werden (wobei es in oranger statt roter Farbe dargestellt wird), und kann dann zum Ändern der Größe des markierten Elements verschoben werden.
Die obere linke Ecke des Elements bleibt währenddessen fixiert.


Ändern der Größe eines Elements (hier: eines Buttons)
durch Verschieben der unteren rechten Ecke (orange).


 (Text-Werkzeug) : Einfügen einer alphanumerischen Anzeigezeile.
Aktivieren Sie zunächst dieses Tool (durch Klick auf das Symbol in der Toolbar).
Danach kann mit einem einzelnen Klick eine neue Textzeile auf der Anzeige platziert werden.
Nach Einfügen der Textzeile kann diese in einem speziellen Einstelldialog bearbeitet werden.

 (Icon-Werkzeug) : Einfügen eines Icons (Symbol; Bitmap-Grafik).
Mit diesem Tool können Sie kleine Grafiken ("Icons") auf der Seite einfügen.
Hinweis: Die Grafiken müssen vorher auf der Registerkarte "Symbole" (engl. "Icons") importiert werden.
Nach Einfügen der Grafik kann deren Erscheinungsbild ggf. angepasst werden (Farbe, Vergrößerung, unterschiedliche Symbole in Abhängigkeit einer Variablen, etc.) Verwenden Sie dazu das Pfeil-Werkzeug, und einen Doppelklick in die neu eingefügte Grafik.

 (Button-Werkzeug) : Fügt einen neuen Button (graphische Schaltfläche) ein.
Selektieren Sie dieses Tool, und klicken Sie in die Zeichenfläche, um dort einen neuen Button einzufügen.
Danach kann der Button in einem speziellen Einstelldialog konfiguriert werden.

 (Bargraph-Werkzeug) : Fügt ein neues Balkendiagramm ein.
Wenn dieses Tool aktiv ist, wird per Mausklick in die Zeichenfläche dort ein neues Balkendiagramm eingefügt.
Dieses kann danach in einem speziellen Einstelldialog konfiguriert werden.

 (Diagramm-Werkzeug) : Fügt ein Y(t) oder X/Y-Diagramm ein.
Ist dieses Took aktiv, kann per Mausklick ein neues Diagramm eingefügt werden.

 (Weitere Werkzeuge) : Öffnet ein Untermenü, in dem weitere Elemente zum Einfügen ausgewählt werden können.
Dazu zählen z.B. Tabellen und Polygone.

 (Ausschneiden) : Schneidet das selektierte Anzeige-Element aus ("cut").
Selektieren Sie zunächst das Element, welches entfernt werden soll (mit dem Pfeil-Tool),
und klicken danach das Tool zum Ausschneiden an (Schere).
Beim Ausschneiden wird das selektierte Objekt in eine interne Ablage kopiert (s.U.).

 (Kopieren) : Kopiert das selektierte Element in eine interne Ablage ("copy").
Selektieren Sie zunächst das Element, welches in die Ablage kopiert werden soll (mit dem Pfeil-Tool),
und klicken danach auf das Tool zum Kopieren .
Das selektierte Objekt wird in eine interne Ablage kopiert .
Hinweis: diese Ablage ist nicht mit der Windows-Zwischenablage zu verwechseln !

 (Einfügen) : Fügt das Element aus der internen Ablage wieder auf der Anzeige ein ("paste").
Wählen Sie ggf zunächst mit dem Pfeil-Tool das zu überschreibende Element.
Wenn Sie beim Einfügen nichts überschreiben wollen, selektieren Sie vorher nichts (z.B. Klick ins Leere).
Das in der internen Ablage gespeicherte Element wird auf der Zeichenfläche eingefügt, und kann anschließend verschoben werden.
War vor dem Einfügen ein Element markiert, so wird dieses durch das eingefügte Element ersetzt.
War vor dem Einfügen kein Element markiert, so wird das neue Element an der Position eingefügt, die durch den Einfüge-Cursor (roter Punkt) markiert ist.
Der Einfüge-Cursor kann (vor dem Einfügen) durch einen kurzen Mausklick "ins Leere" umgesetzt werden. Beim Einfügen eines Elementes wird der Einfügecursor entsprechend der Größe des eingefügten Objektes weiterbewegt, so daß sich beim erneuten Einfügen keine Überlappung ergibt.


 (Rückgängig, engl. "Undo") : Letzte Aktion(en) rückgängig machen.
Ein Klick auf den 'UNDO'-Button macht die letze Änderung auf der aktuellen Anzeigeseite rückgängig.
In diesem Editor können nacheinander bis zu 20 Aktionen rückgängig gemacht werden, da auf einem entsprechend großen Stapelspeicher abgelegt werden.
Vorsicht: Wenn Sie die aktuelle Anzeigeseite im Editor verlassen, können die einzelnen Änderungen auf der Seite nicht mehr rückgängig gemacht werden !


 (Wiederrufen, engl. "Redo" oder "Un-Undo") : Letzte Unfo-Aktion widerrufen.
Wenn Sie versehentlich zu oft "UNDO" aufgerufen haben (s.O.), können Sie die letzten UNDO-Aktionen durch Anklicken von REDO wiederrufen (d.h. das "Rückgänig-machen wieder rückgängig machen", englisch "un-undo").
Im Anzeigeseiten-Editor können bis zu 20 vorhergehende Undo-Aktionen rückgängig gemacht werden, da auch zum Wiederrufen ein entsprechend großer Speicher zur Verfügung steht.
Vorsicht: Wenn Sie die aktuelle Anzeigeseite im Editor verlassen, kann -ählich wie bei Undo- auch kein REDO für die aktuelle Seite mehr erfolgen !

Das selektierte Objekt wird in der Zeichenfläche mit einem (bzw mehreren) roten Rahmen markiert.
Um mehrere Objekte zu markieren, aktivieren Sie zunächst wie oben beschrieben das 'Pfeil'-Werkzeug. Drücken Sie danach die STRG-Taste (bzw CTRL) und halten sie gedrückt, um per Klick mit der linken Maustaste weitere Objekte zur aktuellen Selektion hinzugefügt werden.
Alternativ können mehrere 'nebeneinander' liegende Objekte wie folgt markiert werden:
Bewegen Sie den Mauszeiger zunächst über einen freien Bereich (in dem kein Objekt steht), links oberhalb der linken oberen Ecke des ersten zu markierenden Objekts. Drücken und halten Sie anschließend die linke Maustaste, während sie die Maus nach rechts unten über den zu markierenden Bereich bewegen. Dadurch wird ein transparentes Rechteck aufgespannt, z.B.:

screenshot Display Page Definitions
(Screenshot aus dem 'graphischen Editor' mit mehreren per Maus selektierten Objekten; linke Maustaste noch gedrückt)

Beim Loslassen der Maustaste verschwindet das aufgespannte Markierungs-Rechteck, alle davon berührten Objekte bleiben aber selektiert (erkennbar an den roten Rahmen).
Um die so markierten Objekt auf dem Bildschirm zu verschieben, greifen Sie eines dieser Objekte mit der linken Maustaste (denn andernfalls, beim Klick außerhalb der Selektion werden alle Objekte de-selektiert), und verschieben die Objekte mit gedrückter Maustaste an die neue Position.
Sind mehrere Objekte selektiert, beziehen sich auch 'Ausschneiden', 'Kopieren' und 'Einfügen' auf diese Objekte. Damit können z.B. ganze Gruppen von Objekten von einer Anzeigeseite auf andere Seiten übernommen werden.

Mit der Combo-Box in der Toolbar des Editors können die Anzeigezeilen selektiert werden (als Alternative zum Selektieren per Maus in der Zeichenfläche). Diese Funktion ist z.B. dann nötig, wenn ein Anzeigeelement komplett verdeckt ist, und daher nicht direkt mit der Maus selektiert werden kann.

Beim Selektieren eines Objektes in der Zeichenfläche (Pfeil-Werkzeug) wird auch der entsprechende Eintrag in der Combo-Liste umgeschaltet. Die Anzeige in der Combo-Liste ist folgendermaßen zu interpretieren:

[Zeilennummer] ELEMENT-TYP : Element-Text

Beispiel:

[5] TEXT : The EA515..

Dies bedeutet:
Das aktuell selektierte Anzeige-Element ist in Zeile Nummer 5 definiert (Array-Index; die Zählung beginnt bei Null);
es handelt sich um eine einfache TEXT-Anzeige (alphanumerisch);
der Anzeigetext beginnt mit der Zeichenkette "The EA515..".

Graphische Elemente können mit dem Anzeige-Editor an einem 8*8-Pixel-Gitter ausgerichtet werden. Um dieses Gitter anzuzeigen, oder Koordinaten automatisch am Gitter auszurichten, wählen Sie im Hauptmenü "Optionen"..."Seiten-Editor". Ist die Option "Koordinaten an 8*8-Pixel-Gitter" aktiv, rasten die Koordinaten beim Verschieben eines Objektes automatisch auf den nächstgelegenen Gitterpunkt ein.

Zur Zeit werden die folgenden Element-Typen vom graphischen Editor unterstützt:

  • TEXT : einfacher Text, mit oder ohne Anzeige einer Variablen (Sternchen als Platzhalter)
  • ICON : kleine Bitmap-Grafik ("Symbol")
  • BUTTON : graphische Schaltfläche (siehe 'btns_49.htm').
  • BARGRAPH : Balkendiagramm
  • DIAGRAM : Y(t) oder X/Y-Diagramm
  • TABLE : Tabelle (Anzeige- oder Bedienelement mit mehreren Spalten und Zeilen)
  • POLYGON: Polygon (Linien, Linienzüge, Rechtecke, vektorisierter Text und andere Formen; punktweise editierbar).

Sonderfunktionen wie z.B. Grafikommandos oder per Script erzeugter Text werden vom hier beschriebenen graphischen Editor nicht unterstützt.

Die Funktionen zum Kopieren / Ausschneiden / Einfügen und zum Ändern der Eigenschaften eines einzelnen Elements können auch (per Klick mit der rechten Maustaste) über das Kontext-Menü des graphischen Editors aufgerufen werden.

Dialog für alphanumerische Anzeigeelemente

Per Doppelklick auf ein alphanumerisches Anzeigeelement wird der folgende Dialog geöffnet:


Darin können (fast) alle Parameter eingestellt werden, die beim tabellarischen Editor auf dem Panel 'Eigenschaften einer Anzeigezeile' stehen.
Im Feld 'Text' können neben normalem Text auch die in Kapitel 1.11 vorgestellten Backslash-Sequenzen, Platzhalter für Ziffern (*,#,0) und Vorzeichen (-), sowie HTML-ähnliche Tags für Fettschrift, Kursivschrift, und Unterstreichung eingegeben werden.

Einfügen und Bearbeiten von Polygonen mit dem graphischen Editor

Polygone können aus Linienzügen, einzelnen Linien, Gittern, Vielecken, vektorisiertem Text und ähnlichen geometrischen Figuren bestehen. Die Anzahl von "Stützpunkten" pro Polygon ist allerdings begrenzt, so daß komplexere Vektorgrafiken notfalls aus mehreren Polygonen zusammengesetzt werden müssen (jeweils in einer eigenen Definitionszeile).
Mit maximal 500 Zeichen pro Definitionszeile, und 6 Zeichen pro 'Koordinate' in Textform sind etwa 80 Punkte pro Polygon möglich.

Nur für Experten und Fortgeschrittene:
Der graphische Editor erstellt aus dem Polygon die Backslash-Sequenz "\li", gefolgt von den Koordinaten aller Eckpunkte.
In der Argumentenliste können auch weitere Grafik-Elemente enthalten sein, z.B. polygon(), polyfill(), usw.
Beispiele für derartige 'Vektorgrafiken' finden Sie am Ende dieses Kapitels.
Wie alle Anzeigeelemente können Polygone auch 'als Text' bearbeitet werden. Markieren Sie dazu das zu beabeitende Polygon im Editor, und wählen im Kontext-Menü (s.U.) den Eintrag 'Eigenschaften' (Properties).
Zum Einfügen eines neuen Polygons wählen Sie zunächst die Funktion 'Weitere Werkzeuge' :

Button in der Toolbar des Editors
zum Einfügen 'weiterer Elemente',
z.B. Tabellen und Polygone.

Weitere Optionen finden Sie
im Kontext-Menü des Editors
(s.U., rechte Maustaste).

Menü des Editors zum Einfügen 'weiterer Elemente', u.A. mit vordefinierten Vektorgrafiken


Wählen Sie im Menü die Funktion 'Linien oder Polygone einfügen', oder wählen im Untermenü 'Vordefinierte Vektorgrafiken' eine geometrische Form oder ein Symbol aus. Für 'vektorisierten Text' geben Sie noch die entsprechende Zeichenkette ein.

Klicken Sie anschließend in der Abbildung der Anzeigeseite auf die linke obere Ecke, an der das neue Polygon eingefügt werden soll.
Passen Sie danach die Zeichenfläche des Polygons an, indem Sie wie oben beschrieben die rechte untere Ecke der rot umrahmten Fläche per Maus ziehen.
Ein neu eingefügtes Polygon besteht aus einem einfachen Rechteck, dessen Eckpunkte am Rand der Zeichenfläche liegen.

Per Doppelklick in die Polygonfläche schaltet der Editor vom Modus "Objekt verschieben oder Größe ändern" in den Modus "einzelne Polygon-Punkte verschieben" um. In diesem Zustand werden alle Punkte des Polygons markiert, und einzelne Punkte können per Maus verschoben werden:



Doppelklick
zum Umschalten

Polygon im grafischen Editor, Modus 'Objekt bewegen / skalieren' (Move/Size)

Polygon im grafischen Editor, Modus 'Punkte verschieben' (Move points)

Da sich dicht beieinander liegende Punkte nur schwer per Maus selektieren lassen, kann im Modus 'Punkte editieren' ein einzelner Punkt auch per Mausrad (oder notfalls per Cursor-Taste) selektiert werden. Der aktuell selektierte Punkt wird grün markiert, und auch in der Statuszeile angezeigt. Z.B. bedeutet die Anzeige

    pt[0]: 1,2

dass momentan der erste Punkt des Polygons selektiert ist (Array-Indizes beginnen bei Null), und sich an der Koordinate x=1, y=2 innerhalb der Polygon-Zeichenfläche befindet.

Eigenschaften wie Linienfarbe, Hintergrundfarbe (bzw. "transparenter Hintergrund" = Dummy-Farbwert "-2") können wie bei normalen Text-Anzeigen mit dem im Kontext-Menü per "Eigenschaften" zu öffnenden Dialog eingestellt werden.

Weitere Funktionen zum 'Nacharbeiten' eines Polygons oder Linienzugs finden Sie im Kontext-Menü (Öffnen per Rechtsklick auf das selektierte Polygon):

Kontext-Menü des Editors mit Optionen zum Editieren eines Polygons


Beispiele für Linien, Linienzüge, offene und geschlossene Polygone
Die im Folgenden aufgeführten Beispiele stammen z.T. aus dem Beispiel programs/line_art.cvt.
Die Zeichenfläche für die folgenden Beispiele sollte mindestens 100 * 100 Pixel umfassen.
Einfache Linie mit Start- und Endpunkt
\li(x1,y1, x2,y2)

Breite Linie (Stärke z.B. 4 Pixel, dies ist der Parameter 'w')
\li(w=4, x1,y1, x2,y2)

Zwei offene Linienzüge (man beachte das Semikolon als Trenner zwischen zwei Koordinaten ohne Verbindungslinie)
\li(8,8, 8,88, 88,88; 16,16, 16,80, 80,80)

Geschlossenes, aber nicht gefülltes Polygon (hier: Dreieck)
\li(polygon(0,99, 50,0, 99,99))

Gefülltes, 'dick umrahmtes' Polygon :
\li(polyfill(w=4, 5,95, 50,5, 95,95))

Gefülltes Polygon ohne Rahmen :
\li(polyfill(5,95; 50,5; 95,95))

    ... wird fortgesetzt ...

Siehe auch: Polygone im Kurvenbereich eines Diagramms, generelle '\li'-Syntax, gedrehter Text aus Vektor-Fonts.
    Zurück zur Übersicht

Einfügen eines Zeigerinstruments (Analog-Instrument)

Seit August 2017 brauchen Analoginstrumente (und ähnliche Zeigerinstrument wie z.B. Tachometer) nicht mehr aus Polygonen und Bitmaps zusammengesetzt werden.
Ein Zeigerinstrument kann wie jedes andere Grafikelement mit dem Editor eingefügt oder bearbeitet werden. Spezifische Parameter werden per Property-Liste ("Eigenschaften") im Programmiertool definiert. Dazu zählen u.A.:

Outer Shape (Äußere Form)
    Rect: Rechteckiges Instrument (z.B. "Voltmeter"), Round: Rundinstrument (z.B. "Tachometer").

Arrow Type, Arrow Colour (Zeigertyp, Zeigerfarbe)
    Erscheinungsbild des Zeigers (Nadel, Pfeil, Kompaß-ähnlich, usw.).

Start- and End angle (Start- und Endwinkel)
    Bereich in dem sich der Zeiger (Nadel, Pfeil, ..) bewegen kann.
    Verwendet das weiter unten gezeigte 'Kompaß'-Winkelsystem.

Scale start value (Wert am Skalenanfang)
    Wert für den unteren Endanschlag. Ein entsprechendes Label wird am 'Anfang' der Skala gezeichnet.

Scale end value (Wert am Skalenende)
    Wert für den oberen Endanschlag. Ein entsprechendes Label wird am 'Ende' der Skala gezeichnet.

Arrow2Value, Arrow3Value
    Numerischer Ausdruck für den Wert, der als zweiter bzw. dritter Zeiger angezeigt werden soll.
    Der Wert für den ersten Zeiger ergibt sich aus dem Feld 'Variable / Formel / Ausdruck',
    welches für jegliche Art von Anzeige-Element im oberen Teil des Definitionsfensters existiert.

Beispiele für Zeigerinstrumente finden Sie u.A. in der Applikation 'Analog meter test' (Datei programs/analog_meter_test.cvt):


Screenshot aus Application 'analog meter test'

Für spezielle Anwendungen kann ein Instrument bis zu drei Indikatoren (Zeiger, Pfeile, ..) enthalten. Wird nur ein einzelner Indikator (Zeiger) benötigt, setzen Sie 'Arrow2Type' und 'Arrow3Type' in der Property-Liste auf 'none' ('keiner').

Der Drehbereich eines Zeigers wird durch Start- und Endwinkel definiert. Winkel werden dabei wie beim Kompass angegeben, d.h. 0° = Nord (oben), +90° = Ost (Zeiger nach rechts). Negative Winkel drehen entgegen des Uhrzeigersinns:


Kompassrichtungen (in Grad)

Beispiele:
  Analoges Voltmeter: StartAngle=-45, EndAngle=45 .
  Rundinstrument (z.B. Tachometer): StartAngle=-135, EndAngle=135 .
  Analoguhr (siehe folgendes Beispiel): StartAngle=0, EndAngle=360 .

Bei Rundinstrumenten befindet sich der Drehpunkt (pivot) immer in der Mitte.
Bei Instrumenten mit rechteckigem Rand wird der Drehpunkt automatisch so platziert, daß die Spitze des Indikators eine möglichst große Kreisbahn überstreichen kann. Die Position des Drehpunktes hängt daher vom Winkelbereich ab. Bei kleinen Winkelbereichen (z.B. "Voltmeter" mit StartAngle=-45, EndAngle=45°) kann der Drehpunkt auch außerhalb des sichtbaren Instrumentes liegen.

Zusätzlich zum Haupt-Zeiger können zwei weitere Indikatoren (Zeiger, Nadeln, Dreiecke) im Instrument angezeigt werden. Die Position der zusätzlichen Indikatoren kann eine numerische Konstante, Variable, oder sogar ein beliebiger Ausdruck ("Formel zur Skalierung") sein.

Zum Einfügen eines Zeigerinstruments klicken Sie mit der rechten Maustaste in das LCD-Simulator-Fenster, und wählen im Kontextmenü 'Insert analog meter' ('Zeigerinstrument einfügen'). Wie bei allen anderen Anzeige-Elementen können die Eigenschaften des Instruments in der rechten Hälfte des Hauptfensters (im Programmiertool) eingestellt werden:


Eigenschaften eines Zeigerinstruments (analog meter)
im Programmiertool (Editor für Anzeigeseiten)


Die rechts gezeigte 'Analoguhr' stammt aus der Beispielapplikation 'programs/analog_clock_480.cvt'. Sie besteht aus einem einzelnen Zeigerinstrument (mit drei Zeigern) mit dem Winkelbereich 0 bis 360°, und Wertebereich 0 bis 12. Stunden-, Minuten- und Sekundenzeiger wurden wie folgt definiert:

ZeigerArrow TypeAusdruck (anzuzeigender Wert)
Sekundenthin_linertc.se * 0.2
Minutenthin_linertc.mi * 0.2
Stundenshort_line(rtc.hr%12) + rtc.mi/60.0

In den oben gezeigten numerischen Ausdrücken dienen die 'rtc'-Funktionen zum Zugriff auf die Echtzeituhr (rtc = real time clock). Durch Multiplikationen mit geeigneten Faktoren werden alle drei Werte in den Bereich 0 bis 12 konvertiert, denn das Zeigerinstrument verwendet für alle Zeiger die gleiche Skalierung für die Umrechnung der "Meßwerte" in Drehwinkel.

Die bei allen Anzeige-Elementen vorhandenen Eigenschaften wie Vorder- und Hintergrundfarbe sind zwar keine 'Eigenschaften eines Zeigerelementes', haben aber beim Zeigerinstrument die folgenden Bedeutungen bzw Besonderheiten:
  • die Vordergrundfarbe (der erste unter 'Eigenschaften einer Anzeigezeile' aufgeführte Farbwert) wird bei Zeigerinstrumenten als Farbe für die Umrahmung, Skalenbögen, Teilstriche, und als Textfarbe für die optionale Beschriftung der Skala verwendet

  • die erste Hintergrundfarbe (der zweite unter 'Eigenschaften einer Anzeigezeile' aufgeführte Farbwert) wird bei Zeigerinstrumenten für den einfarbigen Hintergrund verwendet.
    Bei Geräten mit schneller CPU (bei denen die Option 'Diese Seite immer komplett neu zeichnen' noch eine ausreichende Aktualisierungsrate bietet, z.B. MKT-View V) kann diese Farbe auch auf den Wert -2 = "Transparent" gesetzt werden. Beim Entwurf der Anzeigeseite kann dann z.B. als Hintergrund für das Zeigerinstrument eine Bitmap-Grafik, ein Farbverlauf, oder eine numerische Anzeige (unter dem "Zeiger") verwendet werden. Der Hintergrund muss dazu natürlich vor dem Instrument gezeignet werden, d.h. in der Definitionsliste vor dem Instrument eingefügt werden.

  • die zweite Hintergrundfarbe (der dritte unter 'Eigenschaften einer Anzeigezeile' aufgeführte Farbwert) kann seit 03/2023 bei Zeigerinstrumenten für den Hintergrund der Skala verwendet werden, z.B. um die Teilstriche auf der Skala trotz (in den anderen Bereichen des Instruments) durchscheinendem Hintergrund einen guten Kontrast zu erzielen. Beispiel:


    Zurück zur Inhaltsübersicht


Übersicht Event - Definitionen

Es können "Events" (Ereignisse) definiert werden, die von Ihrer Terminal-Applikation erkannt und in einer bestimmten Art und Weise ("Reaction") bearbeitet werden können.

Hier einige Beispiele für Events:

  • der Bediener drückt eine bestimmte Taste oder läßt sie los
  • ein digitaler Eingang des Terminals (mit "onboard I/O") ändert sich
  • der Wert eine Variablen (die möglicherweise per CAN gelesen wurde) überschreitet einen bestimmten Wert
  • ein Bit einer Variablen nimmt einen bestimmten Wert an
  • einer der programmierbaren Timer läuft ab
  • und viele Kombinationen...

Für jedes Event wird auch eine entsprechende "Reaktions-Methode" programmiert. Dies erfolgt mit einer oder mehreren Interpreter-Kommandos .

Mögliche Reaktionsmethoden sind:

  • Umschalten auf eine andere Displayseite
  • Setzen einer Variablen auf einen bestimmten Wert (der evtl. per CAN gesendet wird)

Zur Definition von Events wird eine relativ einfache Definitions-Sprache verwendet, Sie können Events allerdings auch aus einer Liste mit "vordefinierten" Definitionen auswählen (was einfacher aber auch wesentlich unflexibler ist).

Events können...

  • "global" definiert sein, sie werden dann "immer" abgefragt, unabhängig von der aktuellen Anzeigeseite;
  • "lokal" auf einer bestimmten Anzeigeseite definierte Events werden nur abgefragt, wenn diese Seite grade aktiv ist.

Um Events zu definieren, verwenden Sie das Event-Definitions-Fenster.

 Verwandte Themen:

Das Event-Definitions-Fenster

Um bestimmte Reaktionen beim Eintreten bestimmter Ereignisse zu definieren, kann das folgende Fenster verwendet (welches fast identisch für globale und lokale Events verwendet wird):

Die Buttons unter der Tabelle dienen zum Bearbeiten der Tabelle. INSERT, DELETE, COPY und PASTE beziehen sich auf einzelne Tabellenzeilen.Der "Apply"-Button sollte angeklickt werden, um den Inhalt der Tabelle zu übernehmen.

Das Panel auf der rechten Seite zeigt detailierte Informationen zur aktuellen (in der Tabelle markierten) Event-Definition an.

Sie können die Eigenschaften einer Definitionszeile wahlweise in der Tabelle oder auf dem Panel (rechts) editieren, die Änderungen werden jeweils übernommen.
Ein einzelner Breakpoint (Haltepunkt) kann durch Anhaken von 'Breakpoint auf dieses Event setzen' aktiviert werden. Dieser Breakpoint löst dann (im Simulatorbetrieb) aus, wenn die Bedingung den Wert TRUE annimmt, und zwar vor dem Ausführen der entsprechenden Reaktion.
Um nach dem Auslösen eines Code- oder Data-Breakpoints die Abarbeitung der Ereignis-Definitionen im Einzelschrittbetrieb fortzusetzen, drücken Sie für jeden Schritt die Funktionstaste F11 auf der PC-Tastatur.

Die Buttons "E. hinzufügen" (Ereignis hinzufügen) und "R. hinzufügen" (Reaktion hinzufügen) öffnen spezielle Dialogfenster, mit denen Event-Abfragen und Event-Reaktionen aus Listen ausgewählt und zusammengestellt werden können (hilfreich wenn Sie noch nicht mit der Event-Definitionssprache vertraut sind).

Während eines Simulatorlaufs zeigt die Hintergrundfarbe von Zellen in der Event-Definitions-Tabelle an, welche Ereignisse grade aktiv (d.h. Bedingungen erfüllt) sind, und welche Reaktionenen im letzten Zyklus abgearbeitet wurden - ähnlich wie im CAN-Simulator:

  • Hellgrüner Hintergrund :
    Die Bedingung in dieser Zeile war bei der letzten Auswertung erfüllt, und die entsprechende Reaktion wurde fehlerfrei abgearbeitet.
  • Gelber Hintergrund :
    Markiert die nächste im Single-Step-Betrieb (z.B. nach Stopp per Breakpoint) abzuarbeitende Zeile.
  • Hellroter Hintergrund :
    Beim Auswertungen der Bedingung (Event), oder beim Abarbeiten der Reaktion (Kommandozeile) trat ein Fehler auf.

Die Event-Definitions-Sprache

Ein "Event" ist das Eintreten eines bestimmten Zustands oder "Ereignisses", welches Sie in Ihrer Terminal-Applikation abfragen wollen. Solche Events können Sie direkt in der Event-Definitions-Sprache des Terminals formulieren. Die Event-Abfrage wird prinzipiell als numerischer Ausdruck vom Interpreter abgearbeitet.
Hinweis:
Das Programmiertool könnte einige dieser Definitionen in leichter lesbarer Form anzeigen, z.B. page_enter statt "pe".
Bei komplexeren Anwendungen empfiehlt sich der Einsatz der Script-Sprache als Alternative,
z.B. Low-Level-Event-Handler wie "OnKeyDown", "OnKeyUp", "OnPenDown", "OnPenUp", "OnGesture", etc.

Einige einfache Beispiele für Event-Abfragen ohne Script:
Event-Type /
expression
Parameter
(falls nötig)
Beschreibung
kd key-name Bediener hat eine Funktionstaste gedrückt
ku key-name Bediener hat eine Taste losgelassen
kb key-name Prüft ob eine bestimmte Taste gedrückt wurde. Die Taste wird  durch die Abfrage aus dem Puffer entfernt !
kh   Irgendeine Taste wurde gedrückt (auch "Systemtasten" und "Cursor")
kc   Liest einen Tastencode  (egal welchen) und entfernt ihn aus dem Tastaturpuffer
kcb
Liest den Code der zuletzt gedrückten Taste ohne diese aus dem Puffer zu entfernen
     
cb   CAN-Error: Bus Off .
Siehe auch: cs (CAN Status)
ce, alias ce0   schwerwiegender CAN-Fehler auf dem ersten CAN-Port
ce1   schwerwiegender CAN-Fehler auf dem zweiten CAN-Port
cw   CAN-Warnung
ch   CAN-Hardware-Fehler
co   CAN-Fehler: Überlauf (overflow)
ct   CAN-Fehler beim Senden (transmit)
     
else   Liefert TRUE, wenn die vorhergehende Event-Bedingung nicht erfüllt war.
Nur in Firmware ab Compilationsdatum 2012-10-15 verfügbar ! Beispiel
     
t0 ... t3   User-Timer ( Nr. 0...3) abgelaufen
ti_ms>1500   Seit dem Einschalten sind über 1500 Millisekunden vergangen
     
pe
    alias
page_enter
  Die aktuelle Seite wurde grade neu aufgerufen (Page Enter)
pq
    alias
page_quit
  Die aktuelle Seite wird gleich verlassen (Page Quit).
Wie bei allen 'Page'-Events wird auch dieses Ereignis natürlich nur auf der grade aktuellen, d.h. in den Speicher geladenen, Anzeigeseite auftreten bzw "verarbeitet werden" !
Um eine universelle Reaktionsmethode für das "Betreten" oder "Verlassen" irgendeiner Anzeigeseite (unabhängig von der Nummer der aktuellen Anzeigeseite) zu implementieren, empfiehlt sich der Einsatz der Script-Sprache ("OnPageLoaded").
pr
    alias
page_redraw

Page Redraw. Die aktuelle Seite wird grade komplett neu gezeichnet, z.B. nach "cls" (clear screen), oder wenn display.redraw per Script gesetzt wurde.
pdo[N].rcv  N = PDO-Kanalnr Ein PDO-Telegram wurde empfangen (received)
rot.l, rot.b, ... Drehknopf (rotary encoder) wurde gedreht .
syn.rcv   Ein SYNC-Telegram wurde empfangen .
     

 

Der im Terminal eingebaute Interpreter wertet Ereignisdefinitionen als booleschen Ausdruck aus, d.h. entscheident ist, ob das Ergebnis des numerischen Ausdrucks von Null verschieden (="TRUE") oder genau Null (="FALSE") ist.

Wenn das Ergebnis einer Event-Abfrage von Null verschieden ist, arbeitet der Interpreter die programmierbare Reaktionsmethode ab. Dies ist (intern) eine Kette von Interpreterkommandos., die einzelnen Kommandos müssen ggf. durch Doppelpunkt getrennt werden.

Beispiel: Ändern der Hintergrundfarbe eines Anzeigeelementes (aus 'Auslieferungstest.cvt'):

   Ereignis                          Reaktion
   (sys.vsup<120)||(sys.vsup>260)    dis.VSup.bc = (ti&8)?7:4 : REM flashing supply-voltage warning
   else                              dis.VSup.bc = white      : REM no voltage warning
      
      

Siehe auch: Überblick der numerischen Funktionen des Interpreters.


Globale und Lokale Events

Sie können globale Events definieren, die unabhängig von der aktuellen Anzeigeseite abgefragt (und bearbeitet) werden.

Zum Beispiel könnten Sie eine bestimmte Anzeigeseite aufrufen (per "call"), wenn ein schwerwiegender CAN-Fehler auftritt. Dies ließe sich folgendermaßen realisieren:
Event-Abfrage: ce (bedeutet: "wenn ein CAN-BUS(!)-Fehler auftritt"...)
Reaktion: c"CanError" (bedeutet: ... rufe die Seite namens "CanError" auf, mit möglicher Rückkehr zur aktuellen Seite)

Definieren Sie dieses Event (mit Reaktion) auf der Registerkarte "Global Events", dies erspart es Ihnen, die Abfrage auf jeder einzelne Anzeigeseite zu programmieren (beachten Sie, die Anzahl von Definitionszeilen pro Anzeigeseite ist begrenzt !).

Regeln für die Verwendung globaler Event-Definitionen:

  • Verwenden Sie globale Events nur für Ereignisse, die Sie andernfalls auf jeder Anzeigeseite programmieren müssten.
  • Verwenden Sie nach Möglichkeit keine Display-Ausgabe-Kommandos in den global Events, denn diese könnten sich auf einigen der von Ihnen programmierten Anzeigeseiten störend auswirken.
  • Wenn Sie ein bestimmtes Ereignis (wie z.B. "ce" im obigen Beispiel) als globales Event definiert haben, wiederholen Sie dies nicht als "lokales Even" auf einer Anzeigeseite. Eine Event-Abfrage zweimal zu definieren (einmal global und einmal lokal) stört zwar den Event-Handler in der Firmware nicht; Sie werden allerdings schnell die Übersicht verlieren und nie genau wissen, auf welcher Seite die Event-Abfrage denn nun "zugeschlagen" hat..
  • Wenn vom Gerät unterstützt (z.B. MKT-View II, III, IV), verwenden Sie als 'leistungsfähigere Alternative' die in der Script-Sprache definierbaren Event- und Message-Handler.

 

Lokale Events gehören immer zu einer ganz bestimmten Anzeigeseite. Sie werden nur ausgewertet, wenn diese Seite grade sichtbar ist. In den meisten Anwendungen werden "lokale" Event wohl Tastaturereignisse abfragen und gegebenenfalls zu einer anderen Anzeigeseite umschalten.

Einfache GLOBALE Event-Definitionen können auch aus einem Katalog (in Form eines speziellen Dialogfensters) ausgewählt werden.

Zurück zur Beschreibung des Event-Definitions-Fensters


Assistenten und dialog-basierte Hilfen


Assistent zum Erstellen einfacher Anwendungen

Der folgende Dialog kann aus dem Hauptmenü per 'Neues Programm, einfach' oder 'Neues Programm, universell' aufgerufen werden. Der Assistent führt Sie durch die wichtigsten Schritte, um ein komplett neues Anzeigeprogramm zu erstellen. In vielen Fällen wird aber auf bereits existierende Applikationen zurückgegriffen.


Zunächst wird das Hard- und Softwareprofile des Zielsystems ausgewählt:


(Screenshot 'Hard- und Softwareprofil des Zielsystems wählen')

Technischer Hintergrund:
Für viele Geräte, z.B. MKT-View II, gibt es ein Hardwareprofil, in dem u.A. die Bildschirmauflösung und das Farbmodell enthalten ist. Zusätzlich existieren z.T. mehrere Softwareprofile, z.B. für Geräte mit verschiedenen CANopen-Protokoll-Versionen (UPTv1=DS301 V3, UPTv2=DS301 V4).
Bei allen Geräten ohne CANopen-Firmware (die stattdessem durch Import von DBC-Dateien parametriert werden) ist als Software-Profil grundsätzlich 'CVTv1' anzuwählen (CAN-View-Terminals, z.B. MKT-View II mit Firmware #11314).
Das Programmiertool könnte daraufhin vorschlagen, ein anderes Tool zu verwenden; denn das Programmiertool für Geräte mit 'CANdb' unterstützt kein CANopen, und kann daher die von Ihnen erstellte Display-Applikation nicht per CAN-Bus in das angeschlossene Gerät laden.

Im nächsten Schritt wird der Assistent nach der Anzahl zu erstellender Display-Seiten fragen:


(Screenshot 'Neue Anzeigeseiten erstellen')

Anschliessend können(!) Anzeigeseiten aus der Galerie, oder aus bereits existierenden Display-Applikationen (*.upt, *.cvt) übernommen werden:


(Screenshot 'Anzeigeseiten aus Galerie laden ?')

Abhängig vom Aufruf des Assistenten können Sie anschließend auswählen, wie z.B. die Umschaltung der Anzeigeseiten realisiert werden soll:

Dialog zur Auswahl von Variablen auf einer Anzeigeseite

Dieser Dialog dient zur Auwahl von VARIABLEN, die auf einer bestimmten ANZEIGESEITE angezeigt werden sollen.

Zum Öffnen des Dialogs klicken Sie z.B. auf der Registerkarte "Anzeigezeilen-Definition" auf den Button "Mehr.."


(Screenshot "Schaltflächen auf Registerkarte Anzeigezeilen-Definitionen")

Im nun erscheinenden Popup-Menü wählen Sie den Eintrag "Variablen- / Signal-Zuordnungen prüfen und ändern".


(Screenshot von Popup "Displayzeilen")

Im danach angezeigten Dialogfenster mit dem Titel "Variablen oder Signale für Seite XYZ auswählen" können Sie bereits vorhandene Variablen für die Anzeige auswählen, oder aus CAN-Signalen neue Variablen erstellen die dann angezeigt werden können. Diese Funktion werden Sie noch häufig einsetzen, wenn Sie fertige Programme für andere Anwendungen modifizieren !
(Hinweis: Es gibt noch andere Situationen, in denen dieser Dialog erscheint, z.B. per Assistent).


(screenshot "Select VARIABLES or SIGNALS on page XYZ"
bzw "VARIABLEN oder SIGNALE auf Seite XYZ ersetzen" )

Die Tabelle auf der linken Seite zeigt alle Zeilen, in denen numerische Anzeigen, Editierfelder oder Grafiken stehen, die mit Variablen in Verbindung stehen.

Das Panel auf der rechten Seite zeigt wahlweise eine Liste aller vorhandenen Variablen oder alle CANdb-Knoten, -Messages und -Signale (die vorher aus einem CANdb-File geladen wurden). Bei Geräten mit CANopen wird dort statt der Registerkarte Signale eine Liste aller CANopen-Variablen (im lokalen Objektverzeichnis des Terminals) angezeigt. Weitere Details zum Thema 'Anzeige von CANopen-Objekten' in einem anderen Dokument.

Wählen Sie erst links die zu ersetzende Variable aus, danach -auf der rechten Seite- eine andere Variable bzw. ein anderes Signal.

Bei Auswahl eines CAN-Signals aus der dreiteiligen Liste (Nodes, Messages, Signals) wird automatisch eine neue Variable erzeugt, falls das Signal noch nicht mit einer existierenden Variablen verbunden ist. Wählen Sie dazu erst einen CANdb-Knoten (Node) aus, dann eine CANdb-Message, und schließlich ein CAN-Signal aus. Das Programmiertool fragt gegebenenfalls nach, welchen Namen die neue Variable erhalten soll.

Die Spalte "Type" in der Tabelle zeigt an, ob eine Variable mit einem Signal ("Sig") verbunden ist, oder ob es sich um eine "normale" (d.h. nicht mit einem Kommunikationskanal verbundene) Variable ("Var") handelt. Wenn hinter "Sig" ein Fragezeichen steht, ist die ursprüngliche Signaldefinition (auf der Registerkarte "CANdb") nicht mehr vorhanden weil die CANdb-Tabelle gelöscht wurde. Dies spielt für die Funktion des Terminals als Anzeige allerdings keine Rolle.

Für Geräte mit Script-Sprache können mit dem oben gezeigten Dialog auch globale Script-Variablen mit der Anzeige verbunden werden. Wählen Sie dazu die Registerkarte 'Script' (rechts neben 'Variablen' und 'Signalen', im oben gezeigten Screenshot nicht sichtbar). Beim Auswählen einer der dort aufgelisteten Script-Variablen erzeugt das Programmiertool einen Formelausdruck mit dem Schlüsselwort 'script.' vor dem Variablennamen. Daran erkennt der Display-Interpreter später, dass es sich hier nicht um eine 'normale' Anzeigevariable handelt, sondern um eine Script-Variable, die nur in der vom Compiler erzeugten Symboltabelle (aber nicht auf der Registerkarte "Variablen" im Programmiertool) bekannt ist. Lokale Script-Variablen können auf diese Weise nicht angezeigt werden.

Wenn die Option "select new line automatically" aktiv ist, wird die aktive Tabellenzeile (=blaue Markierung)  automatisch in die nächste Zeile umgeschaltet, wenn eine neue Variable (oder CAN-Signal) in auf der rechten Seite ausgewählt wurde. Dies reduziert die Anzahl erforderlicher Mausklicks, wenn Sie die komplette Anzeigeseite ändern wollen.

Die Option "replace name in display text" bewirkt folgendes:
Wenn im alten Menütext auch der VARIABLENNAME vorkommt, wird er automatisch bei Zuweisung einer anderen Variablen ersetzt.

Nur für Geräte mit CANdb-Funktionalität:
Wenn die CANdb-Datei sehr viele Signale enthält, kann es schwerfallen ein bestimmtes Signal zu finden, z.B. "Oeldruck" (speziell wenn Sie nicht wissen von welchen Knoten dieses Signal gesendet wird, und in welcher Message es enthalten ist). Es gibt eine "globale" Suchfunktion für SIGNALNAMEN, durch alle KNOTEN und MESSAGES. Klicken Sie dazu mit der rechten Maustaste in die Knotenliste ("CAN nodes"). Es erscheint ein Popup-Menü; wählen Sie "Find Signal" und geben im nun erscheinenden Fenster den SIGNALNAMEN ein. Die Suche erfolgt unabhängig von Groß/Kleinschrift, Sie können den Suchstring daher komplett in Kleinbuchstaben eingeben, z.B. "oeldruck".
Da in zwei unterschiedlichen Messages gleiche Signalnamen vorkommen könnten, kann die Suche auch an der aktuellen Position innerhalb der Datenbank fortgesetzt werden ("Find next occurrence of XYZ").

Siehe auch:

Zurück zum Inhaltsverzeichnis


Dialog zum 'Verlinken' von Menüs

Dieses Dialogfenster dient zum Zuweisen von "Sprungzielen" für alle Menüzeilen, die auf einer Anzeigeseite definiert sind. Es wird automatisch geöffnet, wenn die Funktion zum Testen aller Anzeigeseiten ("check all pages") einen ungültigen Menü-Sprung findet, oder aus einem Popup-Menü in der Anzeigeseiten-Definition.

Die linke Tabelle zeigt alle auf einer Seite definierten Menüzeilen (allerdings nur das hier "Wesentliche"). Die Liste auf der rechten Seite enthält die Namen aller vorhandenen Anzeigeseiten (die als "Sprungziel" bei der Auswahl eines Menü-Items verwendet werden können). Ein Klick auf einen Seitennamen ordnet diesen der in der Tabelle selektierten Menüzeile zu.

Die Selektion der Menüzeile (blaue Markierung) wird umgeschaltet, wenn per Klick in das Listenfenster ein neues Sprungziel ausgewählt wird (dies miminiert die Anzahl der Mausklicks, wenn alle Sprungziele auf einer Seite neu definiert werden). Sie können eine Menüzeile per Mausklick in die Tabelle erneut anwählen.

Hinweis:
Das Ändern der angezeigten Menütexte und das graphische Erscheinungsbild ist nicht die Aufgabe dieses Dialoges. Verwenden Sie die Registerkarte zum Definieren einer Anzeigeseite um den Text, Zeichensatz, Bildschirmkoordinate usw. zu ändern.

Falls etwas mit der Menü-Sprungziel-Definition nicht stimmt, wird eine Fehlermeldung in roter Farbe angezeigt. Normalerweise ist ein "nicht existierendes Sprungziel" die Ursache dafür. Alle ungültigen Sprunziele werden auch in der Tabelle mit roter Farbe markiert.

In der unteren rechten Ecke des Dialogfensters finden Sie die folgenden Checkboxen:

Select new line automatically
Aktiviert die automatische Selektion der nächsten Menüdefinition beim Anklicken eines neuen Sprungziel (zum Minimieren der sonst nötigen Mausklicks..)
Replace (variable-) name in menu (-text)
Wenn der Name des Sprungziels (=Seitenname) im Menütext enthalten ist, wird er automatisch ersetzt wenn ein neues Sprungziel angewählt wird. Wenn der Name kein Teil des Menütextes ist, passiert nichts.
Hinweis: Zum EDITIEREN DES MENÜTEXTES dient nicht dieses Dialogfenster, sondern die Display-Seiten-Definition.

Falls der Menü-Link-Dialog aus der Anzeige-Seiten-Übersicht geöffnet wurde, können sie mit den Buttons "previous" und "next" zur vorhergehenden bzw. folgenden Anzeigeseite umschalten.

Nachdem Sie die Sprungziele für alle Menüzeilen definiert haben, schließen Sie das Dialogfenster mit dem "OK"-Button. Erst dann werden die Änderungen übernommen !

Zurück zum Inhaltsverzeichnis

Assistent 'Alle Seiten prüfen und korrigieren' Beim 'Recyceln' existierender Anzeigeseiten für neue Applikationen können Probleme auftreten, z.B. durch die Verwendung von Variablen (auf der kopierten Seite), die in der neuen Applikation noch nicht definiert wurden; Sprung zu Anzeigeseiten, die zwar in der alten Applikation aber nicht in der neuen Applikation existieren ("broken links"), u.s.w.
Um solche Probleme mit wenig Aufwand zu erkennen, bietet das Programmiertool im Hauptmenü unter 'Assistent' die Funktion
    Alle Seiten prüfen und korrigieren .
Das Programmiertool durchsucht dann in allen in der Applikation vorhandenen Anzeigeseiten nach Fehlern, wie z.B.:
  • Verwendung von nicht (mehr?) definierten Variablen
  • Verwendung von noch nicht definierten Variablen (mit Platzhaltern wie z.B. <SelectMe> anstelle eines gültigen Variablennamens)
  • Sprünge auf Seiten mit unbekanntem Namen oder 'Nummer' (z.B. als Reaktion auf Tastendruck)
  • Fehler in numerischen Ausdrücken (d.h. wenn der anzuzeigende Wert keine einfache Variable, sondern ein 'berechneter Wert' ist)
Abhängig vom Typ des Fehlers, und von der Position (Seite, Zeile, Definitionsspalte) wird die entsprechende Zelle auf der Registerkarte "Seite #N" farbig markiert. Grobe Fehler (z.B. nicht definierte Variablen) werden rot, Warnungen (z.B. noch nicht 'mit Leben angefüllte Platzhalter') werden gelb hinterlegt.
Darüberhinaus kann dieser Assistent automatisch andere Hilfen aufrufen, z.B. den im vorhergehenden Kapitel vorgestellten Dialog zur Auswahl von Variablen auf einer Anzeigeseite.

Katalog zur Auswahl von 'globalen' Event-Definitionen

Der unerfahrene Anwender kann ein paar GLOBALE EVENT-Definitionen aus einem Katalog auswählen:


(Screenshot 'Katalog zur Auswahl von globalen Events-Definitionen')

Die so erzeugten Definitionszeilen dienen zum...

  • Umschalten zwischen Bildschirm-Anzeigeseiten (ohne Menüs anlegen zu müssen)
  • Umschalten zu einer bestimmten Anzeigeseite wenn ein schwerwiegender CAN-BUS-Fehler auftritt
  • ...

Siehe auch:

Wurde der oben gezeigte Katalog vom Assistenten zum Erzeugen einer neuen Applikation geöffnet, dann war dies der letzte Schritt durch den der Assistent Sie geleitet hat. Vor dem Übertragen der Applikation in das programmierbare Gerät wird üblicherweise noch die Zuordnung von Variablen/Signalen und Anzeigeelementen überprüft, und ggf. mit dem graphischen Editor noch der letzte 'Feinschliff' durchgeführt.


Galerie für Anzeigeseiten (veraltet)

Die Anzeigeseiten-Galerie enthält eine alte Sammlung von vorgefertigten Anzeigeseiten ("screens"), die in einem speziellen Unterverzeichnis des Programmiertools abgelegt sind. Sie können sich eine Seite aus der Galerie-Vorschau auswählen (mit einem speziellen Dateiauswahlfenster) und in Ihre eigene Anwendung übernehmen. Verwenden Sie dazu den Button "Galerie..." auf der Anzeige-Seiten-Übersicht ).

Hinweis:
Die Anzeigeseiten-Übersicht zeigt alle Seiten, die in Ihrer Anwendung enthalten sind
Die Anzeigeseiten-Galerie zeigt Produkte eines anderen Autors (des "Künstlers"), die Sie -bei Gefallen- übernehmen können.
Mit der Galerie können Sie auch Anzeigeseiten aus anderen Anwendungen in Ihre Anwendung übernehmen (setzen Sie zu diesem Zweck den Dateityp ( File Type) auf "*.upt" oder "*.cvt")
Vorsicht:
Eine Seite aus der Galerie wird möglicherweise nicht korrekt angezeigt, wenn die darin verwendeten Icons und/oder Variablen in Ihrem Programm (noch) nicht vorhanden sind. Prüfen Sie Ihre Anwendung darum sorgfältig, nachdem Sie Anzeigeseiten aus der Galerie übernommen haben !
Seit der Integration des 'einfachen' Editors für Anzeigeseiten, und dessen Möglichkeit zum Kopieren/Duplizieren von Seiten ist die Galerie obsolet, und wird nicht mehr aktiv gepflegt. Neuere Anzeige-Elemente wie z.B. Zeigerinstrumente und Tabellen sind daher in den vorgefertigten Galerie-Seiten nicht enthalten.

Zurück zum Inhaltsverzeichnis 


Anzeige-Seiten-Übersicht

Auf der Registerkarte "Seitenübersicht" wird eine Übersicht aller Anzeigeseiten dargestellt, die momentan in Ihrer Terminal-Anwendung enthalten sind.

Sie können per Doppelklick auf eine der angezeigten Seiten klicken um zur Anzeige-Seiten-Definition umzuschalten, um dort den Inhalt der Anzeigeseite zu bearbeiten.

Aus der Seitenübersicht können Sie auch die Galerie aufrufen, um vorgefertigte Anzeigeseitein in Ihre eigene Anwendung zu übernehmen.

Ein einfacher Klick auf eine Seite markiert diese für die nachfolgenden Aktionen. Die selektierte Seite wird durch einen farbigen Rahmen markiert.

Ein Klick mit der rechten Maustaste auf eine der Vorschau-Seiten öffnet ein Popup-Menü mit den folgenden Optionen:

  • eine neue, leere Seite einfügen (vor der selektierten Seite)
  • die selektierte Seite löschen
  • per Copy & Paste die Reihenfolge einstellen
  • eine Anzeigeseite aus der Galerie auswählen und an der aktuellen Position einfügen
  • alle Menü-Links auf der selektierten Seite prüfen
Optionen für die Seitenübersicht:

[v] Anzeige stauchen
Die Seitenübersicht verwendet verkleinerte Vorschau-Bilder, auf denen nicht jedes einzelne Pixel erkennbar ist.
Auch viele Seiten sind so ohne Scrollen sichtbar.
[v] Script-Aufrufe erlauben
Ohne diese Option sind beim Erstellen der Seitenübersicht keine Aufrufe von Script-Funktionen zulässig. Stattdessem wird in allen Zeilen, in denen z.B. das Script zum Zusammenstellen des Anzeigetextes aufgerufen würde, der Text '<generating preview>' angezeigt.
Dadurch werden unerwünschte Nebeneffekte vermieden, z.B. eine zu langsame Aktualisierung wenn das Script die Texte über ein Netzwerk anfordert, oder einzeln aus einer Textdatei liest und aufbereitet.

Zurück zum Inhaltsverzeichnis


Importieren von Bildern (Symbole, Bitmaps, Icons)

Zum Einbinden von Bildern in die Applikation dient die Registerkarte "Symbole" (engl. "Icons") im Programmiertool.


Sie können -je nach Hardware- Bilder aus monochromen oder farbigen Windows-Bitmaps importieren.
Im Hauptmenü besteht unter "Icon..Create New" auch die Möglichkeit, ein neues ("leeres") Icon zu erzeugen.

Sie können das Icon Pixel-für-Pixel mit dem Programmiertool bearbeiten (durch Klicken in das Bild auf der rechten Seite); besser ist es jedoch, dafür ein geeignetes Malprogramm einzusetzen (z.B. "Paint"). Vektorgrafiken, wie sie von Zeichenprogrammen erzeugt werden, sind nicht verwendbar.

Der Name der Bilddatei (Bitmap) muss ein gültiger DOS-Dateiname sein, denn die Firmware in manchen Geräten verwendet ein DOS-ähnliches Dateisystem um große Objekte zu speichern. Darum muss der Dateiname (und damit auch der "Icon-Name") folgende Bedingungen erfüllen:

  • Der Name muss mit einem Buchstaben beginnen (a..z, A..Z) .
  • Der Name darf maximal acht Zeichen lang sein (ohne Dateityp) .
  • Das zweite bis achte Zeichen darf aus der folgenden Menge stammen:
    a..z, A..Z, 0..9, oder _ (Unterstrich). NICHTS ANDERES. Insbesonders keine Leerzeichen, auch wenn z.B. Windows die Verwendung von Leerzeichen in Dateinamen erlaubt.

Bei älteren Geräten (mit 256 Farben, z.B. MKT-View II) konnten nur Bitmaps mit 1, 4, oder 8 Bit pro Pixel eingelesen werden; d.h. monochrome, 16-, oder 256-Farb-Bilder. Die Farbpalette im Gerät ist nicht variabel, darum sehen Farbbilder nicht immer genau so aus wie in einem Malprogramm mit 16 Millionen Farben. Mit den folgenden Tipps 'für Experten' kann auch bei diesen Geräten ansprechende Farbgrafiken realisiert werden.

Für Experten:
  • In der tabellarischen Übersicht mit allen in der Applikation importierten Bitmap-Grafiken werden nicht nur Name, Breite und Höhe, sondern auch die Farbtiefe angezeigt. Die dezimale Codierung des Typs entspricht dabei der Ablage der Bitmap 'als Text' in der *.cvt- bzw. *.upt-Datei:
    0 = Monochrom (ein Bit pro Pixel)
    1 = 16 Farben, vier Bits pro Pixel, nur Grundfarben (0 bis 15)
    2 = 256 Farben, acht Bits pro Pixel, keine Palette sondern RGB-3-3-2
    3 = 256 Farben, acht Bits pro Pixel, reserviert für Bitmaps mit eigener Farbpalette
    4 = 65536 Farben, 16 Bits pro Pixel, Format RGB-5-6-5
  • Im 256-Farb-Modus werden 2 Bits für den blauen Farbanteil, 3 Bits für Grün, und 3 Bits für Rot verwendet. Manche Bild-Datei-Konverter (z.B. IrfanView) können High-Colour-Bilder (mit 65535 Farben) und True-Colour-Bilder (mit 16 Millionen Farben) in optimierte 256-Farb-Bilder umwandeln, wobei ein trickreicher Algorithmus (z.B. Floyd-Steinberg) dafür sorgt, dass auch Farbverläufe gut aussehen. Derartige Programme erzeugen grundsätzlich bessere Resultate als der im Programmiertool eingebaute Import-Filter, der nur die 'am besten geeignete' Farbe aus der festen 2+3+3-Bit-Farb-Palette auswählt, aber kein Dithering durchführt.
  • Die Umwandlung eines 'True-Color'-Bildes mit Hilfe des Programms IrfanView, unter Nutzung einer für das Terminal optimierten Farbpalette, ist in der Datei 'readme_irfanview.txt' im Unterverzeichnis 'icons' des Programmiertools beschrieben.
  • Seit November 2021 können einige Geräte (z.B. MKT-View III, IV) Icons für die interne Ablage im Flash komprimieren. Der intern verwendete Algorithmus (z.B. RLE) hängt von den Möglichkeiten der CPU ab, und ist dem Programmiertool unbekannt. Die im unteren Panel auf der Registerkarte 'Icon-Import' angezeigte noch freie Flash-Speicher ("~ XXX kByte free (in Flash)") ist daher nur eine grobe Schätzung, und bei Bildern mit vielen monochromen Flächen eher pessimistisch.
    Der einzige zuverlässige Indikator für den nach dem Import der Applikation im Target noch freien Flash-Speicher ist im Target selbst; er kann über das Setup/System-Menü per Diagnostics .. Storage Directory aufgerufen werden. Der von der Applikation (inklusive der importierten Icons) belegte, und der verbleibende freie Speicher wird in der Fußzeile (unter der Liste aller gespeicherten Elemente) angezeigt, z.B.:
      Used: 672; unused: 357 kByte .
  • In Geräten mit großem Programmspeicher können die importierten Icons auch individuell aufgelistet und angezeigt werden. Selektieren Sie dazu im oben erwähnten 'Storage Directory' die Zeile mit 'Type=ICON' und drücken Enter bzw. den Drehknopf. Wenn vorhanden, öffnet sich in dem Fall der 'Icon Browser', mit dem alle importierten Icons angezeigt werden können, inkl. der komprimierten und entkomprimierten Größe.

Bei Geräten mit 16 Bit pro Pixel (z.B. MKT-View IV) können auch Bitmaps mit 65536 Farben direkt in die UPT-Applikation importiert werden. Bilder mit 16 Bit pro Pixel belegen allerdings entsprechend viel Speicher (der dann nicht für Scripte und andere Elemente der Applikation zur Verfügung stehen); eine 'bildschirmfüllene' Bitmap-Grafik für das MKT-View IV mit 800 * 480 Pixeln benötigt z.B. etwa 750 kByte im 'kostbaren' CPU-eigenen Flash. Die im nächsten Absatz erwähnte Möglichkeit des Ladens von Grafiken von einem geeigneten Speichermedium (während der Laufzeit, im Display) vermeidet dieses Problem, denn auf einer Speicherkarte stehen nicht nur wenige MByte, sondern etliche GByte an Speicherplatz zur Verfügung.

Nach dem Import von Icons können diese (wie hier beschrieben) im Anzeigeprogramm verwendet werden.
Bei neueren Geräten (z.B. MKT-View III) können Icons alternativ, statt sie direkt in die Applikation (*.cvt / *.upt) einzubinden, auch wie hier beschrieben von einem geeigneten Speichermedium geladen werden.

Siehe auch (ähnliche Themen) :
            Icons als Anzeige- und Bedienelemente,
            "Boot-Screen" (beim Einschalten des Gerätes angezeigte Grafik, nicht in der *.cvt-Applikation),
            Canvas-Objekte ("Leinwand" zum Zeichnen von Grafiken per Script während der Laufzeit).

Reservieren von Speicher für Icons (und andere Spezialfunktionen)

Bevor Sie Icons in Ihrer Applikation verwenden können, müssen Sie bei älteren Geräten (mit 8- oder 16-Bit-CPU) dafür ausreichenden Speicher reservieren, z.B. indem Sie einige Anzeigeseiten des Terminals "opfern". Klicken Sie dazu auf "Icon Memory". Dadurch wird das weiter Unten beschriebene Dialogfenster geöffnet.

Icons, Anzeigeseiten und das Text-Array müssen sich den im Terminal verfügbaren Speicher teilen. Die Aufteilung des Speichers kann den Erfordernissen angepaßt werden. Dabei gibt es gravierende Unterschiede zwischen älteren und neueren Geräten (auch von der verwendeten Firmware abhängig), die in den folgenden Kapiteln erläutert werden.

Welche Flash-Speicher-Verwaltung für ein bestimmtes Gerät verwendet wird, kann nach der Geräteauswahl (bei der nicht nur die Displaygröße, sondern auch einige Informationen über die Geräte-Firmware aktualisiert werden) auf der Registerkarte 'Einstellungen' unter Terminal-Konstanten / Flash-Speicherverwaltung abgefragt werden:
statisch (sehr alt)
Display-Seiten haben eine konstante Größe bei der Ablage im Flash-Speicher. Für Icons wird ein eigener Speicherbereich verwendet. Diese Methode kommt nur bei sehr alten Geräten mit 8-Bit-CPU, z.B. "UPT-515", zum Einsatz.

statisch, geteilt (alt)
Display-Seiten haben eine konstante Größe, Icons und Display-Seiten teilen sich aber einen (großen) Flash-Speicher. Diese Methode wird nur bei relativ alten Geräten mit 16-Bit-CPU, z.B. "MKT-View I", verwendet.

flexibel, geteilt
Display-Seiten belegen nur so viel Speicher im Flash wie 'unbedingt nötig'. Zeichenketten (wie auch Display-Elemente) werden mit variabler Länge abgelegt ("so kurz wie nötig"). Icons, Display-Seiten, Texte, Scripte, Variablendeklarationen, CAN-Datenbanken u.v.A.m. teilen sich einen Flash-Speicher. Diese Methode wird bei allen neueren Geräten mit 32-Bit-CPU, z.B. "MKT-View III / IV / V", verwendet.


Speicheraufteilung bei älteren Geräten (z.B. MKT-View I)

Bei dieser Geräteklasse haben alle Anzeigeseiten eine feste Größe (bei der Ablage im FLASH-Speicher des Terminals). Enthält ein Anzeigeprogramm die maximale Anzahl" von Anzeigeseiten, bleibt nur wenig Platz für andere Objekte (wie Textzeilen und Icons).

Aus diesem Grund müssen Sie einige Anzeigeseiten "opfern", wenn Sie mehr Icons und/oder Text-Array-Zeilen benötigen.

Wenn Sie die Anzahl von Anzeigeseiten verringern, bleibt mehr Speicher für Icons.

Wenn das Terminal z.B. Speicher für 50 Anzeigeseiten (display pages) bietet, Sie aber nur 40 nutzen wollen, bleiben circa (50-40) * 1600 Bytes die zur Speicherung von Icons verwendet werden können.


Dialog 'Speicheraufteilung im Terminal' für ältere Geräte,
mit konstanter Größe von Anzeigeseiten bei der Ablage im Flash-Speicher.

Klicken Sie auf den Button "Icon Memory" (auf der Registerkarte "Icons") um diesen Dialog zu starten.

Flexible Speicheraufteilung bei neueren Geräten (z.B. MKT-View II, III, IV)
Bei dieser Geräteklasse wird ein völlig anderes Verfahren zur Ablage von Anzeigeseiten, Text-Array-Zeilen, Icons und anderen Objekten im FLASH-Speicher verwendet. Dabei belegt jedes Objekt im Speicher nur so viel Platz wie unbedingt nötig. Anzeigeseiten mit weniger Zeilen pro Seite, oder kürzeren Zeilen belegen weniger Speicher als bei älteren Geräten.
Im Normalfall steht daher immer genug Speicher zur Verfügung, und die "maximale Anzahl Anzeigeseiten" wie auch die Länge des Text-Arrays kann im oben abgebildeten Dialogfenster 'großzügig' eingestellt werden.
Damit das Programmiertool die Größe des verbleibenden freien Speichers (im Terminal) abschätzen kann, müssen einige Informationen über das Zielsystem bekannt sein. Dazu gehört unter Anderem die maximal für Anzeigeseiten + Textzeilen + Icons nutzbare Größe des FLASH-Speichers, und weitere hard- und firmwarespezifische Details, die auch in der *.CVT bzw. *.UPT-Datei im Abschnitt "Terminal Constants" abgespeichert sind.
Beim Umstieg von einer Geräteklasse zu einer anderen (z.B. vom MKT-View I / "+" zum MKT-View II / III / IV) können diese Informationen notfalls mit einem geeigneten Text-Editor, oder mit dem Programmiertool auf der im folgenden Kapitel vorgestellten Registerkarte Einstellungen angepasst werden.

Die Unterscheidung von "alten" und "neueren" Geräten wird in Form der folgenden Parameter mit in der Applikation (*.cvt bzw. *.upt) abgespeichert:

  • Icon Memory Shared (bzw. "t icons_shared" in der *.CVT / *.UPT - Datei) :
    0 = für die Icons wird ein eigener Bereich im FLASH-Speicher verwendet (z.B. beim MKT-View "alt")
    1 = Icons und Anzeigeseiten nutzen einen gemeinsamen FLASH-Bereich, Anzeigeseiten haben eine statische Größe im Speicher (z.B. "UPT515")
    2 = Icons und Anzeigeseiten nutzen einen gemeinsamen FLASH-Bereich, alle Objekte haben flexible Größen
    (z.B. "MKT-View II / III / IV", "UPT 320", und alle anderen Geräte mit ARM- oder Cortex-CPU)
  • Max. Data FLASH Size (bzw. "t max_free_mem_kbyte" in der *.CVT / *.UPT - Datei) :
    Dieser Wert gibt die Größe des für Anzeigeseiten, Variablendefinitionen, Text-Array-Zeilen, Icons (Bilder) und diverse andere Objekte verwendeten FLASH-Bereiches an. Ein anderer Teil des FLASH-Speichers wird für die Firmware (Maschinenprogramm) benötigt; die verfügbare "freie" Speichergröße ist daher von der verwendeten Hard- und Firmware abhängig. Beim "UPT 320" (Terminal mit 5.7"-TFT, 320*240 Pixel) mit Firmware #11352 waren beispielsweise 896 kByte für die Speicherung des Anzeigeprogramms verfügbar.

Hinweis: Die Berechnung des verbleibenden, freien Speichers im Programmiertool kann (geringfügig) vom Speicherbedarf im "echten" Terminal abweichen. Der tatsächlich verbleibende freie Speicher im Terminal wird für einen kurzen Moment beim Hochfahren des Terminals angezeigt, z.B.:

CANdb Display Terminal (...)
Compiled: Aug 5 2009 (...)
Loading .... ( unused : 761 kByte )

Da die Meldungen beim 'Hochfahren' bei Geräten mit schneller CPU nur sehr kurz sichtbar sind, kann der noch freie Flash-Speicher auch im System-Menü unter 'Diagnostics' .. 'Storage Directory' angezeigt werden (dort bis zur letzten Zeile scrollen).

Ein ähnlicher Wert sollte im Programmiertool auf der Registerkarte "Symbole" (Icons) neben dem Button "Icon-Speicher" angezeigt werden.
Bei größeren Abweichungen stimmt z.B. der Wert des Parameters "max_free_mem_kbyte" in der *.UPT bzw. *.CVT-Datei nicht mit dem tatsächlichen Wert (im "echten" Terminal) überein. Diese Diskrepanz kann, wie oben erwähnt, manuell korrigiert werden, oder durch Zurücklesen der Applikation aus dem "echten" Terminal (weil das Terminal in diesem Fall dem Programmiertool alle benötigten Informationen mitteilen kann, was bei Übertragung per Speicherkarte nicht möglich ist).

Um dies Problem (der fehlenden "bidirektionalen Kommunikation" zwischen Programmiertool und zu programmierendem Gerät) zu umgehen,

wählen Sie Optionen .. LCD-Einstellungen / Geräteauswahl im Hauptmenü des Programmiertools,
und wählen die Ziel-Hardware erneut an (selbst wenn bereits die passende Hardware markiert ist).
Das Programmiertool überträgt daraufhin einige Informationen über das zu programmierende Gerät aus einer internen Datenbank in die Terminal-Konfiguration, und passt gegebenenfalls die Parameter zur Berechnung des freien Speichers automatisch an.

Ermitteln des Flash-Speicher-Bedarfs im Zielsystem
Wird beim Hinzufügen neuer Display-Seiten oder Bitmaps (Icons) der Speicher knapp, kann das Programmiertool auf Wunsch (per Hauptmenü: Ansicht : Aktueller Flash-Speicher-Bedarf im Target) einen 'Bericht' mit der mutmaßlichen Speicherbelegung im Zielsystem erstellen. Die Anzeige erfolgt in einem Editorfenster, aus dem der Bericht als Text per Copy & Paste in eigene Dokumentationen oder Emails übernommen werden.

Geschätzter Speicherbedarf    

Element              Größe
Display pages   :     38 kByte
Display vars    :      6 kByte
Global events   :     21 kByte
Text array      :      1 kByte
Icons, Bitmaps  :    142 kByte
User def'd fonts:      1 kByte
Script Sourcecode:     0 kByte
CAN databases   :      8 kByte
CANopen (config):      1 kByte
Target Size     :    832 kByte
Total USED Size :    214 kByte
Remaining, free :    618 kByte
 ...

Hinweis:
Da der Flash-Speicher bei vielen Geräten nicht nur für die Applikation des Endanwenders, sondern auch für die Geräte-Firmware und den Firmware-Bootloader verwendet wird, ergibt sich bei vielen Geräten eine "krumme Größe" (keine Zweierpotenz) des unter 'Target Size' angezeigten Wertes. Die genaue, und zur verwendeten Geräte-Firmware genau passende Speichergröße finden Sie nur 'Storage Directory' des Gerätes (siehe Link, unten). Speziell bei Geräten mit einer kundenspezifischen Sonder-Firmware könnten im Flash-Speicher auch Objekte abgelegt sein, die dem Programmiertool nicht bekannt sind.

Siehe auch: Speicher für Scripts (der aus Sicherheitsgründen von der Speicherverwaltung des Displays abgetrennt ist),
      Storage Directory (Speicheranzeige im 'System Menu' des Gerätes unter 'Diagnostics').

Zurück zum Inhaltsverzeichnis


Benutzerdefinierte Zeichensätze

Dieses Kapitel wurde wegen ausufernder Dateigröße in eine eigene Datei (ufont_49.htm) verschoben.
Seit der Integration von frei skalierbaren Vektor-Zeichensätzen sind selbstdefinierte Zeichensätze nur noch selten nötig.

Debugging

Um die Fehlersuche im Anzeigeprogramm zu vereinfachen, verfügt das Programmiertool über die folgenden Debugging-Hilfen:

  • Das "Watch"-Fenster ermöglicht die Anzeige des Inhalts einiger Variablen und anderer "berechneter" Ausdrücke;
  • Das "Test-Kommando"-Fenster dient zur Eingabe von Kommandos zur Simulation empfangener CAN-Telegramme, usw.
  • Die Registerkarte "Fehler" zeigt Fehlermeldungen, Protokollverstöße, und andere Meldungen in der Reihenfolge ihres Auftretens.
  • Mit dem "CAN-Logfile-Player" können CAN-Telegramme aus einer (ASCII-)Datei abgespielt werden, als Ersatz für einen 'echten' CAN-Bus.
  • Für die Script-Sprache stehen weitere Hilfsmittel zur Verfügung, z.B. Breakpoints, Single-Step, Anzeige von Variablen, Trace-Historie, etc.
  • Für den Schreibzugriff auf eine Variable kann ein Data-Breakpoint definiert werden, der die Simulation stoppt wenn der zugewiesene Wert in einem bestimmten Bereich liegt.

Darüberhinaus stehen (ohne Programmiertool) die folgenden Möglichkeiten zum Debuggen zur Verfügung:

  • Bei Geräten mit Ethernet-Schnittstelle und integriertem Web-Server (z.B. MKT-View II / III / IV) können Sie per Web-Browser die 'Fernsteuerung' des Gerätes aktivieren. Auf der 'Remote Control'-Seite können Befehle an den Display-Interpreter gesendet werden, und einzelne Variablen (wie im Watch-Fenster des Programmiertools) inspiziert werden. Technische Details zum Web-Server finden Sie hier (online, auf der MKT-Webseite).
    Details zu den Netzwerk-Einstellungen (u.A. IP-Adresse, HTTP-Server-Port, etc) finden Sie in Dokument Nr. 85115, "System Setup" .
  • Bei Geräten mit 32-bit-CPU (z.B. MKT-View III/IV) kann über das System-Menü die Funktion 'Diagnostics'..'Error History' aufgerufen werden. Dort werden zum Teil auch Fehler im Anzeigeprogramm (vom Display-Interpreter, vom Script-Compiler, und von der Script-Laufzeitumgebung) angezeigt.

Siehe auch: Inhaltsverzeichnis, Einstellungen des Programmiertools

Watch-Fenster

Das Watch-Fenster ist eine Hilfe zur Fehlersuche. Darin kann der Wert einiger numerischer Ausdrücke angezeigt werden (z.B. mit Variablen des Anwenderprogramms). Es wird über das Hauptmenü des Programmiertools geöffnet ("View").

In der linken Spalte der Tabelle kann ein beliebiger numerischer Ausdruck eingegeben werden, dabei sollten Sie allerdings darauf achten keine Unterprogramme mit "Nebeneffekten" aufzurufen. Dies gilt auch für selbstdefinierte Script-Funktionen. Für die Anzeige von Werten aus dem im Hintergrund laufenden Script stellen Sie auch hier dem Namen der Script-Variablen bzw. -Funktion den Präfix 'script.' voran. Die Anzeige von kompletten Strukturen oder Arrays wird vom einfachen Watch-Fenster nicht unterstützt - verwenden Sie dazu den Script-Debugger.

In der nächsten (optionalen) Spalte mit der Überschrift "Format" kann definiert werden, wie der angezeigte Wert formatiert werden soll (Anzeigeart und Anzahl Ziffern). Mögliche Formate für die Anzeige im Watch-Fenster sind:

  • d,D dezimal
  • +,- dezimal, immer mit Vorzeichen
  • h,H hexadezimal
  • b,B binär

Wenn nötig, kann die Anzahl der Ziffern für die Anzeige direkt nach dem Formatbuchstaben eingegeben werden. Beispiele:

AusdruckFormatErgebnis (Wert)
script.Math.sqrt(2)d20+             1.414214
script.display.EditValueMind7- 100.00
script.display.EditValueMaxd7+ 100.00
10 / 3+00000003 (Ergebnis : Integer)
1.0 / 3+ 0.333 (Ergebnis : Fliesskomma)


Ist ein Ausdruck im Watch-Fenster fehlerhaft, erzeugt der Interpreter Fehlermeldungen die auch auf der Fehler-Anzeige-Seite des Hauptfensters angezeigt werden.

In der Spalte "Ergebnis" wird der ständig neu berechnete Wert des in der ersten Spalte eingegebenen Ausdrucks angezeigt. In bestimmten Fällen (z.B. wenn der Ausdruck aus einer einfachen Variablen besteht) ist es sogar möglich, den Wert zu Testzwecken im Watch-Fenster zu editieren.
Klicken Sie dazu in die entsprechende Zelle der Tabelle, überschreiben den Wert, und drücken die ENTER-Taste zum Abschluß der Eingabe.


Screenshot des Watch-Fensters mit erweitertem Control-Menü
(Öffnen durch Anklicken des Icons in der linken oberen Ecke)

Im Control-Menü des Fensters kann die Aktualisier-Rate der Anzeige umgeschaltet werden. In den meisten Fällen ist die 'langsame' Einstellung ausreichend. Die 'schnelle' Einstellung hilft z.B. um auf den ersten Blick zu erkennen, welche Werte bzw. Variablen besonders oft (z.B. per CAN-Bus) aktualisiert werden.

Per Watch-Fenster kann auch das 'globale' Array des Display-Interpreters beobachtet werden. Da ein 'komplettes' Array i.A. nicht in eine einzelne Zelle der Watch-Tabelle passt, kann der Inhalt des Arrays per Kontext-Menü (Klick mit der rechten Maustaste in die entsprechende Tabellenzeile) auch in einem mehrzeiligen Textfenster angezeigt werden. Wählen Sie dazu die Funktion 'Mehrzeilig anzeigen'.

Siehe auch: Inspizieren von: Arrays, Script-Variablen, Diagramm-Kanal-Speichern; weitere Debugging-Hilfen, CAN-Bus-Simulator, Inhaltsverzeichnis .

Fenster zur Eingabe von 'Test-Kommandos'

Das "Test-Kommando-Fenster" dient nur zur Fehlersuche. Es enthält ein mehrzeiliges Eingabefeld, in dem u.A. Interpreterkommandos eingegeben werden können. Durch Drücken der Funktionstaste F2 wird das Kommando in der Zeile ausgeführt, in der momentan der Eingabecursor steht.

Das Fenster wird aus dem Hauptmenü des Programmiertools geöffnet ("Ansicht".."Test-Kommando-Fenster").

In der oberen Fensterhälfte werden die auszuführenden Testkommandos eingegeben, z.B. "sim_rx" zur Simulation des Empfangs einer bestimmten Botschaft, z.B.:
  sim_rx <CAN-Message-Identifier> <erstes Datenbyte> <zweites Datenbyte> ....
    oder
  sim_rx serial1 <erstes Datenbyte> <zweites Datenbyte> ....

Hinweis zum Kommando "sim_rx":
Dieses Kommando stammt noch aus der Anfangszeit des Programmiertools, anno 1999.
Der CAN-Bus-Simulator bietet einen wesentlich flexibleren Ersatz.

In der unteren Fensterhälfte werden die Ausgaben ("Resultate") von einigen Kommandos angezeigt, z.B. mit dem Kommando "print" abgefragte Werte, aber auch Fehlermeldungen (wenn diese vom Testkommando hervorgerufen wurden).

Hinweis: Die in diesem Fenster eingegebenen Kommandos werden nur "lokal" durch den Interpreter im Programmiertool / Simulator abgearbeitet. Es wird keine 'echte' Hardware benötigt, um damit eine Applikation zu testen.

Siehe auch: Übersicht zum Thema 'Debugging', Inhalt  

Abspielen von CAN-Logfiles im Display-Simulator

Das Werkzeug zum 'Abspielen von (CAN-)Logfiles' dient zum Testen der Display-Applikation im Simulatorbetrieb, als Ersatz für einen 'echten' CAN-Bus. Es ist nur im Programmiertool für Anzeigen mit 'CANdb'-Support (DBC), aber nicht für CANopen verfügbar.

Sie können damit vorher aufgezeichnete CAN-Telegramme abspielen. Der Simulator verhält sich dabei so als ob die CAN-Messages von einem 'echten' Bus empfangen wurden. Die Testdaten werden aus einer einfachen Textdatei eingelesen. Das verwendete Format ist mit Vector's 'ASCII'-Format kompatibel. Viele CAN-Analsator-Programme (darunter auch MKT's eigenes CAN-Logger-Utility) unterstützen dieses Format. Der in einigen Geräten mit 32-Bit-CPU integrierte CAN-Snooper (z.B. MKT-View II / III / IV) kann den Verkehr auf dem CAN-Bus direkt in diesem Format aufzeichnen.

Diese Funktion eignet sich zum Testen von Display-Applikationen, selbst wenn kein geeignetes CAN-Interface, oder/und keine geeignete Hardware zur Verfügung steht.
Für komplexere Anwendungen (die nicht mit dem einfachen 'Abspielen' eines vorher aufgezeichneten Logfiles mit festem Inhalt getestet werden können, z.B. weil höhere CAN-Protokolle abgewickelt werden müssen) bietet sich ein externer scriptfähiger CAN-Tester, oder der im Programmiertool implementierte CAN-Bus-Simulator an.

Starten des CAN-Logfile-Players
Um das Tool zum Abspielen von CAN-Logfiles zu starten, wählen Sie im Hauptmenü
'Werkzeuge' ...
CAN-Logfile abspielen (für Simulator)

Es erscheint eine Dateiauswahlbox, mit deren Hilfe Sie den Typ, Quellpfad und Namen der abzuspielenden CAN-Datei auswählen. Der Default-Typ ist 'Vector ASCII Logfiles / *.asc'.

Nach dem Auswählen der CAN-Datei öffnet sich ein kleines Fenster mit dem Titel 'Logfile abspielen':

screenshot of the 'Logfile Replay Utility'

Mit dem 'Play'-Button im Video-Recorder-Stil [►] wird die Wiedergabe gestartet, d.h. CAN-Messages werden aus der Datei gelesen und in den CAN-Empfangs-Puffer injiziert.
Optional kann die Datei auch in einer Endlosschleife abgespielt werden (Loop-Modus). Dies ist hilfreich, wenn die Aufzeichnung nur wenige Sekunden lang ist, was zum Testen aller Display-Seiten kaum ausreichen würde.

Die Zuordnung von CAN-Bus-Nummern im abgespielten Logfile und der CAN-Interface-Nummer im simulierten Gerät (i.A. beim MKT-View nur 1 oder 2) kann im Fenster des Logfile-Players geändert werden (siehe Screenshot, "Source Channel for Bus 1" = 1", "Source Channel for Bus 2" = 2). Wenn nötig, können bis zu vier Quell-Kanäle, per Komma getrennt, definiert werden. Per Default werden Telegramme, die im Vector-ASC-Log mit der Kanalnummer 1 aufgezeichnet wurden, bei der Simulation an "CAN1" (im simulierten MKT-View), und Telegramme mit Kanalnummer 2 (im Vector-ASC-Log) an "CAN2" wiedergegeben, und von der simulierten Gerätefirmware entsprechend decodiert.

Während der Wiedergabe können die simulierten 'empfangenen' CAN-Telegramme optional auch auf der Registerkarte 'Fehler und Meldungen' angezeigt werden. Setzen Sie dazu die Option 'RX - Telegramme'.

Unterdrücken bestimmter CAN-Messages im Logfile-Player
Bestimmte Telegramme können bei der Wiedergabe im Logfile-Player unterdrückt werden (z.B. CAN-Telegramme mit bestimmten Identifiern, die zwar in der Aufzeichnung enthalten sind, die aber bei der Simulation stören würden). Geben Sie dazu die CAN-Message-Identifier in hexadezimaler Form im Feld 'Reject (Rx,Tx,id)' auf dem Panel des Logfile-Players ein. Sind mehrere Einträge nötig, trennen Sie diese per Komma. Darüberhinaus können durch Eingabe von 'Tx' in diesem Feld alle im (Vector-ASCI-)Logfile als 'Tx' (gesendet) markierte Messages unterdrückt werden, und durch Eingabe von 'Rx' alle als 'Rx' (empfangen) markierten Messages. Beispiel:

    Reject(Rx,Tx,id):   0x1CFECBFF, Tx

Unterdrückt alle CAN-Messages mit dem (29-Bit-)Identifier 0x1CFECBFF, und alle Telegramme die in der abzuspielenden Log-Datei mit der Übertragungsrichtung 'Tx' (d.h. aus Sicht des aufzeichnenden Gerätes 'gesendet') markiert sind.

Automatischer Stopp des Logfile-Players bei gestopptem Script
Der eingebaute CAN-Logfile-Player wird automatisch gestoppt, wenn während eines Script-Debugger-Laufs das Script per Haltepunkt (Breakpoint) angehalten wird. Auch bei danach folgenden 'Einzelschritten' im Script-Debugger (F7 = single step) bleibt der CAN-Logfile-Player passiv. Erst wenn das Script per Debugger weiterlaufen darf (F9 = run), arbeitet auch der CAN-Logfile-Player weiter (an der Position, an der er zuvor gestoppt wurde).
So wird vermieden, dass sich bei gestopptem Debugger ein unrealistischer 'Stau' im CAN-Empfangs-Puffer des simulierten Gerätes bildet.
Darüberhinaus vereinfacht dieses Verhalten die Fehlersuche beim Implementieren eigener CAN-Empfangs-Handler, denn so kann (nachdem z.B. das Script den zum empfangenen CAN-Telegramm passenden Handler aufgerufen hat) auf der Registerkarte 'Fehler und Meldungen' das zuletzt vom CAN-Logfile-Player abgespielte CAN-Telegramme am Ende der Liste identifiziert werden.

CAN Message Generator / CAN-Simulator

Der CAN-Message-Generator / CAN-Simulator kann zum Testen der Display-Applikation CAN-Messages intern in die Simulation einspeisen, oder (optional, mit geeignetem Interface) diese auch auf einem 'echten' CAN-Bus senden. Messages werden automatisch anhand von Signal-Definitionen aus einer Datenbank (oder aus der Display-Applikation) zusammengestellt; Signalwerte können z.B. per Stimulus (Funktion) oder mit einer SPS-ähnlichen Programmierung erzeugt werden. Details zum CAN-Simulator finden Sie in einem separaten Dokument (CANSimulator_49.htm).

Wireshark-kompatible 'Packet Capture'-Funktion

Wireshark ist ein Programm zur Analyse von Datenpaketen, d.h. Netzwerk-Traffic wie z.B. Ethernet. Es eignet sich zum Aufspüren von Netzwerkproblemen, kann TCP/IP-Sitzungen 'decodieren' (lesbar machen), das Timing analysieren, usw.
In der Firmware vieler MKT-Geräte ist eine Funktion zum Aufzeichnen von Ethernet- und CAN-Frames in einem Wireshark-kompatiblen Format (pcapng) implementiert, so daß alle -aus Sicht des Gerätes- empfangenen und gesendeten Pakete bequem per Wireshark analysiert werden können.
(Sie könnten mit dem auf dem PC laufenden Wireshark zwar ebenfalls PCAPNG-Dateien aufzeichnen und ggf nach MAC- oder IP-Adressen filtern, die Information welche der Pakete -aus Sicht des Terminals- empfangenen und gesendeten wurden, wäre so leider nicht möglich, da eine auf dem PC installierte Ethernet-Capture-Funktion i.A. nicht die 'Übertragungsrichtung' erkennen kann).

Abhängig von der Gerätekonfiguration (am Gerät: "Main System Menu" .. "Diagnostics" .. "Ethernet Capture") kann der 'Packet Capture'-Puffer sowohl mit empfangenen und gesendeten Ethernet-Paketen, oder / und mit CAN-Bus-Telegrammen 'gefüttert' werden.
(Wireshark unterstützte in Version 1.12.0 in begrenztem Rahmen nicht nur Ethernet, sondern auch CAN / CANopen).
Steht Wireshark nicht zur Verfügung, dann kann der Ethernet-Traffic (mit weniger Komfort) auch direkt am Gerät, oder -per Embedded Web Server- als HTML im Internet-Browser beobachtet werden. Die folgenden Screenshots zeigen den gleichen Ausschnitt aus dem Capture-Puffer, links im Web-Browser, rechts in Wireshark (V 1.12.0):


Browser-Screenshot mit 'Ethernet Packet Capture'.
Zum Vergrößern in das Bild klicken.



'Echte' Anzeige in Wireshark mit dem gleichen Daten.
Zum Vergrößern in das Bild klicken.
Wireshark hat hier in Paket #31 eine 'TCP Retransmission' erkannt.
Die im Gerät integrierte Anzeige (im linken Screenshot) bietet diese Funktion nicht.

Bei der Anzeige von CAN-Telegrammen im Web-Browser oder auf dem geräteeigenen Display wird die Übertragungsrichtung durch die Hintergrundfarbe markiert:
    Blau :   Aus Sicht des Gerätes empfangene CAN-Telegramme,
    Grün :   Vom Gerät in das Netzwerk gesendete CAN-Telegramme.
Im Gegensatz zu Wireshark wird der CAN-Message-Identifier hier nicht im 'Info'-Feld, sondern in der Spalte 'Source' (= Quelle bei empfangenen Frames, blau) oder in der Spalte 'Destination' (= Ziel bei gesendeten Frames, grün) angezeigt. 11-Bit-Identifier werden hexadeximal mit 3 Ziffern angezeigt, 29-Bit-Identifier mit 8 Ziffern. Im 'Info'-Feld wird nur das CAN-Datenfeld angezeigt (maximal 8 Bytes, hexadezimal ohne Prefix). Beispiel:
Packet Capture Status : Running, captured 5 packets .

    No.    Time    Source            Destination     Prot Length Info
    1     0.00000                   CAN1:0x07B        CAN    8  00 02 03 04 05 06 07 08              
    2     0.13405 CAN1:0x000003FF                     CAN    8  05 44 4C 34 59 48 46 20              
    3     0.43712                   CAN1:0x07B        CAN    8  01 02 03 04 05 06 07 08              
    4     0.53385 CAN1:0x000003FF                     CAN    8  05 44 4C 34 59 48 46 20              
    5     3.12532 192.168.0.206     192.168.0.234     TCP  117  TX "HTTP/1.0 200 OK\r\nContent-Type:"

Die direkt in der Gerätefirmware implementierte Umwandlung (von PCAPNG nach HTML) bietet nicht die von Wireshark bekannten Features (Hunderte von Protokollen, Fehlererkennung, interaktives Inspizieren einzelner Felder, etc..). Verwenden Sie daher -wenn möglich- das Programm Wireshark zur Analyse der Aufzeichnung (als PCAPNG).
Anwenderfreundliche Browser (wie Firefox) können so konfiguiert werden, dass die beim Öffnen einer PCAPNG-Datei diese auf der Festplatte speichern, und danach automatisch Wireshark starten, der dann innerhalb weniger Sekunden die zu analysierende Aufzeichnung (capture.pcapng) lädt und analysiert.

Details zum Auslesen des Capture-Puffers per HTTP-Server (als Datei "capture.pcapng") finden Sie hier (externer Link zur MKT-Dokumentation).

Einige Tipps zur Arbeit mit Wireshark:
  • Suche nach 'Aussetzern', z.B. bei periodisch übertragenen CAN-Telegrammen:
    Verwenden Sie einen Filter wie z.B. "frame.time_delta > 0.1", um alle Telegramme anzuzeigen, die nach einer Pause von über 100 Millisekunden (seit dem letzten empfangenen "Paket") empfangen wurden.
    Da das Filtern nach einem bestimmten CAN-Message-Identifier in Wireshark aufwändig ist (oder zumindest war), schalten Sie die Option 'any ID' per Web-Browser vor dem Start der Aufzeichnung ab.
    Ohne die Option 'any ID' werden im Packet Capture nur CAN-Frames mit Identifiern aufgezeichnet, die z.B. von Ihrer Applikation per Script für den Empfang registriert wurden, oder die per DBC-Import mit Display-Variablen verknüpft sind.

Siehe auch:
    Übersicht zum Thema Debugging;
    Anzeige 'Fehler & Meldungen' mit Trace-Historie;
    CAN-Funktionen in der Script-Sprache;
    Gesamt-Übersicht .



CANopen-Konfiguration

Nicht für Terminals mit ausschließlicher "CANdb"-Funktionalität wie z.B. MKT-View

Auf der Registerkarte "CANopen" können einige CANopen-spezifische Einstellungen definiert werden, die nicht zur PDO- und SDO- Funktionalität zählen. Im Moment können hier die folgenden Komponenten von CANopen definiert werden:

  SYNC - Message
  NMT - Funktionalität
  SDO-Client-Kanäle (Button zum Umschalten auf eine weitere Registerkarte)
  SDO-Server-Kanäle
  PDO-Kanäle

Siehe auch (zum Thema 'CANopen') : Programmierbare Terminals mit "CANopen V4"

Konfiguration des SYNC-Telegramms

CANopen verwendet das sog. SYNC-Telegramm um die Übertragung von Prozeßdaten (PDOs) zu synchronisieren. Das UPT kann SYNC-Telegramme senden (transmit, "produce") und empfangen (receive, "consume") wenn nötig. Das Verhalten des UPT's in Bezug auf SYNC-Telegramme kann auf einem speziellen Panel unter "CANopen"-Konfiguration definiert werden.

NMT Konfiguration (CANopen network management)

CANopen verwendet das NMT-Protocol um alle Knoten im CANopen-Netzwerk zu steuern. NMT-Objekte (objects) werden verwendet um NMT-Dienste (services) auszuführen bzw. deren Ausführung zu veranlassen. Mit Hilfe vom NMT-Diensten, können CANopen-Knoten initialisiert, gestartet, überwacht, zurückgesetzt(reset) oder gestoppt werden. Alle Knoten werden als NMT-Slaves aufgefaßt.
NMT erfordert, daß ein Gerät im Netzwerk die Funktion des NMT masters übernimmt..

Mehr Information über NMT services finden Sie in CANopen DS301 V4.0, Kapitel 9.2.6.1.

Das UPT kann entweder NMT-Master oder NMT-Slave sein, aber nicht beides zur gleichen Zeit. Das Verhalten des UPTs bezüglich NMT kann auf einem speziellen Steuerpanel unter der "CANopen"-Konfiguration eingestellt werden. Momentan unterstützt die im UPT eingebaute NMT-Funktion nur das sogenannte "minimum NMT bootup" , kein "extended bootup" !! (Falls Sie nicht wissen, was das ist, werden Sie es vermutlich nicht brauchen. Wenn das UPT als NMT-Master konfiguriert ist, kann es einen "Start Remote Nodes"-broadcast nach einer einstellbaren "Bootup-Zeit" senden, beginnend mit dem Einschalten der Versorgungsspannung des UPTs).

  Siehe auch:

zurück zum Inhaltsverzeichnis


Übertragung der Applikation ins das Zielsystem

Nach Erstellen und Testen der Applikation kann diese in das Ziel (Programmierbares Display) übertragen werden. Beim UPT515 ging dies mangels geeigneter Schnittstellen nur per CAN, bei anderen Terminals (z.B. MKT-View) stehen auch andere Schnittstellen dazu zur Verfügung, z.B. RS-232 oder Ethernet .

Abhängig von der verfügbaren Hardware sind die folgenden Übertragungswege / Methoden zwischen Programmiertool und programmierbarem Gerät möglich :

  1. Aktualisieren der Display-Applikation per Speicherkarte
  2. Übertragen der Applikation in das Terminal per CAN oder RS-232
  3. Firmware-Update
  4. Übertragen anderer Dateien (mit dem File-Transfer-Utility)
  5. Fernsteuerung (besonders wichtig für Geräte ohne Tastatur)
  6. Übertragung per Ethernet / LAN ( UDP ) mit dem Programmiertool
  7. Übertragung von Dateien per Web-Browser (externer Link)
  8. Auffinden von MKT-Geräten am Ethernet-LAN (mittels DHCP-Server)
  9. Automatische Aktualisierung des Anzeigeprogramms per FLASH-Speicherkarte

Übertragen der Applikation per Speicherkarte

Bei Geräten mit FLASH-Speicherkarte (MKT-View Plus, MKT-View II / III) empfiehlt es sich, die Applikation als Datei (*.upt bzw *.cvt) per Speicherkarte vom PC zum Terminal zu übertragen. Speziell bei "grafiklastigen" Applikationen mit großen, farbigen Bitmaps, oder komplexen Anwendungen mit großen Scripten ist diese Art der "Übertragung" wesentlich schneller als die Übertragung per CAN oder RS-232 .

Speichern Sie dazu zunächst die Applikation (*.cvt bzw. *.upt bei Geräten mit CANopen) im Wurzelverzeichnis der Speicherkarte ab. Setzen Sie die Speicherkarte in das zu programmierende Gerät ein, und rufen dort das System-Menü auf (bei den meisten Geräten durch gleichzeitiges Drücken der zweiten und dritten Funktionstaste). Wählen Sie dort 'Load program from FILE', und wählen Sie die zu ladende Datei im Wurzelverzeichnis der Speicherkarte aus. Das Gerät bootet nach dem Umkopieren von der Karte in den geräteeigenen Flash-Speicher neu. Die Karte kann dann wieder entnommen werden.

Übertragen der Applikation per CAN, RS232, Ethernet

Für die Übertragung der Applikation verbinden Sie zunächst das Terminal über ein geeignetes Interface bzw. Kabel mit dem PC. Beim UPT515 muß die Übertragung per CAN erfolgen, bei anderen Terminals stehen auch andere Schnittstellen zur Verfügung (siehe Unten).

Übertragung per CAN / CANopen
Bei der Übertragung per CAN muß das Zielsystem eventuell manuell (per Systemmenü) in den Übertragungsmodus geschaltet werden. Rufen Sie dazu im Terminal das Systemmenü auf, und wählen dann (bei älteren Geräten) "Program Upload via CAN" bzw. (bei neueren Gräten) erlauben Sie den Transfer, indem Sie im 'Main System Menu' die Option 'Transfer via CAN' auf 'Auto' oder 'ON' setzen. Bei Geräten mit SDO-Server (z.B. UPT515) kann dieser Schritt entfallen, denn das Programmiertool kann in diesem Fall das Terminal per SDO in den Übertragungsmodus schalten.

Ähnliches gilt für die Übertragung per RS-232: Da die RS-232-Schnittstelle aber oft von der Applikation verwendet wird, muss in diesem Fall der 'normale' Datenfluss unterbrochen werden, um die RS-232-Schnittstelle für die Dateiübertragung nutzen zu können. Wählen Sie dazu im 'Main System Menu' das Untermenü 'Other Transfers ...', und dort die Funktion 'Transfer via RS232 (SLAVE)'.

Die im Gerät aktuell verwendete Baudrate (für CAN bzw. RS-232) wird nach dem Umschalten in den Transfer-Modus im Display angezeigt, z.B.:

Transfer mode active
 Receiving PROGRAM
 RS232/3964R: 19200 bit/sec

Hinweis: Eine einheitlichen 'Defaultwert' gibt es für die Baudrate der seriellen Schnittstelle nicht.
Die Baudrate könnte z.B. durch das Anzeigeprogramm per Interpreterbefehl oder per Script-Kommando umgeschaltet worden sein. Beim oben beschriebenen Aktivieren des Übertragungsmodus erfolgt keine Umschaltung der Baudrate - weder für CAN, noch für RS-232. Aus diesem Grund wird auf dem Display die momentan verwendete Baudrate angezeigt. Siehe auch: Einstellung der Baudrate für die serielle Schnittstelle auf der PC-Seite.

Falls das Terminal nur mit CANdb-Funktionalität, aber nicht mit CANopen ausgerüstet ist, muß aus oben genannten Gründen das Gerät manuell in den "Transfer-Modus" geschaltet werden. Gehen Sie dazu wie folgt vor:

  • Rufen Sie das Systemmenü im Terminal auf (üblicherweise durch gleichzeitiges Drücken der 2. und 3. Funktionstaste)
  • Bewegen Sie den Markierungsbalken auf den Menüpunkt "Transfer via CAN = xx", und drücken dann Enter (bzw den Drehknopf)
  • Schalten Sie von "Transfer via CAN = OFF" auf "Transfer via CAN = ON" (mit den Cursortasten bzw. dem Drehknopf)
  • Drücken Sie erneut Enter um die Eingabe abzuschließen, und verlassen Sie das Systemmenü.

Hinweis: Dieser Schritt ist in einem "generischen" CAN-Netzwerk nötig, weil die für die Kommunikation zwischen PC und Terminal verwendeten CAN-Identifier möglicherweise schon belegt sind, und das Terminal im Normalbetrieb nicht auf entsprechende CAN-Telegramme reagieren darf (um Kollisionen zu vermeiden). Bei Terminals mit CANopen-Protokoll besteht diese Gefahr nicht, denn dort wird das Programm per CANopen-SDO (service data object) übertragen - was immer möglich ist, weil der Default-SDO-Kanal in einem CANopen-Knoten immer aktiv ist. Details zur Übertragung per CAN (ohne CANopen) finden Sie in einer externen Datei.
Die oben aufgeführten Schritte können entfallen, wenn der 'Transfer via CAN' dauerhaft auf "ON" oder "AUTO" gesetzt wurde (z.B. "Transfer via CAN = ON", danach "Save and Exit" im Setup-Menü). Weitere Informationen zu den Einstellmöglichkeiten für den 'Transfer via CAN' finden Sie in Dokument Nr. 85115 im Kapitel Funktionen im Systemmenü.

Zum Start der Übertragung wählen Sie im Hauptmenü des Programmiertools die Funktionen

Transfer ...
Applikation ins Terminal laden .

Gegebenenfalls muss vor der Übertragung (einmal) eingestellt werden, auf welchem Weg das Programmiertool eine Verbindung zum programmierbaren Gerät herstellen soll. Wählen Sie dazu im Hauptmenü :

Transfer ..
Verbindungs-Parameter  ....  Medium ....  CAN bzw. Serieller Port ("COM")  oder UDP/IP (Ethernet) .

Falls das Programmiertool keine Verbindung mit dem Terminal aufbauen kann, überprüfen Sie das Interface bzw. Verbindungskabel, bei CAN eventuell fehlende Abschlußwiderstände, und die Kommunikationsparameter (Baudrate, Nummer der COM-Schnittstelle, Einstellungen des CAN-Interfaces).
Falls dies nicht zum gewünschten Erfolg führt, schalten Sie auf die Fehler-Anzeige-Seite des Programmiertools um. Eventuell helfen Ihnen die dort angezeigten Meldungen bei der Fehlersuche.

Wenn zum ersten Mal ein Programm per CAN-Bus zum Terminal gesendet werden soll, und dabei ein Fehler auftritt, liegt vermutlich ein (Installations-)Problem mit dem CAN-Interface vor. Lesen Sie unsere Hinweise zur Installation des CAN-Interfaces, und lesen Sie die vom Hersteller des CAN-Interfaces verfassene Dokumentation sorgfältig(!) .

Zur Übertragung zwischen PC und Terminals ohne CANopen-Protokoll (z.B. "MKT-View") lesen Sie bitte auch dieses Dokument .

Kann bei der Übertragung per Ethernet keine Verbindung aufgebaut werden, könnte dies an einer ungültigen oder geänderten IP-Adresse liegen. In diesem Fall hilft as im Kapitel 'Auffinden von MKT-Geräten am Ethernet/LAN'.

Während der Übertragung wird sowohl die Software-Versions-Nummer des Programmiertools und die aus angeschlossenen Gerät ausgelesene Firmware-Versions-Nummer angezeigt. Im "Idealfall" sind beide identisch:

Weichen Haupt- oder Nebenversionsnummer voneinander ab (erste und zweite Zahl), wird dringend empfohlen, die Gerätefirmware wie hier beschrieben zu aktualisiern.
Weichen nur Revisions- oder Build-Nummer voneinander ab, dann stehen neu hinzugefügte Funktionen im Zielgerät möglicherweise nicht zur Verfügung, und ein im Programmiertool (Simulator) lauffähiges Programm funktioniert nicht (oder nicht vollständig) im Zielgerät. Eine Übersicht der Software-Versionen mit den letzten Software-Erweiterungen finden Sie hier (auf der MKT-Webseite).

Bestimmte Geräte wie z.B. das "MKT-View" müssen / können(?) über die serielle Schnittstelle geladen werden. Eventuell ist auch die schnellere Übertragung des Programms mit Hilfe einer Compact Flash - Speicherkarte möglich (beim "MKT-View +" mit Logger-Firmware und PCMCIA-Slot, siehe Feature Matrix).
Dazu muß der PC allerdings über einen Memory Card Reader / Writer verfügen, mit dem Sie die benötigten Dateien (*.upt, *.cvt) auf die Speicherkarte überspielen können. Die Datei kann dann manuell im Systemmenü ausgewählt werden ('Load Program from File'), bzw. kann sogar automatisch von der Speicherkarte geladen werden (-> "Autoload").

Bei der Entwicklung von fortschrittlichen Applikationen (mit Scripten) kann der Entwicklungszyklus, d.h. Bearbeiten-Übertragen-Testen, beschleunigt werden, indem das Programm vom Programmiertool aus nicht in den Flash-Speicher des Zielsystems, sondern nur in dessen Hauptspeicher (RAM) geladen wird. Dadurch entfällt die Zeit zum Löschen und Neuprogrammieren des Flash-Speichers, die je nach Hardware zwischen 10 und 60 Sekunden liegen kann. Details zur Script-Entwicklung, und zum "Transfer OHNE zu Flashen" finden Sie in der Dokumentation der Script-Sprache.

Andere Geräte ( z.B. 'MKT-View II' ) verfügen zusätzlich über eine universelle Datei-Transfer-Schnittstelle, basierend auf YModem (?). Damit können beliebige Dateien in den internen FLASH-Speicher des Terminals geladen werden, oder auf die FLASH-Speicherkarte kopiert werden. Als Übertragungsmedium kann die serielle Schnittstelle (RS-232), der CAN-Bus, oder auch Ethernet / UDP verwendet werden .

Treten während (oder kurz nach) der Übertragung Probleme im angeschlossenen Gerät auf, so werden diese im Programmiertool in einem neuen Meldungsfenster angezeigt:


Kurz nach der Programm-Übertragung angezeigtes Meldungsfenster
mit von der Gerätefirmware erzeugtem Klartext (in englischer Sprache)

Beispiele für von der Gerätefirmware während der Programmübertragung gemeldeter Fehler oder Warnungen:
  • Couldn't save var-defs
    Die Variablen-Definitionen konnten nicht (oder nicht komplett) im Zielsystem gespeichert werden.
    Ursache könnte ein zu kleiner Flash-Baustein oder ein Hardwareproblem sein (Flash-Speicher).
  • Couldn't save global event-defs
    Die globalen Event-Definitionen konnten nicht im Zielsystem gespeichert werden.
    Mögliche Ursachen ähnlich wie bei anderen "Couldn't save"-Fehlern ...
  • Couldn't save the page-array
    Die anwenderdefinierten Display-Seiten konnten nicht im Zielsystem gespeichert werden.
  • Couldn't save general settings
    Die 'allgemeinen Einstellungen' konnten nicht gespeichert werden (s.O.),
    oder sind nicht mit dem Zielsystem kompatibel.
  • Couldn't save user settings
    Die auch vom Anwender im 'Geräte-Setup' editierbaren Einstellungen (User Settings) konnten nicht gespeichert werden.
    Da diese (im Gegensatz zu vielen anderen Konfigurationselementen) bei den meisten Geräten nicht im Flash-Speicher sondern in einem EEPROM gespeichert werden, könnte als Ursache auch ein defektes EEPROM in Frage kommen. Überprüfen Sie die Einträge in der 'Error History' des Zielsystems (erreichbar per System-Menü). Steht dort z.B. "EEPROM verify error at adr..", handelt es sich mit hoher Wahrscheinlichkeit um einen Hardware-Fehler.
  • Couldn't save an icon in Flash
    Mindestens eines der selbstdefinierten Bitmap-Grafiken konnte nicht im Flash des Zielsystems gespeichert werden. Da ein Teil des Flash-Speichers als 'Laufwerk' (mit dynamischer Größe) verwaltet wird, kann dieses Problem manchmal durch das Neu-Formatieren der 'Flash-Dateien' behoben werden:
    Wählen Sie am Gerät im System-Menü die Funktion 'Diagnostic' / 'Erase Flash (data)',
    und versuchen danach erneut, Ihre Applikation zu übertragen.
    Notfalls ignorieren Sie den Fehler - die Applikation wird trotzdem laufen, lediglich einige der Grafiken werden möglicherweise nicht korrekt angezeigt.
  • Couldn't save Flash-shadow-RAM
    Dieser Fehler kann nur bei Geräten mit 'großem RAM aber kleinem Flash-Speicher' auftreten, oder bei Hardware-Defekten. Überprüfen Sie auch hier die Einträge in der 'Error History'.
  • Couldn't save PDO channel defs
    CANopen-spefizischer Fehler im Zusammenhang mit der Prozessdaten-Kommunikation.
  • Couldn't save SDO channel defs
    CANopen-spefizischer Fehler im Zusammenhang mit der Konfiguration von Service-Daten-Objekten.
  • Couldn't save CANopen-config
    CANopen-spefizischer Fehler aus 'anderen Gründen' (weder mit PDO noch SDO zusammenhängend).

Übertragung per Ethernet / LAN ( UDP )
Zum Übertragen der Display-Applikation (und evtl. weiterer Dateien) muss dem Programmiertool die IP-Adresse und Port-Nummer des zu programmierenden Gerätes bekannt sein. Per Default (da in einigen Netzwerken kein DHCP verfügbar war) verwendeten Anzeigegeräte wie das MKT-View II per Default eine die statische IP-Adresse, und für die Programm-Übertragung UDP-Port-Nummer 55556. Abhängig von der Netzwerk-Konfiguration (siehe Screenshot) kann die IP-Adressese auch per DHCP oder openABK-'Discovery' ermittelt werden.

Zum Eingeben der IP-Adresse und Port-Nummer wählen Sie die Funktion Transfer .. Verbingungs-Parameter .. Remote IP (im Hauptmenü des Programmiertools), und geben die Adresse des zu programmierenden Gerätes ein. Das Format für die Eingabe ist <IP byte 1>.<IP byte 2>.<IP byte 3>.<IP byte 4> :  <Port-Nummer>. In einigen Fällen (mit DNS/DHCP) kann statt der numerischen IP(v4)-Adresse auch der Hostname vor dem Doppelpunkt verwendet werden.
 
 NETWORK SETUP (7) NAV
 MAC: 00-50-C2-8E-70-03
 Name : MKTVIEW3
 DHCP : disabled (static IP below)
  IPaddr: 192.168.000.242
 Local TCP Server Ports
   HTTP:80 TN:23 FTP:21 VNC:5900  
 CAN via UDP : SERVER
   Remote IP:192.168.000.242
   Ports: R=55556 L=55556

( Eingabe der Remote-IP-Addresse und Portnummer im Programmiertool.
Diese können in den Netzwerk-Einstellungen des 'entfernten' (remote) Gerätes
ausgelesen werden, wie in der Abbildung links zu sehen ist. )


Falls der Entwicklungs-PC über mehrere Netzwerk-Schnittstellen verfügt (z.B. Netzwerkkarte und USB-Ethernet-Adapter), dann kann die lokale IP-Addresse der zu verwendenden Ethernet-Schnittstelle ausgewählt werden. Klicken Sie dazu im Hauptmenü des Programmiertools auf
    Transfer .. Verbindungsparameter .. Local IP.
Wählen Sie danach in der Liste die PC-seitige IP-Adresse des Ethernet-Adapters aus, an dem das zu programmierende Gerät angeschlossen ist. Wenn der PC nur über eine einzige Ethernet-Karte (und über keine weiteren IP-fähigen Schnittstellen wie z.B. WLAN) verfügt, dann enthält diese Liste nur einen einzigen Eintrag.

Hinweis:
Um eine Punkt-zu-Punkt-Verbindung per Ethernet-Kabel (ohne weitere Teilnehmer) aufzubauen, muss trotz statischer IP-Adresse in einigen Fällen die physikalische Verbindung hergestellt werden, bevor Windows der Schnittstelle eine gültige lokale IP-Adresse zuweist. Die oben abgebildete Liste mit 'lokalen IP-Adressen' wird nur einmal, beim Öffnen des Dialogfensters aktualisiert !
Hat das MKT-View z.B. die per DHCP geleaste IP-Adresse 192.168.25.143, dann ist das Gerät nur im Netzwerk beginnend mit 192.168.25 (*) erreichbar. Technischer Hintergrund: In den Netzwerk-Einstellungen des PCs ist die Subnetz-Maske oft auf 255.255.255.0 eingestellt, d.h. die ersten drei Bytes der IPv4-Adresse "müssen passen".
Unter Windows 10 funktionierte in einigen Fällen die Übertragung per UDP nicht, obwohl ein Verbindungstest per "Ping" erfolgreich war. Als Alternative bietet sich in derart 'hartnäckigen' Fällen die Übertragung per HTTP ('File Upload' mit Hilfe eines Internet-Browsers) an. In fast allen Fällen funktioniert dann auch die Adressierung des Gerätes per Host-Namen (statt numerischer IP-Adresse) - wenn der Web-Browser nicht nach dem Hostnamen 'googelt', statt ihn einfach aufzurufen.


Ferner muss die IP-Adresse oder der Hostname des zu programmierenden (bzw des fernzusteuernden) Gerätes angegeben werden.
Bei Verwendung einer statischen IP-Adresse (im MKT-View) ist dies trivial: Die Adresse kann direkt im 'Network Setup' des Gerätes ausgelesen werden ('IPaddr').
Bei Verwendung einer dynamisch (per DHCP) zugewiesenen IP-Adresse kann diese mit der Funktion 'Transfer'..'MKT-Geräte im lokalen Netz (Ethernet) finden' ermittelt werden, oder notfalls wie unten beschrieben durch Auslesen der momentan verwendeten IP-Adresse am Gerät :
 Main system menu (9)
 EXIT !
 Load program from FILE
 Transfer via CAN = OFF/Auto
 Other transfers ... ▶
 Audio Recorder
 CAN snooper mode
 CAN logger config
 User Settings
 System Setup / Unlock
 System Test
  Network Setup                
 Diagnostics
 General Settings
 ...
 NETWORK SETUP (7) NAV
 MAC: 00-50-C2-8E-70-03
 Name : MKTVIEW3
 DHCP : enabled (dymanic IP below)
  IPaddr: 192.168.000.112
 Local TCP Server Ports
   HTTP:80 TN:23 FTP:21 VNC:5900  
 CAN via UDP : SERVER
   Remote IP:192.168.000.242
   Ports: R=55556 L=55556
 F3: Save & Exit [↑] [↓]


 

( Ermitteln der IP-Adresse im MKT-View bei Verwendung von DHCP.
Grau markierte Einträge im Feld 'IPaddr' bedeuten 'nicht editierbar'.
Sie zeigen in diesem Fall die momentan geleaste IP-Adresse an. )


UDP-Port 55556 wird im Terminal nicht nur für die Dateiübertragung, sondern auch für das CAN-via-UDP-Protokoll verwendet. Der Eintrag bei 'CAN via UDP' muss daher auf SERVER gesetzt sein (siehe Screenshots). Dieser Server ist in den meisten Geräten von MKT Systemtechnik integriert, er dient normalerweise nur als Ersatz für eine physikalische CAN-Schnittstelle (Details dazu online in der MKT-Dokumentation 'CAN-via-UDP').
Das 'Vorhandensein' des CAN-via-UDP-Servers in der Firmware bedeutet allerdings nicht, daß dieser auch aktiv ist ! Der Server könnte z.B. aus Sicherheitsgründen (per Network Setup) deaktiviert sein. Hier eine typische Konfiguration im MKT-View III, Oktober 2015:
 NETWORK SETUP (27) NAV
 MAC: 00-50-C2-8E-70-03
 Name : MKTVIEW3
 DHCP : disabled (static IP below)
  IPaddr: 192.168.000.242
  Subnet: 255.255.255.000
  Gatew.: 192.168.000.254
 Local TCP Server Ports
   HTTP:80 TN:23 FTP:21 VNC:5900  
 CAN via UDP : SERVER
   Remote IP:192.168.000.234
   Ports: R=55556 L=55556
 F3: Save & Exit [↑] [↓]

Typische CAN-via-UDP - Konfiguration   und   Netzwerk-Einstellungen im MKT-View III

Beim Verbindungsaufbau per Ethernet (UDP/IP) könnte dieser durch eine übervorsichtige 'Internet Security Suite', oder durch die Windows-Firewall blockiert werden. In manchen Fällen fragt die Software gnädigerweise, ob Sie (als Bediener) den Zugriff erlauben. Typischerweise erscheint dann eine Meldung wie "XYZ is trying to act as an internet server" - was hier in keinster Weise zutrifft..). Beispiel:

Andere Beispiele :

  • "Eine Anwendung, die als Internetserver fungiert, hat sich seit der letzten Ausführung verändert." (after program updates)
  • "ctptwin1.exe (or uptwin2.exe) is trying to access the internet / act as a server / etc" .  

Erlauben Sie dem Programm in diesem Fall gnädigerweise, "als Internetserver" zu agieren (mit einem Internet-Zugriff hat dies nichts zu tun, es ist lediglich ein Austausch von UDP über das lokale Netzwerk).

Details zum Network-Setup (Netzwerkkonfiguration) finden Sie in Dokument Nr. 85115, "System Setup" (PDF, für Anwender) .
Das Protocol (auf Basis von UDP/IP) ist in Dokument #85140, "CAN via UDP" beschrieben (PDF, für Entwickler) .
Für die Übertragung anderer Dateien per Ethernet verwenden Sie das 'File Transfer Utility / Transfer via Ethernet' .

Siehe auch:
    Dateiübertragung per Web-Browser (HTTP; externer Link),
    Auffinden von MKT-Geräten am Ethernet/LAN (mittels DHCP-Server) .

Auffinden von MKT-Geräten am Ethernet/LAN (mittels DHCP-Server oder OpenABK-'Discovery')
In den meisten Fällen wird die IP-Adresse des zu programmierenden Gerätes, oder dessen Hostname bekannt sein; dann erübrigt sich die im Folgenden beschriebene Funktion zum 'Entdecken' von MKT-Geräten im lokalen Netzwerk. Wenn bekannt, geben Sie die IP-Adresse oder den Hostnamen (default: UPT) in der Adressleiste Ihres Web-Browsers ein, und fahren wie weiter Unten beschrieben fort .

Um ein MKT-Gerät im Ethernet-LAN zu 'entdecken', wählen Sie im Hauptmenü des Programmiertools die Funktion Transfer .. MKT-Geräte im lokalen Netzwerk (Ethernet) finden. Das daraufhin angezeigte Dialogfenster führt Sie schrittweise durch den unten gezeigten Ablauf. Funktioniert alles wie geplant, dann erkennt das Programm das neu eingeschaltete MKT-Gerät an dessen MAC-Adresse ("Ethernet-Adresse"), und zeigt die per DHCP zugewiesene IP-Adresse an (bzw. die per OpenABK-'Discovery'-Protokoll erkannten Geräte, die sich ebenfalls mit ihrer IP-Adresse melden sollten). Sie haben dananch die Möglichkeit, per Web-Browser eine Verbindung mit im Gerät integrierten Web-Server aufzubauen.

Schritt 1:
DHCP Server / OpenABK-'Discovery'
Diese Funktion dient zum Auffinden eines MKT-Gerätes im lokalen Netzwerk,
 ohne Kenntnis der IP-Adresse des MKT-Gerätes.

Im nächsten Schritt versucht dieses Programm, mit Hilfe des OpenABK-Discovery-
 Protokolls, oder per DHCP ein MKT-Gerät (z.B. MKT-View) zu finden.
 Dies muss eventuell erst in der Windows-Firewall erlaubt werden.

    Eventuell erhalten Sie im nächsten Schritt die folgende Meldung :
     'Die Windows-Firewall hat einige Funktionen dieses Programms blockiert.'
     Name:  ctptwin [= CAN-Terminal Programming Tool für Windows] .
    Erlauben Sie dann den Zugriff per Button  'Zugriff zulassen' . 

Klicken Sie auf 'OK', um dem Programmiertool zu erlauben, vorübergehend als 
DHCP-Empfänger und OpenABK-Client zu agieren.
Alternative: Falls aus einer älteren Sitzung noch IP-Adressen von MKT-Geräten
bekannt sind, können Sie sich mit einer dieser Adressen verbinden zu lassen.

Schritt 2:
Warte auf Empfang von DHCP-Paketen
Der DHCP-Server wurde erfolgreich gestartet, und wartet nun auf den Empfang 
eines 'DHCP-Discover'-Paketes von einem MKT-Gerät.

DAZU MUSS DAS MKT-GERÄT JETZT NEU EINGESCHALTET WERDEN.

Stellen Sie sicher, daß das Gerät per DHCP konfiguriert werden möchte, 
verbinden Sie das Gerät per Ethernet-Kabel mit dem PC, und schalten es ein.

Kurz nach dem Einschalten sollten die Kontroll-LEDs am Ethernet-Port 
aufleuchten, und der Empfang eines DHCP-Discover-Paketes sollte 
in diesem Fenster gemeldet werden.
Klicken sie auf 'Abbrechen', wenn Sie den Verbindungsaufbau abbrechen wollen.

Rx:DHCP-Request cip=192.168.0.106 mac=00:21:00:DD:19:A1   (etc)

Schritt 3:
MKT-Gerät wurde erkannt - Verbindung aufbauen ?
Ein DHCP-Server hat ein 'DHCP-Discover'-Paket von einem MKT-Gerät empfangen,
und diesem die IP-Adresse

    192.168.0.101

 zugewiesen.

Klicken sie auf 'Verbinden', um per Web-Browser eine Verbindung aufzubauen,
       oder 'Ok', um dieses Gerät als Zielsystem auszuwählen,
       oder 'Abbrechen', um dieses Fenster zu schliessen.

     ____________      ___________      ___________      ___________
    |            |    |           |    |           |    |           |
    |     OK     |    | Verbinden |    | Abbrechen |    |   Hilfe   |
    |____________|    |___________|    |___________|    |___________|

Der Button 'Verbinden' stellt eine Verbindung zwischen PC und dem programmierbaren Gerät per Web-Browser her.
Sie können z.B. per Web-Browser die Display-Applikation (*.upt bzw *.cvt), aber auch andere Dateien in das Gerät hochladen, einen Firmware-Update durchführen, das Gerät per TCP/IP fernbedienen, per Copy-and-Paste den aktuellen Bildschirminhalt 'abfotografieren', den aktuellen Inhalt von Variablen auslesen, die Trace-Historie inspizieren, usw.
Beispiel zum Übertragen von Dateien:

Alle Details zum in den meisten UPTs (und MKT-Views) integrierten Web-Server finden Sie hier (externer Link).
Das Default-Passwort für den Web-Server ist das gleiche wie beim Firmware-Update.

Der 'OK'-Button im weiter oben imitierten 'Discovery'-Fenster stellt keine Verbindung per Web-Browser mit dem Zielsystem her, sondern übernimmt das selektierte Gerät (bzw. dessen IP-Adresse) als neue 'Zieladresse' in die Konfiguration des Programmiertools.
Das UPT-Programmiertool kann z.B. die gefundene IP-Adresse verwenden, um die Display-Applikation (und andere Dateien) wie im vorherigen Kapitel beschrieben per UDP(!) oder TCP/IP in das Zielsystem zu laden.
Als (UDP-)Portnummer wird i.A. der Defaultwert (55556) eingestellt.
Anschließend kann (wenn im Zielsystem das CAN-via-UDP-Protokoll aktiviert ist) die Applikation wie gewohnt per Transfer ... Applikation ins Terminal laden in das Zielsystem übertragen werden.

OpenABK-'Discovery' (Protokoll zum Auffinden von IP-Adressen)
Neben dem im vorhergehenden Kapitel erwähnten 'Mitlauschen' von DHCP-Paketen können MKT-Geräte seit November 2015 auch per openABK-'Discovery'-Prokoll im lokalen Netzwerk gefunden werden. Das Programmiertool kann damit eine Liste mit den IP-Adressen aller vorhandenen Geräte erstellen, selbst wenn diese keine per DHCP zugewiesene dynamische, sondern eine statische IP-Adresse verwenden.
  ( Zur Erinnering: DHCP kann im 'Network Setup' am Gerät konfiguriert werden. )
Das Aus- und Wiedereinschalten des Gerätes (um das Senden einer DHCP-Abfrage zu erzwingen) ist beim Einsatz des 'Discovery'-Protokolls nicht mehr erforderlich.

Hinweis: Die hier beschriebene Funktionalität steht nur bei Geräten mit Firmware-Compilation-Datum 2015-11-26 (oder später) zur Verfügung.

Details zur Funktion und Verwendung des openABK-'Discovery'-Protokolls im Programmiertool finden Sie hier .


Siehe auch (zum Thema 'openABK') :
        Variablen mit Anbindung an 'openABK' im Programmiertool,
        openABK-Support für programmierbare Displays und Gateways von MKT Systemtechnik.

Automatische Aktualisierung des Anzeigeprogramms per FLASH-Speicherkarte

Beim Einschalten prüft die Firmware im Terminal, ob eine Speicherkarte eingesetzt ist, und ob auf dieser Karte eine bestimmte Datei vorhanden ist. Der Name dieser Datei ist :
  • "autoload.cvt" bei allen Terminals ohne CANopen (parametriert per CANdb, wie das ursprüngliche MKT-View)
  • "autoload.upt" bei allen Terminals mit CANopen (z.B. die "UPT2"-Familie)

Falls die Datei mit dem oben angegebenen Namen gefunden wird, wird deren DOS-Dateidatum und -Uhrzeit mit der aktuell im Terminal geladenen Applikation verglichen. Weichen Datum oder Uhrzeit ab, lädt die Firmware automatisch die Datei von der Karte und überschreibt damit Inhalt des onboard-FLASH-Speichers. Diese Funktion kann z.B. verwendet werden, um Ihrem Kunden (oder einem "ungeschulten Bediener") eine komplette Konfiguration per Speicherkarte zukommen zu lassen, mit dem Hinweis: "Stecken Sie diese Karte in das Terminal (bei abgeschalteter Spannung), dann starten Sie und beginnen mit der Testfahrt". Dazu können Sie auch die passende Konfigurationsdatei für den CAN-Logger mit auf die Karte packen. Das Terminal erledigt dann den Rest automatisch, ohne daß der Bediener eine einzige Taste drücken muss um die neue Applikation zu laden.



Firmware-Update

Beim Überspielen der "Applikation" in das Terminal könnte das Programmiertool anzeigen, daß die Firmware im Terminal zu alt ist. In diesem Fall sollten Sie ein Firmware-Update durchführen, um die Kompatibilität zwischen Programmiertool und programmierbarem Terminal zu gewährleisten.

Eine kurze Anleitung zur Durchführung des Updates finden Sie im Firmware-Verzeichnis in der Datei fwupdate.htm . Dort finden Sie auch das Paßwort, welches Sie für die Übertragung eingeben müssen (z.B. "s...... ..t", das Paßwort kann aber geräteabhängig sein) .

Vor dem Firmware-Update lesen Sie bitte auch die Firmware-Release-Notes sorgfältig. Dort sind evtl. hardwarespezifische Einschränkungen beschrieben, die Sie im allgemeinen Handbuch des Programmiertools nicht finden werden !

Bei alten Geräten (z.B. UPT ohne Speicherkarte und CAN-Bootloader) wählen Sie anschließend im Menü "Transfer" des Programmiertools die Funktion "FIRMWARE per RS-232 aktualisieren". Das Programmiertool wird Sie daraufhin nach dem Paßwort fragen, welches Sie in der oben erwähnten Anleitung gefunden haben.

Hinweise:

  • Bei entsprechend ausgestattetem Geräten empfehlen wir den Firmware-Update per Speicherkarte.
  • Ein Update per RS-232 ist zwar in vielen Fällen möglich (aber quälend langsam), die entsprechende Funktion kann aus dem Hauptmenü des Programmiertools unter 'Transfer' aufgerufen werden.
  • Für einen Firmware-Update per CAN wird ein externes Programm (CAN-Tester für Windows) benötigt, und ein geeignetes CAN-Bus-Interface für den PC, welches in vielen Fällen nicht zur Verfügung steht.
  • Bei Geräten mit 'großem' Hauptspeicher und integriertem Web-Server kann die Firmware auch per TCP/IP (HTTP) im Hintergrund, d.h. ohne langwierige Unterbrechung des Normalbetriebs aktualisiert werden. Die Firmware-Datei (*.BI2) wird dabei zunächst komplett(!) in den Hauptspeicher des Gerätes (RAMDISK) hochgeladen, bevor die Umprogrammierung des FLASH-Speichers starten kann.
    Details finden Sie in der Beschreibung des HTTP-Servers .
  • Die Firmware im UPT515 kann nur per CAN-Bus aktualsisiert werden, weil das Gerät keine serielle Schnittstelle enthält. Zum Firmware-Update per CAN benötigen Sie ein altes DOS-Programm von MKT. Weitere Informationen finden Sie in der Datei fwupdate.htm.
  • Brechen Sie den Firmware-Update niemals ab ! Starten Sie während der Übertragung keine anderen Programme, um die Gefahr eines PC-Absturzes zu "minimieren". Zur Not müssen Sie den im Terminal eingebauten Bootloader beim Einschalten durch Drücken der ersten und dritten Funktionstaste manuell aktivieren, und den Firmware-Update wiederholen.
  • Für Geräte mit ARM-CPU (z.B. MKT-View II, seit 11/2008) wird zur Ablage der Firmware nicht mehr das HEX-Format ("Intel Hex") verwendet, sondern ein platzsparenderes, segmentiertes Binärformat mit der Dateinamenserweiterung "BI2" . Achten Sie darauf, dass Sie beim Laden der Firmware für diese Geräte in der Dateiauswahlbox den Dateityp von "HEX Files" auf "SEGMENTED Binary Files (*.BI2)" ändern, andernfalls werden Sie die passende Datei nicht finden...

Siehe auch:
Überprüfen ob ein Firmware-Update nötig ist,
Firmware-Kompilations-Datum,
Readme.txt im Unterverzeichnis "firmware" (mit einem Auszug aus der Firmware-Versions-Historie),
Kurzanleitung fuer Firmware-Update (fwupdate.htm),
Firmware Release Notes,
Dateiübertragung per Web-Browser (HTTP; externer Link) .



Screen Snapshot via CAN

(sorry .. wurde noch nicht ins Deutsche übersetzt)

To generate a printed documentation for the user of your UPT application, you may include "screen photographs" of the real terminal's displays. You don't need a camera for that purpose, it is possible to take a screen "snapshot" via CAN-Bus.

Start the "Snapshot" dialog from the "Transfer" menu of the programming tool.

The parameters on the right side are used for the communication between the tool and the terminal. You will usually not have to modify these values (only if you want to make snapshots from devices that are not UPTs).

All you have to do is click on the "Start !"-button to freeze the actual LCD-contents in an internal buffer of the connected terminal. The buffered data will then be transferred to the snapshot utility (pixel by pixel). After completion of the transfer, you may click "OK" to save the received image as a bitmap-file, or click "CANCEL" to discard the received image.

Hinweis: Der Screen-Snapshot-via-CAN funktioniert (noch) nicht bei Geräten mit CANopen V4; bei Geräten mit "CANdb" (wie MKT-View) ist diese Funktion mangels eines geeigneten Übertragungsprotokolls generell nicht verfügbar !

Bei Geräten mit Ethernet-Interface, TCP/IP-Protokoll, und internem HTTP-Server (z.B. MKT-View II/III/IV) kann der Bildschirminhalt per Web-Browser ausgelesen werden. Geben Sie dazu im Browser die IP-Adresse des Terminals ein.

Zurück zum Inhaltsverzeichnis



Das CAN-Interface im/am PC

Um vom PC aus mit dem CAN-Bus kommunizieren zu können, benötigt das Programmiertool ein geeignetes CAN-Interface, inklusive der dazu passenden Treibersoftware.

Bevor Sie irgendeine CAN-Hardware in ihrem PC installieren, lesen Sie die Anweisungen des Herstellers sorgfältig durch ! (Die Firma MKT Systemtechnik stellt selbst keine CAN-Interfaces für den PC her).
Weder Hersteller noch MKT Systemtechnik wird für irgendwelche Schäden haftbar sein. Weiterführende Informationen finden Sie in einer gesonderten Datei.

Die folgenden CAN-Interfaces können für das UPT/CVT-Programmiertool verwendet werden:

  • PCAN-Dongle von PEAK
    Der(/das?) PCAN-Dongle war ein einfaches Interface für den Parallelport, welches beim Erscheinen der ersten Programmiertools von MKT (anno 2001) noch weit verbreitet war. Mit den damals von Peak mitgelieferten Tools (NetConfig, PCANStat und PCANView) konnte dieses Interface konfiguriert werden. Parallel-Interfaces wurden z.g.T. durch USB ersetzt.
  • PCAN-USB LIGHT, PEAK-CanAPI2, PCAN-Dongle LIGHT :
    Weitere CAN-Interfaces der Firma Peak, die vom Programmiertool unterstützt werden / wurden.
  • NTCAN von ESD
    Die NTCAN API der Firma ESD unterstützt verschiedene CAN interfaces für den Parallelport, ISA- und PCI-slots.
  • KVASER CANLIB
    Ein universeller Treiber der Firma Kvaser AB, der sämtliche (?) CAN-Interfaces dieser Firma unterstützt.
  • VECTOR XL Driver
    Zuletzt getestet mit 'CANcase VN1610', wobei die Zuordnung zwischen 'Kanal' und physikalischer Schnittstelle zunächst problematisch war. Tipps zur Verwendung der Vector-CAN-Hardware finden Sie hier.
  • MKT-View III / IV :
    Diese Geräte können auch als Umsetzer von CAN auf Ethernet ( / UDP ), und damit als Ersatz für ein CAN-Interface am PC verwendet werden. Sowohl im Programmiertool, als auch im MKT-View muß dazu das CAN-via-UDP-Protokoll aktiviert werden. Details zum Protkoll (für Entwickler) finden Sie hier.

Allgemeine Hinweise zur Installation eines CAN-Interfaces finden Sie hier.
Wir empfehlen generell, andere Schnittstellen zu verwenden (die am PC einfacher zu installieren und zu verwenden sind als CAN), z.B. serielle Schnittstellen wie RS-232 bzw VCP, wie im folgenden Kapitel beschrieben. Fast alle neueren Geräte mit 32-Bit-CPU und Farbdisplay bieten mindestens eine 'gängige' Schnittstelle, die direkt (ohne spezielle Interfaces) an den PC angeschlossen werden kann.

Hinweis: Die Konfiguration des CAN-Interfaces "im" (bzw. am) PC hat nichts mit der Konfiguration der beiden (?) CAN-Busse im programmierbaren Gerät zu tun. Die Konfiguration der CAN-Busse "im Gerät" erfolgt über das System-Menü des Terminals, oder mit Hilfe des hier beschriebenen Einstell-Dialogs.

Konfiguration des CAN-Interfaces für die Programm-Übertragung
Für eine erfolgreiche Programm-Übertragung per CAN müssen die Parameter zwischen Programmiertool und zu programmierendem Gerät 'hinreichend kompatibel' sein. Nach dem Laden einer neuen Konfiguration (z.B. aus einer *.cvt-Datei) könnte allerdings die Konfiguration des ersten CAN-Interfaces im zu programmierenden Gerät von der Konfiguration des vom Programmiertool verwendeten CAN-Interfaces am PC abweichen. Auf der Registerkarte 'Settings' / 'Programming Tool Settings' (bzw. 'Einstellungen' / 'Einstellungen des Programmiertools' .

Hinweis
Weichen die 'Einstellungen des Programmiertools' (für die Programmübertragung per CAN) zu sehr von den 'Einstellungen des ersten CAN-Interfaces in der Gerätekonfiguration' ab, dann werden die entsprechenden Dialogelemente im Programmiertool rot markiert.
Das Programmiertool nimmt niemals eine 'automatische Korrektur' der Konfiguration vor !
Im unten gezeigten Screenshot wird z.B. ein Konflikt signalisiert, weil das CAN-Interface "am PC" für einen Betrieb ohne CAN FD konfiguriert war, während in den Einstellungen für das zu programmierende Gerät (MKT-View V mit CAN FD) eine "schnelle Datenphase" mit 4000 kBit/sec konfiguriert war.


Im Gegensatz zur Gerätekonfiguration wird das CAN-Interface des PCs entsprechend der Default-Werte des Herstellers für CAN FD konfiguriert. Eine Einstellmöglichkeit für den Abtastpunktes ist nicht vorgesehen. Bei CAN-FD-fähigen Adaptern der Firma Kvaser AB werden die vordefinierten Bitraten wie z.B. canFD_BITRATE_500K_80P, canFD_BITRATE_1M_80P, canFD_BITRATE_2M_80P, oder canFD_BITRATE_4M_80P verwendet, d.h. der Abtastpunkt liegt in der Nähe von 80 Prozent. Die sich daraus ergebenen Bit-Timing-Register- Einstellungen können im Programmiertool auf der Registerkarte 'Fehler und Meldungen' kontrolliert werden. Beispiel:
UCAN_Init: Loaded Kvaser CANLIB32 V5.30  .
CAN1 configured for 500 kbps, FD=4000 kbps
CAN1 bit timing : ts1=63, ts2=16, sjw=16, tq=25 ns, nSamp=3; FD:ts1=7, ts2=2, sjw=2, tq=25 ns
                  |________ Arbitrierungsphase ___________|  |___ "schnelle" Datenphase ____|
Bedeutung der o.g. Bit-Timing-Parameter:
  ts1 = time segment 1 ("vor dem Abtastpunkt"), Angabe als Vielfaches von 'tq'
  ts2 = time segment 2 ("nach dem Abtastpunkt"), Angabe als Vielfaches von 'tq'
  sjw = sync jump witdh, Angabe ebenfalls als Vielfaches von 'tq'
  tq = Dauer eines 'Time Quantums' in Nanosekunden
  nSamp = Anzahl Abtastungen pro Bit. Entfällt diese Angabe, wird jedes Bit nur einmal abgetastet.

Um die obigen Parameter des Kvaser-Interfaces in die Position des Abtastpunktes umzurechnen (vergleichbar mit den Parametern im System-Setup des MKT-Views) und für die Kontrolle der Baudrate können folgende Formeln verwendet werden:

            Baudrate     = 1 / (tq * (1+ts1+ts2) ) 
            Sample Point = 100 %  * (1+ts1) / (1+ts1+ts2)

       Beispiel 1 : tq = 25 ns,   ts1=63,  ts2=16 :
            Baudrate     = 1 / (25ns * (1+63+16) )     =  500000 [Bits / Sekunde]
            Sample Point = 100 %  * (1+63) / (1+63+16) =  80 %

       Beispiel 2 : tq = 125 ns,  ts1=9,  ts2=2 :
            Baudrate     = 1 / (125ns * (1+9+2) )   =  666666.667 [Bits / Sekunde]
            Sample Point = 100 %  * (1+9) / (1+9+2) =  83.333 %


       

Laut einer Empfehlung aus dem CAN (CiA)-Newsletter 1/2018, Recommendation for the CAN FD bit-timing, sollen für Arbitrierungs- und Datenphase identische Vorteiler-Einstellungen verwendet werden, woraus sich dann identische Werte für tq ergeben (im Beispiel mit dem Kvaser-Interface: je 25 ns, d.h. "ok").
Ferner soll tq so kurz wie möglich gewählt werden, um auch in der 'schnellen Datenphase' möglichst hohe Werte für ts1 und ts2 zu erreichen. Mit dem ursprünglich für das MKT-View V vorgesehenen Controller (i.MX RT1064) war diese Forderung nur bedingt zu erfüllen - Details hier.
Trotz der funktionellen Einschränkungen des Controllers war mit einem kurzen Anschlusskabel eine Übertragung zwischen Kvaser-Interface und MKT-View-V-Prototyp mit 500 kbit/s Arbitrierungs- und 4 Mbit/s Datenphase möglich.

Bei mehrkanaligen CAN-Interfaces (am PC) kann der zweite Kanal während der Simulation eines entsprechenden Gerätes (z.B. MKT-View III/IV/V) als Ersatz für den Anschluss "CAN 2" verwendet werden. Im Gegensatz zum ersten CAN-Kanal ist die zweite CAN-Schnittstelle nicht für eine Dateiübertragung zwischen PC und zu programmierenden Gerät vorgesehen. Für "CAN 2" werden während der Simulation die unter CAN Bus Parameter (CAN 2) eingestellten Parameter verwendet.


Siehe auch :
      Dialog zum Konfigurieren der vier (?) CAN-Schnittstellen im zu programmierenden Gerät,
      Details zu CAN FD in den programmierbaren Anzeigegeräten von MKT Systemtechnik.

USB-nach-Seriell-Adapter (Virtual COM Ports)

Einige Geräte (z.B. "CVT-MIL 320") verfügen über einen internen USB-nach-Seriell-Adapter, der sich aus Sicht des PCs als Virtueller COM-Port (VCP) präsentieren sollte. Aktuelle Windows-Versionen sollten diesen Chip (FT232R) erkennen, und beim ersten Anschliessen automatisch die für Ihr Betriebssystem passenden Treiber (FTDI, FT232R, VCP) installieren.

Falls Windows Probleme hat, die neu angeschlossene USB-Hardware zu erkennen, können Sie versuchen den passenden VCP-Treiber auf der FTDI-Webseite, zu finden und manuell zu installieren. Bitte haben Sie Verständnis dafür, daß wir (MKT Systemtechnik) nicht in der Lage sind, den/die VCP-Treiber auf jedem der vierzehn verschiedenen Windows-Versionen, die im Januar 2010 den FTDI-Chip (FT232R) unterstützten, selbst zu testen.

Bei Problemen mit den USB-Treibern kann es helfen, den USB-Stecker auf der PC-Seite in einen anderen USB-Port zu stecken (geeignete PCs haben definitiv mehr als einen USB-Anschluss .. notfalls hilft ein Hub).
Offenbar verliert Windows gelegentlich die Übersicht über alle installierten USB-Geräte, und nervt Sie (den Anwender) mit Fehlermeldungen wie dieser:

typical screenshot with USB trouble
(Haben Sie wirklich erwartet, durch Anklicken dieser Meldung den Fehler im USB-Treiber zu beheben ? Viel Erfolg damit !
Der Fehler liegt natürlich nicht am angeschlossenen USB-Gerät, sondern an Windows' unüberschaubarem USB-Treiber-Salat . )

Immerhin gelang es dem Autor dieses Dokuments, durch mehrfaches Umstecken des USB-Adapters (auf der PC-Seite) das Problem vorübergehend zu beheben. In einem hartnäckigeren Fall war es nötig, den USB-Treiber-Schrott, der sich im Laufe der Jahre auf einem Rechner ansammeln kann, zu entrümpeln. Dazu eignen sich Hilfsprogramme wie z.B. Microsoft's "USBView.exe", welches im Januar 2010 auf der FTDI-Webseite(!) unter " Microsoft USBView - USB Connection Viewer" heruntergeladen werden konnte. Im USB-View sollte irgendwo ein "USB Serial Converter" angezeigt werden, dessen Connection Status auf 'DeviceConnected' stehen sollte. Um nicht mehr benötigte USB-Treiber loszuwerden (die, wie schon gesagt, Probleme verursachen können), fragen Sie ihre freundliche Suchmaschine "how to get rid of unused USB drivers" / "Windows Ungenutzte Treiber und Geräte entfernen".

Wichtiger Hinweis zu USB-Geräten :
Verbinden Sie ein bestimmtes USB-Gerät immer mit dem gleichen USB-Port am PC.
Anderfalls könnte Windows auf die abstruse Idee kommen, den bereits installierten USB-Treiber erneut zu installieren, oder/und dem virtuellen COM-Port eine neue Schnittstellen-Nummer zuzuweisen.
Z.B. könnte Windows dem USB-nach-Seriell-Konverter gestern die Schnittstelle "COM10" zugeordnet haben, sich heute aber für "COM11" entscheiden. In dem Fall ist der im Programmiertool eingestellte COM-Port plötzlich ungültig (...DANKE, WINDOWS...), und in der Auswahlliste für die serielle Schnittstelle erscheint Folgendes:

invalid COM port in the programming tool's main window
Der Hinweis "*INVALID*" bedeutet in diesem Zusammenhang, daß "COM10" im oben gezeigten Bespiel nicht mehr gültig ist, was -wie gesagt- daran liegen kann, daß Sie das Gerät heute an einem anderen USB-Port angeschlossen haben als gestern.
Ferner sollten Sie das USB-Gerät anschließen, bevor Sie das Programm starten, welches dieses Gerät verwendet (in diesem Fall also die USB-Kabel-Verbindung zwischen PC und Terminal herstellen, bevor das UPT-Programmiertool gestartet wird).

Falls die Verbindung zwischen PC (Programmiertool) und programmierbarem Terminal per USB mit Virtual COM Port hergestellt wird, kann die Baudrate unter 'Einstellungen des Programmiertools' auch auf -für den COM-Port- unüblich hohe Werte wie z.B. 230400 oder 460800 Bit/Sekunde eingestellt werden.

Siehe auch:



Das System-Menü im Terminal

(Siehe auch: Beschreibung des System-Menüs im 'druckbaren' Dokument Nr. 85115)

Die meisten programmierbaren Anzeigesysteme von MKT (z.B. "UPTs" und "MKT-Views") verfügen über ein internes System-Menü, welches i.A. mit einer bestimmten Tastenkombination aufgerufen werden kann (z.B. gleichzeitiges Drücken der Funktionstasten F2 und F3, bzw. mit der unter general terminal options definierten Tastenkombination).


Aufruf des System-Menüs beim MKT-View.
Zum Vergrößern bitte in das Bild klicken.


Bei Geräten die ausschließlich über einen Touchscreen (aber keine "echten" Tasten) verfügen, kann das Systemmenü per Touchscreen-Geste "eckiges U" aufgerufen werden:

gesture with visible trace
Geste 'U' zum Aufruf des Systemmenüs bzw. des Shutdown-Fensters.
Hier bei einem Gerät mit 7-Zoll-Touchscreen (UPT 800).


Shutdown-Fenster (hier beim MKT-View 2),
mit Button zum Aufruf des System-Setups

Bei vielen Geräten kann das Systemmenü auch per Fernsteuerung bedient werden, z.B. per RS-232 mit einem "Terminal-Programm", per CAN mit MKT's CAN-Tester, oder per Ethernet mit TCP/IP und TELNET. In fast allen Fällen muss die Tastenkombination "F2 + F3" durch CTRL-S (STRG-S) ersetzt werden, weil in üblichen Terminalprogrammen das gleichzeitige Drücken zweier Funktionstasten leider keine Funktion hat.
Hier als Beispiel das Systemmenü im "alten" UPT 515. Je nach Bildschirm könnte das Systemmenü ganz anders aussehen, das Prinzip der Bedienung bleibt aber gleich:

Prinzipielle Bedienung des Systemmenüs (am/im programmierbaren Terminal):

  • Drücken Sie die Tastenkombination zum Aufruf des System-Menüs (sofern diese nicht per Setup unterdrückt wurde, andernfalls verwenden Sie eine der hier beschriebenen Alternativen oder die Touchscreen-Geste 'U')
  • Bewegen Sie den Markierungsbalken per Cursortasten, Drehknopf, oder Touchscreen bis zum gewünschten Eintrag ('Navigation')
  • Drücken Sie ENTER (oder den Drehknopf), um den markierten Parameter zu editieren bzw die markierte Funktion / das Untermenü'aufzurufen'
  • Betätigen Sie ESCAPE (oder ersatzweise F3) um ein Menü zu verlassen, bzw in das übergeordnete Menü zurückzukehren
  • Verwenden Sie den Menüeintrag "Save & Exit" um geänderte Parameter dauerhaft (im Konfigurations-EEPROM) abzuspeichern

Display-, Audio-, CAN-Bus-, und weitere Einstellungen im System-Setup

Einige wichtige Parameter, die im System-Menü ("Setup") des UPTs eingestellt werden können:
  • Display Setup, je nach Hardware z.B. mit Einstellung des LCD-Kontrasts, Hintergrundbeleuchtung, Touchscreen-Gesten, etc;
  • Audio-Setup, ebenfalls hardwareabhängig, mit Einstellungen für Touchscreen-"Klick"-Lautstärke, Mikrofonverstärkung, Lautstärke für Lautsprecherausgang, etc;
  • Netzwerk-Einstellungen (Details im nächsten Kapitel)
  • Einstellen von Datum und Uhrzeit, falls das Gerät über eine batteriegepufferte Uhr verfügt;
  • CAN-Baudrate: Auch wichtig für die Übertragung zwischen UPT / MKT-View und Programmiertool.
  • Module/Node-ID (Knotennummer), wichtig für die Kommunikation bei CANopen
  • weitere hardwareabhängige Einstellungen, z.B. CAN-Transmit-Enable, CAN-Abschlusswiderstand, etc;
  • Ein- und Ausschalten des Gerätes; automatisches 'Aufwecken' z.B. per CAN
  • Eingabe eines Freischaltcodes um bestimmte 'Spezialfunktionen' nach deren Erwerb zu aktivieren
  • Diagnose-Funktionen ("Diagnostics") mit Aufruf des Bootloaders, Default-Einstellungen, Anzeige der Error- und Trace-Historie, manuelles 'Durchblättern' aller Anzeigeseiten, Details zur Speicherbelegung ("Storage Directory")

Hinweis: CAN-Baudrate und (bei CANopen) Node-ID müssen im Setup-Menü des Gerätes (UPT, MKT-View, o.Ä.) und in der Konfiguration des Programmiertools kompatibel eingestellt werden. Andernfalls kann das 'Anzeigeprogramm' nicht per CAN-Bus in das Gerät geladen werden (siehe 'Einstellungen' bzw. 'Settings' ).

Einige Geräte enthalten einen Menü-Eintrag namens "User settings" mit folgenden Funktionen..

  • Einstellen der CAN-Baudraten für den Normalbetrieb, i.A. individuell für zwei CAN-Interfaces
  • 'Spezielle' (selten genutzte) CAN-Einstellungen, z.B. Bit-Timing, Sample Point, Sync Width, "LIN statt CAN", ..
    Details zur Berechung der CAN-Bit-Timing-Parameter für 'ungewöhnliche' CAN-Baudraten finden sie in englischer Sprache in diesem Dokument.
  • Editieren der Werte im nichtflüchtigen Array (EEPROM auf das per Interpreter oder Script zugegriffen werden kann)
Bei Geräten mit ausreichend großem Programmspeicher können über das Systemmenü auch die folgenden Diagnose-Funktionen aufgerufen werden (Untermenü "Diagnostics"):
  • Versionsabfrage
  • Aufruf des Bootloaders (zwecks Firmware-Update)
  • Wiederherstellen der "BIOS"-Default-Werte
  • Anzeige der Fehler-Historie, bei Geräten mit Script auch 'Trace History'
  • Blättern in den programmierten Anzeigeseiten ("Browse Display Pages"):
    Nach jedem Seitenwechsel (per Cursor oder Drehknopf) werden kurzzeitig Seitennummer und -name eingeblendet. Abbruch per Escape bzw F3.
  • Auflisten aller Display-Variablen
  • Auflisten diverser im Flash gespeicherter Objekte ("Storage Directory")
  • Löschen des Flash-Speichers mit Daten und Applikation (declassify)
  • Anzeige erweiterter CAN-Bit-Timing-Parameter (evtl. auch CAN FD)

Geräte wie z.B. die meisten "MKT-Views" enthalten einen CAN-Logger/CAN-Snooper. Der Snooper kann -wenn in der Firmware vorhanden- durch das Systemmenü aktiviert werden.

Bei Geräten, die weder über eine Tastatur, noch einen Drehknopf zur Bedienung, noch über einen Touchscreen verfügen, muss das Systemmenü notfalls per Fernsteuerung aufgerufen werden.

Einige Funktionen des Systemmenüs können auch direkt aus dem Anwenderprogramm per Interpreterkommando aufgerufen werden, z.B. die Kontrasteinstellung und das Einstellen der batteriegepufferten Uhr (falls vorhanden).

Weitere Informationen zu dem im Terminal eingebauten "System-Menü" finden Sie auch in Dokument Nr. 85115 (PDF) .

Geräte mit Ethernet und TCP/IP können auch per Web-Server (HTTP) konfiguriert werden.

Netzwerk-Setup (im Systemmenü der programmierbaren Terminals, nur für Geräte mit Ethernet / TCP/IP)

Bei Geräten mit Ethernet-Port und TCP/IP-Protokoll kann aus dem Main System Menu das Untermenü Network Setup aufgerufen werden.

Dort kann u.A. der Name und die IP-Adresse des Gerätes eingestellt werden, wie auch weitere für die Kommunikation per TCP/IP (und, z.T. UDP) relevante Parameter.

Im 'Network Setup' konfigurierbare Parameter :

(1) Ethernet- MAC-Adresse .
(2) Name (Hostname) des Gerätes im lokalen Netzwerk .
Ermöglicht den Zugriff auf das Gerät durch Eingabe des Namens im Web-Browser,
was oft (besonders im Zusammenhang mit DHCP, s.U.) einfacher sein kann als die Eingabe einer IP-Adresse im Browser.
Als Defaultwert gilt für alle programmierbaren Terminals der Name "UPT" (User Programmable Terminal).
Werden mehrere Geräte (UPTs) in einem IP-Netzwerk betrieben, muss der Hostname ggf. geändert werden.
Jedes Gerät muss einen eindeutigen (nur einmal verwendeten) Namen im Netzwerk haben.
Die maximale Länge ist hier (bei den UPTs) auf sieben Buchstaben begrenzt.
Bedingt durch die Implementierung von NetBIOS sind Kleinbuchstaben im Gerätenamen nicht zulässig.
(3) DHCP-Konfiguration (statische oder dynamische IP-Adresse)
Falls eine dynamisch vergebene IP-Adresse verwendet werden soll, muss ein externer DHCP-Server im Netzwerk vorhanden sein.
In dem Fall sind die folgenden Felder (4..6) bedeutungslos.
Eine feste IP-Adresse kann einfacher zu verwenden sein, speziell wenn das Gerät von anderen 'embedded'-Geräten angesprochen werden soll.
(4) Statische IP-Addresse
Dieser Eintrag hat nur eine Funktion, wenn die IP-Adresse nicht per DHCP zugewiesen wird.
(5) Subnet mask (Subnetzmaske, manchmal kurz 'Netzmaske' genannt)
Dieser Eintrag hat nur eine Funktion, wenn die IP-Adresse nicht per DHCP zugewiesen wird.
(6) Gateway (Standardgateway für externe IP-Verbindungen)
Dieser Eintrag hat nur eine Funktion, wenn die IP-Adresse nicht per DHCP zugewiesen wird.
(7) Lokale TCP Server Ports:
HTTP: Integrierter HTTP Web Server (default port für HTTP: 80), Telnet (default port: 23), und FTP (geplant, default: 21)
(8) Betriebsart für CAN-via-UDP : "off" (Aus), "Client", "Server".
Im Gegensatz zu manchen PC-Programmen kann das programmierbare Terminal entweder Client oder Server sein, aber nicht beides zur gleichen Zeit.
(9) Parameter für CAN-via-UDP :
Dazu zählen die IP-Addresse und Port-Nummer eines abgesetzten CAN-via-UDP-Servers (falls das Terminal selbst als Client arbeitet, d.h. "seine" CAN-Schnittstellen für ein externes Gerät zur Verfügung stellt), sowie die lokale Port-Nummer falls das Terminal selbst als Server arbeitet.

Hinweis: Folgen Sie den externen Links, falls Ihnen Begriffe wie TCP, IP, Subnet-Maske, Gateways, HTTP, Telnet, FTP, etc nicht geläufig sind. Wir empfehlen darüberhinaus dringend die Konsultation einschlägiger Literatur, wenn die Nutzung von TCP/IP über ein paar Mausklicks im Web-Browser hinausgehen soll.

Durch Drücken der Enter-Taste (bzw. des Drehknopfes) wird innerhalb des Network-Setup-Menüs zwischen 'Navigate' ("NAV", d.h. Bewegen des Selektionsbalkens) und 'Edit' (d.h. Ändern des grade selektierten Parameters) umgeschaltet. Ein kurzer Hinweis zur Bedeutung des momentan markierten Feldes wird in der unteren Zeile angezeigt.

Details zu den Einstellmöglichkeiten im "Network Setup" entnehmen Sie bitte der bereits erwähnten Dokumentation des System-Menüs (Dokument Nr. 85115).

Alternativ können die Netzwerk-Einstellungen auch per Web-Interface geändert werden.

Siehe auch:   Unterdrücken der Popup-Fenster beim Starten bestimmter Services (z.B. DHCP, CAN-via-UDP, WLAN)
       Wireless LAN Setup (bei Geräten mit WLAN statt Ethernet, z.B. MKT-View V)


Ein- und Ausschalten des Gerätes; automatisches 'Aufwecken' z.B. per CAN

Hinweis: Die in diesem Unterkapitel beschriebenen Features beziehen sich nur auf Geräte mit einem integriertem 'Standby-Controller', wie z.B. im MKT-View II / III / IV / V. Andere Geräte verfügen z.T. nicht über die Möglichkeit, sich automatisch bei CAN-Bus-Aktivität einzuschalten.

Im Normalfall (Default-Einstellung) wird das Gerät mit der Power-Taste ein- und ausgeschaltet (oft mit der Funktionstaste F1 kombiniert; langes Drücken der Taste öffnet dann zunächst das 'Shutdown'-Menü). Darüberhinaus kann auch die Applikation das Gerät herunterfahren (Script-Befehl system.shutdown).
Im 'abgeschalteten' Zustand ist nur noch der von einem stromsparenden Längsregler versorgte 'Standby-Controller' aktiv (Stromverbrauch i.A. unter einem Milliampere). Dessen Verhalten bezüglich des Wiedereinschaltens kann im 'System Setup' wie folgt konfiguriert werden:
  • Wählen Sie im 'Main system menu' die Funktion 'System Setup / UNLOCK'
  • Scrollen Sie im 'Setup Menu' bis zum Eintrag 'WakeupSource'.
  • Drücken Sie ENTER (bzw. den Dreh/Druckknopf) um von 'Navigieren' auf 'Editieren' umzuschalten
  • Verwenden Sie die Cursortasten oder den Drehknopf um eine der weiter unten beschriebenen Optionen zu wählen
 Setup Menu (12)
 EXIT !
 Save & EXIT !
 Display setup    .. ▶     
 Audio setup      .. ▶
 Date and Time    .. ▶
 CAN-Baudrate =500
 Module/NodeID=000
 CAN1_TxEnable=1
 CAN2_TxEnable=1
 CAN1_120_Ohm=1
 CAN2_120_Ohm=1
 WakeupSource=Key, Vin     
 GPS Rcv Type=NONE / off
 ...

Konfiguration 'Wake-Up' (manuelles oder automatisches Einschalten) beim MKT-View

Die verfügbaren Signale zum Einschalten bzw. 'Aufwecken' des Gerätes sind z.T. geräteabhängig. Übersicht:
Key (only)
Das Gerät (z.B. MKT-View) soll nur per Power-Taste eingeschaltet werden.
Es startet nicht automatisch beim Anlegen der Versorgunsspannung.

Key, Vin
Das Gerät kann per Power-Taste oder durch Anlegen der Versorgungsspannung ("Vin") gestartet werden.

Key, Vin, CAN
Ähnlich wie oben; zusätzlich kann das Gerät auch (ohne "steigende Flanke" an Vin) durch Aktivität auf dem ersten CAN-Bus-Interface automatisch gestartet werden.

Key, DIN, CAN
Einschalten per Power-Taste, per digitalem Eingang ("DIN"=digital input), oder durch CAN-Aktivität. Die Spezifikation des elektrischen Eingangs (zulässige Spannungen und Schaltschwelle) finden Sie ausschliesslich im Gerätehandbuch.

Key, Vin, DIN, CAN
Kombination aller obigen 'Wake-Up-Quellen' (Power-Taste, steigende Spannung an Vin, DIN, und CAN-Bus-Aktivität).

Key, CAN
Einschalten nur per Taste oder CAN-Bus. Flanken an Vin und DIN werden ignoriert.

Vin, CAN / Vin, DigIN / Vin (only) / CAN (only)
Selten genutzte Kombinationen die kein Einschalten durch den Bediener selbst zulassen. Diese wurden vor langer Zeit von einem 'guten Kunden' benötigt, und sind in neueren Geräten (MKT-View V ?) möglicherweise nicht mehr verfügbar.

Freischaltung von Sonderfunktionen

Dieses Unterkapitel wurde wegen ausufernder Dateigröße in eine eigene Datei (unlock_49.htm) verschoben.

Storage Directory (im 'System Menu' unter 'Diagnostics' abrufbar)

Im Normalfall brauchen Sie sich nicht um den Speicherbedarf im Flash des Zielsystems zu kümmern. Solange keine Warnungen wegen 'knappem Speicher' auftreten, können Sie dieses Unterkapitel daher überspringen.
Die Anzeige des für verschiedene Teile der Applikation benötigten Speichers könnte wichtig werden, wenn Sie z.B. eine ursprünglich für ein Gerät mit 'großem' Speicher entwickelte Applikation auf einem 'kleineren' Gerät laufen lassen wollen, und dabei Probleme wegen eines zu kleinen Flash-Speichers auftreten. Die im folgenden beschriebene Anzeige kann Ihnen bei der Entscheidung helfen, welche Objekte (z.B. Bitmaps) in der Applikation verkleinert oder entfernt werden müssen, damit die Applikation auch auf dem 'kleineren' Gerät lauffähig wird.
Das 'Storage Directory' wird am Gerät in Form einer scrollbaren Tabelle mit den folgenden Spalten angezeigt:
Nr
Laufende Element-Nummer. Um alle zwanzig (?) bislang implementierten Elemente zu sehen, muss ggf. nach unten gescrollt werden.

Type
Typ oder 'Speicherklasse' des Elements. Die meisten Elemente treten nur einmal in der Liste auf; bei komplexen Systemen mit mehreren Speichermedien (z.B. Flash / EEPROM mit I2C-, SPI- oder parallelem Businterface) könnten Objekte allerdings auf verschiedene Medien aufgeteilt werden und tauchen dann mehrmals in der Liste auf. Im Dezember 2020 existieren die folgenden Element-Typen:

GENS
General settings
SDOs
Service Data Objects (für CANopen)
PDOs
Process Data Objects (für CANopen)
VARI
Definitionen von Anzeige-Variablen
G_EV
globale Event-Definitionen
CANO
CANopen-Konfiguration (zusätzlich zu SDOs und PDOs)
user
Optionale 'Benutzer-Einstellungen', oder spezielle "anwenderspezifische Objekte" (Sonderfirmware)
CdbH
CAN Database Import History (Liste von Dateien mit CAN-Datenbanken oder AUTOSAR-Dateien, die beim Erstellen der Applikation importiert wurden)
CdbS
CAN Database Signal Definitions (sofern diese für die Applikation relevant sind und per Tool importiert wurden)
ufnt
User-defined fonts (Benutzerdefinierte Zeichensätze die per Programmiertool direkt in die Applikation importiert wurden)
ufre
User-defined font references (Liste von Dateinamen mit benutzerdefinierten Zeichensätzen)
FREF
Weitere Datei-Referenzen ("Dateien, die von der Applikation verwendet werden/wurden", soweit dies dem Programmiertool bekannt war)
FLEX
Andere Objekte im 'flexibel' verwalteten Teil des Flash-Speichers
STRG
Null-terminierte String-Konstanten (auf diversen Objekten, aber nicht der Script-Quelltext)
ICON
Icons (vom Programmiertool importierte Bitmap-Grafiken)
PAGE
Selbstdefinierte Anzeigeseiten
TEXT
Text-Array
SCRI
Script-Quelltext (der erst im Zielsystem compiliert wird)
DYNA
Weitere 'dynamisch' allozierte Objekte. Dazu gehören auch Objekte, die erst nach dem Laden der Applikation in Onboard-Flash-Speicher des Zielsystems abgelegt wurden.

Count
Anzahl gespeicherter Objekte eines bestimmten Typs, die zusammen in einem zusammenhängenden Speicherblock enthalten sind.

kByte
Größe des Speicherblocks in Kilobyte (1 kByte = 1024 Byte).

FirstAddr
Startadresse des Speicherblocks aus Sicht der CPU. Wird nur zu Testzwecken und die Firmware-Entwicklung angezeigt. Speicheradressen sind hochgradig hardware-abhängig. "Niedrige" Adressesen befinden sich oft im CPU-internen ("schnellen") Flash-Speicher, höhere Adressen sind oft (aber nicht immer) separate Speicher auf der Hauptplatine oder der "CPU-Karte".

LastAddr
Adresse unter der der letzte Eintrag eines Array-ähnlichen Typs gespeichert wurde.
Abhängig von der Reihenfolge von Objekten bei der Übertragung (oder beim Laden aus einer *.cvt / *.upt - Datei) können sich Adressbereiche scheinbar überlappen. Dies liegt aber daran, dass zwischen 'FirstAddr' und 'LastAddr' noch andere Objekte alloziert werden konnten. Z.B. können beim Import von Anzeigeseiten ("PAGE") hunderte von Zeichenketten ("STRG") alloziert werden, die dann als verkettete Listen 'irgendwo' im Flash-Speicher liegen könnten.


Beispiel (man beachte die Abweichungen zur 'Schätzung' durch das Programmiertool):

Nr  Type Count kByte FirstAddr  LastAddr
01  GENS    1     1  0x29873BA4 0x29873BA4
02  SDOs    0     0  0x00000000 0x00000000
03  PDOs    0     0  0x00000000 0x00000000
04  VARI   40     7  0x2986CDBC 0x2986E6B8
05  G_EV   31    22  0x2986E75C 0x298738EC
06  CANO    0     0  0x00000000 0x00000000
07  user    0     0  0x00000000 0x00000000
08  CdbH    1     2  0x29873EF4 0x29873EF4
09  CdbS   21     2  0x2986C034 0x2986C82C
10  ufnt    0     0  0x00000000 0x00000000
11  ufre    1     1  0x29873EA8 0x29873EA8
12  FREF    0     0  0x00000000 0x00000000
13  FLEX    0     0  0x00000000 0x00000000
14  STRG  242     9  0x29840198 0x2986CD94
15  ICON   99   143  0x29848828 0x2986B680
16  PAGE   20    27  0x29840000 0x2986C89C
17  TEXT    1     1  0x29848810 0x29848810
18  SCRI    0     0  0x00000000 0x00000000
19  DYNA    0     0  0x00000000 0x00000000
 Entries=19  used: 215; unused: 814 kByte

Nach der Tabelle (mit den oben aufgelisteten Elementen) folgt im 'Storage Directory' die Anzahl der insgesamt vorhandener Elemente und der verbleibende freie Flash-Speicher in kByte.
Diese Angabe ermöglicht eine Abschätzung, wie viele Anzeigeseiten, Script-Quelltext, Icons/Bitmaps usw. einer bereits existierenden Applikation noch hinzugefügt werden können, bevor der Flash-Speicher im Zielsystem knapp wird.
Die Auflistung nach Element-Typ erleichtert die Entscheidung, welche Elemente ggf. aus der Applikation entfernt oder verkleinert werden müssten, um die Applikation auch auf Systemen mit kleinerem Speicher lauffähig zu machen.

Siehe auch: Ermitteln des Flash-Speicher-Bedarfs durch das Programmiertool.

Fernbedienung (für das Systemmenü im programmierbaren Gerät)

Einige "Anzeige-Terminals" von MKT Systemtechnik verfügen weder über eine Tastatur, noch Touchscreen, noch über einen Drehknopf zur Bedienung. Um solche Geräte trotzdem bedienen zu können (speziell das System-Menü), verfügen diese über eine primitive Fernsteuerfunktion (bislang nur per CAN oder RS-232) .

Geräte mit integrierten Web-Server (z.B. MKT-View II, MKT-View III) können alternativ auch per Web-Server überwacht und konfiguiert werden. Abhängig von der Netzwerk- Konfiguration (DHCP, NetBIOS, etc) können diese Geräte im Web-Browser über ihren Host-Namen angesprochen, z.B. UPT (UPT=Default-Host-Name für alle User Programmable Terminals, zu denen auch die 'MKT-View'-Familie gehört).

Details zur Bedienung des System-Menüs per Fernsteuerung und zur Konfiguration per Web-Browser finden Sie in einem externen Dokument mit dem Titel Fernbedienung für programmierbare Displays ohne Tastatur.

Zurück zur Übersicht



Die Fehler-Anzeige-Seite ("Fehler & Meldungen")

Auf der Registerkarte 'Fehler und Meldungen' werden Fehlermeldungen (und Warnungen) angezeigt, die während der Programmeingabe, der Simulation, beim Übersetzen von Scripten, oder der Übertragung des fertigen Programms in das Terminal auftreten könnten. Darüberhinaus können hier empfangene und gesendete CAN-Telegramme, und die Ergebnisse der globalen Suche aufgelistet werden. Auch Meldungen, die zu Testzwecken per Script in die Trace-Historie 'gedruckt' werden, werden hier angezeigt (oder in einem separaten Fenster, zu öffnen über das Kontext-Menü des Editors).

Der Inhalt der Meldungsliste kann mit dem Button "Löschen" (Delete) geleert werden. Der "Stop"-Button über der Fehlermeldungs-Anzeige stoppt nur die Fehlermeldungs-Liste, aber nicht die simulierte Applikation !

Als Alternative zur Anzeige auf der o.g. Registerkarte können alle Fehlermeldungen, Warnungen, Suchergebnisse, die TRACE-Historie, usw. auch in einem eigenständigen Fenster angezeigt werden (im Hauptmenü: Ansicht .. Trace-Historie, Fehler, Warnungen .. in einem separaten Fenster anzeigen). Steht ein ausreichend großer 'Desktop' zur Verfügung, kann der Entwickler so im Hauptfenster das Script-Fenster oder den Display-Seiten-Editor sichtbar halten, während CAN-Telegramme, Trace-History-Einträge, Fehler, Warnungen, und weitere Meldungen ständig 'im Blick' bleiben.


Sprung zur Fehlerursache per Mausklick

Wenn eine Fehlermeldung die Nummer der Displayseite und -zeile enthält, auf der dieser Fehler auftrat, können Sie durch Anklicken der Meldung mit der rechten Maustaste oder per Doppelklick direkt zur Fehlerursache springen. Beispiel für eine derartige Meldung:
INTP: (page 2, line 5) Variable 'Call' not found.
Dies funktioniert auch bei Meldungen der Seitenumschaltungs-Verfolgung (page-switch trace), und bei 'Fundstellen' aus der globalen Suche, z.B.:
Switched from page 0 to page 2 ("Engine"), reason: GOTO on page 0, line 9

Globale Textsuche nach 'ISO15765_ADDR_FORMAT_FIXED_NORMAL' :
  Script-Quelltext, Zeile 133  : ISO15765_ADDR_FORMAT_FIXED_NORMAL = 2;
  Script-Quelltext, Zeile 617  : iAddrFormat := ISO15765_ADDR_FORMAT_FIXED_NORMAL;
Es wurden 2 Vorkommen von 'ISO15765_ADDR_FORMAT_FIXED_NORMAL' gefunden.
      

Fehlerklassen und weitere angezeigte Meldungen (CAN, CANopen, ..)

Treten z.B. während der Programmübertragung Fehler auf, können -je nach Übertragungsmedium bzw Protokoll- in der Fehlerliste auch hexadezimal codierte SDO-Fehlercodes, zusammen mit dem CANopen-index des Objektes bei dem der Fehler auftrat, angezeigt werden.
Falls Fehler durch Zugriff auf "nicht existierende Objekte" im CANopen-Objektverzeichnis des Terminals auftreten, könnte ein Kompatibilitätsproblem zwischen alter Firmware und neuem Programmiertool die Ursache sein.

Andere Fehler, die bei der Simulation der Terminal-Anwendung auftreten könnten, liegen (beim UPT515) oft an falsch verbundenen Variablen (z.B. SDO-Kanal mit falschem Index und/oder Subindex.

Die Fehlermeldungs-Liste kann auch als einfacher CAN-Monitor eingesetzt werden. Per Voreinstellung sind die Häkchen "RX-Telegramme" und "TX-Telegramme" abgeschaltet. Wenn Sie testen wollen, welche Telegramme gesendet und/oder empfangen werden, schalten Sie die entsprechenden Häkchen ein. (Vorsicht: manche PC's sind für diese Funktion zu langsam - das für die Anzeige verwendete RichEdit-Control ist nicht in der Lage, hunderte von Textzeilen pro Sekunde an die Liste anzuhängen !)

Wenn die Option "Error Frames anzeigen" gesetzt ist, und ein dafür geeignetes CAN-Interface/Treiber verwendet wird (z.B. Vector CAN XL Driver), dann werden eventuell auftretende Error-Frames gezählt und im Meldungsfenster angezeigt.
(Hintergrund: Im Idealfall sollten in einem CAN-Netzwerk keine Error-Frames auftreten. Ursache für Error-Frames können z.B. EMV-Probleme, fehlender Abschlusswiderstand, falsch konfigurierte CAN-Bit-Timing-Register, oder ein "babbling idiot" in einem der CAN-Knoten sein).

Steht kein geeignetes CAN-Interface zur Verfügung, können CAN-Telegramme auch per CAN-Logfile-Player für die Simulation eingespeist werden. Die vom Player 'abgespielten' Telegramme werden ebenfalls -optional- auf der Registerkarte 'Fehler und Meldungen' angezeigt.

Anzeige der Trace-Historie unter 'Fehler & Meldungen'

Seit 07/2021 durchlaufen sämtliche Meldungen auf der Registerkarte 'Fehler & Meldungen' (bzw. im separaten Fenster mit dem Titel 'Fehler, Meldungen, Trace-Historie'), optional angezeigte CAN-Messages, Meldungen vom Programmiertool (Fehler, Hinweise, Suchergebnisse), vom Script-Laufzeitsystem, und von der Applikation per trace.print "gedruckte" Hinweise den früher nur für die Trace-Historie genutzten Ringspeicher.
Alle Meldungen werden daher chronologisch sortiert angezeigt. Das System fügt den meisten Meldungen einen Zeitstempel hinzu, der per Default dezimal (in Sekunden seit dem Start des Programmiertools) angezeigt wird. So kann auch nach einem längeren Testlauf anhand der Zeitstempel auf etwaige Abhängigkeiten geschlossen werden, z.B. "3 Sekunden nach Senden von Kommando XYZ traten vermehrt Error-Frames auf dem CAN-Bus auf, 1 Sekunde danach ging der Controller in den Bus-Off-Zustand, und 10 Sekunden später bemerkte das Script (d.h. die Applikation) einen Kommunikations-Timeout".

Siehe auch: Debugging, Trace, Troubleshooting und FAQs .

    Zurück zur Beschreibung des Hauptfensters


Kommando-Interpreter

Der Kommando-Interpreter ist Teil der UPT-Firmware, aber der weitgehend identische Code steckt auch im UPT-Programmiertool. Der größte Teil Ihres "Anwenderprogramms" wird von diesem Interpreter abgearbeitet. Der Interpreter wird intern zum Auswerten von Formeln (numerischen Ausdrücken), Ereignis-Definitionen und zum Abarbeiten von Grafikbefehlen (nicht zu verwechseln mit den Backslash-Sequenzen) und den Grafikbefehlen in der Script-Sprache) verwendet.

Im Interpreter sind verschiedene Kommandos (alias "Prozeduren") und Funktionen implementiert. Funktionen geben einen Wert zurück, und können daher als Teil eines numerischen Ausdrucks verwendet werden. Kommandos liefern dagegen keinen Wert zurück (und können daher nicht als Operand in numerischen Ausdrücken verwendet werden).

Sie können zu Testzwecken ein einzelnes Interpreterkommando abarbeiten lassen, indem Sie es in der Statuszeile des Programmiertools eingeben (dort wo normalerweise Fehlermeldungen und Warnungen angezeigt werden).

So können Interpreterbefehle (etwas komfortabler) auch in einem speziellen Test-Kommando-Fenster eingeben, und diese Kommndoliste für später in einer Datei abspeichern.

Kommandos die nur vom Programmiertool, aber nicht vom "echten" Terminal ausgeführt werden können, sind:

  • help, run, stop, print
  • sim_rx (sendet einen "simulierten" Datenblock an den Empfangs-Verteiler, z.B. für CAN)

Alle Kommandos die nicht direkt vom Programmiertool verarbeitet werden können werden zum Interpreter des (simulierten) Terminals durchgereicht. Das Format dieser Kommandos entspricht der Syntax die für Ereignis-Reaktions-Methoden verwendet wird, z.B. "g" für "goto" usw.

Auch der anno 2021 erweiterte CAN-Simulator verwendet den in diesem Kapitel vorgestellten Kommando-Interpreter zum Abarbeiten der frei programmierbaren Ablaufsteuerung, deren Funktionsprinzip den programmierbaren Ereignis-Definitionen in der Display-Applikation entspricht.

Siehe auch:

Numerische Ausdrücke (expressions)

Die UPT-Firmware enthält einen Interpreter für numerische Ausdrücke ("Formeln"). Diese Ausdrücke dienen als...
Einige Beispiele für numerische Ausdrücke:
(Voltage * 100 ) / 230   (Skalierung eines Integer-Wertes, Ergebnis ebenfalls eine Ganzzahl)
(Voltage * 0.23)     (Skalierung mit Fliesskomma-Faktor, Ergebnis immer Fliesskomma)
(Voltage > 230)     (ein Vergleich, z.B. für Event-Abfragen)
(ce & kd0)         (logische Verknüpfung von "CAN-Fehler" UND "Funktionstaste F1 gedrückt")

Ausdrücke können aus den folgenden Elementen bestehen:

Siehe auch: Interpreter-Kommandos, numerische Ausdrücke in der Script-Sprache .

Feste Zahlenwerte (Konstanten)

Der Interpreter für numerische Ausdrücke akzeptiert Zahlenwerte (Konstanten) in den folgenden Formaten:
  • dezimal mit optionalem Prefix "#"
  • hexadezimal mit Prefix "0x" oder "$" ("C" oder Pascal-Stil)
  • binär mit Prefix "%" ( '%' dient nun als modulo-Operator )

Dezimale Konstanten können auch ein Vorzeichen (-) erhalten.
Als hexadezimale Ziffern dürfen Groß- oder Kleinbuchstaben verwendet werden.

Einige Beispiele für Konstanten:
12345
-12345
#12345
0x0ABCD
-0xABCD
$abcd
%010101
Hinweis:
Der Interpreter unterstützt (i.A.) keine Fließkommazahlen, sondern nur 32-bit-Integerwerte mit Vorzeichen. Darum ist -123.45 keine zulässige Konstante.
Nur bei Terminals mit CANdb-Funktionalität können echte Fließkommawerte angezeigt und vom Interpreter verarbeitet werden.

Verknüfungsoperatoren (numeric operators)

Verknüpfungsoperatoren können Teil von numerischen(*) Ausdrücken sein. Lediglich die Addition ist auch in String-Ausdrücken erlaubt.

Der Interpreter für numerische Ausdrücke kann die folgenden einfachen Operatoren verarbeiten (mit zwei "Eingängen" und einem "Ausgang"):

+ Addition

- Subtraktion

* Multiplikation

/ Division (ohne Rest)

% Modulo (berechnet den Rest einer Division)

== "gleich"

!= "ungleich" (ehemals auch "<>")

< "kleiner als"

<= "kleiner oder gleich"

> "größer"

>= "größer oder gleich"

<< bitweise nach links schieben (nur für Integer-Werte)

>> bitweise nach rechts schieben (nur für Integer-Werte)

& bitweise UND-Verknüpfung (nur für Integer-Werte...)

&& boolesche UND-Verknüpfung

| bitweise ODER-Verknüpfung

|| boolesche ODER-Verknüpfung

^ bitweises EXKLUSIV-ODER

~ bitweises Invertieren (als Prefix)

! boolesches Invertieren (als Prefix, "nicht")

Ein besonderes Schmankerl für "C"-Programmierer ist der "arithmetische if-then-else Operator":

Syntax:
<arg1>?<arg2>:<arg3>
Funktion:
if (<arg1> is not zero)
then result:=<arg2> ;
else result:=<arg3>

 

Boolesche Operatoren liefern entweder TRUE oder FALSE, was hier durch die Werte 1 und 0 repräsentiert wird.

Eingänge für boolesche Operatorens sind TRUE wenn das Argument nicht Null ist, andernfalls FALSE (wenn Argument Null).

Die Priorität der Operatoren legt die Reihenfolge bei der Abarbeitung fest. Der Interpreter kennt nur zwei verschiedene Prioritätsstufen, niedrige Priorität haben Addition, Subtraktion, Vergleich, "OR"-Verknüpfungen; hohe Priorität haben Multiplikation, Division, Modulo, "UND"-Verknüpfungen. Verwenden Sie im Zweifelsfall Klammern ! Ein geklammerter Teilausdruck hat immer die höchste Priorität.

(*) Hinweis zu den numerischen Operatoren:
Bei Geräten mit 16- oder 32-Bit-CPU, deren Firmware im Februar 2007 oder später compiliert wurde, sind einige -wenige- Operatoren auch für Zeichenketten definiert. Dies sind:
==  ("gleich")
!= ("ungleich").
Diese -und nur diese- Operatoren funktionieren ausnahmsweise auch mit Strings (Zeichenketten). Der zweite Operand muss dabei eine einfache Konstante oder Stringvariable sein, aber kein zusammengesetzter String.
Ähnliche Operatoren wie oben für den Display-Interpreter aufgeführt existieren auch in der Script-Sprache.


Variablen als Teil eines numerischen Ausdrucks

Variablen können Teil eines numerischen Ausdrucks sein.
Der Interpreter für numerische Ausdrücke erkennt eine Variable am Großbuchstaben am Anfang des Namens (dies erleichterte die Auswertung bei langsamen Prozessoren, wie anno 2003 im "UPT515").

Im "UPT515" durften Variablennamen aus maximal 8 Zeichen bestehen, Ziffern sind nur ab Position 2 zulässig. Alle Variablennamen müssen in einer Tabelle des Programmiertools definiert werden. Nur bei Firmware-Varianten mit CANdb-Funktionalität sind bis zu 16 Zeichen zulässig (abzulesen unter "General Settings").

Normalerweise stammt der "Eingangswert" einer Variablen von einem Kommunikationskanal (z.B. PDO oder SDO bei CANopen). Sie können allerdings auch neue Werte an eine Variable mit Hilfe des "@"-Kommandos des Interpreters zuweisen.

Im UPT ist eine Variable nicht nur ein simpler "Speicherplatz" für einen numerischen Wert, sondern eine komplexe Datenstruktur mit vielen Komponenten.

Wenn eine Variable als "Kommunikationsvariable" verwendet wird (d.h. wenn sie mit einem Kommunikationskanal verbunden ist), können Sie auf die folgenden Komponenten der Variablen mit Hilfe des Interpreters auch zur Laufzeit des UPT-Programms zugreifen (".xx" an den Variablennamen anhängen, z.B.  Temp_3.in ):
.fl liefert das "flag"-Feld einer Varariablen,
.ut liefert den Wert des "update timers" einer Variablen (zählt in 0.1-Sekunden-Schritten abwärts),
.cy liefert die Zykluszeit in Millisekunden (0 = "kein periodisches Senden" für CAN-Signale),
      entspricht dem Parameter 'Upd-Time' auf der Registerkarte Variablen;
.in liefert den "letzten Eingangswert" (input value) der Variablen vom Kommunikationskanal,
      bei mit CAN ('CANdb') verknüpften Variablen ist dies der nicht skalierte 'Rohwert';
.iu testet ob der "Eingangswert" einer Variablen per Kommunikationkanal aktualisiert wurde,
.ic
zaehlt wie oft der Eingangswert per Kommunikationskanal aktualisiert wurde,
.ed liefert den "editierten Wert" der momentan auf dem Display sichtbar ist,
.ou liefert den "letzten Ausgangwert" (output value) der an einen Kommunikationskanal gesendet wurde,
.od testet ob der aktuelle Wert bereits erfolgreich zum Kommunikationskanal gesendet wurde,
.de liefert den "Defaultwert" aus der Variablen-Definitionstabelle,
.mi liefert das "Minimum" aus der Variablen-Definitionstabelle,
.ma liefert das "Maximum" aus der Variablen-Definitionstabelle,
.fa liefert den Skalierungsfaktor aus der Variablen-Definitionstabelle,
.di liefert den Skalierungsdivisor aus der Variablen-Definitionstabelle,
.of liefert den Skalierungs-Offset aus der Variablen-Definitionstabelle,
.ty liefert den Typ der Variablen (numerische Codierung des Datentyps wie bei CANopen),
.un liefert die physikalische Einheit (UNIT, aus der Definitionstabelle),
.uo testet die "output update flags" der Variablen (nur für Experten),
.va (Abk. für 'valid') testet ob der Wert der Variablen (.ed) momentan "gültig" bzw "verfügbar" ist.
Nur für Geräte mit 32-Bit-CPU, und "CANdb"-Unterstützung:
.ci liest (oder ändert) den CAN-Identifier einer Signaldefinition während der Laufzeit, wenn die Variable mit einem 'CAN-Signal' gekoppelt ist.
.fb, .nb, .bo, .st, .sf, .so : Teile einer CAN-Signal-Definition. Details hier .

Ohne den optionalen Komponentennamen liefert der Interpreter den "aktuell editierten Wert" der Variablen, bzw. den zuletzt per Kommunikations- Kanal empfangenen, und für die Anzeige skalierten Wert.

Einige der "komplizierteren" Komponenten einer Variablen werden im folgenden Abschnitt vorgestellt.

in ("INput value", spezielle Komponente einer Variablenstruktur)
liefert den "letzten Eingangswert" (input value) der Variablen vom Kommunikationskanal. Bei Variablen, die mit CAN-Signalen verbunden sind, ist dies der "rohe" (d.h. nicht skalierte) Wert der direkt aus der CAN-Message entnommen wurde. Dies ist  -im Gegensatz zum "angezeigten" Wert (.ed)-  immer eine Integer-Zahl.
ic ("Input Counter", spezielle Komponente einer Variablenstruktur)
Liest oder setzt den Stand eines "Aktualisierungs-Zählers" einer Variablen. Jede Variable, die mit einem Kommunikationskanal verbunden ist, verfügt über einen eigenen ("Empfangs-")Zähler, auf den per Interpreter zugegriffen werden kann (für Debugging oder für Überwachungszwecke).
Vorsicht: Der maximale Zählerstand ist 32767. Wird dieser Wert überschritten, ändert sich nur noch das niederwertige BYTE des Zählerstandes (oder, mit anderen Worten, der Zählerstand 'friert nicht ein' wenn die Variable 32678-mal aktualsiert wurde).
Um den Zählerstand auf Null zu setzen, verwenden Sie eine formale Zuweisung wie diese:
@StopIt.ic = 0
iu ("Input Updated", spezielle Komponente einer Variablenstruktur)
Testet, ob eine Variable per Kommunikationskanal aktualisiert wurde (i.A. nach Empfang einer passenden CAN-Message, in der der "Eingangswert" enthalten war).
Um dieses Flag zurückzusetzen, verwenden Sie eine formale Zuweisung wie z.B.:
@StopIt.iu = 0
od ("Output Done", spezielle Komponente einer Variablenstruktur)
Testet ob eine Variable bereits erfolgreich auf dem Kommunikationskanal ausgegeben wurde ("output done", "output updated").
Verwenden Sie diese Komponente, wenn Sie testen wollen ob der "neue" Wert, den Sie irgendwie an die Variable zugewiesen haben, bereits erfolgreich zum dazugehörigen "Ausgangs"-Kanal übertragen werden konnte (dies kann z.B. beim SDO eine ganze Weile dauern!). Beispiel:
Nehmen wir an, Sie haben eine Variable namens StopIt, die per SDO-Kanal mit einem externen Gerät verbunden ist. Im Terminalprogramm weisen Sie nun dieser Variablen einen neuen Wert zu (z.B. in einem Event, um irgendeine Maschine auf Tastendruck zum Stoppen zu bringen):
@StopIt=1
Der SDO-Protokoll-Handler wird daraufhin versuchen, einen Write-Request an das externe Gerät zu senden, und wartet anschließend auf ein Write-Response-Telegramm von dem Gerät. Während der SDO-Handler beschäftigt ist (busy), arbeitet das Terminal ganz "normal" weiter (weil der Protokoll-Handler im UPT -mehr oder weniger- "im Hintergrund" arbeitet).
Nach einiger Zeit (abhängig vom externen Gerät und von der Arbeitsgeschwindigkeit des UPT's) wird das UPT das Write-Response-Telegramm empfangen. Ein bestimmtes Flag der Variablen (hier: "StopIt.od") wird auf EINS gesetzt nachdem das Response-Telegramm empfangen wurde.
Ihre Anwendung kann dieses Flag in einem "Event" abfragen, zum Beispiel:
Event: StopIt.od
Reaktion: g"StopOk"
Dieses Event (incl. Reaktion) wird dann zu einer bestimmten Anzeigeseite namens "StopOk" umschalten, sobald der Partner den Empfang des geänderten Variableninhalts quittiert hat.


va ("VAlid", spezielle Komponente einer Variablenstruktur)
Testet, ob der aktuelle Wert einer Variablen "gültig" (valid) bzw. "verfügbar" ist. Dies ist i.A. TRUE = 1 = "wahr". Bei Variablen die an CAN-Signale gekoppelt sind, kann es vorkommen daß der Wert noch "ungültig" ist weil das Signal noch nicht empfangen wurde (im Gegensatz zu CANopen ist es bei CANdb nicht möglich, sogenannte "Defaultwerte" zu definieren - zumindest nicht im CANdb-File).
Ist die optionale Timeout-Überwachung aktiv, kann sogar ein bereits gültiger Wert nach einiger Zeit wieder ungültig werden (nämlich dann, wenn eine zyklische Übertragung per CAN länger als der parametrierte 'Timeout'-Wert ausbleibt).
Bei Variablen, die (per SDO oder PDO) an CANopen-Objekte gekoppelt sind, ist der Wert prinzipiell immer gültig, weil die Variablenwerte beim Einschalten auf den vordefinierten 'Defaultwert' gesetzt werden können.

Seit Oktober 2012 sind die oben aufgeführten Komponenten auch in der Script-Sprache nutzbar.

Siehe auch:



Inspizieren von Interpreter-Ausdrücken per Maus

In vielen Definitionstabellen des Programmiertools kann der Inhalt von Variablen oder numerischen Ausdrücken inspiziert werden, indem der Mauspfeil (ohne zu klicken) über die entsprechende Zelle bewegt wird.
Die genaue Position des Mauspfeils über einem Teil des Ausdrucks bestimmt dabei, welcher Teil des Ausdrucks ausgewertet wird:
  • Mauspfeil in der Mitte eines Bezeichners (z.B. Variablenname):
    Es wird nur der Wert dieses Bezeichners angezeigt.
  • Mauspfeil am Anfang eines Bezeichners:
    Es wird ein kompletter Term (mit Operatoren und Operanden links vom Bezeichner) ausgewertet, i.A. bis zum nächsten Leerzeichen.
  • Mauspfeil am Ende eines Bezeichners:
    Es wird ein kompletter Term (mit Operatoren und Operanden rechts vom Bezeichner) ausgewertet, i.A. bis zum nächsten Leerzeichen.
  • Mauspfeil auf einer öffnenden Klammer:
    Wertet den geklammerten Term "nach rechts" bis zur korrespondierenden schliessenden Klammer aus.
  • Mauspfeil auf einer schließenden Klammer:
    Wertet den geklammerten Term "nach links" bis zur korrespondierenden öffnenden Klammer aus.
Das berechnete Ergebnis wird in der Statuszeile am unteren Rand des Hauptfensters angezeigt, zusammen mit dem (Teil-)Ausdruck, aus dem der Wert berechnet wurde.



Interpreter-Funktionen

Der numerische Interpreter erkennt nur Funktionsnamen, die mit einem Kleinbuchstaben beginnen. Dies erleichtert die Syntaxanalyse für langsame CPUs (wie z.B. den im UPT515 eingesetzten 8051-kompatiblen Mikrocontroller). Für einfache Terminal-Applikationen brauchen Sie sich nicht mit dem Interpreter zu beschäftigen, weil das Programmiertool an manchen Stellen automatisch Interpreter-Code erzeugen kann. Für "knifflige" Applikationen (die eher der Arbeit eines Programmierers entsprechen) ist die Kenntnis des Interpreters aber unerlässlich.

Alle Funktionen des Interpreters (auch die speziellen "Event-Abfrage-Funktionen") können Teil eines numerischen Ausdrucks sein. Der einzige Unterschied zwischen Event-Abfrage-Funktionen und den im Folgenden angeführten Funktionen ist der Typ des "Rückgabewertes" (return): Die Event-Abfrage-Funktionen liefern einen booleschen Wert (TRUE oder FALSE), die meisten "normalen" Funktionen geben einen numerischen Wert zurück.

Alphabetisch sortierte Übersicht der Interpreterfunktionen

  • ain1, ain2 : liefert den Wert eines Analog-Eingangs, Wertebereich 0..1023 (höhere Auflösung per Script).
  • arr[row][col][comp]: Zugriff auf globales Array (Fliesskommawerte, nur bei manchen Geräten)
  • appl.xxx liefert Informationen über die geladene Applikation, z.B. den Dateinamen
  • audio.xxx liefert Informationen über den Audio-Recorder (z.B. Status der Aufnahme, Wiedergabe, etc)
  • bk, bs : Button Key, Button-State (nur bei manchen Geräten)
  • crx CAN-Receive, testet ob ein CAN-Telegramm empfangen wurde (nur in seltenen Sonderfällen benötigt; seit 2010-02)
  • cs CAN-Status, bitweise codierter Status des CAN-Controllers
  • csim. : Modul-Präfix des CAN-Simulators. Existiert nur im Programmiertool.
  • dia.xxx Diagramm-Funktionen (und -Kommandos; nur bei manchen Geräten)
  • disp.<Name>.<Komponente> ermöglicht den Zugriff auf Anzeigeelemente der aktuellen Seite
  • gps.xxx : Funktionen zum Steuern eines externen GPS-Empfängers ("GPS-Maus")
  • gsm.xxx : Funktionen zum Steuern eines externen GSM/GPRS-Modems
  • hex$ : wandelt einen Integer-Wert in eine hexadezimale Zeichenkette ("Hex-String") um
  • inp (inputs) liest den Zustand der digitalen Eingänge des UPT's
  • isin(X) Integer-Sinus aus ROM-Tabelle. X=0...1023 liefert eine volle Sinus-Periode.
  • jx, jy, jc dienen zur Abfrage des (optionalen) analogen Joysticks
  • kd, ku, kb , kr , kc, kcb (key down, key up, key buffered, key released, key code,..) Tastatur-Abfrage-Funktionen
  • lim(value,min,max) Arithmetische Begrenzungsfunktion.
  • mm, mi : Menue-Modus, Menue-Index
  • nbit(matrix,bitnr) Sucht das "nächste" Bit in einer Bitmatrix
  • nv Lese- und Schreibzugriff auf nichtflüchtige numerische Werte (non-volatile)
  • obd(index.subindex) ähnelt "sdo", greift aber auf das eigene (lokale) CANopen-Objekt-Dictionary zu
  • out Lese(!)- und Schreibzugriff für die digitalen Ausgänge des UPT's (digital outputs)
  • pdo[N].xxx liest Komponenten eines PDO-Kanals: counter, data, received-flag, transmitted-flag, modified-flag, etc.
  • pn (page number) liefert die aktuelle Seitennummer, pcnt die Anzahl programmierter Anzeigeseiten
  • puc, pur (= page-update-count, page-update-rate): Funktionen zur Analyse der Seiten-Aufbau-Rate
  • power (nur für alte Geräte, z.B. "MKT-View PLUS") : Power-Flag.
  • random(N) : Zufallsgenerator für Ganzzahlen. Der Wertebereich umfasst 0 bis N-1 (!) bei positivem N, und -(abs(N)-1) bis +(abs(N)-1) bei negativem N.
  • rgb(red, green, blue) mischt eine Farbe aus RGB-Komponenten. Ergebnis ist eine 32-bit Ganzzahl.
  • rtc.xxx (real time clock) Zugriff auf die batteriegepufferte Echtzeituhr, falls vorhanden
  • rot.xxx (rotary knob) Lesen von Modus und Position des Drehknopfes (bei bestimmten Terminals)
  • script.XYZ greift auf eine globale Variable im Script-Programm zu (nur für Geräte mit Script-Sprache - siehe Feature-Matrix)
  • sdo(index.subindex, type) liest oder schreibt einen Wert per CANopen-SDO-Kanal
  • ser.xxx Serielle Schnittstelle: Konfiguration, Senden, Empfangen (bei bestimmten Terminals)
  • sigs.xxx Konfiguration des Timeout-Monitor für empfangene Signals (nur Terminals mit "CANdb-Support")
  • str(<format>,<value>) wandelt einen numerischen Wert in einen String um
  • syn.xxx liest Komponenten der CANopen SYNC-Message: counter und received-flag.
  • sys.xxx liest bestimmte Systemwerte wie Versorgungsspannung, Temperatur, etc (bei bestimmten Terminals)
  • tv0...tv3 (timer values) Werte der programmierbaren Timer
  • type2str(typ) Wandelt den Code für einen Datentyp in einen lesbaren String um. Beispiel: type2str(1) liefert "BOOL" .
  • ti  Systemzeit (time), wird alle 100 Millisekunden inkrementiert
  • udp.xyz : Funktionen (und Kommandos) zur Kommunikation per Ethernet / UDP (User Datagram Protocol)
  • v enthält den "aktuellen Wert" (value) der Variablen in der aktuellen Anzeigezeile
  • val() , eval(): wandeln Zeichenketten (strings) in Zahlen um 
  • var(<name>) Variablen-Referenz (wobei <name> selbst eine Variable sein kann)
  • vkey.xyz : Funktionen zum Steuern der virtuellen Tastatur (für Geräte mit Touchscreen)
  • xmax, ymax liefern (seit 03/2011) die maximal mögliche X- und Y-Koordinate, abhängig vom Display-Typ.

Siehe auch:




Funktionen zum Abfragen der Tastatur

Der numerische Interpreter enthält einige Tastatur-Abfrage-Funktionen, die meistens zur Formulierung von Events verwendet werden. Sie können diese Funktionen aber auch als Teil von numerischen Ausdrücken verwenden.

Bei Geräten mit Script-Sprache (z.B. MKT-View II,III,IV) wird empfohlen, wenn überhaupt eine 'eigene Tastaturabfrage' nötig ist, die Tastaturereignisse per Script zu verarbeiten.

Alle Tastatur-Abfrage-Funktionen bestehen aus zwei Buchstaben und evtl. einer direkt darauf folgenden Ziffer. Die Buchstaben bestehen aus der Abkürzung eines (englischen) Funktionsnamens. Die Ziffer gibt (meistens) an, welche Taste abgefragt werden soll. "Taste 0" ist meistens die "erste Funktionstaste" auf der linken Seite, dies hängt vom Tastaturlayout ab. In der folgenden Übersicht ist die Tastennummer durch den Buchstaben "N" ersetzt :
kdN
Testet ob Taste N in diesem Moment grade gedrückt ist ("key down"). Die Taste wird in dem Moment abgefragt, in dem diese Funktion aufgerufen wird, es findet keine "Pufferung" statt (im Gegensatz zu "kb", siehe Unten).
Resultat: 1 (=TRUE) wenn die Taste momentan gedrückt ist, andernfalls 0 (=FALSE).
kuN
Testet ob die Taste im Moment "oben" ist ("key up"), d.h. im Moment nicht gedrückt ist. Im Gegensatz zu "kr" (key released, s.U.) liefert diese Funktion auch TRUE, wenn die Taste seit dem Einschalten noch nie gedrückt wurde. "kr" liefert nur TRUE, nachdem eine bestimmte Taste losgelassen wurde.
kbN (bzw. kb(<Tastenname>) bei neueren Geräten)
Testet ob Funktionstaste N(0..7) in den Tastaturpuffer eingetragen wurde ("key buffered"). Falls die Taste seit dem letzten Aufruf dieser Funktion gedrückt wurde, liefert die Funktion den Wert 1 (=TRUE), und die Taste wird aus dem Puffer entfernt (ein wichtiger "Nebeneffekt" !).
Im Gegensatz zu kd erkennt diese Funktion auch kurzzeitige Tastenbetätigungen, weil die Abfrage in einer Interruptroutine im Hintergrund läuft.
Geräte mit 32-bit-CPU und Firmware-Kompilationsdatum seit 2009-09-30 unterstützen eine erweiterte Syntax für die kb-Funktion, mit der z.B. auch Cursortasten abgefragt werden können. Weitere Details zur erweiterten Syntax finden Sie hier.
krN
Testet ob Funktionstaste N(0..7) nach dem Drücken wieder losgelassen wurde (kr = "key released"). Wie die "kb"-Funktion verwendet auch "kr" einen internen Ereignis-Puffer, der beim Aufruf der Funktion gelöscht wird. Beispiel :
kr0 || kr1 || k2     testet ob F1 oder F2 oder F3 nach der Betätigung wieder losgelassen wurde .
Hinweise:
  • Diese Funktion hat einen Nebeneffekt: Durch die Abfrage des Event-Flags wird dieses gelöscht (quittiert) ! Im obigen Beispiel mit der logischen ODER-Verknüpfung werdem daher drei Flags (für die Tasten F1...F3) gelöscht, denn der Interpreter arbeitet den kompletten Ausdruck ab (im Gegensatz zur Programmiersprache "C", die die Auswertung der ODER-Verknüpfung nach der ersten "TRUE"-Bedingung abbrechen würde).
  • Geräte, deren Firmware vor dem 2. Juli 2007 compiliert wurde, unterstützen diese Funktion nicht !


Die Tastennummer "N" kann automatisch vom Programmiertool eingesetzt werden, wenn Sie die Taste aus einer Liste auswählen (zum Beispiel im Ereignis-Definitions-Dialog: Wählen Sie dort die Funktion "key pressed" ... "F1", das Programmiertool erzeugt daraus den Quelltext "kd0").

 

Für komplexere Anwendungen ist auch die Abfrage der "System-Tasten" mit drei weiteren Interpreterfunktionen möglich:

kh (keyboard hit)
Testet ob irgendeine Taste seit dem letzten Aufruf der "kc"-Funktion (s.U.) gedrückt wurde ("keyboard hit"). Der Rückgabewert ist "0" wenn keine Taste gedrückt wurde, oder "1" wenn irgendeine Taste auf der UPT-Tastatur gedrückt wurde (und nun im Tastaturpuffer auf ihren "Abtransport" wartet).
kc (key code)
Liest den System-Tasten-Code(!!) einer Taste aus einem Puffer. Sollte nur aufgerufen werden, wenn die Funktion "kh" (key hit) vorher den Wert "1" geliefert hat. Durch den Aufruf dieser Funktion wird der Tastencode auch aus dem (speziellen) Tastaturpuffer entfernt. Der nächste Aufruf von "kc" wird dann den Wert Null liefern, bis der Bediener wieder eine Taste drückt. Warnung: Die System-Tasten-Codes könnten von der UPT-Hardware abhängig sein !
Siehe auch: Detailierte Erklärung der Funktionen "kh" und "kc".
kcb (key code buffered)
Nahezu identisch mit der kc-Funktion. Im Gegensatz zu kc entfernt "kcb" den Tastencode beim Auslesen nicht aus dem Puffer. Ferner wird der Inhalt von "kcb" nicht gelöscht, wenn das Anzeigeprogramm zu einer anderen Seite umschaltet. Wenn die Applikation eine Taste verarbeitet hat, sollte der Inhalt der Pseudo-Variablen "kcb" mit der folgenden Anweisung gelöscht werden:
kcb=0 : REM clear key-code-buffer so we can detect the next event
Da "kcb" im Gegensatz zu "kc" den Tastencode beim Auslesen nicht löscht, kann diese Funktion beliebig oft zur Abfrage von bestimmten Tasten eingesetzt werden. Hier ein Beispiel zur Abfrage der ENTER-Taste (mit Code 13 = "carriage return"):
Ereignis: kcb=13
Reaktion: @X=X+1 : kcb=0
Beachten Sie das Löschen der Taste in der Reaktionsmethode ! Die Abfrage, ob überhaupt eine Taste gedrückt wurde, ist hier nicht nötig (solange keine Taste gedrückt wurde, liefert kcb den Wert Null).

km (keyboard matrix)
Liefert den aktuellen Zustand der Tastaturmatrix als Kombination von bis zu 32 Bits (Tasten). Dieser Wert wird direkt vom Tastaturtreiber des Terminals gelesem, er ist daher hochgradig hardware-abhängig. Als "Daumenregel" gilt: Der Zustand der "ersten" Taste (oft "F1") steht in Bit 0, und so weiter.
Die Funktion "km" ermöglicht es (im Gegensatz zu den anderen Tastatur-Abfrage-Funktionen), auch viele Tastenkombinationen (wie z.B. F1+ESCAPE+CursorLeft) abzufragen, sofern die Tastaturelektronik dies zuläßt. Wegen der Hardware-Abhängigkeit der Funktion sollten Sie diese nur einsetzen, wenn unbedingt nötig !
Tipp: Bei Terminals mit CANopen V4 kann die Tastaturmatrix auch als CANopen-Objekt 0x5001 in einen TPDO (= gesendetes Prozessdatenobjekt) eingeblendet werden. Eine Zuordnung zwischen Tasten und Bitnummern finden Sie in der Beschreibung von Objekt 0x5001 im CANopen Object Dictionary.
keyrepeat (keyboard repeat interval in milliseconds / flag to turn repeat off)
Konfiguration der automatischen Tastatur-Wiederhol-Funktion. Per Default verwendet das Terminal einen ähnlichen Tastatur-Repeat wie eine PC-Tastatur. Mit dem Kommando "keyrepeat=0" kann die automatische Wiederholung abgeschaltet werden, falls sie stört. Mit "keyrepeat=1000" wird startet die Repeat-Funktion, wenn eine Taste länger als 1000 Millisekunden gedrückt wird.
Hinweis: Diese Funktion existiert erst seit 2006-10-04 ! (Firmware-Datum beachten)
keytable
Ermöglicht das Umschalten der aktuellen Tastatur-Zuordnungs-Tabelle per Interpreterkommando, bzw. das Lesen des aktuellen Zustandes per Interpreterfunktion. Diese Funktion wurde 2009-12-16 für ein bestimmtes Gerät implementiert, bei dem nur Cursortasten ("Pfeiltasten") sowie ENTER und ESCAPE physikalisch existierten, aber leider keine Funktionstaste, und auch keine 'Shift'-Taste (mit der notfalls die Tastenfunktion durch den Benutzer umgeschaltet werden könnten, um z.B. auch die Tastencodes F1 .. F6 zu erzeugen).
Ähnlich wie mit einer Shift-Taste ("Umschalttaste") kann per 'keytable=XYZ' die Tastaturbelegung programmgesteuert umgeschaltet werden. Beispiele:
keytable=0  selektiert die Default-Tastatur-Tabelle (hier: mit vier Cursortasten, ENTER, und ESCAPE);
keytable=1  selektiert die erste alternative Tabelle (hier: mit Funktionstasten F1..F6 statt der oben erwähnten Tasten); etc.
Faustregel: keytable=0 ordnet den Tasten ihre normalen (auf der Tastaturfolie abgebildeten) Funktionen zu, keytable=1 selektert die erste 'alternative' Tabelle (die man bei geeigneten Tastaturen mit der linken Shift-Taste erreichen würde), und so weiter.
Hardwarespezifische Details finden Sie in der Hardwarebeschreibung.
Hinweis: Die Funktion 'keytable' wird vom im Programmiertool enthaltenen Simulator nicht unterstützt !

Siehe auch:

Erweiterte kb()-Funktion für Geräte mit 32-Bit-CPU

Geräte mit 32-bit-CPU und Firmware-Kompilationsdatum seit 2009-09-30 unterstützen eine erweiterte Syntax für die kb-Funktion, mit der z.B. auch Cursortasten abgefragt, und aus dem Tastaturpuffer entfernt werden können.

Beispiele:

kb(ENTER)
Prüft ob die 'ENTER'-Taste gedrückt wurde.
Wenn ja, liefert die Funktion den Wert 1 (Eins, TRUE) und entfernt den Tastencode aus dem Puffer.
Entsprechendes gilt auf für die folgenden Beispiele.
Bei einigen Geräten ist die ENTER-Taste mit 'Ok' beschriftet, bei anderen ist ENTER die 'nicht beschriftete quadratische Taste zwischen den Cursor-Tasten (Pfeil-Tasten)'.
kb(ESC)
Abfrage der 'ESCAPE'-Taste. Wird meistens zum 'Abbrechen' irgendeiner Aktion verwendet. Diese Taste ist manchmal mit 'ESC' beschriftet, manchmal mit 'Cancel'. Bei anderen Geräten ist die 'Abbruch'-Taste mit einem Symbol beschriftet (z.B. "rote Nuss-Ecke"), dessen Bedeutung wohl nur dem Anwender (Auftraggeber) bekannt ist...
kb(UP)
Fragt die 'Cursor-Up'-Taste ab. Diese ist oft mit einem Pfeil oder nach oben zeigendem Dreieck beschriftet.
Bei anderen Geräten (ohne 'echte' Cursortasten) wird 'Cursor Up' per Drehgeber emuliert.
kb(DOWN)
'Cursor Down'-Taste. Beschriftung i.A. mit einem nach unten zeigenden Pfeil oder Dreieck.
kb(LEFT)
'Cursor Links'-Taste. Beschriftung i.A. mit einem nach links zeigenden Pfeil oder Dreieck.
kb(RIGHT)
'Cursor Rechts'-Taste. Beschriftung i.A. mit einem nach rechts zeigenden Pfeil oder Dreieck.
kb(F1)
Abfrage der 'ersten' Funktionstaste. Bei manchen Geräten mit 'F1' beschriftet.
Beim MKT-View II/III dient diese Taste auch als Ein/Aus-Schalter, und ist entsprechend beschriftet.
kb(F2)
Abfrage der zweiten Funktionstaste. Bei manchen Geräten mit 'F2' beschriftet.
Beim MKT-View II/III ist F2 die mittlere, nicht beschriftete, Taste.
kb(F3)
Abfrage der dritten Funktionstaste. Bei manchen Geräten mit 'F3' beschriftet.
Beim MKT-View II/III ist F3 die nicht beschriftete Taste oberhalb des Drehknopfs (unten).

Detailierte Beschreibung der Funktionen 'kh' und 'kc' (spezielle Tastaturfunktionen)

Die Funktionen "kh" (key hit) und "kc" (key code) ermöglichen eine direkte Tastaturabfrage in der Anwendung, mit der z.B. Sonderfunktionen realisiert werden können, für die die normalen Eingabefelder nicht ausreichen.

Die Funktion "kh" kann zur Formulierung eines Events verwendet werden, mit dem abgefragt wird ob irgendeine Taste (außer den Shift-Tasten) gedrückt wurde.

"kh" testet, ob irgendeine Taste seit dem letzten Aufruf der Funktion "kc" gedrückt wurde (siehe Unten). "kh" liefert den Wert "0" (Null) wenn keine Taste gedrückt wurde, oder "1" (Eins) wenn irgendeine Taste auf der UPT-Tastatur gedrückt wurde. Genaugenommen wird mit dieser Funktion abgefragt, ob Zeichen im Tastaturpuffer warten oder nicht.

"kc" holt den nächsten Tastencode aus dem Puffer (und entfernt die Taste damit aus dem Puffer!). Für ehemalige DOS-Programmierer: "kh" = "kbhit()",  und "kc" = "getkey()" aus Borland's CONIO.

Die folgenden Ereignisdefinitionen stammen aus einem Beispiel im Verzeichnis "Programs":

Das Ereignis (event) "kh" löst die Reaktion "@Key=kc" aus, wenn eine Taste im Tastaturpuffer wartet. Der Tastencode wird dann aus dem Puffer geholt und an die Variable "Key" zugewiesen (die Variable "Key" muß dazu in der Variablentabelle definiert sein).

Falls die Variable "Key" beispielsweise per SDO-Kommunikationskanal mit einem externen Gerät (außerhalb des UPTs) verbunden ist, kann der Wert in der Variablen "Key" wieder auf Null gesetzt werden, sobald sie erfolgreich per SDO an die "Außenwelt" weitergegeben wurde (und vom Partner per SDO quittiert wurde).

Das Event

(Key!=0)&&(Key.od)

wird TRUE(1) wenn der aktuelle Wert der Variablen "Key" NICHT NULL ist und der Inhalt der Variablen bereits erfolgreich über den mit "Key" verbundenen Kommunikationskanal gesendet wurde (.od bedeutet "output done" bzw. "Ausgabe erledigt").

Wenn wir "Key" in diesem Beispiel wieder auf Null setzen würden, sobald "kein Tastendruck" vorliegt, könnten Tastenereignisse verlorengehen. Dieses Beispiel stellt sicher, daß der Partner den Tastencode erhalten wird, egal wie lange die Taste gedrückt wurde und wie langsam der Übertragungskanal arbeitet.

Wir empfehlen, die Funktion "kc" nach Möglichkeit nicht zu verwenden, weil sich die Tastencodes die von dieser Funktion geliefert werden von der verwendeten Tastatur abhängen, die sich in zukünftigen Firmware- oder Hardware-Versionen ändern könnten.


Von der Funktion "kc" gelieferte System-Tastencodes
Einige Tasten mit fest zugeordneten Spezialfunktionen können von der Applikation mit den Funktionen "kc" (keyboard code) und "kcb" (keyboard code, buffered) abgefragt werden. Wir versuchen, diese Tastencodes -unabhängig von der Tastatur-Hardware- auch in zukünftigen Geräten beizubehalten. Die unten folgende Tabelle enthält die Tastencodes, die sich mit hoher Wahrscheinlichkeit nicht ändern werden.

(Hinweis: Um mit dem Programmiertool "hotkeys" für Menüs und Schaltflächen zu definieren, brauchen Sie diese numerischen Werte nicht ! Geben Sie besser den NAMEN der Tasten in der entsprechenden Definitionstabelle ein )

Die folgende Tabelle stellt eine Vereinigungsmenge aller bislang verfügbaren Tastaturen dar; möglicherweise verfügt die von Ihnen eingesetzte Tastatur nur über wenige der hier aufgeführten Tasten ! Einige der unten aufgeführten Codes können als Parameter für die Funktion "hk" (handle key) eingesetzt werden, falls Ihre Tastatur nicht über bestimmte, für Ihre Anwendung wichtige Tasten verfügt.

Code Tastenname Hinweise
Tasten mit Sonderfunktionen,
nur wenige davon werden bei einem bestimmten Gerät wirklich existieren:
8 BACKSPACE short name BS
9 TAB
10 EDIT
11 CLEAR
12 QUESTIONMARK because ASCII-'?' is MF2-scancode for "F5" (#63)
13 ENTER alias RETURN
14 SAVE rhombic shape with arrow
15 HELP sometimes labelled "Help", customer specific
16 MODE
17 ALPHA often labelled "A...Z"
18 LIGHT sometimes lightbulb symbol, customer specific
19 CONTRAST no unified symbol for this yet
20 INSERT
21 DELETE
22 POS1
23 END
24 PAGE_UP encoder may be mapped to this key
25 PAGE_DOWN encoder may be mapped to this key
26 (reserved)
27 ESCAPE
28 SHIFT1 usually NOT placed in keyboard buffer
29 SHIFT2 usually NOT placed in keyboard buffer



Tasten mit ASCII-equivalenten Zeichen
32 SPACE
43 PLUS
46 DOT
48 DIGIT_0 short key names 0 .. 9 for numeric digits
49 DIGIT_1
50 DIGIT_2
51 DIGIT_3
52 DIGIT_4
53 DIGIT_5
54 DIGIT_6
55 DIGIT_7
56 DIGIT_8
57 DIGIT_9



Codes 59 bis 68 sind SCANCODES der FUNKTIONSTASTEN bei MF2-Tastaturen.
F1..F3 könnten die einzigen "Tasten" sein, die bei Ihrer Tastatur wirklich existieren (MKT-View) !
59 F1
60 F2
61 F3
62 F4
63 F5
64 F6
65 F7
66 F8
67 F9
68 F10
69 F10
70 F12



Weitere Sonderfunktionen...
71 DOUBLECLICK Doppelklick mit Drehknopf ("Encoder")



Codes 77,75,72,80 sind SCANCODES des CURSORBLOCKS bei MF2-Tastaturen:
77 RIGHT
75 LEFT
72 UP
80 DOWN



"Geshiftete" Cursortasten:
81 SH_RIGHT
82 SH_LEFT
83 SH_UP
84 SH_DOWN



Eines Tages wird es möglicherweise ein "UPT" mit alphanumerischer Tastatur geben...
...welches dann die folgenden Codes für die BUCHSTABEN verwendet (ASCII lower case):
97 ASCII_a
...

122 ASCII_z



Einige Hintergrundinformationen zu den System-Tasten-Codes:

  • Die Tastencodes liegen immer im Bereich 1..127 (7 bit). Sie werden intern als 8-bit-Wert abgelegt. Das MSB fungiert als "Make/Break"-Flag ähnlich wie bei PC-Tastaturen (Bit 7 gelöscht bedeutet "Taste wurde gedrückt", Bit 7 gesetzt bedeutet "Taste wurde losgelassen"). Die Interpreterfunktion "kc" filtert die Break-Codes allerdings aus, Ihre Applikation wird daher immer nur die Codes 1..127 empfangen.
  • Die Fernsteuerung für Geräte ohne "echte" (eigene) Tastatur verwendet die gleichen Tastencodes für die Übertragung vom Terminalprogramm zum fernbedienten Gerät.
    Der Rückkanal (für die Anzeige von Zeichen im auf dem PC laufenden Fernsteuer- bzw. Terminalprogramm) verwendet dagegen VT-52-Escape-Sequenzen.

 

Siehe auch: Übersicht der Tastaturfunktionen, Funktionen zur Abfrage des Drehknopfes .


Arithmetische und andere numerische Funktionen



isin(X) Integer-Sinus aus ROM-Tabelle

X=0...1023 liefert eine volle Sinus-Periode. Wertebereich (aus Tabelle) +/- 32767. Nicht für UPT515. Kann für die Implementierung von "Drehzeiger-Instrumenten" verwendet werden, wie z.B. bei der Analoguhr im Programm "cdb_test1.cvt". Liegt das Argument (X) ausserhalb des Bereichs 0..1023, wird intern eine Modulo-Operation eingesetzt um die Sinus-Funktion periodisch fortzusetzen.
Hinweis: Bei Geräten mit 32-Bit-CPU (z.B. MKT-View III,IV) stehen in der Script-Sprache auch trigonometrische Funktionen mit 32-Bit-Fließkomma-Arithmetik zur Verfügung.

lim(value,min,max)

Limit-Funktion.

Resultat:
value, falls (value>=min) und (value<=max)
min, falls value<min
max, falls value>max . 

pn (page number), pcnt (page count)

Diese Funktionen liefern die aktuellen Seitennummer, bzw der Anzahl vorhandener Anzeigeseiten. Beachten Sie bitte, dass -wie bei allen Array-ähnlichen Datentypen- die Seitennummern von 0 (Null) bis <Anzahl Seiten MINUS EINS> laufen. Besteht ein Anzeigeprogramm z.B. aus zehn Seiten (pcnt=10), liegt pn (page number) zwischen 0 und 9. Diese Funktionen sind im Zusammenhang mit dem goto-Kommando hilfreich, um z.B. per Softkey zur "vorhergehenden" oder zur "nachfolgenden" Anzeigeseite umzuschalten.

pn
liefert die aktuelle Seitennummer im Bereich 0 bis (pcnt-1) ,
pcnt
liefert die Anzahl programmierter Anzeigeseiten .

Zusätzlich zum Ermitteln der aktuellen Seitennummer kann die pn-Funktion auch die Nummer einer beliebigen, durch ihren Namen definierten Seite liefern. Beispiel:

pn("BusOff")

liefert die Seitennummer der Seite namens "BusOff" .

Diese Funktion wird z.B. in globalen Events verwendet, wenn das Terminal momentan nicht eine bestimmte Seite anzeigt. Mit anderen Worten, wenn "irgendwas" getan werden soll, außer wenn im Moment eine bestimmte (spezielle) Seite angezeigt wird. Hier ein Beispiel, mit dem zu einer bestimmten Anzeigeseite (namens "BusOff") umgeschaltet wird, wenn sich der CAN-Controller im Zustand "Bus-Off" befindet; aber nur wenn das Programm nicht sowieso schon die Seite "BusOff" anzeigt :

Global Event condition:

cb && ( pn != pn( "BusOff" )  ) .
Remember, "pn" is the current page number, and pn("BusOff") retrieves the number of a page called "BusOff" in your application .

Global Event reaction:

g( "BusOff" ) : REM switch to "BusOff" when CAN is bus-off, and not already there .
On the "BusOff" page, a warning could be displayed, or the application could try to reset the CAN controller .

puc (page update counter), pur (page update rate)

Testfunktionen zum Messen der Aktualisierungsgeschwindigkeit:
puc   zählt wie oft die aktuelle Bildschirmseite seit ihrem Aufruf aktualisiert wurde.
pur   liefert die Frequenz (in zehntel Hertz) mit der die aktuelle Seite aktualisiert wird.

> zurück zur Übersicht numerischer Interfunktionen

"v" (Interpreter-Funktion)

Liefert den aktuellen numerischen Wert ("value") innerhalb einer Anzeigezeile, der sich aus dem Feld "var/expr" field ergibt (als Teil einer Display-Zeilen-Definition). Diese Funktion wurde implementiert, um ein Icon (in Backslash-Sequenz) abhängig vom Wert einer Variablen invertieren zu können, ohne den Namen der Variablen (o.ae.) in der Sequenz duplizieren zu müssen. Ein Beispiel finden Sie in der Erklärung der Icon-Backslash-Sequenz, ein weiteres im Beispielprogramm für 'Check-Buttons'.

Konvertierungsfunktionen 'val' (value) und 'eval' (evaluate)


val(s) (value, Interpreter-Funktion zum Umwandeln einer Zeichenkette in eine Zahl)

Wandelt den String (s) in einen numerischen Wert um. Beispiele:

  • val("123") liefert die Zahl(!) 123
  • val("1+2+3") liefert die Zahl(!) 6
  • val(sa[X]) liefert den X-ten Eintrag in der Text-Tabelle (string array) als numerischen Wert

Hinweis: Die val()-Funktion wurde im Juli 2005 für eine spezielle Anwendung implementiert (um einen Teil der Text-Tabelle zur Speicherung von Zahlen einzusetzen) . Ältere Terminals (und ältere Firmware-Versionen) enthalten diese Funktion nicht ! Bei manchen Geräten existiert zusätzlich zur einfachen "val"-Funktion noch die im nächsten Absatz beschriebene Funktion eval .

eval(string,pos,ndigis,type,default) (extended value-function)

Wandelt eine Zeichenkette -ähnlich vie val()- in einen numerischen Wert um, bietet allerdings erweiterte Möglichkeiten. Verfügbar seit 09/2005 in Geräten mit 16-bit-CPU und erweiterten String-Verarbeitungs-Funktionen.

Syntax #1: eval(<source-string>, <number of chars to be skipped>, <number of chars to parse> [,<type> [,<default>]])

Beispiele für "eval", Syntax #1 :

  • eval( "Hello 123.45 !?", 5, 7, F, 9999 )
    (Die ersten 5 Zeichen werden übersprungen, dann bis zu 7 Zeichen als dezimale Fliesskommazahl interpretert, und falls keine gültige Zahl vorliegt der Default-Wert 9999 geliefert. In diesem Beispiel ist das Ergebnis daher 123.45 als Fliesskommazahl)
  • eval( "Hello 123.45 !?", 5, 7, I, 9999 )
    (Liefert 123 als Integerzahl)
  • eval( "FFFF", 0, 4, H, 0 )
    (Wandelt die Hex-Zahl 0xFFFF in eine Integerzahl um, das Ergebnis in diesem Beispiel 65535 (dezimal) )
  • eval( "No number in here", 0, 10, I, 9999 )
    (Liefert den Defaultwert, hier 9999, weil an der angegebenen Position im String keine gültige Zahl vorliegt)

Syntax #2 : eval(<source-string>, <substring>, <number of chars to parse> [,<type> [,<default>]])

Hier wird die Anzahl zu überlesender Zeichen (vor der gesuchten Zahl) nicht als numerischer Wert im zweiten Argument übergeben, sondern als Sub-String (token), der den Anfang der gesuchten Zahl markiert. Der Interpreter sucht zunächst nach <substring> in <source-string>, überspringt die entsprechende Anzahl Zeichen, und konvertiert die danach folgende Zahl aus dem String. Daher liefert der Ausdruck eval("x=0 t=1234","t=",4) das gleiche Resultat wie eval("y=3 t=1234",6,4), nämlich 1234, denn beiden Fällen werden erst 6 Zeichen überlesen bevor die Zahl aus dem Quell-String konvertiert wird. Der Vorteil von Syntax #2 ist, dass dies unabhängig von der Anzahl Zeichen *vor* der Zahl funktioniert (d.h. wenn die Länge des Quellstrings nicht konstant ist, was z.B. beim Empfang von Daten über die serielle Schnittstelle vorkommt).

Beispiele für "eval", Syntax #2 :

  • @Temp_I = eval(ser.rstr,"i=",8,F,Temp_I) : rem parse value #1
    Empfängt eine Textzeile von der seriellen Schnittstelle (ser.rstr), sucht nach dem ersten Auftreten des Tokens (substring) "i=", und wandelt bis zu 8 der danach folgenden Zeichen in eine Fliesskommazahl (Format F) um. Falls das Token "i=" in der empfangenen Zeichenkette nicht enthalten ist, oder danach keine gültige Fliesskommazahl im Text folgt, wird der alte Wert der zugewiesenen Variablen (hier: Temp_I) als Default-Wert zurückgeliefert. Mit anderen Worten: Wenn nichts passendes empfangen wurde, ändert sich der Wert von Temp_I in diesem Beispiel nicht.
    Hinweis: Dieses Beispiel wurde aus einem Testprogramm für den seriellen Port / MKT-View entnommen (Datei ser_test.cvt), die Sie im Unterverzeichnis 'programs' des Programmiertools finden (falls Ihr Terminal den Zugriff auf die serielle Schnittstelle bietet ... also nicht beim Programmiertool für das UPT515 )

Zurück zur Übersicht der Funktionen des Interpreters


CANopen-spezifische Funktionen des UPT-Display-Interpreters

PDO-Funktionen des UPT-Display-Interpreters

Hinweis: nicht alle Geräte unterstützen PDOs (process data objects) !

Der Interpreter enthält einige Funktionen (und Prozeduren) zum Zugriff auf die PDO-Kanäle. Einige davon können für Event-Definitionen und als Teil numerischer Ausdrücke verwendet werden.
In der Script-Sprache existieren keine äquivalenten Funktionen - Sie können die Prozessdatenobjekte allerdings per Script steuern (und auch notfalls 'umprogrammieren'), indem Sie per Script auf die PDO-Mapping- und -Kommunikationsparameter zugreifen. Verwenden Sie im Script dazu das Kommando cop.obd(index,subindex).

Sie benötigen diese Funktionen im Normalfall nicht, um Werte aus einem empfangenen PDO zu lesen bzw. um Variableninhalte als Teil eines PDOs zu senden ! (verbinden Sie zu diesem Zweck Variablen mit einem PDO-Kanal wie im Kapitel "Variablen an PDO-Kanälen" beschrieben)

Alle hier beschriebenen PDO-Funktionen erfordern die Angabe eines "Indexes" um zu definieren, welcher PDO-Kanal verwendet werden soll.

Sie können pdo0, pdo1, pdo2 oder pdo3 verwenden. Falls der Index variabel sein muß, verwenden Sie einen Ausdruck wie pdo[PdoNr] oder ähnlich.

Ein Punkt (.) dient als Trenner zwischen dem Schlüsselwort "pdo" von der PDO-Struktur-Komponente, die weiter Unten beschrieben wird. Die meisten drei-Buchstaben-Komponenten-Namen können durch zwei Buchstaben abgekürzt werden, z.B. pdo[0].cyc ist das Gleiche wie pdo[0].cy usw.

Übersicht der PDO-Funktionen im Display-Interpreter:

pdo[N].cnt
Liefert den Wert eines Zählers. Verwenden Sie diese Funktion um zu ermitteln, wie oft ein bestimmter PDO seit Power-On gesendet bzw. empfangen wurde.
pdo[N].cyc
Liefert die Zykluszeit für Sende-PDOs in Millisekunden. Sie können durch eine formale Zuweisung an diese Komponente auch einen neuen Sendezyklus (zur Laufzeit!) einstellen, z.B.: pdo[0].cyc = 1234 .
Der Sendezyklus funktioniert ähnlich wie der "PDO Event Timer", beschrieben in CANopen DS301 V4.0, Object 0x1400, Subindex 5.
pdo[N].dat[I]
Liefert den aktuellen Wert des [I]-ten Datenbytes aus PDO-Kanal N. Normalerweise verbinden Sie ja eine Variable mit einem PDO, um ein oder mehrere Bytes aus dem PDO-Datenfeld zu "isolieren", darum werden Sie diese Funktion nur sehr selten brauchen (außer für "sehr spezielle" Zwecke !). Sie können durch eine formale Zuweisung auch ein einzelnes Byte in einem Sende-PDO ändern, z.B.:
pdo[0].dat[7] = 123 (dies ist allerdings sinnlos, wenn eine Variable in dieses Byte des PDOs gemappt ist !)
pdo[N].id
Zugriff aus den aktuellen CAN-Identifier eines PDO-Kanals.
Sie können durch eine formale Zuweisung den Identifier auch während der Laufzeit ändern, z.B.: pdo[0].id = 2047.
DIESE MÖGLICHKEIT DARF NUR MIT ÄUSSERSTER VORSICHT EINGESETZT WERDEN, WEIL DER INTERPRETER WÄHREND DER LAUFZEIT NICHT DIE GÜLTIGKEIT DER CAN-IDENTIFIER TESTET ! Das Senden eines falschen CAN-Identifiers in ein Netzwerk kann schwerwiegende (bis "katastrophale") Probleme verursachen !
Bei Geräten mit CANopen V4 besteht diese Möglichkeit nicht mehr. Verwenden Sie stattdessem den PDO-Kommunikations-Parameter im Object-Dictionary.
pdo[N].rcv
Diese Funktion testet ob seit dem letzten Aufruf schon wieder ein PDO-Telegramm empfangen wurde.
Das Flag wird durch das Auslesen intern wieder zurückgesetzt ! Die Funktion ist nur für den Einsatz in Event-Definitionen vorgesehen. Sie können damit "Überwachungsfunktionen" in Ihr Programm einbauen (z.B. im Zusammenhang mit den Timern das Ausbleiben eines PDOs überwachen).
pdo[N].trn
Diese Funktion testet ob seit dem letzten Aufruf schon wieder ein PDO-Telegramm gesendet wurde.
Das Flag wird (ähnl. .rcv) durch das Auslesen wieder zurückgesetzt. Einsatz in Event-Definitionen.
pdo[N].tx
Dies ist keine Funktion, sondern eine Prozedur. Sie stößt die Sendung eines PDO-Telegramms durch den Interpreter an (allerdings nur, wenn der NMT-Zustand "OPERATIONAL" ist !). Verwenden Sie diese Prozedur wenn sie einen "ereignisgesteuerten" PDO (z.B. auf Tastendruck) realisieren wollen.
pdo[N].mod
Diese Funktion testet, ob ein PDO-Telegramm modifiziert aber noch nicht gesendet wurde.
Ergebnis: 1 (TRUE) = Das PDO-Datenfeld wurde geändert aber noch nicht gesendet
0 (FALSE)= Das PDO-Datenfeld wurde seit der letzten Sendung nicht mehr geändert
pdo[N].syn
Diese Funktion liefert die Anzahl SYNC-Intervalle eines bestimmten PDOs seit dessen letzter Sendung (oder Auswertung, bei RX). Dieser Zähler wird intern für die CANopen-Transmission-Types 2..241 verwendet. Weitere Infos in DS301.

Einige Beispiele zu den PDO-Funktionen finden Sie in den Beispielprogrammen .

SDO-Zugriffsfunktionen

Hinweis: Nicht alle Terminals unterstützen diese Kommandos - nur Geräte mit CANopen (siehe Feature Matrix) !

Dieses Kapitel wurde in ein eigenes Dokument ausgelagert als die Datei zu groß wurde !

SYNC-Funktionen des UPT-Interpreters

Hinweis: Nicht alle Terminals unterstützen SYNC-Telegramme !

Der Interpreter bietet einige Funktionen zum Steuern und Empfangen der SYNC-Message (von CANopen). Einige dieser Funktionen sind zum Einsatz in Event-Definitionen vorgesehen.

Sie benötigen diese Funktionen nicht, um die SYNC-Message nach CANopen-Standard zu verarbeiten ! Alle PDO-Kanäle mit synchroner Übertragung verarbeiten das SYNC-Telegramm selbst und reagieren passend darauf)

Übersicht der SYNC-Funktionen:

syn.rcv (abgekürzt als syn.r )
Diese numerische Funktion testet, ob seit dem letzten Aufruf dieser Funktion ein SYNC-Telegramm empfangen wurde.

Das Flag wird durch das Auslesen intern gelöscht. Die Funktion ist nur für den Einsatz in einer Event-Definition vorgesehen.

Sie könnten zum Beispiel eine "Überwachung" für zyklisch empfangene SYNC-Telegramme programmieren:
Definieren Sie "syn.rcv" als globales Event und ein Timer-Start-Kommando wie "ts0(50)" als entsprechende Reaktion. Dadurch wird Timer 0 (neu) für 500 ms gestartet, wenn ein SYNC-Telegramm empfangen wurde. Definieren Sie ein anderes globales Event ("t0") mit Reaktionsmethode (z.B. g"NoSync"). Erzeugen Sie eine Anzeigeseite namens "NoSync". Diese Seite wird dann aufgerufen, wenn das UPT über eine halbe Sekunde keine SYNC-Telegramme mehr empfängt.

syn.cnt (abgekürzt als syn.c )
Liefert die Anzahl der übertragenen SYNC-Telegramme. Sie können dies für Überwachungszwecke einsetzen (z.B. um zu testen, ob ein neues SYNC-Telegramm empfangen wurde, ohne das "syn.rcv"-Flag zu löschen).

Zurück zur Übersicht der numerischen Funktionen

Generische CAN-Funktionen und -Kommandos

Die folgenden 'generischen' (d.h. nicht CANopen-spezifischen) CAN-Funktionen und -Kommandos existieren nur noch aus Gründen der Abwärtskompatibilität mit alten Geräten (z.B. MKT-View I / MKT-View "Plus") ohne Script-Sprache. Für neue Projekte sollten stattdessen die CAN-Funktionen im Script verwendet werden - wenn überhaupt ein 'selbst programmierter' CAN-Zugriff auf niedrigem Level nötig ist.


cs : CAN-Status, bitweise codierter Status des CAN-Controllers.
  • 0x01 = Hardwarefehler, Problem mit CAN-Treiber (DLL),
    oder "anderer genereller Fehler" für den kein Bit mehr frei war !
  • 0x02 = Überlauf des Empfangspuffers
  • 0x04 = Sendepuffer-Überlauf
  • 0x08 = Problem mit dem CAN-Interrupt (z.B. CPU-Überlastung)
  • 0x10 = kein ACKNOWLEDGE für Sendung oder Sende-Timeout
  • 0x20 = nicht näher definierbarer Busfehler
    (oft aus Fehlermeldung der CAN-Treiber-DLL übernommen)
  • 0x40 = Bus-WARNUNG
    (abnormale Fehlerrate)
  • 0x80 = Bus-OFF
    (Controller hat sich wegen ernster Probleme vom Bus abgekoppelt)

Für die meisten CAN-Fehler-Bits gibt es spezielle Abfragefunktionen, die jeweils nur einen Fehlertyp abfragen, z.B. cb (CAN busoff), ce (CAN error), cw (CAN warning), ch (CAN hardware fault), co (CAN 'other error'), ct (CAN transmit error). Siehe auch: crx (Test ob ein bestimmtes CAN-Telegramm empfangen wurde).

cr : CAN Reset

Dient zum Rücksetzen (Neu-Initialisieren) des CAN-Controllers. Dieses Kommando sollte nur verwendet werden, um den Controller aus dem 'Bus-Off'-Zustand nach einer großzügig dimensionierten Wartezeit wieder 'zum Laufen' zu bringen.
Hinweis: Sie sollten nach dem Erkennen des 'Bus-Off'-Zustandes den CAN-Controller nicht 'sofort' zurücksetzen, denn normalerweise wird der Grund für den 'Bus-Off'-Fehler (z.B. EMV, Störimpulse,..) noch andauern. Die URSACHE für den Bus-Off sollte geklärt werden, wenn der Controller häufiger in den Bus-Off-Zustand umschaltet.

Bei Geräten mit zwei CAN-Schnittstellen kann ab Firmwarestand 2012-11-26 ein 'CAN-Reset' auch selektiv nur für eins der beiden Interfaces ausgelöst werden:
  cr1 Reset des ersten CAN-Controllers (selbst wenn dieser nicht im Zustand 'Bus-Off' ist)
  cr2 Reset des zweiten CAN-Controllers (selbst wenn dieser nicht im Zustand 'Bus-Off' ist)

Siehe auch: Beispielprogramme "demo1.upt" oder "demo2.upt" (zum Einsatz des Kommandos 'CAN Reset'), oder das kurze Beispiel zum Abfragen von "CAN-Bus-OFF" in der pn-Funktion .


crx : CAN-Receive test (crx)

Ebenso wie 'ctx' ist dies eine sehr selten verwendete Sonderfunktion, denn "normalerweise" werden empfangene CAN-Telegramme von einem wie auch immer gearteten CAN-Protokoll-Handler verarbeitet, aber (fast) nie direkt durch das Anzeigeprogramm. Zur Anzeige von 'CAN-Signalen' (die idealerweise in einer CAN-Datenbasis alias "CANdb" / *.dbc definiert sind) brauchen Sie diese Funktion nicht .

Wichtiger Hinweis: Statt des Empfanges von CAN-Telegrammen mit der im Folgenden beschriebenen crx-Funktion (die zum Display-Interpreter gehört), sollten Sie besser die in der Script-Sprache nutzbare can_receive-Funktion verwenden ! Da die Script-Sprache vor dem Ablauf compiliert (nicht interpretiert) wird, laufen Scripts wesentlich schneller als die Event-Abfrage-Definitionen des Anzeigeprogramms. Nur mit der Script-Sprache ist es daher möglich, eigene CAN-Protokoll-Handler zu programmieren .. falls dies nötig sein sollte.

Syntax der crx-Funktion des Display-Interpreters :

crx( <CAN-ID> )
Testet, ob seit der letzten Quittierung ein neues Telegramm mit dem angegebene CAN-Identifier empfangen wurde.
Die Funktion liefert 0 (Null, FALSE) wenn kein Telegramm empfangen wurde, andernfalls die Anzahl der Telegramme seit der letzten Quittierung (s.U.) .
crx( <CAN-ID> ) = 0
Kommando zur Quittierung des CAN-Empfangs. Damit wird das bereits oben erwähnte 'Flag' gelöscht, welches unter Anderem auch den Empfang des nächsten CAN-Telegramms mit dem spezifizierten CAN-Identifier erlaubt..
Dieses Kommando wird üblicherweise ein einer Event-Definition (Reaktion) verwendet, um den Empfang zu 'bestätigen', nachdem die empfangenen Datenbytes in irgendeiner Form verarbeitet wurden. Ein Beispiel dazu finden Sie im weiter unten erwähnten Beispiel "crx_demo".
crx( <CAN-ID> ).cnt
Liefert den aktuellen Zählerstand für alle empfangenen CAN-Telegramme mit dem angegebenen Identifier. Im Gegensatz zu den noch folgenden "Auslese-Funktionen" kann sich der Wert dieses Zählers auch ändern, wenn das weiter oben erwähnte CAN-Empfangs-Flag noch nicht gelöscht wurde.
crx( <CAN-ID> ).len
Liefert die Anzahl Datenbytes im zuletzt empfangenen (und noch nicht 'verarbeiteten') CAN-Telegramm. Dieser auch 'DLC' (data length code) genannte Wert kann zwischen 0 und 8 liegen, da ein CAN-Telegramm Null bis Acht Datenbytes enthalten kann.
Sobald ein CAN-Telegramm mit dem angegebenen Identifier empfangen wurde, ändert sich dieser Wert nicht mehr, bis der Empfang wie oben beschrieben "quittiert" wurde.
crx( <CAN-ID> ).b[N]
Liefert das Datenbyte (8 bit) mit dem Index N im CAN-Telegramm. N ist der 'Byte-Index', gültiger Bereich 0 bis 7 (!).
Sobald ein CAN-Telegramm mit dem angegebenen Identifier empfangen wurde, ändert sich dieser Wert nicht mehr, bis der Empfang wie oben beschrieben "quittiert" wurde.
crx( <CAN-ID> ).w[N]
Liefert das N-te 16-Bit "word" im CAN-Telegramm. N ist der 'Word-Index', gültiger Bereich 0 bis 3(!).
Sobald ein CAN-Telegramm mit dem angegebenen Identifier empfangen wurde, ändert sich dieser Wert nicht mehr, bis der Empfang wie oben beschrieben "quittiert" wurde.
crx( <CAN-ID> ).dw[N]
Liefert das N-te 32-Bit "doubleword" im CAN-Telegramm. N ist der 'Doubleword-Index', gültiger Bereich 0 bis 2(!).
Sobald ein CAN-Telegramm mit dem angegebenen Identifier empfangen wurde, ändert sich dieser Wert nicht mehr, bis der Empfang wie oben beschrieben "quittiert" wurde.

Ursprünglich (im Februar 2010) war die crx-Funktion nur dafür vorgesehen, bei Geräten ohne CANopen (stattdessem mit "CANdb"-Support) den Empfang von CAN-Telegrammen mit Null Bytes Nutzdaten (d.h. mit Data Length Code = 0) zu empfangen, da derartige Telegramme nicht in Form von CAN-Signaldefinitionen beschrieben werden können. Dazu wurde die crx-Funktion als 'Ereignis' in einer globalen Event-Definition eingesetzt, und in der Reaktion -ggf. nach Verarbeitung der empfangenen Datenbytes- der Empfang quittiert (damit die crx-Funktion wieder den Wert 0 d.h. "nichts neues empfangen" liefert, bis das nächste CAN-Telegramm empfangen wird).

Tipps und Hinweise zur 'crx'-Funktion:

  • In der Datei programs/crx_demo.cvt (innerhalb des Programmiertools) finden Sie ein Test- und Beispielprogramm für die crx-Funktion.
    Das Demo verwendet drei verschiedene 'crx'-Objekte, um die Empfangszähler, Telegrammlängen, und einen Teil der CAN-Datenfelder auf dem internen Display anzuzeigen.
    Für das erste crx-Objekt (mit dem 11-bit ID 0x333), wird das Empfangs-Flag sofort wieder gelöscht, sobald ein Telegramm mit dem passenden CAN-ID empfangen wurde, und die Daten verarbeitet wurden (hier: einfaches Umkopieren in eine Variable). Erst durch das Löschen des Empfangs-Flags (d.h. "Quittieren des Empfangs") ist der Empfang des nächsten CAN-Telegramms (mit dem gleichen CAN-Identifier) möglich, bzw. erst danach darf der Empfangspuffer wieder überschrieben werden.
    Beim 2. und 3. crx-Objekt wird das Empfangs-Flag absichtlich nicht gelöscht, was dazu führt, dass der Inhalt des Datenfeldes im Empfangspuffer nicht mehr geändert wird, wenn weitere Telegramme empfangen werden (lediglich der Empfangszähler läuft weiter).
    Diese Besonderheit ist sehr wichtig, da das Datenfeld nicht überschrieben werden darf, solange Ihr Anzeiprogramm die empfangenen Daten nicht komplett verarbeitet hat. Hier die Event-Definition aus dem Demoprogramm (crx_demo.cvt) :

    Event: crx(0x333) :  REM checks if a new message with CAN-ID 0x333 has been received
    Reaction: DWord0=crx(0x333).dw[0] : DWord1=crx(0x333).dw[1] : crx(0x333)=0 : REM handle CAN reception for ID 0x333

    (Bedenken Sie, was passieren würde, wenn zwischen dem Auslesen des ersten und zweiten Double-Words bereits ein neues CAN-Telegramm mit dem gleichen CAN-ID empfangen würde: Das Ergebnis wäre inkonsistent. Aus dem Grund wird im Demoprogramm erst das Datenfeld gelesen (hier: In die Variablen 'DWord0' und 'DWord1' umkopiert), und danach das CAN-Empfangs-Flag gelöscht, d.h. der Empfang quittiert um den Empfang des nächsten Datenfeldes zu ermöglichen. Nebenbei bemerkt, diese 'Empfangs-Quittierung' hat nichts mit dem CAN-Acklowlege-Bit auf CAN-Layer 2 zu tun.)
  • Für die crx-Funktion steht nur eine begrenzte Anzahl von CAN-Empfängern (im CAN-Controller) zur Verfügung. Zum Zeitpunkt der Erstellung dieses Dokuments (Februar 2010) konnten mit der crx-Funktion 8 verschiedene CAN-Identifier überwacht werden.
  • In Geräten mit CANopen (statt "CANdb") ist die crx-Funktion nicht implementiert .
  • In Geräten ohne 32-Bit-CPU (ARM) ist die crx-Funktion ebenfalls nicht implementiert .


ctx : CAN Transmit ('Senden')

Kann verwendet werden, um ein einzelnes CAN-Telegram mit beliebigem Identifier (11- oder 29-bit) und beliebigem Datenfeld zu senden.
Bessere Alternative: Bei Geräten mit 32-Bit-CPU und Support für 'CANdb' können Signale direkt im Programmiertool als 'zu sendendes Signal' deklariert werden.


Wir raten dringend davon ab, dieses Kommando zu verwenden, denn es kann sehr gefährlich sein ein CAN-Telegramm in ein "nur teilweise bekanntes" CAN-Netzwerk zu senden, d.h. ohne Kenntnis des verwendeten "CAN ID - Managements" (welches z.B. bei CANopen in einem Kommunikationsprofil definiert ist, oder in einer CANdb-Datei, etc). Denken Sie daran, wenn sich die Laufkatze des CAN-gesteuerten Krans unerwartet mit Vollgas in die Hallenwand bohrt !


Die von 'ctx' unterstützte Syntax kann auch für den Befehl can_tx() des CAN-Simulators verwendet werden.

Die prinzipielle Syntax des CAN-Sende-Kommandos ist:
ctx( identifier, databyte, ...)

Der Identifier kann den Zusatz ".x" erhalten wenn ein eXtended frame (29-bit-ID) gesendet werden soll. Ohne Präfix erwartet der Interpreter den CAN-Identifier in hexadezimaler Schreibweise; wenn nötig verwenden Sie das Zeichen '#' wenn der ID in dezimaler Form geschrieben werden muß. Wenn Bit 29 im Identifier gesetzt ist (hexadezimale Maske 0x20000000), wird ebenfalls ein extended frame gesendet (beachten Sie, daß Bits immer von 0 bis N gezählt werden, eine Integer-Zahl im Interpreter besteht aus Bits 0..31) .

Die Datenbytes (max. 8) sind im einfachsten Fall hexadezimale Konstanten, oder dezimale Werte (wenn das '#'-Zeichen vorangestellt wird). Darüberhinaus sind auch numerische Ausdrücke möglich, mit Variablen und Funktionsaufrufen (Achtung, alles was nicht eine "einfache Zahl" ist, muss geklammert werden). Ein ganz besonderer Service wurde noch eingebaut: Es ist möglich, 16- und 32-bit Werte mit INTEL- oder MOTOROLA-Byte-Reihenfolge zu senden:

  • .w or .iw = INTEL WORD,
  • .l (kleines "L") oder .il oder .dw = INTEL 'LONG' aka 'doubleword' (32 Bit),
  • .mw = MOTOROLA WORD,
  • .ml = MOTOROLA 'LONG' ('LONG' = 32 bit),
  • .flt = IEEE 754 single-precision floating point mit INTEL byte order :
    1. Byte = Mantisse Bit 7..0; 2. Byte = Mantisse Bit 15..8; 3. Byte = Mantisse Bit 23..16; 4. Byte = Exponent .
  • .flt_m = IEEE 754 single-precision floating point mit MOTOROLA byte order (ein seltener Sonderfall) :
    1. Byte = Exponent; 2. Byte = Mantisse Bit 23..16; 3. Byte = Mantisse Bit 15..8, 4. Byte = Mantisse Bit 7..0 .

Hinweis: Das Senden von Fliesskommazahlen wird erst seit 2009-08-13 unterstützt, und nur von Geräten mit 32-bit-CPU.

Einige Beispiele zum "ctx"-Kommando:
ctx(0x4D2,1,2,3,4,5,6,7,8) ; bevorzugte Notation mit Komma als Trenner
ctx(0x4D2 1 2 3 4 5 6 7 8) ; alternative Notation ohne Komma
ctx(#1234, 7B 7C 7D 7E 7F 80)       ; Dezimaler ID aber hexadezimales Datenfeld
ctx(0x4D2, #123,124,125,126,127,128) ; hexadezimaler ID aber dezimale Datenbytes
ctx(#1234.x, 11,22,33,44,55,66,77,88) ; EXTENDED frame (29-Bit-ID)
ctx(#1234.s, 11,22,33,44,55,66,77,88) ; STANDARD frame (11-Bit-ID)
ctx(0x4D2, 0xABCD.w , #32767.w)        ; zwei INTEL-WORDs (jeweils 16 Bit)
ctx(0x4D2, 0x12345678.l , #12345678.l) ; zwei INTEL-LONGs (jeweils 32 Bit)
ctx(0x4D2, 0xABCD.mw, #32767.mw)       ; zwei MOTOROLA-WORDs
ctx(0x4D2, 0x12345678.ml,#12345678.ml) ; zwei MOTOROLA-LONGs
ctx(0x4D2, (ti).il, (ti).ml )         ; Zeit im Intel- und Motorola-Format
ctx(0x456, Temperatur.flt,Druck.flt)  ; zwei single-Precision-floats
ctx(0x456, (1.0).flt, (2.0).flt )   ; zwei Fliesskomma-Konstanten, Intel-Byte-Reihenfolge
ctx(0x456,(1.0).flt_m,(2.0).flt_m)  ; ähnliches mit Motorola-Byte-Order

Weitere Beispiele zum Einsatz des "ctx"-Kommandos finden Sie im Programm 'ctxfloat.cvt' (im Installationsarchiv enthalten).

Per Default erwartet das Kommando ctx hexadezimale Zahlen. Es empfiehlt sich aber, auch bei hexadezimalen Zahlen immer den Prefix '0x' voranzustellen, um eine Verwechslung zwischen Zahlenwerten und Variablen zu vermeiden. Beispielsweise kann 'A1' der Name einer Variablen, oder auch eine hexadezimale Zahl sein. Der Ausdruck 0xA1 ist dagegen sofort (auch für den Interpreter) als Hex-Zahl erkennbar.

Bei Terminals mit zwei CAN-Schnittstellen existieren zwei CAN-Sende-Kommandos. Das Kommando ctx sendet immer mit der ersten Schnittstelle (ebenso wie das Kommando ctx1).

Um ein Telegramm über die zweite Schnittstelle zu senden, verwenden Sie das Kommando
ctx2( identifier, databyte, ...)
Die Parameterliste für dieses Kommando hat dieselbe Bedeutung wie bei ctx .

Warnung: Wie oben erwähnt, kann es sehr gefährlich sein auf diese Art CAN-Telegramme zu senden !


String-Funktionen

Neben den zahlreichen numerischen Funktionen verfügt der Interpreter auch über einige (wenige) String-Funktionen. Sie können eine diese Funktionen pro Anzeigezeile aufrufen, indem Sie ihrem Namen in der Spalte "Var/Expr" in der Displayzeilen-Definitions-Tabelle eingeben.

Die bislang implementierten Stringfunktionen sind:

a2t( < string > )  ("ansi-to-terminal")
Wandelt eine Zeichenkette im ANSI-Zeichensatz (8-bit) in den vom Terminal intern verwendeten Zeichensatz ("DOS") um. Nur bei Geräten mit erweiterter String-Verarbeitung verfügbar .
appl.fname
Liefert den kompletten Dateinamen der "Applikation". Dies ist der Name der *.upt bzw *.cvt-Datei, die in das Terminal geladen wurde.
appl.name
Liefert den Namen der "Applikation" (ähnlich wie appl.fname), allerdings ohne Pfad und Dateinamenserweiterung.
hex$(value, num_digits)
Wandelt einen Integer-Wert (value, bis zu 32 bit) in einen Hexadezimalzahl (als String) mit der angegebenen Anzahl Ziffern um (num_digits; default=8).
sa[ <text-array-INDEX> ]
Liefert eine Zeile des Text-Arrays , definiert durch den Array-Index (0... < Anzahl Zeilen minus Eins > ).
Um das Text-Array zur Speicherung von numerischen Werten zu verwenden, können Sie die Strings mit der val-Funktion in Zahlen umwandeln.
sr[ <text-array-REFERENCE> ]
Liefert eine Zeile des Text-Arrays , definiert durch die im Array enthaltene (programmierbare) Referenznummer.
WARNUNG: Bei den meisten Geräten ist diese Funktion recht langsam, weil das ganze Array linear durchsucht werden muß !
str(<format-string>, <value>)
Wandelt einen Zahlenwert in eine Zeichenkette (string). Nur bei Terminals mit 16-Bit-CPU seit 09/2005 verfügbar ! Der Format-String definiert, wie die Zahl formatiert werden soll (sic!). Einige Beispiele, mit X=1.234, die Anführungszeichen im Resultat dienen nur zur Verdeutlichung der führenden Leerzeichen:
str("**.**",X)  -> " 1.23"  (Beachten Sie das führende Leerzeichen, Funktion des Sternchens im Format-String)
str("X=00.***",X) -> "X=01.235"   (Eine NULL im Format-String erzeugt führende Nullen im Resultat)
str("X=** kHz",X) -> "X= 1 kHz" (nachfolgende Zeichen im Format-String sind erlaubt, allerdings maximal 8)

type2str(typ)
Wandelt den Code für einen Datentyp (nach CANopen) in einen lesbaren String um.
Beispiel: type2str(1) liefert "BOOL", da bei CANopen der Datentyp Nummer 1 für "Boolean" steht.
Weitere Informationen zu Datentypen finden Sie hier .

(möglicherweise gibt es bei bestimmten Geräten noch andere Stringfunktionen, die hier nicht beschrieben sind !)

Siehe auch: Übersicht Interpreter-Funktionen .

String-Ausdrücke (String Expressions)

(Hier: "String-Ausdruck" := "Formel, die als Ergebnis eine Zeichenkette liefert".)

Unter bestimmten Voraussetzungen (s.U.) können ganze String-Ausdrücke statt einzelner Zeichenkonstanten oder Stringfunktionen verwendet werden. In derartigen Ausdrücken dient das Plus-Zeichen (+) als Operator zum Addieren (Anhängen) von Teilstrings. Einige Beispiele für solche String-Ausdrücke :

sa[0]+" "+sa[1]+" "+sa[2]+" "+sa[3]
Addiert den Inhalt der ersten vier Einträge im String-Array, durch Leerzeichen voneinander getrennt.
str("***.*",Frequency*0.001)+" kHz"
Wandelt eine Zahl (hier: Fliesskomma) in einen String um, und hängt eine Einheit an. Das Resultat (=Zeichenkette) könnte so aussehen: "137.7 kHz".

Tip: Um solche String-Ausdrücke statt eines 'festen' Format-Strings in Display-Zeilen-Definitionen einzusetzen, verwenden Sie die Sequenz Backslash-e um dem Anzeigemodul klarzumachen, dass die Definition keinen festen Text, sondern einen String-Ausdruck enthält.

Hinweis zur erweiterten String-Verarbeitung :
Die erweiterte String-Verarbeitung ist nur in neueren Terminals mit 16-bit CPU und Firmware ab 2005-09-09 verfügbar ! Sie wurde ursprünglich implementiert, um flexible Kommandos über die serielle Schnittstelle auszugeben; kann aber auch für die Ausgabe auf dem Display verwendet werden. Die erweiterte String-Verarbeitung umfaßt:
- Die Addition von Zeichenketten mit dem Plus-Operator (String-Ausdrücke)
- Die Funktionen a2t (ansi-to-terminal), eval (erweiterte val-Funktion), und einige Funktionen für die serielle Schnittstelle .

Siehe auch : Übersicht numerischer Interpreter-Funktionen



Funktionen zur Abfrage der Echtzeituhr (real time clock)

Hinweis: Nicht alle Geräte verfügen über eine batteriegepufferte Echtzeituhr ! Siehe Feature-Matrix.

Falls die UPT-Firmware die Echtzeituhr unterstützt, wird der aktuelle Wert der Uhr in jeder "Hauptschleife" einmal ausgelesen und in einem Zwischenspeicher abgelegt. Dadurch werden "Übertragsprobleme" vermieden, wenn Sie beispielsweise um 23:59:59.999 die Uhrzeit auslesen (und auf dem Display anzeigen) und kurz danach das Datum, weil Datum und Uhrzeit intern immer gleichzeitig ausgelesen werden, auch wenn die folgenden Funktionen so aussehen als würden Sie per Interpreter auf die einzelnen Werte getrennt zugreifen können (intern erfolgt das Lesen der RTC immer kurz vor einer Anzeige-Seiten-Aktualisierung).

Die folgenden numerischen Funktionen lesen Werte aus dem Zwischenspeicher der Echtzeituhr (nicht direkt aus den Zählregistern der Uhr) :

rtc.yr
Jahreszahl, zulässiger Bereich 2000..2000+n.
rtc.mo
Monatszahl des Jahres, Bereich 1..12.
rtc.da (oder rtc.dm, day of month)
Tageszahl des Monats, Bereich 1..31.
rtc.dw (day of week)
Tageszahl der Woche, Bereich 1=Montag..7=Sonntag.
Der Wert 0 zeigt an, daß bei der Berechnung ein Fehler auftrag (i.A. unzulässige Jahreszahl im RTC-Register).
rtc.dstr
Aktuelles Datum (ohne Uhrzeit) als Zeichenkette, Format YYYY-MM-DD (10 Buchstaben)
rtc.hr
Stundenwert, Bereich 0..23.
rtc.mi
Minutenwert, Bereich 0..59.
rtc.se
Sekundenwert, Bereich 0..59.
rtc.tstr
Aktuelle Uhrzeit als Zeichenkette, Format hh:mm:ss (8 Buchstaben)
rtc.packed
Liefert eine Kombination aus aktuellem Datum UND Uhrzeit, in eine 32-Bit-Integer-Zahl gepackt, in dem weiter Unten beschriebenen Format.
rtc.pack(year,month,day,hour,minute,second)
Packt ein beliebiges Kalender-Datum in das weiter Unten beschriebene Format (ähnlich wie rtc.packed).
Hilfreich zum 'Vergleich' von Kalenderzeiten als Integer-Wert, um zu testen, ob ein bestimmtes Datum+Uhrzeit schon erreicht wurde, usw .

Auf der Uhrenplatine sitzt eine kleine Batterie. Ist diese Batterie entladen (oder die RTC defekt), muß nach der Reparatur oder bei zu großer Abweichung das Datum und die Uhrzeit neu gestellt werden. Dies kann im System/Setup Menu des Terminals erfolgen (aber nicht durch das Programmiertool !). Aus dem Anwenderprogramm kann der Einstelldialog per Kommando sys.set_time aufgerufen werden.

Tip: Wenn Sie statt Tages- und Monatszahl lieber entsprechende Namen auf dem Display anzeigen wollen, verwenden Sie dazu ein paar Zeilen des Textarrays.

Format der "gepackten" Datum-und-Uhrzeit-Struktur

Die Funktion rtc.packed liefert das aktuelle Datum (mit Uhrzeit) im folgenden Format:

Inhalt Bits Wertebereich
Seconds / 2 4..0 0..29 (5 bit)
Minutes 10..5 0..59 (6 bit)
Hours 15..11 0..23 (5 bit)
Day of Month 20..16 1(!)..31 (5 bit)
Month of Year 24..21 1(!)..12 (4 bit)
Year - 1980 31..25 7 bit: 0(=year 1980)...127(=year 2107)

Siehe auch: Funktionen für Datum und Uhrzeit in der Script-Sprache.

Timer-Kommandos und -Funktionen

Der Display-Interpreter(*) enthält Funktionen und Prozeduren mit denen vier unabhängige "Timer" gesteuert werden können. Diese Timer können Zeitintervalle bis zu 65534*100ms (> 1 Stunde) mit einer Auflösung von 100 Millisekunden erzeugen. Normalerweise werden die Timer mit den programmierbaren Events abgefragt, sie können jedoch auch für andere Zwecke eingesetzt werden.

(*) In Geräten mit Script-Sprache stehen noch wesentlich flexiblere Timer zur Verfügung.
  Der CAN-Simulator bietet ähnliche Timer-Funktionen.


Starten und Stoppen von Timern
ts0 ... ts3 (timer start)
Startet einen der vier Timer mit der als Parameter angegebenen Intervallzeit. Der Timer zählt dann von diesem Startwert abwärts bis Null; dann wird ein Timer-Event produziert. Wird der Timer neu gestartet, bevor er abgelaufen ist, wird kein Event erzeugt. Der maximale Startwert beträgt 65534 ( * 100 ms).
Syntax: ts0(<Timer-Startwert in 100ms>)
Beispiel: ts0(40) startet den ersten Timer für ein 4-Sekunden-Intervall. Nach 4 Sekunden wird das Event "t0" erzeugt, welches Sie in den globalen oder lokalen Event-Definitionen abfragen können.
tr0 ... tr3 (timer reset)
Rücksetzen eines der vier Timer. Der Timer wird gestoppt, er erzeugt dann kein Event mehr. Intern enthält ein gestoppter Timer den Wert 0xFFFF. Dies ist auch der Default-Zustand nach Power-On.
Timer-Abfrage-Funktionen

Die folgenden Timer-Funktionen sind derzeit im Display-Interpreter(*) implementiert. Sie liefern einen booleschen oder numerischen Rückgabewert an den Aufrufer.

t0 ... t3 (t0 ... t9 bei Geräten mit Firmware ab 2012-04-16)
Testet ob ein bestimmter Timer abgelaufen ist, d.h. wenn er beim Abwärtszählen den Übergang von 1 auf 0 durchlaufen hat. Rückgabewert:
Null (=FALSE) wenn der Timer nicht läuft oder noch nicht den Wert Null erreicht hat,
Eins (=TRUE) wenn der Timer abgelaufen (und noch nicht "quittiert") ist.
Zum Quittieren des "Ablaufs" eines Timers dient das Kommando tr0...tr3 (siehe oben) . Beispiel (in einer Event-Definition):
Ereignis:  t2   // is Timer 2 expired ?
Reaktion: tr2 : goto "Timeout" : REM clear timer2 and jump to the "timeout" display
Die Intervalltimer (t0..t3 bzw t0..t9) arbeiten im Single-Shot-Modus. Zum Auslösen periodischer Ereignisse muss der Timer in der Reaktionsmethode neu gestartet werden. Beispiel:
Ereignis:  t2   // is timer 2 expired ?
Reaktion: beep(1000,5) : ts2(10) : REM short beep, and restart timer #2 for the next 1-second interval

tv0 ... tv3 (timer value)
Liest den aktuellen Zählerstand eines Timers. Dieser Wert läuft vom Startwert abwärts bis auf Null (ein Schritt in 100 Millisekunden).

ti (Zeit seit dem Einschalten in 100-ms-Schritten)
Liest den aktuellen Stand des "System-Taktgebers" als 32-Bit-Wert. Dies ist ein 32-bit-Zähler, der alle 100 Millisekunden inkrementiert wird. Er hängt nicht von den vier User-Timern ab, und kann weder gestoppt noch umprogrammiert werden ("read-only"). Dieser Timer läuft erst nach 6 Jahren ununterbrochenem Betriebs des Terminals über (von ((2 ^31)-1) nach (2^31), d.h. der Wert wird dann -als 32-Bit-Integer-Zahl- negativ. Nach Power-On startet dieser Zähler immer bei Null (er wird nicht von einer eventuell vorhandenen batteriegepufferten Uhr beeinflusst).
Einige Demo-Programme verwenden diesen Timer (ti) um nach dem Einschalten für kurze Zeit ein Firmenlogo anzuzeigen.

ti_ms (Zeit seit dem Einschalten in Millisekunden)
Liest den aktuellen Stand eines System-Timers als 32-Bit-Wert, skaliert in Millisekunden.
Ähnlich wie die Funktion 'ti' hängt auch dieser Timer nicht von den User-Timern ab, und kann weder gestoppt noch umprogrammiert werden ("read-only").
Ungefähr 2^32/( 40kHz * 60 * 60 ) = 29.8 Stunden nach Power-On läuft das 32-Bit-Timer-Register über, was einen "Sprung" im Wert von 'ti_ms' verursacht. Nach Power-On startet dieser Timer immer bei Null (er wird nicht von einer eventuell vorhandenen batteriegepufferten Uhr beeinflusst).
Einige Demo-Programme verwenden diesen Timer (ti_ms) um 'dynamische' Werte zu berechnen, wobei sich der Wert (statt wie mit 'ti' nur alle 100 ms) einmal pro Millisekunde ändern kann.
In der Script-Sprache steht mit system.ti_ms eine äquivalente Funktion zur Verfügung.

ti_sec (Zeit seit dem Einschalten in Sekunden, als Fließkommawert)
Entspricht (im Display-Interpreter) der Script-Funktion system.timestamp_sec

tsim_ms (Zeit seit dem Starten der CAN-Simulation in Millisekunden, als Integer-Wert),
tsim (Zeit seit dem Starten der CAN-Simulation in Sekunden als Fließkommawert, Typ 'double')
Diese nur im Programmiertool vorhandene Funktion dient zum Erzeugen zeitabhängiger Stimuli für die Simulation von CAN-Signalen. Im Gegensatz zu ti_ms startet der von tsim_ms (und tsim) bei jedem Anklicken von 'Run' erneut bei Null.
Bei nicht laufender CAN-Signal-Simulation liefern sowohl 'tsim' als auch 'tsim_ms' Null. Sie liefern daher eine bei Null startende Rampenfunktion, die in der Simulation z.B. als Ersatz für eine mit konstanter Geschwindigkeit zurückgelegte Wegstrecke dienen könnte.

Siehe auch: Überblick der numerischen Funktionen .


Bit-Abzähl-Funktion ("nbit")

Die Funktion "nbit" ("next bit" oder "number of bits") liefert die Nummer (1..32) des nächsten GESETZTEN Bits in einer 32-Bit-Matrix, oder zählt wie viele Bits in einer Matrix gesetzt sind. Das erste Funktionsargument (<matrix>) ist ein Integerwert (Ganzzahl) mit bis zu 32 Bit.

Syntax und Beispiele:

nbit(<matrix>,<index>)
nb(<matrix>,<index>)     (abgekürzt)
worin: matrix=32-bit-INTEGER, <index>:0=Zähle alle "1"-bits, 1..32: Ermittle die Nummer des N-ten gesetzten Bits (1..32) in der Matrix.
nbit(0x1281,0) liefert z.B. den Wert 4
(denn VIER Bits sind in der angegebenen Matrix gesetzt)
nbit(0x1281,1) liefert 1
(die Nummer des ERSTEN gesetzten Bits in der Matrix, Zählung 1..32, der Wert 0 wäre "kein weiteres gesetztes Bit vorhanden" )
nbit(0x1281,2) liefert 8
(das ZWEITE gesetzte Bit in der Matrix)
nbit(0x1281,3) liefert 10
(das DRITTE gesetzte Bit in der Matrix)
nbit(0x1281,4) liefert 13
(das VIERTE gesetzte Bit in der Matrix)
nbit(0x1281,5) liefert 0
(denn in der Matrix 1281hex sind keine fünf Bits gesetzt)

Hinweis: Normalerweise werden die Bits in einer 32-Bit-Zahl von 0 bis 31 numeriert; ABER HIER wird von 1 bis 32 gezählt, denn der Ergebniswert 0 (Null) bedeutet "das Bit gibt's nicht".

Normalerweise ist <matrix> eine Variable, und <index> eine Konstante. Die Übergabe eines Fließkommawertes (z.B. skaliertem CAN-Signal) an diese Funktion ist i.A. sinnlos, und wird möglicherweise ein fehlerhaftes Ergebnis liefern. Grund: Die Mantisse einer Fließkommazahl (im intern verwendeten Format) besteht nur aus ca. 24 Datenbits, der Rest wird für Exponenten und Vorzeichen benötigt.

Verwenden Sie daher im bei Variablen, die mit CAN-Signalen verbunden sind, nicht den skalierten Wert, sondern den Rohwert als Integerzahl (z.B. "Sensorstatus.in" statt "Sensorstatus").

zurück zur Übersicht der numerischen Funktionen


Funktionen zum Zugriff auf nichtflüchtige Werte (nv[0..31])

Sie können bis zu 32 nichtflüchtige numerische Werte in Ihrer Anwendung einsetzen. Diese Werte können mit dem Programmiertool vorbesetzt werden, und mit Hilfe des Interpreters gelesen und modifiziert werden.

Syntax und Beispiele (in Scripten bitte nur "system.nv" verwenden):

@X = nv[0]
liest einen der 32 Werte. Der zulässige Array-Index ist 0..31. In diesem Beispiel wird der Wert aus nv[0] in die Variable 'X' kopiert.
@nv[0]=X
Weist einem der 32 nicht-flüchtigen Speicher einen neuen Inhalt zu.
nvs
Speichert den Inhalt aller 32 nicht-flüchtigen Werte in einem kleinen EEPROM dauerhaft ab.
Vorsicht: Verwenden Sie das "nvs"-Kommando so sparsam wie möglich, denn die Lebensdauer vieler EEPROMs ist auf 100.000 Schreibzyklen begrenzt.
Wir fanden eine Applikation in der das "nvs"-Kommando nach jedem einzelnen Tastendruck, und zusätzlich bei jeder einzelnen Seitenumschaltung (im "pe"-Event) aufgerufen wurde !!! Dies ist ein sehr schlechter Programmierstil, der wegen der begrenzten Lebensdauer des EEPROMs  zum frühzeitigen Ausfall des Terminals führen wird, ferner wird die Applikation durch die ständigen unnötigen "nvs"-Aufrufe sehr träge.
Um die Hardware zu schützen, wird sich in zukünftigen Firmware-Versionen die "nvs"-Funktion intern dagegen zur Wehr setzen, häufiger als einmal in 10 Sekunden aufgerufen zu werden. In Geräten mit interner USV (z.B. MKT-View III, IV) könnte der EEPROM- Schreibvorgang sogar bis zum Abschalten des Gerätes verzögert werden.

Um die "Startwerte" des nichtflüchtigen Arrays für Ihre Anwendung zu definieren, verwenden Sie die Registerkarte General Settings des Programmiertools, oder das UPT-Systemmenü (bei bestimmten Geräten wie dem MTG320 / MKT-View).


Um zu vermeiden, dass ein bestimmter nv[]-Wert im EEPROM beim Laden einer Applikation (*.cvt bzw. *.upt) überschrieben wird, löschen Sie die enstprechende Zelle in der Tabelle 'Terminal-Einstellungen' auf der Registerkarte 'Einstellungen'. Leere Zellen (ohne numerische Werte) werden beim Import der Applikation im Zielsystem nicht übernommen; der Wert im EEPROM bleibt dann unverändert.

Befehle zum Zugriff auf das 'nichtflüchtige Array' (EEPROM) stehen auch in der Script-Sprache zur Verfügung.

Hinweis für Entwickler:
Programmiertool-intern werden Elemente im Array nv[], die nicht beim Laden der Applikation in das EEPROM des Targets übernommen werden sollen, mit dem Wert 0x8000FFEE besetzt.
Dies ist der intern verwendete Code für 'kein gültiger Integer'. Wenn z.B. während eines Simulator-Laufs der Wert per Script überschrieben wird bevor Sie die Applikation als *.cvt- oder *.upt-Datei abgespeichert haben, dann gehen die Änderungen in der oben gezeigten Tabelle (im entsprechenden nv[]-Wert) verloren, und in der gespeichten Datei steht der zuletzt per Zuweisung im Script gesetzte Wert.
Mit anderen Worten: Die Tabelle zeigt immer die aktuellen Werte an, egal ob diese per Tastatur (manuell) oder per Script gesetzt wurden.


Funktionen zum Lesen der digitalen und analogen Eingänge (onboard)

Hinweise:
  • Nicht alle Bedienterminals haben eingebaute digitale bzw. analoge Eingänge !
  • Für fortgeschrittene Anwendungen, z.B. Frequenzmessung oder Abfrage von Inkremental-Encodern eignet sich die im folgenden beschriebene Abfrage per Display-Interpreter(z.B. "inp") nicht. Verwenden Sie stattdessem z.B. einen schnelllaufenden Timer in der Script-Sprache, mit dem Sie z.B. alle 10 Millisekunden den Zustand der digitalen Eingänge (system.dwInputs) abtasten können.

Syntax:
inp
Liefert den Zustand aller im Terminal eingebauten digitalen Eingänge als Bitkombination (Bit 0 = erster Eingang, usw.).

inp1 (seit April 2003)
Liefert den Zustand des ersten(!) digitalen Eingangs. Das Ergebnis ist Null (0) oder Eins (1), je nach Klemmenspannung.

inp2
Liefert den Zustand des zweiten digitalen Eingangs. Das Ergebnis ist auch hier Null (0) oder Eins (1).

Die Anzahl verfügbarer digitaler Eingänge, deren Klemmen-Nummern, und die zulässigen Eingangspegel sind der Hardwarebeschreibung des verwendeten Terminals zu entnehmen (nicht Bestandteil dieses Dokuments !).
Entsprechendes gilt auch für die analogen Eingänge:

ain1 bzw
ain2
Liefert das auf 10 Bit skalierte Ergebnis einer A/D-Wandlung für einen analogen Eingang ('on-Board').
Der Wertebereich ist aus Kompatibilitätsgründen 0...1023 (210-1), selbst wenn der geräteinterne A/D Wandler eine höhere Auflösung bietet.
Die Bestückung des Eingangsspannungsteilers (zwischen Klemme und Eingang des A/D-Wandlers) ist leider hardwareabhängig.
Beim MKT-View II lag der Skalenendwert für beide analogen Eingänge bei 15 Volt (d.h. ain1=1023 bedeutet 15 Volt am ersten analogen Eingang, usw.).
Für andere Geräte entnehmen Sie den Skalenbereich der analogen Eingänge bitte dem Datenblatt.
In der Script-Sprache können analoge Eingänge (onboard) per system.analog_in[0..3] abgefragt werden.
Da einige Geräte (z.B. MKT-View III / IV / V) über A/D-Wandler mit höherer Auflösung verfügen, wird bei der Abfrage per Script das Ergebnis als Fliesskommawert im Bereich 0.0 bis 1.0 geliefert - unabhängig von der Auflösung des Wandlers (MKT-View III : 12 Bit).
Im Programmiertool können die Analog-Eingänge nur emuliert werden. Wählen Sie dazu im Hauptmenü die Funktion
'Optionen' .. 'Simulierte analoge Eingänge', wählen den A/D-Wandler-Kanal, und geben den zu emulierenden Wert in PROZENT (0..100 %) im Editierfeld ein. Zur Simulation beliebiger Wellenformen sind hier auch numerische Ausdrücke zulässig: Mit dem Ausdruck
    50 + isin(ti_ms/3)/655
wird für die Simulation im Programmiertool z.B. eine Sinusfunktion mit 100 % Amplitude, und einer Frequenz von ungefähr 1 / ( 1024 Millisekunden * 3 ) = 0.326 Hz erzeugt.

       
Simulation der analogen Eingänge im Programmiertool,   und Anzeige der Analog-Werte (per Script) im Watch-Fenster

Siehe auch: Übersicht numerischer Interpreterfunktionen ;  Kommandos zum Ansteuern der digitalen Ausgänge .


Funktionen zur Abfrage des Drehknopfes (rotary encoder, rot.xxx)

Hinweis: Nicht alle Terminals verfügen über einen Drehknopf !

Normalerweise wird der Drehknopf als Ersatz für die Cursortasten (UP/DOWN) verwendet, um sich durch die Menüs zu bewegen. Drücken des Knopfes hat den gleichen Effekt wie die ENTER-Taste bei anderen Terminals (identischer Tastencode!).  Ein kurzer "Doppelklick" des Drehknopfes schaltet bei Geräten ohne Touchscreen(*) die Funktion des Knopfes zwischen "Cursor hoch/runter" und "Cursor links/rechts" um (wichtig in manchen Editierfeldern). Wenn der Bediener den Knopf dreht oder drückt, trägt die Terminal-Firmware normalerweise entsprechende Tastencodes im Tastaturpuffer ein, so daß der Unterschied zwischen "Knopf" und "normaler Tastatur mit Cursorblock" aus Sicht der Applikation minimal ist - solange Sie auf den Einsatz der folgenden Drehknopf-Abfrage-Funktionen verzichten .

Falls ein Drehknopf vorhanden ist, bietet der Interpreter die folgenden Funktionen (und Prozeduren) um den Drehknopf für "spezielle Zwecke" einzusetzen:

rot.f
Ermittelt oder beinflußt die aktuelle "Funktion" des Drehknopfes. Mögliche Werte sind:
rot.f = 0 : "der Knopf erzeugt KEINE CURSOR-TASTEN-CODES"
rot.f = 1 : "der Knopf erzeugt die Tastencodes CURSOR_UP und CURSOR_DOWN" (default nach Power-On)
rot.f = 2 : "der Knopf erzeugt die Tastencodes CURSOR_LEFT und CURSOR_RIGHT"
Hinweis: rot.f beeinflußt nur die Erzeugung von 'Cursor-Tastencodes', aber nicht die folgende Funktion:
rot.p
Liefert die aktuelle Position des Drehknopfs als Integerwert.
Hinweis: Die Zuweisung eines neuen Wertes an 'rot.p' ändert intern nur einen Offset, beeinflußt die aktuelle Menüposition allerdings nicht.
Wird der Drehknopf im Uhrzeigersinn gedreht, wird rot.p inkrementiert, entgegen den Uhrzeigersinn führt zum dekrementieren. Der erste Encoder, der in den Terminals eingesetzt wurde, erzeugte 20 Schritte pro voller Umdrehung (360°).
Hinweis: Wie oben erwähnt, müssen Sie den Encoder nicht "selbst" abfragen, wenn Sie ihn zur Navigation in Menüs oder zum Editieren von Werten einsetzen. Die Terminal-Firmware erledigt das selbst, solange Sie rot.f nicht auf Null setzen.
rot.l (kleines "L" wie "left")
Liefert 1 (= TRUE) wenn der Knopf seit dem letzten Funktionsaufruf LINKS (im Gegenuhrzeigersinn) gedreht wurde.
Durch den Aufruf dieser Funktion wird ein internes Flag gelöscht, d.h. das Ereignis "links gedreht" quittiert.
rot.r
Liefert 1 (= TRUE) wenn der Knopf seit dem letzten Funktionsaufruf RECHTS (im Uhrzeigersinn) gedreht wurde.
Durch den Aufruf dieser Funktion wird ein internes Flag gelöscht, d.h. das Ereignis "rechts gedreht" quittiert.
rot.lb, rot.rb
Ähnlich wie rot.l bzw. rot.b, mit dem Unterschied dass diese "gepufferten" Funktionen (b=buffered) den Wert 1 (=TRUE) für jeden einzelnen Schritt des Drehknopfes liefern (d.h. hier wird intern mitgezählt). Wenn beispielsweise der Knopf seit der letzten Abfrage 5 Schritte (schnell) nach links gedreht wurde, liefert rot.lb fünfmal nacheinander den Wert "TRUE", während rot.l in diesem Fall nur einmal TRUE liefert (weil rot.l nicht die Anzahl der Schritte berücksichtigt, sondern nur die Drehrichtung als solche).
Diese Funktion eignet sich besonders für die Seitenumschaltung per Drehknopf, wenn der Bediener durch einen "schnellen Dreh" eine bestimmte Anzahl von Seiten weiterschalten will.
Durch den Aufruf dieser Funktionen werden interne Flags gelöscht, d.h. das Ereignis "links/rechts gedreht" quittiert.

Hinweis: Im Simulatorfenster wird der Drehknopf durch STRG-Cursor Up/Down ersetzt, oder (optional) durch Drehen des Mausrades. Dies funktioniert nur, während der Simulator läuft ("Running"), und das Simulatorfenster den Eingabefokus hat.

(*) Bei Geräten mit Touchscreen öffnet ein Drehknopf-Doppelklick die virtuelle Tastatur. Um den Editiercursor links oder rechts zu bewegen (innerhalb eines Editierfeldes), tippen Sie einmal auf das entsprechende Zeichen.

 Siehe auch: Übersicht Tastatur-Abfrage-Funktionen, Interpreter-Kommandos, Interpreter-Funktionen 
        Abfangen von Encoder-Ereignissen per Script .

Funktionen zur Abfrage eines analogen Joysticks (optional ! )

Da nur wenige Geräte über einen analogen Joystick verfügen, wurde dieses Kapitel in ein separates Dokument (joyst_01.htm) verschoben.



Interpreter-Kommandos

Im Gegensatz zu Funktionen liefern Kommandos (Prozeduren) keinen 'Return'-Wert an den Aufrufer zurück.
Die UPT-Firmware enthält einen Kommando-Interpreter für die folgenden Zwecke (sortiert nach Kategorie) :

(verwenden Sie den "Zurück"-Button des Browsers um hierher zurück zu gelangen !)

Siehe auch:
    Übersicht Interpreter-Kommandos (sortiert nach Alphabet),
    Übersicht Interpreter-Funktionen,
    Anwenderdefinierte Funktionen und Prozeduren in der Script-Sprache.

Einige Interpreterkommandos erwarten eine Liste von Parametern (Argumenten), andere benötigen dies nicht.

Die meisten Parameter können numerische Ausdrücke (expressions) sein.

Zu Testzwecken können Sie Kommandos an den Interpreter senden, indem Sie diese in der Statuszeile des Programmiertools eingeben.

Im Programmiertool können Sie zu vielen Interpreterkommandos kommando-spezifische Hilfe durch Drücken von F2 erhalten, wenn Cursor und Maus über einem Editierfeld mit einem gültigen Interpreterkommando stehen.

Übersicht Interpreter-Kommandos

(alphabetisch sortiert. Sortierung nach Kategorie siehe Oben)

Siehe auch:
    Nach Kategorien sortierte Übersicht,
    Übersicht Interpreter-Funktionen,
    Anwenderdefinierte Funktionen und Prozeduren in der Script-Sprache.

Goto, Call and Return-Command
(g,c,r)

Diese Kommandos des Interpreters dienen zum Umschalten zwischen den Anzeigeseiten Ihrer Applikation. Alle Kommandos müssen in der abgekürzten Form (als EIN Buchstabe) eingegeben werden.

Syntax:
goto: g<page-number> oder g"page-name"
call: c<page-number> oder c"page-name"
return: r
Beispiele:
g(0) : REM schaltet zur ersten(!) Anzeigeseite um
g(pn+1)  : REM schaltet von der aktuellen zur nächsten Anzeigeseite um
g(pcnt-1) : REM schaltet zur letzten(!) Anzeigeseite um

g"MainMenu" : REM springt zu einer Seite namens "MainMenu"

"Goto" und "Call" schalten beide zu einer anderen Anzeigeseite um, die durch ihre Seitennummer oder (vorzugsweise) durch den Seitennamen definiert wird.

"Call" speichert darüberhinaus auch die Nummer der aktuellen ("alten") Seite in einem speziellen Stapelspeicher (call-stack) bevor die Umschaltung zur "neuen" Seite erfolgt. Die so aufgerufene Seite kann später zum "Aufrufer" mit Hilfe des return-Kommandos zurückspringen.

"Call" + "Return" müssen immer zusammen verwendet werden. Wenn Sie eine Seite per "call" aufrufen, müssen Sie später auch per "return" wieder zum Aufrufer zurückkehren, keinesfalls mit per "goto" zurück zum Aufrufer ! (dies würde einen Überlauf des Interpreter-call-stacks verursachen, und ergibt darüberhinaus auch keinen Sinn).

Ein sinnvoller Einsatz für "call" + "return" statt "goto" ist z.B. eine von vielen Aufrufern (hier: Display-Seiten) genutzte gemeinsame "Unter-Seite" (ähnlich wie ein Unterprogramm). Nachdem das "Unterprogramm" seine Arbeit erledigt hat (zum Beispiel eine Fehlermeldung angezeigt und auf eine Taste gewartet hat), kann der Normalbetrieb auf einer der "Hauptseiten" fortgesetzt werden.

Hinweis: Weder "goto" noch "call" haben einen Effekt wenn das Sprungziel (=die "neue" Seite) mit der aktuellen Seite identisch ist, egal ob per Seitennummer oder per Seitenname aufgerufen wird.

Kommandos zum Setzen von Menu Mode und Menu Index (mm, mi)

Diese Kommandos können das Menü auf der aktuellen Seite in den Editier- oder Navigations-Modus setzen, und den aktuellen Menüpunkt programmgesteuert umsetzen (dazu gehören auch Editierfelder, die intern mit derselben Routine verwaltet werden).

Syntax:
mm( <neuer Menü-Modus>)
mi( <neuer Menü-Index>)  

(der "Menü-Index" (mi) ist die laufende Nummer des Menüpunktes, abhängig von der Reihenfolge der Menüzeilen bei der Definition der Anzeigeseite)

Gültige Menü-Modi (mm) sind:

  • 0 = "aus", weder Auswahlbalken noch blinkender Cursor sind sichtbar
  • 1 = "Selektieren / Navigieren", der aktuelle Menüpunkt (bzw Displayzeile mit Editierfeld) ist invertiert, der Bediener kann den Auswahlbalken mit den Cursortasten zwischen verschiedenen Menüpunkten bewegen
  • 2 = "Editieren", der blinkende Cursor ist auf einer editierbaren Ziffer in einem Editierfeld sichtbar. Nur möglich, wenn die selektierte Displayzeile ein Editierfeld enthält !

Normalerweise wird beim Zurückschalten von "Editieren" nach "Selektieren/Navigieren" der Inhalt des Editierfeldes in die damit verbundene Variable übertragen (d.h. wie beim Drücken der ENTER-Taste). Um das Editeren abzubrechen (d.h. zurückschalten ohne den Inhalt des Editierfeldes zu übernehmen), verwenden Sie das Kommando mm(8) statt mm(0) . Hinweis: Dies funktioniert nur bei Geräten mit Firmware-Kompilations-Datum 2008-11-04 oder später.

  • 8 = "Editieren abbrechen", sonst wie mm(0) .
  • 9 = "Editieren abbrechen", sonst wie mm(1) .

In der Script-Sprache wird statt "mi" die Funktion display.menu_index verwendet; "mm" wird durch display.menu_mode ersetzt.

Siehe auch: Verwendung von Anzeigezeilen als Menüeinträge

Kommandos zum Ansteuern der LEDs
Bei manchen Terminals verfügt der Interpreter über ein Kommando zum Ansteuern der eingebauten Leuchtdioden:
Syntax:
led( <led-number>, <led-blink-pattern> )
or abbreviated:
le ( <led-number> , <led-blink-pattern> )
Parameter:
<led-number> ist der Index(!) der LED, die angesteuert werden soll: 0=erste LED, 1=zweite LED, ....

<led-output-pattern> ist ein acht-Phasen-Code (Bitmasken) mit dem ein bestimmter Blinkrhytmus definiert werden kann. Jedes Bit des Codes steuert ein 100-Millisekunden-Intervall. Nach einem Zyklus von 8 * 100ms beginnt der Blinkzyklus wieder von vorne. Alle LED-Blink-Zyklen sind miteinander "synchonisiert", d.h. wenn zwei LEDs mit den gleichen Bitmasken angesteuert werden, blinken sie exakt zur gleichen Zeit.

Hier einige oft verwendete Bitmasken:

  • 0x00 LED ist AUS (Defaultzustand nach Power-On)
  • 0xFF LED ist dauernd AN
  • 0xF0 LED blinkt langsam: 400ms AN, 400ms AUS und so weiter
  • 0x55 LED blinkt schnell: 100ms AN, 100ms AUS und so weiter
  • 0x01 LED gibt "kurze Blitze" ab: 100ms AN, 700ms AUS und so weiter...

Manche Terminals sind mit RGB-LEDs ("Vollfarb-LEDs") ausgerüstet, z.B. MKT-View II / III / IV .
Mit der folgenden Syntax können dann nahezu beliebige Farbmischungen erzielt werden:

Syntax:
led( <led-number>, <led-blink-pattern>, [ <red intensity>, <green intensity>, <blue intensity> ] )

Die Rot-, Grün- und Blau-Komponenten werden auf einer Skala von 0...255 definiert (meistens hexadezimal wie in den folgenden Beispielen). Wird die Intensität einer Farbkomponente nicht angegeben, bleibt der alte Farbwert erhalten. Der Defaultwert für alle drei Komponenten ist 127 (= 0x7F,  bzw. 50 Prozent). Daraus resultiert eine weißliche Farbe für alle drei LEDs, wenn zum Einschalten nur die LED-Nummer und das Blinkmuster angegeben wird, aber keine Farbmischung.

Beispiele zum Ansteuern der RGB-LEDs:

led( 0, 0xFF, 0xFF, 0xFF, 0xFF )  : REM 1st LED bright white, permanently on
led( 1, 0x55, 0xFF, 0x00, 0x00 )  : REM 2nd LED bright red, flashing rapidly
led( 2, 0xF0, 0x00, 0xFF, 0x00 )  : REM 3rd LED bright green, blinking slowly

led( 0, 0x0F, 0x00, 0x00, 0xFF )  : REM bright blue, blinking slowly (2nd phase)
led( 1, 0xFF, 0xFF, 0xFF, 0x00 )  : REM bright yellow
led( 2, 0xFF, 0xFF, 0x00, 0xFF )  : REM bright purple
led( 0, 0xFF, 0x00, 0xFF, 0xFF )  : REM bright cyan

Hinweise:

  • Das Demoprogram "MV2_DEMO.CVT" (MKT-View II Demo) enthält einige der oben gezeigten LED-Ansteuerungs-Kommandos.
  • Da die RGB-LEDs nicht direkt mit dem Mikrocontroller verbunden sind (sie verwenden stattdessem eine interne serielle Schnittstellt), kann es eine kurze Zeit dauern, bis der Befehl zum Umschalten der LED-Farbe effektiv wird. Aus dem Grund sollten Sie Blinkeffekte nicht durch schnelles Ein- und Ausschalten der LED per Interpreterscript realisieren, sondern dazu das Blinkmuster verwenden (zweiter Parameter des LED-Kommandos).
  • Im "Dunkel"-Zustand im Blinkzyklus verlöschen die LEDs beim MKT-View II nicht komplett. Stattdessem werden alle drei Farbkomponenten auf etwa 6 Prozent der maximalen Helligkeit gesetzt, um eine Hintergrundbeleuchtung (unter den drei Funktionstasten) zu realisieren.
  • In der Script-Sprache steht ein ähnlicher Befehl (system.led) zum Ansteuern der RGB-LEDs zur Verfügung.

Kommandos zur Steuerung der Hintergrundbeleuchtung (bl, kl)

Bei manchen Geräten kann die Beleuchtung des LCDs vom Terminalprogramm gesteuert werden (seit Mai 2002).
Je nach Hardware kann die Beleuchtung ("bl" = "backlight") nur ein/aus-geschaltet werden, oder auch in der Helligkeit variiert werden (MTG320).

Syntax :
bl(1) setzt die minimal mögliche Hintergrundbeleuchtung
bl(255) setzt die maximal mögliche Helligkeit
bl(1..254) setzt die Beleuchtung auf "mittlere Helligkeit" in verschiedenen Stufen (nur bei bestimmten Terminals möglich)

Hinweis: Sie können den Default-Wert der Helligkeit im Setup-Menü des Terminals auf einen bestimmten Wert setzen.

Bei alten Geräten mit Tastaturbeleuchtung per EL-Folie gibt es weitere Kommandos mit denen die Tastatur-EL-Folie gesteuert werden kann. Wegen der begrenzten Lebensdauer von EL-Folien schaltet sich die EL-Beleuchtung nach einer bestimmten Zeit ohne Tastenbetätigung automatisch ab.

Kommandos zum Steuern der Tastaturbeleuchtung:
kl(0) Schaltet die Tastaturbeleuchtung ab, und stoppt die Zeitautomatik.
kl(N) Schaltet die Tastaturbeleuchtung für N Sekunden ein, und startet die Zeitautomatik. Beispiel: kl(60) schaltet das Licht für (mindestens) 60 Sekunden ein.

Der Defaultwert für die Zeitautomatik beträgt 600 Sekunden. Diese Intervallzeit kann per kl-Kommando überschrieben werden. Eine Änderung per Systemmenü (wie bei der LCD-Hintergrundbeleuchtung) ist nicht möglich.

Siehe auch: weitere Interpreter-Kommandos


Aufruf der Script-Sprache aus dem Display-Interpreter
Mit dem Prefix 'script.' vor dem Namen einer anwenderdefinierten Script-Prozedur kann diese ausnahmsweise auch aus dem Display-Interpreter aufgerufen werden.

Beispiel (in einer Kommandozeile des Interpreters, d.h. im Anzeigeprogramm, nicht im Script-Quelltext):
script.SetLanguage(LANG_GER)

Im oben gezeigten Beispiel ist 'SetLanguage' der Name einer in der Script-Sprache programmierten Prozedur, die als Übergabe-Parameter z.B. einen Integer-Wert erwartet. In diesem Fall wird als Wert eine symbolische Konstante übergeben ( LANG_GER, als Konstante im Script-Quelltext definiert):

Beispiel (aus dem Script-Quelltext der Applikation "Multi-Language-Test" ) :

const
   // 'language codes' :
   LANG_ENG = 10000; // internal language code for 'english'
   LANG_GER = 20000; // internal language code for 'german'
   LANG_ARA = 30000; // internal language code for 'arabian'
endconst;


  ...

//------------------------------------------------------------
proc SetLanguage( int iLanguage ) // Anwenderdefinierte Prozedur .
  // Setzt die neue 'Sprache' (LANG_GER, LANG_ENG, etc).
  // Aufruf aus dem DISPLAY INTERPRETER, z.B.
  // als Reaktion auf die Betätigung eines Buttons
  // im Anzeigeprogramm .
  if( language != iLanguage ) then
    // Display language has been modified:
    language := iLanguage; // set NEW language in a global var
    display.exec("cls"); // redraw the entire display page
  endif;
endproc; // end SetLanguage()



Details zur Script-Sprache finden Sie hier. Bitte beachten Sie, daß die Script-Sprache nur in Geräten mit 32-Bit-CPU verfügbar ist !



Grafik-Kommandos

Die folgenden Kommandos dienten früher zur Anzeige von graphischen (Grund-)Elementen, als diese nicht mit den 'fest eingebauten' Funktionen realisiert werden können.
Sie existieren heute nur noch aus Kompatibilitätsgründen. Für Geräte mit 32-Bit-CPU empfehlen wir stattdessem den Einsatz von Script-gesteuerten Grafiken, z.B. mit dem 'Canvas'-Element ("Leinwand", auf der per Script gezeichnet werden kann).
Die im Folgenden aufgeführten "Grafik-Kommandos" sind nicht mit den z.T. ähnlich aufgebauten Backslash-Sequenzen zu verwechseln !
  • icon (ic) zeichnet ein kleines Bild ("icon")
  • line (li) zeichnet eine Linie.
    Kann bei Geräten mit 32-Bit-CPU durch mit dem Grafik-Editor erstellbaren Polygonen ersetzt werden.
    Zum Unterstreichen von Texten bietet sich das einfacher zu verwendende HTML-Tag <u> .. </u> an.
  • pa(X, Y, Text ) druckt eine Zeichenkette an der spezifizierten Koordinate (X,Y) ins Display ("print at"). Nur für UPT515, nicht mehr verwenden !
  • pixel (pi) Setzt ein einzelnes Pixel
  • frame(fr) zeichnet einen rechteckigen Rahmen
  • fill(fi) zeichnet ein gefülltes Rechteck
  • gf zeichnet ein gefülltes Rechteck mit Farbverlauf ("gradient fill")
  • cls(cl) löscht den Bildschirm und zeichnet alle "Anzeigefelder" neu
  • popup(..) öffnet ein kleines "Pop-Up-Fenster" im Vordergrund

Einige Parameter, die die nachfolgenden Ausgabekommandos beeinflussen, können mit den folgenden Kommandos gesetzt werden:

  • co( <fg>, <bg> ) setzt Vordergrund- und Hintergrundfarbe für die danach folgenden Befehle
  • dm Setzt den Zeichenmodus (draw mode) für graphische Ausgaben.
  • zo(X,Y) setzt den Zoomfaktor.

Diese Kommandos müssen in abgekürzter Form in einer Anzweisungszeile (command line) eingegeben werden.

Beispiel (aus dem "Dead-Pixel-Testprogramm" für MKT-View II, programs/DeadPix1.cvt, Befehl für den "speziellen Hintergrund" ) :
co(BGCol,BGCol) : fi(0,0,xmax,ymax,0,0)

Wenn sich graphische Elemente oder/und Textzeilen auf dem Bildschirm überlappen, sollten Sie die Hinweise zu überlappender oder bewegter Grafik beachten !

Nur bei einigen Geräten mit 32-Bit-CPU (z.B. "MKT-View II") existieren die folgenden Kommandos/Funktionen:

  • disp.<NAME>.<KOMPONENTE> dient zum Zugriff auf ein bestimmtes Anzeigeelement ("display element"). Damit können während der Programmlaufzeit Parameter wie z.B. Farbe, Position, Format-String geändert werden, die normalerweise nur beim Entwurf im Programmiertool definierbar sind (allerdings nur auf der aktuellen, vom FLASH ins RAM geladenen Anzeigeseite). Details zu dieser Funktion finden Sie hier .
  • rgb( <Rot>, <Grün>, <Blau> ) : Funktion für die RGB-Farbmischung. Details und Beispiele hier.

Siehe auch:

Definieren von Vorder- und Hintergrundfarbe : "co" (colour)
Syntax:
co(<fg>,<bg>)

Mit diesem Kommando werden die Vorder- und Hintergrundfarbe für einige der folgenden Grafikkommandos definiert. Eine Liste zulässiger Farbwerte finden Sie hier.

Zeichnen eines einzelnen Icons (ic)

Dieses Grafik-Kommando zeichnet ein kleines Bild ("icon") auf dem Bildschirm.

Syntax:

ic(<icon-name>, <x-position>, <y-position>)

Der Icon-Namen muss einem auf der icon-page definierten Symbole entsprechen. Andernfalls erzeugt der Kommando-Interpreter eine Fehlermeldung. Ist der Icon-Name eine einfache Zeichenkonstante, muss diese -wie üblich- in Anführungszeichen geschrieben werden.

Beispiel:
ic("stopbtn1",280,10)

Hinweis: Sie können Icons auch per Backslash-Sequenz im Format-String einer normalen Display-Zeile anzeigen. Dies ist wesentlich einfacher, denn die Position der Displayzeile (und damit die des Icons) kann per Maus im LCD-Simulatorfenster geändert werden.

Bei Geräten mit Farb-Display werden auch transparente Bitmap unterstützt. Dazu muss der Farbwert aller transparenten Pixel in der Parameterliste des Icon-Kommandos angegeben werden (siehe Beispiel). Als Farbwert dient einer der hier definierten Farbwerte.

Beispiel zum Zeichnen eines transparenten Icons (funktioniert nur bei Displays mit 8 Bit/Pixel) :
ic("mkt_logo",100,40,t=7)

Bei Geräten mit Script-Sprache kann der erste Parameter (statt "icon-name") alternativ auch der Name eines im Script deklarierten Objektes vom Typ tCanvas sein. Dieses erst zur Laufzeit erzeugte Grafikobjekt wird dann an der angegebenen Position (x,y) sichtbar.

Zeichnen einer einzelnen Linie (li)
Dieses Grafikkommando zeichnet eine dünne Linie auf dem Grafikbildschirm.

Syntax:

li( <x1>, <y1>, <x2>, <y2> )
Für alle Geräte mit grafikfähigem Display. Zeichnet eine dünne Linie (ein Pixel breit).
li( <x1>, <y1>, <x2>, <y2>, <width> )
Für Geräte mit 16-Bit-CPU und 320*240-Pixel-Display. Zeichnet eine Linie mit der angegebenen Stärke ("width" gemessen in Pixel).

Hinweis: Auch Grafik-Linien können per Backslash-Sequenz im Format-String einer normalen Display-Zeile angezeigt werden. Im Gegensatz zum Interpreter-Befehl "li" sind die Koordinaten dann 'relativ' zur Koordinate der Display-Zeile.

Setzen eines einzelnen Pixels (pi)
Dieses Kommando setzt ein einzelnes Pixel auf dem Grafikbildschirm.
Syntax:
pi( <x>, <y> )

Tip: Um 'portable' Anwendungen zu erstellen, die auf Displays mit unterschiedlicher Größe funktionieren, können seit 03/2011 die Funktionen xmax und ymax eingesetzt werden. Diese liefern die maximal zulässige Koordinate. Beachten Sie, daß die Zählung grundsätzlich bei Null beginnt. Beim "MKT-View II" liegen die zulässigen Werte für x zwischen 0 und 479 (=xmax), für y zwischen 0 und 271 (=ymax).

Zeichnen eines rechtechigen Rahmens (fr, frame)
Dieses Grafikkommando zeichnet einen rechtechigen Rahmen.

Das Innere des Rahmens wird nicht beeinflusst (es wird weder gelöscht noch gefüllt).

Syntax:
fr( <x1>, <y1>, <x2>, <y2> )
darin ist
x1 = linker Rand
y1 = oberer Rand
x2 = rechter Rand
y2 = unterer Rand

Hinweis: Auch rechteckige Rahmen können mittlerweile als Backslash-Sequenz innerhalb einer "normalen" Display-Zeile erzeugt werden.

Zeichnen eines gefüllten Rechtecks (fi, fill)
Füllt einen rechteckigen Bereich des Bildschirms.
Syntax:
fi( <x1>, <y1>, <x2>, <y2> [ , <pattern0> , <pattern1>] )
darin ist
x1=left border, y1=top, x2=right border, y2=bottom,
pattern1, pattern2 = optional "filling" pattern, default=0xFF

Der alte Inhalt der gefüllten Fläche wird überschreiben, außer in einem Spezialfall: Bei Zeichenmodi, die nicht in beide alternierenden Display-"Pages" schreiben, bleibt der alte Inhalt während einer der beiden Blink-Phasen erhalten. Dies eignet sich z.B. als Warnmarkierung (sparsam einsetzen !).

Das optionale Füllmuster ermöglicht auch bei monochromen Displays, verschiedene Schattierungen zu realisieren. Beide Füllmuster sind 8-Bit-Masken; ein "1"-Bit entspricht einem gesetzten, ein "0"-Bit einem gelöschten Pixel. <Pattern0> wird in allen Grafikzeilen mit grader Y-Koordinate verwendet, <Pattern1> für alle ungraden Zeilen.

Einige Beispiele für "sinnvolle" Füllmuster:
fi(10,10,30,20, 0xFF, 0xFF) zeichnet ein "massives schwarzes" Rechteck
fi(10,22,30,30, 0xFF, 0x00) zeichnet ein Rechteck aus dünnen horizontalen Linien
fi(10,32,30,40, 0x55, 0x55) zeichnet ein Rechteck aus dünnen vertikalen Linien
fi(10,42,30,50, 0x55, 0xAA) zweichnet ein grau schattiertes Rechteck (50 Prozent Schwärzung)

Wird kein Füllmuster angegeben, zeichnet der Interpreter ein schwarz gefülltes Rechteck (wie mit dem Füllmuster 0xFF, 0xFF).

Hinweis: Bei Geräten mit 32-Bit-CPU und TFT-Farbdisplay steht (zusätzlich zum "fi"-Kommando) noch das "gf"-Kommando (gradient fill) zur Verfügung, mit dem rechteckige Farbverläufe gezeichnet werden können.

Setzen des Zeichenmodus (dm, draw mode)

Dieses Grafik-Kommando setzt den Zeichenmodus (draw mode) für die folgenden Grafik-Zeichen-Kommandos.

Der Bildschirm in alten Geräten (mit kleinen Monochrom-Displays) verfügte über zwei "Video-Seiten" (video pages), die alle 0.5 Sekunden umgeschaltet wurden. Damit liessen sich verschiedene Blink-Effekte erzielen. Bei neueren Geräten mit Farbdisplays besteht diese Möglichkeit nicht mehr.

Syntax:

dm( <neuer Zeichenmodus> )

Gültige Parameter für den Zeichenmodus finden Sie ausschliesslich im englischsprachigen Originaldokument.
Hinweis: Zum Einstellen des Zeichenmodus innerhalb einer Textzeile dient die Backlash-Sequenz 'm'.

Invertierung der Anzeige (Display Inversion, "di")

Bei bestimmten Geräten mit 16-bit CPU ist es möglich, per Interpreterbefehl das komplette Display zu invertieren.

Syntax:
di=0  keine Display-Inversion, schwarze Schrift auf weißen Grund
di=1 Display-Inversion, weiße Schrift auf schwarzem Grund

Im Gegensatz zum Kommando "dm" (welches nur die danach ausgegebenen Zeichen beinflußt) wirkt sich "di" immer auf den gesamten Bildschirm aus. Die Invertierung wird z.T. auf Hardware-Ebene durchgeführt, das Kommando ist dadurch relativ schnell und kann z.B. dazu verwendet werden, den Bildschirm ein paarmal "aufblitzen" zu lassen, um die Aufmerksamkeit des Bedieners auf sich zu lenken.

Löschen des Bildschirms (CLearScreen) (cls)
Dieses ebenfalls veraltete Kommando zum "Löschen" des Bildschirms führt während des nächsten Bildaufbaus die folgenden Aktionen durch:
  1. Löschen des kompletten Bildschirms
  2. Neuzeichnen aller auf der aktuellen Seite definierten Anzeigezeilen
  3. Erst nachdem der Neu-Aufbau komplett ist, wird die Grafik auf das LC-Display übertragen.

Dieses Kommando wird nur für komplexe Anzeigeseiten benötigt, z.B. wenn sie eine per Interpreterkommandos gezeichnete Grafik wieder löschen wollen (wie z.B. im Beispiel "Pixel Plot"). Während der Ausführung des "cls"-Kommandos ist das Event-Flag "pr" (page redraw) gesetzt, was für einige sehr spezielle Anwendungen nötig ist.

Im Normalfall benötigen Sie dieses Kommando nicht, weil der Bildschirm bei einer Seitenumschaltung automatisch gelöscht wird.

Siehe auch: Weitere Interpreter-Kommandos  

Zeichnen eines Farbverlaufes (Gradient Fill, Kommando gf)

Geräte mit 32-Bit-CPU und TFT-Farbdisplay bieten ein Interpreterkommando zum Zeichnen eines mit einem Farbverlauf gefüllten Rechtecks. Die Syntax ähnelt dem Kommando "fi" (filled rectangle) .

Syntax:
gf( <x1>, <y1>, <x2>, <y2>, <Orientierung>, <Farbe 1>, <Farbe 2> )

Darin ist ..
x1=left border, y1=top, x2=right border, y2=bottom,
Orientierung: Reserviert (noch keine Funktion). Eines Tages wird mit diesem Wert spezifiziert, ob der Farbverlauf von Oben nach Unten verläuft (=default), oder von Links nach Rechts, etc.
Farbe 1 = Farb-Startwert (i.A. für die obere Kante des Rechtecks)
Farbe 2 = Endwert (i.A. für die untere Kante des Rechtecks)

Beispiel zum Füllen des kompletten Bildschirms mit einem Farbgradienten von Grün nach Blau:
gf( 0, 0, xmax, ymax, 0, #070, #007 )

Als Farbwerte können die UPT-"Standard"-Farben verwendet werden, oder -abhängig von der verwendeten Hardware- auch beliebige RGB-Farbmischungen. Details zu den Farbwerten finden Sie hier .

Hinweis: Graphische Schaltflächen ("Buttons") können ebenfalls mit einem Farbverlauf als Hintergrund gefüllt werden, wie hier beschrieben. Das "gf"-Kommando wird daher nicht benötigt, um derartige Buttons zu realisieren. Allerdings funktionieren auch Buttons mit Farbverläufen nur bei Geräten mit 32-bit CPU und TFT Farbdisplay !

Abfrage von Informationen über den Grafik-Bildschirm (für Grafikbefehle)
Hinweis: Die unten aufgeführten Funktionen wurden anno 2011 implementiert. Auf älteren Geräten, z.B. MKT-View 1, funktionieren sie nicht.
xmax
Liefert die maximale X-Koordinate (horizontal).
x=0=linker Bildschirmrand, x=xmax (z.B. 319 oder 479) = rechter Bildschirmrand.
ymax
Liefert die maximale Y-Koordinate (vertikal).
y=0=oberer Bildschirmrand, y=ymax (z.B. 239 oder 271) = unterer Bildschirmrand.

Kommandos zum Starten / Stoppen von Timern

Die Kommandos zum Starten und Stoppen von Timern wurden mit der Beschreibung 'Timer-Kommandos und -Funktionen' zusammengeführt.

Page-Scan (pscan)

Im Page-Scan-Modus schaltet das Terminal zyklisch zwischen verschiedenen Anzeigeseiten um. Dazu werden keine "Event"-Definitionen benötigt. Der Page-Scan-Modus kann per Interpreter gesteuert werden:
pscan=N
Aktiviert den timergesteuerten Page-Scan-Modus. N ist das Seiten-Umschalt-Intervall in Sekunden. Mit "pscan=5" wird z.B. alle 5 Sekunden zur nächsten Seite der Scan-Sequenz umgeschaltet. (Welche Seiten zur Scan-Sequenz gehören sollen wird mit dem Programmiertool definiert).
pscan=0
Schaltet den timergesteuerten Page-Scan-Modus aus. Dies ist der Default-Zustand nach dem Einschalten !

pscan.next, pscan.prev
Schaltet von der aktuellen Seite sofort auf die nächste, zur Scan-Sequenz gehörenden Seite um, bzw. mit "pscan.prev" zur vorhergehenden Seite (unabhängig vom Zustand des oben beschriebenen Page-Scan-Timers).
Diese Kommandos sind z.B. zum Durchblättern der "Hauptseiten" per programmierbarer Buttons vorgesehen (als Reaktion auf die Betätigung eines Buttons, oder -sofern vorhanden- Drehen des Knopfes, etc). Siehe Beispiel unter "Hinweise und Tips".

Hinweise und Tips:

  • Wenn eine Seite zur Page-Scan-Sequenz gehören soll, setzen Sie das Checkmark "include this page in the pscan-sequence" im Register Display Page Header. Nur Anzeigeseiten, bei denen dieses Flag gesetzt ist, werden beim Page-Scan-Zyklus aufgerufen.
  • Zum manuellen Page-Scan per Drehknopf können z.B. die folgenden globalen Event-Definitionen verwendet werden:
    Ereignis Reaktion
    rot.lb pscan.prev
    rot.rb pscan.next

  • Um den timergesteuerten Page-Scan-Modus ein- und auszuschalten, bietet sich ein Softkey an (programierbarer "Button"). Verwenden Sie z.B. die folgende Anweisung als Button-Reaktions-Methode:  
    pscan=5-pscan
    Wie funktioniert dies ? 'pscan' kann (formell) wie eine Variable verwendet werden, nach dem Einschalten ist der Wert 0 (Null). Mit der genannten Anweisung wird aus 0 eine 5 (= 5 Sekunden), auf 5 wird 0, und so weiter. Sie können auch die Beschriftung des Buttons abhängig vom Zustand des Page-Scan-Modus definieren, wie im folgenden Beispiel (Quelltext einer Button-Definition):
    \btn(55,50,0x002,(pscan>0)?"Stop":"Scan",59,pscan=5-pscan)
  • Um den aktuellen Stand des Page-Scan-Timers abzufragen, verwenden Sie die numerische Funktion "pscan.timer" . Dies ist ein Count-Down-Timer. Beim Erreichen des Zählerstands 0 (Null) erfolgt die nächste Page-Scan-Seitenumschaltung. Die Einheit des Zählers ist 0.1 Sekunden.
  • Beim Betätigen einer beliebigen Taste wird der Page-Scan-Timer automatisch mit der doppelten Intervallzeit neu geladen, d.h. Page-Scan "pausiert" solange der Bediener Tastatureingaben macht; Page-Scanning wird aber nicht (automatisch) abgeschaltet.

Das Zuweisungs-Kommando (assign, @) (veraltet, nur noch aus Kompatibilitätsgründen dokumentiert)

Dieses Kommando weist einer Variablen einen neuen Wert zu. Seit einer Überarbeitung des Display-Interpreters reicht dazu der Zuweisungsoperator ( := ), es ist kein spezielles Kommando mehr für eine Variablenzuweisung nötig.

Syntax:

@<Varname> := <expression>

Beispiel:

@Ypos := (Voltage*63)/230

Hinweise:

  • Das 'at'-Zeichen vor der zugewiesenen Variable war nur bei sehr alten Geräten erforderlich. Dank des Zuweisungs-Operators ( := statt = ) ist für den Interpreter klar, an welchen Stellen es sich um eine Zuweisung, und nicht um einen Vergleich handelt. Das 'at' ist daher überflüssig und sollte im Interesse einer besseren Lesbarkeit nicht mehr verwendet werden.
  • Sie können nur Werte an Variablen zuweisen, die in der Variablen-Tabelle mit dem Programmiertool definiert wurden (es gibt keine "automatischen" Variablen wie in der Programmiersprache "BASIC").
  • Sie sollten keine Werte an Variablen zuweisen, die ihren "Eingang" von einem Kommunikationskanal erhalten, weil der zugewiesene Wert i.A. schnell wieder vom Kommunikationskanal (per CAN) wieder überschrieben werden.
  • Auch einige im Interpreter fest eingebaute Kommandos können mit einer formellen Zuweisung aufgerufen werden. Wenn der Operand hinter dem at-Zeichen mit einem Kleinbuchstaben beginnt, handelt es sich nicht um eine (benutzerdefinierte) Variable sondern um ein "variablen-ähnliches Interpreterkommando".

Ansteuern digitaler Ausgänge (on-board, optional)

Das Kommando "out" dient zum Setzen der in manchen Terminals vorhandenen digitalen Ausgänge. Es ist zum gleichzeitigen Ansteuern mehrerer Ausgänge, aber auch zum gezielten Ansteuern eines einzelnen Ausgangs verwendbar:
out(<8-bit-value>)
Mit diesem Kommando können Sie alle digitalen Ausgänge gleichzeitig schalten. Bit 0 steuert den ersten Ausgang , u.s.w.
outN(<neuer Zustand)
Schaltet einen einzelnen digitalen Ausgang (Nummer N, 1...8)
out(<output_nr>, <new_state> )
Schaltet ebenfalls einen einzelnen digitalen Ausgang (mit output_nr 0...7). Welcher Kanal geschaltet werden soll, kann hier als Variable übergeben werden.

Beispiele:

  • out(0xFF) schaltet alle Ausgänge ein
  • out(0x00) schaltet alle Ausgänge aus
  • out(0, 1) schaltet den ersten(!) Ausgang ein
  • out1(1) schaltet ebenfalls den ERSTEN(!) digitalen Eingang ein (Syntax und Kanalnummer wie bei der inp-Funktion).
  • out(3, 0) schaltet den vierten (!) Ausgang aus
  • out4(0) schaltet ebenfalls den vierten (!) Ausgang aus
  • out(out^0x02) invertiert den Zustand des zweiten digitalen Ausgangs
  • out16(!out16) invertiert den Zustand des sechzehnten Ausgangs.

Hinweise:

  • Es gibt nicht nur das Kommando "out" zum Setzen der digitalen Ausgänge, sondern auch eine Funktion "out" die den aktuellen Zustand der digitalen Ausgänge(!) zurückliest - nicht zu verwechseln mit der Funktion "inp" .
    Beispiel: out2 liefert den Wert 1 (Eins, als Funktion) wenn der
    zweite Ausgang gesetzt ist, andernfalls 0 (Null).
  • Nicht alle Geräte, die als "UPT" bzw "MKT-View" eingesetzt werden, haben eingebaute digitale Ausgänge. Um digitale Ausgänge eines speziellen I/O-Erweiterungsmoduls anzusteuern, benötigen Sie einen CANopen-Kommunikationskanal.
  • Die Anzahl verfügbarer digitaler Eingänge, und die zulässigen Eingangspegel entnehmen Sie bitte der Hardwarebeschreibung Ihres Terminals. Falls dies ein UPT515 ist, sind dort wahrscheinlich vier digitale Ausgänge und sechs digitale Eingänge vorhanden.
  • Die digitalen Ein- und Ausgänge der UPT’s können vom Programmiertool "simuliert" werden. Die aktuellen Zustände werden als runde "LEDs" im Simulatorfenster angezeigt. Die grünen LEDs sind die Eingänge, die gelben die Ausgänge. Dass bei bestimmten Geräten (z.B. "MKT-View") Ein- und Ausgänge (leider!) auf identischen Anschlußklemmen liegen, berücksichtigt der Simulator allerdings nicht.


"System"-Funktionen und -Kommandos des Display-Interpreters

Die system-Funktionen des Interpreters dienen zum Zugriff Systemparameter und Funktionen, die normalerweise nur im Systemmenü des Terminals angezeigt bzw von dort aufgerufen werden können. Sie dienen im Allgemeinen nur zu Test- und Debugging-Zwecken, können aber auch im Anwenderprogramm eingesetzt werden. Nur die hier dokumentierten Funktionen dürfen in Ihrem Anwenderprogramm eingesetzt werden (darüberhinaus existieren einige hier nicht dokumentierte Funktionen, die ohne Rücksicht auf Kompatibilität irgendwann geändert oder sogar entfernt werden könnten).
Bei Geräten mit Script-Sprache existieren ähnliche Funktionen mit dem Prefix 'system'.

sys.audio_vol
Reads or writes the audio output volume aka "Speaker Volume". The same parameter can be modified (and permanently saved) in the terminal's system menu.
The function is only implemented in certain terminals with an analog audio output - see feature matrix .
sys.click_vol
Nur für Geräte mit Touchscreen. Mit dieser Funktion (formell: Variable) kann die normalerweise im System-Menu eingestellte Klick-Lautstärke gelesen bzw. modifiziert werden.

sys.lost
Liefert die Summe aller seit dem Einschalten "verlorenen" CAN-Telegramme, nicht verarbeiteter Interrupt-Anforderungen, verlorene Zeichen von der seriellen Schnittstelle, verlorene Ereignisse, usw. Dieser Wert darf nur gelesen werden. Im Ideallfall ist (und bleibt!) er Null. Mögliche Ursachen, wenn dieser Zähler ungleich Null ist, sind...
  • empfangene CAN-Telegramme, die (wegen CPU-Überlastung) vom CAN-Logger nicht verarbeitet werden konnten
  • CAN-Telegramme, die eigentlich vom Protokoll-Handler des Terminals verarbeitet werden sollten, die aber wegen eines Pufferüberlaufs verloren gingen
  • Tastaturereignisse, die wegen eines Pufferüberlaufs verloren gingen (i.A. wegen zu langsamer Hauptschleife)
  • Zeichen die von der seriellen Schnittstelle empfangen wurden, die aber -auf RS232-Treiber oder 3964R-Protokoll-Ebene-  verloren gingen
  • Interrupts an die CPU die wegen zu vieler noch anstehender Interrupt-Anforderungen von der CPU nicht verarbeitet werden konnten (normalerweise durch hohe Buslast verursacht)
sys.menu(x)
Dieses Kommando kann verwendet werden, um eine bestimmte Funktion im "System-Menue" der Terminals aus dem Anwenderprogramm (der "Applikation") aufzurufen. Diese Funktion diente in erster Linie zu Tests während der Entwicklung des Terminals beim Hersteller. Weitere Informationen und eine Liste der zulässigen Menü-Nummern (x) finden Sie hier (nur in englischer Sprache).
sys.show_icons
Nur in Geräten mit 32-Bit-CPU verfügbar (seit 2008). Mit diesem Kommando wird die Anzeige sogenannter "System-Icons" aktiviert, mit der z.B. der Zustand der Speicherkarte, der Spannungsversorgung, des CAN-Busses, und des CAN-Loggers angezeigt werden kann. Details finden Sie in diesem Dokument.
sys.edit_contrast
Diente bei alten Geräten mit Passiv-STN-Display (z.B. MKT-VIEW "Plus") zum Optimieren der LCD-Kontrast-Steuerung. Die genaue Funktion und Bedienung des "LCD-Kontrast-Kennlinien-Editors" wird in einem gesonderten Dokument beschrieben. Das Kommando wurde damals verwendet, um dem Bediener den Aufruf dieser Einstellfunktion aus der Applikation zu ermöglichen, ohne daß sich der Bediener durch das Systemmenü des Terminals "hangeln" musste.
Bei moderneren Geräten mit TFT- oder OLED-Display entfällt dieser Anachronismus.
sys.poff
Schaltet das Gerät ab. Hinweis: Dies funktioniert nur bei bestimmten Geräten (z.B. MKT-View II). Die meisten älteren Geräte können sich -hardwarebedingt- nicht selbst abschalten.
Wie das Gerät danach wieder eingeschaltet werden kann, hängt von der verwendeten Hardware, und z.T. von den Einstellungen im System-Menü ab. Details dazu finden Sie im Dokument Nr. 85115 (PDF), Kapitel "Power on/off" .
In der Script-Sprache existiert ein ähnlicher Befehl : system.shutdown.

sys.t_shutdown( < Dauer bis zum Öffnen der Shutdown-Meldung in 0.1-Sekunden-Schritten > )
Dieses sehr spezielle, und extrem selten verwendete Sonderkommando dient zum Einstellen der Zeit, die der Power-Knopf gedrückt werden muss, bis das sog. "Shutdown-Menü" (u.a. zum Abschalten des Gerätes) angezeigt wird. Die Einheit ist 0.1 Sekunden; der Default-Wert beträgt 30 (* 0.1 Sekunden).
Das Kommando funktioniert nur bei Geräten, die tatsächlich per Tastendruck ein- und ausgeschaltet werden können (wie z.B. das "MKT-View II").
Hinweis: Wird die Power-Taste für mehr als zehn Sekunden gedrückt, schaltet sich das Terminal IMMER ab (ohne Shutdown-Screen). Diese Funktion ist durch die Hardware vorgegeben (Not-Abschaltung wie beim "gecrashten Notebook"); sie kann softwaremäßig nicht geändert werden.
Siehe auch: sys.poff (um das Gerät programmgesteuert, ohne Shutdown-Menü, abzuschalten).

sys.reset
Führt einen System-Reset durch, d.h. die Terminal-Firmware wird "neu hochgefahren". Dies kann in bestimmten Fällen nötig sein, z.B. um das verwendete CAN-Protokoll neu zu initialisieren, oder um aus dem "CAN-Gateway"-Modus wieder in den Normalbetrieb umzuschalten. (Das hier gemeinte CAN-Gateway ist eine proprietäre Sonderfunktion eines bestimmten Terminals, die hier nicht weiter beschrieben wird. Dokumentation ist beim Autor erhältlich).
Bei Geräten mit Script-Sprache kann mit diesem Befehl wieder aus der per system.exec(<Dateiname.cvt>) von der Speicherkarte nachgeladenen Applikation wieder in den 'App-Selektor' zurückgeschaltet werden.


sys.set_time
Öffnet eine Anzeigeseite auf der die Echtzeituhr eingestellt werden kann (Datum und Uhrzeit). Nur bei Terminals vorhanden, in denen eine batteriegepufferte Echtzeituhr eingebaut ist.
Hinweis: Im Systemmenü des Terminals wird das Format nach ISO 8601 verwendet. Das Datumsformat ist YYYY-MM-DD (DD=Tag), das Zeitformat hh:mm:ss (Stunde:Minute:Sekunde). Suchen Sie im Web nach "ISO 8601", wenn Sie weitere Informationen zu dieser segensreichen Normierung benötigen. Der Autor dieses Dokuments empfiehlt dringend, dieses Format auch in Ihrer eigenen Anwendung einzusetzen, auch wenn Sie vielleicht kein Programmierer sind. Ein internationaler Anwender wird unter der Angabe "12.05.03" mit Sicherheit nicht das Datum "12. Mai 2003" vermuten !
sys.vsup
Liefert die aktuelle Versorgungsspannung des Terminals, gemessen "kurz hinter der Verpolschutzdiode". Der Wert ist daher nicht sehr präzise. Sie können diese Funktion zu Diagnosezwecken einsetzen, wenn das Terminal z.B. aus dem Bordnetz eines KFZ versorgt wird. Einheit: 0.1 Volt, d.h. der Wert 123 bedeutet "12.3 Volt".
sys.vcap
Ähnlich wie sys.vsup, hier wird allerdings die Spannung an den Pufferkondensatoren in der internen USV (Unterbrechungsfreie Stromversorgung) gemessen. Einheit: Millivolt. Das Maximum liegt (beim MKT-View II) knapp unter 5000, d.h. 5 Volt. Bei Geräten ohne interne USV (z.B. MKT-View I) liefert diese Funktion den Wert Null.
sys.temp
Liefert die aktuelle Temperatur im Terminal, gemessen in der Nähe des Displays. Die Terminal-Firmware verwendet diesen Wert für die automatische Kontraststeuerung. Sie können diesen Wert zu Testzwecken in Ihrer Anwendung auf dem Display anzeigen, etc. Der von der Funktion "sys.temp" zurückgegebene Wert ist eine Integerzahl mit dem Skalierungsfaktor 0.1 °C, der Wert -185 bedeutet daher z.B. "-18.5 Grad Celsius".

sys.alight (ambient light sensor value)
Liefert den aktuellen Messwert des Beleuchtungssensors (0=dunkel ... 255=Sonnenlicht). Existiert nur in bestimmten Geräten, z.B. MKT-View II .
Ein Beispiel für den Einsatz dieser Funktion zur automatischen Umschaltung zwischen Tag- und Nachtdesign finden Sie hier.

Weitere spezielle Interpreter-Kommandos

beep, play  (be, pl)

Erzeugt einzelne Töne oder Tonfolgen mit dem eingebauten Pieper. Verschiedene Töne sind möglich. Da nur bestimmte Geräte einen Pieper enthalten (z.B. Terminals mit C167-Prozessor), finden Sie die Beschreibung der Pieper-Kommandos in einer anderen Datei.

Button Key, Button State (bk, bs)

Zum Abfragen und programmgesteuerten Umschalten der graphischen Buttons. Nicht in allen Firmware-Varianten vorhanden, darum: Beschreibung in einer anderen Datei.

Handle Key (hk)

Diese Kommando ermöglicht es, den Druck bestimmter Tasten zu "simulieren", die physikalisch auf der Tastatur nicht vorhanden sind. Z.B. könnten Sie mit dem Kommando hk("-") den Code für die Minus-Taste an den Tasten-Handler des Systems senden, was die Invertierung des Vorzeichens der grade editierten Zahl zur Folge haben könnte (falls sich ein Eingabefeld grade im Editiermodus befindet). Der Übergabeparameter kann als Kette von ASCII-Zeichen notiert werden, oder als numerischer Wert aus der Tabelle der System-Tastencodes. Hinweis: Nicht alle dieser Codes haben eine bestimmte Funktion, wie Sie sie vielleicht von der PC-Tastatur erwarten würden !

reset (Interpreterkommando)

Setzt die Anwendung (und einige CAN-Protokoll-Schichten) zurück. Alle variables werden auf ihre Defaultwerte gesetzt (sofern definierbar). Alle Timer werden zurückgesetzt. Alle Display-Seiten werden neu aus dem dauerhaften Speichermedium (i.A. FLASH) geladen. Das Programm wird auf Seite 0 (Null) umgeschaltet, wie direkt nach dem Einschalten.

Kommandos zum Steuern des CAN-Loggers

Beschreibung in einer anderen Datei, weil der CAN-Logger nicht zur Standardausstattung der programmierbaren Terminals zählt.

Kommando zum Setzen des 'Power'-Flags

Bei alten Geräten (wie z.B. MKT-View "Plus") war noch keine interne USV (unterbrechungsfreie Stromversorgung) vorhanden, was zum folgenden Problem führte:
Beim Anlassen des Motors brach die Versorgungsspannung für kurze Zeit so tief ein, dass ein unplanmäßiger Reset (d.h. Neustart) des Gerätes ausgelöst wurde. Dadurch konnte (bei frühzeitig gestartetem Logger) das Dateisystem auf der Speicherkarte, oder sogar die Karte selbst beschädigt werden.
Abhilfe: Bei diesen alten Geräten musste im ANWENDERPROGRAMM (*.cvt) das sogenannte Power-Good-Flag gesetzt werden, per Interpreterkommando:

power=1 : REM Spannungsversorgung ist jetzt 'sicher genug' für den Logger

Erst danach waren Zugriffe auf die Speicherkarte (auch für den CAN-Logger) möglich.
Bei moderneren Geräten (wie z.B. MKT-View II) braucht das Power-Flag nicht mehr per Applikation gesetzt werden, weil dort eine interne USV das ordnungsgemässe Schliessen aller Dateien auf der Speicherkarte ermöglicht, unabhängig von der Spannungsversorgung. Zum Abfragen des aktuellen Ladezustands der USV-Kondensatoren kann die Funktion sys.vcap (im Display-Interpreter) bzw. system.vcap (in der Script-Sprache) verwendet werden.

Node-Scan (für Geräte mit modifiziertem CANopen-Protokoll / "Mini-Master" )

Sucht den CAN-Bus nach CANopen-Geräten ab. Beschreibung in einer externen Datei, da diese Funktionalität nicht zum Standardumfang der programmierbaren Terminals gehört.

Siehe auch: Weitere Interpreterkommandos




Der Script-Editor / Compiler / Debugger

Die in neueren Geräten (ab MKT-View II) integrierte Script-Sprache ermöglicht das Entwickeln komplexerer Anwendungen. Als Script programmierte Abläufe sind wesentlich übersichtlicher als die im 'Telegrammstil' mit Hilfe des Display-Interpreters formulierten Event-Definitionen.


Screenshot des Script-Editors (im Programmiertool auf der Registerkarte 'Script')

Aufgrund des Umfangs von Script-Sprache und der für die Script-Entwicklung verwendeten Tools wurde die Beschreibung in ein separates Dokument (Scripting_49.htm) ausgelagert.



Anhang

Im Anhang finden Sie einige Informationen für den "fortgeschrittenen Anwender", und Hinweise für die Fehlersuche.

Verschlüsselung der CVT/UPT-Datei (Applikation)

Beim Abspeichern der Applikation als *.CVT- bzw. *.UPT-Datei können Daten (Programmcode, Anzeigeseiten, aber auch aus *.DBC oder AUTOSAR importierte Definitionen) mit einem selbstdefinierten Passwort zu verschlüsseln. Wählen Sie dazu im Programmiertool vor dem Abspeichern im Menü 'Datei' die Funktion 'Passwortschutz' ... 'Passwort aktivieren'.


Dialog für die Eingabe eines Passworts für die Dateiverschlüsselung

Wie üblich, muss das Passwort zweimal eingegeben werden. Optional kann ein 'Hinweis' (als Gedankenstütze) eingeben werden.
Beides (Passwort und Hinweis) werden in verschlüsselter Form im Dateikopf abgelegt.

Hinweis
Bewaren Sie das Passwort sorgfältig auf. Wir (MKT Systemtechnik) haben keine Möglichkeit, ein verlorenes Passwort aus der *.CVT- oder *.UPT-Datei wiederherzustellen.
Passwörter können zwar optional auf Wunsch des Benutzers vom Programmiertool auf dem PC 'lokal' gespeichert werden, und liegen dann in gescrambelter Form in der Datei MKT_CANdbTerminalProgTool.ini bzw. MKT_CANopenTerminalProgTool.ini vor, sind aber ohne Kenntnis des Scrambling-Algorithmus ebenfalls nicht wiederherstellbar.

Die Geräte-Firmware kann aus dem gescambelten Passwort einen Schlüssel zum Decodieren der Daten (Programmcode, Anzeigeseiten, Signaldefinitionen, ..) erzeugen, so daß zum Betrieb des Gerätes mit einer verschlüsselten Applikation keine Passworteingabe durch den Bediener nötig ist.
Beim Auslesen der Applikation aus dem Flash des Gerätes (z.B. per CAN) bleibt die Verschlüsselung erhalten. Auch auf diesem 'Umweg' kommen Sie daher nicht an ein verlorenes Passwort heran !

Handbücher zu den programmierbaren Terminals (PDF-Format)

Die folgenden Verweise führen direkt auf die Seiten des Herstellers (MKT). Nur so ist sichergestellt, daß Sie die aktuellste Version des Dokuments verwenden. Wenn Ihr Rechner nicht mit dem Internet verbunden ist, finden Sie einen Teil dieser Dokumente nach der Installation des Programmiertools im Unterverzeichnis 'DOKU'. Alternativ finden Sie eine Übersicht auf der "MKT-CD" (ebenfalls online verfügbar).

Weitere Handbücher, z.B. gerätespezifische Hardwarebeschreibungen, Zubehörkataloge, "Programmiereinstieg", etc. können von der MKT-Webseite heruntergeladen werden.


Boot-Screen (optional beim Einschalten angezeigte Bitmap-Grafik)

Je nach Umfang der Applikation und CPU-Geschwindigkeit vergehen zwischen Einschalten der Spannungsversorgung und der Anzeige der ersten 'programmierten' Seite ('Seite Null') einige (wenige) Sekunden.
Während dieser Zeit wird im Display per Default der Initialisierungsverlauf (als Text) angezeigt, oder der Bildschirm bleibt bis zum Erscheinen der ersten 'programmierten' Seite komplett schwarz.

Stattdessem kann bei Geräten mit Farbdisplay eine für den Kunden angepasste Grafik (z.B. ein Firmenlogo) während des Startvorgangs angezeigt werden.


(Beispiel für eine beim Einschalten angezeigte 'Boot-Screen'-Grafik, 240 * 240 Pixel)

Setzen Sie dazu zunächst im 'System-Menü / Setup' unter 'System Setup' .. 'Display Setup' den Parameter 'Bootup Display' auf 'FALSE'. Dadurch wird die Anzeige des Initialisierungsverlaufs beim Starten unterdrückt.
 Main system menu (9)
 EXIT !
 Load program from FILE
 Transfer via CAN = OFF/Auto
 Other transfers ... ▶
 Audio Recorder
 CAN snooper mode
 CAN logger config
 User Settings
 System Setup / Unlock        
 System Test
 Network Setup
 Diagnostics
 General Settings
 ...
 Setup Menu (3)
 EXIT !
 Save & EXIT !
 Display setup    .. ▶     
 Audio setup      .. ▶
 Date and Time    .. ▶
 CAN-Baudrate=500
 Modul/NodeID=000
 CAN1_TxEnable=1
 CAN2_TxEnable=1
 CAN1_120_Ohm=1
 CAN2_120_Ohm=1
 WakeupSource=Key, Vin
 GPS Rcv Type=NONE / off
 ...
 Display Setup (5)
 EXIT !
 Save & EXIT !
 LCD dimming     .. ▶
 LCD-OffTime =0000
 Bootup Displ=FALSE       
 Bootup Debug=0
 Vis. Gesture=TRUE
 Portr.Rotate=CLOCKWISE
 Touchscreen Calibration
 





(Abschalten der System-Meldungen beim Hochfahren des Gerätes, hier: beim MKT-View III)


Laden Sie danach eine selbst erstellte Grafik als Datei mit dem Namen BOOTSCRN.BMP (*) in das geräteinterne FLASH des Gerätes.
Ähnlich wie die benutzerdefinierten Zeichensätze wird diese Datei nicht 'fest' in die *.cvt-Datei eingebunden (denn das würde die CVT-Datei extrem aufblähen), sondern sie wird per File-Transfer über das Pseudo-Dateisystem im Verzeichnis "font_flash" abgelegt. Beim Aufruf des File-Transfer-Utilities aus dem Hauptmenü des Programmiertools über Transfer .. 'Boot-Screen per File-Transfer-Utility senden' wird automatisch das passende Zielverzeichnis (i.A. "font_flash") eingestellt.
Der Inhalt der Partition "font_flash" wird beim Laden einer neuen Applikation (*.cvt bzw. *.upt) nicht überschrieben, d.h. die oben beschriebene Übertragung ist pro Gerät nur ein einziges Mal nötig.

(*) Die Datei BOOTSCRN.BMP darf nicht komprimiert sein.
Die Farbtiefe sollte 8 Bit pro Pixel betragen, d.h. 256 Farben (mit Palette oder im 'RGB332'-Format).
Die Größe (in Pixel) darf nicht größer als das Display sein (siehe Angabe in der Feature-Matrix).

Zum Anpassen von Größe und Farbformat ist z.B. das Programm 'IrfanView' gut geeignet. Zum Verringern der Farbtiefe wählen Sie in IrfanView die Funktion Image .. Decrease Colour Depth .. 256 Colors (8 BPP), zum Anpassen der Größe die Funktion Image .. Resize / Resample.

Ist das Bild kleiner als das Display, wird es in der Anzeige zentriert.

Das hier verwendete, für Displays mit mittlerer Größe geeignete Beispiel finden Sie im Unterverzeichnis 'fonts' des Programmiertools, Datei BOOTSCRN.BMP .
Mit einer Größe von 240 * 240 Pixel ist ist das Bild im MKT-View III sowohl für Hoch- als auch Querformat geeignet.





CANopen-SDO-Fehlercodes

Die unten gezeigte Tabelle zeigt einige Fehlercodes, die bei der Kommunikation per SDO (CANopen) z.B. während der Programmübertragung auftreten könnten.
Wir haben uns eine Übersetzung der Fehlercodes ins Deutsche bislang erspart..

Die meisten Fehlercodes stammen aus CANopen DS301 V4.

Some of these errors may also be caused by external devices on the CAN bus.

For a more sophisticated explanation of these errors you should check the CiA literature or other CAN protocol descriptions.

See also: CANopen objects inside the UPT ,  description of the error page
CANopen Error Codes
Error Code Meaning
0x05030000 TOGGLE-BIT NOT ALTERNATED
0x05040000 SDO-PROTOCOL TIMED OUT
0x05040001 COMMAND SPECIFIER NOT VALID OR UNKNOWN
0x05040002 INVALID BLOCK SIZE
0x05040003 INVALID SEQUENCE NUMBER
0x05040004 CRC ERROR
0x05040005 OUT OF MEMORY
0x06010000 UNSUPPORTED ACCESS TO AN OBJECT
0x06010001 ATTEMPT TO READ A WRITE-ONLY OBJECT
0x06010002 ATTEMPT TO WRITE A READ-ONLY OBJECT
0x06010047 UNSUPPORTED ACCESS, INTERNAL INCOMPATIBLE
0x06020000 OBJECT DOES NOT EXIST IN DICTIONARY
0x06040041 OBJECT CANNOT BE MAPPED TO THE PDO
0x06040042 MAPPED OBJECTS WOULD EXCEED PDO LENGTH
0x06040043 GENERAL PARAMETER INCOMPATIBILITY
0x06040047 GENERAL INTERNAL INCOMPATIBILITY
0x06060000 ACCESS FAILED DUE TO HARDWARE ERROR
0x0606002F ACCESS FAILED DUE TO CAN ERROR
0x06070010 DATA TYPES DO NOT MATCH
0x06070010 LENGTH OF PARAM DOES NOT MATCH
0x06070012 LENGTH OF PARAM TOO HIGH
0x06070013 LENGTH OF PARAM TOO LOW
0x06090011 SUBINDEX DOES NOT EXIST
0x06090030 VALUE RANGE EXCEEDED
0x06090031 VALUE RANGE TOO HIGH
0x06090032 VALUE RANGE TOO LOW
0x06090036 MAXIMUM VALUE IS LESS THAN MINIMUM VALUE
0x08000000 GENERAL ERROR
0x08000020 DATA CANNOT BE TRANSFERRED TO APPLICATION
0x08000021 .. due to local control
0x08000022 .. due to device state
0x08000023 OBJECT DIRECTORY GENERATION FAILS







CANopen-Objekte innerhalb des Terminals

Auf die meisten im Terminal gespeicherten Informationen kann per CAN-Bus zugegriffen werden, da sie als Teil des sogenannten CANopen-Objektverzeichnisses angelegt sind. Das Programmiertool kann per SDO auf diese Objekte zugreifen, wenn z.B. das Anwenderprogramm per CAN-Bus vom PC in das Terminal geladen wird.

Mittlerweile existieren zwei völlig unterschiedliche Implementierungen des CANopen-Protokolls in MKT's programmierbaren CAN-Terminals:  Im UPT515 wird eine alte, proprietäre Implementierung verwendet (die nicht dem aktuellen Standard DS301 V4 entspricht), in allen anderen Geräten (mit 16-Bit-CPU, z.B. UPT320) steht genug Speicher für eine "vollwertige" CANopen-Implementierung der Firma SYS TEC zur Verfügung.

Im letztgenannten Fall (UPT320, CANopen "von SYS TEC") steht eine maschinenlesbare Beschreibung des CANopen-Verzeichnisses als EDS-Datei zur Verfügung. Einige Details zu Objekten im herstellerspezifischen Profil finden Sie auch in diesem separaten Dokument.

Das Folgende gilt nur für das ("alte") UPT515, in dem nicht genügend Codespeicher für eine "moderne" CANopen-Implementierung zur Verfügung steht :

(ToDo: Übersetzen, oder den folgenden Text lieber gleich entfernen ?)

As you upload or download a program into/from the terminal, there may be some error messages with a CANopen-index in the range of 0x5100 to 0x57FF. The possible cause for such errors may be a compatibility problem between an "old" terminal and a "new" programming software (or vice versa). The following table may help to trace such errors:
CANopen-Index Inhalt (Vorsicht, einige Objekte existieren nur im alten "UPT515",
einige andere nur in neueren Geräten mit 32-Bit-CPU / "UPT 2"-Familie ! )
0x4001...0x400F PDO-mapbare Variablen (nur UPT 2, NICHT bei UPT515 ! )
0x5000 Digitale Eingänge, onboard (nur bei bestimmten Geräte in der UPT 2 - Familie)
0x5001 Tastatur-Matrix (bei den meisten Geräten in der UPT 2 - Familie)
0x5080 MKT’s CAN snapshot utility  (UPT515 only)
0x5101 Constants (max number of variables, etc.,  UPT515 only)
0x5102 Names of the terminal’s keys  (UPT515 only)
0x5103 General Settings (number of display pages, etc.,  UPT515 only)
0x5104 Run Mode (Run, Stop, Transfer etc,  UPT515 only)
0x5105 current Display-Page
0x5106 Save Permanent (transfers RAM data to EEPROM, UPT515 only)
0x5107 Erase some Flash Sectors (used for table-storage, UPT515 only)
0x5110 CANopen-Konfiguration (SYNC, NMT, UPT515 only)
0x5111
Die komplette "UPT"-Applikation für Terminals mit 16-Bit-CPU
(als Zeichenketten mit "auto-inkrement" für den Zeilenzähler,
nur bei Terminals mit CANopen V4, also nicht für UPT515).
Geräte mit 32-Bit-CPU können über dieses Objekt ferngesteuert werden.
0x5112 X/YModem File Server (nur bei Geräten mit 32-Bit-CPU)
0x5120 CANdb(!) file import history (as strings, UPT515 only)
0x5180 global Events-Definitions (as strings, UPT515 only)
0x5200..52ff SDO-Channel-Definitions (as strings, UPT515 only)
0x5200 Digitale Ausgänge, onboard (nur bei bestimmten Geräte in der UPT 2 - Familie)
0x5300..53ff PDO-Kanal-Definitions (as strings, UPT515 only)
0x5400..54ff Variable-Definitions (as strings, UPT515 only)
0x5500..55ff Display-Page-Definitions (as strings, UPT515 only)
0x5600..56FF Icon-Definitions (hex-coded strings, UPT515 only)
0x5700..57FF Text-Array-Definitions (strings, UPT515 only)
0x5800..580F Non-volatile values which can be accessed as "nv[N]" from the interpreter.
UPT515 only ! !




The data format of the definition-tables is very similar to the text-file-format which is used to save your UPT program on a disk drive. In fact, we use the same conversion routines in the UPT firmware as in the programming tool.

Since May 2001, some UPT firmware versions have a few objects from the CANopen communication profile implemented (DS301, Object index range 0x1000 – 0x1BFF). These objects only exist to detect a UPT device in a network. It is impossible to modify UPT settings via these objects. The PDO communication- and mapping objects do not carry useful information yet.
CANopen-Index Contents
0x1000 Device Type
(not applicable, only DS301 at the moment)
0x1018 Identity Object
0x1018.1 MKT’s vendor ID (0x004D4B54)
0x1018.2 Product Code (70055=UPT515, etc)
0x1018.3 Revision Number (ex: 0x00010002 = V01.02)
0x1018.4 Serial Number (expect this to be ZERO)






 

See also: Usage of Index and Subindex , SDO error codes



Troubleshooting

Dieses Kapitel enthält eine Liste von mehr oder weniger "häufigen" Problemen, die im Laufe der Entwicklung verschiedener Geräte aufgetreten sind, deren möglicher Ursache, und (im Idealfall) der Fehlerbehebung durch den Anwender.
Siehe auch: FAQ ("oft gestellte Fragen").

Problem: Direkt nach dem Einschalten sendet ein MKT-View Morsezeichen, aber es erscheint nichts auf dem Bildschirm.
Ursache: Diese Morsezeichen sind ein (hilfreiches) Überbleibsel aus der Entwicklungsphase. Wenn ein ARM-Cortex-Prozessor aus diversen Gründen 'abstürzt', landet er mit etwas Glück nicht im 'Nirvana' sondern in einem 'Exception handler'. Passiert dies direkt nach dem Einschalten, bevor die CPU das Display (oder das externe SDRAM) initialisieren konnte, wird eine entsprechende Fehlermeldung im Morsecode per Speaker ausgegeben. Der Entwickler (Funkamateur und Hobby-Telegraphist) konnte dem Morsecode nicht nur den Namen des Exception-Handlers (z.B. "HF" = Hard Fault), sondern u.A. auch die hexadezimale Adresse des Programmzählers entnehmen, wenn weder ein Display noch JTAG-Debugger zur Verfügung standen (denn nach Murphy's Law treten sporadische Fehler nie auf, wenn ein Debugger angeschlossen ist).
In den meisten Fällen wurden solche Fehler durch EMV-Probleme ("Störspannungen"), Probleme mit dem SDRAM, oder durch eine zu langsam ansteigende Versorgungsspannung hervorgerufen. Letzeres führte zum unsicheren Betrieb des SDRAMs, wenn die CPU wenige Millisekunden nach dem Einschalten "Strom zog", aber die Spannung auf der Eingangsseite des internen Spannungsreglers noch zu niedrig für einen sicheren Betrieb war. Fehlerbehebung: Gerät abschalten, einige Sekunden "abkühlen" lassen, und wieder einschalten. Tritt das Problem (Morsecode statt Anzeige) wieder auf, versuchen Sie zunächst ein Firmware-Update per Bootloader. Führt dies nicht zum Erfolg, schicken Sie das Gerät zur Überprüfung an den Hersteller. Legen Sie dem Gerät bitte eine Fehlerbeschreibung bei, mit Angabe der Spannungsversorgung (wichtig: Spannung und Maximalstrom des verwendeten Netzteils bzw. Bordnetzes, Länge und Leiterquerschnitt der verwendeten Anschlusskabel, und [wegen SDRAM-Problematik / 'Delay Line Calibration' bei älteren CPUs] auch die Umgebungstemperatur, bei der das Problem auftrat).

Problem: Direkt nach dem Einschalten blinken beim MKT-View rote LEDs unter den Tasten, der Bildschirm bleibt dunkel.
Ursache und Fehlerbehebung:
Ähnlich wie beim vorhergehenden Punkt dieser Liste, in diesem Fall aber ohne den 'glücklichen Umstand' dass der Haupt-Prozessor statt 'Crash' in einem Exception-Handler landete (und Lebenszeichen / Fehlerdetails im Morsecode senden konnte).
Der im MKT-View eingebaute 'Hilfsprozessor' (aka 'Standby-Controller') bemerkt, dass der 'Hauptprozessor' (ARM-Cortex) sich nicht innerhalb weniger Millisekunden über eine interne Schnittstelle meldet, und steuert als Warnung bzw. Fehlermeldung die rote(n) Leuchtdiode(n) unter den Funktionstasten an.
Tritt dieser Fehler mehr als einmal (nach Aus- und Wiedereinschalten) auf, kann versucht werden, per Bootloader einen 'zerschossenen' Flash-Inhalt wiederherzustellen. Details dazu finden Sie im Unterverzeichnis 'Firmware' in der zum verwendeten Gerät passenden Anleitung zum Firmware-Update, z.B. (MKT-View III) in der Datei Readme_MKTview3.pdf im Kapitel "Rettung per FlashMagic". Lässt sich das Gerät auch per Flash-Magic nicht mehr ansprechen, liegt ein Hardware-Defekt vor, und das Gerät sollte zur Reparatur eingeschickt werden. Bitte auch in diesem Fall eine genaue Fehlerbeschreibung beilegen, denn es haben sich bereits Geräte (mit steckbarer CPU-Platine wie beim MKT-View III) durch Vibrationen beim Transport 'vorübergehend selbst repariert', und der Fehler war beim Hersteller nicht mehr nachvollziehbar.

Problem: Ein älteres "UPT" crashte nach einer Aktualisierung der Firmware oder des Anwender-Programms.
Ursache: Die neue Firmware verwendet möglicherweise Datenstrukturen, die nicht mit dem im Flash gespeicherten Anwender-Programm kompatibel ist. Von diesem Problem sind nur schon seit langem 'veraltete' Geräte (UPT-515, MKT-View I, MKT-View "Plus") betroffen.
Abhilfe: Umgehen Sie das Laden der "alten" Applikation, indem Sie vor und während des Einschaltns die Tastenkombination zum Aufruf des System-Setups (bei den meisten Geräten F2+F3) gedrückt halten.
Statt die Applikation zu laden, springt die Firmware dadurch sofort in's "Setup". Verlassen Sie das Setup. Es erscheint z.B. die Anzeige "no display page loaded". Verbinden Sie das Gerät mit dem Programmiertool, und laden Sie Ihr Anwenderprogramm (*.cvt oder *.upt) erneut. Bei der Übertragung per CAN, Ethernet, oder Speicherkarte wird die Applikation aus dem Textformat automatisch in das zur neuen Firmware passende Binärformat konvertiert.

Problem: Nach dem Einschalten zeigt ein altes UPT zeigt "Loading XYZ.... error" auf dem Display an.
Ursache: Ähnlich wie im vorherigen Absatz (allerdings ohne Crash): Struktur des Anwender-Programms passt nicht zur neu geladenen Firmware. Abhilfe auch hier durch Neu-Laden der Applikation.


Problem: Der Empfang von PDOs ("Prozessdaten") funktioniert zwar am Gerät, aber nicht in der Simulation.
Grund ("damals") : Der Simulator in einem mittlerweile antiquierten Programmiertool unterstützte keine PDO-Funktionaliät, weil im damals verwendeten "CAN-Dongle" für den Parallelport(!) kein "Full-CAN", sondern nur ein "Basic-CAN"-Controller verwendet wurde. Im "echten" Geräte (mit "Full-CAN") existierte für jeden zu empfangenen CAN-Message-Identifier ein eigenes "Empfangs-Objekt" (was übrigends auch der Grund für die Beschränkung auf maximal 14 verschiedene Message-Identifier in alten MKT-Views war). Moderne CAN-Interfaces (bzw. deren Controller) verfügen über echte Empfangs-FIFOs, und das Problem mit "zu vielen verschiedenen CAN-Identifiern" existiert weder in den Geräten von MKT Systemtechnik, noch in den am PC anschließbaren CAN-Interfaces.
Abhilfe ("damals"): Testen Sie Ihre Applikation nur am "echten" Gerät.

Problem: Während des Editierens eines Anzeige-Elements schaltet das Programmiertool plötzlich zu einer anderen Seite um.
Grund: Die Simulation wurde nicht gestoppt, und "irgendwo" (z.B. Tastatur- oder Timer-Event-Handler) in Ihrere Applikation steht ein Befehl zum Umschalten der Anzeigeseite. Abhilfe: Stoppen Sie vor dem Editieren die Ausführung des Programms im Simulator ("Stop"). In der Statuszeile (am unteren Rand des Programmiertools) sollte "gestoppt" oder "Editieren", aber nicht "Läuft" angezeigt werden.


Problem: Trotz funktionsfähiger CAN-Schnittstelle funktioniert das erneute Hochladen der Applikation per CAN nicht mehr.
  Beim ersten Hochladen hatte das noch funktioniert.

Ursache (Möglichkeit 1): Beim Hochladen wurde auch die CAN-Baudrate des Gerätes geändert.
Abhilfe: Stellen Sie auch im Programmiertool (für das CAN-Interface am PC) die gleiche CAN-Baudrate ein, die in der neu geladenen Applikation im Gerät für die Schnittstelle 'CAN1' verwendet wird.

Ursache (Möglichkeit 2): Das Script in der Applikation hat die Möglichkeit, per CAN-Empfangs-Handler die weitere Verarbeitung bestimmter empfangener CAN-Message-Identifier zu unterbinden. Ist davon auch der für die Programmübertragung verwendete ID betroffen, funktioniert die Übertragung nicht mehr. Dieser Effekt könnte vom Entwickler der Applikation sogar beabsichtigt sein.

Abhilfe #1 (Holzhammer-Methode) : Löschen Sie die Applikation im Flash ("Diagnostics".."Erase Flash"), und starten das Gerät neu. Ohne Script wird sich die Firmware nicht mehr weigern, das empfangene Telegramm zu verarbeiten.

Abhilfe #2 (etwas eleganter) : Setzen Sie im System-Menü des Gerätes den Parameter in der Zeile "Transfer via CAN" von "Disabled" oder "OFF/Auto" auf "ON".
Damit signalisieren Sie der Geräte-Firmware, dass Message-Identifier 0x7F1..0x7FF unbedingt zum systemeigenen CAN-Empfangs-Handler 'durchgelassen' werden sollen.

Abhilfe #3 ('letzte Rettung') : Laden Sie die Applikation (ggf. mit einer aktualisierten Gerätefirmware) per Speicherkarte (SD, nicht SDHC).


Falls Sie selbst ein Problem haben, welches in der obigen Liste aufgeführt werden sollte, senden Sie Ihren Vorschlag bitte per Email an den Autor dieses Programms (bei MKT Systemtechnik).



Glossar

Babbling Idiot
Ein gestörter CAN-Knoten, bei dem z.B. der Empfangszweig nicht mehr funktioniert, aber der Sendezweig. Dies kann beim CAN-Bus zu einem endlosen Sendeversuch führen, weil der "plappernde Idiot" für das von ihm gesendete Telegramm keine Bestätigung erhält, und der Sendeversuch laut CAN-Spezifikation wiederholt wird . Ein Babbling Idiot kann zum kompletten Ausfall eines CAN-Busses führen, wenn er nicht -durch spezielle Hardware (!) - automatisch abgeschaltet wird. Als Folgeeffekt treten meistens Error Frames auf dem CAN-Bus auf.
CiA = "CAN in Automation"
Internationale Gruppe aus CAN-Anwendern und -Herstellern. Unterstützer von CANopen . Im Internet zu finden unter www.can-cia.de .
CANdb file
CAN database file. Eine von vielen Möglichkeiten, CAN-Telegramme und -Signale in einem CAN-Netzwerk zu beschreiben (völlig anders und weitgehend inkompatibel zu CANopen, weil in CANdb-Dateien bislang keine Protokolle definiert werden sondern -eigentlich- nur Telegramme).
CANdb ist eingetragenes Warenzeichen der Vector Informatik GmbH. Vector produziert u.A. ein Tool mit dem CANdb-Dateien erstellt werden können (CANdb-Editor).
Nachtrag 2009: Der CANdb-Editor ist offenbar nicht mehr als eigenständiges Programm frei verfügbar, sondern nur noch im Paket "CANdbLib" erhältlich. Als Alternative bietet sich z.B. der CANdb-Editor von Kvaser  (Kvaser Database Editor) an.
CANopen
Ein offener Industriestandard (von CiA) in dem eine Vielzahl von CAN-Übertragungsprotokollen, Datentypen, und Ablagestrukturen für die Objekte eines Gerätes beschrieben wird. DS401 ist nur ein vergleichsweise winziger Teil davon.
CVT
CAN-viewing terminal ("CAN-Anzeige-Terminal"). Wird auch als Dateinamenserweiterung verwendet. Im Gegensatz zu UPT-Dateien sind 'CVT'-Dateien aussschliesslich für Geräte mit CANdb-Funktionalität vorgesehen. Das erste Gerät welches CVT-Dateien verarbeitete war das MKT-View.
Irgendwann (Herbst 2009) kam die Forderung, daß diese ursprünglich nur als Anzeige konzipierten Geräte auch CAN-Signale senden können. Die Dateinamenserweiterung 'CVT' wird allerdings auch für diese Geräte (die keine reinen Anzeigen, sondern Steuerungen sind) beibehalten.
Device Profile
Eine standardisierte Beschreibung eines Gerätes mit CAN-Schnittstelle, in diesem Fall: Teil von CANopen von "CAN in Automation".
DS401
CANopen Device Profile for I/O-Modules. Ein Dokument von "CAN in Automation" für standardisierte E/A-Module.
Error Frame
Ein Indikator, dass in einem CAN-Netzwerk "irgendetwas" nicht stimmt. Error Frames können vom Programmiertool (!) angezeigt werden, wenn ein dafür geeignetes CAN-Interface / CAN-Treiber verwendet wird.
Function
Ein bestimmtes Unterprogramm im Interpreter, welches einen Wert zum Aufrufer zurückgibt. Der Funktionsaufruf kann Teil eines beliebigen numerischen Ausdrucks sein. Der Funktionsname beginnt immer mit einem Kleinbuchstaben. Im Gegensatz zu Funktionen liefern Prozeduren keine Werte, und haben daher -auch syntaktisch- eine völlig andere Bedeutung.
Geeignete Text-Editoren
.. sind Editoren für reinen ASCII-Text, oder notfalls 8-Bit-ANSI, die nicht die Unart besitzen nach "eigenem Gusto" normale Leerzeichen --chr(32)-- durch sogenannte 'non-breaking spaces' mit dem Code 160 (dezimal) bzw 0xA0 (hexadezimal) zu ersetzen.
Text-Editoren mit dieser unangenehmen Eigenart sind nicht zum Bearbeiten von *.upt bzw *.cvt - Dateien geeignet .
Hintergrund: Der Autor entdeckte Dutzende von ("Leer"-)Zeichen mit dem dezimalen Code #160 in einer Kunden-Applikation, die nur mit einem geeigneten Texteditor gerettet werden konnte. Als geeigneter Editor war NotePad++ in der Lage, die unsinnigen 160er-Zeichen wieder durch normale Leerzeichen (mit dem Zeichencode 32) zu ersetzen. Dabei ist allerdings Vorsicht geboten, denn das Zeichen #160 ist in den DOS-kompatiblen Zeichensätzen ein 'a accute' (á) .
MKT-View
Ein programmierbares Anzeige-Terminal für die Automobilbranche. Eigentlich kein Bedienterminal, obwohl es von vielen Anwendern genau dazu eingesetzt wird. Ursprünglich unterstützten diese Terminals *kein* CANopen, stattdessem erfolgte die Konfiguration durch CAN-Datenbanken. Die ins MKT-View ladbaren Dateien haben die Erweiterung CVT.
OD
Abkürzung für Object Dictionary. Manchmal (- treffender? -) auch als Object Directory ("Datenverzeichnis") bezeichnet, aber bei CiA wird das Verzeichnis aller Objekte eines CANopen-Gerätes nun mal Dictionary ("Wörterbuch") genannt. Das OD enthält "Alles", auf das per SDO zugegriffen werden kann. Eine "elektronische" Beschreibung des OD's ist das EDS file (electronic data sheet); die konkrete Konfiguration eines bestimmten Gerätes (mit "Werten") wird manchmal als DCF-Datei (device configuration file) abgespeichert - allerdings nicht vom Terminal-Programmiertool.
PDO
Prozessdaten-Objekt. Dient bei CANopen zur Übertragung von Messwerten.
Procedure
Ein "Kommando" des im Terminal integrierten Interpreters. Eine Prozedur liefert keinen Rückgabewert, und kann daher nicht Teil eines numerischen Ausdrucks sein (dies unterscheidet die Prozedur von einer Funktion). Mehrere Prozeduren können -durch Doppelpunkt getrennt- in einer einzigen Kommandozeile stehen, die z.B. als Reaktion auf ein bestimmtes Ereignis aufgerufen wird.
SDO
Servicedaten-Objekt. Dient bei CANopen zum Zugriff auf das OD eines Gerätes, z.B. bei der Parametrierung bzw. Konfiguration oder "Programmierung".
UDP
User Datagram Protocol. Teil der Internet-Protokoll-Suite. Im Gegensatz zum bekannteren TCP/IP ist UDP ein verbindungsloses, unsicheres, aber vergleichsweise einfaches Protokoll, welches aus letztgenanntem Grund gelegentlich zur Übertragung von Prozessdaten (z.B. Sensordaten) per Standard-Ethernet verwendet wird. Einige programmierbare Geräte können (mit Einschränkungen) UDP-Pakete senden und empfangen, wobei die Blockgröße -im Gegensatz zur UDP-Spezifikation- auf ein einziges Ethernet-Paket beschränkt ist. Weitere Details zur UDP-Implementierung finden Sie hier .
UPT
User Programmable Terminal.  Dies war das erste CAN-Terminal von MKT, welches ohne Kenntnisse einer echten Programmiersprache programmiert werden konnte. Das erste Modell (UPT515) hatte einen 8051-kompatiblen 8-Bit-Prozessor, ein einfarbiges LCD mit 128*64 Pixeln, Cursortasten und ein paar Funktiontasten unterhalb des Displays. "UPT" wurde auch als Dateinamenserweiterung (extension) für "UPT-Programme" verwendet.
Das UPT515 diente als Grundgerüst für das später entwickelte MKT-View.
Variable
Ein Element des numerischen Interpreters zum Speichern eines einzelnen Wertes. Kann Teil eines numerischen Ausdrucks sein. Der Variablenname beginnt immer mit einem Großbuchstaben, um Variablen von Funktionen und Prozeduren zu unterscheiden. Beispiel für eine Variablenzuweisung:
@MeinWert = MeinWert+1
(das "at"-Zeichen dient hier als Zuweisungsoperator)


Kontaktaufnahme mit dem Autor

Vermuten Sie einen Fehler in diesem Dokument oder in der Software ?
Prüfen Sie bitte zunächst ob Sie wirklich die aktuelle Software (und deren Dokumentation) verwenden - dies gilt für Programmiertool und Firmware. Ist das der Fall, senden Sie die detailierte Fehlerbeschreibung bzw. Ihren Verbesserungsvorschlag bitte an den Autor:
Wolfgang Büscher
- Softwareentwicklung -
MKT Systemtechnik
Mail: b u e s c h e r (at) m k t (minus) s y s (dot) d e
Internet: www.mkt-sys.de

Bitte fügen Sie der Beschreibung Folgendes hinzu:

  • Die Information über das verwendete Programmiertool (CANopen ? "CANdb" ?), im Hauptmenü abrufbar per "Hilfe..Version". Das Kompilationsdatum nicht vergessen !
  • Den Typ des verwendeten CAN-Interfaces
  • Das Kompilationsdatum der Gerätefirmware. Diese wird beim Aufruf des Systemmenüs im Display angezeigt (z.B. beim gleichzeitigen Drücken von F2 und F3, bis zum Loslassen dieser beiden Funktionstasten am MKT-View).
  • Das verwendete Betriebssystem des PCs (speziell bei Problemen mit dem Programmiertool)

Hinweis: Bei Problemen mit der Installation der Treibersoftware für das CAN-Interface eines Drittanbieters können wir Ihnen leider nicht weiterhelfen. Wenden Sie sich in solchen Fällen bitte an den Hersteller des CAN-Interfaces (Peak, ESD, Kvaser, Vector, ..) .



Versionshistorie der UPT-Familie

Nur in englischer Sprache verfügbar !

Die im Originaldokument vorhandene Liste kann beim Aufspüren von Kompatibilitätsproblemen helfen. Falls Ihre Applikation auch auf "alten" UPT's (mit alter Firmware) laufen muß, verwenden Sie die neueren Funktionen nicht ! Alle programmierbaren Terminals zeigen das Kompilationsdatum der Firmware beim Einschalten kurz auf dem LCD an, oder während des Aufrufs des Systemmenüs.

 

Siehe auch: Troubleshooting and FAQs, Inhalt .