Zum Hauptinhalt springen

smiocan

Konfiguration von smartIO Modulen über CAN

Im allgemeinen werden smartIO Module über die eingebaute USB Schnittstelle programmiert und konfiguriert. Die Programmierung erfolgt mit geeigneten Werkzeugen in der Produktion, die Konfiguration mittels optiCONTROL oder einem Terminalprogramm.

Für die auf einem ESP Controller basierende smartIO Gerätefamilie sind diese Funktionen nun auch im Prozessfeld über den CAN-Bus verfügbar. Dazu dient das Hilfsprogramm

smiocan <options>

das über die Kommandozeile im Yocto verfügbar ist. Das Programm erwartet eine socket-CAN Schnittstelle und ist somit auch für andere Linux-Distributionen auf Anfrage verfügbar.

Es kann und darf zeitgleich immer nur eine administrative Verbindung zum Gerät aufgebaut werden! Der Verbindungsaufbau ist über ein Seed-Key-Verfahren und den Geräte Password-Key geschützt, sodass zumindest die beteiligten Software-Komponenten validiert werden können.

Jeder administrative Eingriff über SCPI (Seriell-USB oder CAN) oder ein Firmware-Upload kann die Datenverarbeitung im angesprochenen smartIO beeinflussen. Es kann nicht garantiert werden, dass für die Dauer der Kommunikation die eingestellte Datenrate oder Ausgabetakte für CAN Botschaften exakt eingehalten werden!

Optionen auf der Kommandozeile

Über Optionen, die dem Programm in der Kommandozeile übergeben werden, sind verpflichtende, aber auch optionale Einstellungen und Funktionen aufrufbar.

ShortLongParameterBeschreibungBeispiel
-h--helpAusgabe der Kommandozeilen-Optionen-h
-p--port<str>Verpflichtend: CAN-Port-Name zum Aufbau der Verbindung
z.B. can0, can1, can2, ...
-p can1
-B--baud<uint>[k]Einstellung der Baudrate, der Buchstabe k kann für die Skalierung 1000\cdot 1000 verwendet werden-b 500k
-G--gpio<uint>Setzte GPIO, um CAN Hardware einzuschalten
auto: automatisch mit Bezug auf Gerätetyp und Port
0x<c><p><l>: mit Kodierung für IO-Chip <c>, IO-Pin <p> und Logik <l>,
z.B. 0x251 - chip 2, pin 5, logic 1
-G auto
-U--utc<uint>CAN id für UTC Zeit-Broad-Cast
(def.: 0x10)
disabled: 0x0
-U 0x10
-T--txid<uint>ISIO-TP+ Kanal zum smartIO
(def.: 0x11)
-T 0x11
-R--rxid<uint>ISO-TP+ Kanal vom smartIO
(def.: 0x12)
-R 0x12
-d--dump<uint>Dump CAN Botschaften ins library-log, ver-ODER-te Bitmaske von
0x0001: gesendet
0x0010: empfangen, interpretiert
0x0020: empfangen, unbekannt
0x0100: ISO-TP
0x0200: ISO-TP, Erweiterung
0x0400: UTC Zeit-Broad-Cast
-d 0xF00
-E--liblog<str>Ausgabe der Bibliotheksmeldungen in diese Datei
(statt cout/cerr)
-E smiocan.log
-e--liblevel<str>Ausgabeschwelle für Meldungen, 0..7 bzw.
DEBUG, DUMP, SCPI, SYSTEM, INFO, WARNING, ERROR, FATAL
-e DUMP
-D--devlog<str>Protokoll der Geräteausgaben und SCPI-Befehle-D device.log
-Q--queryAbfrage und Ausgabe aller smartIO ESP Systeme am gewählten CAN-Bus
-k--pwkey<uint>Passwort-Key zum (automatischen) Aufbau der Verbindung zu den aufgeführten Geräten-k 123456
-H--hello<serno> <pwkey>Öffne Verbindung zum Gerät mit Seriennummer und Passwort-Key1
Mehrfachangabe möglich
-H 24006200025 123456
-c--command<str>Fügt einen Befehl zur Befehlsliste hinzu
Mehrfachangabe möglich
-c "*idn?"
-s--script<str>Sendet die Befehle aus der Script-Datei-s batch.txt
-x--xfwimage<str>Erweiterte Sequenz zum automatisierten Update der Geräte-Firmware-x newFW.bin
-i--interactiveStartet den interaktiven Modus zur Konfiguration des Gerätes

Für die Ausführung von Befehlssequenzen gilt folgende Reihenfolge:

  1. Alle mit -c definierten Befehle
  2. Alle Befehle aus der angegebenen Script / Batch-Datei -s
  3. Die Befehlssequenz für das Firmware Update -x
  4. Wechsel in den interaktiven Mode -i

Ablauf-Befehle

Im interaktiven Modus und im Script können Kommentare nach // in den einzelnen Zeilen verwendet werden.

Alle Befehle der Option -c, der Script-Datei -s oder im interaktiven Modus werden als SCPI-Befehl an das smartIO gesendet, sofern sie nicht zu dem im Folgenden aufgeführten reservierten Befehlssatz gehören:

BefehlParameterBeschreibung
helpZeigt die verfügbaren Ablauf-Befehle mit Beschreibung an
quitVerbindung schließen und Anwendung beenden
queryGeräteabfrage ausführen, wie '-Q'
open[<serno> [<pwkey>]]Öffne ein bestimmtes smartIO, wie '-H',
weggelassene Parameter werden durch den zuvor verwendeten Wert ergänzt.
select(help/[:<term>:])Auswahl-Abfragen auf die Geräte-Antwort *idn?,
help kann nur ausgeführt werden, wenn die Verbindung zu einem Gerät besteht.
close[<serno>]Schließe die aktuelle oder eine bestimmte Verbindung
nextBaut die Verbindung zum nächsten gelisteten Gerät ('-Q', '-H') auf.
reset[<serno>]Führe einen RESET auf alle smartIO Geräte oder ein bestimmtes Gerät aus.
upload<path> [<mode>]Lade ein neues Firmware-Image auf das Gerät und für mode =
flash: nur flashen
active: flashen und aktivieren
auto: flashen, aktivieren und reset (Def.)
sleep<uint>Verzögere die weitere Ausführung um die definierte Zeit in Milli-Sekunden, z.B. für einen ausgelösten Geräte-Neustart
filter[:<code>:]Filter-Liste für Debug-Ausgaben

UTC Zeit-Telegramm

Während des administrativen Zugriffs auf das Gerät ist es sinnvoll, die Gerätezeit korrekt einzustellen. Dies geschieht automatisch über das UTC-Zeittelegramm, das von smiocan nach dem Start an alle smartIO periodisch verteilt wird, zunächst 10 mal im Sekundentakt, danach einmal in der Minute. Durch Setzen der Telegramm-ID auf 0 wird die Funktion abgeschaltet.

Interaktiver Modus

Im interaktiven Modus können direkt an das smartIO SCPI-Befehle zur Abfrage und zum Einstellen der Gerätefunktionen gesendet werden. Dies entspricht - bis auf die nicht verfügbare Editierfunktion und Historie in der Kommandozeile - der Terminal-Schnittstelle über die USB Verbindung.

Dazu werden die Befehle mit Abschluss der Zeileneingabe als Block über die ISO-TP+ Schnittstelle an das smartIO geschickt. Die Antwort wird dort gesammelt und im Block zurück an smiocan geschickt. Aus diesem Grund sind spezielle SCPI-Befehle, wie z.B. *REPeat, die eine fortlaufende Ausgabe im Terminal erzeugen, über diese Schnittstelle nicht zulässig.

Der Kommandozeilen-Prompt enthält die verwendete CAN-Schnittstelle sowie den Verbindungsstatus (falls nicht verbunden) oder die Seriennummer und Firmwareversion des gewählten Gerätes.

Ein Beispiel1 für die interaktive Abfrage und Einstellung von Messart und Messbereich eines smartIO 8x24 Moduls:

root@smartrail-8037:~# smiocan -p can1 -H 24006200011 123456 -i
can1[24006200011,1.35]: *idn?
optiMEAS, smartIO, 8X24, 1, 24006200011, 1.35, 0, Dec 5 2024 13:52:28, 202400301
can1[24006200011,1.35]: adc:cur? all
0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
can1[24006200011,1.35]: adc:cur 4, 1; adc:cur 5,1
OK
OK
can1[24006200011,1.35]: adc:cur? all
0: 0
1: 0
2: 0
3: 0
4: 1
5: 1
6: 0
7: 0
can1[24006200011,1.35]: adc:gai? all
0: 1
1: 1
2: 1
3: 1
4: 1
5: 1
6: 1
7: 1
can1[24006200011,1.35]: adc:gai 1,8; adc:gai 3,4; adc:gai 6,8
OK
OK
OK
can1[24006200011,1.35]: adc:gai? all
0: 1
1: 8
2: 1
3: 4
4: 1
5: 1
6: 8
7: 1
can1[24006200011,1.35]: close
can1[csDisabled]: quit
root@smartrail-8037:~#

Geräteauswahl zur Administration "select"

Sobald über die Kommandozeile mittels -Q und -k oder -H mehrere/alle smartIO ausgewählt werden, werden die definierten Kommandos oder das Script-File nacheinander auf alle Geräte appliziert. Damit ensteht die Notwendigkeit, über ein Filter die zu administrierenden Geräte wieder einzuschränken, z.B. über die Seriennummer, den Firmware-Stand oder das Produktionsdatum.

Der Befehl select führt dazu zunächst eine *idn? Abfrage auf dem Gerät aus. Die Antwort könnte wie folgt aussehen:

optiMEAS, smartIO, 8X24, 1, 24006200011, 1.35, 0, Dec 5 2024 13:52:28, 202400301

Die einzelnen Datenfelder der Antwort werden wie folgt zugeordnet:

KeyValueTypBeschreibung
compoptiMEAS<str>Hersteller
fwdDec 5 2024 13:52:28<datetime>Firmware-Datum
fwv1.35<float>Firmware-Version
hwv0<float>Hardware-Version
model8X24<str>Modellbezeichnung
prod202400301<datetime>Produktionsdatum
serno24006200011<uint>Seriennummer
typesmartIO<str>Gerätefamilie/-typ
var1<uint>Gerätevariante

Der Befehl select bekommt nun eine Liste von einzelnen Argumenten, die durch Leerzeichen oder Tabulator voneinander zu trennen sind.

Falls das erste Argument help ist, wird die Zuordnung der aktuell verfügbaren Geräte-Antwort zusammen mit der hier beschriebenen Syntax als Hilfe ausgegeben.

can1[24006200011,1.35]: select help
optiMEAS, smartIO, 8X24, 1, 24006200011, 1.35, 0, Dec 5 2024 13:52:28, 202400301
select [:<terms>:]
Process the <terms> list finding a positive decision to continue the script.
Therefore <terms> are implicitly connected with && (AND) unless an || (OR) is placed.
If the condition fails, the command sequence is terminated and execution is restarted
on the next device
The command first request the device idn-string and parses it for its components:
e.g.: 'optiMEAS, smartIO, 8X24, 1, 24006200011, 1.35, 0, Dec 5 2024 13:52:28, 202400301'
<key> = <value> interpreted as...
----- ---------------- -----------------
comp 'optiMEAS' <string>
fwd 'Dec 5 2024 13:52:28' <date[time]>
fwv '1.35' <float>
hwv '0' <float>
model '8X24' <string>
prod '202400301' <date[time]>
serno '24006200011' <unsigned int>
type 'smartIO' <string>
var '1' <unsigned int>
A term is either
- of the format <key> <op> <value> (use always white space as sep!)
- a single '||' to logically OR the implicit &&-sequences
- a single '&&' which is ignored beeing the default link of the comparing terms anyhow.
For strings <op> is one of '==', '!=', value is a case insensitive regular expresion
For all numeric types <op> is one of '<' '<=' '==' '!=' '>=' '>', value is of same type as key
Valid <date> formats are any of: 'Oct 28 2024', '10/28/2024', '28.10.2024', '2024-10-28', '20241028'
Valid optional time extensions are: '<date> 13:29:37', '<date> 132937', '<date> 13:29', '<date> 1329'

Ein Argument kann ein boolscher-Operator && (UND) oder || (ODER) sein. Dabei verbindet der ||-Operator die mit && verknüpften Terme (Disjunktive Normalform).

Drei aufeinanderfolgende Argumenten bilden Terme für Wertevergleiche, die ein boolsches Ergebnis (false/true) liefern. Ein solcher Term hat immer den folgenden Aufbau:

<term> := <key> <op> <value>

Mehrere Terme können nacheinander aufgeführt werden. Dabei werden die einzelnen Ergebnisse implizit mit && verknüpft, wenn kein boolscher Operator angegeben wird.

Der Schlüssel <key> ist der oben aufgeführten Tabelle (oder Hilfe) zu entnehmen und ist Platzhalter für den entsprechenden Wert aus der *idn? Abfrage.

Für den Datentyp <str> sind ausschließlich die Vergleichsoperatoren == (gleich) und != (ungleich) als Operator <op> zu verwenden. Dafür wird <value> als Regular-Expression2 angesehen (case-insensitive), der in Anführungszeichen einzuschließen ist.

Für alle anderen Datentypen sind die üblichen Operatoren <, <=, ==, !=, >= und > zulässig und <value>entspricht dem Datentyp des Schlüssels.

Gültige Datumsangaben sind: Oct 28 2024, 10/28/2024, 28.10.2024, 2024-10-28 und 20241028, die nach einem Leerzeichen optional durch eine Zeitangabe der Form 13:29:37, 132937, 13:29 oder 1329 ergänzt werden können. Wenn diese Datums- oder Zeitangabe selbst ein Leerzeichen enthält, ist sie mit Anführungszeichen einzuschließen.

Sobald das Ergebnis der Vergleiche und boolschen Operatoren ein eindeutiges Ergebnis liefert, wird bei true der nächste Befehl der Kommandosequenz ausgeführt oder bei false die Ausführung der Kommandosequenz abgebrochen und die Verbindung zum Gerät geschlossen. Die Verbindung zum nächsten gefundenen (-Q) oder gelisteten (-H) smartIO wird aufgebaut, um die selbe Kommandosequenz erneut auszuführen. Durch die Reihung mehrerer select Befehle kann die Auswahl zur Administration immer weiter eingeschränkt werden.

Beispiele für select Anweisungen:

// alle Geräte mit Firmware-Version vor 1.3
select fwv < 1.3

// alle Geräte mit 8 Kanälen und Produktionsdatum vor Juni 2024
select model == "8x.*" prod < 20240601

// alle "smartIO" mit Harwareversion ab 2 oder Firmware ab 1.60
select type == "smartIO"
select hwv >= 2 || fwv >= 1.6

Update der Gerätefirmware "-x, --xfwimage"

Um neue Firmware auf ein smartIO Gerät aufzuspielen, ist zum einen das neue Firmware-Image erforderlich, das in Form eines *.bin-Files ausgeliefert und z.B. auf der externen SD-karte oder dem temporären Laufwerk zwischengespeichert wird, zum anderen eine stabile CAN Verbindung zum Gerät. Die Übertragung der Firmware wird überwacht, sodass unvollständige, fehlerhafte oder nicht validierte Software nicht auf dem Gerät installiert werden kann. Da jedoch die Übertragung einige Minuten in Anspruch nehmen kann, ist eine stabile Verbindung sinnvoll.

Während der Übertragung kann der übrige Messbetrieb und die Kommunikation über den CAN Bus weiterlaufen. Alle Geräteeinstellungen und die Werkskalibrierung bleiben nach dem Update erhalten, sofern nicht durch Änderungen im Funktionsumfang der neuen Firmware Einstellungen überflüssig oder in anderer Form implementiert werden.

Es wird empfohlen, die Kommunikation mit den einzelnen Geräten für den Firmware-Update in einer Log-Datei zu protokollieren, z.B. -D fwUpdate.log

Mit der Option -x oder --xfwimage wird folgende Kommandosequenz ausgeführt, um die Firmware auf das Gerät zu installieren und Statusinformation vor und nach dem Update-Vorgang zu protokollieren:

*idn?
update:info?
system:admin 1,<pwkey>
upload "<path>" active
update:info?
reset <serno>
sleep 1500
open
update:info?
close // only non-interactive mode
next // only non-interactive mode

Anwendungsbeispiele

Firmware-Update für alle Geräte

Das Beispiel bringt ein neues Firmware-Image theNewFirmwareImage.bin auf alle Geräte am CAN-Bus can1 und protokolliert das Ergebnis in der Datei fwUpdate.log

smiocan -p can1 -Q -k 123456 -D fwUpdate.log -x theNewFirmwareImage.bin

Konfiguration für individuelle Sensorik

Für ein smartIO 8x24 wird eine kommentierte Datei zur Konfiguration der Kanal und CAN-Bus Einstellungen vorbereitet. Um sicherzustellen, dass diese Datei ausschließlich auf dem im Schaltschrank montierten System appliziert wird, wird die Seriennummer am Anfang geprüft.

Die Kommentare enthalten Hinweise zu den Messbereichen, der Linearisierung oder auch Bezeichnungen oder Seriennummern der angeschlossenen Sensoren.

Inhalte der Datei config_target24006200011.txt:

// no other device!
select serno == 24006200011

// Clear all channel settings
adc:cur all, 0 // Voltage mode
adc:gai all, 1 // Gain 1 -> +-160V
adc:pol all, 0 // no linearization
adc:uni all, - // use default units 'V', 'mA'

// [0] channel 1: Voltage +-10V, no linearisation
adc:cur 0, 0; adc:gai 0, 16

// [1] channel 2: Volumetric Sensor, Voltage +-10V,
// linearization from datasheet: V = 0.5 u^2 + 3.16 u - 0.889
adc:cur 1, 0; adc:gai 1, 16; adc:pol 1, 0.5, 3.16, 0.889; adc:uni 1, "m^3"

// [2] channel 3: Current, LEM connector, 400 A at 150 mA
// scale := 400 A/150 mA = 2.6667 A/mA, offset := 0
adc:cur 2, 1; adc:gai 2, 1; adc:pol 2, 2.6667, 0; adc:uni 2, "A"

// [3] channel 4: Current, LEM connector, 1500 A at 100 mA
// scale := 15.0 A/mA, offset := 0
adc:cur 3, 1; adc:gai 3, 2; adc:pol 3, 15.0, 0; adc:uni 3, "A"

// [4] channel 5: High Voltage, 0 .. 5V -> 10 .. 25 kV
// scale := 5.0 kV/V,
// offset at 0 V-input := 10.0 kV
adc:cur 4, 0; adc:gai 4, 32; adc:pol 4, 5.0, 10.0; adc:uni 4, "kV"

// [5] channel 6: Pressure Sensor, 4 .. 20mA -> 0 .. 25 hPa
// scale := 25 hPa/16 mA = 1.5625 hPa/mA,
// offset at 0 mA-input := -4 mA * scale = -6.25 hPa
adc:cur 5, 1; adc:gai 5, 8; adc:pol 5, 1.625, -6.25; adc:uni 5, "hPa"

// Filter Settings:
adc:tau 0.05

// Default (factory) Setup for CAN Messages
can:fac 0x636C7246

// Query and Log settings:
adc:cur? all
adc:gai? all
adc:pol? all
adc:uni? all
adc:tau?
can:msg? all

Übertragen der Konfigurationsdatei an das Gerät:

smiocan -p can1 -H 24006200011 123456 -D devConfig.log -s config_target24006200011.txt

Footnotes

  1. Der Passwort-Key ist auf Anfrage bei optiMEAS erhältlich und vertraulich zu behandeln. Der Key kann nachträglich geändert werden. 2

  2. Eine nützliches Werkzeug zum Aufbau von Regular-Expressions ist hier zu finden.