Configurer un module Scaime eNod3-C en CANopen sur M340 en Unity

Bruno Guérangé (Nono40)

Cet article présente la configuration d'un module de pesage Scaime eNod3-C pour son utilisation sur un réseau CANopen sur un automate M340.

Si vous souhaitez commenter cet article : Commentez

- Titre : Configurer un module Scaime eNod3-C en CANopen sur M340 en Unity

- Auteur : Bruno Guérangé (Nono40)

- Parution : 19 mars 2010

- Licence : Copyright ® 2010 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Configuration du Module eNod3-C

- II-A. Raccordements

- II-A-1. Alimentation

- II-A-2. Pesons

- II-A-3. Liaison RS232

- II-A-4. Liaison CANopen

- II-A-5. Sélection de la communication active

- II-B. Configuration

- II-B-1. Connexion au module

- II-B-2. Configuration de la communication

- II-B-3. Configuration de l'étalonnage

- II-B-4. Étalonnage physique

- II-B-5. Filtrage

- III. Configuration de l'eNod dans Unity

- III-A. Fichier EDS de configuration

- III-B. Déclaration de l'eNod dans le catalogue matériel

- III-C. Ajouter un eNod dans une application

- III-D. Configurer les PDOs de l'eNod

- III-E. Génération de l'application

- III-E-1. Le numéro d'équipement 1 met en oeuvre une procédure de démarrage...

- III-E-2. Le nombre de %MW/%M réservés en entrée sur le bus xxx est supérieur...

- III-E-3. Le nombre de %MW/%M réservés en entrée sur le bus xxx est inférieur...

- III-E-4. Le PDO RX1 du module xx présente un problème. COBID incorrect

- III-F. Objets d'entrée/sortie auto-créés et mappage mémoire

- III-G. Premier test et mise au point

- III-H. Lire des objets manuellement via les SDO en configuration

- IV. Utilisation de l'eNod dans la programmation

- IV-A. Définition des variables liées à l'Objet eNod3-C

- IV-A-1. Utilisation d'un IODDT

- IV-A-2. Utilisation d'une structure en %MW

- IV-B. Lire et écrire des variables à la demande

- IV-B-1. Lecture avec READ_VAR

- IV-B-2. Écriture avec WRITE_VAR

- IV-C. Envoyer et gérer des commandes à l'eNod

- IV-C-1. Principe

- IV-C-2. Liste des commandes

- IV-D. Création du DFB de gestion

- IV-D-1. Structure publique des données eNod

- IV-D-2. Interface et variables privées

- IV-D-3. Code de recopie des valeurs PDOs

- IV-D-4. Code de lecture périodique des valeurs auxiliaires

- IV-D-5. Code de gestion des demandes IHM

- IV-D-6. Source de cet exemple

- V. Transmettre l'application

- V-A. Vous avez le fichier STU et le fichier CPX et pas d'eNod dans le catalogue

- V-B. Vous avez le fichier STU et le fichier CPX et l'eNod dans le catalogue non issu du CPX

- V-C. Vous avez le fichier STU mais pas le fichier CPX ou seulement le fichier EDS

- V-D. Vous avez le fichier STA et le fichier CPX et pas d'eNod dans le catalogue

- V-E. Vous avez le fichier STA et le fichier CPX et l'eNod dans le catalogue non issu du CPX

- V-F. Vous avez le fichier STA mais pas le fichier CPX ou seulement le fichier EDS

- V-G. En résumé

- VI. Conclusion

- VII. Remerciements

I - Introduction

Contrairement à la série TSX57 Premium, la gamme M340 de Schneider ne comporte pas de carte de pesage.
Pour ajouter des voies de pesage sur une configuration il faut donc installer et raccorder des modules externes sur l'automate.
Nous avons donc cherché des modules raccordables sur le réseau CANopen, CANopen est un bus de terrain ouvert et rapide, de plus il est intégré de série sur certaines CPU de la gamme M340.
Un des modules connectable sur le réseau CANopen est le transmetteur de pesage Scaime eNod3-C. Scaime est une marque reconnue dans le domaine du pesage et le module eNod3-C présente de très bonnes caractéristiques de mesure et filtrage.

Cet article va présenter les étapes de mise en oeuvre d'un module Scaime eNod3-C sur un M340.

Les version utilisées dans cet article sont :

- logiciel de paramétrage eNodView version 707-I ;

- logiciel de programmation Unity version 4.1 ;

- eNod3-C firmware 278, version métrologique 3 ;

- processeur Unity P34 2030.

Au delà de l'eNod, cet article montre la méthode pour utiliser un équipement tiers dans Unity. Hormis le chapitre II exclusivement dédié à l'eNod, le reste peut s'appliquer à d'autres équipements. Les règles de transfert d'applications données en V sont valables pour tous les équipements tiers.

La lecture de cet article suppose que vous connaissez déjà Unity, la création d'applications et la création de blocs fonctions DFB.

II - Configuration du Module eNod3-C

II-A - Raccordements

Le schéma général de raccordement est le suivant :

II-A-1 - Alimentation

Le raccordement de l'alimentation 24VDC s'effectue sur les bornes :

Nom

Signification

PWR+

Alimentation fil +24VDC

PWR REF

Alimentation fil 0VDC

II-A-2 - Pesons

Le raccordement des capteurs est sur le bornier... capteurs. La signification des bornes est la suivante :

Nom

Signification

Exc+

Alimentation plus des capteurs

Sense+

Contrôle d'alimentation plus

Exc-

Alimentation moins des capteurs

Sense-

Contrôle d'alimentation moins

Sig+

Signal plus

Sig-

Signal moins

Sheild

Raccordement du blindage du câble de mesure

Les cavaliers situés en A permettent de choisir une connexion 4 fils (cavaliers en place) ou 6 fils (cavaliers retirés).

II-A-3 - Liaison RS232

Le raccordement de la liaison RS232 s'effectue sur les bornes :

Nom

Signification

RX

Réception des données

TX

Émission des données

REF

Référence des signaux

II-A-4 - Liaison CANopen

Le raccordement de la liaison CANopen s'effectue sur les bornes :

Nom

Signification

CANL

Fil de données CANopen CANL

CANH

Fil de données CANopen CANH

L'eNod ne dispose pas de résistance de fin de ligne sur le réseau CANopen, résistance que l'on pourrait activer ou non en fonction de la position de l'eNod sur le réseau. Si l'eNod est physiquement le dernier sur le réseau, il faudra y ajouter une résistance de fin de ligne entre CANL et CANH d'une valeur de 120 Ohm.

II-A-5 - Sélection de la communication active

Une seule interface RS232/RS485 ou CANopen est active à la fois. La position du cavalier en B définit quelle interface est active.
Si le cavalier est présent l'interface RS232/RS485 est active.
Si le cavalier est absent l'interface CANopen est active.

La prise en compte du cavalier en B n'est faite qu'à la mise sous tension du module. Pour changer l'interface active, il faut positionner le cavalier dans la position voulue puis effectuer une coupure de courant sur le module.

II-B - Configuration

Pour configurer le module il faut utiliser le logiciel eNodView disponible gratuitement à cette adresse.
Commencez par télécharger et installer le logiciel.
Pour vous connecter sur le module le PC devra avoir un port série RS232 disponible, eNodView supporte les convertisseurs RS232/USB même si le numéro de port est configuré au delà de COM4.

Toutes les fonctionnalités du logiciel eNodView ne seront pas décrites ici, ni la description détaillée de tous les paramètres possibles.
L'eNod offre des capacités de filtrage et mesure étendues, cet article est volontairement limité aux réglages indispensables pour la mise en oeuvre et son raccordement au réseau CANopen.
Pour de plus amples informations sur les modules eNod, consultez la documentation en ligne.

II-B-1 - Connexion au module

Une fois la liaison RS232 connectée au module eNod, lancez eNodView. Au lancement le logiciel vous demande le type de liaison utilisée pour la connexion :

Restez en point à point et cliquez sur OK. Vous aurez alors la page principale d'eNodView.
Les onglets gris clair en haut de la fenêtre ne seront accessibles qu'une fois connectés à un eNod.

Si vous connaissez l'adresse et la vitesse de l'eNod, vous pouvez les entrer directement dans le bas de la fenêtre à droite du bouton connexion.
Si vous ne connaissez pas la vitesse ou l'adresse utilisée, cliquez sur Détection automatique, eNodeView va scruter les différentes adresses possibles dans les différentes vitesses possibles. A la fin de la scrutation les modules détectés seront affichés en vert :

Cliquez alors sur le rectangle vert pour mettre à jour l'adresse et la vitesse de la partie du bas.

Si la vitesse de connexion reste à 0, sélectionnez la valeur adéquate. La valeur 0 va autoriser la connexion mais le fonctionnement d'eNodView sera aléatoire.

Une fois l'adresse et la vitesse à jour, il suffit de cliquer sur Connexion. Une fois connecté, le bouton connexion sera affiché en gris foncé.

II-B-2 - Configuration de la communication

Dans l'onglet Paramètrage commencez par régler les paramètres de communication.

Description des paramètres

- Débit série : c'est le débit utilisé par la liaison RS232, donc pour le logiciel eNodView. Il n'est pas utile de changer cette valeur pour utiliser le module avec CANopen.

- Adresse eNod : c'est l'adresse du module à la fois en MODBUS sur la liaison RS232 et l'adresse sur le réseau CANopen. Sur le réseau CANopen chaque module doit avoir une adresse différente. Entrez ici l'adresse que vous voulez affecter à chaque module.

- Protocole de communication : c'est le protocole utilisé sur la liaison RS232. Laisser la valeur MODBUS pour pouvoir se connecter avec eNodView par la suite. CANopen est toujours actif quelque soit la valeur de ce paramètre.

- Débit bus CAN : entrez ici la vitesse de votre réseau CANopen. Le maitre et tous les esclaves doivent utiliser la même vitesse.

L'eNod3 ne détecte pas la vitesse du bus CANopen automatiquement, par défaut la vitesse est réglée sur 125000 bauds.

Une fois les paramètres mis à jour, cliquez sur le bouton Envoyer.
Puis cliquez sur le bouton Sauvegarder dans EEPROM situé sur la gauche.

Si vous avez changé l'adresse de l'eNod, le fait d'écrire dans l'EEPROM va prendre en compte cette nouvelle adresse. Vous allez alors perdre la connexion avec le module. Il suffit de retourner sur l'onglet Communication et de se reconnecter avec la nouvelle adresse.

II-B-3 - Configuration de l'étalonnage

Dans l'onglet Etalonnage configurez la portée et l'échelon de la bascule.
Notez que l'eNod ne gère pas de notion d'unité, seulement un nombre de points de mesure. La notion d'unité est à la charge de l'application cliente.

Tout ce que vous pouvez donner, c'est le nombre de points maximum et le nombre de points de chaque échelon.

Le nombre de points significatifs sera alors égal à EtendueDeMesure/Echelon.
Les valeurs que vous entrez ici dépendront de la qualité de la bascule et de ce que vous voulez avoir comme valeur dans l'automate.

Par exemple, une bascule de 1000 kg d'une précision de 2000 points pourra être configurée de la manière suivante :
- Etendue=10000
- Echelon=5
Le nombre de points significatifs sera bien de 2000. La valeur lue dans l'automate ira de 0 à 10000 par pas de 5.

Une fois les valeurs réglées, cliquez sur le bouton Envoyer puis retournez sur l'onglet paramétrage et cliquez sur Sauvegarder dans EEPROM.

Ici nous avons gardé les valeurs par défaut sur la sensibilité des pesons et les corrections de linéarité. Vous pouvez les changer dans les Options avancées de l'onglet Etalonnage.

II-B-4 - Étalonnage physique

Une fois la configuration du nombre de points de la bascule effectuée, il faudra faire un étalonnage de la bascule.
Aller sur l'onglet Etalonnage puis cliquez sur le bouton Etalonnage Physique. Les options de l'étalonnage sont affichées en dessous.

Choisissez le nombre de segments utilisés. Si votre bascule est bien linéaire, une seul segment suffira. Vous devrez de toute façon vérifier la linéarité de la bascule avec une charge étalon une fois la mise en oeuvre terminée.
Entrez aussi la charge étalon qui sera utilisée, cette charge doit être entrée en nombre de points de mesure. Si on reprend l'exemple précédent d'une bascule de 1000 kg par pas de 0.5 kg, un poids étalon de 600 kg devra être entré avec la valeur 6000.
Cliquez ensuite sur Envoyer/Démarrer l'étalonnage.

La suite est expliquée directement dans les messages de la fenêtre d'étalonnage. Les étapes sont dans l'ordre :

1. cliquer sur OK pour lancer la procédure. Ce n'est rien d'autre qu'une simple confirmation, en particulier la bascule n'a pas besoin d'être vide à ce moment là ;

2. vérifier l'absence de charge. Vider la bascule pour effectuer la mesure du point zéro. Une fois prêt, cliquer sur OK. Le nombre de points convertisseurs correspondant au zéro doit s'afficher sur la droite ;

3. poser la charge XXXX point 1. Poser la charge sur la bascule et une fois prêt, cliquer sur OK. Le nombre de points convertisseurs de ce point doit s'afficher sur la droite ;

4. poser la charge XXXX point 2 (optionnel). Poser la charge sur la bascule et une fois prêt, cliquer sur OK. Le nombre de points convertisseurs de ce point doit s'afficher sur la droite ;

5. poser la charge XXXX point 3 (optionnel). Poser la charge sur la bascule et une fois prêt, cliquer sur OK. Le nombre de points convertisseurs de ce point doit s'afficher sur la droite.

A la fin du dernier point, l'étalonnage se termine de lui-même et vous pouvez fermer la fenêtre.

Vous pouvez ensuite aller sur l'onglet Visualisation et cliquer sur Start. Vous aurez alors un affichage en continu de la mesure.

II-B-5 - Filtrage

Dans bien des cas il est nécessaire de filtrer la mesure pour éliminer le parasitage de l'environnement. Par défaut aucun filtre n'est activé.
Pour ajouter un filtrage, aller dans l'onglet Paramétrage puis cliquez sur le bouton Modifier le filtrage.

Pour ajouter un filtre passe-bas : sélectionnez le type de filtre Butterworth ou Bessel. Sélectionnez l'ordre du filtre et la valeur de sa fréquence de coupure.
Pour ajouter un filtre coupe-bande : sctivez le filtre coupe bande. Sélectionnez les fréquences de début de coupure et de fin de coupure.
Cliquez sur Calcul des coefficients, puis sur Envoyer.
N'oubliez pas non plus d'écrire les valeurs dans l'EEPROM par la suite.

Les valeurs à saisir ici dépendent de l'application et de son environnement. Dans les applications que j'ai eues à mettre en oeuvre, un filtrage passe bas d'ordre 2 ou 3 de fréquence de coupure à quelques Hz était suffisant.

eNodeView propose un outil de simulation des filtres donné dans l'onglet Analyse graphique. Il n'est pas présenté ici car cet article décrit principalement la mise en oeuvre de la connexion avec le M340.

III - Configuration de l'eNod dans Unity

Ce chapitre décrit les étapes nécessaires à la configuration de l'eNod sur le réseau CANopen d'un M340.

III-A - Fichier EDS de configuration

Tous les esclaves CANopen disposent d'un fichier EDS (Electronic Data Sheet) décrivant les propriétés de l'esclave sur le réseau CANopen.
Dans le cas de l'eNod vous pouvez télécharger le fichier EDS à cette adresse, sur la droite.
Le fichier utilisé dans cet article est le fichier eNod3_EDS_165718-G.eds.

Note très importante : certaines versions d'Unity (en particulier la version 4.1 actuelle) interprètent mal une partie de ce fichier EDS.
Il est fortement conseillé de faire les modifications suivantes dans le fichier EDS avant de l'intégrer au catalogue.
Si vous ne le faites pas, vous risquez de ne pas avoir un fonctionnement correct des télégrammes TPDO1 et RPDO1.
D'après Chorus ce bug sera corrigé dans la version 5.0 d'Unity.

Procédure d'adaptation du fichier EDS :
ouvrez le fichier EDS avec un éditeur de texte.
Cherchez la section [1400sub1] et dans cette section supprimez les lignes :

LowLimit=0x00000201
HighLimit=0x0000027F

Cherchez la section [1800sub1] et dans cette section supprimez les lignes :

LowLimit=0x00000181
HighLimit=0x000001FF

Enregistrez le fichier sous un nouveau nom.

III-B - Déclaration de l'eNod dans le catalogue matériel

Pour pouvoir ajouter l'eNod dans la configuration matérielle de l'automate, il faut déjà déclarer l'eNod dans le catalogue d'Unity.
Si Unity est déjà démarré, commencez par le fermer, puis lancez le Gestionnaire de catalogue matériel situé dans le menu démarrer dans Schneider Electric->So Collaborative->Unity Pro.

Dans le menu Edit, sélectionnez Add Device.
Ouvrez ensuite le fichier EDS de l'eNod, et surtout sa version modifiée si vous avez suivi le conseil du § III-A.

Dans cette fenêtre vous avez la liste des objets mappables dans les PDO de CANopen avec la liste de ceux déjà mappés.
C'est ici que vous pourrez prédéfinir le mappage par défaut des PDO. Vous définirez aussi ici les structures de données d'entrées/sorties (IODDT) adaptées à chacune des fonctions. Le mappage des PDO pourra être changé par la suite dans Unity directement, par contre la structure des IODDT ne pourra pas l'être. Par défaut laissez la définition proposée pour l'IODDT afin de bénéficier de toutes les variables possibles. Vous n'aurez qu'à ignorer celles non utilisées.

Attention : le nom de l'IODDT créé par défaut sur l'eNod3 est trop long pour être accepté par la suite dans Unity.
Je vous recommande donc de changer le nom de l'IODDT de T_eNod3_digital_Transmitte_Default en T_eNod3_C.

Une fois le module importé, cliquez sur Build catalogue pour mettre à jour le catalogue.

III-C - Ajouter un eNod dans une application

Lancez unity, nous supposons ici que vous avez déjà configuré une CPU ayant une voie CANopen.
Dans le navigateur, allez dans Projet->Configuration->Bus automate->(Rack 0)->BMX P34 xxx->CANopen

Sélectionnez ici la vitesse du réseau CANopen, elle doit être la même que celle sélectionnée dans tous les esclaves. Vous devez entrer aussi l'adresse du premier mot de la zone image des entrées et l'adresse du premier mot de la zone image des sorties.
Chaque esclave CANopen va utiliser un certain nombre de mots. Les mots sont utilisés à partir des adresses de début et par ordre d'adresse sur le réseau.

Si vous ne savez pas de combien de mots vous avez besoin, mettez à jour seulement les adresses de début et laissez les valeurs par défaut sur les nombres.
Les messages d'erreur ou d'avertissement décrits en III-E vous donneront la taille exacte à entrer ici !
Notez qu'un eNod3-C demande 28 mots d'entrée et 2 mots de sortie.

Allez ensuite dans le menu Projet->Configuration->CANopen.

Double cliquez sur le carré représentant le premier esclave, ou sur un carré libre si votre réseau comporte déjà d'autres esclaves. Sélectionnez ensuite l'eNod ajouté précédemment au catalogue. Donnez son adresse sur le réseau, elle doit correspondre à celle donnée au module avec le logiciel eNodView.

A la validation vous aurez peut-être le message suivant :

Le numéro d'équipement 1 met en oeuvre une procédure de démarrage, mais l'UC en cours ne gère pas le mode expert CANOpen

Votre CPU configuré ne supporte pas le mode expert CANopen. Dans le cas de l'eNod ce message peut-être ignoré. Seules les CPU avec une voie CANopen2 supportent le mode expert.

III-D - Configurer les PDOs de l'eNod

Une fois l'eNod ajouté, double cliquer dessus puis aller sur l'onglet PDO.

Zone A :
vous avez la liste des PDO émis au sens module. Pour le programme automate ce sera ici les données reçues. Dans l'eNod le PDO1 reçu est obligatoirement activé et le contenu ne peut pas être modifié. Le PDO1 comporte le retour du mot de commande, il est envoyé par l'eNod à chaque fois que la valeur change.
Vous avez ensuite les PDO2 et PDO3 avec leur valeur par défaut. Par défaut ils sont désactivés. En général dans les applications il faut activer l'un ou les deux PDO afin d'avoir un échange de données cyclique avec l'eNod. Le nombre de données par PDO est limité à 2 par l'eNod. Vous pourrez donc lire au maximum quatre données de manière cyclique. Les objets mappables dans ces PDO sont donnés dans la liste de droite (Zone C).

Zone B :
vous avez la liste des PDO reçus au sens module. Pour le programme ce sera les données envoyées.
Seul le PDO1 est configuré et il n'est pas modifiable. l'eNOD n'autorise pas d'autre PDO de réception. En bref : vous ne pouvez rien changer dans la zone B !

Zone C :
liste des objets mappables dans les zones A ou B.
Dans le cas de l'eNod seule la zone A peut être modifiée.

Ce que vous devez échanger dépendra de l'application. La configuration par défaut correspond surtout à une application de type trieuse pondérale. Dans le cas, comme moi, de l'utilisation comme voie de pesage c'est surtout le poids brut, le poids net et l'état de la mesure qui importent en lecture cyclique. Dans la suite de l'article nous supposerons que la configuration des PDO est la suivante :

A savoir que nous échangerons de manière cyclique le poids brut, le poids net et les statuts.

III-E - Génération de l'application

A partir de ce moment vous pouvez générer, transférer et tester la communication avec l'eNod. Si à la génération vous avez des erreurs ou des alertes concernant les eNod, la communication ne sera alors pas forcément opérationnelle. Voici la liste des avertissements que nous avons eu lors des essais et leur explication.

III-E-1 - Le numéro d'équipement 1 met en oeuvre une procédure de démarrage...

Texte complet : Le numéro d'équipement 1 met en oeuvre une procédure de démarrage, mais l'UC en cours ne gère pas le mode expert CANOpen

Votre CPU ne supporte pas le mode expert CANopen, vous pouvez ignorer ce message.

III-E-2 - Le nombre de %MW/%M réservés en entrée sur le bus xxx est supérieur...

Texte complet : (l'un ou plusieurs des textes suivants )
Le nombre de %MW réservés en entrée sur le bus 3 est supérieur au nombre requis. La configuration exige xx %MW en entrée.
Le nombre de %MW réservés en sortie sur le bus 3 est supérieur au nombre requis. La configuration exige xx %MW en sortie.
Le nombre de %M réservés en entrée sur le bus 3 est supérieur au nombre requis. La configuration exige xx %M en entrée.
Le nombre de %M réservés en sortie sur le bus 3 est supérieur au nombre requis. La configuration exige xx %M en sortie.

Vous avez réservé plus d'espace que nécessaire. Ce n'est pas bloquant. Pour supprimer ces messages définissez la taille exacte dans :
Projet->Configuration->Bus automate->(Rack 0)->BMX P34 xxx->CANopen

III-E-3 - Le nombre de %MW/%M réservés en entrée sur le bus xxx est inférieur...

Texte complet : (l'un ou plusieurs des textes suivants )
Le nombre de %MW réservés en entrée sur le bus 3 est inférieur au nombre requis. La configuration exige xx %MW en entrée.
Le nombre de %MW réservés en sortie sur le bus 3 est inférieur au nombre requis. La configuration exige xx %MW en sortie.
Le nombre de %M réservés en entrée sur le bus 3 est inférieur au nombre requis. La configuration exige xx %M en entrée.
Le nombre de %M réservés en sortie sur le bus 3 est inférieur au nombre requis. La configuration exige xx %M en sortie.

Vous avez réservé moins d'espace que nécessaire. C'est bloquant, vous devez modifier le nombre dans :
Projet->Configuration->Bus automate->(Rack 0)->BMX P34 xxx->CANopen

III-E-4 - Le PDO RX1 du module xx présente un problème. COBID incorrect

Texte complet :
{Equipement (\3.1\0.0 ) eNod3_digital_Transmitte} : Le PDO RX1 du module xx présente un problème. COBID incorrect.
{Equipement (\3.1\0.0 ) eNod3_digital_Transmitte} : Le PDO TX1 du module xx présente un problème. COBID incorrect.

Cet avertissement est dû à une mauvaise interprétation du fichier EDS par Unity. Cela veut dire aussi que vous n'avez pas suivi mon conseil donné au III-A et que vous avez utilisé le fichier EDS sans le modifier;).

Vous allez donc devoir modifier ce fichier EDS

1. Supprimez dans votre application tous les eNod du réseau CANopen.

2. Enregistrez l'application et fermer Unity.

3. Retournez dans le Gestionnaire de catalogue.

4. Supprimez l'eNod3 du catalogue.

5. Reconstruisez le catalogue.

6. Ajoutez le fichier EDS modifié comme expliqué au § III-A.

7. Reconstruisez le catalogue.

8. Lancez de nouveau Unity et recommencer la configuration des eNod...

III-F - Objets d'entrée/sortie auto-créés et mappage mémoire

L'ajout d'un eNod sur le réseau CANopen va créer des objets d'entrée/sortie (%I %Q) correspondant aux variables mappables dans les PDO. De même une image de ces variables sera disponible dans la zone %MW configurée pour le réseau CANopen. Tous les objets mappables auront une adresse d'entrée/sortie et une adresse dans la zone %MW même s'ils ne sont actuellement pas utilisés dans les PDO. La taille des zones sera donc toujours la même quel que soit le nombre d'objets définis dans les PDO.

Dans le cas d'un eNod3-C voici la liste des objets configurés dans la zone %I/%Q et dans la zone %MW. L'adresse de début de la zone %MW dépend des adresses %MW configurées sur la carte CANopen.

Liste des objets auto-créés en entrée

Zone %I

Zone %MW

Format

%IF\3.x\0.0.0.0

+0

FLOAT

Bascule de contrôle : écart type

%ID\3.x\0.0.0.2

+2

DINT

Poids net

%ID\3.x\0.0.0.4

+4

DINT

Poids brut

%ID\3.x\0.0.0.6

+6

DINT

Nombre de points convertisseurs

%ID\3.x\0.0.0.10

+10

DINT

Bascule de contrôle : résultat

%ID\3.x\0.0.0.12

+12

DINT

Bascule de contrôle : minimum

%ID\3.x\0.0.0.14

+14

DINT

Bascule de contrôle : maximum

%ID\3.x\0.0.0.16

+16

DINT

Bascule de contrôle : crête à crête

%ID\3.x\0.0.0.18

+18

DINT

Bascule de contrôle : nombre de cycles

%ID\3.x\0.0.0.20

+20

DINT

Bascule de contrôle : moyenne

%ID\3.x\0.0.0.22

+22

DINT

Bascule de contrôle : temps de marche

%IW\3.x\0.0.0.24

+24

INT

Retour du mot de commande

%IW\3.x\0.0.0.25

+25

INT

État de la mesure

%IW\3.x\0.0.0.26

+26

INT

État des entrées logiques

%IW\3.x\0.0.0.27

+27

INT

État des sorties logiques

Liste des objets auto-créés en sortie

Zone %Q

Zone %MW

Format

%QW\3.x\0.0.0.0

+0

INT

Mot de commande

Vous pouvez obtenir facilement l'adressage %MW en visualisation pour les objets configurés en PDO une fois que la génération est faite. Il suffit de retourner dans l'écran de configuration des PDO :

III-G - Premier test et mise au point

Une fois l'application chargée dans l'automate, on peut vérifier le bon fonctionnement de l'eNod en créant une table d'animation sur les objets créés.

Dans la version Unity utilisée, l'écran de mise au point de l'objet CANopen ne donne pas les bonnes valeurs !
En restant dans le cas de l'image ci-dessus, voici ce que donne l'écran de mise au point :

III-H - Lire des objets manuellement via les SDO en configuration

Une fois en ligne sur l'automate vous pouvez aller dans l'écran CANopen de chaque eNod afin d'envoyer manuellement des trames SDO.

Cette fonctionnalité est bien pratique pour lire/écrire des valeurs sous CANopen sans avoir à écrire une seule ligne de code.

IV - Utilisation de l'eNod dans la programmation

Nous allons expliquer ici par étape la construction d'un DFB effectuant les tâches de base sur un eNod :
- définir des structures de travail sur les objets lus par le réseau ;
- apprendre à lire/écrire des valeurs dans l'eNod via les fonctions READ_VAR et WRITE_VAR ;
- envoyer et gérer le mot de commande de l'eNod ;
- assembler le tout pour en faire un DFB réutilisable.

IV-A - Définition des variables liées à l'Objet eNod3-C

Comme vu précédemment dans le III-F, l'ajout d'un eNod sur le réseau CANopen crée automatiquement deux séries de variables, l'une en zone entrées/sortie, l'autre en zone M.
Manipuler ces variables directement par adresse n'est pas simple ni lisible. Il est possible d'affecter des variables à l'une ou l'autre des Zones.

Vous pouvez utiliser l'une ou l'autre des deux méthodes suivantes, et même les deux en même temps.

IV-A-1 - Utilisation d'un IODDT

L'ajout au catalogue d'un équipement, crée au moins un type IODDT (Input Output Derive Data Type) correspondant aux adresses topologiques créées par l'eNod. Pour créer une variable de ce type, créer une nouvelle variable et sélectionner le type IODDT de l'eNod3-C dans les types importés du catalogue :

Comme toute variable basée sur un IODDT la localisation est obligatoire, de toute façon c'est le but.
Pour localiser la variable sur l'eNod3 pour devez donner une adresse topologique sous la forme %CH\3.ad\0.0.0 ou ad sera l'adresse CANopen de l'enod.

Une fois la génération effectuée, vous verrez que les membres de votre variable vont se calquer sur les adresses topologiques de l'eNod :

Au lieu d'utiliser %ID\3.1\0.0.0.2 vous utiliserez IOeNod3C.Net_measurement.
Ces types IODDT peuvent aussi servir de type de paramètres pour des blocs fonctions dérivés (DFB) effectuant un traitement sur les eNod.

IV-A-2 - Utilisation d'une structure en %MW

Il est aussi possible de calquer une structure sur la zone de mots image de l'eNod. Contrairement aux IODDT il n'existe pas de type prédéfini dans la catalogue. Il faut créer soi-même le type utilisateur (DDT) correspondant au mappage des %MW.
Dans le cas de l'eNod3-C voici les types de structures à utiliser :

Il faut ensuite créer une variable de ce type et localiser cette variable au premier %MW de l'eNod.

Au lieu d'utiliser %MD502 (ce qui n'est d'ailleurs pas possible sur un M340 !) il faut utiliser eNodB1IN.NODNet.
Ces types DDT peuvent aussi servir de type de paramètres pour des blocs fonctions dérivés (DFB) effectuant un traitement sur les eNod.

IV-B - Lire et écrire des variables à la demande

Le nombre de données des PDO cycliques est limité. En dehors du mot de commande il n'est possible de lire que quatre valeurs et il n'est pas possible d'en écrire.
Grâce aux fonctions READ_VAR et WRITE_VAR nous allons pouvoir lire/écrire des valeurs à la demande dans tous les objets disponibles de l'eNod et pas seulement dans les objets mappables. Par exemple il est possible de lire la valeur maximum ou l'échelon de l'eNod.

Nous supposons ici que vous avez déjà utilisé ces fonctions, en particulier que vous connaissez l'utilisation du tableau de quatre mots servant de contrôle de communication. Dans le cas contraire reportez-vous à l'aide en ligne d'Unity.

La liste des adresses accessibles en lecture/écriture est donnée dans la documentation CANopen de l'eNod au chapitre 3.2 Objets spécifiques à l'eNod3-C.

IV-B-1 - Lecture avec READ_VAR

Dans le cas de CANopen les paramètres de READ_VAR sont à utiliser de la manière suivante :

Nom

Type

Description

ADR

ANY_ARRAY_INT

Adresse du module. Il est conseillé d'utiliser la fonction ADDM() en utilisant l'adresse sous forme de chaine.
L'adresse sera donc de la forme ADDM('r.c.v.a'), où r est le numéro de rack, c le numéro de carte, v le numéro de voie et a l'adresse CANopen de l'enod.
Par exemple l'eNod d'adresse 1 sur le réseau CANopen du processeur aura l'adresse ADDM('0.0.2.1').

OBJ

STRING

Ici c'est toujours 'SDO' qu'il faut mettre. C'est le seul type d'objet possible

NUM

DINT

Adresse de l'objet à lire. Le poids faible sera l'index de l'objet, le poids fort sera le sous-index de l'objet.
Par exemple pour lire le poids étalon du premier segment d'étalonnage il faut lire l'index 3001 sous-index 1 : 16#00013001.

NB

INT

Le nombre de mots à lire n'est pas utilisé ici car la messagerie SDO ne lit toujours qu'une seule variable : mettre 0.

RECP

ANY_ARRAY_INT

Tableau de mot qui contiendra le résultat. Un tableau de deux mots suffit en taille car au maximum on ne peut lire qu'un mot double à la fois

GEST

ANY_ARRAY_INT

Tableau de type ARRAY[0..3]OF INT servant de table de gestion.
Avant l'appel il faut positionner le mot GEST[2] avec la valeur de Timeout en 0.1 secondes.
A la fin de l'échange le mot GEST[3] contiendra le nombre d'octets lus.

Voici un exemple d'appel en langage structuré :

ReadCom[2] := 50; (* Time out 5 seconds *)
ReadBuffer[0] := 0; (* Reset last read value *)
ReadBuffer[1] := 0; (* Reset last read value *)
READ_VAR(ADDM('0.0.2.1'),'SDO',16#00013001,0,ReadCom,ReadBuffer);

IV-B-2 - Écriture avec WRITE_VAR

Dans le cas de CANopen les paramètres de WRITE_VAR sont à utiliser de la manière suivante :

Nom

Type

Description

ADR

ANY_ARRAY_INT

Adresse du module. Il est conseillé d'utiliser la fonction ADDM() en utilisant l'adresse sous forme de chaine.
L'adresse sera donc de la forme ADDM('r.c.v.a'), où r est le numéro de rack, c le numéro de carte, v le numéro de voie et a l'adresse CANopen de l'eNod.
Par exemple l'eNod d'adresse 1 sur le réseau CANopen du processeur aura l'adresse ADDM('0.0.2.1').

OBJ

STRING

Ici c'est toujours 'SDO' qu'il faut mettre. C'est le seul type d'objet possible

NUM

DINT

Adresse de l'objet à écrire. Le poids faible sera l'index de l'objet, le poids fort sera le sous index de l'objet.
Par exemple pour écrire le poids étalon du premier segment d'étalonnage il faut écrire l'index 3001 sous-index 1 : 16#00013001.

NB

INT

Le nombre de mots à lire n'est pas utilisé ici car la messagerie SDO n'écrit toujours qu'une seule variable : mettre 0.

EMIS

ANY_ARRAY_INT

Tableau qui contient les données à envoyer

GEST

ANY_ARRAY_INT

Tableau de type ARRAY[0..3]OF INT servant de tableau de gestion.
Avant l'appel il faut positionner le mot GEST[2] avec la valeur de Timeout en 0.1 secondes.
Avant l'appel if faut positionner le mot GEST[3] avec le nombre d'octets à écrire. Le nombre d'octets doit correspondre à la donnée que vous voulez écrire. Si cette longueur ne correspond pas au type réel de la donnée écrite, le message sera refusé par l'eNod.

Voici un exemple d'appel en langage structuré :

WriteCom[2] := 50; (* Time out 5 seconds *)
WriteCom[3] := 4;  (* 4 bytes to write *)
WRITE_VAR(ADDM('0.0.2.1'),'SDO',16#00013001,0,WriteBuffer,WriteCom);

IV-C - Envoyer et gérer des commandes à l'eNod

Toutes les commandes envoyées à l'eNod se font via le registre MotDeCommande défini dans le PDO1. Ce PDO n'étant pas modifiable le mot de commande et son retour sont toujours disponibles.

IV-C-1 - Principe

Le principe d'envoi d'une commande est simple : l'application envoie un code de commande en plaçant sa valeur dans le mot de commande. L'eNod traite la commande et envoie la réponse dans le retour de commande.
La réponse ne peut prendre que les valeurs suivantes :

- 0=pas de commande envoyée depuis la mise sous tension ;

- 1=commande en cours de traitement ;

- 2=commande terminée OK ;

- 3=commande terminée NOK ou commande refusée.

La commande refusée peut être, par exemple, un code commande inconnu ou une commande non exécutable compte tenu de l'état du module, comme une tare sur un poids brut négatif.
En cas d'erreur, il n'y a pas de détail sur celle-ci. Il faut donc bien respecter les commandes possibles en fonction de l'état de la mesure en cours.

Le mot de retour n'est pas remis à zéro quand le mot de commande est remis à zéro, sauf si la commande précédente est refusée. De ce fait lors de l'envoi successif de deux commandes réussies, il n'est pas possible de savoir après la deuxième commande si la valeur 2 lue est toujours pour la commande précédente ou cette deuxième commande. Comme on ne gère pas le message SYNC d'envoi des PDO il n'est pas possible de savoir s'il y a eu une lecture du mot de retour entre deux commandes.

Pour pallier à cet état de fait et sur le conseil de Scaime nous recommandons d'utiliser la séquence suivante pour chaque commande envoyée :

1. envoyer une commande dans le mot de commande ;

2. attendre la valeur 2 ou 3 dans le mot de retour ;

3. envoyer la commande 16#00FF volontairement inconnue dans le mot de commande pour forcer l'eNod à répondre 3 ;

4. attendre la valeur 3 dans le mot de retour ;

5. remettre le mot de commande à zéro ;

6. attendre que l'eNod mette le mot de retour à zéro.

IV-C-2 - Liste des commandes

Voici une liste partielle des commandes possibles, celles-ci sont celles utilisées pour la gestion de l'étalonnage et de la mesure. Les autres commandes, comme celles liées à la fonction bascule de contrôle, sont décrites dans la documentation CANopen de l'eNod. Ces commandes sont celles que vous devrez gérer au minimum pour effectuer un étalonnage de l'eNod via le réseau CANopen.

Code (Hexa)

Nom

Commentaire

35

Annulation tare

Si une tare a été effectuée, elle est annulée et le poids net revient au poids brut

C8

Début étalonnage

Cette commande doit être envoyée en premier pour effectuer un étalonnage complet : point zéro + segment(s)

C9

Point zéro étalonnage

Cette commande effectue le point zéro de l'étalonnage complet

CA

Segment 1 étalonnage

Cette commande effectue le point segment 1 avec le poids étalon 1 configuré avec eNodView

CB

Segment 2 étalonnage

Cette commande effectue le point segment 2 avec le poids étalon 2 configuré avec eNodView

CC

Segment 3 étalonnage

Cette commande effectue le point segment 3 avec le poids étalon 3 configuré avec eNodView

CD

Sauvegarde étalonnage

Sauvegarde en EEPROM l'étalonnage en cours et sort du mode étalonnage

CF

Zéro

Effectue un zéro simple de la bascule, n'est pas conservé en EEPROM

D0

Tare

Effectue une tare

D1

Recalage zéro

Effectue un recalage du zéro d'étalonnage.

D3

Annulation

Sort du mode étalonnage

Il y a quelques séquences à respecter dans cette liste afin que l'eNod prenne en compte les commandes.

Étalonnage complet :
Il faut absolument respecter cet ordre :

1. C8 : mode étalonnage ;

2. C9 : point zéro ;

3. CA : segment 1 ;

4. CB (facultatif) : segment 2 ;

5. CC (facultatif) : segment 3 ;

6. CD : sauvegarde.

Une fois la procédure commencée, vous devez allez jusqu'a la fin. La commande D3 sort du mode étalonnage mais ne restaure pas l'étalonnage précédent. Le seul moyen de sortir de l'étalonnage en cours est de couper l'alimentation de l'eNod.
Il faut toujours faire au moins le segment 1. La séquence C8 C9 CD pour effectuer un zéro seul ne fonctionne pas, pour recaler le zéro utiliser la séquence ci-après.

Étalonnage zéro seul :
Il faut absolument respecter cet ordre :

1. D1 : recalage du zéro ;

2. CD : sauvegarde.

Il ne faut pas utiliser la commande C8 pour effectuer cette opération, la commande D1 passe implicitement l'eNod en mode étalonnage. Pour sortir vous pouvez sauvegarder avec la commande CD ou annuler avec la commande D3. La commande D3 sort du mode étalonnage implicite mais le zéro effectué reste actif... jusqu'à la prochaine coupure de courant !

Autres commandes :
Les autres commandes de tare/zéro/brut sont des commandes classiques d'une bascule. Elles ne fonctionnent que si le module n'est pas en mode étalonnage. La commande tare n'est possible que si le poids brut est positif et la commande zéro n'est 'autorisée que dans une plage de 10% autour du zéro d'étalonnage.

Notez que si vous appliquez cet article à un eNod3-D au lieu d'un eNod3-C, les valeurs des commandes sont totalement différentes. Le fonctionnement reste identique.

IV-D - Création du DFB de gestion

IV-D-1 - Structure publique des données eNod

Pour stocker les valeurs publiques du DFB nous allons créer la structure suivante :

Les variables de ce type pourront être passées en paramètre du DFB et être localisées afin d'être accessibles à partir d'une IHM.
La description des champs est la suivante :

Nom

Description

Command

Mot de commande utilisé par l'IHM pour envoyer des commandes à l'eNod

Result

Retour du mot de commande

StandardLoad

Poids étalon devant être utilisé pour un étalonnage complet à un segment

NetWeight

Poids net actuel

Stability

Est VRAI si la bascule est stable, la stabilité est calculée par l'eNod

ScaleERR

Est VRAI si l'eNod est en défaut, soit de communication, soit la mesure n'est pas valide ou hors bornes

Status

Copie pour info du status de la mesure retournée par l'eNod

IsNet

Est vrai si la valeur lue est un poids net, FAUX si c'est un poids brut

RES

Réserve

ReadValues[]

Tableau contenant des informations complémentaires sur l'étalonnage

IV-D-2 - Interface et variables privées

Pour notre DFB nous allons utiliser l'interface et les variables privées suivantes.

Nom

Type

Description

------ Entrées ------

Address

STRING

Adresse de l'eNod sous forme de chaine. Cette chaine est au format 'r.c.v.a' pour être utilisée avec ADDM. Voir IV-B-1

CanOpenOK

EBOOL

Bit indiquant que la communication avec l'eNod est établie. Dans le cas d'un CANopen intégré au processeur c'est %IW0.2.35.a où a est l'adresse CANopen moins 1.

Top

EBOOL

Top de demande de lecture de donnée auxiliaire. A chaque front montant une lecture sera demandée. Permet de réduire le nombre de trames si les données auxiliaires n'ont pas besoin d'être rafraichies souvent. %S6 est une bonne valeur pour ce paramètre.

------ Sorties ------

Weight

DINT

Poids lu sur l'eNod.

Stability

BOOL

Indique si la mesure lue est stable

ScaleERR

BOOL

Indique si la mesure est en erreur ou si la communication est coupée.

------ Entrées/Sorties ------

eNodIN

TeNodIN

Structure mappant la zone image en entrée du module eNod sur le CANopen. Voir IV-A-2.

eNodOUT

TeNodOUT

Structure mappant la zone image en sortie du module eNod sur le CANopen. Voir IV-A-2.

eNodDatas

TeNodDatas

Structure contenant les données publiques du DFB. Voir IV-D-1.

------ Privé ------

AdresseModule

ADDM_TYPE

Conversion de Address en tableau utilisable directement par READ_VAR et WRITE_VAR

ReadIndex

INT

Index de lecture dans la liste des valeurs auxiliaires à lire

ReadAdrs

ARRAY[0..9]OF DINT

Contient la liste des adresses des objets CANopen à lire périodiquement. Chaque élément donne une adresse CANopen sous une forme utilisable par READ_VAR : le poids faible est l'index et le poids fort est le sous-index.

Reading

BOOL

Flag indiquant qu'une lecture est déjà en cours.

ReadCom

ARRAY[0..3]OF INT

Tableau contenant les mots de gestion utilisés par READ_VAR.

ReadBuffer

ARRAY[0..1]OF INT

Tableau de réception de la commande READ_VAR.

CommandeMem

INT

Mémoire de la commande IHM donnée dans eNodDatas.Command, cette mémoire permet de détecter un changement de valeur et donc une nouvelle commande.

CommandeStep

INT

Étape en cours dans le traitement de la commande

WriteCom

ARRAY[0..3]OF INT

Tableau contenant les mots de gestion utilisés par WRITE_VAR.

WriteBuffer

ARRAY[0..1]OF INT

Tableau d'émission de la commande WRITE_VAR.

TempWord0

WORD

Mot temporaire pour la conversion DINT vers deux INT

TempsWord1

WORD

Mot temporaire pour la conversion DINT vers deux INT

IV-D-3 - Code de recopie des valeurs PDOs

Le début du code va mettre à jour le poids et l'état de la mesure lus dans l'eNod dans la structure eNodDatas. Comme les valeurs sont lues cycliquement il suffit juste de les recopier.

(* Copy actual values to Tool data *)
eNodDatas.NetWeight := eNodIN.NODNet;
eNodDatas.Stability := eNodIN.NODStatus.4;
eNodDatas.ScaleERR := ((eNodIN.NODStatus AND 16#000F)<>0) OR Not CanOpenOk;
eNodDatas.Status := eNodIN.NODStatus;
eNodDatas.IsNet := eNodIN.NODNet<>eNodIN.NODBrut;
(* And to Ouput datas *)
Weight := eNodDatas.NetWeight;
Stability := eNodDatas.Stability;
ScaleERR := eNodDatas.ScaleERR;

IV-D-4 - Code de lecture périodique des valeurs auxiliaires

A chaque front de TOP, s'il n'y a pas de lecture en cours, une nouvelle lecture va être lancée. Notez le test classique de ReadCom[0].0 pour ne pas lancer de nouvelle demande tant que le READ_VAR précédent n'a pas terminé.

(* If not reading, send SDO request *)
If Not Reading And Not ReadCom[0].0 And RE(TOP) And CanOpenOk Then
(* Check read index *)
If (ReadIndex>9) or (ReadAdrs[ReadIndex]=0) Then
ReadIndex := 0;
End_if;
(* Send SDO message *)
Reading := True;
ReadCom[2] := 50; (* Time out 5 seconds *)
ReadBuffer[0] := 0; (* Reset last read value *)
ReadBuffer[1] := 0; (* Reset last read value *)
READ_VAR(AdresseModule,'SDO',ReadAdrs[ReadIndex],0,ReadCom,ReadBuffer);
End_if;

Classiquement, sur le front descendant du bit d'activité, on teste si l'échange est correct et on sauve la valeur.
La valeur lue est stockée en DINT quelque soit sont format d'origine BYTE,INT ou DINT.

(* Check reading response *)
if Reading And Not ReadCom[0].0 And CanOpenOk Then
Reading := False;
If ReadCom[1]=0 Then (* No error *)
eNodDatas.ReadValues[ReadIndex] := INT_As_DINT(ReadBuffer[0],ReadBuffer[1]);
Inc(ReadIndex);
End_if;
end_if;

IV-D-5 - Code de gestion des demandes IHM

Sur chaque nouvelle demande IHM, c'est à dire quand eNodDatas.Command change de valeur, il faut gérer l'envoi et le suivi vers l'eNod comme décrit en IV-C-1. Si la nouvelle commande est nulle, le retour de le demande sera mis à zéro aussi. L'IHM devra donc gérer de façon simple les commandes :

1. nouvelle commande dans eNodDatas.Command ;

2. attente de fin de traitement. La commande est terminée quand eNodDatas.Result=eNodDatas.Command ;

3. mettre la commande à zéro dans eNodDatas.Command ;

4. attendre que eNodDatas.Result soit à zéro.

Les codes commandes sont identiques à ceux gérés par l'eNod. La liste est donnée en IV-C-2.

Dans le cas de la commande CA (Premier segment) il faut s'assurer que eNodDatas.StandardLoad a la bonne valeur avant d'envoyer la commande.

Le code de gestion des commandes est en deux parties. La première détecte le changement de valeur du mot de commande et lance la séquence de traitement. La séquence débute à l'étape 3, sauf pour la command CA ou la séquence commence à l'étape 1. Les étapes 1 et 2 se chargent d'écrire le poids étalon avant d'envoyer la commande.

(* New command *)
If (eNodDatas.Command<>CommandMem) And CanOpenOk Then
If eNodDatas.Command=0 Then
(* Command has been reseted, we reset the response *)
eNodDatas.Result := 0;
CommandMem := 0;
CommandStep := 0;
Else
(* New command *)
CommandMem := eNodDatas.Command;
If CommandMem=16#00CA Then
CommandStep := 1;  (* Start command sequence by sending the Standard load *)
Else
CommandStep := 3;
End_if;
End_if;
End_if;

La deuxième partie gère la séquence d'une commande vers l'eNod comme décrit en IV-C-1.

(* Steps for manage command *)
CASE CommandStep OF
1:    (* Step 1 : send normal weight by using SDO *)
WriteCom[2] := 50; (* Time out 5 seconds *)
WriteCom[3] := 4;  (* 4 bytes to write *)
DINT_AS_WORD(eNodDatas.StandardLoad,TempWord0,TempWord1);
WriteBuffer[0]:=WORD_TO_INT(TempWord0);
WriteBuffer[1]:=WORD_TO_INT(TempWord1);
WRITE_VAR(AdresseModule,'SDO',16#00013001,0,WriteBuffer,WriteCom);
CommandStep:=2;

2:    (* Write for the end of WRITE_VAR *)
If Not WriteCom[0].0 Then
If WriteCom[1]=0 Then
CommandStep:=3; (* OK we continue *)
Else
CommandStep:=1; (* Retry *)
End_if;
End_if;

3:    (* Send command to the eNod *)
eNodOUT.NODBufferOut := CommandMem;
(* And wait for the result *)
If eNodIN.NODBufferIn>1 Then
If eNodIN.NODBufferIn=2 Then
CommandStep := 4; (* Command completed *)
else
CommandStep := 4; (* Error must be completetd here ******)
End_if;
End_if;

4:    (* Send volontary an unknow command to force the 3 value in response *)
eNodOUT.NODBufferOut := 16#FF;
If eNodIN.NODBufferIn=3 Then
CommandStep := 5; (* 3 is the only value we can get for an unknow value *)
End_if;

5:    (* Now we send 0 (idle) command to reset the last error *)
eNodOUT.NODBufferOut := 0;
If eNodIN.NODBufferIn=0 Then
(* Command is totaly completed here *)
CommandStep := 0;
eNodDatas.Result := CommandMem;
End_if;
END_CASE;

Les étapes de cette séquence sont :

1. envoi du poids étalon avec un WRITE_VAR (seulement pour la commande CA) ;

2. attente de la fin du WRITE_VAR (seulement pour la commande CA) ;

3. envoi du code commande et attente du retour de l'eNod ;

4. envoi du code faux 16#00FF et attente du retour d'erreur de l'eNod ;

5. envoi du code 0 et attente de l'acquittement de l'erreur de l'eNod.

IV-D-6 - Source de cet exemple

Téléchargez le source de ce DFB ici (Miroir).
Ce fichier est ou format XDB d'export des DFB sous Unity. Pour l'importer il suffit de faire un clic droit sur Types Données Dérivés dans le navigateur, puis de choisir importer et de sélectionner le fichier.

Ce fichier va implicitement importer les DDT décrits dans les chapitres IV-A-2 et IV-D-1.

Il suffira de créer une variable de type TeNodIN, une de type TeNodOUT et une de type TeNodDatas pour chaque eNod de votre réseau, puis de créer une instance du DFB eNod3-C pour chaque eNod du réseau. Comme le DFB utilise des données statique privées, n'utilisez pas la même instance du DFB pour tous vos eNod.

V - Transmettre l'application

Comme on utilise un catalogue modifié par l'ajout de l'eNod, le fichier STU de l'application n'est plus suffisant seul pour être ouvert sur un autre PC.
De plus, un id de génération de l'eNod dans le catalogue est généré et stocké dans l'application. Cet id varie d'un PC à l'autre, donc si vous installez le même EDS sur un autre PC contenant la même version exactement d'Unity, vous ne pourrez tout de même pas ouvrir le fichier STU !

Cette notion d'id s'applique aussi aux versions STA et à la version embarquée dans l'automate. Pour que l'id suive sur un autre PC vous devez exporter l'eNod du catalogue sur le PC ayant servi à créer l'application. Pour ce faire fermer Unity et lancez le Gestionnaire de catalogue. Dans le menu File choisissez Export Device. Sélectionnez ensuite l'eNod et valider. Le gestionnaire vous demandera un nom de fichier CPX contenant l'eNod exporté.

Sur le PC de destination il faudra importer le fichier CPX plutôt que d'importer le fichier EDS. Pour importer le fichier CPX allez dans le menu File puis dans Import Device, ouvrez le fichier CPX et validez l'importation.

Maintenant suivant l'historique de vos applications et des versions d'Unity vous devrez faire des opérations différentes, voire vous ne serez plus en mesure d'ouvrir vos applications.

V-A - Vous avez le fichier STU et le fichier CPX et pas d'eNod dans le catalogue

Si votre version d'Unity est la même que celle ayant servi à créer l'application vous devez importer le fichier CPX avant d'ouvrir le fichier STU.

Si la version d'Unity n'est pas la même, vous ne pourrez pas du tout ouvrir le STU quelque soit la méthode. Utilisez le fichier STA si vous l'avez.

V-B - Vous avez le fichier STU et le fichier CPX et l'eNod dans le catalogue non issu du CPX

Toujours en supposant que la version d'Unity est la même que celle ayant servi à créer l'application, vous ne pourrez ouvrir l'application STU que si :
- vous supprimez l'eNod du catalogue ;
- vous Importez le fichier CPX ;
- vous Ouvrez le fichier STU.

V-C - Vous avez le fichier STU mais pas le fichier CPX ou seulement le fichier EDS

Unity n'est pas capable de déduire le fichier CPX du fichier STU. Vous ne pourrez donc pas ouvrir le fichier STU. Même si vous importez le fichier EDS, l'ID sera différent et non reconnu. Utilisez le fichier STA si vous l'avez.

V-D - Vous avez le fichier STA et le fichier CPX et pas d'eNod dans le catalogue

Importez le fichier CPX et ouvrez le fichier STA. C'est le cas recommandé par Schneider : diffuser le STA et le CPX ensemble.

V-E - Vous avez le fichier STA et le fichier CPX et l'eNod dans le catalogue non issu du CPX

Vous pourrez ouvrir l'application si :
- vous supprimez l'eNod du catalogue ;
- vous Importez le fichier CPX ;
- vous Ouvrez le fichier STA.

V-F - Vous avez le fichier STA mais pas le fichier CPX ou seulement le fichier EDS

Ouvrez directement le STA, Unity va importer l'eNod dans le catalogue à partir des infos données dans le fichier STA. Cette règle s'applique aussi si vous vous connectez à un automate sans que vous ayez d'eNod dans votre catalogue.

L'eNod importé ainsi dans le catalogue ne pourra pas être utilisé dans une autre application. Vous aurez un message d'erreur au moment de l'ajout de l'eNod dans le réseau. Ce bug est connu de Chorus et sera corrigé dans la version 5.0.
Si vous êtes dans ce cas, essayez d'obtenir le fichier CPX pour pouvoir ouvrir les fichiers STU/STA avec un catalogue correct. Si ce n'est pas possible, il est encore possible de copier/coller un eNod pour en créer un nouveau sur le réseau.

V-G - En résumé

Pensez STA et pas STU ! Pensez à activer les options de sauvegarde automatique en STA disponibles depuis la version 4.1. Pensez à générer l'application avant de sauvegarder pour que le STA automatique soit créé.

Pour les fichiers CPX, importez l'eNod sur un seul PC et diffusez le fichier CPX en non pas le fichier EDS.

VI - Conclusion

J'espère que cet article pourra vous aider à éviter les nombreux pièges de l'utilisation d'un eNod dans Unity.
Une fois installé et configuré comme décrit ici, nous n'avons pas eu de problème lié au fonctionnement du matériel.

Il reste des points à améliorer dans le code du DFB, en particulier gérer les différents codes d'erreur de READ_VAR, WRITE_VAR et de l'eNod.

VII - Remerciements

Merci à mon collègue Gilles d'avoir commencé les tests et donc d'être tombé sur les plâtres les plus frais.
Merci aux supports Chorus et Scaime pour leurs informations.
Merci à blade159 et jacques_jean pour la correction orthographique.