TP Réseaux Locaux Industriels
Transcription
TP Réseaux Locaux Industriels
Réseau Modbus 1 PRESENTATION DES MODULES MODBUS Le protocole de communication Modbus de Gould Modicon (actuellement division de Schneider Electric/Télémécanique, 1er constructeur mondial d'automates) est un réseau de type maître-esclave très répandu au point qu’il n’existe quasiment aucun constructeur de systèmes de pilotage d’automatismes qui ne propose de couplage Modbus. Dans la pratique, Modbus permet d’interconnecter des matériels aussi hétérogènes que des Automates Programmables Industriels (API), des variateurs de vitesse pour moteurs, des capteurs, des terminaux d’atelier intelligents, des calculateurs. Ce protocole est caractérisé par une forme et un contenu de messages simples et universels ainsi que la possibilité de s’utiliser sur une liaison série aussi répandue que la RS232C. Modbus est donc un outil pédagogique de tout premier plan pour qui s’intéresse au niveau trame. I – Le principe de Modbus a) Architecture du réseau Modbus Le réseau Modbus est un réseau composé d'un seul Maître et d'Esclaves, qui communiquent par une liaison série asynchrone: COMMUNICATION SERIE ESCLAVES MAITRE Le support électrique de la liaison série suit une des deux normes courantes. La liaison type RS232 (+12V,-12V), la seule disponible sur PC, n'est utilisable que dans le cas d'un réseau avec un seul esclave. Cette liaison sera utilisée pour l'initiation au fonctionnement du réseau. USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 2 Dans le cas d'un réseau réel, la liaison est bidirectionnelle sous la norme RS485 (0-5V différentiel, disponible sur Mac) . Pour envoyer un message sur la ligne, le Maître "prend la parole"(en activant le signal "RTS" du port série), c'est à dire impose le niveau logique sur la liaison avec un driver 3 états, uniquement pendant l'envoi de son message. Les esclaves reçoivent le message, et émettent une réponse en prenant la ligne à leur tour. Etant donné qu'il ne peut y avoir qu'un esclave qui réponde à un message, il n'y pas de collision sur le réseau Modbus, sauf en cas d'erreur de paramétrage. La liaison différentielle comprend 3 fils : le signal '+' , le signal '-' et la masse. Elle permet des transmissions peu sensibles aux rayonnements électromagnétiques, sur une distance pouvant atteindre plusieurs centaines de mètres. b) Dialogue Maître-Esclave et trames Le dialogue sur un réseau MODBUS est toujours à l’initiative du maître. Ce dernier procède en posant une question (ou en donnant un ordre) à un esclave particulier qui en retour lui fournit la réponse à la question (ou la confirmation de la bonne exécution de l’ordre). Les trames question et réponse sont envoyées sous la forme de chaînes de caractères, lesquelles reprennent l’adresse de l’esclave, un numéro de code fonction et le paramétrage de cette dernière. Dans une trame Modbus ASCII, chaque octet est représenté sous la forme des codes ASCII des caractères qui le représentent. Par exemple, l’octet 00000110 soit 0x42 sera transmis sous la forme de la chaîne ‘42’ correspondant aux codes des chiffres 4 et 2. D’une manière générale, une trame (figure 2) est la concaténation des éléments suivants : ⇒ Entête : ‘:’ ⇒ Adresse de l’esclave (0x01..0xF8) : ‘01’..’F8’, ⇒ Numéro de la fonction (0x01..0x06) :’01’..’06’, ⇒ Données. Contenu et taille variable suivant la fonction. ⇒ Octet de vérification de la trame ou LRC8 (0x00..0xFF) calculé depuis les valeurs adresse de l’esclave, numéro de fonction et champs de données : ‘00’..’FF’. ⇒ Un délimiteur de fin constitué des caractères Carrier Return (0x0D) et Line Feed (0x0A). Dans l’exemple ci-dessous, le maître demande à l’esclave 04 de mettre sa sortie d’adresse 0 à l’état logique « 1 » Entête Adresse Esclave Code Fonction Données LRC Délimiteur 1 carac 2 caract. 2 caract. N*2 caract. 2 caract. Retour Chariot Line Feed : 04 05 0000FF00 F8 CR LF USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 3 II - Les modules entrées-sorties Modbus a) Présentation physique Les modules sont architecturés autour d'un microcontrôleur moderne Atmel RISC, doté d'une mémoire programme de 1K mots et d'une mémoire Flash de 128 octets. Ces modules gèrent 4 entrées logiques (0-5V) et 4 sorties logiques. Gnd S4 S3 S2 S1 v4 v3 v2 v1 JP3 JP4 JP1 1 2 3 JP2 1 2 JP5 MAX232 1 1 µC ATMEL 1 2 3 4 r v 4 3 2 1 RESET @0x Gnd E4 E3 E2 E1 Connecteurs : JP1 : type de liaison série (RS232C : 1-2, RS485 : 2-3) JP2 : modification adresse esclave (1-2) JP3 : alimentation 9V = JP4 : prise réseau RS485 (+Vcc : 1, « +a » : 2, « -a » : 3, JP5 : prise communication RS232C gnd : 4) Entrées : E1, E2, E3, E4. (actives à l’état bas). Utilisation possible par les poussoirs 1 à 4 (attention, l'adressage des entrées est de 0 à 3) Sorties : S1, S2, S3, S4 (actives à l’état bas) (attention, l'adressage des sorties est de 0 à 3) Visualisation des sorties : v1, v2, v3, v4 (allumées à l’état bas) Visualisation de l’activité : Rx : rouge, Tx : vert (s'allume lors de l'envoi de la réponse) MAX232 : conversion des signaux RS232 (Rx : 13, Tx : 14) / TTL (Rx : 12, Tx : 11) µC ATMEL : cœur de l’esclave Reset : initialisation du module Adresse esclave : @Ox (autocollant sur la platine) Ils possèdent une "intelligence" locale qui offre de nombreuses fonctionnalités supplémentaires: suppression des rebonds d'entrée détection de fronts comptage de fronts... Ces modules peuvent échanger des données du type Bit ou du type Mot 16bits (protocole de base Modbus). USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 4 b) Spécifications techniques des modules MODBUS Communication : • 19,2 kb/s , 8 bits de données, 1 bit de stop, aucun bit de parité • pas de contrôle de flux Types de liaisons : • RS232C • RS485 Format des trames : • ASCII Fonctions reconnues : • 0x01 lecture de n bit(s) de sortie consécutif(s) • 0x02 lecture de n bit(s) d’entrée consécutif(s) • 0x03 lecture de n registre(s) internes • 0x04 lecture de n registre (s) d’entrée • 0x05 écriture d’un bit de sortie • 0x06 écriture d’un registre interne Codes d’erreur des trames d’exception : • 0x01 code fonction non autorisé sur l’esclave • 0x02 adresse (entrée, sortie, registre) illégale sur l’esclave • 0x03 valeur(s) du champ de données non valide(s) Entrées : Sorties : • 4 (0x00..0x03) [attention au décalage entre les n°entrée et les poussoirs] • 4 (0x00..0x03) Registres internes : • 8 registres (0x0000..0x0007) • 0x0000 : détection d’un front montant sur les entrées • 0x0001 : détection d’un front descendant sur les entrées • 0x0002 : comptage entrée 1 sur front montant • 0x0003 : comptage entrée 2 sur front montant • 0x0004 : comptage entrée 3 sur front montant • 0x0005 : comptage entrée 4 sur front montant • 0x0006 : temporisation anti-chevauchement questions/réponses (ms) • 0x0007 : adressage de l’esclave (fonction inopérante sur la version actuelle du microcontrôleur) USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 5 Annexes 1 - Principales fonctions MODBus Ne sont donnés ci-après que les fonctions qui peuvent être utiles pour faire fonctionner les modules .Pour chacune d'entre-elles, seuls sont spécifiés les paramètres du champ de données. Il est à noter que les adresses de base des entrées, des sorties et des registres commencent à 0000 . 0x02 : lecture de n bit(s) d’entrée consécutif(s) Requête du maître : Champs de Données Adresse 1ere entrée Nombre d’entrées à lire Octet de poids fort Octet de poids faible Octet de poids fort Octet de poids faible 2 caract. 2 caract. 2 caract. 2 caract. Réponse de l’esclave : Champs de Données Nombre d’octets 2 caract. Huit premières entrées Huit entrées suivantes n°8 n°16 … n°1 2 caract. … … n°9 2 caract. 2 caract. 0x05 : écriture d’un bit de sortie (bobine) Requête du maître : Champs de Données Adresse de la sortie Etat « 1 » : FF00 Etat « 0 » :0000 Octet de poids fort Octet de poids faible Octet de poids fort Octet de poids faible 2 caract. 2 caract. 2 caract. 2 caract. Réponse de l’esclave : Champs de Données Adresse de la sortie Etat « 1 » : FF00 Etat « 0 » :0000 Octet de poids fort Octet de poids faible Octet de poids fort Octet de poids faible 2 caract. 2 caract. 2 caract. 2 caract. 0x03 : lecture de n registre(s) internes Requête du maître : Champs de Données Adresse 1er registre Nombre de registres à lire Octet de poids fort Octet de poids faible Octet de poids fort Octet de poids faible 2 caract. 2 caract. 2 caract. 2 caract. Réponse de l’esclave : Champs de Données Nombre N de registres*2 1er registre fort/faible 2eme registre fort/faible … 2 caract. 4 caract. 4 caract. 4 caract. USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 6 0x06 : écriture d’un registre interne Requête du maître : Champs de Données Adresse du registre Donnée 16 bits Octet de poids fort Octet de poids faible Octet de poids fort Octet de poids faible 2 caract. 2 caract. 2 caract. 2 caract. Réponse de l’esclave : Champs de Données Adresse du registre Donnée 16 bits Octet de poids fort Octet de poids faible Octet de poids fort Octet de poids faible 2 caract. 2 caract. 2 caract. 2 caract. Pour toute information complémentaire, consulter le site modbus.org Annexe 2 - Calcul du LRC Le LRC est l'autocontrôle de la consistance du message. Une erreur de transmission conduit à une incohérence du message global. Le LRC est calculé sur la valeur des octets du message , hors le délimiteur de début ':'' et ceux de fin (CRLF) . C'est le complément à 2 de la somme 8 bits (ou modulo 256) des valeurs (n°esclave, fonction, data) . Le calcul pratique du LRC se fait par : S = (n°esclave + fonction + data) & 256 S=~S S=S+1 Le contrôle de validité se fait par : (n°esclave + fonction + data + LRC reçu) = 0x00 Exemple: esclave fonction MSB adresse LSB adresse MSB data LSB data LRC Total 0x01 0x05 0x00 0x01 0xFF 0x00 éciture bit n°1 valeur d'écriture 0xFA 0x200 soit 0x00 modulo 256 USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 7 Annexe 3 - Dialogue Modbus par programmation en langage C Le langage C-Ansi pas plus les versions initiales de Windows ne prévoient la commande des périphériques d'un PC. Il faut faire appel à une bibliothèque externede fonctions. Parmi les solutions possibles, nous pouvons citer : • la gestion du port série par extension des structures de fichiers (createfile(),...) accessible depuis Windows NT4 (et version supérieures); cette solution ne demande aucune licence supplémentaire. Pour faciliter son usage, il existe de nombreuses implantations disponibles sur le Net (www.cppfrance.com par exemple). • la bibliothèque ActiveX Microsoft "Mscomm" soumise à licence et peu documentée pour un usage en C (voir site MSDN) ; elle présente l'avantage de gérer le port par messages (~interruption en assembleur) et donc de libérer le temps processeur pour d'autres activités. • la bibliothèque Marshall Soft présente sur le marché depuis les premiers PC et qui possède une très bonne documentation (en anglais!). Son usage est libre en enseignement. Exemple d'utilisation de la bibliothèque WSC pour envoyer un message Modbus :: #include <windows.h> #include <stdio.h> #include "wsc.h" void main(void) { int Sio_Err; char message[23] = ":machainehexadecimale\r\n"; // remarquer la syntaxe C pour le Cr et le LF // open COM1 Sio_Err = SioReset(COM1,1024,1024); Sio_Err = Sio_Err + SioBaud(COM1, WSC_Baud19200); Sio_Err =Sio_Err + SioParms(COM1,WSC_NoParity,WSC_OneStopBit,WSC_WordLength8); if (Sio_Err < 0) { // display error message printf("Erreur communication serie %d : ",Sio_Err); } else { // set RTS printf("Setting RTS\n"); SioRTS(COM1,'S'); SioPuts(COM1, (LPSTR) message ,23); SioRTS(COM1,'C'); printf("Le programme est termine.\n"); } // close port SioDone(COM1); } /* end main */ USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie Réseau Modbus 8 Annexe 4 - Principales fonctions de la Bibliothèque WSC int SioBaud( int COMx,unsigned BAUDS ) Sets the baud rate of the selected port (use defined values) int SioFlow( int COMx,char ) Enables / disables hardware flow control. int SioInfo( WSC_VERSION) Returns the 3 digit version number int SioGetc( int COMx ) Reads the next character from the serial line. WSC_NO_DATA (-100) is returned if no byte is available. int SioGets ( int COMx, (LPSTR) String_Pointer , unsigned Max_Cnt) Reads a string of characters. The SioGets function reads the smaller of the number of bytes wanted (Max_Cnt) and the number of bytes in the receive buffer. A zero is returned if no bytes are read. int SioParms ( int COMx , int Parity , int Stop_Bits , int Length) Sets parity, stop bits, and word length. int SioPutc ( int COMx , char Message) Transmit a character over a serial line. int SioPuts ( int COMx,(LPSTR) Str_Pointer , unsigned Number_of_Characters) Transmits a string of characters. int Err SioReset ( int COMx , int Buffer_RX , int Buffer_TX ) The SioReset function initializes (opens) the selected serial port. SioReset should be called before making any other calls to WSC except for setting default behavior (port=-1). SioReset uses the parity, stop bits, and word length value previously set if SioParms was called, otherwise the default values (19200, no parity, 8 data, 1 stop) are used. int SioRTS ( int COMx, 'C' or 'R' or 'R') Sets, clears, or reads the Request to Send (RTS) int SioRxClear ( int COMx ) Clears the receive buffer. int SioRxQue ( int COMx) Returns the number of characters in the RX queue. int SioStatus ( int COMx ,unsigned Status_Mask) Returns the serial port line status. int SioTxClear ( int COMx) Clears the transmit buffer. Le premier paramètre des fonctions est toujours le numéro de port utilisé (COM1 ou COM2) Définitions utiles #define COM1 0 #define COM2 1 #define WSC_NoParity 0 #define WSC_TwoStopBits 2 #define WSC_WordLength8 8 #define WSC_Baud9600 5 #define WSC_Baud19200 6 Consulter le site http://www.marshallsoft.com pour plus de détails. Annexe 5 - Programme de conversion Ascii-Hexadécimal Exemple de fonctions utiles pour développer un programme de dialogue en langage C . unsigned char ascii_hex( char temp) { temp = temp - '0'; if (temp < 0 ) {rx_err |= 0x04 ; temp = 30;} if (temp > 0x09) // A, B.... { temp &= 0xDF; // forcage majuscule temp = temp - 0x07; if (temp > 'F') { rx_err |= 0x04 ; temp = 30;} } return temp; } unsigned char hex_ascii(unsigned char temp) { if (temp<0 ) | (temp>15) err = 1; temp = (temp & 0x0F) + '0'; if (temp > '9' ) temp += 0x07 ; return temp; } USTL - Master ASE M2 - Systèmes d'Information pour l'Industrie