smiocan
Configuration des modules smartIO via CAN
En général, les modules smartIO sont programmés et configurés via l'interface USB intégrée. La programmation s'effectue en production à l'aide d'outils adaptés, la configuration avec optiCONTROL ou un programme de terminal.
Pour la famille d'appareils smartIO basée sur un contrôleur ESP, ces fonctions sont désormais également disponibles sur le terrain, via le bus CAN. Le programme utilitaire
smiocan <options>
sert à cet effet ; il est disponible en ligne de commande sous Yocto. Le programme requiert une interface socket-CAN et est donc également disponible sur demande pour d'autres distributions Linux.
Une seule connexion administrative à la fois peut et doit être établie avec l'appareil ! L'établissement de la connexion est protégé par une procédure seed-key et par la clé de mot de passe de l'appareil, de sorte que les composants logiciels impliqués puissent au moins être validés.
Toute intervention administrative via SCPI (série-USB ou CAN) ou tout téléversement de firmware peut influencer le traitement des données dans le smartIO concerné. Il n'est pas garanti que le débit de données réglé ou les cadences d'émission des messages CAN soient respectés exactement pendant toute la durée de la communication !
Options en ligne de commande
Les options transmises au programme en ligne de commande permettent d'appeler des réglages et des fonctions obligatoires ainsi que facultatifs.
| Short | Long | Parameter | Description | Exemple |
|---|---|---|---|---|
| -h | --help | Affichage des options de ligne de commande | -h | |
| -p | --port | <str> | Obligatoire : nom du port CAN pour établir la connexion p. ex. can0, can1, can2, ... | -p can1 |
| -B | --baud | <uint>[k] | Réglage du débit en bauds ; la lettre k peut être utilisée pour la mise à l'échelle | -B 500k |
| -G | --gpio | <uint> | Positionner le GPIO pour activer le matériel CAN auto : automatiquement selon le type d'appareil et le port 0x<c><p><l> : avec codage pour la puce d'E/S <c>, la broche d'E/S <p> et la logique <l>, p. ex. 0x251 - puce 2, broche 5, logique 1 | -G auto |
| -U | --utc | <uint> | ID CAN pour la diffusion (broadcast) de l'heure UTC (déf. : 0x10) désactivé : 0x0 | -U 0x10 |
| -T | --txid | <uint> | Canal ISO-TP+ vers le smartIO (déf. : 0x11) | -T 0x11 |
| -R | --rxid | <uint> | Canal ISO-TP+ depuis le smartIO (déf. : 0x12) | -R 0x12 |
| -d | --dump | <uint> | Dump des messages CAN dans le journal de la bibliothèque, masque de bits combiné par OU de 0x0001 : envoyé 0x0010 : reçu, interprété 0x0020 : reçu, inconnu 0x0100 : ISO-TP 0x0200 : ISO-TP, extension 0x0400 : diffusion de l'heure UTC | -d 0xF00 |
| -E | --liblog | <str> | Sortie des messages de la bibliothèque dans ce fichier (au lieu de cout/cerr) | -E smiocan.log |
| -e | --liblevel | <str> | Seuil de sortie des messages, 0..7 ou DEBUG, DUMP, SCPI, SYSTEM, INFO, WARNING, ERROR, FATAL | -e DUMP |
| -D | --devlog | <str> | Journal des sorties de l'appareil et des commandes SCPI | -D device.log |
| -Q | --query | Interrogation et affichage de tous les systèmes smartIO ESP présents sur le bus CAN sélectionné | ||
| -k | --pwkey | <uint> | Clé de mot de passe pour l'établissement (automatique) de la connexion aux appareils énumérés | -k 123456 |
| -H | --hello | <serno> <pwkey> | Ouvre la connexion à l'appareil avec numéro de série et clé de mot de passe1 Peut être indiqué plusieurs fois | -H 24006200025 123456 |
| -c | --command | <str> | Ajoute une commande à la liste de commandes Peut être indiqué plusieurs fois | -c "*idn?" |
| -s | --script | <str> | Envoie les commandes du fichier de script | -s batch.txt |
| -x | --xfwimage | <str> | Séquence étendue pour la mise à jour automatisée du firmware de l'appareil | -x newFW.bin |
| -i | --interactive | Démarre le mode interactif pour la configuration de l'appareil |
Pour l'exécution des séquences de commandes, l'ordre suivant s'applique :
- Toutes les commandes définies avec
-c - Toutes les commandes du fichier de script / batch indiqué avec
-s - La séquence de commandes pour la mise à jour du firmware
-x - Passage en mode interactif
-i
Commandes de déroulement
En mode interactif et dans le script, des commentaires peuvent être utilisés après // dans chaque ligne.
Toutes les commandes de l'option -c, du fichier de script -s ou du mode interactif sont envoyées au smartIO sous forme de commandes SCPI, sauf si elles appartiennent au jeu de commandes réservées énuméré ci-dessous :
| Commande | Parameter | Description |
|---|---|---|
| help | Affiche les commandes de déroulement disponibles avec leur description | |
| quit | Ferme la connexion et quitte l'application | |
| query | Exécute l'interrogation des appareils, comme '-Q' | |
| open | [<serno> [<pwkey>]] | Ouvre un smartIO donné, comme '-H', les paramètres omis sont complétés par la valeur utilisée précédemment. |
| select | (help/[:<term>:]) | Requêtes de sélection sur la réponse *idn? de l'appareil, help ne peut être exécuté que si une connexion à un appareil existe. |
| close | [<serno>] | Ferme la connexion actuelle ou une connexion donnée |
| next | Établit la connexion au prochain appareil listé ('-Q', '-H'). | |
| reset | [<serno>] | Exécute un RESET sur tous les appareils smartIO ou sur un appareil donné. |
| upload | <path> [<mode>] | Charge une nouvelle image firmware sur l'appareil et pour mode = flash : flasher uniquement active : flasher et activer auto : flasher, activer et reset (déf.) |
| sleep | <uint> | Retarde la suite de l'exécution de la durée définie en millisecondes, p. ex. pour un redémarrage d'appareil déclenché |
| filter | [:<code>:] | Liste de filtres pour les sorties de débogage |
Télégramme d'heure UTC
Pendant l'accès administratif à l'appareil, il est judicieux de régler correctement l'heure de l'appareil. Cela s'effectue automatiquement via le télégramme d'heure UTC, que smiocan distribue périodiquement à tous les smartIO après son démarrage, d'abord 10 fois à la seconde, puis une fois par minute. En réglant l'ID du télégramme sur 0, la fonction est désactivée.
Mode interactif
En mode interactif, des commandes SCPI pour interroger et régler les fonctions de l'appareil peuvent être envoyées directement au smartIO. Cela correspond - à l'exception de la fonction d'édition et de l'historique en ligne de commande, qui ne sont pas disponibles - à l'interface de terminal via la connexion USB.
Pour cela, les commandes sont envoyées en bloc au smartIO via l'interface ISO-TP+ à la validation de la saisie de la ligne. La réponse y est collectée et renvoyée en bloc à smiocan. Pour cette raison, les commandes SCPI spéciales, comme *REPeat, qui produisent une sortie continue dans le terminal, ne sont pas autorisées via cette interface.
L'invite de ligne de commande contient l'interface CAN utilisée ainsi que l'état de la connexion (si aucune connexion n'est établie) ou le numéro de série et la version du firmware de l'appareil sélectionné.
Un exemple1 d'interrogation et de réglage interactifs du type de mesure et de la plage de mesure d'un module smartIO 8x24 :
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:~#
Sélection des appareils pour l'administration "select"
Dès que plusieurs ou tous les smartIO sont sélectionnés en ligne de commande au moyen de -Q et -k ou de -H, les commandes définies ou le fichier de script sont appliqués successivement à tous les appareils. Il devient alors nécessaire de restreindre à nouveau, au moyen d'un filtre, les appareils à administrer, p. ex. d'après le numéro de série, la version du firmware ou la date de production.
La commande select exécute pour cela d'abord une interrogation *idn? sur l'appareil. La réponse pourrait se présenter ainsi :
optiMEAS, smartIO, 8X24, 1, 24006200011, 1.35, 0, Dec 5 2024 13:52:28, 202400301
Les champs de données de la réponse sont associés comme suit :
| Key | Value | Type | Description |
|---|---|---|---|
| comp | optiMEAS | <str> | Fabricant |
| fwd | Dec 5 2024 13:52:28 | <datetime> | Date du firmware |
| fwv | 1.35 | <float> | Version du firmware |
| hwv | 0 | <float> | Version matérielle |
| model | 8X24 | <str> | Désignation du modèle |
| prod | 202400301 | <datetime> | Date de production |
| serno | 24006200011 | <uint> | Numéro de série |
| type | smartIO | <str> | Famille/type d'appareil |
| var | 1 | <uint> | Variante de l'appareil |
La commande select reçoit alors une liste d'arguments individuels, à séparer par des espaces ou des tabulations.
Si le premier argument est help, l'association de la réponse actuellement disponible de l'appareil est affichée en aide, avec la syntaxe décrite ici.
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 being the default link of the comparing terms anyhow.
For strings <op> is one of '==', '!=', value is a case insensitive regular expression
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'
Un argument peut être un opérateur booléen && (ET) ou || (OU). L'opérateur || relie alors les termes liés par && (forme normale disjonctive).
Trois arguments consécutifs forment des termes de comparaison de valeurs qui fournissent un résultat booléen (false/true). Un tel terme a toujours la structure suivante :
<term> := <key> <op> <value>
Plusieurs termes peuvent être énumérés à la suite. Les résultats individuels sont alors implicitement combinés par && si aucun opérateur booléen n'est indiqué.
La clé <key> est à prendre dans le tableau ci-dessus (ou dans l'aide) et sert d'espace réservé pour la valeur correspondante de l'interrogation *idn?.
Pour le type de données <str>, seuls les opérateurs de comparaison == (égal) et != (différent) sont à utiliser comme opérateur <op>. <value> est alors considéré comme une expression régulière2 (insensible à la casse), à placer entre guillemets.
Pour tous les autres types de données, les opérateurs usuels <, <=, ==, !=, >= et > sont autorisés et <value> correspond au type de données de la clé.
Les dates valides sont : Oct 28 2024, 10/28/2024, 28.10.2024, 2024-10-28 et 20241028, qui peuvent être complétées, après une espace, par une heure de la forme 13:29:37, 132937, 13:29 ou 1329. Si cette date ou cette heure contient elle-même une espace, elle doit être placée entre guillemets.
Dès que le résultat des comparaisons et des opérateurs booléens donne un résultat univoque, la commande suivante de la séquence est exécutée si le résultat est true ; si le résultat est false, l'exécution de la séquence de commandes est interrompue et la connexion à l'appareil est fermée. La connexion au prochain smartIO trouvé (-Q) ou listé (-H) est alors établie afin d'exécuter à nouveau la même séquence de commandes. En enchaînant plusieurs commandes select, la sélection pour l'administration peut être restreinte de plus en plus.
Exemples d'instructions select :
// 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 Hardwareversion ab 2 oder Firmware ab 1.60
select type == "smartIO"
select hwv >= 2 || fwv >= 1.6
Mise à jour du firmware de l'appareil "-x, --xfwimage"
Pour installer un nouveau firmware sur un appareil smartIO, il faut d'une part la nouvelle image firmware, livrée sous forme de fichier *.bin et mise en cache p. ex. sur la carte SD externe ou sur le lecteur temporaire, d'autre part une connexion CAN stable avec l'appareil. La transmission du firmware est surveillée, de sorte qu'un logiciel incomplet, défectueux ou non validé ne puisse pas être installé sur l'appareil. Comme la transmission peut toutefois prendre plusieurs minutes, une connexion stable est recommandée.
Pendant la transmission, le reste de l'activité de mesure et la communication via le bus CAN peuvent se poursuivre. Tous les réglages de l'appareil et l'étalonnage d'usine sont conservés après la mise à jour, sauf si des modifications de l'étendue fonctionnelle du nouveau firmware rendent des réglages superflus ou les implémentent sous une autre forme.
Il est recommandé de consigner dans un fichier journal la communication avec chaque appareil lors de la mise à jour du firmware, p. ex. -D fwUpdate.log
Avec l'option -x ou --xfwimage, la séquence de commandes suivante est exécutée pour installer le firmware sur l'appareil et consigner les informations d'état avant et après la mise à jour :
*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
Exemples d'utilisation
Mise à jour du firmware pour tous les appareils
L'exemple installe une nouvelle image firmware theNewFirmwareImage.bin sur tous les appareils du bus CAN can1 et consigne le résultat dans le fichier fwUpdate.log
smiocan -p can1 -Q -k 123456 -D fwUpdate.log -x theNewFirmwareImage.bin
Configuration pour une instrumentation spécifique
Pour un smartIO 8x24, un fichier commenté est préparé pour la configuration des réglages des canaux et du bus CAN. Afin de garantir que ce fichier soit appliqué exclusivement au système monté dans l'armoire électrique, le numéro de série est vérifié au début.
Les commentaires contiennent des indications sur les plages de mesure, la linéarisation ou encore les désignations ou numéros de série des capteurs raccordés.
Contenu du fichier 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.5625, -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
Transfert du fichier de configuration vers l'appareil :
smiocan -p can1 -H 24006200011 123456 -D devConfig.log -s config_target24006200011.txt