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

Documents pareils