Igh Ethercat Doc FR
Igh Ethercat Doc FR
Igh Ethercat Doc FR
2
Documentation
2 Architecture 5
2.1 Module Maı̂tre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Phases du maı̂tre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 Données de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4 Interfaces Ethernet 25
4.1 Principes de base du pilote réseau . . . . . . . . . . . . . . . . . . . . . 25
4.2 Les pilotes natifs pour périphériques EtherCAT . . . . . . . . . . . . . 28
4.3 Le pilote de périphérique EtherCAT générique . . . . . . . . . . . . . . 30
4.4 Fourniture de périphériques Ethernet . . . . . . . . . . . . . . . . . . . 31
4.5 Redondance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.6 Interface de périphérique EtherCAT . . . . . . . . . . . . . . . . . . . . 32
4.7 Application de correctifs aux pilotes de réseau natifs . . . . . . . . . . . 32
5 Automates finis 35
5.1 Théorie des automates finis . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2 Le modèle d’état du maı̂tre . . . . . . . . . . . . . . . . . . . . . . . . 39
5.3 L’automate du maı̂tre . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4 L’automate d’analyse des esclaves . . . . . . . . . . . . . . . . . . . . . 42
5.5 L’automate de configuration de l’état de l’esclave . . . . . . . . . . . . 45
5.6 L’automate de changement d’état . . . . . . . . . . . . . . . . . . . . . 47
5.7 L’automate SII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.8 Les automates PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
8 Aspects temporels 85
8.1 Profilage de l’interface de programmation applicative . . . . . . . . . . 85
8.2 Mesure des cycles du bus . . . . . . . . . . . . . . . . . . . . . . . . . . 86
iv –revision–, 2021/04/20
9 Installation 89
9.1 Obtention du logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.2 Construction du logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.3 Construction de la documentation de l’interface . . . . . . . . . . . . . 92
9.4 Installation du logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.5 Création automatique des nœuds de périphériques . . . . . . . . . . . . 94
Bibliographie 95
Glossaire 96
–revision–, 2021/04/20 v
vi –revision–, 2021/04/20
Liste des tableaux
3.1 Spécifier la position d’un esclave . . . . . . . . . . . . . . . . . . . . . . 17
–revision–, 2021/04/20 ix
Conventions
Conventions
Ce document utilise les conventions typographiques suivantes :
— Le texte en italique est utilisé pour introduire des nouveaux termes et pour les
noms de fichiers.
— Le texte à chasse fixe est utilisé pour les exemples de code et les sorties
des lignes de commandes.
— Le texte en gras a chasse fixe est utilisé pour les entrées utilisateurs
dans les lignes de commandes.
Les valeurs des données et des adresses sont habituelles spécifiées en valeurs hexadécimales.
Elles sont indiquées dans le style du langage de programmation C avec le préfixe 0x
(par exemple : 0x88A4). Sauf mention contraire, les valeurs des adresses sont spécifiées
en adresse d’octets.
Les noms des fonctions sont toujours écrits avec des parenthèses, mais sans paramètre.
Ainsi, si une fonction ecrt_request_master() a des parenthèses vides, ceci n’indique
pas qu’elle ne prend pas de paramètres.
Les commandes shell à taper, sont indiquées par un prompt dollar :
Par ailleurs, si une commande shell doit être tapée en tant que le super utilisateur, le
prompt est un dièse :
x –revision–, 2021/04/20
1 Le maı̂tre EtherCAT IgH
Ce chapitre couvre les informations générales à propos du maı̂tre EtherCAT.
–revision–, 2021/04/20 1
1 Le maı̂tre EtherCAT IgH
2 –revision–, 2021/04/20
1.2 License
1.2 License
Le code source du maı̂tre est publiée selon les termes et conditions de la GNU General
Public License (GPL [4]), version 2. Les développeurs, qui veulent utiliser EtherCAT
pour les systèmes Linux, sont invités à utiliser le code source du maı̂tre ou même à
participer à son développement.
Pour autoriser la liaison statique d’une application en espace utilisateur avec l’API
du maı̂tre (voir chapitre 3), la bibliothèque pour l’espace utilisateur (voir section 7.2)
est publiée selon les termes et conditions de la GNU Lesser General Public License
(LGPL [5]), version 2.1.
–revision–, 2021/04/20 3
1 Le maı̂tre EtherCAT IgH
4 –revision–, 2021/04/20
2 Architecture
Le maı̂tre EtherCAT est intégré au noyau Linux. C’était une décision originelle de
conception, qui a été prise pour plusieurs raisons :
— Le code du noyau a des caractéristiques de temps réel significativement meilleures,
i. e. une latence plus faible que le code de l’espace utilisateur. Il était prévisible,
qu’un maı̂tre pour un bus de terrain, ait beaucoup de travail cyclique à faire.
Le travail cyclique est habituellement déclenché par des interruptions de timer
dans le noyau. Le délai d’exécution d’une fonction qui traite une interruption
de timer est moindre si elle réside dans l’espace noyau, parce qu’il n’y a pas
besoin de passer du temps à commuter le contexte vers le processus en espace
utilisateur.
— Il était prévisible, que le code du maı̂tre doive communiquer directement avec
le matériel Ethernet. Ceci doit être fait dans le noyau de toute façon (au travers
des pilotes des périphériques réseau), ce qui constitue une raison supplémentaire
pour que le code du maı̂tre soit dans l’espace du noyau.
La Figure 2.1 fournit une vue d’ensemble de l’architecture du maı̂tre.
Les composants de l’environnement du maı̂tre sont décrits ci-dessous :
Master Module Module noyau contenant une ou plusieurs instances du maı̂tre
EtherCAT (voir section 2.1), le “Device Interface” (interface du périphérique,
voir section 4.6) et l’“Application Interface” (interface de programmation ap-
plicative, voir chapitre 3).
Device Modules Modules de pilotes de périphérique Ethernet supportant Ether-
CAT qui offrent leurs périphériques au maı̂tre EtherCAT via l’interface du
périphérique (voir section 4.6). Ces pilotes réseaux modifiés peuvent gérer en
parallèle les interfaces réseaux utilisées pour les opérations EtherCAT et les in-
terfaces réseaux Ethernet “normales”. Un maı̂tre peut accepter un périphérique
particulier pour envoyer et recevoir des trames EtherCAT. Les périphériques
Ethernet déclinés par le module maı̂tre sont connectés comme d’habitude à la
pile réseau du noyau.
Application Un programme qui utilise le maı̂tre EtherCAT (habituellement pour
un échange cyclique de données de processus avec les esclaves EtherCAT).
Ces programmes n’appartiennent pas au code du maı̂tre EtherCAT 1 , mais ils
doivent être générés ou écrits par l’utilisateur. Une application peut demander
un maı̂tre via l’API (voir chapitre 3). Si la demande réussie, elle a alors le
1. Toutefois, il y a des exemples fournis dans le dossier examples/.
–revision–, 2021/04/20 5
2 Architecture
ecrt_*()
libethercat
Application
Interface
Userspace
Application
ecrt_*()
libethercat_rtdm
Application
LXRT / Xenomai Interface
Userspace
Application 'ethercat'
Tool
Userspace
Network Stack
ecrt_*()
Master 1
Application
Interface
Packet Socket
Task Master 0
Generic
Ethernet
Device
Device
Interface
ecdev_*() netif_*()
Hardware
NIC NIC NIC
6 –revision–, 2021/04/20
2.1 Module Maı̂tre
Les deux maı̂tres peuvent être adressés par leurs indices respectifs 0 et 1 (voir Fi-
gure 2.2). L’index du maı̂tre est requis par la fonction ecrt_master_request() de
l’API (voir chapitre 3) et par l’option --master de l’outil de commande en ligne ether-
cat (voir section 7.1), qui vaut 0 par défaut.
Script d’initialisation Dans la plupart des cas, il n’est pas nécessaire de charger
manuellement le module maı̂tre et les modules des pilotes Ethernet. Un script d’ini-
tialisation est disponible pour démarrer le maı̂tre en tant que service (voir section 7.4).
Un fichier de service est aussi disponible pour les systèmes qui sont gérés par systemd
[7].
–revision–, 2021/04/20 7
2 Architecture
Kernel space
master 0 master 1
8 –revision–, 2021/04/20
2.2 Phases du maı̂tre
Syslog Le module maı̂tre publie des informations à propos de son état et ses événement
dans le tampon circulaire du noyau. Elles aboutissent aussi dans les journaux systèmes.
La commande de chargement du module devrait produire les messages ci-dessous :
# dmesg | tail -2
EtherCAT : Master driver 1.5.2
EtherCAT : 2 masters waiting for devices .
# tail -2 /var/log/messages
Jul 4 10:22:45 ethercat kernel : EtherCAT : Master driver 1.5.2
Jul 4 10:22:45 ethercat kernel : EtherCAT : 2 masters waiting
for devices .
Les messages du maı̂tre sont préfixés par EtherCAT pour faciliter la recherche dans les
journaux.
Phase orpheline (Orphaned) Ce mode prend effet quand le maı̂tre attend encore
pour se connecter à ses périphériques Ethernet. Aucune communication de bus
n’est possible pour l’instant.
Phase paresseuse (Idle) Ce mode prend effet quand le maı̂tre a accepté tous
les périphériques Ethernet requis, mais qu’aucune application ne l’a encore
mobilisé. Le maı̂tre exécute son automate (voir section 5.3), qui analyse auto-
matiquement le bus pour rechercher les esclaves et exécuter les opérations en
attente depuis l’interface en espace utilisateur (par exemple les accès SDO).
L’outil en ligne de commande peut être utilisé pour accéder au bus, mais il n’y
a aucun échange de donnée de processus parce que la configuration du bus est
manquante.
Phase d’opération Le maı̂tre est mobilisé par une application qui peut fournir
une configuration de bus et échanger des données de processus..
–revision–, 2021/04/20 9
2 Architecture
10 –revision–, 2021/04/20
2.3 Données de processus
Image des données de processus Les esclaves présentent leurs entrés et sorties au
maı̂tre au travers d’objet de données de processus “Process Data Objects” (PDOs).
Les PDOs disponibles peuvent être déterminés en lisant les catégories SII TxPDO
et RxPDO de l’esclave depuis l’E2 PROM (en cas de PDOs fixes) ou en lisant les
objets CoE appropriés (voir section 6.2), si disponibles. L’application peut inscrire les
entrées des PDOs pour l’échange pendant l’opération cyclique. La somme de toutes
les entrées PDO inscrites définit l’“image des données du processus”, qui peut être
échangée via des datagrammes avec des accès mémoires “logiques” (comme LWR 2 ,
LRD 3 ou LRW 4 ) présentés dans [2, sec. 5.4].
Configuration FMMU Une application peut inscrire des entrées PDO pour l’échange.
Chaque entrée PDO et son PDO parent font partie d’une zone mémoire dans la
mémoire physique de l’esclave, qui est protégée par un gestionnaire de synchronisa-
tion (sync manager) [2, sec. 6.7] pour des accès synchronisés. Pour que le gestionnaire
de synchronisation réagisse à un datagramme qui accède à sa mémoire, il est nécessaire
d’accéder au dernier octet couvert par le gestionnaire de synchronisation. Sinon le ges-
tionnaire de synchronisation ne réagira pas au datagramme et aucune donnée ne sera
2. LWR : Logical Write
3. LRD : Logical Read
4. LRW : Logical Read/Write
5. FMMU : Fieldbus Memory Management Unit
–revision–, 2021/04/20 11
2 Architecture
échangée. C’est pourquoi l’ensemble de la zone mémoire synchronisée doit être inclus
dans l’image des données de processus : par exemple ; si une entrée PDO particulière
d’un esclave est inscrite pour l’échange avec un domaine particulier, une FMMU sera
configurée pour mapper toute la mémoire protégée par le gestionnaire de synchronisa-
tion dans laquelle l’entrée PDO réside. Si une deuxième entrée PDO du même esclave
est inscrite pour l’échange de donnée de processus au sein du même domaine, et s’il
réside dans la même zone mémoire protégée par le gestionnaire de synchronisation
que la première entrée, alors la configuration FMMU n’est pas modifiée, parce que
la mémoire désirée fait déjà partie de l’image des données du processus du domaine.
Si la deuxième entrée appartenait à une autre zone protégée par le gestionnaire de
synchronisation, alors cette zone entière serait aussi incluse dans l’image des données
des processus des domaines.
Figure 2.4 fournit un aperçu de la manière de configurer les FMMUs pour mapper la
mémoire physique vers les images logiques des données des processus.
12 –revision–, 2021/04/20
2.3 Données de processus
Slave0 Slave1
–revision–, 2021/04/20 13
2 Architecture
14 –revision–, 2021/04/20
3 Interface de Programmation
Applicative (API)
L’interface de programmation applicative fournit les fonctions et structures de données
pour accéder au maı̂tre EtherCAT. La documentation complète de l’interface est in-
cluse sous forme de commentaires Doxygen [13] dans le fichier d’entête include/ecrt.h.
Elle peut être lue directement depuis les commentaires du fichier, ou plus confortable-
ment sous forme de documentation HTML. La génération du HTML est décrite dans
section 9.3.
Les sections suivantes couvrent une description générale de l’API.
Chaque application devrait utiliser le maı̂tre en deux étapes :
Configuration Le maı̂tre est mobilisé et la configuration est appliquée. Par exemple,
les domaines sont créés, les esclaves sont configurés et les entrées PDO sont ins-
crites. (voir section 3.1).
Opération Le code cyclique est exécuté et les données de processus sont échangées
(voir section 3.2).
–revision–, 2021/04/20 15
3 Interface de Programmation Applicative (API)
n
Master Domain
Index
n n
n SDO Request
Index
Subindex
16 –revision–, 2021/04/20
3.1 Configuration du maı̂tre
la configuration de l’esclave est “attachée” à l’esclave réel sur le bus et l’esclave est
configuré en fonction des paramètres fournis par l’application. L’état de la configura-
tion de l’esclave peut soit être demandé via l’API ou via l’outil en ligne de commande
(voir sous-section 7.1.3).
Position de l’esclave La position de l’esclave doit être spécifiée sous forme d’un
couple “alias” et “position”. Ceci permet d’adresser les esclaves via la position absolue
sur le bus ou via un identifiant stocké et appelé “alias” ou via un mélange des deux.
L’alias est une valeur 16 bits stockée dans E2 PROM de l’esclave. Il peut être modifié
via l’outil en ligne de commande (voir sous-section 7.1.2). Tableau 3.1 montre comment
les valeurs sont interprétées.
Figure 3.2 montre un exemple d’attachement des configurations des esclaves. Certaines
configurations sont attachées, tandis que d’autres restes détachées. La liste ci-dessous
en donne les raisons en commençant par la configuration de l’esclave du haut.
–revision–, 2021/04/20 17
3 Interface de Programmation Applicative (API)
Alias: 0x2000
Position: 1
Vendor: 0x00000001
Product: 0x00000002
18 –revision–, 2021/04/20
3.2 Opération cyclique
–revision–, 2021/04/20 19
3 Interface de Programmation Applicative (API)
Master Module
Application Module
Application
Interface
Task Master0
EoE
L’exemple Figure 3.3 montre comment deux processus partagent un maı̂tre : la tâche
cyclique de l’application utilise le maı̂tre pour l’échange de données de processus,
tandis que le processus EoE interne au maı̂tre l’utilise pour communiquer avec les
esclaves EoE. Les deux ont accès au bus de temps en temps, mais le processus EoE
le fait en “demandant” à l’application de réaliser l’accès au bus pour lui. De cette
manière, l’application peut utiliser le mécanisme de verrouillage approprié pour éviter
d’accèder au bus en même temps. Voir la documentation de l’API (chapitre 3) pour
savoir comment utiliser ces fonctions de rappel.
20 –revision–, 2021/04/20
3.5 Horloges distribuées
Horloges locales Tout esclave EtherCAT qui supporte l’horloge distribuée possède
un registre d’horloge locale avec une résolution à la nanoseconde. Si l’esclave est
allumé, l’horloge démarre depuis zéro, ce qui signifie que lorsque des esclaves sont al-
lumés à différents instants, leurs horloges auront des valeurs différentes. Ces “décalages”
doivent être compensés par le mécanisme des horloges distribuées. En outre, les hor-
loges ne tournent pas exactement à la même vitesse, puisque les quartzs ont une
déviation de leur fréquence naturelle. Cette déviation est habituellement très faible,
mais au bout de longues périodes, l’erreur s’accumulera et la différence entre les hor-
loges locales grandira. Cette “dérive” des horloges doit aussi être compensée par le
mécanisme des horloges distribuées.
Temps de l’Application La base de temps commune pour le bus doit être fournie
par l’application. Ce temps d’application tapp est utilisé
1. pour configurer les décalages des horloges des esclaves (voir ci-dessous),
2. pour programmer les temps de démarrage de l’esclave pour la génération des
impulsions synchrones. (voir ci-dessous)
3. pour synchroniser les horloges de référence avec l’horloge maı̂tresse (optionnel).
Le maı̂tre lit les valeurs des deux registres pour calculer un nouveau décalage du
temps système de telle manière que le temps système résultant corresponde au temps
de l’application du maı̂tre tapp :
–revision–, 2021/04/20 21
3 Interface de Programmation Applicative (API)
Master
22 –revision–, 2021/04/20
3.5 Horloges distribuées
!
tsys = tapp (3.2)
!
⇒ tint + toff = tapp
⇒ toff = tapp − tint
⇒ toff = tapp − (tsys − toff )
⇒ toff = tapp − tsys + toff (3.3)
–revision–, 2021/04/20 23
3 Interface de Programmation Applicative (API)
Pour vérifier la synchronie du bus, les registres de différence du temps système peuvent
aussi être lus via l’outil en ligne de commande (voir sous-section 7.1.14) :
Signaux synchrones Les horloge synchrones sont seulement un pré-requis pour des
évènements synchrones sur le bus. Chaque esclave qui supporte les horloges distribuées
fournit deux “signaux synchrones”, qui peuvent être programmés pour créer des
évènements, qui vont par exemple obliger l’application esclave à capturer ses entrées
à un instant précis. Un évènement synchrone peut être généré soit une seule fois ou
périodiquement, selon ce qui a du sens pour l’application esclave. La programmation
des signaux synchrones est une question de réglage du mot “AssignActivate” et des
temps de cycle et décalage des signaux de synchronisation. Le mot AssignActivate est
spécifique à chaque esclave et doit être récupéré depuis la description XML de l’es-
clave (Device → Dc), où se trouvent aussi typiquement les signaux de configurations
“OpModes”.
24 –revision–, 2021/04/20
4 Interfaces Ethernet
Le protocole EtherCAT est fondé sur le standard Ethernet standard, aussi un maı̂tre
dépend du matériel Ethernet standard pour communiquer avec le bus.
Le terme device est utilisé comme synonyme pour matériel d’interface réseau Ethernet.
Pilotes natifs pour périphériques Ethernet Il y a des modules natifs pour les pilotes
de périphériques (voir section 4.2) qui gèrent le matériel Ethernet qu’utilise le maı̂tre
pour se connecter au bus EtherCAT. Ils offrent leurs matériels Ethernet au module
maı̂tre via l’interface de device (voir section 4.6) et doivent être capable de préparer
les périphériques Ethernet pour les opérations EtherCAT (temps réel) ou pour les
opérations “normales” en utilisant la pile réseau du noyau. L’avantage de cete ap-
proche est que le maı̂tre peut opérer pratiquement directement avec le matériel ce
qui permet des performances élevées. L’inconvénient est qu’il faut avoir une version
compatible EtherCAT du pilote Ethernet original.
Pilote générique pour les périphériques Ethernet À partir du maı̂tre version 1.5,
il y a un module de pilote générique pour les périphériques Ethernet (voir section 4.3),
qui utilise les couches basses de la pile réseau pour se connecter au matériel. L’avantage
est que n’importe quel périphérique Ethernet peut être utilisé pour les opérations
EtherCAT, indépendamment du pilote matériel réel (ainsi tous les pilotes Ethernet
Linux sont supportés sans modification). L’inconvénient est que cette approche ne
supporte pas les extensions temps réel, comme RTAI, parce que la pile réseau de Linux
est utilisée. Cependant la performance est légèrement moins bonne qu’avec l’approche
native, car les données de la trame Ethernet doivent traverser la pile réseau.
Tâches d’un pilote réseau Les pilotes de périphériques réseaux gèrent habituelle-
ment les deux couches les plus basses du modèle OSI, qui sont la couche physique et
la couche liaison de données. Le périphérique réseau gère nativement les problèmes
–revision–, 2021/04/20 25
4 Interfaces Ethernet
open() Cette fonction est appelée quand la communication a démaré, par exemple
après une commande ip link set ethX up depuis l’espace utilisateur. La réception
des trames doit être activée par le pilote.
stop() Le but de cette fonction de rappel est de “fermer” le périphérique, c’est-
à-dire faire en sorte que le matériel cesse de recevoir des trames.
26 –revision–, 2021/04/20
4.1 Principes de base du pilote réseau
hard_start_xmit() Cette fonction est appelée pour chaque trame qui a été trans-
mise. La pile réseau passe la trame sous la forme d’un pointeur vers une struc-
ture sk_buff (“socket buffer” – tampon de socket – voir ci-dessous), qui doit
être libérée après l’envoi.
get_stats() Cet appel doit retourner un pointeur vers la structure net_device_stats
, qui doit être continuellement mise à jour avec les statistiques des trames. Cela
signifie qu’à chaque fois qu’une trame est reçue, envoyée ou qu’une erreur se
produit, le compteur approprié de cette structure doit être augmenté.
L’inscription réelle est faite par l’appel register_netdev(), la désinscription est faite
par unregister_netdev().
–revision–, 2021/04/20 27
4 Interfaces Ethernet
Matériel dédié Pour des raisons de performances et de temps réel, le maı̂tre Ether-
CAT a besoin d’un accès direct et exclusif au matériel Ethernet. Cela implique que le
périphérique réseau ne doit pas être connecté à la pile réseau du noyau comme d’ha-
bitude, car le noyau essaierait de l’utiliser comme un périphérique Ethernet ordinaire.
28 –revision–, 2021/04/20
4.2 Les pilotes natifs pour périphériques EtherCAT
Realtime Cycle
Frame Assembly
Interrupt
Frame Sending
Time
ISR
Frame Dissection
–revision–, 2021/04/20 29
4 Interfaces Ethernet
l’on ne peut pas dire à un pilote non modifié d’ignorer un périphérique pour l’utiliser
ultérieurement pour EtherCAT. Il faut donc un moyen de gérer plusieurs périphériques
du même type, l’un étant réservé à EtherCAT, tandis que l’autre est traité comme un
périphérique Ethernet ordinaire.
Pour toutes ces raisons, l’auteur a décidé que la seule solution acceptable était de mo-
difier les pilotes Ethernet standards de manière à ce qu’ils conservent leurs fonctionna-
lités normales, tout en gagnant la possibilité de traiter un ou plusieurs périphériques
comme étant compatibles EtherCAT.
Les avantages de cette solution sont listés ci-dessous :
— Pas besoin de dire aux pilotes standards d’ignorer certains périphériques.
— Un seul pilote réseau pour les périphériques EtherCAT et non-EtherCAT.
— Pas besoin d’implémenter un pilote réseau depuis zéro et de rencontrer des
problèmes que les anciens développeurs ont déjà résolus.
L’approche choisie a les inconvénients suivants :
— Le pilote modifié est plus compliqué car il doit gérer les périphériques Ether-
CAT et non-EtherCAT.
— De nombreuses différenciations de cas supplémentaires dans le code du pilote.
— Les modifications et changements dans les pilotes standards doivent être portés
de temps en temps vers les versions compatibles EtherCAT.
30 –revision–, 2021/04/20
4.4 Fourniture de périphériques Ethernet
— La performance est un peut moins bonne qu’avec l’approche native, parce que
les données de la trame doivent traverser les couches basses de la pile réseau.
— Il n’est pas possible d’utiliser des extensions en temps réel dans le noyau comme
RTAI avec le pilote générique, car le code de la pile réseau utilise des allocations
dynamiques de mémoire et d’autres choses, qui pourraient provoquer le gel du
système dans un contexte temps réel.
4.5 Redondance
L’opération redondante de bus signifie, qu’il y a plus qu’une connexion Ethernet entre
le maı̂tre et les esclaves. Les datagrammes de l’échange de données de processus
sont envoyés sur chaque lien maı̂tre, aussi l’échange se terminera, même si le bus
est déconnecté quelque part entre les deux.
La condition pour une opération redondante de bus est que chaque esclave puisse
être atteint par au moins un lien maı̂tre. Dans ce cas, une panne de connexion unique
–revision–, 2021/04/20 31
4 Interfaces Ethernet
(i. e. la rupture d’un câble) ne conduira jamais à des données de processus incomplètes.
Les doubles défauts ne peuvent pas être traités avec deux périphériques Ethernet.
La redondance peut être configurée avec le commutateur --with-devices au moment
de la configuration (voir chapitre 9) et en utilisant le paramètre backup_devices du
module noyau ec_master (voir section 2.1) ou la variable appropriée MASTERx_BACKUP
dans le fichier de configuration sysconfig (voir sous-section 7.4.2).
L’analyse du bus est faite après un changement de topologie sur n’importe quel lien
Ethernet. L’API (voir chapitre 3) et l’outil en ligne de commande (voir section 7.1)
ont tous les deux des méthodes pour interroger le status de l’opération redondante.
1. Une première règle simple est d’éviter les appels netif_*() pour tous les
périphériques EtherCAT. Comme indiqué précédemment, les périphériques Ether-
CAT ne doivent avoir aucune connexion avec la pile réseau, et c’est pourquoi
ils ne doivent pas appeler ces fonctions d’interface.
2. Une autre chose importante est, que les périphériques EtherCAT doivent fonc-
tionner sans interruption. Aussi tous les appels pour inscrire les gestionnaires
d’interruption et activer les interruptions au niveau matériel doivent aussi être
évités.
32 –revision–, 2021/04/20
4.7 Application de correctifs aux pilotes de réseau natifs
–revision–, 2021/04/20 33
4 Interfaces Ethernet
34 –revision–, 2021/04/20
5 Automates finis
Beaucoup de parties du maı̂tre EtherCAT sont implémentées sous forme d’ automates
finis – en anglais finite state machines (FSMs). Bien qu’ils amènent une plus grande
complexité pour certains aspects, ils ouvrent de nombreuses nouvelles possibilités.
Le court exemple de code ci-dessous montre comment lire tous les états d’esclave et
illustre en outre les restrictions du codage “ séquentiel ” :
La fonction ec master simple io() fournit une interface simple pour envoyer de manière
synchrone un datagramme unique et recevoir le résultat 1 . En interne, elle met en
file d’attente le datagramme spécifié, invoque la fonction ec master send datagrams()
pour envoyer une trame avec le datagramme en attente, puis attend activement la
réception.
Cette approche séquentielle est très simple, se reflétant dans seulement trois lignes
de code. L’inconvénient est que le maı̂tre est bloqué pendant le temps où il attend
la réception du datagramme. Ce n’est pas vraiment un problème, s’il n’y a qu’une
seule instance qui utilise le maı̂tre, mais si plusieurs instances veulent (de manière
synchrone 2 ) utiliser le maı̂tre, il est inévitable de songer à une alternative au modèle
séquentiel.
L’accès maı̂tre doit être séquentalisé pour que plusieurs instances puissent envoyer
et recevoir des datagrammes de manière synchrone. Avec la présente approche, cela
se traduirait par une phase d’attente active pour chaque instance, ce qui serait inac-
ceptable, en particulier dans des circonstances en temps réel, en raison de l’énorme
surcharge de temps.
Une solution possible serait, que toutes les instances soient exécutées séquentiellement
pour mettre en file d’attente leurs datagrammes, et qu’elles passent alors le contrôle
à la prochaine instance au lieu d’attendre la réception du datagramme. Finalement,
une instance supérieure ferait l’entrée-sortie sur le bus pour envoyer et recevoir tous
1. Comme tous les problèmes de communication ont été entre temps transmis aux automates
finis, la fonction est obsolète et a cessé d’exister. Néanmoins, elle est suffisante pour montrer ses
propres restrictions.
2. À ce stade, l’accès synchrone au maı̂tre sera suffisant pour montrer les avantages d’un automate.
L’approche asynchrone sera discutée dans la section 6.1
–revision–, 2021/04/20 35
5 Automates finis
les datagrammes en attente. La prochaine étape serait d’exécuter à nouveau toutes les
instances pour qu’elles traitent leurs datagrammes reçus et en émettent des nouveaux.
Cette approche aboutit à ce que toutes les instances mémorisent leurs états lorsqu’elles
redonnent le contrôle à l’instance supérieure. Il est évident dans ce cas d’utiliser le
modèle d’automate. La section 5.1 introduira une partie de la théorie utilisée, tandis
que l’extrait ci-dessous montre l’approche de base en codant l’exemple ci-dessus sous
forme d’automate :
1 // state 1
2 ec_datagram_brd ( datagram , 0 x0130 , 2) ; // prepare datagram
3 ec_master_queue ( master , datagram ) ; // queue datagram
4 next_state = state_2 ;
5 // state processing finished
Après que toutes les instances ont exécuté leur état courant et mis en file d’attente
leurs datagrammes, ceci sont envoyés et reçus. Alors les états suivants respectifs sont
exécutés :
1 // state 2
2 if ( datagram - > state != E C _ D G R A M _ S T A T E _ R E C E I V E D ) {
3 next_state = state_error ;
4 return ; // state processing finished
5 }
6 slave_states = EC_READ_U8 ( datagram - > data ) ; // process datagram
7 // state processing finished .
Voir section 5.2 pour une introduction au concept de programmation d’automate fini
utilisé dans le code du maı̂tre.
36 –revision–, 2021/04/20
5.1 Théorie des automates finis
La fonction de transition d’état δ est souvent spécifiée sous la forme d’une table de
transition d’état, ou par un diagramme de transition d’état. La table de transition offre
une vue matricielle du comportement de l’automate fini (voir Tableau 5.1). Les lignes
de la matrice correspondent aux états (S = {s0 , s1 , s2 }) et les colonnes correspondent
aux symboles d’entrée (Γ = {a, b, ε}). Le contenu de la table à la ligne i et à la
colonne j représente alors le prochain état (et éventuellement la sortie) pour le cas où
le symbole σj est lu dans l’état si .
Le diagramme d’état pour le même exemple est semblable à Figure 5.1. Les états
sont représentés par des cercles ou des ellipses et les transitions sont représentées par
des flèches entre eux. La condition à remplir pour autoriser la transition se trouve à
proximité de la flèche de transition. L’état initial est marqué par un disque noir avec
une flèche pointant vers l’état respectif.
–revision–, 2021/04/20 37
5 Automates finis
b
a, b
s0 s1
ε
ε
a
a, b, ε
s2
38 –revision–, 2021/04/20
5.2 Le modèle d’état du maı̂tre
plus simples. Le maı̂tre EtherCAT utilise plusieurs automates, qui sont exécutés de
manière hiérarchique et qui servent de sous-automates. Ils sont aussi décrits ci-dessous.
Cette technique reste possible pour les petits automates, mais présente l’inconvénient
de complexifier rapidement le code lorsque le nombre d’états augmente. De plus le
branchement à choix multiple doit être exécuté à chaque itération et beaucoup d’in-
dentations sont gaspillés.
La méthode retenue par le maı̂tre est d’implémenter chaque état dans sa propre fonc-
tion et de stocker la fonction d’état courante dans un pointeur de fonction :
–revision–, 2021/04/20 39
5 Automates finis
Dans le code du maı̂tre, les pointeurs d’état de tous les automates 3 sont rassemblés
dans un objet unique de la classe ec_fsm_master_t. C’est avantageux, car il y a tou-
jours une instance disponible de chaque automate qui peut être démarrée à la de-
mande.
Mealy et Moore Une vue rapprochée du code ci-dessus montre que les actions
exécutées (les “sorties” de l’automate) dépendent uniquement de l’état courant. Ceci
correspond au modèle de “Moore” introduit dans section 5.1. Comme déjà mentionné,
le modèle de “Mealy” offre une flexibilité supérieure, visible dans le code ci-dessous :
3 +
7 la fonction d’état exécute les actions en fonction de la transition d’état,
qui est sur le point d’être effectuée.
3. Tous sauf l’automate EoE, parce plusieurs esclaves Eoe doivent être gérés en parallèle. Pour
cette raison, chaque objet gestionnaire EoE a son propre pointeur d’état.
40 –revision–, 2021/04/20
5.2 Le modèle d’état du maı̂tre
L’alternative la plus flexible est d’exécuter certaines actions en fonction de l’état, puis
d’autres actions en fonction de la transition d’état :
Ce modèle est souvent utilisé dans le maı̂tre. Il combine les meilleurs aspects des deux
approches.
–revision–, 2021/04/20 41
5 Automates finis
14 ...
3 change_state est le pointeur d’état de l’automate. La fonction d’état, sur la-
quelle pointe le pointeur, est exécutée . . .
6 . . . jusqu’à ce que l’automate termine par l’état d’erreur . . .
11 . . . ou jusqu’à ce que l’automate termine dans l’état de fin. Pendant ce temps,
Description des automates Les sections ci-dessous décrivent chaque automate uti-
lisé par le maı̂tre EtherCAT. Les descriptions textuelles des automates contiennent
des références aux transitions dans les diagrammes de transitions d’états correspon-
dants, qui sont marqués avec une flèche suivie par le nom de l’état successeur. Les
transitions provoquées par des cas d’erreurs triviales (c’est-à-dire, pas de réponse de
l’esclave) ne sont pas décrites explicitement. Ces transitions sont décrites sous forme
de flèches en tirets dans les diagrammes.
Surveillance du bus La topologie du bus est surveillée. Si elle change, le bus est
à nouveau analysé.
Configuration des esclaves Les états de la couche application des esclaves sont
surveillés. Si un esclave n’est pas dans l’état supposé, alors l’esclave est (re)configuré.
Gestion des requêtes Les requêtes (qui proviennent soit de l’application ou bien
de sources externes) sont gérées. Une requête est un travail que le maı̂tre trai-
tera de manière asynchrone, par exemple un accès SII, un accès SDO ou simi-
laire.
Node Address L’adresse du nœud est définie pour l’esclave, de sorte qu’il puisse
être adressé par nœud pour toutes les opérations suivantes.
AL State L’état initial de la couche application (Application Layer) est lu.
42 –revision–, 2021/04/20
5.4 L’automate d’analyse des esclaves
start
broadcast
clear_addresses read_state
dc_measure_delays acknowledge
scan_slave
write_system_times configure_slave
dc_read_offset
dc_write_offset
sdo_dictionary
–revision–, 2021/04/20 43
5 Automates finis
start
address
state
base
DC not
dc_cap
supported
datalink
sii_size
sii_data
Not in
PREOP
preop sync
No category
data
pdos
end
44 –revision–, 2021/04/20
5.5 L’automate de configuration de l’état de l’esclave
–revision–, 2021/04/20 45
5 Automates finis
start
init
clear_fmmus No FMMUs
clear_sync No SMs
dc_clear_assign
No DC
dc_read_offset support
dc_write_offset
mbox_sync No mailboxes
Config
detached boot_preop
No SDOs
sdo_conf configured
No config
attached
pdo_conf
INIT
requested
PREOP
No FMMUs
or BOOT
configured fmmu
requested
No config
dc_cycle attached
DC not
dc_start configured
dc_assign
safeop
SAFEOP
op requested
end
start
check
status
Refuse
code start_ack
Response
Ack only
timeout
Change
timeout ack Success
check_ack
Ack only
error end
–revision–, 2021/04/20 47
5 Automates finis
start_reading start_writing
read_check write_check
read_fetch write_check2
error end
48 –revision–, 2021/04/20
5.8 Les automates PDO
Automate de lecture PDO Cet automate (Figure 5.7) a pour but de lire la configu-
ration PDO complète d’un esclave. Il lit l’affectation PDO et pour chaque gestionnaire
de configuration il utilise l’automate de lecture des entrées PDO (Figure 5.8) pour
lire la cartographie de chaque PDO assigné.
start
First SM
Next PDO
pdo
pdo_entries
–revision–, 2021/04/20 49
5 Automates finis
L’automate de lecture des entrées PDO Cet automate (Figure 5.8) lit la car-
tograhie PDO (les entrées PDO) d’un PDO. Il lit la cartographie SDO respective
(0x1600 – 0x17ff, ou 0x1a00 – 0x1bff) pour le PDO donné en lisant le sous-index zéro
(nombre d’éléments) pour déterminer le nombre d’entrée PDO projetés en mémoire.
Après cela, chaque sous-index est lu pour obtenir l’index de l’entrée PDO mappée en
mémoire, ainsi que son sous-index et sa taille en bits.
start
count
pdo_entry end
50 –revision–, 2021/04/20
5.8 Les automates PDO
start
First SM
No config
end
Unknown
read_mapping
No PDOs
mapping
zero_pdo_count
First PDO
Next PDO
assign_pdo
No more PDOs
set_pdo_count
–revision–, 2021/04/20 51
5 Automates finis
start
zero_entry_count
Next entry
No Entries map_entry
No more Entries
set_entry_count
end
52 –revision–, 2021/04/20
6 Implémentation du protocole de
boı̂te aux lettres
Le maı̂tre EtherCAT implémente les protocoles de boı̂te aux lettres CANopen over
EtherCAT (CoE), Ethernet over EtherCAT (EoE), File-access over EtherCAT (FoE),
Vendor-specific over EtherCAT (VoE) et Servo Profile over EtherCAT (SoE). Voir les
sections ci-dessous pour les détails.
Interfaces réseaux virtuelles Le maı̂tre crée une interface réseau virtuelle EoE pour
chaque esclave compatible EoE. Ces interface sont nommées
eoeXsY pour un esclave sans adresse alias (voir sous-section 7.1.2), où X est
l’index du maı̂tre et Y la position de l’esclave sur l’anneau.
eoeXaY pour un esclave avec une adresse d’alias non-nulle, où X est l’index du
maı̂tre et Y est l’adresse alias en décimal.
Les trames envoyées vers ces interfaces sont transférées vers les esclaves associés par le
maı̂tre. Les trames reçues par les esclaves sont récupérées par le maı̂tre et transférées
aux interfaces virtuelles.
Ceci apporte les avantages suivants :
— Flexibilité : l’utilisateur peut décider comment les esclaves compatibles EoE
sont interconnectés avec le reste du monde.
— Les outils standards peuvent être utilisés pour surveiller l’activité EoE et pour
configurer les interfaces EoE.
— L’implémentation du pontage de niveau 2 du noyau Linux (selon la norme de
pontage IEEE 802.1D MAC) peut être utilisée nativement pour relier le trafic
Ethernet entre les esclaves compatibles EoE.
— La pile réseau du noyau Linux peut être utilisée pour router les paquets entre
les esclaves compatibles EoE et pour suivre les problèmes de sécurité, comme
avec une interface réseau physique.
–revision–, 2021/04/20 53
6 Implémentation du protocole de boı̂te aux lettres
EoE Handlers Les interface virtuelles EoE et les fonctionnalités relatives sont encap-
sulées dans la classe ec_eoe_t class. Un objet de cette classe est appelé “gestionnaire
EoE”. Par exemple, le maı̂tre ne crée pas les interfaces réseaux directement : ceci est
fait à l’intérieur du constructeur d’un gestionnaire EoE. Un gestionnaire EoE contient
également une file d’attente pour les trames. À chaque fois que le noyau passe un nou-
veau tampon de socket pour l’envoyer via la fonction de rappel hard_start_xmit() de
l’interface, le tampon de socket est mis en file d’attente pour la transmission via l’au-
tomate EoE (voir ci-dessous). Si la file d’attente est pleine, le passage des nouveaux
tampons de socket est suspendu par un appel à netif_stop_queue().
Création de gestionnaire EoE Pendant l’analyse du bus (voir section 5.4), le maı̂tre
détermine les protocoles de boı̂te aux lettres supportés par chaque esclave. Ceci est
fait en examinant le champ de bits “Protocoles de boı̂te aux lettres supportés” au mot
d’adresse 0x001C de la SII. Si le bit 1 est défini, alors l’esclave supporte le protocole
EoE. Dans ce cas, un gestionnaire EoE est créé pour cet esclave.
Automate EoE Chaque gestionnaire EoE possède son automate EoE, qui est utilisé
pour envoyer des trames à l’esclave correspondant et recevoir des trames de celui-ci via
les primitives de communication EoE. Cette automate est présenté dans Figure 6.1.
54 –revision–, 2021/04/20
6.1 Ethernet over EtherCAT (EoE)
TX_START TX_SENT
–revision–, 2021/04/20 55
6 Implémentation du protocole de boı̂te aux lettres
S’il y a une trame à envoyer, elle est retirée de la file d’attente. Si la file
d’attente était inactive auparavant (parce qu’elle était pleine), la file d’attente
est réveillée par un appel à netif wake queue(). Le premier fragment de la trame
est envoyé. → TX SENT
TX SENT On vérifie si le premier fragment a été envoyé avec succès. Si la trame
actuelle est constituée de fragments supplémentaires, le prochain est envoyé.
→ TX SENT
Si le dernier fragment a été envoyé, une nouvelle séquence de réception est
démarrée. → RX START
Traitement EoE Pour exécuter l’automate EoE de chaque gestionnaire EoE actif,
il doit y avoir un processus cyclique. La solution la plus simple serait d’exécuter les
automates EoE de manière synchrone avec l’automate du maı̂tre (voir section 5.3.
Cette approche a les inconvénients suivants :
Un seul fragment EoE pourrait être envoyé ou reçu tous les quelques cycles. Le débit
des données serait très faible, parce que les automates EoE ne seraient pas exécutés
entre les cycles de l’application. En outre, le débit dépendrait de la période de la tâche
application.
Pour surmonter ce problème, les automates EoE ont besoin de leur propre processus
cyclique pour s’exécuter. Pour cela, le maı̂tre possède un timer noyau, qui est exécuté
à chaque interruption temporelle. Ceci garantie une bande passante constante, mais
pose un nouveau problème d’accès concurrent au maı̂tre. Le mécanisme de verrouillage
nécessaire à cet effet est présenté dans section 3.4.
Configuration automatique Par défaut, les esclaves sont laissés dans l’état PREOP
si aucune configuration n’est appliquée. Si le lien de l’interface EoE est configuré à
“up”, l’état de la couche application de l’esclave concerné passe automatiquement à
OP.
56 –revision–, 2021/04/20
6.3 Vendor specific over EtherCAT (VoE)
avant que l’esclave entre dans l’état SAFEOP. De cette manière, il est garanti que les
configurations SDO soient appliquées à chaque fois que l’esclave est reconfiguré.
Le maı̂tre EtherCAT autorise la création multiple de gestionnaires VoE pour les confi-
gurations d’esclaves via l’API (voir chapitre 3). Ces gestionnaires contiennent les au-
tomates nécessaires à la communication via VoE.These
Pour davantage d’information sur les gestionnaires VoE, voir section 3.3 ou les appli-
cations d’exemples dans le sous-dossier examples/.
–revision–, 2021/04/20 57
6 Implémentation du protocole de boı̂te aux lettres
ERROR END
58 –revision–, 2021/04/20
6.4 Servo Profile over EtherCAT (SoE)
–revision–, 2021/04/20 59
6 Implémentation du protocole de boı̂te aux lettres
60 –revision–, 2021/04/20
7 Interfaces dans l’espace utilisateur
Puisque le maı̂tre s’exécute en tant que module noyau, ses accès natifs se limitent à
analyser les messages Syslog et à le contrôler avec modutils.
Il était donc nécessaire d’implémenter d’autres interface pour faciliter l’accès au maı̂tre
depuis l’espace utilisateur et pour permettre une influence plus fine. Il doit être pos-
sible de voir et de changer des paramètres spéciaux en cours d’exécution.
La visualisation du bus est un autre point : dans un but de développement et de
déverminage, il est nécessaire, par exemple, de montrer les esclaves connectés (voir
section 7.1).
L’API doit être disponible depuis l’espace utilisateur pour permettre aux programmes
qui s’y trouvent d’utiliser les fonctionnalités EtherCAT. Ceci est implémenté via un
périphérique en mode caractère et une bibliothèque en espace utilisateur (voir sec-
tion 7.2).
Le démarrage et la configuration automatique sont d’autres aspects. Le maı̂tre doit
être capable de démarrer automatiquement avec une configuration persistante (voir
section 7.4).
La surveillance des communications EtherCAT est un dernier point. Dans un but
de déverminage, il faut avoir un moyen d’analyser les datagrammes EtherCAT. La
meilleure solution serait d’utiliser un analyseur réseau populaire, tel que Wireshark
[8] ou d’autres (voir section 7.5).
Ce chapitre couvre tous ces points et présente les interfaces et outils qui les rendent
possibles.
Création des nœuds de périphériques Les nœuds des périphériques en mode ca-
ractères sont automatiquement créés si le paquet udev est installé. Voir section 9.5
pour son installation et sa configuration.
–revision–, 2021/04/20 61
7 Interfaces dans l’espace utilisateur
Arguments :
ALIAS must be an unsigned 16 bit number . Zero means
removing an alias address .
Configuration selection :
Slave configurations can be selected with
62 –revision–, 2021/04/20
7.1 Outil en ligne de commande
–revision–, 2021/04/20 63
7 Interfaces dans l’espace utilisateur
Arguments :
LEVEL can have one of the following values :
0 for no debugging output ,
1 for some debug messages , or
2 for printing all frame contents ( use with caution !) .
64 –revision–, 2021/04/20
7.1 Outil en ligne de commande
ethercat download [ OPTIONS ] < INDEX > < SUBINDEX > < VALUE >
[ OPTIONS ] < INDEX > < VALUE >
The data type of the SDO entry is taken from the SDO
dictionary by default . It can be overridden with the
-- type option . If the slave does not support the SDO
information service or the SDO is not in the dictionary ,
the -- type option is mandatory .
The second call ( without < SUBINDEX >) uses the complete
access method .
Arguments :
INDEX is the SDO index and must be an unsigned
16 bit number .
SUBINDEX is the SDO entry subindex and must be an
unsigned 8 bit number .
VALUE is the value to download and must correspond
to the SDO entry datatype ( see above ) . Use
’-’ to read from standard input .
–revision–, 2021/04/20 65
7 Interfaces dans l’espace utilisateur
The data type of the SDO entry is taken from the SDO
dictionary by default . It can be overridden with the
-- type option . If the slave does not support the SDO
information service or the SDO is not in the dictionary ,
the -- type option is mandatory .
Arguments :
INDEX is the SDO index and must be an unsigned
16 bit number .
SUBINDEX is the SDO entry subindex and must be an
unsigned 8 bit number .
ethercat eoe
66 –revision–, 2021/04/20
7.1 Outil en ligne de commande
Arguments :
SOURCEFILE is the name of the source file on the slave .
Arguments :
FILENAME can either be a path to a file , or ’ - ’. In
the latter case , data are read from stdin and
the -- output - file option has to be specified .
–revision–, 2021/04/20 67
7 Interfaces dans l’espace utilisateur
http :// www . graphviz . org / doc / info / lang . html ) , which can
be processed with the tools from the Graphviz
package . Example :
68 –revision–, 2021/04/20
7.1 Outil en ligne de commande
Arguments :
ADDRESS is the register address . Must
be an unsigned 16 bit number .
SIZE is the number of bytes to read and must also be
an unsigned 16 bit number . ADDRESS plus SIZE
may not exceed 64 k . The size is ignored ( and
can be omitted ) , if a selected data type
implies a size .
–revision–, 2021/04/20 69
7 Interfaces dans l’espace utilisateur
Arguments :
ADDRESS is the register address to write to .
DATA depends on whether a datatype was specified
with the -- type option : If not , DATA must be
either a path to a file with data to write ,
or ’-’, which means , that data are read from
stdin . If a datatype was specified , VALUE is
interpreted respective to the given type .
70 –revision–, 2021/04/20
7.1 Outil en ligne de commande
–revision–, 2021/04/20 71
7 Interfaces dans l’espace utilisateur
Le lecture des données SII est aussi facile que les autres commandes. Comme les
données sont au format binaire, l’analyse est plus facile avec un outil tel que hexdump :
Pour téléverser une SII dans un esclave, l’accès en écriture au périphérique en mode
caractère du maı̂tre est nécessaire (voir sous-section 7.1.1).
ethercat sii_write [ OPTIONS ] < FILENAME >
Arguments :
FILENAME must be a path to a file that contains a
positive number of words . If it is ’-’,
data are read from stdin .
72 –revision–, 2021/04/20
7.1 Outil en ligne de commande
La validité du contenu de la SSI peut être vérifiée puis le contenu est envoyé à l’esclave.
L’opération d’écriture peut prendre quelques secondes.
Slave selection :
Slaves for this and other commands can be selected with
the -- alias and -- position parameters as follows :
–revision–, 2021/04/20 73
7 Interfaces dans l’espace utilisateur
$ ethercat slaves
0 0:0 PREOP + EK1100 Ethernet Kopplerklemme (2 A E - Bus )
1 5555:0 PREOP + EL3162 2 K . Ana . Eingang 0 -10 V
2 5555:1 PREOP + EL4102 2 K . Ana . Ausgang 0 -10 V
3 5555:2 PREOP + EL2004 4 K . Dig . Ausgang 24 V , 0 ,5 A
Arguments :
DRIVE is the drive number (0 - 7) . If omitted , 0 is assumed .
IDN is the IDN and must be either an unsigned
16 bit number acc . to IEC 61800 -7 -204:
Bit 15: (0) Standard data , (1) Product data
Bit 14 - 12: Parameter set (0 - 7)
Bit 11 - 0: Data block number
or a string like ’P -0 -150 ’.
74 –revision–, 2021/04/20
7.1 Outil en ligne de commande
bool ,
int8 , int16 , int32 , int64 ,
uint8 , uint16 , uint32 , uint64 ,
float , double ,
string , octet_string , unicode_string .
For sign - and - magnitude coding , use the following types :
sm8 , sm16 , sm32 , sm64
Arguments :
DRIVE is the drive number (0 - 7) . If omitted , 0 is assumed .
IDN is the IDN and must be either an unsigned
16 bit number acc . to IEC 61800 -7 -204:
Bit 15: (0) Standard data , (1) Product data
Bit 14 - 12: Parameter set (0 - 7)
Bit 11 - 0: Data block number
or a string like ’P -0 -150 ’.
VALUE is the value to write ( see below ) .
–revision–, 2021/04/20 75
7 Interfaces dans l’espace utilisateur
Arguments :
STATE can be ’ INIT ’ , ’ PREOP ’ , ’ BOOT ’ , ’ SAFEOP ’ , or ’OP ’.
76 –revision–, 2021/04/20
7.2 Bibliothèque en espace utilisateur
Le fichier d’entête ecrt.h de l’API peut être utilisé dans les deux contextes : utilisateur
ou noyau.
L’exemple minimal suivant montre comment construire un programme EtherCAT. Un
exemple complet se trouve dans le dossier examples/user/ des sources du maı̂tre.
if (! master )
return 1; // error
–revision–, 2021/04/20 77
7 Interfaces dans l’espace utilisateur
7.2.2 Implémentation
Fondamentalement, l’API noyau a été transferée dans l’espace utilisateur via le périphérique
en mode caractére du maı̂tre (voir chapitre 2, Figure 2.1 et sous-section 7.1.1).
Les appels de fonction de l’API noyau sont projetés dans l’espace utilisateur via l’in-
terface ioctl(). Les fonctions de l’API en espace utilisateur partagent un ensemble
d’appels ioctl() génériques. La partie noyau des appels de l’interface appelle direc-
tement les fonctions correspondantes de l’API, ce qui ajoute un minimum de délai
supplémentaire (voir sous-section 7.2.3).
Pour des raisons de performance, les données de processus réels (voir section 2.3) ne
sont pas copiées entre la mémoire du noyau et celle de l’utilisateur : à la place, les
données sont projetées en mémoire vers l’application en espace utilisateur. Une fois
que le maı̂tre est configuré et activé, le module maı̂tre crée une zone de mémoire de
données de processus couvrant tous les domaines et la mappe dans l’espace utilisa-
teur, de sorte que l’application puisse accéder directement aux données de processus.
En conséquence, il n’y a pas de délai supplémentaire lors de l’accès aux données de
processus depuis l’espace utilisateur.
7.2.3 Timing
Un aspect intéressant est la comparaison du timing des appels de la bibliothèque en
espace utilisateur avec ceux de l’API noyau. Tableau 7.1 montre les durées des appels
et l’écart-type des fonctions de l’API typiques (et critiques pour le temps) mesurée
avec un processeur Intel Pentium 4 M avec 2.2 GHz et un noyau standard 2.6.26.
Les résultats des tests montrent que, dans cette configuration, l’API en espace utili-
sateur rajoute un délai supplémentaire d’environ 1 µs à chaque fonction, par rapport
à l’API en mode noyau.
78 –revision–, 2021/04/20
7.3 Interface RTDM
–revision–, 2021/04/20 79
7 Interfaces dans l’espace utilisateur
appropriées (voirchapitre 9), avant que le maı̂tre puisse être inséré en tant que ser-
vice. Veuillez noter, que ce script d’initialisation dépend du fichier sysconfig décrit
ci-dessous.
Pour indiquer les dépendances du service (c’est-à-dire, quels services doivent être
démarrés avant les autres) à l’intérieur du code du script d’initialisation, LSB définit
un bloc spécial de commentaires. Les outils systèmes peuvent extraire cette infor-
mation pour insérer le script d’initialisation EtherCAT à la bonne position dans la
séquence de démarrage :
#------------------------------------------------------------------------
80 –revision–, 2021/04/20
7.4 Intégration système
22 #
23 # Backup Ethernet devices
24 #
25 # The MASTER <X > _BACKUP variables specify the devices used for redundancy . They
26 # behaves nearly the same as the MASTER <X > _DEVICE variable , except that it
27 # does not interpret the ff : ff : ff : ff : ff : ff address .
28 #
29 # MA STER0_BA CKUP =""
30
31 #
32 # Ethernet driver modules to use for EtherCAT operation .
33 #
34 # Specify a non - empty list of Ethernet drivers , that shall be used for
35 # EtherCAT operation .
36 #
37 # Except for the generic Ethernet driver module , the init script will try to
38 # unload the usual Ethernet driver modules in the list and replace them with
39 # the EtherCAT - capable ones . If a certain ( EtherCAT - capable ) driver is not
40 # found , a warning will appear .
41 #
42 # Possible values : 8139 too , e100 , e1000 , e1000e , r8169 , generic , ccat , igb .
43 # Separate multiple drivers with spaces .
44 #
45 # Note : The e100 , e1000 , e1000e , r8169 , ccat and igb drivers are not built by
46 # default . Enable them with the -- enable - < driver > configure switches .
47 #
48 # Attention : When using the generic driver , the corresponding Ethernet device
49 # has to be activated ( with OS methods , for example ’ ip link set ethX up ’) ,
50 # before the master is started , otherwise all frames will time out .
51 #
52 DEVI CE_MODUL ES =""
53
54 #
55 # Flags for loading kernel modules .
56 #
57 # This can usually be left empty . Adjust this variable , if you have problems
58 # with module loading .
59 #
60 # MO DPROBE_F LAGS =" - b "
61
62 #------------------------------------------------------------------------------
Pour les systèmes gérés par systemd (voir sous-section 7.4.4), le fichier sysconfig a
été déplacé dans /etc/ethercat.conf. Les deux versions font parties des sources du
maı̂tre et sont destinées à être utilisées en alternance.
Une fois que le script d’initialisation et le fichier sysconfig ont été installés au bon
endroit, le maı̂tre EtherCAT peut être inséré comme un service. Les différentes dis-
tributions Linux offrent différentes façons pour marquer un service pour le démarrage
ou l’arrêt dans certains runlevels. Par exemple, SUSE Linux fournit la commande
insserv :
# insserv ethercat
–revision–, 2021/04/20 81
7 Interfaces dans l’espace utilisateur
Le script d’initialisation peut aussi être utilisé pour démarrer ou stopper manuellement
le maı̂tre EtherCAT.
Il doit être exécuté avec un des paramètres suivants : start, stop, restart ou status.
# /etc/init.d/ethercat restart
Shutting down EtherCAT master done
Starting EtherCAT master done
[ Unit ]
Description = EtherCAT Master Kernel Modules
#
# Uncomment this , if the generic Ethernet driver is used . It assures ,
that the
# network interfaces are configured , before the master starts .
#
# Requires = network . service # Stop master , if network is stopped
# After = network . service # Start master , after network is ready
#
# Uncomment this , if a native Ethernet driver is used . It assures ,
that the
# network interfaces are configured , after the Ethernet drivers have
been
# replaced . Otherwise , the networking configuration tools could be
confused .
#
# Before = network . service
[ Service ]
Type = oneshot
RemainAfterExit = yes
ExecStart =/ usr / local / sbin / ethercatctl start
ExecStop =/ usr / local / sbin / ethercatctl stop
[ Install ]
WantedBy = multi - user . target
82 –revision–, 2021/04/20
7.5 Interfaces de déverminage
La commande ethercatctl est utilisée pour charger et décharger le maı̂tre et les mo-
dules des pilotes réseaux de la même manière que l’ancien script d’initialisation (sous-
section 7.4.1). Puisqu’il est installé dans le dossier sbin/, il peut aussi être utilisé
séparément :
# ethercatctl start
# ip link
1: lo : < LOOPBACK , UP > mtu 16436 qdisc noqueue
link / loopback 00 :00:00 :00:00 :00 brd 00 :00:00 :00:00 :00
4: eth0 : < BROADCAST , MULTICAST > mtu 1500 qdisc noop qlen 1000
link / ether 00:13:46:3 b : ad : d7 brd ff : ff : ff : ff : ff : ff
8: ecdbgm0 : < BROADCAST , MULTICAST > mtu 1500 qdisc pfifo_fast
qlen 1000
link / ether 00:04:61:03: d1 :01 brd ff : ff : ff : ff : ff : ff
–revision–, 2021/04/20 83
7 Interfaces dans l’espace utilisateur
Lorsque l’interface de déverminage est activée, toutes les trames envoyées ou reçues de-
puis ou vers le périphérique physique sont aussi transmises à l’interface de déverminage
par le maı̂tre correspondant. Les interfaces réseaux peuvent être activées avec la com-
mande ci-dessous :
Veuillez noter, que la fréquence des trames peut être très élevée. Avec une application
connectée, l’interface de déverminage peut produire des milliers de trames par seconde.
84 –revision–, 2021/04/20
8 Aspects temporels
Bien que le timing EtherCAT soit hautement déterministe et que par conséquent les
problèmes de timing soient rares, il y a quelques aspects qui peuvent (et doivent) être
traités.
c0 = get_cycles () ;
ecrt_maste r_ r e ce i v e ( master ) ;
c1 = get_cycles () ;
ecrt_domai n_ p r oc e s s ( domain1 ) ;
c2 = get_cycles () ;
ecrt_master_run ( master ) ;
c3 = get_cycles () ;
ecrt_master_send ( master ) ;
c4 = get_cycles () ;
–revision–, 2021/04/20 85
8 Aspects temporels
Table 8.1 – Profilage d’un cycle d’application sur un processeur à 2.0 GHz
Élement Durée moyenne [s] Déviation standard [µs]
ecrt master receive() 8.04 0.48
ecrt domain process() 0.14 0.03
ecrt master run() 0.29 0.12
ecrt master send() 2.18 0.17
Cycle complet 10.65 0.69
à partir des datagrammes et la copie vers les tampons matériels. Il est intéressant de
noter, que ceci ne prend qu’un quart du temps de réception.
Les fonctions qui opèrent uniquement sur les structures de données internes des
maı̂tres sont très rapides (∆t < 1 µs). Il est intéressant de noter que l’exécution
de ec domain process() a un petit écart-type par rapport à la moyenne, alors que le
ratio est presque deux fois plus grand pour ec master run() : Cela vient probablement
des fonctions ultérieures qui doivent exécuter le code en fonction de l’état courant et
les différentes fonctions d’état sont plus ou moins complexes.
Pour un cycle en temps réel qui représente environ 10 µs, la fréquence théorique peut
atteindre jusqu’à 100 kHz. Mais cette fréquence reste théorique pour deux raisons :
Les deux instants sont difficiles à déterminer. La première raison est que les interrup-
tions sont désactivées et le maı̂tre n’est pas notifié quand une trame est envoyée ou
reçue (un sondage fausserait les résultats). La deuxième raison est que, même avec
les interruptions activées, la durée entre l’évènement et la notification est inconnue.
C’est pourquoi, la seule manière de déterminer avec certitude le temps de cycle du
bus est une mesure électrique.
86 –revision–, 2021/04/20
8.2 Mesure des cycles du bus
De toute façon, la durée du cycle du bus est un facteur important lors de la conception
du code temps réel, car il limite la fréquence maximale pour la tâche cyclique de
l’application. En pratique, ces paramètres de timing dépendent fortement du matériel
et une méthode par essais et erreurs doit être utilisée pour déterminer les limites du
système.
La question centrale est : Que se passe-t-il si la fréquence du cycle est trop haute ? La
réponse est que les trames EtherCAT qui ont été envoyées à la fin du cycle ne sont
pas encore reçues quand le prochain cycle démarre.
Ceci est notifié en premier par ecrt domain process(), parce que le compteur de travail
des datagrammes de données de processus n’est pas incrémenté. La fonction notifiera
l’utilisateur via Syslog 1 . Dans ce cas, les données de processus sont conservés iden-
tiques comme dans le dernier cycle, parce qu’elles ne sont pas écrasées par le domaine.
Quand les datagrammes du domaine sont à nouveau mis en file d’attente, le maı̂tre
s’aperçoit qu’ils ont déjà été mis en file d’attente (et marqués comme envoyés). Le
maı̂tre les marquera à nouveau comme non-envoyés et affichera un avertissement que
les datagrammes ont été “ignorés”.
Sur le système à 2.0 GHz mentionné, la fréquence de cycle possible peut atteindre
25 kHz sans perdre de trames. Cette valeur peut sûrement être augmentée en choi-
sissant un matériel plus rapide. En particulier le matériel réseau RealTek peut être
remplacé par un autre plus rapide. En outre, la mise en oeuvre d’un ISR dédié pour
les périphériques EtherCAT contribuerait également à augmenter la latence. Ces deux
points sont la liste des choses encore à faire de l’auteur.
1. Pour limiter la sortie de Syslog, un mécanisme a été implémenté pour générer une notification
résumée au maximum une fois par seconde.
–revision–, 2021/04/20 87
8 Aspects temporels
88 –revision–, 2021/04/20
9 Installation
1. Une version officielle (par exemple 1.5.2) peut être téléchargée depuis le site
web du maı̂tre 1 dans le projet EtherLab [1] sous forme d’archive tar.
2. La révision de développement la plus récente (mais aussi n’importe quelle autre
révision) peut être obtenue via le dépôt Git [14] sur la page du projet sur
GitLab.com 2 . L’intégralité du dépot peut être clonée avec la commande
git clone https :// gitlab . com / etherlab . org / ethercat . git
local-dir
3. Sans installation locale de Git, des archives tar de révisions arbitraires peuvent
être téléchargées via le bouton “Download“ sur GitLab.
La configuration du logiciel est gérée avec Autoconf [15] aussi les versions publiées
contiennent un script shell configure, qui doit être exécuté pour la configuration (voir
ci-dessous).
1. http://etherlab.org/en/ethercat/index.php
2. https://gitlab.com/etherlab.org/ethercat
–revision–, 2021/04/20 89
9 Installation
$ ./configure
$ make
$ make modules
90 –revision–, 2021/04/20
9.2 Construction du logiciel
† Si cette option n’est pas spécifiée, la version du noyau à utiliser est extraite des
sources du noyau Linux.
–revision–, 2021/04/20 91
9 Installation
$ make doc
# make install
# make modules install
3. même si le maı̂tre EtherCAT ne doit pas être chargé au démarrage, l’utilisation du script
d’initialisation est recommandé pour le (dé-)chargement manuel.
92 –revision–, 2021/04/20
9.4 Installation du logiciel
# cd /opt/etherlab
# cp etc/sysconfig/ethercat /etc/sysconfig/
# ln -s etc/init.d/ethercat /etc/init.d/
# insserv ethercat
# /etc/init.d/ethercat start
# ethercatctl start
A partir de cet instant, l’opération du maı̂tre peut être obervée en consultant les
messages Syslog, qui ressemblent à ceux qui sont ci-dessous. Si des esclaves Ether-
CAT sont connectés au périphérique du maı̂tre EtherCAT, les indicateurs d’activité
devraient commencer à clignoter.
–revision–, 2021/04/20 93
9 Installation
1 –
2 Le module maı̂tre est en train de charger , et un maı̂tre est initialisé.
3 –
8 Le pilote e1000 compatible EtherCAT est en train de charger. Le maı̂tre
accepte le périphérique avec l’adresse 00:0E:0C:DA:A2:20.
9 –
16 Le maı̂tre entre en phase de repos, démarre son automate et commence à
analyser le bus.
# ls -l /dev/EtherCAT0
crw - rw -r - - 1 root root 252 , 0 2008 -09 -03 16:19 / dev / EtherCAT0
Maintenant, l’outil ethercat peut être utilisé (voir section 7.1) par un utilisateur
non-root.
Si les utilisateurs non-root doivent avoir l’accès en écriture, on peut utiliser la règle
udev suivante à la place :
KERNEL ==" EtherCAT [0 -9]*" , MODE ="0664" , GROUP =" users "
94 –revision–, 2021/04/20
Bibliographie
[1] Ingenieurgemeinschaft IgH : EtherLab – Open Source Toolkit for rapid realtime
code generation under Linux with Simulink/RTW and EtherCAT technology.
http://etherlab.org/en, 2008.
[2] IEC 61158-4-12 : Data-link Protocol Specification. International Electrotechnical
Commission (IEC), 2005.
[3] IEC 61158-6-12 : Application Layer Protocol Specification. International Elec-
trotechnical Commission (IEC), 2005.
[4] GNU General Public License, Version 2. http://www.gnu.org/licenses/
gpl-2.0.html. October 15, 2008.
[5] GNU Lesser General Public License, Version 2.1. http://www.gnu.org/
licenses/old-licenses/lgpl-2.1.html. October 15, 2008.
[6] Linux Standard Base. http://www.linuxfoundation.org/en/LSB. August 9,
2006.
[7] systemd System and Service Manager http://freedesktop.org/wiki/
Software/systemd. January 18, 2013.
[8] Wireshark. http://www.wireshark.org. 2008.
[9] Hopcroft, J. E. / Ullman, J. D. : Introduction to Automata Theory, Languages
and Computation. Adison-Wesley, Reading, Mass. 1979.
[10] Wagner, F. / Wolstenholme, P. : State machine misunderstandings. In : IEE
journal “Computing and Control Engineering”, 2004.
[11] RTAI. The RealTime Application Interface for Linux from DIAPM. https://
www.rtai.org, 2010.
[12] RT PREEMPT HOWTO. http://rt.wiki.kernel.org/index.php/RT_
PREEMPT_HOWTO, 2010.
[13] Doxygen. Source code documentation generator tool. http://www.stack.nl/
~dimitri/doxygen, 2008.
[14] Git SCM. https://git-scm.com, 2021.
[15] Autoconf – GNU Project – Free Software Foundation (FSF). http://www.gnu.
org/software/autoconf, 2010.
[16] IEC 61800-7-304 : Adjustable speed electrical power drive systems - Part 7-300 :
Generic interface and use of profiles for power drive systems - Mapping of profiles
to network technologies. International Electrotechnical Commission (IEC), 2007.
–revision–, 2021/04/20 95
Index
96 –revision–, 2021/04/20