CAN-Tester für Windows



Inhalt
  1. Zweck des Programms
  2. Einschränkungen
  3. Installation
  4. Konfiguration : CAN / CAN FD Anzeige Optionen SDO Verzeichnisse
  5. Komponenten des Hauptfensters
    1. Das Hauptmenü
    2. Statuszeilen, Zähler fuer empfangene + gesendete Telegramme
    3. Empfangsfenster (blau)
    4. Sendefenster (grün)
    5. Anzeigeformat für CAN und CAN FD
    6. Kommandofenster (schwarz)
    7. Meldungsfenster (gelblich)
    8. Das Hilfesystem
  6. Das Watch/Plot/FFT-Fenster
    1. Die Watch-Liste
    2. Numerische Ausdrücke für Watch-Liste / Plot-Fenster
    3. Spektrumanalysator (im "Watch-Fenster")
  7. Fehlermeldungen
  8. Das Text-Terminal-Fenster
  9. CANopen-Funktionalität
    1. CANopen OD-Browser und OD-Scanner
    2. EDS (Electronic Data Sheet) und DCF (Device Configuration File)
      1. Auslesen der EDS-Datei per 'Domain Transfer' aus Objekt 0x1021
      2. PDO-Mapping basierend auf den Informationen aus dem EDS-File ?
    3. CANopen LSS (Layer Setting Services)
      1. CANopen-LSS-Master im CAN-Tester
    4. Interpreterfunktionen zum Zugriff auf Objekte im CANopen-OD per SDO
    5. CANopen - Datentypen
    6. SDO-Fehlercodes
  10. Kommando-Interpreter (für Test-Scripte)
    1. Das Kommandoprogramm
    2. Numerische Ausdrücke (im Interpreter)
    3. Senden von CAN-Telegrammen aus dem Kommandoprogramm
    4. Befehlsübersicht
    5. Funktionen für die CAN-Bus-Fehlerstatistik
    6. CANopen-spezifische Kommandos
    7. Symbole für CANopen-Datentypen
  11. Utility für Firmware-Update per CAN-Bus
  12. Links
  13. Nutzungsbedingungen, Haftungsausschluß
  14. Letzte Änderungen


Zweck des Programms

Der CAN-Tester ist als Testprogramm auf niedriger CAN-Bus-Telegramm-Ebene konzipiert, mit einigen Erweiterungen die für "hausinterne Tests" bei Firma MKT verwendet werden. Möglich sind:

Zurück zum Seitenbeginn


Einschränkungen

Dieses Programm wird vom Entwickler (MKT Systemtechnik) kostenlos bereitgestellt, ohne Anspruch auf Vollständigkeit, Fehlerfreiheit, und Funktionstüchtigkeit für einen bestimmten Zweck. Sowohl die Software als auch die Dokumentation kann fehlerhaft oder unvollständig sein.
Wir (MKT Sytemtechnik) sind nicht in der Lage, die Funktion dieser Software in allen Kombinationen aus CAN-Interface, Treiber-Version, Betriebssystem, u.v.A. zu testen. Für die Installation und Betrieb eines CAN-Bus-Interfaces gelten die Nutzungsbedingungen, der Haftungsausschluss, das Lizensierungsmodell, marken-, gebrauchsmuster- oder patentrechtlicher Schutz, des entsprechenden Herstellers. In dieser Beschreibung werden eventuell vorhandene Schutzrechte nicht besonders gekennzeichnet.

ACHTUNG: MKT ÜBERNIMMT KEINE HAFTUNG FUER SCHÄDEN, DIE DURCH DEN GEBRAUCH DIESER SOFTWARE ENTSTEHEN; WEDER AN SOFT- NOCH HARDWARE !

Diese Software ist in der Lage, ein CAN-Netzwerk störend zu beeinflussen. Der Einsatz dieser Software ist daher naturgemäß mit Risiken verbunden. Das Risiko liegt komplett bei Ihnen. Sie übernehmen die volle Verantwortung. Unabhängig davon ist der Einsatz für 'High-Risk'-Aktivitäten, in denen Fehlfunktionen oder Bedienfehler zu Personen-, Materialschäden, oder zu Verdienstausfall / Maschinenstillstand führen könnten, ausdrücklich untersagt.

Die Modifikation oder Weitergabe dieser Software an Dritte ist ausdrücklich untersagt.
Durch die Verwendung dieser Software stimmen Sie den Nutzungsbedingungen und dem Haftungsausschluss zu.

Zurück zum Seitenbeginn

Installation

Installieren Sie zunächst ein CAN-Interface auf Ihrem PC. Dazu können Sie verschiedene Interfaces verschiedener Hersteller verwenden. Eine übersicht finden Sie in den

Hinweisen zur Installation eines CAN-Interfaces unter Windows.

Beachten Sie: Die CAN-Interfaces und die dazugehörigen Softwaretreiber sind keine Produkte der Firma MKT; sie müssen ggf. extra vom jeweiligen Hersteller bezogen werden !

Hinweise und Tips zur Installation einiger CAN-Interfaces und der dazugehoerigen Softwaretreiber (VxD, SYS, DLL) finden Sie in der Datei can_inst.doc (Word 97-Format).

Um Ärger mit nicht schreibbaren Verzeichnissen zu vermeiden, empfehlen wir die Installation des CAN-Testers außerhalb des Windows-"Programm"-Verzeichnisses.
Statt der Installation unter
  "C:\Programme\MKT\CAN_Tester_for_Windows"
  (bzw. C:\Program Files, C:\Program Files (x86), C:\Archivos de programa,
    C:\Programmes, C:\Programmi, C:\Arquivos de Programas,
    C:\Program, C:\Programmer, C:\Programfiler, etc, etc, etc),
installieren Sie die den CAN-Tester z.B. unter
  "C:\MKT\CAN_Tester_for_Windows"
(oder wo-auch-immer Sie als Anwender Schreibrechte haben).
Nur so wird sichergestellt, dass die im Verzeichnis des CAN-Testers enthaltenen Applikationen (CAN-Tester-Scripte mit der Erweiterung *.cts) nicht nur gelesen, sondern nach eventuellen Modifikationen auch ohne Administratorprivilegien wieder abgespeichert werden können.
Entsprechendes gilt auch für die Konfiguration des CAN-Bus-Testers, die nicht mehr unter 'Windows\MKT_CanTester.ini', sondern im o.g. Installationsverzeichnis (zusammen mit der ausführbaren Datei WinCan1.exe) abgelegt wird.
Durch den konsequenten Verzicht auf Einträge in der Windows-Registry und durch die Ablage der Konfiguration im Verzeichnis der Anwendung wird diese 'portabel', d.h. Sie können den CAN-Tester auf einer beliebigen Partition der Festplatte, aber auch auf einem Wechseldatenträger (z.B. USB Memory Stick) installieren, und durch einfaches Umkopieren des Ordners inklusive aller Unterverzeichnis eine Installation auf einen anderen PC 'übernehmen' (portieren), inklusive aller von Ihnen entwickelten Applikationen.

Zurück zum Seitenbeginn

Konfiguration

Beim ersten Programmstart muss noch das geeignete CAN-Interface ausgewählt werden. Die Konfiguration (CAN-I/O-Adresse, IRQ, Baudrate etc) erfolgt im Menue Settings...CAN Interface Setup. Im daraufhin erscheinenden Dialogfenster können Sie "Ihr" CAN-Interface anwählen und ggf erforderliche Parameter, z.B. I/O-Adressen, Netzwerknamen etc eingeben. Bei Verwendung des PCCAN-Interfaces der Firma ESD muss vorher der NTCAN-Treiber installiert werden.

Erst danach können die Parameter für den CAN-Bus eingestellt werden (Baudrate, etc). Dies erfolgt im Hauptmenü des CAN-Testers unter Settings...CAN settings for user (d.h. CAN-Einstellungen für den Anwender).

Die Konfigurationsdaten des CAN-Testers werden seit Dezember 2019 nur noch im Verzeichnis des CAN-Testers, d.h. in dem Verzeichnis, in dem auch die Datei WinCan1.exe steht, abgelegt. Das Programm bzw. dessen Anwender muss die Berechtigung für Schreib- und Lesezugriffe (bzw. 'Vollzugriff') für das Verzeichnis des CAN-Testers haben, andernfalls können Änderungen an der Konfiguration nicht dauerhaft gespeichert werden. Aus dem Grund empfiehlt es sich, wie im Kapitel Installation beschrieben, das Programm nicht unter C:\Programme (o.Ä.) zu installieren.

Registerkarten im Dialogfenster "CAN-Tester-Einstellungen"

CAN

Wählen Sie hier die Datenrate (für "Classical CAN", bzw. die Arbitrierungsphase bei CAN FD), und (für CAN-FD) ggf. auch die 'schnelle' Datenrate.
CAN FD (Flexible Datarate) kann per Option abgeschaltet werden, selbst wenn das verwendete CAN-Interface prinzipiell auch für 'FD' geeignet ist.
Wurde als CAN-Interface ein mehrkanaliges Gerät ausgewählt, dann kann der zweite Kanal unter "CAN2" konfiguriert werden. Abhängig von der verwendeten Hardware werden in der Gruppe "CAN1" bzw. "CAN2" auch die entsprechenden Kanalnamen des CAN-Treibers angezeigt, z.B. "Kvaser Hybrid 2xCAN/LIN #0 (Channel 0)".

Ferner können auf dem Register "CAN" symbolische Namen für bestimmte CAN-Message-Identifier eingestellt werden (dies war nötig, um bestimmte Logfiles im Vektor-ASCII-Format abzuspielen, in denen statt numerischer CAN-IDs nur symbolische Namen standen).
Bei geeigneter CAN-Hardware kann hier auch das Senden und Empfangen von CAN FD konfiguiert werden. Dazu muss die CAN-Bitrate für die "data phase" für alle Knoten im CAN / CAN FD - Netzwerk identisch sein. Üblich sind (für die "FD"-Bitrate) 1000, 2000, oder 4000 kBit/Sekunde. Ein bei 8 MBit/Sekunde noch zuverlässig (ohne Error Frames) funktionierendes Interface tauchte bislang nicht beim SW-Entwickler auf.
Der Abtastpunkt (sample point) liegt bei den meisten Treibern per Default bei 80 Prozent für CAN FD, und entspricht damit den Empfehlungen von CiA. MKT's CAN-Bus-Tester bietet bislang keine Möglichkeit, die Bit-Timing-Register des Controllers 'direkt' einzustellen. Verwenden Sie dazu ggf. das herstellerspezifische Konfigurationstool. Immerhin kann bei Verwendung bestimmter CAN-Treiber (z.B. Kvaser) das vom Treiber verwendete Bit-Timing ausgelesen werden. Es wird dann wie im obigen Screenshot unter 'CAN Test Settings' angezeigt. Beispiel (mit "Kvaser Hybrid 2*CAN/LIN"):
Read from driver: 500 kbit/sec, FD: 2000 kbit/sec
Timing info: ts1=63, ts2=16, sjw=16, nSamp=3; FD:ts1=15, ts2=4, sjw=4
Um aus den oben gezeigten, per CAN-Treiber ausgelesenen Parametern
    'ts1' (time segment 1, innerhalb eines Bits, vor dem Abtastpunkt) und
    'ts2' (time segment 2, innerhalb eines Bits, nach dem Abtastpunkt)
die Dauer eines Abtastintervalls 'tq' ("time quantum") zu berechnen, kann sowohl für CAN als auch für CAN FD der folgende Zusammenhang verwendet werden:
    t_bit = ( 1 [SyncSeg] + ts1 + ts2 ) * tq = 1 / bitrate
    ⇒ tq = 1 / ( bitrate * (1+ts1+ts2) )
Berechnung für das o.g. Beispiel (Kvaser Hybrid):
     Arbitrierung mit  500 kbit/sec : tq = 1/(500kHz * (1+63+16)) =  25 ns
     "Fast Data" mit  2000 kbit/sec : tq_FD = 1/(2MHz * (1+15+4)) =  25 ns
Das 'time quantum' sollte laut CiA-Empfehlung für CAN FD den gleichen Wert für die Arbitrierungs- und Datenphase haben (hier: tq = tq_FD = 25 ns). Zitat:
The bit timing shall be derived from a CAN clock running at 80 MHz and shall meet the requirements defined in /ISO11898-1/.
In case of CAN FD with bit rate switching the bit timing configuration shall fulfill the following requirements. Any violation of these requirements may dramatically reduce the robustness of the communication, or even prohibit communication at all.
  • In all CANopen devices the sample point for the nominal bit rate shall be placed at 80% of the nominal bit time.
  • In all CANopen devices the sample point for the data bit rate shall be placed to the same position of the data bit time. The required sample point position depends on many parameters. (...)
  • In all CANopen devices the time quantum length in the arbitration phase (nominal bit timing) and in the data phase (data bit timing) shall be equal.
    This is achived by using the same bit rate prescaler (BRP) in both bit timing configurations.

Anzeige (Frame Display)

Hier steht alles, was -direkt oder indirekt- mit der Anzeige von CAN-Telegrammen ("frames") in den beiden Anzeigefenstern des CAN-Testers zu tun hat:

Logging

Im CAN-Tester ist ein *simpler* CAN-Logger eingebaut, mit dem man Telegramme (u.A. im Vector-ASCII-Format) abspeichern kann. Hat nichts mit MKT's CAN-Logger zu tun ! Log-Dateien im Vektor-ASCII-Format, und im PCAN-Explorer-Format ("Hex Format Files", *.log) können mit dem CAN-Tester auch abgespielt werden (im Menü "Datei").

Optionen

Hier wird "Verschiedenes" eingestellt, wofür auf den anderen Tabs kein Platz mehr war:

SDO

Nur für CANopen ! Auf dieser Registerkarte werden Knotennummern und Timeout-Zeiten für den im CAN-Tester integrierten CANopen-SDO-Client und -Server eingestellt, und -wenn nötig- Client bzw Server ein- und ausgeschaltet (d.h. aktiv/passiv gemacht). Mit den Buttons "Externes OD zeigen" / "Lokales OD zeigen" können die CANopen-Objekt-Verzeichnisse angezeigt bzw (beim "Lokalen OD") sogar editiert werden. Damit kann z.B. ein kompletter CANopen-Knoten simuliert werden.

Verzeichnisse

Hier werden verschiedene Unterverzeichnisse definiert, auf die der CAN-Tester zugreifen kann:

Signale

Damit sind AKUSTISCHE Signale gemeint, keine CAN-Signale. Mit den Optionen auf dieser Registerkarte können alle aktustischen Signale (die meistens vom Kommandoprogramm erzeugt werden) auf einen Schlag ausgeschaltet werden, damit schlagartig "Ruhe im Schiff" herrscht.

Beim CAN-Tester für Windows können aktustische Signale entweder mit dem PC-Speaker oder mit dem MIDI-Synthesizer(*) erzeugt werden.
Zur Erzeugung von Tönen mit dem internen PC-Lautsprecher (ohne die Soundkarte) muss das Programm leider direkt auf die I/O-Ports im PC zugreifen, was -speziell unter Windows XP und Vista- Probleme bereiten kann. Aus dem Grund ist under Windows XP (etc) davon abzuraten, die Option "internal PC-Speaker" zu verwenden. Verwenden Sie stattdessem lieber die Soundkarte (mit integriertem, per MIDI steuerbaren Synthesizer). Damit Sie die Töne vom Synthesizer hören können, benötigen Sie natürlich einen externen Lautsprecher. Ferner muss in der Lautstärke-Einstellung (in der Windows-Taskleiste) der Regler für den "SW-Synthesizer" (o.ä.) aufgedreht sein, und die Option "Ton AUS" (die bei den meisten Soundkarten existiert) darf für den Synthesizer *nicht* gesetzt sein.

(*) Dieser per MIDI-Schnittstelle steuerbare Synthesizer ist in den gängigen Soundkarten eingebaut.

Akustische Signale eignen sich gut zum schnellen Testen von CAN-E/A-Modulen. Z.B. könnte das Test-Script jedesmal einen Ton mit einer bestimmten Frequenz ausgeben, wenn sich der Zustand der digitalen Eingänge des Moduls ändert. Verwenden Sie dazu das Interpreterkommando "sound".

Zurück zum Seitenbeginn


Komponenten des Hauptfensters

Hauptmenü


Statuszeilen

In der Kopfzeilen von Sende- und Empfangsfenster werden Zähler für empfangene und gesendete Telegramme angezeigt, ferner diverse Statusinformationen (u.A. ob die Anzeigen aktiv sind, ob die Listen "historisch" oder "sortiert nach CAN-Identifier" arbeiten, etc).

Empfangsfenster

Im Empfangsfenster werden normalerweise alle empfangenen CAN-Telegramme aufgelistet. Dabei sind verschiedene Anzeigeoptionen möglich, die im Menü "Settings" eingestellt werden können:


Siehe auch: Anzeige des Frame-Typs als Suffix nach dem Message-ID.

Sendefenster

Im Sendefenster werden normalerweise alle vom Programm gesendeten CAN-Telegramme angezeigt. Dazu gehören auch die vom eingebauten SDO-Server und -Client gesendeten Telegramme !

Zum Senden "eigener" Telegramme durch den User dient das Kommandofenster, in dem CAN-Telegramme als Textzeilen eingegeben werden können.

Anzeigeformat für CAN und CAN FD (für Sende- und Empfangsfenster)

Im einfachsten Fall (ohne Zeitmarken) wird ein CAN-Telegramm folgendermaßen notiert:

<Identifier> <Byte0> <Byte1> .. <Byte7> (für "Classical" CAN)
<Identifier> <Byte0> <Byte1> .. <Byte63> (für CAN FD)

Direkt nach dem Identifier kann ein spezieller ID-Suffix angegeben werden, um z.B. auch bei einem Identifier <= 0x3FF diesen mit 29 Bit ("extended" frame) zu codieren, oder um auch 'kurze' Frames (mit bis zu 8 Datenbytes) als "FD Base Frame" oder "FD Extended Frame" zu senden.
Messages mit Identifier-Wert >= 0x400 werden automatisch als "extended frame" verschickt.
Ein Längencode (DLC) wird beim Senden (wie auch beim Empfang) normalerweise nicht angegeben (die Anzahl zu sendender Datenbytes ergibt sich aus deren Zählung). Bei CAN FD wird bis zur nächsten 'gültigen' DLC aufgerundet, und die überzähligen Bytes mit Nullen angefüllt:

Ergibt sich bei der Zählung der Datenbytes ein DLC (Data Length Code) größer 8, wird das Telegramm automatisch als "FD Base Frame" oder "FD Extended Frame" gesendet.
Der Parser für zu sendende Telegramme erkennt auch die seit August 2019 für CAN FD im Empfangsfenster angezeigten, optionalen 'Flags' wie z.B. FDF (FD Format) und BRS (BitRate Switch). Der CAN-Tester verwendet bei der Anzeige die (leider nicht sehr intuitiven) Abkürzungen aus der CAN FD Spezifikation:
Die Anzeige der oben genannten CAN-FD-Flags kann im Setup unter 'Frame Display' aktiviert werden ("zeige FDF, BRS, ESI").

Die Zeitmarke (timestamp) erfolgt optional in Millisekunden (absolut oder relativ zur vorhergehenden Anzeigezeile), oder als 'Uhrzeit' im Format HH:MM:SS.ss (.ss sind die zwei Nachkommaziffern für die Sekunden). Die Anzeige von Zeitmarken kann unter Settings..Display Settings..Time Stamps konfiguriert werden.

Weitere mögliche Notationen für CAN-Telegramme finden Sie in der Beschreibung des im CAN-Tester eingebauten Kommando-Interpreters.

Kommandofenster

Das Kommandofenster dient zur Eingabe von Befehlen an den CAN-Tester, die von einem speziellen Interpreter abgearbeitet werden können. Dazu gehören unter anderem:

Um ein einzelnes Kommando aufzuführen (z.B. CAN-Telegramm senden), drücken Sie F2 während der blinkende Cursor in der Zeile des auszuführenden Kommandos steht.
Weitere Shortcuts (Tastaturkürzel) zum Starten, Stoppen, und Debuggen des Scripts (im Kommandofenster des CAN-Testers) finden Sie im Hauptmenü unter 'Run'.
Am linken Rand des Editorfensters (in der 'Sidebar') werden Zeilennummern und spezielle Symbole für die Programmentwicklung und Fehlersuche angezeigt. Hier einige der in der Sidebar verwendeten Symbole:


Beim Bewegen des Mauspfeils über den Text im Kommandofenster (das 'Test-Script') wird abhängig davon folgendes angezeigt:

Meldungsfenster

Im Meldungsfenster werden u.A. Fehler wie "CAN-Bus-Off" angezeigt, aber auch Meldungen aus dem interpretiertem Kommandoprogramm (siehe print).

Werden (mit einem geeigneten CAN-Interface) Error-Frames detektiert, dann werden diese vom CAN-Tester gezählt und optional im Meldungsfenster angezeigt. Um das Überfluten des Meldungsfensters bei massivem Auftreten von Error-Frames zu vermeiden, wird eine neue Meldung (mit dem "Zählerstand") unterdrückt, wenn die vorhergehende Error-Frame-Meldung vor weniger als einer Sekunde erfolgte.
Fehler- und CAN-Telegramm-Zähler können im Hauptmenü unter
  "Meldungen" / "Rücksetzen der Message-Zähler", bzw "Messages" / "Clear Message Counters" zurückgesetzt werden. Dadurch wird auch für die 'Statistik' eine neue Messung begonnen.

Auch ohne spezielles Test-Script im Kommandofenster kann eine einfache CAN-Statistik als 'Bericht' im Meldungsfenster angezeigt werden. Wählen Sie dazu im Hauptmenü unter Meldungen die Funktion Bericht 'CAN-Statistik' erzeugen. Abhängig vom verwendeten CAN-Interface (und der Anzahl geöffneter CAN-Kanäle) kann dieser 'Bericht' unterschiedlich ausführlich ausfallen. Hier ein Beispiel, in dem der Bericht nach etwa 20 Sekunden Laufzeit angefordert wurde:

Loaded CAN test command file from "C:\cbproj\CanTest\programs\MktStandardSignals1.cts" .
Loaded CANopen OD for SDO server from "C:\cbproj\CanTest\Objects\lenze_tha100_hbg22_sim.dic" .
CAN: UCAN_Init: Loaded Kvaser CANLIB32 V5.27 .
CAN: t=8938: ERROR FRAME RECEIVED (#7) on CAN1 !
CAN: t=17069: ERROR FRAME RECEIVED (#419) on CAN1 !
<- automatisch angezeigte Fehlermeldungen

(an dieser Stelle wurde der Bericht 'CAN-Statistik' angefordert)

CAN bus statistics after 20.0 seconds test duration:
CAN1 Status : no status flags, 4491 frames received, 0 sent, 746 error frames.
CAN2 Status : no status flags, 0 frames received, 0 sent, 0 error frames.

Siehe auch: Interpreterfunktionen für die CAN-Bus-Fehlerstatistik.

Zurück zum Seitenbeginn

Die Verwendung des Hilfesystems (im Hauptfenster)

Um das Hilfesystem aus dem Hauptfenster des Programm zu öffnen, gibt es folgende Möglichkeiten: Sollte sich aus irgendwelchen Gründen (Windows 10?) der HTML-Browser nicht wie oben beschrieben aus dem Hauptfenster starten lassen, kann das Hilfesystem notfalls manuell per 'Datei-Explorer' o.Ä. geöffnet werden. Nach der Installation des CAN-Testers finden Sie das Hilfesystem im Unterverzeichnis 'Help'.


Das Plot-Fenster

dient zur Darstellung des zeitlichen Verlaufs einzelner Signale oder Variablen. Zum Öffnen dieses Fensters dient die Funktion "View ... Plot Window" im Hauptmenü des CAN-Testers.

screenshot plot-window with some graphs

Die vertikalen Striche sind Zeitmarken, die i.A. den Beginn einer Sekunde markieren, bei langsamen Abtastintervallen alle 15 oder 60 Sekunden. Eine Beschriftung ist (noch) nicht vorgesehen.

Die Watch-Liste

Zur Definition, was im Plot-Fenster dargestellt wird, dient die Registerkarte mit dem Titel "Watch Expressions" / "Watch-Ausdrücke" im gleichen Fenster:

screenshot watch window with some examples

In dieser Tabelle wird neben der Definition des darzustellenden Wertes (als Interpreter-Ausdruck, engl. expression) auch der Skalenbereich für das Plot-Fenster sowie der aktuelle Wert in numerischer Form (current value) dargestellt. Zu den Spalten in der Definitionstabelle zählen:

Der Kanalname wird eventuell in einer zukünftigen Version eine größere Rolle spielen, wenn das Plotfenster durch eine Legende ergänzt wird (in der dann der Kanalname in der Farbe des dazugehörigen Graphen angezeigt wird).

Numerische Ausdrücke für Watch-Liste / Plot-Fenster

Mit Hilfe des im CAN-Tester integrierten Interpreters können nahezu beliebige numerische Ausdrücke zum Berechnen der anzuzeigenden Werte definiert werden. Die folgende Liste enthält einige übliche Beispiele, mit Links zu den entsprechenden Kapiteln in der Beschreibung der Interpreter-Sprache.
canrx(<Identifier>, <erstes Bit>, <Datentyp>)
Isoliert ein Signal aus dem zuletzt empfangenen CAN-Telegramm mit dem entsprechenden Message-Identifier.
Durch Multipikation mit einem geeigneten Faktor, und Addition eines geeigneten Offsets kann das Ergebnis ("Rohwert") ggf. noch in einen anwenderfreundlicheren 'physikalischen' Wert konvertiert werden.
can[index].nErrorFrames
Liefert die Anzahl der seit dem letzten "Counter-Reset" empfangenen Error Frames auf dem angegebenen CAN-Kanal (mit Null-basiertem Index). Diese Funktion steht nur bei geeigneten CAN-Interfaces (z.B. Kvaser) zur Verfügung. Fehlt die Angabe von [index], wird der erste aktive CAN-Kanal verwendet.

Unterhalb der Definitionstabelle können die wichtigsten Anzeigeparameter eingestellt werden:

Hinweis: Nach der Eingabe neuer Definitionen in der Tabelle "Watch Expressions" muss der Button "Apply" (="übernehmen") angeklickt werden. Sobald in der Tabelle editiert wird, stoppt die periodische Aktualisierung der numerischen Anzeige (current values).

Spektrumanalysator (im "Watch-Fenster")

Seit 2006 kann auf der Registerkarte "Spectrum Analyzer" das Spektrum eines der 15 Eingangskanäle des Watch-Fensters dargestellt werden. Diese Funktion eignet sich z.B. zur Analyse von Störungen von analogen Eingangsmodulen (z.B "E/A-Modul mit DMS-Eingang"). Die maximal darstellbare Frequenz ist (frei nach Shannon) die halbe Abtastrate. Bei einem "Update Interval" (s.O.) von 10 Millisekunden sind dies z.B. 0.5 / 10ms = 50 Hz .

Die Amplituden werden auf einer logarithmischen Skala angezeigt, wobei "0 dB" dem Maximum des aktiven Kanals entspricht, welches auf der Registerkarte "Watch Expressions" in der Spalte "Scale Max" definiert wurde. Die im Spektrumanalysator dargestellten Dezibel-Werte sind daher normalerweise negativ, solange das Signal unterhalb des Skalenendbereiches bleibt. Für Signale, die von einem 16-Bit A/D-Wandler stammen, reicht ein Amplitudenbereich von -100 bis 0 dB .

Hinweis: Der Spektrumanalysator basiert auf einer privaten Entwicklung von W.B., sie darf von MKT bis auf Widerruf nur für nicht-kommerziellen Einsatz verwendet werden. In zukünftigen Versionen des CAN-Testers könnte dieser Analysator demnach wieder "verschwunden" sein !

Siehe auch:




Fehler- und Statusmeldungen

Die Statusflags des CAN-Treibers werden intern als 16-Bit-Parameter verwaltet.

Wenn sich der Zustand dieses Parameters aendert, wird dies automatisch im Meldungsfenster als Hex-Zahl angezeigt. Diese Hex-Zahl kann eine Kombination der folgenden Bitmasken sein:

0x0001 : CAN-Hardware-Fehler oder "anderer Fehler"
0x0002 : Ueberlauf des CAN-Empfangspuffers
0x0004 : Ueberlauf des CAN-Sendepuffers
0x0008 : Problem mit dem CAN-Interrupt (IRQ-Nummer falsch ?)
0x0040 : CAN-Bus-Warnung, mindestens ein Fehlerzaehler zu hoch
0x0080 : CAN-Bus-OFF, Grund z.B. falsche Baudrate

Siehe auch:  CANopen-SDO-Fehlercodes

Zurück zum Seitenanfang

Das Text-Terminal-Fenster

Dieses Kapitel wurde in ein separates Dokument ausgelagert.

CANopen-Funktionalität

Der CAN-Tester ist als Testprogramm auf niedriger CAN-Bus-Telegramm-Ebene konzipiert, mit einigen CANopen-Erweiterungen die für "hausinterne Tests" bei Firma MKT verwendet werden. Möglich sind:

Der CAN-Tester kann dabei sowohl als Client oder Server arbeiten. Um eine sinnvolle SDO-Server-Funktionalität zu ermöglichen, verfügt der CAN-Tester über ein eigenes CANopen-Object-Dictionary, dessen Einträge editiert werden können. Die Beschreibung eines CANopen-ODs kann aus EDS-Dateien importiert werden; danach können auch "Werte" per SDO aus einem CANopen-Device gelesen und in Form einer DCF-Datei (Device Configuration File) exportiert werden. Diese Funktion ist zum Testen komplexerer CANopen-Geräte extrem hilfreich;  auch im Zusammenhang mit professionellen CANopen-Konfigurationstools (wie z.B. den CANopen Configuration Manager).

Zum Nutzen der SDO-Client-Funktionalität (d.h. zum "Anstossen" von Schreib- und Lesezugriffen) dienen spezielle Befehle des Kommandointerpreters (sdo.read und sdo.write).

CANopen OD Browser / Scanner

Mit dem CANopen-OD-Browser kann das eigene oder ein 'fremdes' CANopen-Object-Dictionary ("OD") untersucht werden.

Darüberhinaus bietet der CAN-Tester die Möglichkeit, auch ohne EDS-Datei 'alle' Objekte in einem unbekannten CANopen-Slave zu finden. Dazu im Hauptmenü des CAN-Testers die Funktion Tools ... Scan remote OD into the  browser aufrufen. Dabei werden der Reihe nach alle möglichen Objekt-Indizes (0x0000...0xFFFF) 'ausprobiert', was sehr lange dauern kann. Um das Einscannen zu beschleunigen, kann der gescannte Index-Bereich daher vor dem Start eingegrenzt werden. Details zum OD-Scanner finden Sie in einer gesonderten Datei.

Screenshot CANopen OD Browser

Öffnen des OD-Browsers für ein externes OD (per SDO) : Im Hauptmenü des CAN-Testers per Tools...Open Remote CANopen OD Browser .

Öffnen des OD-Browsers für das eigene OD (des CANopen-Testers) : Im Hauptmenü des CAN-Testers per Tools...  Local CANopen OD Browser .

Die Spalten in der Tabelle haben folgende Bedeutung:

Object

Hier stehen Objekt-Index und -Subindex in hexadezimaler Form.

Name

Der Name des Objektes; stammt i.A. aus dem EDS-File. Bei aus einem 'unbekannten' CANopen-Slave eingelesenen ODs versucht der CAN-Tester, den Namen der wichtigsten Objekte zu 'erraten' (was im Falle der Objekte im Kommunikationsprofil meistens auch passt).

Data Type

Datentyp nach CANopen, allerdings nicht als numerischer Code, sondern als Klartext.

Access

Zugriffsrechte aus dem EDS-File (wenn vorhanden bzw geladen).

Display

Definiert, wie der CAN-Tester die Daten anzeigen soll: hex = Hexadezimal, dec = Dezimal, asc = ASCII (Text) .

Value

Aktueller Wert.
Ähnlich wie beim Befehl sdo.r (Lesezugriff per SDO auf ein bestimmtes Objekt) wird auch hier bei 'sehr großen Objekten' (Fachchinesch : 'DOMAIN') nicht der Inhalt, sondern der Name einer Datei angezeigt, in der der CAN-Bus-Tester den Inhalt abgespeichert hat. Sehr praktisch beispielsweise beim Auslesen einer "EDS-Datei" aus dem Gerät selbst (Objekt 0x1021, z.B. bei MKT's CANopen-Buskoppler).

Size

Größe der Objektdaten, gemessen in BYTES. Beim Datentyp "Visible String" ist dies nicht die maximale Stringlänge, sondern die aktuelle. Leider gibt es keine Möglichkeit, die maximale Länge eines Objektes per SDO-Lesezugriff zu ermitteln !

Counters

Zählerstand für Lesezugriffe (links) und Schreibzugriffe (rechts). Traten beim Zugriff per SDO Fehler auf, werden auch diese gezählt; in der Spalte "Counters" steht dann z.B. ERR=3 (d.h. beim Schreib- oder Lesezugriff sind drei Fehler aufgetreten). Ursache ist oftmals ein Schreibzugriff, den der Prüfling aus irgendwelchen Gründen abgewiesen hat (z.B. Versuch den Inhalt eines "Read Only"-Objektes zu überschreiben.

Mit dem Funktionen 'Load' bzw 'Save' kann eine elektronische Beschreibung des ODs aus einer Datei importiert oder in einer Datei gespeichert werden. Zu den unterstützten Dateiformaten zählt auch das für CANopen übliche EDS-Format (electronic datasheet, oder auch electronic device specification).

Mit der Funktion 'Read' werden alle Werte neu per SDO eingelesen, und sofort in der Tabelle angezeigt. Dieser Vorgang kann, je nach Umfang des ODs, einige Sekunden dauern.

Werte (in der Tabellenspalte 'Value') können auch editiert werden. Beim Abschluss der Eingabe mit der ENTER-Taste kann der Wert dann per SDO in das abgesetzte CANopen-Gerät geschrieben werden. In vielen Fällen ist es aber einfacher, dies mit den im folgenden Kapitel beschriebenen Interpreter-Kommandos zu erledigen.


CANopen-EDS und DCF

Nach dem Auslesen eines OD's per SDO kann die so gewonnene "CANopen-Konfiguration" (d.h. die Summe aller im CANopen-OD eines Gerätes verfügbaren "Werte") in einer CANopen-konformen DCF-Datei (device configuration file) abgelegt werden. Wählen Sie dazu im Fenster des "Remote CANopen OD Browsers" die Funktion

    Save , wählen als Dateityp "Device Configuration File (*.dcf)", und dann den Namen der Zieldatei (und ggf. das Ziel-Verzeichnis). Anschließend kann die so erzeugte Datei z.B. mit einer anderen Konfiguration (d.h. einem anderen DCF) verglichen werden. Dazu eignen sich Datei-Vergleichs-Utilities wie die im glorreichen(!) Total Commander integrierte Funktion Files ... Compare by Content . Voneinander abweichende Werte (und Parameter) werden beim Total Commander in der Vergleichsliste rot markiert; mit den Buttons "Previous Difference" und "Next Difference" kann man sehr schnell alle Unterschiede in den beiden miteinander verglichenen (Text-)Dateien finden.

Die Spezifikation von EDS und DCF finden Sie übrigends in CiA (CAN in Automation) DS 306. Bei der Erstellung des CAN-Testers diente Draft Standard 306 V1.3 (vom 1. Januar 2005) als Grundlage für das Format der importierten und exportierten EDS- und DCF-Dateien. Das für unsere Zwecke unnötig komplexe,  auf XML basierende "XDD"-Format wird nicht unterstützt.

Die Strukturen von EDS und DCF sind nahezu identisch; der Unterschied ist lediglich das Vorhandensein der Einträge mit dem Schlüssel "ParameterValue" . Einige Beispieldateien (EDS und DCF) finden Sie im Unterverzeichnis "Objects" .  Die Datei MKTview2_DCF_Import_Test.dcf kann z.B. zu Testzwecken in MKT's "MKT-View II / CANopen" geladen und wieder ausgelesen werden.


Auslesen der EDS-Datei per 'Domain Transfer' aus Objekt 0x1021

Bei neueren CANopen-Geräten von MKT Systemtechnik (z.B. der 'EA550'-Familie) kann die komplette EDS-Datei (oder sogar eine DCF-Datei mit den 'aktuellen Werten') aus dem Gerät selbst ausgelesen werden. Strenggenommen ist die EDS-Datei nicht, wie der Name des Objektes "Stored EDS" vermuten lässt, im Gerät als Datei abgelegt, sondern wird beim Auslesen durch die Firmware erst in einem 'CANopen-EDS-konformen' Format erzeugt.
Der CAN-Tester unterstützt das Auslesen beliebiger Objekte (mit Datentyp 'domain', was im CANopen-Fachjargon wohl 'eine große Datenmenge' bedeuten soll) wie folgt:
Wird beim Aufruf der Funktion sdo.r( <ObjektIndex.Subindex> ) ein besonderes Objekt erkannt, welches beim Versuch des Auslesens mit einer "großen Datenmenge" antwortet ("domain transfer" mit entsprechender Größe), dann wird der komplette ausgelesene Inhalt nicht als Zeichenkette an eine Interpreter-Variable zugewiesen (oder per "print" ausgegeben), sondern als Datei gespeichert. Als 'Rückgabewert' liefert sdo.r dann nicht die aus dem Objekt gelesene Zeichenkette, sondern den Namen der Datei, in der der Objekt-Inhalt (bei Objekt 0x1021 die EDS-Datei) gespeichert wurde. Details dazu folgen im Kapitel Interpreterfunktionen für den Zugriff auf das CANopen-OD per SDO


PDO-Mapping basierend auf den Informationen aus dem EDS-File ?

Hinweis:
Das grauenhaft komplizierte PDO-Mapping wird z.Z. vom CAN-Tester nicht unterstützt. Der Grund liegt darin, dass für den (CANopen-konformen) Schreibzugriff auf die PDO Mapping Parameter nicht einfach der Reihe nach alle Subindizes beschrieben werden dürfen, sondern zunächst der PDO "ungültig" gemacht werden muss, dann die Anzahl gemappter Objekte auf Null gesetzt, anschließend die gemappten Objekte in die passenden Subindizes geschrieben, danach die Anzahl gemappter Objekte auf die tatsächlich vorhandene Anzahl gesetzt werden muss; anschließend der PDO wieder "gültig" gemacht werden muss; .... ; und zu guter Letzt die Konfiguration dauerhaft abgespeichert und ein Node-Reset ausgelöst werden muss (damit die neue Konfiguration verwendet wird). Aus diesem Grund empfehlen wir für die Konfiguration der PDOs unbedingt die Anschaffung eines geeigneten CANopen-Konfigurationstools (z.B. "CANopen Configuration Manager" oder vergleichbare Produkte) .


CANopen LSS (Layer Setting Services)

Um Geräte ohne DIP-Schalter für Baudrate und Knotennummer ("Node-ID") im CANopen-Netzwerk zu finden, und diesen ggf. automatisch einen Node-ID zuzuweisen oder/und eine neue CAN-Baudrate einzustellen, enthält der CAN-Tester seit Februar 2024 nicht nur einen primitiven LSS-Slave, sondern auch einen LSS-Master.
Da das LSS-"Fast Scan"-Protokoll leider keine Erkennung von bereits konfigurierten LSS-Slaves (d.g. mit "gültiger Knotennummer"), führt der hier beschrieben Master zusätzlich zum 'LSS Fast Scan' eine Suche nach bereits konfigurierten Slaves per NMT-"Reset Nodes" (Broadcast an alle schon 'aktiven' Slaves durch. Slaves die bereits eine per LSS (oder per DIP-Schalter) zugewiesene Node-ID haben, tauchen dabei in der im folgenden Kapitel beschriebenen Ergbnis-Liste, mit dem bereits 'festen' Node-ID auf.
Hinweis zu CANopen-Geräten von MKT Systemtechnik mit LSS und DIP-Schalter zum Einstellen der Knotennummer:
Module mit DIP-Schalter können nur dann per LSS umkonfiguriert werden, wenn am DIP-Schalter die Kotennummer auf 'Null' eingestellt ist.
Mit per DIP-Schalter "fest eingestelltem" Node-ID (1..127 am DIP- bzw. Hex-Codier-Schalter) weist das Modul jeden Versuch, ihm per LSS (DS305: "Configure node-ID protocol") einen davon abweichenden ID zuzuweisen, mit dem LSS-Error-Code 1 = "Node-ID out of range" ab.
Ähnliches gilt für die möglicherweise per DIP-Schalter und per LSS einstellbare CAN-Baudrate (DS305: "Configure bit timing parameters protocl"): Auch hier sollte der DIP- bzw. HEX-Schalter für die Baudrate auf Null gesetzt werden, so daß dem Systemintegrator 'vor Ort' auf den ersten Blick klar ist, dass das entsprechende Modul nicht per DIP-Schalter, sondern per LSS konfiguriert wurde.

Details zum erschreckend komplexen Thema 'CANopen LSS' finden Sie in CiA DS305 (aka 'CiA 305'), "Layer setting services (LSS)".


CANopen-LSS-Master im CAN-Tester

Der in diesem Kapitel beschriebene LSS-Master kann aus dem Hauptmenü des CAN-Testers unter 'Tools'..'CANopen LSS Master' geöffnet werden.


Fenster des im CAN-Tester integrierten LSS-Masters
mit zwei erkannten CANopen-Slaves.

Ob bei per LSS-Master alle noch nicht konfigurierten Slaves mit einer neuen Knotennummer (Node-ID), oder / und mit einer neuen CAN-Baudrate parametriert werden sollen, wird vor dem Starten des Masters im oberen Teil des Fensters eingestellt.
Der 'Classic Scan' wurde zwar ansatzweise implementiert, wurde aber mangels geeigneter Testkandidaten (und in Anbetracht der extrem geringen Geschwindigkeit beim 'Scannen', d.h. der Suche nach noch nicht konfigurierten LSS-Slaves) nie getestet. Da moderne CANopen-Geräte mit LSS-Support grundsätzlich auch das 'Fast Scan'-Protokoll unterstützen sollten, reicht der voreingestellte 'LSS Fast Scan' im Allgemeinen aus.

Bei einem erfolgreichen Suchlauf werden die vom LSS-Master erkannten noch nicht konfigurierten Slaves, und dabei mit einer neuen Knotennummer versorgten Slaves im unteren Teil des Fensters aufgelistet (*).
Die Anzeige von CANopen Node ID erfolgt aus Platzgründen hexadezimal ohne Hex-Prefix (0x01 .. 0x7F). Die Bedeutung der Spalten "Vendor"(-ID), "Product Code", "Revision Number", und "Serial Number" entnehmen Sie im Bedarfsfall bitte der Spezifikation (CiA DS305). Auch diese jeweils 32 Bit langen Bestandteile der 128-Bit "LSS-Adresse" werden hexadezimal aufgelistet.
Tipp zum CANopen-"Vendor-ID":
Der in der Liste hexadezimal angezeigten 'Vendor-ID' kann auf der Webseite https://www.can-cia.org/services/canopen-vendor-id/
in das Feld 'Search' eingegeben werden. Liegt ein gültiger, und bei CiA registrierter Vendor-ID vor, so wird z.B. als Ergebnis der Suche nach 004D4B54 folgendes angezeigt:
  Vendor-ID: 004D4B54
  Registered Name: MKT-Systemtechnik GmbH & Co. KG


(*) Hinweis zu bereits konfigurierten CANopen-Knoten:
Da bereits konfigurierte CANopen-Knoten nicht mehr am 'Fast Scan'-Zyklus teilnehmen, können diesen Geräten keine neuen Node-IDs mehr zugewiesen werden. Um Node-ID Kollisionen bei der Vergabe neuer (weiterer) Node-IDs zu vermeiden, sollte die Option
  ☑ also find ALREADY CONFIGURED slaves (via NMT)
verwendet werden. So werden bei der Vergabe neuer Knotennummern auch z.B. per DIP-Schalter konfigurierte Module berücksichtigt (die möglicherweise nicht über einen LSS-Slave in der Gerätefirmware verfügen, oder sich bei 'fast scan' nicht melden, weil sie dies gemäß CiA DS305 nicht dürfen).


Nach Beendung des 'Suchlaufs' werden im Fenster des 'LSS Masters' eine Liste mit allen erkannten CANopen-Slaves angezeigt. Mit der Option "also find ALREADY CONFIGURED slaves.." sind in dieser Liste auch Knoten enthalten, die bereits vor dem LSS-Suchlauf konfiguriert waren (was für den Anwender i.A. keine Rolle spielt). Per Mausklick in die Liste mit 'Node-ID, Vendor-ID, Product Code, Revision und Serial Number' kann nun ein bestimmtes Gerät ausgewählt werden. Mit dem nun verfügbaren "Continue"-Button wird die Knotennummer (Node-ID) des selektierten Eintrags vom CAN-Tester übernommen, das Fenster vom "LSS Master" wird geschlossen, und stattdessem öffnet sich das Fenster zum Auslesen und Anzeigen des Objektverzeichnisses des selektierten Knotens.

Interpreterfunktionen zum Zugriff auf Objekte im CANopen-OD per SDO

Lesezugriff per SDO

Syntax:
sdo.r( <ObjektIndex.Subindex> [,Datentyp[,Default]] )
Beispiele:
print sdo.r(0x1008.0) ; show device name (as "visible string")

I := 1 ; Read all 32bit floating point variables (object 0x4008)
N := sdo.r(0x4008.0) ; how many variables do we have FOR THIS TYPE ?
repeat
   print "AppVar4008.%02lX = %lg (FLT32)",I,sdo.r(0x4008.I,F32);
   I := I+1;
until(I>N)

Das letzte Beispiel stammt aus dem Test-Script "CanopenTerminalTest.cts", mit dem in einer Schleife alle Subindizes von Objekt 0x4008 gelesen werden.
In diesem Fall muss der Datentyp (hier : FLT32 = 32-Bit floating point) als Argument beim Aufruf der sdo.read-Funktion übergeben werden, weil der Interpreter andernfalls einen 32-Bit-Integer-Typ verwenden würde. Grund: Beim Lesezugriff per SDO erfährt der SDO-Client zwar, wie viele Bytes gelesen wurden, nicht aber den Datentyp. Per Default geht der Interpreter immer von Integer-Typen aus. Als Datentyp können die CANopen-Datentyp-Codes, oder besser (lesbarer) die folgenden symbolischen Konstanten verwendet werden, ggf. auch abgekürzt. Alle Symbole in einer Zeile der folgenden Auflistung entsprechen dem gleichen CANopen-Datentyp .

Bei 'sehr großen Objekten' (CANopen-Fachchinesisch : 'DOMAIN') liefert die Funktion sdo.r() nicht den Inhalt, sondern den Namen einer Datei, in der der CAN-Bus-Tester den Inhalt abgespeichert hat. Der Dateiname wird automatisch aus dem Objekt-Index und -Subindex erzeugt, mit dem Vorsatz 'Readout_Obj' um zu verdeutlichen, daß es sich bei dieser Datei um einen aus einem CANopen-Objekt ausgelesenen Wert handelt.
Beispiel zum Auslesen einer "EDS-Datei" aus dem Gerät selbst (Objekt 0x1021, funktioniert z.B. mit MKT's CANopen-Buskoppler):

Befehlszeile aus einem Test-Script:
print sdo.r(0x1021.0,str) ; Try to read a 'stored EDS' from this device

Antwort vom CAN-Tester: Hier kein "Wert" sondern der Name der vom CAN-Tester erzeugten Datei 'mit dem Wert':
C:\MKT\CAN_Tester_for_Windows\Objects\Readout_Obj1021_00.eds

Schreibzugriff per SDO:

Syntax:
sdo.w( <ObjektIndex.Subindex> , <Datentyp> , < zu schreibender Wert > )
Beispiel:
sdo.w (0x1017.0,U16, 100 ) ; set heartbeat producer time to 100 milliseconds

Siehe auch : Übersicht aller Interpreterfunktionen und -Kommandos des CAN-Testers

CANopen-Datentypen

Die folgenden elementare Datentypen waren in CiA DS301 V4.0 auf Seite 9-58 definiert.
Hinweis: Nicht alle dieser Typen werden vom CAN-Tester unterstützt !
Der "Index" eines Datentyps bezieht sich auf das Object Dictionary eines jeden CANopen-Knotens (dient nur zu Definitionszwecken, unter diesen Indizes werden Sie bei den meisten CANopen-Knoten nichts auslesen können !)
Name Index Size in bits Remarks
BOOLEAN 0x01 ?? we use 8 bits for this !
INTEGER8 0x02 8
INTEGER16 0x03 16
INTEGER32 0x04 32
UNSIGNED8 0x05 8
UNSIGNED16 0x06 16
UNSIGNED32 0x07 32
REAL32 0x08 32 floating point, not fully supported
VISIBLE_STRING 0x09 X not supported
OCTET_STRING 0x0A X not supported
UNICODE_STRING 0x0B X not supported
TIME_OF_DAY 0x0C not supported
TIME_DIFFER 0x0D not supported
BIT_STRING 0x0E not supported
DOMAIN 0x0F not supported
INTEGER24 0x10 not supported
REAL64 0x11 not supported
 .... 0x12..0x16 other exotic types, not supported
reserved 0x17
 .... 0x18..0x1B very exotic types, not supported
reserved 0x1C..0x1F
PDO_COMM_PAR 0x20 8 + x
PDO_MAPPING 0x21 8 + n*32
SDO_PARAMETER 0x22 8 + x
IDENTITY 0x23 8 + 4*32

Siehe auch:

SDO-Fehlercodes

<noch keine deutsche Übersetzung verfügbar>

The table below shows some error codes that may occur during SDO upload or download.
Most of these error codes are taken from 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.
SDO 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

Siehe auch: Fehlercodes des CAN-Testers


Kommando-Interpreter (für Test-Scripte)


Das Kommandoprogramm

Das Kommandoprogramm besteht im einfachsten Fall aus einer Reihe von CAN-Messages, die gesendet werden sollen.

Das Format ist normalerweise:

<CAN-Identifier> <Datenbyte0> <Datenbyte1> ... <Datenbyte7>

Der CAN-Identifier wird normalerweise in hexadezimaler Form erwartet. Moeglich ist auch die dezimale Form, die durch ein vorgestelltes '#' gekennzeichnet werden muss. Direkt nach dem Identifier kann ein spezieller Suffix angegeben werden, um z.B. auch bei einem Identifier <= 0x3FF diesen mit 29 Bit ("extended" frame) zu codieren, oder um statt "Classic CAN" einen CAN-FD-Rahmen zu senden.

Die Datenbytes werden i.A. auch hexadezimal erwartet. Statt einfacher Zahlenwerte koennen auch beliebige Ausdrücke verwendet werden. Diese sollten in Klammern umschlossen werden, um Fehlinterpretationen auszuschliessen. Auch Variablen sind möglich (s.U.). Details und Beispiele zum Senden von CAN-Messages per Script folgen später.

Statt einer zu sendenden CAN-Message kann eine Zeile auch eine Anweisung an den Kommando-Interpreter enthalten.

Anweisungen sind z.B. (vgl. komplette Befehlsübersicht):

Die Verzögerungszeit bei der Abarbeitung der Zeilen des Kommandoprogrammes kann im Systemmenü eingestellt werden. Sie sollte mindestens 5 ms (pro Zeile) betragen. Zusaetzliche Verzögerungen innerhalb des Kommandoprogramms koennen mit dem delay - Befehl realisiert werden.

Zur Dokumentation des Kommandoprogrammes können Kommentare eingefügt werden. Im Anlehnung an ASSEMBER beginnen Kommentare mit einem Semikolon; C++-Freaks dürfen (seit August 2006) auch den doppelten Schrägstrich ( // ) als Anfang eines einzeiligen Kommentares verwenden.

Als 'Sprungziel' für manche Befehle dienen Label im Programmtext. Als Label-Namen werden möglichst 'sprechende' Symbole verwendet, z.B. AnalogOutputTest. Im Programmtext sind Labels an mindestens einem nachgestellten Doppelpunkt erkennbar. Labels mit zwei nachfolgenden Doppelpunkten werden bei der Aufzählung im Menü 'Run' .. 'Run from Label' bevorzugt. Solche Labels dienen als Startpunkt, wenn in einer einzelnen Applikation (*.cts-Datei) mehrere Testabläufe implementiert sind. Hier ein Beispiel aus der Applikation 'EaDIO8Test.cts' :


Numerische Ausdrücke

Auf der rechten Seite eines Zuweisungsoperators, aber auch in der Parameterliste beim Aufruf von Prozeduren oder Funktionen können (nahezu) beliebig komplexe numerische Ausdrücke folgen. Eine Begrenzung ist die maximale Zeilenlänge im Kommando-Programm bzw. Text-Editor, mit maximal 255 Zeichen pro Zeile.
Für die Auswertung numerischer Aufdrücke mit dem Interpreter des CAN-Testers gilt:

Bei der Auswertung eines numerischen Ausdrucks werden die meisten Operationen (Teilschritte) mit dem Datentyp der Operanden durchgeführt. Dies gilt auch für die Division: Haben z.B. sowohl Zähler (hier: A) und Nenner (hier: B) den Datentyp integer, dann hat auch der Quotient aus A / B den Typ integer (nicht Gleitkomma). Beispiele :

print 2+3/4;   // Liefert das Ergebnis 2 (denn int / int liefert int)
print 2+3/4.0; // Liefert das Ergebnis 2.7500 (denn int / double liefert double, wie im Nenner)
print 2+3.0/4; // Liefert das Ergebnis 2.7500 (denn double / int liefert double, wie im Zähler)
Wegen "Punkt vor Strichrechnung" wird im zweiten und dritten Beispiel auch die nach der Division folgende Addition als Gleitkommawert berechnet (64-bit 'double').

Der 'größte' bei der Auswertung numerischer Ausdrücke intern verwendete Datentyp ist 'double' (64-Bit-Gleitkommazahl mit ausreichend großer Mantisse, um auch 32-Bit-Integer-Werte 'verlustfrei' speichern zu können). Funktionen und Kommandos, die statt Gleitkomma z.B. BYTE- oder Integer-Werte erwarten, konvertieren den Eingangswert automatisch. Darüberhinaus können wie im folgenden Beispiel Gleitkomma-Werte mit der Funktion 'floor' abgerundet werden:
NumBytesMapped := floor( (NumBitsMapped+7)/8 );

Senden von CAN-Telegrammen aus dem Kommandoprogramm

Kommandozeilen mit CAN-Telegrammen (als Text) führen zum Senden der Telegramme in der Reihenfolge der Programmabarbeitung.
Beginnt eine Kommandozeile mit einer ZAHL (oder geklammerten numerischen Ausdruck), so geht der Interpreter davon aus dass es sich um ein zu sendendes CAN-Telegramm handelt.

Das Format von CAN-Telegrammen im Kommandointerpreter ist normalerweise:

<CAN-Identifier> <Datenbyte0> <Datenbyte1> ... <Datenbyte7>

Der CAN-Identifier wird normalerweise in hexadezimaler Form erwartet. Möglich ist auch die dezimale Form, die durch ein vorgestelltes '#' gekennzeichnet werden muss. Zwei einfache Beispiele:

Die Datenbytes werden i.A. hexadezimal erwartet. Statt einfacher Zahlenwerte koennen auch beliebige Ausdrücke verwendet werden. Diese sollten in Klammern umschlossen werden, um Fehlinterpretationen auszuschliessen. Auch Variablen sind möglich (s.U.).

Ohne weitere Zusätze werden CAN-Telegramme mit Identifier <= 2047 als 11-BIT-Frames gesendet. Bei IDs >= 2048 ohne Zusatz (s.U.) wird automatisch ein Telegramm mit 29-Bit-Identifier ("extended frame") gesendet.

Um definitiv unabhängig vom Zahlenwert des Identifiers 11- oder 29-Bit-Identifier zu senden, kann der Suffix ".s" (für Standard-Frames mit 11 Bit-ID) bzw. ".x" (für eXtended-Frames mit 29-Bit-ID) verwendet werden. Beispiele:

Hinweis: Bei der Anzeige im RX/TX-Fenster können 11- und 29-Bit-Identifer wahlweise nur durch die Anzahl Ziffern unterschieden werden, der Suffix ".s" oder ".x" (bzw. ".S" oder ".X" für CAN FD) ist dort optional.

Sowohl CAN-ID als auch Datenfeld kann -wie in den obigen Beispielen- als einfache Konstante angegeben werden, es sind aber auch beliebige numerische (geklammerte) Ausdrücke realisierbar.

Beispiele:
N:=123 : X:=1
Loop:
 (N).s 01 02 03 04 05 06 07 08  ; sendet mit CAN-ID 123,124,..
 (N) (X+1) (X+2) (X+3) (X+4)    ; sendet 4 variable Datenbytes
 (N) (X).w (X).l (X).mw (X).ml  ; sendet INTEL + MOTOROLA..
 N:=N+1 : X:=X+1
goto Loop

Der optionale Suffix (z.B. ".w" oder ".iw") im CAN-Datenfeld hat folgende Bedeutung:

.w oder .iw
16-Bit-Integer-Werts im Intel-Format
(least significant byte first, wie bei CANopen)

.l oder .il
32-Bit-Integerwert im Intel-Format

.if
32-Bit-'Intel Float'

.mw
16-Bit-Integer-Wert im MOTOROLA-Format
(most significant byte first, d.h. Bits 15..8 im ersten Byte, Bits 8..0 im zweiten Byte)

.ml
32-Bit-Integerwert im MOTOROLA-Format
(Bits 31..24, 23..16, 15..8 und zum Schluß 7..0 jeweils in ein Byte im CAN-Telegramm gepackt)

.mf
32-Bit-'Motorola Float'
Dieses exotische Format wird tatsächlich in der Praxis verwendet (2013-12-09) !
Vermutlich steckt beim 'Motorola-32-Bit-Gleitkomma-Format' der EXPONENT im ersten Byte (entsprechend 'MSB');
Offizielle Details (von GM) waren bei der Erstellung dieser Beschreibung (2013-12-09) nicht bekannt.

Eine explizite Angabe der Länge des Datenfeldes ist nur in den seltensten Fällen nötig, denn der Interpreter zählt die zu senden Datenbytes. Um für spezielle Anwendungen (Beispiel: CANopen-PDO-Senden, mit Acht-Byte-Datenfeld im Script obwohl der momentan getestete CANopen-Knoten weniger als acht Bytes erwartet) das Datenfeld 'abzuschneiden', kann zwischen CAN-Message-ID und CAN-Datenfeld eine Länge (Anzahl als 'DLC' zu sendender Datenbytes) in eckigen Klammern spezifiziert werden. Beispiel (aus dem Test-Script 'EaDIO8Text', welches für ein Bus-Koppler-Modul bis zu 64 digitale Ausgänge per PDO ansteuern konnte):

  CommPar := 0x1400;  // find the number of bytes to send in the device's first RPDO..
  gosub GetSizeOfPDO; // [in] CommPar, [out] NumBytesMapped 
  P1 := 0x200+NodeId; // Identifier for TPDO1 Master -> I/O-module (DS401:0x200+N)
  DigIoLoop:  ; digital-I/O per PDO ansteuern  :
      D := table[N%8](0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80) ; Lauflichtmuster
     (P1) [NumBytesMapped] (D) (D) (D) (D) (D) (D) (D) (D)  ; bis zu 64 digitale Outputs PER PDO ansteuern
      N := (N+1)%256;
      delay(0.01);
  goto DigIoLoop;
Hinweis zum oben gezeigten Code-Fragment:
Diese auf den ersten Blick umständliche Übergabe der Länge des zu sendenden Datenfeldes wurde so implementiert, weil sich in CANopen DS 301 (aka "Cia 301") V4.2.0 auf Seite 135 der folgende, etwas mehrdeutige Hinweis zum komplexen Thema "RPDO Mapping" fand:
> If the CANopen device receives a PDO that is having more data bytes
> than the number of mapped data bytes is (length), then the CANopen device
> shall use the first data bytes up to the length and may be initiate (??)
> the EMCY write service, if supported.
Einerseits soll der Empfänger 'einfach' nur die Bytes im PDO auswerten, die in seiner RPDO-Mapping-Tabelle existieren, andererseits (mit "may be" wie "maybe" = "vielleicht" ?) könnte der Empfänger ein 'Emergency'-Telegramm senden (z.B. mit "EMCY Error Code" = 0x8220 = "PDO length exceeded", zu finden in DS 301 V4.2.0 auf Seite 71).
Das hier nicht gezeigte (aber in EaDIO8Test.cts enthaltene) Unterprogramm 'GetSizeOfPDO' versucht durch Aufaddieren der Längen aller in den RPDO gemappten Objekte die korrekte Länge des Datenfelds zu ermitteln. Das Ergebnis wird vom Unterprogramm in der Script-Variablen 'NumBytesMapped' abgelegt. Diese wird hier in eckigen Klammern (wie eine Byte-Array-Größe) an den Interpreter des CAN-Testers übergeben.

Befehlsübersicht

Die folgenden Kommandos und Funktionen sind im Interpreter des CAN-Testers mindestens implementiert (darüberhinaus weitere Befehle, für deren Dokumentation bislang die Zeit fehlte ;-) .
Aus Gründen der Abwärtskompatibilität darf den meisten Befehlen noch ein '@'-Zeichen (at) vorangestellt werden. In der aktuellen Version ist dies nicht mehr nötig.

Sprünge, Schleife, Steuerung des Programmablaufes

repeat
Kennzeichnet den Anfang einer mindestens einmal durchlaufenen Wiederholschleife, mit dem Test der Abbruchbedingung am Ende der Schleife (per 'until').
until <Abbruchbedingung>
Sprung zum vorhergehenden repeat, wenn die <Abbruchbedingung> nicht erfüllt ist.
Die Bedingung ist z.B. ein numerischer Ausdruck mit einem Vergleich.

while <Wiederholbedingung>
Kennzeichnet den Anfang einer eventuell nie durchlaufenen Wiederholschleife, mit dem Test der Wiederholbedingung am Anfang der Schleife.
endwhile
Ende einer mit while begonnenen Schleife. Springt in die entsprechende Zeile (mit dem 'while'), in der die Wiederholbedingung erneut getestet wird. Ist die Wiederholbedingung nicht erfüllt (d.h. der numerische Ausdruck liefert den Wert Null = FALSE), wird das Programm in der nach dem 'endwhile' folgenden Zeile fortgesetzt.

goto <Sprungziel>
Sprung zum angegebenen Label (siehe Beispiel)
gosub <Unterprogramm>
Ruft ein Unterprogramm auf.
return
Ende eines Unterprogramms
if <Bedingung>
Die nach if folgenden Anweisungen werden nur ausgefuehrt, wenn <Bedingung> ungleich Null. Das "if"-Kommando gibt's (wie in der Programmiersprache BASIC) in einer einzeiligen Variante (bei der die Anweisung in der gleichen Zeile wie die if-Abfrage steht) und in einer mehrzeiligen Variante (mit "endif" und möglicherweise "else"). Siehe auch: Kapitel "Verzweigungen und Schleifen".
stop
Hält das Kommandoprogramm an (wie F9).
delay(<Zeitintervall in Sekunden>)
Hält das Kommandoprogramm für eine kurze Zeit an.
OnError
Definiert, was der Interpreter beim Auftreten eines Fehlers (nicht: "Warnung", z.B. CAN-Bus-Warnung) tun soll.
ResumeError
Springt in die Zeile nach der Zeile, in der der letzte Fehler aufgetreten ist - und setzt, mit anderen Worten, die Programmausführung fort nachdem ein Fehler aufgetreten ist. Sollte nur in Verbindung mit "OnError goto ....." eingesetzt werden ! Ein Beispiel findet sich im Skript "EaDIO8Test".

Anzeige und Ausgabe

print("<Format-String>", <Parameter>.. )
Druckt Texte und Zahlen ins Meldungs-Fenster, oder (wenn geöffnet) in das per OpenWindow geöffnete Fenster.

OpenWindow, CloseWindow
Öffnet ein "benutzerdefiniertes Fenster", in das Texte mit unterschiedlichen Zeichensätzen gedruckt werden können. Siehe CAN-Tester-Applikation "EaDIO8Test.cvt" (im Installationsarchiv enthalten).

MoveTo
Bewegt den 'Ausgabecursor' für alle nachfolgenden Aufrufe von print innerhalb des per OpenWindow geöffneten Fensters. Ohne Fenster (d.h. bei Ausgabe per 'print' in das Meldungs-Fenster) hat dieser Befehl keinen Effekt.
Die aktuelle Position des Ausgabecursors (Pixel-Koordinate) kann per cursor.x, cursor.y abgefragt werden. Dies kann z.B. beim periodischen Aktualisieren von Teilen eines Fensters verwendet werden. Ein Beispiel finden Sie in der "PDO-Anzeige" in der Applikation EaDIO8Test.cts (im Installationsarchiv des CAN-Testers enthalten).

SetButton( <ButtonNr>, <Caption>, <OnClick> )
Zeigt einen "Button" (graphische Schaltfläche) im klassischen Windows-Stil am unteren Rand des vorher per OpenWindow geöffneten Fensters an.
Parameter:
ButtonNr : Bei 1 (Eins) beginnende Zählung, "von links nach rechts".
  Anhand der Button-Nummer werden die Schaltflächen von links nach rechts
  automatisch an der Unterkante des Fensters angeordnet.
  Eine 'pixelgenaue' Positionierung ist nicht vorgesehen.
Caption : Beschriftung, bzw. Text in der Schaltfläche.
  Durch ein vorangestelltes '&' (Ampersand) wird der
  danach folgende Buchstabe zum 'Hotkey'.
OnClick : Beim Betätigen der Schaltfläche auszuführender Befehl, z.B. goto.

Beispiel aus der Applikation 'EaDIO8Test.cts':
SetButton( 1,"<< &Zurück", goto DigIoTest );
SetButton( 2,"&Beenden",   goto Beenden );
SetButton( 3,"&Weiter >>", goto AnalogIoTest);

SetValueScroller( <ScrollerNr>, <Variable>, <MinValue>, <MaxValue> [, <OnScroll>] )
Zeigt einen "Werte-Scroller" (graphisches Element mit 'Schieber') am unteren Rand des vorher per OpenWindow geöffneten Fensters an.
Ähnlich wie bei SetButton() werden auch 'Scroller' automatisch an der Unterkante des Fensters angeordnet. Eine 'pixelgenaue' Positionierung ist auch hier nicht vorgesehen.
Werden im Fenster sowohl "Buttons" als auch "Scroller" angezeigt, dann erscheinen die Werte-Scroller oberhalb der Zeile mit den Buttons.
Parameter:
  ScrollerNr : Bei 1 (Eins) beginnende Zählung, "von oben nach unten".
  Variable : Die mit diesem Scroller verbundene Variable.
  MinValue : Wert für den Skalenanfang (Minimum des Scrollbereiches).
  MaxValue : Wert für das Skalenende (Maximum des Scrollbereiches).
  OnScroll (optional) : Beim Betätigen der Schaltfläche auszuführender Befehl, z.B. gosub <Label>.

Beispiel aus der Applikation 'EaDIO8Test.cts' (siehe auch: Screenshot eines benutzerdefinierten Fensters):
SetValueScroller( 1, PWM1Freq, 0, 10000, gosub UpdatePWM1FromScroller );
SetValueScroller( 2, PWM1Duty, 0, 100.0, gosub UpdatePWM1FromScroller );

SetFont( "<FontName>", <FontSize>, <FontAttributes> )
Stellt den Zeichensatz für die Textausgabe im benutzerdefinierten Fenster ein (funktioniert nicht im normalen Meldungsfenster !). Die Font-Attribute sind:
0 = normal, 1 = unterstrichen, 2 = Fett, 4 = kursiv. Diese Attribute können auch bitweise kombiniert werden (bitte sparsam einsetzen).
Beispiel: SetFont("Arial",8,1) selektiert einem kleinen Zeichensatz in der Schrift "Arial", mit Unterstrich.

ClearScreen( x )
Löscht den Inhalt eines der Fenster des CAN-Testers (mit Ausnahme des Kommandofensters).
x : 0=benutzerdefiniertes Fenster, 1=RX-Fenster, 2=TX-Fenster, 3=Meldungsfenster

ClearVars()
Löscht alle 'normalen' Variablen, die seit dem Programmstart im Kommando-Fenster bzw -Script zugewiesen wurden.
Hinweis: Der CAN-Tester speichert Variablen zwischen zwei Sitzungen.
Mit der Anweisung ClearVars() am Anfang des Scripts kann die Verwendung 'alter' Werte verhindert werden.

scope.xxx
Ändert die Einstellungen des Scope-Fensters (alias "Watch/Plot-Fenster") durch das Kommandoprogramm

sound(frequenz, dauer, modulation)
Erzeugte (unter alten Windows-Versionen) diverse Töne im PC-Speaker. 'frequenz' war die Startfrequenz in Hz, 'dauer' die Dauer des Tons in Millisekunden, und 'modulation' die optionale Sweep-Rate in Hz/50ms . Seit Windows 7/8 nicht mehr funktionsfähig.

freeze
"Friert" Empfangs- und Sendefenster ein.
Dadurch wird viel 'Rechenleistung' eingespart, wodurch nachfolgende Zeilen im Script deutlich schneller abgearbeitet werden können (z.B. zum Senden einiger Tausend CAN-Messages pro Sekunde).

Alte Syntax:
    freeze; // stop RX- and TX message display
Neue Syntax:
    freeze := TRUE;  // stop ('freeze') RX- and TX-message display
    freeze := FALSE; // let RX- and TX-message display run again

    was_frozen := freeze; // stop RX- and TX message display and save old setting
    freeze := was_frozen; // restore old state for RX- and TX-message display
 
def_watch
Definiert Komponenten einer Watch-Struktur. Syntax: def_watch(<Kanal>) Name, Ausdruck, Min-Wert, Max-Wert. Beispiel:
def_watch(0) "Ain1", canrx(0x181,0,U16), 0, 32768

Numerische Funktionen

floor( <x> )
Rundet den als Argument (x) übergebenen Gleitkommawert auf den nächstkleineren Wert ab.
Entspricht der gleichnamigen Funktion in "C" : double floor(double x) .
Hinweis: Der Rückgabewert ist, wie in "C", eine 64-Bit-Gleitkommazahl - kein Integer-Wert !
Beispiele: floor( 1.9 ) = 1.0; floor( -1.9 ) = -2.0 .
Siehe auch: int(), Numerische Ausdrücke.

int( <x> )
Konvertiert das Argument (x) in eine 32-Bit-Integer-Zahl.
Entspricht dem 'cast nach Integer' in "C".
Hinweis: Im Gegensatz zu floor() ist der Rückgabewert ein 32-Bit-Integer.
Wie der (int)-cast in "C" rundet int(x) -im Gegensatz zu floor(x)- nicht in Richtung 'Minus Unendlich' ab, sondern in Richtung Null. Beispiele:
  int( 1.9 ) = 1;   int( -1.9 ) = -1 (!).
Siehe auch: floor(), Numerische Ausdrücke.

isin( <argument> [,<period> [,<amplitude>]] )
Integer-Sinus wie in manchen "programmierbaren Terminals" von MKT. Kann -im Zusammenhang mit der time-Funktion- zur Erzeugung von Testsignalen verwendet werden.

table[Index]( Value0, Value1, Value2, Value3, ... ValueN )
Bettet eine kleine Tabelle (z.B. mit Integer-Konstanten) in den Programmcode ein. Beispiel:
Lauflicht := table[X%8](0x03,0x06,0x0C,0x18,0x30,0x60,0xC0,0x81)

time
Liefert die Anzahl Millisekunden, die seit dem Programmstart (?) vergangen sind.

CAN-Senden und Empfangen (Decodieren einzelner CAN-Signale)

canrx(<Identifier>, <erstes Bit>, <Datentyp>)
Isoliert ein "Signal" (Integer- oder Gleitkommawert) aus einem empfangenen CAN-Telegramm

tx_interval=<neues Sendeintervall in Sekunden>
Setzt das Intervall zum Senden von CAN-Telegrammen auf den angegebenen Wert.
Fehlt dieses Kommando in der Anweisungsliste, wird das in der Konfiguration definierte Intervall verwendet.
Hinweise:

Siehe auch: "delay"-Kommando für eine einmalige Wartezeit.

can.send( <Identifier>, <Zeichenkette> )
Sendet eine Zeichenkette mit bis zu 255 Zeichen per CAN-Bus (mehrere Telegramme nacheinander, ohne Bestätigung, nicht CANopen-konform !). Optional kann nach dem Identifier mit dem Token "g="(gap) eine Verzögerungszeit (im Millisekunden) angegeben werden. z.B.:
can.send(0x7F0,g=50,"Hallo ! Dies ist ein Test für die can-String-Sendefunktion !")
Fehlt die Verzögerungszeit, wird als Default-Wert eine Pause von 20 Millisekunden zwischen zwei Telegrammen verwendet.
Hinweis: Dieser Befehl wirkt blockierend ! Erst nach dem Senden setzt der Interpreter seine Arbeit fort.

can.show_msgs_as_strings( <Identifier-Liste> )
Stellt den Anzeigemodus von bis zu 4 CAN-Telegrammen (mit den angegebenen Identifiern) auf "String" um. Empfangene und gesendete Telegramme mit diesen Identifiern werden ab diesem Zeitpunkt als (ASCII-)Zeichenketten angezeigt, nicht -wie üblich- hexadezimal. Wurde im Sommer 2005 implementiert, um einfache (langsame) "Zeichenkanäle" für Diagnosezwecke anzuzeigen. Während der Entwicklungsphase sendete ein Gerät auf einem für "Diagnosezwecke" reservierten CAN-ID (0x7F0 oder 0x7F1) Fehlermeldungen als Klartext (Strings im ASCII-Zeichensatz).
Hinweis: Nicht druckbare Zeichen werden z.T. hexadezimal angezeigt, z.B. "Hallo" 0D 0A
Siehe auch: CAN-Text-Terminal

can.reset
Setzt den CAN-Controller zurück (z.B. bei BUS-OFF, weil jemand das CAN-Kabel nicht rechtzeigtig eingesteckt hatte ;-). Hilft auch, wenn der PEAK-Treiber aus unbekennten Gründen zwar noch Telegramme sendet, aber keine mehr empfängt.

wcan <CAN-ID> <Länge> <Datenbytes>..
Wartet auf den Empfang eines bestimmten CAN-Telegramms, bevor das Kommandoprogramm fortgesetzt wird. Dabei kann sowohl für CAN-ID, Länge, und auch die Datenbytes der Wert X als "Don't Care" eingesetzt werden (für den ID 3 Ziffern, für die Länge 1 Ziffer). Beispiele:
wcan 123 8 11 22 33 44 55 66 77 88 ; Wartet auf ID=0x123 und GENAU diesen Bytes
wcan 7FF x xx xx xx xx xx xx xx xx ; wartet auf ID=0x7FF, beliebiges Datenfeld
wcan XXX 3 xx AA xx  ; w.a. beliebige ID, 3 Bytes, 0xAA im zweiten Byte

Um nach dem Empfang einer "passenden" CAN-Message auf deren Datenfeld zuzugreifen, oder um den tatsächlich verwendeten Identifier abzufragen, verwenden Sie die Interpreterfunktionen wcan.id, wcan.len, und wcan.dat .
Zum Testen der "wcan"-Funktion eignen sich die Programme Wait_Test_Server.txt und Wait_Test_Client.txt, die seit März 2006 im Installationsarchiv des CAN-Testers enthalten sind.
Hinweis: Sie verwenden WINDOWS... erwarten Sie daher vom CAN-Tester nicht, daß das Kommandoprogramm wenige Millisekunden nach Empfang des erwarteten CAN-Telegramms fortgesetzt wird ! Typische Verzögerungen liegen im Bereich von 5 bis 200 Millisekunden, je nach Rechnertakt. Manchmal läßt sich das Kommandoprogramm beschleunigen, indem die Anzeige im TX- und RX-Fenster gestoppt wird.


print (Kommando)

Syntax
print("<Format-String>", <Parameter>.. )
Funktion
Druckt Texte und Zahlen ins Meldungsfenster oder (wenn vorhanden) in das per OpenWindow geöffnete Fenster.
Im Normalfall wird nach 'print' eine neue Zeile begonnen.
Um dies zu vermeiden, kann am Ende der Parameterliste (direkt vor der schließenden Klammer) ein Semikolon eingefügt werden. Beispiel:
  print("Erster Teil der Ausgabe,";); // ohne Zeilenvorschub
  print("zweiter Teil der Ausgabe."); // mit Zeilenvorschub

Beispiele für den Format-String:

Details finden Sie im Handbuch eines beliebigen "C"-Compilers bei der Beschreibung des " printf"-Befehls. Die Parameter sind immer 32-Bit-Integer-Zahlen, daher die Eingabegrößen-Modifikation '%l' (kleines "L"). Beispiel:
    print( "Es ist jetzt %02ld:%02ld:%02ld Uhr .",23,59,59 ); // drei Zahlen mit je zwei Ziffern

Sind in der Parameterliste mehr auszugebende Werte vorhanden als Platzhalter im Format-String, dann wird automatisch das zum Typ der Variablen passende 'Default-Format' verwendet. Aus dem Grund kann auch komplett auf den Format-String verzichtet werden. Bespiel:
    print( "Es ist jetzt",23;":";59;":";59,"Uhr ." );

Wird print wie im oben gezeigten Beispiel ohne Format-String verwendet, gelten folgende Regeln für das Trennzeichen in der Parameterliste:

Der vom oben gezeigten Beispiel ausgegebene Text lautet daher:
       Es ist jetzt 23:59:59 Uhr .
                   |________|___ per Komma ausgegebene Leerzeichen


OpenWindow, CloseWindow (Kommandos)

Syntax
OpenWindow("<Fenstertitel>", x1=<X1>, y1=<Y1>, w=<Breite>, h=<Höhe>, fc=<Vordergrundfarbe>,bc=<Hintergrundfarbe> )
Funktion
Öffnet ein benutzerdefiniertes Fenster für "bedienerfreundliche" automatisierte Testabläufe. Mit CloseWindow() wird das Fenster wieder geschlossen.

Beispiele:

Zulässige Farbwerte : red, green, blue, yellow, white, black, oder RGB-Farbmischungen als Integerwerte (z.B. 0x0000FF=Rot, 0x00FF00=Grün, 0xFF0000=Blau).

Nach dem Öffnen eines Fensters per OpenWindow() können dort z.B. Steuerelemente wie z.B. Buttons angezeigt werden, um einfache 'graphische Benutzeroberflächen' für interaktive Testabläufe zu realisieren. Ein Beispiel dafür finden Sie im Test-Script EaDIO8Test.cvt (ursprünglich für ein E/A-Modul mit CANopen und 8 digitalen Ein/Ausgängen vorgesehen). Das per Script geöffnete Fenster enthalt einige Buttons (Schaltflächen im klassischen Windows-Stil), um den Bediener schrittweise durch einen halbautomatischen Testablauf zu führen.

Nach dem Befehl "OpenWindow" druckt das Kommando print nicht mehr in die Meldungsliste des CAN-Testers, sondern in das benutzerdefinierte Fenster.


Screenshot aus EaDIO8Test.cvt mit einem per 'OpenWindow()' erzeugten Fenster
mit Schiebereglern (hier zum interaktiven Steuern von Pulsweitenmodulatoren)
und Schaltflächen (hier für die Nagivation innerhalb des per Script gesteuerten Ablaufs).

Siehe auch (Befehle für das per OpenWindow() erzeugte Fenster):

goto, gosub (Kommando)

Syntax
goto <Label>
gosub <Label>
Funktion
Springt an eine bestimmte Programmposition im Kommandofenster.
gosub merkt sich die aktuelle Programmposition für einen späteren Rücksprung mit return.
Siehe auch:   Beispiel mit 'goto'; Labels .


return (Kommando)

Syntax
return
Funktion
Setzt die Programmausführung in der Zeile nach einem letzten "gosub"-Befehl fort.
Wird normalerweise als letzter Befehl eines Unterprogramms eingesetzt, welches von verschiedenen Stellen aufgerufen wird.


canrx (Kommando zum Decodieren empfangener CAN-Signale)

Syntax
canrx( <CAN-Identifier>, <erstes Bit im Datenfeld der Message>, <Datentyp> [ , < Defaultwert > ] )
Funktion
Sucht im Empfangspuffer des CAN-Testers nach der zuletzt empfangenen CAN-Message mit dem angegebenen Identifier, und isoliert ein einzelnes "Signal" aus dem Datenfeld der Message. Als Datentyp können die wichtigsten CANopen-Datentypen in symbolischer Form verwendet werden.

Beispiel: A :=  canrx(0x181, 48, I16, 1234 )

Durchsucht den Empfangspuffer nach dem zuletzt empfangenen CAN-Telegramm mit dem CAN-Identifier 0x181 (hexadezimal). Wurde ein entsprechendes Telegramm im Puffer gefunden, wird ein vorzeichenbehafteter 16-Bit-Integerwert ("I16") aus dem empfangenen Datenfeld gebildet, beginnend mit Bit 48 des CAN-Datenfeldes (Bitzählung beginnt bei 0, ein Datenfeld mit 8 Bytes enthält Bit 0 bis 63). Die 16-Bit-Zahl wird als Funktionsergebnis zurückgeliefert, und -in diesem Beispiel- an die Variable "A" zugewiesen.
Falls kein passendes CAN-Telegramm im Puffer gefunden wird, ist das Funktionsergebnis identisch mit dem Default-Wert (hier: 1234). Ist kein Defaultwert angegeben, und kein passendes Telegramm im Puffer, bricht der Interpreter die Bearbeitung mit einer Fehlermeldung ab.

Der im CAN-Tester verwendete Empfangspuffer fasst 1024 CAN-Telegramme. Dies hat zur Folge, daß bei hoher CAN-Bus-Auslastung mit vielen verschiedenen Identifiern das gewünschte Telegramm eventuell nicht mehr im Puffer vorhanden ist, wenn das Interpreterprogramm die canrx-Funktion abarbeitet. Für periodisch übertragene Signale (z.B. zyklisch gesendete Prozessdaten) eignet sich diese Funktion allerdings sehr gut, auch für den Einsatz im Watch/Plot-Fenster .

canrx.latch (Für die Verarbeitung 'eingefrorenes' CAN-Telegramm)

Zusätlich zur weiter oben beschriebenen Form bietet 'canrx' auch die Möglichkeit, ein CAN-Telegramm mit einem bestimmten Message-ID für die weitere Verarbeitung in einem eigenen Zwischenpuffer (latch) abzulegen. Dadurch wird die Konsistenz sichergestellt, wenn mehrere Signale aus einem CAN-Telegramm enthalten sind, die vom Script im CAN-Tester verabeitet werden sollen.
Mit dem folgenden Beispiel wird zunächst das zuletzt empfangene CAN-Telegramm mit Message-ID 0x1800 'eingefroren', um daraus anschließend verschiedene Signale (Bitfelder) zu isolieren. Mit der Funktion canrx.latch kann auch auf die Länge des Datenfelds (0 bis 8 Bytes), den Message-Identifier, und den Zeitstempel zugegriffen werden.
  if( canrx.update_latch( 0x1800 ) ) // try to capture the last message with this ID
     print( "Received %ld messages with ID %lX .", canrx.latch.count, canrx.latch.id );
     print( "Number of data bytes  : %ld",   canrx.latch.len );
     print( "Digital inputs  1..16 : %04lX", canrx.latch(0, U16) );
     print( "Digital inputs 17..31 : %04lX", canrx.latch(16,U16) );
  else
     print( "Nothing received yet" );
  endif;

Siehe auch: Plot-Fenster zur Darstellung des zeitlichen Verlaufs einzelner Signale in Echtzeit.

wcan.id, wcan.len, wcan.dat (Abfragefunktionen nach dem wcan-Kommando)

Diese Interpreterfunktionen können in der Zeile nach dem 'wcan'-Kommando verwendet werden, um auf das bei 'wcan' empfangene Telegramm zuzugreifen. Die folgenden Funktionskomponenten sind bislang implementiert (Stand 2006-03-31):



scope.xxx (Kommandos zum Steuern des Watch/Plot-Fensters durch den Interpreter)

Verfügbare Befehle:

Beispiel: Ausschnitt aus einem Kommandoprogramm mit Parametrierung des Scope-Fensters, inkl. Definition von vier Messkanälen :

; Prepare SCOPE/Plotter to show values from PDO :
scope.show(2) ; REM show channel definition tab in the scope window
scope.timing=0.005 ; REM set scope sampling interval (seconds)
; REM scope.ch[x]={ Name, Expression, ScaleMin, ScaleMax }
scope.ch[0]={"PDO1_W0", canrx(0x181,0,I16), -32768, 32768 }
scope.ch[1]={"PDO1_W1", canrx(0x181,16,I16), -32768, 32768 }
scope.ch[2]={"PDO1_W2", canrx(0x181,32,I16), -32768, 32768 }
scope.ch[3]={"PDO1_W3", canrx(0x181,48,I16), -32768, 32768 }
scope.show(1) ; REM open the "plotter" tab in the scope window

Siehe auch: Beschreibung des Plot-Fensters zur Darstellung des zeitlichen Verlaufs einzelner Signale in Echtzeit.

Funktionen für die CAN-Bus-Fehlerstatistik

can[index].nErrorFrames
Liefert die Anzahl der seit dem letzten "Counter-Reset" empfangenen Error Frames auf dem angegebenen CAN-Kanal (mit Null-basiertem Index). Diese Funktion steht nur bei geeigneten CAN-Interfaces (z.B. Kvaser) zur Verfügung. Fehlt die Angabe von [index], wird der erste aktive CAN-Kanal verwendet.

can[index].nRxFrames
Liefert die Anzahl der seit dem letzten "Counter-Reset" vom CAN-Tester auf dem angegebenen Kanal (mit Null-basiertem Index) empfangenen CAN- und CAN-FD-Telegramme ("Messages"). Fehlt die Angabe von [index], wird der erste aktive CAN-Kanal verwendet.
Die Summe der auf allen Kanälen empfangenen CAN-Messages wird auch im Hauptfenster in der Statuszeile oberhalb der Empfangsliste angezeigt.

can[index].nTxFrames
Liefert die Anzahl der seit dem letzten "Counter-Reset" per CAN-Tester gesendeten CAN / CAN-FD-Telegramme.
Die Summe aller gesendeten Telegramme wird auch im Hauptfenster in der Statuszeile oberhalb der Sende-Liste angezeigt.

can.testDuration_sec
Liefert die aktuelle Laufzeit des CAN-Tests in Sekunden, seit dem letzten "Counter-Reset" (d.h. Rücksetzen der Message-, Error-Frame-, und sonstiger Fehlerzähler). Die Applikation (Test-Script) kann damit z.B. einen Fehlerzähler in eine durchschnittliche Fehlerrate (Frequenz) umrechnen.


CANopen-spezifische Kommandos

obj (alias obd)
Diverse Befehle zum Zugriff auf das eigene (lokale) CANopen-Objekt-Directory.
sdo_r, sdo_w
Diverse Befehle zum Zugriff auf ein entferntes (remote) CANopen-Objekt-Directory per SDO ("Service Data Object").


Symbole für CANopen- und andere Datentypen

Einige Interpreterbefehle (und -Funktionen) benötigen als Parameter den Typ eines zu empfangenden oder zu sendenden Wertes. Dazu werden in erster Linie CANopen-kompatible Datentypen eingesetzt. Der Interpreter erwartet diese Typen in symbolischer Schreibweise (nicht als Zahlencode wie in der CANopen-Spezifikation ! ! ).

Zur Zeit unterstützt werden :

Siehe auch:



Utility für Firmware-Update per CAN-Bus

Die Beschreibung des Utilities für Firmware-Update per CAN-Bus wurde in ein separates Dokument ausgelagert.

Links

Dateien:

alte Anleitungen für DOS-CAN-Tester


Internet:

Inhalt der 'MKT-CD' (mittlerweile online verfügbar; enthält u.A. den Installer für MKT's CAN-Tester)

Homepage von MKT Systemtechnik
Hard- und Softwareprodukte von MKT, mit Download-Bereich (in dem der CAN-Tester anno 2010 allerdings nicht zu finden war)

CAN in Automation (CiA)
Hier gibt's alle Informationen zum Thema CANopen..

Zurück zum Seitenbeginn

Nutzungsbedingungen, Haftungsausschluß

.. sind in der 'Index'-Datei unter Nutzungsbedingungen, Haftungsausschluß zu finden.

Letzte Änderungen

Neueste Änderung zuerst ! Datum im ISO 8601-Format : YYYY-MM-DD .

2024-04-18, V1.7x:
Neue graphische Steuerelemente im benutzerdefinierten Fenster, z.B. Schieberegler.

2020-01-24, V1.69:
Anzeige des momentan verwendeten CAN-Bit-Timings (besonders wichtig für CAN FD).

2019-12-16, V1.68:
Ersatz von Borland's "TIniFile" durch "TMemIniFile", um die Konfigurationsdatei nicht mehr im Windows-Verzeichnis ablegen zu müssen.

2019-08-27, V1.67:
Support für CAN FD, bislang allerdings nur für CAN Interfaces von Kvaser.

2017-09-25, V1.66:
Inspektion von Variablenwerten durch 'Überfahren' mit der Maus,
Start des Test-Scripts auch per 'Run from Label' / 'Ab LABEL-Position fortsetzen',
Firmware-Update per CANopen (SDO)

2014-02-05, V1.56:
Diverse Änderungen beim Aufzeichnen von CAN-Messages als Vector-ASCII-Logfile.
Da aus nicht nachvollziehbaren Gründen die Zeitmarken (in CANape) nicht korrekt wiedergegeben wurden, wird nun zusätzlich zum Datum im Datei-Header ein (und eigentlich unnötiger) 'Begin Triggerblock' / 'End Triggerblock' in der .asc-Datei geschrieben.

2013-06-14, V1.53:
Das Firmware-Update-Utility vergleicht nun die Software-Artikel-Nummer des Bootloaders im zu programmierenden Gerät mit dem von der zu ladenden Firmware erwarteten Wert. Stimmt die SW-Artikel-Nummer des Bootloaders nicht überein, wird (i.A.) der Firmware-Update verweigert.
Dadurch soll sichergestellt werden, dass der Anwender nicht eine 'falsche' Firmware in das momentan angeschlossene Gerät lädt. Bei Geräten mit LPC1788 hat dies nämlich den unangenehmen Effekt, dass das Gerät danach zur Reparatur (Flashen per FlashMagic) an den Hersteller eingeschickt werden muss.

2007-04-12, V1.34:
Firmware-Update-Utility für ARM7 (NXP LPC2xxx) aufgebohrt, u.A. auch die Korrektur der Prüfsumme in der ARM7-Vektor-Tabelle, denn sonst startet der IAP-Bootloader die Applikation nicht ! Details hier .

2006-11-14, V1.33:
Dokumentation angepasst. Zahlreiche neue Funktionen im CAN-Tester, z.B. CAN-Text-Terminal zum Debuggen, Kommentierung von CANopen-Telegrammen, OD-Scanner, etc.

2005-04-07, V1.20:
Tool zum "Firmware-Update via CAN" eingebaut.

2004-09-09, V1.12:
Anzahl der im Tester eingebauten SDO-SERVER(!) auf 8 erhöht, um "mehr CANopen-Slaves" zu simulieren.


2003-07-30, V1.07:
Baudrate 666.666 kBit/sec für PCAN-API2 implementiert. Wird in Auswahllisten als "667 kBit/sec" angezeigt.

Zurück zum Seitenbeginn

Troubleshooting


Problem:
Vom Anwender erstellte Test-Scripte können nicht im dafür vorgesehenen Unterverzeichnis des CAN-Testers abgespeichert werden.
Mutmaßliche Ursache:
Windows erlaubt keine Schreibzugriffe, wenn das Programm z.B. unter "Programme (x86)" installiert wurde.
Abhilfe:
Installieren Sie das Programm dort, wo Dateien in Unterverzeichnissen für den Anwender schreibbar sind. Aus diesem Grund war die Voreinstellung des Installers auch
  C:\MKT\CAN_Tester_for_Windows
statt z.B. unter
  C:\Program Files (x86), C:\Programme, etc, etc, etc, etc.
Alternativ: Fragen Sie Ihren System-Administrator, in welchem Verzeichnis Ihre 'Anwenderdaten' (passend zur verwendeten Windows-Version) abgespeichert werden sollen (z.B. C:\Users\???\...\???\...), und passen Sie im CAN-Tester die Einstellungen unter Verzeichnisse entsprechend an. Ist das Programm aufgrund paranoider Sicherheitseinstellungen nicht berechtigt, seine eigene Konfiguration in seinem eigenen Installationsverzeichnis abzuspeichern:
Der CAN-Tester speichert seine eigene Konfiguration nicht in der Windows-Registry, sondern im Interesse einer 'portablen Applikation' in seinem eigenen Verzeichnis unter dem Namen "MKT_CanTester.ini" ab. Details dazu im Kapitel Installation.


Problem:
PCAN-USB-Treiber wurde zwar installiert, MKT's CAN-Tester funktioniert aber nicht damit.
Ursache:
Bei der Installation des Peak-Treibers fehlt (meistens) die Interface-DLL, z.B. PCAN_USB.DLL für die Kommunikation mit dem PCAN-USB-Dongle.
In dem Fall erhalten Sie vom CAN-Tester im Meldungsfenster z.B. die folgende Anzeige:
UCAN_Init: PCAN-Dongle LIGHT driver (PCAN_USB.DLL) not loaded !
Abhilfe:
Die für Ihre CAN-Hardware, und für Ihr Betriebssystem passende Interface-DLL finden Sie hoffentlich auf der Peak-Webseite.
Kopieren Sie diese (abhängig von der Windows-Version) in das Windows-System-Verzeichnis, oder (wesentlich einfacher) in das Unterverzeichnis, in dem der CAN-Tester installiert wurde.
Siehe auch: Hinweise zur Installation eines CAN-Interfaces unter Windows !


Zurück zum Seitenbeginn


Zuletzt bearbeitet: 2024-02-07 (YYYY-MM-DD), W.B.