Exercices réseaux partie N°2 1.1 Trame modbus sur port série - Free
Ces méthodes permettent d'envoyer ou de reçevoir des octets (unsigned char) stockés dans un tableau (void* buffer qui est équivalent à void buffer).
Part of the document
Licence Professionnelle MAII
Eléments de Cours "Réseaux de Terrain"
BP-MAII-CV1.1-28092006 p1
Un avenir une formation,
Exercices réseaux partie N°2
1.1 Trame modbus sur port série
Soit la classe c++ "PortSerie" permettant la communication avec la couche physique par le
port série d'un PC, elle comporte entre autres les méthodes:
• Le constructeur:
PortSerie::PortSerie(int bauds=9600, int nbits=8, bool bin=true, bool parity=false);
• Les fonctions membres:
bool PortSerie::OpenCOM(int nId);
bool PortSerie::CloseCOM(int nId);
nId représentant le numéro du port,
bool PortSerie::ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead);
bool PortSerie::WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten);
Ces méthodes permettent d'envoyer ou de reçevoir des octets (unsigned char) stockés dans un
tableau (void* buffer qui est équivalent à void buffer[]). Les entiers permettant le contrôle de
la taille du tableau
On dispose des fonctions annexes:
int int_vf_cp2(double value, int dp);
Cette fonction permet de convertir un nombre en virgule flottante en nombre 16 bits à virgule
fixe stocké dans un int
unsigned int CRC16(unsigned char trame[], unsigned int longueur);
Cette fonction renvoie le code de contrôle d'un tableau dont la taille est donnée. Le CRC (2
octets) est ajouté automatiquement à la fin de la table trame[] .
Soit une autre classe C++ "ModbusRTU" utilisant la classe "PortSerie" pour communiquer
avec la couche physique, elle comporte entre autres les méthodes:
ModbusRTU::ModbusRTU(PortSerie * port_serie); // constructeur
et la méthode d'écriture:
bool ModbusRTU::WriteWord(unsigned char slave, unsigned int adr, double value, unsigned int
dp);
Elle permet d'écrire dans l'esclave (code modbus 6) d'adresse slave (8bits) à l'indexe adr (16
bits) un nombre en virgule flottante (value) sous forme d'un nombre en virgule fixe (16bits)
dont la position de la virgule est spécifiée par dp
Licence Professionnelle MAII
Eléments de Cours "Réseaux de Terrain"
BP-MAII-CV1.1-28092006 p2
Un avenir une formation,
• Ecrire une ligne d'instructions permettant de copier les 8 bits de poids fort d'un mot de 16
bits non signé (unsigned int) dans un octet (unsigned char), plusieurs solutions
• Ecrire une ligne équivalente pour les 8 bits de poids faible.
• Compléter cette fonction:
bool ModbusRTU::WriteWord(unsigned char slave, unsigned int adr, double value, unsigned int
dp)
{
int nbw;
int i, ivalue;
unsigned char t[10];
// convertir le double en int (reel à virgule fixe)
t[0]=slave;
t[1]= // a completer
t[2]= // a completer
t[3]= // a completer
t[4]= // a completer
t[5]= // a completer
// ecrire dans le port
return true;
}
• Compléter le programme de test (console)
#include
#include
#include "PortSerie.hpp"
#include "modbusRtuAscii.hpp"
using namespace std;
int main(int argc, char *argv[])
{
// création de l'objet PORT instance de la classe PortSerie 9600 bauds, 8 bits, binaire, sans
parité
// ouverture du port n°4 de l'objet PORT
// création de l'objet dynamique ReseauRTU instance de la classe ModbusRTU sur le port PORT
// écrire la valeur 57.42 dans
// fermer le port serie
// détruire le port
// détruire modbus
system("PAUSE");
return EXIT_SUCCESS;
}