Carte E/S sur relais 230V pilotable par le protocole MODBUS

Dans le cadre d’un projet industriel, les étudiant doivent piloter en tout ou rien sous 230V un signal lumineux (ampoule), un signal sonore (sirène), un moteur pour l’aspiration de fumées, un régulateur de vitesse pour un convoyeur (altivar) et des régulateurs PID (eurotherm), le tout sur bus physique RS485 avec le protocole ModBUS.  Malheureusement l’altivar n’est plus produit et la carte de commande sur bus RS485 n’est donc plus produite non plus. L’entrepreneur ne souhaite pas changer son altivar. Il reste donc l’entrée 0-10V pour donner la consigne de vitesse. Il faut donc générer une tension continue variable et pilotable par bus RS485 et compatible ModBUS. Plutôt que de faire un assemblage de « différents morceaux », j’ai réalisé une carte électronique qui suit ce cahier des charges.

Réalisation de la carte électronique

Cette carte électronique doit donc répondre au cahier des charges suivant:

  • piloter en tout ou rien trois sorties 230V (voyant lumineux, alarme sonore, aspirateur à fumées)
  • générer une tension continue variable comprise entre 0V et 10V pour la consigne de vitesse de l’altivar
  • être compatible avec les régulateurs de températures qui fonctionnent sur bus RS485 avec le protocole ModBUS en mode RTU
  • permettre de piloter la consigne de l’altivar de manière manuel (avec un potentiomètre multitours) ou automatique (par la tension générer sur la carte)
  • fonctionner à partir d’une tension unique régulée de 5V

Ce qui m’a conduit à adopter les solutions suivantes pour un prototype en fonction de ce que j’avais comme composants disponibles :

  • la réception de la trame ModBUS, son décodage et enfin le pilotage de l’ensemble sera réalisé par un microcontrolleur Microchip PIC18F2520
  • pour piloter en tout ou rien du 230V, j’ai utilisé des relais classiques 12V/230V 1A
  • le bus RS485 deux fils sera piloté avec un CI du type DS75176
  • le 12V de commande des relais sera réalisé à partir du 5V à l’aide un convertisseur de type « boost » piloté par le PIC
  • la consigne 0-10V sera réalisé par filtrage d’un signal MLI généré par le PIC puis amplifié (x2) par un montage à amplificateur opérationnel. Cet amplificateur utilisant le 12V comme tension d’alimentation
  • l’aiguillage de la tension continue générée par le PIC (mode automatique) ou celle issu du potentiomètre (mode manuel) sera réalisé par un relai

Ce qui nous mène au schéma électrique suivant (le fichier original au format Proteus Isis 7.4 est disponible en fin d’article) :

Carte ES ModBUS

Quelques explications sur ce schéma :

  • la carte est alimentée par une alimentation extérieure industrielle régulée 5V. La diode D1 protège le montage contre les inversions de polarité. Cependant elle introduit un problème : en effet la chute de tension dans cette diode est proportionnelle au courant qui la traverse. Lorsque les relais sont alimentés, le « 5V » varie ! Or le CAN du PIC utilise comme référence cette tension de 5V ainsi que la génération du signal 0-10V. Je pense donc qu’à terme il faudra soit supprimer cette diode, soit alimenter la carte en 24V continu et générer les tensions continues de 5V et 12V (ce qui supprimera le convertisseur boost). C3 et C4 sont des condensateurs de filtrage.
  • la conversion du signal RS485 en signal RS232 TTL est assuré par un ci du type SN75176. Comme on utilise un bus RS485 sur 2 fils, cela sous entend que l’on fonctionne en mode half-duplex. Il faut donc gérer ce mode en pilotant les lignes DE et RE. En mode réception, il faut mettre un état bas sur les lignes 2 et 3. En mode émission il faut mettre un état haut. Cette gestion est assurée de manière automatique dans le code C du PIC. R6 et R7 protège les entrées du SN75176. R8 et J2 permettent de « fermer » le bus RS485 sur une impédance de 120 Ohms pour éviter les réflexions en bout de ligne. R9 et J3 permettent de réaliser un « pull-up » de la ligne A du bus RS485. R10 et J4 assurent le « pull-down » de la ligne B du bus RS485.
  • Les composants autour des relais RL1, RL2 et RL3 permettent de piloter en tout ou rien ces relais. Les DELs permettent de visualiser que les relais sont en position « travail ». En effet si la carte ne fonctionne pas ou en absence d’alimentation les relais sont sur leur position repos (donc pas de voyant lumineux allumé, pas de sirène mais pas d’aspirateur à fumées non plus). Comme les contacts « travail » et « repos » sont sortis sur des borniers, c’est l’utilisateur qui choisira sa configuration.
  • le convertisseur « boost » est réalisé autour des composants Q5, D7, BOB et C1. Le transistor mosfet utilisé ici est surdimensionné mais c’est celui que j’avais de disponible. Attention à prendre une diode rapide pour D7 (et pas une 1N4007 comme indiqué sur le schéma). R22 protège la grille du transistor et R23 bloque le transistor en l’absence de commande. Le pont diviseur R20/R21 permet de renvoyer vers le PIC une image de la tension de sortie. Le système fonctionne alors en boucle fermée et l’asservissement est réalisé par le PIC. En effet, en gros, il faut piloter le rapport cyclique du signal MLI PWM_12V pour obtenir un 12V continu quelque soit le courant demandé par les relais. Cette partie disparaitra si je choisi d’alimenter la carte en 24V. Cette partie était surtout là pour me faire plaisir et tester un montage que je n’avais pas encore utilisé 🙂 mais du coup comme le système est pleinement fonctionnel je l’utiliserais dans d’autres montages.
  • l’amplificateur U3 sera du type « rail to rail » (pas de tensions de déchets) pour gérer les tensions basses en particulier. Les tensions hautes prés du 10V posant moins de problèmes car l’amplificateur est alimenté en 12V. R14 et C6 filtrent le signal MLI issu du PIC pour obtenir une tension continue comprise entre 0V et 5V. U3, monté en amplificateur non inverseur, multiplie cette tension par deux (gain fixé par R11, R12) pour obtenir la gamme 0-10V. D5 protège l’entrée de l’altivar contre les tensions supérieures à 10V. R13 et C7 filtrent l’alimentation de U3.
  • le relais RL4 permet de commuter entre la tension fournie par un potentiomètre extérieur (P1) et la tension issu de U3 pour réaliser la tension de consigne de l’altivar. Ce relai assure donc la commutation entre le mode automatique et le mode manuel.
  • enfin le microcontroleur U1 assure la gestion de l’ensemble. J1 est le connecteur de programmation. J7 permet de choisir la vitesse du bus rs485 (9600 ou 19200). J5 et J6 permettent de choisir l’adresse de la carte sur le bus RS485 (adresse 16, 32, 64 ou 128). Un tableau récapitulatif de ces cavaliers sera présenté plus loin dans cet article.

On passe à la phase de routage sur une carte au format « europe », on câble et on obtient la carte suivante:

CarteES ModBUS Typon

Carte ES : découpe fonctionnel

Étude du protocole ModBUS sur liaison physique RS485 en mode RTU

Le protocole ModBUS est décrit sur différents sites : wikipédia, stielec
La liaison physique RS485 est décrite sur : wikipédia, technologuepro
Mais je me suis principalement appuyé sur le document officiel : Modbus Serial Line Protocol and Implementation Guide

La liaison physique RS485 permet des liaisons multipoints, on peut donc connecter plusieurs esclaves et un maitre sur le même bus. Dans notre cas, le maitre sera un système embarqué sous GNU/Linux avec un adaptateur RS232/RS485 et les esclaves seront les régulateurs de températures eurotherm et la carte d’E/S. Chaque esclave doit avoir une adresse unique sur le bus (1 à 247). L’adresse 0 étant une adresse de diffusion (ou broadcast), les adresses supérieures à 247  sont réservés.

Il existe deux mode de transmission du protocole ModBUS sur voie série : le mode ASCII et le mode RTU (Remote Terminal Unit). Les régulateurs de température fonctionnant en mode RTU, on choisit donc d’implémenter ce mode pour la carte E/S. Le format de transmission en mode RTU pour chaque octet est le suivant :

  • un bit de start (front descendant)
  • 8 bits de données : poids faible en premier
  • 1 bit de parité (la norme recommande une parité paire mais nous n’utiliserons pas de parité car les régulateurs sont configurés de cette manière)
  • 1 bit de stop s’il y a un bit de parité sinon 2 bits de stop (dans notre montage : pas de bit de parité et un bit de stop)

Le format d’une trame ModBUS RTU est le suivant:

Trame ModBUS RTU

  • Adresse de l’esclave sur un octet compris entre 1 et 247.
  • Le code fonction correspond à une opération demandée par le maitre auquel l’esclave doit répondre sauf dans le cas ou le maitre envoie une trame de broadcast (à l’adresse 0).
  • Les données que ce soit pour une demande de la part du maitre ou une réponse de l’esclave sont groupés sous forme de mots (2 octets) dont le MSB est en premier.
  • Le CRC est un code de vérification de la trame généré par le maitre ou l’esclave. Ce CRC suit la norme CRC16 : l’algorithme est décrit dans le document officiel de la norme. Une application en ligne pour calculer les CRC est disponible ici ou.

Chaque trame ModBUS RTU doit être précédé et suivi d’un temps de repos de 3,5 fois la durée d’un caractère (d’un octet). Ce qui donne au niveau temps : à 9600 bauds/s : 4ms et à 19200 bauds/s : 2ms pour des trames 8E1. La détection de fin de trame sur le PIC se fera en détectant ce temps après la réception du dernier caractère.

Le ModBUS propose un ensemble de fonctions (Code Fonction). Toutes ces fonctions lisent ou écrivent dans une zone mémoire spéciale de l’esclave pour commander les différents organes de la carte. Dans notre cas le découpage mémoire des registres internes est le suivant:

  1. Registre 0 sur 16 bits : pilote le relais 1. Écrire un ‘0’ dans ce registre met le relai en position repos, écrire un chiffre supérieur à 0 met le relai en position travail (dans notre exemple : alarme visuelle)
  2. Registre 1 sur 16 bits : pilote le relais 2. Écrire un ‘0’ dans ce registre met le relai en position repos, écrire un chiffre supérieur à 0 met le relai en position travail (dans notre exemple : alarme sonore)
  3. Registre 2 sur 16 bits : pilote le relais 3. Écrire un ‘0’ dans ce registre met le relai en position repos, écrire un chiffre supérieur à 0 met le relai en position travail (dans notre exemple : pilote l’aspirateur des fumées)
  4. Registre 3 sur 16 bits : pilote le relais 4. Écrire un ‘0’ dans ce registre met le relai en position repos, écrire un chiffre supérieur à 0 met le relai en position travail (dans notre exemple : permet de basculer du mode manuel (position repos) au mode automatique (position travail))
  5. Registre 4 sur 16 bits : génère une tension continue comprise entre 0V et 10V. Écrire un ‘0’ dans ce registre génère du 0V en sortie, écrire ‘1023’ génère du +10V (dans notre exemple, cette tension sert au pilotage du régulateur de vitesse Altivar)

Dans notre cas, la carte d’E/S ne répondra qu’à trois commandes:

  • Code fonction 0x03 : Read Holding Registers : Lire les registres internes. Cette commande permet d’obtenir l’état des différents organes de la carte. Cette commande permet de lire n registres 16 bits à partir du registre x codé sur 16 bits.
    modbus_trame_type033
    *: le nombre d’octets renvoyés est égale au Nb de registre à lire x 2
    Par exemple la trame ModBUS suivante sans CRC permet de lire l’état des trois premiers relais en une seule lecture (l’esclave est à l’adresse 16 ou 0x10) : 0x10 0x03 0x00 0x00 0x00 0x03. Si vous désirez obtenir la valeur de la tension actuelle qui pilote l’altivar : 0x10 0x03 0x00 0x04 0x00 0x01
  • Code fonction 0x06 : Write Single Register : Ecrire dans un registre. Cette commande permet d’écrire une valeur codée sur 16bits dans le registre indiqué.
    Requete/Reponse ModBUS type 0x06Vous remarquez que si tout c’est passé correctement la réponse est identique à la requête. Par exemple la trame ModBUS sans CRC qui suit permet de passer le relais2 en mode travail : 0x10 0x06 0x00 0x01 0x00 0x01.
  • Code fonction 0x08 : Diagnostics : Diagnostique. Seule la sous fonction 0x0000 est implémenté. Cette sous fonction est « echo ». La réponse est identique à la requête. Par exemple, si vous envoyez la trame suivante sans CRC : 0x10 0x08 0x00 0x00 0x12 0x34, vous devriez obtenir exactement la même chose en retour.

Code source en Langage C pour le PIC18F2520

Le code source suivant permet de réaliser le cahier des charges précédent. Il est commenté, cependant si quelque chose n’était pas assez clair, n’hésitez pas à me contacter…

Remarque : lorsqu’une trame n’est pas valide ou qu’elle contient une requête non conforme, le code se contente de l’ignorer. Donc si vous ne recevez rien en retour d’une requête c’est que très certainement celle-ci est incorrecte ou que votre liaison physique est défectueuse. Rappelez-vous aussi qu’en l’absence de cavalier sur J5,J6 et J7 la carte a comme adresse 0x10 ou 16 en décimal et qu’elle fonctionne en 8N1 à 9600 bauds/s !

Programmation de la carte en langage C++ et réalisation de classes

Cette carte sera pilotée sous au moins deux environnements : un avec du GNU/Linux (emDebian sur plateforme TQ6410 avec QT comme framework), l’autre avec un PC industriel sous Microsoft Windows. Pour faciliter le pilotage de cette carte et des régulateurs, il a été décidé de créer des classes C++. Ces classes C++ se baseront sur la librairie open source libmodbus disponible sur libmodbus.org. Je ne peux pour l’instant pas donner les codes sources de ces classes, ni les tests unitaires réalisés avec celles-ci tant que les étudiants n’ont pas fini leur projet. La seule chose que je peux affirmer pour l’instant, c’est que les classes fonctionnent dans le cadre que l’on s’est fixé. Les codes sources seront disponibles lorsque les étudiants auront finalisé le projet…

L’interface graphique de test suivante a été réalisé sous GNU/Linux Debian avec Qt4.7 et les classes développées pour la carte :

capture-test-carte-es-modbus-sur-rs4851

Conclusion temporaire

Je pense que la mise en place chez l’industriel concerné va amener des modifications au niveau de la carte d’E/S. Lorsque le projet sera totalement finalisé, je mettrais à disposition les sources et le nouveau typon. En attendant vous avez largement de quoi débuter avec cette carte…

5 réflexions au sujet de « Carte E/S sur relais 230V pilotable par le protocole MODBUS »

  1. RACHID

    Bonjour,
    je compte entamer la réalisation de la carte,
    mais le schéma est totalement illisible
    pourriez vous m’envoyer les fichiers sources, schémas et typons
    Merci beaucoup

  2. yazid

    Bonjour,
    Merci pour toutes les infos, le projet est fini a present?
    Ca m’interesse de voir la fin du projet.

  3. Ludo

    bonjour
    je suis en train de construire ma maison et je voudrais intégrer un automate programmable industriel de marque saia burgess.
    Votre projet de carte m intéresse énormément, notamment par rapport au coût des carte original, mes questions sont les suivantes:
    -ou en est votre projet?
    -pensais vous qu’il soit possible de faire des carte disposant de 16 entrées ou 16 sortie ?

    Merci d’avance

  4. Mohamed Zioui

    salut.
    je travaille dans le domaine agricole et si vous avez des programmateur , je suis à votre disposition. merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *