You are on page 1of 24

Projet de Fin dEtudes

III.1

Conception de la DLL dexploitation des RFID

Introduction

Ce chapitre sera consacr dans un premier temps la prsentation des diffrentes procdures
ncessaires lexploitation des units RFID de la cellule flexible ainsi que leur
dveloppement dans un projet de DLL par Mr Chevance Julien
Nous allons ensuite prsenter les difficults rencontres lors du chargement de la DLL dans
WinCC et les solutions possibles pour leur rsolution.
Enfin nous allons prsenter et dcrire les fonctions de la DLL que nous avons dvelopp pour
lexploitation des units RFID.
Mais tant donne la nature de communication avec les units RFID, nous nous attarderons
tout dabord expliquer lutilisation de la liaison srie RS 232.
III.2

La liaison srie RS 232

Dans cette transmission, on utilise une seule ligne pour transmettre les donnes bit par bit. La
donne transfre en srie est souvent envoye en groupe de bits constituant un caractre ou
un mot.
Dans notre cas, les units RFID disposent dune liaison srie de type RS232 pour
communiquer avec un ordinateur. Etant donne la nature de la liaison RS232, des units de
multiplexage supplmentaires sont utilises pour la liaison des huit units RFID lordinateur
via deux ports de communication (COM1 et COM2). Chaque groupe de quatre units est donc
reli un port de communication via une unit de multiplexage comme la montre la figure cidessous.

Figure III. 1 : Cblage des units RFID

Diffrents paramtres entrent en jeu lors dune communication srie :

Iyad MANSOUR

40

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Longueur des mots : sur le PC, le BIOS ne permet une longueur de mots que de 7 ou 8

bits ;

Parit : Un mot transmis peut tre suivi dun bit de parit qui permet de dtecter les

erreurs ventuelles de transmission. Il existe deux parits: la parit paire et la parit impaire ;

Bit de start : ce bit signale le dbut de la transmission ;

Bit de stop : ce bit signale la fin de la transmission ;

Vitesse de transmission : la plupart des cartes srie permettent de choisir une vitesse

entre 300 et 9600 bauds. Dans notre cas, nous utilisons une vitesse de 9600 bauds.
Afin de mieux comprendre la transmission srie nous allons crer, pour commencer, une
communication srie entre deux ordinateurs.
III.3

Procdures [4]

La ralisation de linterface de communication entre le superviseur et les units de


lecture/criture nous a amens la programmation et limplmentation des fonctions
suivantes :
Init_port ()
Init_port3 ()
Fermeture ()
Choix_com ()
Choix_head ()
Trame_quit ()
Trame_init ()
Calcul_CHCK ()

Taper_commande ()
Lecture_octet ()
Ok_donnees ()
Ecriture_texte ()
Read_all_octet ()
Lecture_32 ()
Trame_c ()
Tableau III. 1 : Fonctions de la DLL

Le dtail des fonctions se trouve en annexe 3.


Nous allons maintenant expliquer les diffrentes fonctions utilises pour lexploitation des
units RFID :

Les fonctions dinitialisation Init_port () et Init_port3 () : ces deux fonctions

permettent de configurer les deux ports srie (Com2 et Com3) qui sont utiliss pour la liaison
avec les deux units dvaluation. Chaque unit dvaluation communique suivant la figure
III.1.

Iyad MANSOUR

41

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Les deux ports sont initialiss partir de lunique fonction dinitialisation Init_port (), mais
si lon dsire crire ou lire partir de toutes les units RFID, il est ncessaire de crer une
deuxime fonction dinitialisation pour utiliser les deux ports en mme temps.

La fonction Fermeture () : ferme les ports aprs utilisation afin quils ne restent pas

ouvert et quils puissent tre utiliss par dautres interfaces de communications.

Les fonctions Choix_Com () : permet de renvoyer le numro du port srie utiliser

ce qui revient choisir lunit dvaluation travers laquelle la communication sera tablie.

La fonctiont Choix_Head () : permet de renvoyer le numro de lunit RFID utilis

par cette unit.

La fonction Trame_quit () : cette fonction permet denvoyer une trame qui permet

dannuler les commandes antrieurs. Le premier caractre de cette trame est q pour dire
quit.
Le format de la commande envoyer est : q <CHCK><ETX>
Qui sera cod en hexadcimale par : 71 71 03. Le premier octet correspond au code ASCII de
q au format hexadcimal, le deuxime correspond au checksum qui est le mme que le
premier octet tant donn que dans cet exemple nous avons envoy uniquement un octet. Le
dernier octet correspond au code ASCII du caractre de contrle ETX
Si la commande a t bien envoye on devrait recevoir la trame suivante : q<CHCK><ETX
qui sera cod en hexadcimale par: 71 71 03.

La fonction Trame_init () : cette fonction permet denvoyer une trame permettant de

rinitialiser linterface de lunit dvaluation tout en tenant compte de la configuration des


interrupteurs.
Le premier caractre de cette commande est o do le format de la commande :
o<CHCK><ETX>.
La trame envoye en hexadcimale sera alors : 6F 6F 03
La rponse est o<CHCK><ETX>, ce qui correspond la trame reue : 6F 6F 03

La fonction Trame_c : cette fonction permet denvoyer une trame permettant de

prciser le type de lunit RFID avec lequel lunit dvaluation est connect.
Commande : d <DT><CHCK><ETX>.
<DT> est un caractre ASCII qui dfinie le type de Data carriers (voir tableau III.2) et
change selon le type de lunit RFID, en effet :

Iyad MANSOUR

42

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Tableau III. 2: Valeurs de <DT>

Dans notre cas le type du Data carriers est IDC--1K dou la trame envoyer est : 64 34 98
03.
Rponse : d<CHCK><ETX> ce qui correspond la trame reue : 64 64 03.

La fonction Calcul_CHCK () : cette fonction permet de calculer le checksum dune

trame envoyer.

La fonction Taper_commande () : cette fonction permet denvoyer une commande

quelconque qui puisse tre interprte par lunit de lecture/criture. Le calcul du checksum et
lenvoi du caractre <ETX> sont automatiques puisque cette fonction fait appelle la
fonction Calcul_CHCK ().

La fonction Lecture_octet () : cette fonction permet denvoyer une trame permettant

de lire le contenu du support de code. Pour lmission des donnes la lettre w sera utilise
comme en-tte de la trame.
Commande: w <HdNo> <StAdrH> <BytesH><CHCK> <ETX>.
La trame reue sera dfinie comme suit :
Rponse : w<HdNo> <Status> <DB><CHCK> <ETX>.
Si nous dsirons par exemple lire 3 octets partir de ladresse 00 travers lunit RFID n2,
nous devons envoyer la trame suivante : 77 32 30 30 30 33 69 03.
La rponse cette commande sera la trame suivante 77 32 00 50 46 45 84 03.

La fonction Ok_donnees () : permet de savoir si les donnes contenues dans la puce

lire sont bonnes et crites correctement.


Commande : i <HdNo><CHCK><ETX>
Rponse : i <Status><DB><CHCK><ETX>

La fonction Ecriture_texte () : Cette fonction permet denvoyer une trame permettant

dcrire une donne sur le support de code pour la rception des donnes la lettre k sera
utilise comme en-tte de la trame envoyer :
Commande : k <HdNo> <StAdrH> <BytesH> <DB><<CHCK> <ETX>

Iyad MANSOUR

43

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Avec :
<HdNo> : le numro de lunit RFID renvoy par la fonction Choix_head () vue
prcdemment.
<StAdrH> : adresse du premier octet partir de laquelle on doit lire les donnes stockes.
<BytesH> : nombre doctets lire partir de ladresse de dbut.
<DB> : donne envoyer.
Rponse : k<Status>CHCK> <ETX>
Avec <Status> : une valeur hexadcimale indiquant la rsultat de lecture.
Si nous dsirons par exemple crire les 3 octets PFE partir de ladresse 00 travers
lunit RFID n2, nous devons envoyer la trame suivante : 6B 32 30 30 30 33 50 46 45 3B 03
Et si lcriture des donnes a russi, nous devrons recevoir la trame suivante : 6B 00 6B 03

La fonction Read_all_octet () : cette fonction permet de lire tous les octets contenus

dans une puce, c'est--dire les 128 octets dinformations contenus dans la mmoire.
Commande : w <HdNo> 0080 <CHCK><ETX>

La fonction Lecture_32 () : ne permet de lire que les 32 premiers octets contenus

dans la puce qui sont gnralement les plus significatifs.


Commande : a <HdNo><CHCK><ETX>
Nous allons prsenter dans ce qui suit un exemple de programme permettant la lecture et
lecriture via les units RFID.
III.4

Exemple

On va choisir denvoyer du texte travers la tte de lecture/criture n3 : on enverra les


caractres Test . On utilisera donc la fonction Ecriture_texte ().
Tout dabord on donne le numro de lunit RFID qui se mmorisera dans choix_tete ce qui
permettra ensuite de dterminer le bon port de communication grce la fonction
Choix_com() qui est ici le COM2.

Iyad MANSOUR

44

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

void Ecriture_texte(void)
Nom de la fonction
{
DWORD nb;
char m_text[3];
char nombre_caract[3];
Dclaration des variables locales
CString trame;
CString nb_caract;
CString text;
int CS,i=0,j;
printf("Donner le nombre de caractres taper (2 chiffres):\n");
scanf("%s",nb_caract);
On place la valeur 04 tape dans nb_caract
printf("Taper votre texte :\n");
scanf("%s",m_text);
On place le texte Test dans m_text
nb_caract=nombre_caract;
text=m_text;
choix_tete = choix_head(choix_tete);
j=choix_com(choix_tete);
switch (j)
{
case 0: choix_com_[3]=0x32;break;
Choix du port COM2 grce au
case 1: choix_com_[3]=0x33;break;
choix de lidentificateur 3
case 2: choix_com_[3]=0x32;
choix_com_3[3]=0x33;
break; }
//La trame est mmorise
trame = "k" + choix_tete + "00" + nb_caract + text ;
//sous forme ASCII au
nb = trame.GetLength();
// format hexadecimal
char *Char = (char *)malloc(sizeof(char)*(nb+2));
CS=Calcul_CHCK(trame);
//Le calcul du checksum se fait automatiquement
Char[nb] = CS ;
//grce la fonction Calcul_CHCK()
Char[nb+1] = 0x03;
for(i=0;i<(long)nb;i++)
{
Char[i]=trame[i];
}
WriteFile (hCom, Char, nb+2, &nb, NULL );
free(Char);
......................}
On envoie donc la trame k30004Test avec le CS du checksum et le 03 de <ETX> travers
le port grce la commande Writefile.

Iyad MANSOUR

45

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Voil le principe global de fonctionnement des procdures que nous avons cres et qui
permettent de grer les units RFID.
III.5

Cration dune DLL

En lanant le logiciel Visual C++ , il faut successivement :


Crer un nouvel espace de travail (voir figure III.3) :
Barre de menu File New

Figure III. 2 : Cration dun nouveau projet

Crer la DLL que nous nommerons DLLGreenBox (voir figure III.4) :

Figure III. 3 : Cration de la DLL

Iyad MANSOUR

46

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Puis nous choisissons un projet vide puisque nous allons le crer entirement (voir figure
III.5).

Figure III. 4 : Choix du type de DLL crer

Crer un fichier .cpp ou .c et un fichier .def .


Le fichier .cpp ou c que nous nommerons DLLGreenBox.cpp, contient tout le code des
fonctions utiles lexploitation des units RFID que nous avons explicites au paragraphe
prcdent.
Tandis que le fichier .def , appel DLLGreenBox.def, permet lexportation des fonctions
dites dans la DLL vers le programme qui fera appelle la DLL.
Nous obtenons, aprs compilation, un fichier dextension .dll dans lequel se trouvent les
fonctions exportes et qui sont prtes tre exploites par dautres applications. Ce fichier,
DLLGreenBox.dll, sera ensuite plac dans le mme rpertoire que lexcutable de linterface
pour que lappelle des fonctions soit effectu correctement.
Lexportation des variables se fait par la commande __declspec( dllexport ) en dbut du code
de limplmentation de la DLL que nous appliquons toutes les variables globales :
#define DllExport __declspec( dllexport )
#define DllImport __declspec( dllimport )

//Macro dexportation

// Exportation des variables globales de la DLL


DllExport HANDLE hCom;
DllExport HANDLE hCom3;

Iyad MANSOUR

47

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

DllExport DCB dcb;


DllExport HWND hwnd;
DllExport COMMTIMEOUTS m_commtimeouts;
DllExport char choix_com_[]="COM?";
DllExport char choix_com_3[]="COM?";
DllExport char caract;
DllExport char Head[3];
DllExport CString choix_tete;
Tandis que limportation, au niveau du code de linterface, doit se faire aussi bien pour les
fonctions que pour les variables avec la commande declspec( dllimport ).
// Importation des variables de la DLL
DllImport HANDLE hCom;
DllImport HANDLE hCom3;
DllImport DCB dcb;
DllImport HWND hwnd;
DllImport COMMTIMEOUTS m_commtimeouts;
DllImport char choix_com_[];
DllImport char choix_com_3[];
DllImport char caract;
DllImport char Head[3];
DllImport CString choix_tete;
// Importation des fonctions de la DLL
DllImport void init_port(void);
DllImport void init_port3(void);
DllImport void fermeture(void);
DllImport int choix_com(CString choix_tete);
DllImport CString choix_head(CString choix_tete);
DllImport void trame_quit(void);
DllImport void trame_init(void);
DllImport void trame_c(void);
DllImport int Calcul_CHCK (CString);
DllImport void taper_commande(void);
etc...
Il existe un programme dans le logiciel Visual C++, que lon appelle un viewer , qui
permet de visualiser les fonctions et les variables exportes de la DLL (voir figure 4-12).

Iyad MANSOUR

48

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Figure III. 5 : Viewer de la DLL DLLGreenBox.dll

Le fichier .def est alors correct et les fonctions seront correctement utilisables pas
linterface.
De plus, un fichier .lib (pour Library), cr avec la compilation de la DLL, est importer
vers le projet dinterface pour simplifier les appels de fonctions.
III.6

Problmes apparus et solutions

La DLL labore a t test et valid sous lenvironnement de travail Visual C++.


Cependant lors du chargement de la DLL dans linterface de supervision ralise avec
WinCC, plusieurs problmes sont apparus dont on cite : usage de classe complexes comme
CString qui sont difficiles charger par WinCC, partage des variables globales.
Pour remdier ces problmes, on s'est inspir de la DLL ralise auparavant et dune DLL
fournie par le constructeur des units RFID qui est utilis par le superviseur Proleit des
RFID.
Suite ceci plusieurs modifications au niveau de larchitecture de la DLL ont t labores,
qui sont :

Architecture de la DLL

Passage des variables en arguments (pointeurs) ;

configuration de la liaison srie ;

Changement de linstruction dexportation des fonctions de la DLL vers WinCC ;

Suppression de la classe CString et en consquence modification de toutes les


fonctions et modification de la structure de donnes.

III.6.1 Architecture de la DLL


Le projet de DLL comporte plusieurs fichiers dextensions diffrentes qui sont les suivants :

Iyad MANSOUR

49

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Le fichier de projet : Rfid.dsw ;

Le fichier principal Rfid.cpp qui fait appel aux sous fichiers Comtools.cpp et
Comtools.h ;

Et enfin le fichier Rfid.def qui contient les fonctions exportables.

Rfid.dsw

Rfid.cpp

Comtools.h

Comtools.cpp

Rfid.def

Aprs Build
Rfid.dll

Figure III. 6 : Architecture de la DLL RFID.dll

III.6.2 Passage des variables en arguments (pointeurs)


Le problme majeur de lancienne DLL tait le partage de ses variables globales avec WinCC.
Nous avons alors choisi dutiliser le passage de nos variables globales par pointeurs afin
dviter ce problme. Cette solution a t une russite et aucun partage de donnes nest
ncessaire prsent.
Exemple de passage par adresse :
Short int Bytes_write (BOOL Mode, char* head, char* status, char* adresse, char* number,
char* data);
Les paramtres passs en argument sont :

Le mode (BOOL Mode);

La tte de lecture (char* head);

Le statut (char* status);

Iyad MANSOUR

50

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Ladresse de dbut dcriture ou de lecture (char* adresse);

Le nombre de caractre lire ou crire (char* number);

La chane de caractre crire ou la variable qui contiendra la valeur lue (char* data).

III.6.3 Schma de la communication WinCC-RFID


La communication entre WinCC et les units RFID comprend trois tapes essentielles :
1. Initialisation des ports srie du PC de supervision avec WinCC en utilisant les
fonctions offertes par la DLL ;
2. Envoi et rception des donnes sur la liaison RS232C ;
3. Ecriture des donnes dans les units RFID ou lecture des donnes partir des
units RFID.

COM1

Superviseur

Units
dvaluation

RS232C

COM2

Lecture - Ecriture

Port srie du PC de
supervision

Lecture - Ecriture dans


RFID

Unit RFID
Figure III. 7 : Etapes de la communication WinCC - RFID

III.6.4 Configuration de la liaison srie


Dans une communication srie en Visual C, une structure appele DCB est responsable de la
configuration de la liaison srie.
Cette structure de donnes pose des problmes dans lancienne DLL lors de sa construction et
WinCC affichait toujours des messages derreurs.
Nous avons chang les fonctions douverture et fermeture ainsi que les fonctions dcriture et
de lecture des ports et aussi les fonctions dexploitation des units RFID.
Fonction douverture du port srie :
Avant

dexpliquer

la

fonction

Comset

nous

tenons

introduire

quelques

fonctions lmentaires:

Iyad MANSOUR

51

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

CreateFile() : permet de crer un fichier qui sera responsable de louverture et linitialisation


du port srie.
WriteFile() : permet envoyer des donnes sur le port srie.
ReadFile() : permet de lire des donnes depuis le port srie.
CreateThread() : permet de crer un thread (gestionnaire) dcoute pour grer lenvoi et la
rception des donnes.
int comset (int com, unsigned int baud, int datenb, int stopb, int parity, int timeout, int tick, int
interart, void (*intrfunc)(int))
Nom de la fonction
{
char comstr[100],dcbstr[100],pari;
int ret;
Dclaration des variables
DWORD dwLastError;
locales
interart;intrfunc;
switch(parity)
{
case PARITYEVEN : pari='e'; break;
case NOPARITY : pari='n'; break;
case ODDPARITY : pari='o'; break;
default
: pari='n'; break;
}
ComSetError=0;
Ret=FALSE;
sprintf (comstr, "COM%d", com);

Paramtrage du bit de
parit

Affectation de COM1 ou COM 2 la variable


comstr

/* Initialisation du port srie choisi en paramtre avec la fonction Writefile


hCom[com-1] = CreateFile (comstr, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
if (hCom[com-1] != INVALID_HANDLE_VALUE)
Sil ny a aucune erreur dans
{
lexcution de la fonction
comin_buf[com-1]=new BYTE[MAXCOMINBUF];
Writefile, on initialise les
comin_z1[com-1]=comin_z2[com-1]=0;
buffers et les variables puis
comWriteOverlapped[com-1].hEvent=
on cre des vnements pour
CreateEvent(NULL,TRUE,TRUE,NULL);
lcriture et la lecture des
comReadOverlapped[com-1].hEvent=
donnes.
CreateEvent(NULL,TRUE,TRUE,NULL);
if (comin_buf[com-1] != NULL)
{
SetzeComTimeOut(com,timeout,tick);
sprintf(dcbstr,"%s:%d,%c,%d,%d",comstr,
baud,pari,datenb,stopb);
BuildCommDCB(dcbstr,&dcb[com-1]);
dcb[com-1].fDtrControl=DTR_CONTROL_ENABLE;
dcb[com-1].fRtsControl=RTS_CONTROL_ENABLE;

Iyad MANSOUR

52

Si la cration dvnements a
russi, on commence remplir la
structure DCB (responsable de la
communication) avec les
paramtres de configuration de
la communication srie

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

if (SetCommState(hCom[com-1],&dcb[com-1])>=0)
{
dwComNum=com;
switch(com)
{
case 1 : hThread[0] = CreateThread (NULL, 0,
ReadComData1 , &dwComNum, 0, &dwThreadId[0]);
break;
case 2 : hThread[1] = CreateThread (NULL, 0,
ReadComData2, &dwComNum, 0, &dwThreadId[1]);
break;
}
if (hThread[com-1]!=NULL)
{
SetThreadPriority(hThread[com-1],
THREAD_PRIORITY_HIGHEST);
ret = TRUE;}

Cration de Threads pour


la gestion de la lecture du
port srie.
Chaque port a son propre
Thread

Si la cration de Threads
a russi, on affecte la priorit
la plus haute au Thread .

}else
...
{ dwLastError=GetLastError();
switch(dwLastError)
{
case ERROR_FILE_NOT_FOUND:
ComSetError = CSERROR_PORT_
DOES_ NOT_EXIST ; break;

default: ComSetError = CSERROR_


OF_UNKNOWN_QUANTITY_ERROR; break; }

Sil y a eu une erreur dans


lexcution de la fonction
WriteFile, on affecte la
variable ComSetError les
diffrentes erreurs qui peuvent
apparatre.
Exemple : port occup ou port
non disponible

}
return ret;}
Fonction de fermeture du port :
Nom de la fonction

int comreset(int com)


{ int ret;
ret=-1;
if (hCom[com-1]!=(HANDLE)0xffffffff)
{
if (hThread[com-1]!=NULL)
TerminateThread(hThread[com-1],0);

Arrt du Thread

if (comin_buf[com-1]!=NULL)
delete comin_buf[com-1];
comin_buf[com-1]=NULL;

Effacement des buffers

Fermeture du port

ret=CloseHandle(hCom[com-1]);
hCom[com-1]=(HANDLE)0xffffffff;

Iyad MANSOUR

53

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

CloseHandle(comWriteOverlapped[com-1].hEvent);
CloseHandle(comReadOverlapped[com-1].hEvent);
} return ret;}

Arrt des vnements de


lecture et criture

Diffrence:
Le remplissage de la structure DCB se fait travers un passage des paramtres en arguments
dans un tableau. Ensuite la fonction BuildCommDCB construit la structure de donnes avec
les paramtres dsirs.
Les paramtres dsirs passent eux aussi en paramtre dans la nouvelle fonction Comset qui
tait auparavant init_port() et init_port3().
Les fonctions dcriture et de lecture du port srie sont dfinies dans les fonctions dcriture et
lecture relatives aux RFID. Ces dernires sont dveloppes indpendamment.
Fonction dcriture via le port srie :
int writedata(int com,BYTE c)
{
DWORD dwWritten, dwHandleSignaled, dwLastError;
HANDLE WaitHandles[2];
int success;
ComWriteError=0;
dwWritten=0;
WaitHandles[0]=comWriteOverlapped[com-1].hEvent;
success=FALSE;
ecriture[com-1]=
WriteFile(hCom[com-1],&c,1,
&dwWritten,&comWriteOverlapped[com-1]);

Dclaration des
variables locales

Cration de lvnement
dcriture
Ecriture COM1.

Fonction de lecture via le port srie:


DWORD ReadComData(DWORD com)
{ DWORD dwRead;
BYTE c;
HANDLE WaitHandles[2];
DWORD dwLastError,dwHandleSignaled;

Dclaration des
variables locales

WaitHandles[0]=comReadOverlapped[com-1].hEvent;

Iyad MANSOUR

54

Cration de lvnement
de lecture

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

For (;;)
{
if (ReadFile (hCom [com-1], &c, 1, &dwRead,
&comReadOverlapped[com-1]) = = TRUE )
{ comin_buf[com-1][comin_z2[com-1]]=c;
comin_z2[com-1]++;
if (comin_z2[com-1]>=MAXCOMINBUF)
comin_z2[com-1]=0;
comin_error[com-1]=0;

Lecture du port.

if (comin_z2[com-1]==comin_z1[com-1])
{
comin_error[com-1]=1;
ComReadError=CRERROR_OVERFLOW;
}
}
.
return dwRead;
}
Fonction de lecture depuis les units RFID :
short int _stdcall Byte_read(BOOL Mode, char* head, char* status, char* adresse, char*
number, char* data)
{

Dclaration des variables


locales

short int bAllesOk = 0;


ins_data.iBytes = 6;
if (Mode) { ins_data.iCode[0] = 'W';
} else {
ins_data.iCode[0] = 'w';
}
ins_data.iCode[1] = head[0];
ins_data.iCode[2] = adresse[0];
ins_data.iCode[3] = adresse[1];
ins_data.iCode[4] = number[0];
ins_data.iCode[5] = number[1];
if (Send()) {
ans_data.iBytes =
5 + HexToInt(number);
if (Receive()) {
ShiftLeft(ans_data.idata, 1);
status[0] = ans_data.idata[0];
status[1] = ans_data.idata[1];
status[2] = '\0';
ShiftLeft(ans_data.idata, 2);
ArrayCopy(data, ans_data.idata,
HexToInt(number));

Iyad MANSOUR

55

Choix du mode de lecture


W : mode automatique
w : mode manuel
Remplissage de la structure de
donnes dinstruction avec les
paramtres : head, adresse et
number.

Envoi des instructions vers


les units RFID et rception
des rponses depuis les units
RFID

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

bAllesOk = 1; }
}
return bAllesOk;
}
Fonction dcriture dans les units RFID :
short int _stdcall Bytes_write(BOOL Mode, char* head, char* status, char* adresse, char*
number, char* data)
{
short int bAllesOk = 0;
Dclaration des variables
ins_data.iBytes = 6 + HexToInt(number);
locales
if (Mode)
{
// Auto-Modus
ins_data.iCode[0] = 'K';
} else
{
// Single-Modus
ins_data.iCode[0] = 'k';
}

Choix du mode dcriture


K : mode automatique
k : mode manuel

ins_data.iCode[1] = head[0];
ins_data.iCode[2] = adresse[0];
ins_data.iCode[3] = adresse[1];
ins_data.iCode[4] = number[0];
ins_data.iCode[5] = number[1];

Remplissage de la structure de
donnes dinstruction avec les
paramtres : head, adresse et
number.

for (int i=0; i < HexToInt(number); i++) {


ins_data.iCode[6 + i] = data[i];}
if (Send ( ) )
{
ans_data.iBytes = 5;
if (Receive())
{
ShiftLeft(ans_data.idata, 1);
status[0] = ans_data.idata[0];
status[1] = ans_data.idata[1];
status[2] = '\0';
bAllesOk = 1;
}

Envoi des instructions vers


les units RFID et rception
des rponses depuis les units
RFID

}
return bAllesOk;
}
Les fonctions Send () et Receive() sont expliques dans le dossier technique.

Iyad MANSOUR

56

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

III.6.5 Modification des structures de donnes


La classe CString utilise dans lancienne DLL nous a pos des complications, nous avons d
changer cette classe et nous avons eu recours la structure de donnes struct qui contient
des tableaux de caractres :

Une structure qui contient les informations qui vont tre crites dans les RFID ;

Une structure qui contient les informations qui vont tre lues dans les RFID.

Structure de lecture :
struct ANSWER {

int iStatus;
unsigned char idata[DATA_ARRAY ];
int iBytes; };

Structure dcriture:
struct INSTRUCTION {

Unsigned char iCode[DATA_ARRAY ];


int iBytes ;};

III.6.6 Changement de linstruction dexportation des fonctions de la DLL vers WinCC


Dans les applications telle que WIN CC, qui font appel une DLL, les fonctions doivent tre
exportes laide de la convention dappel correcte sans la dcoration de noms effectue par
le compilateur.
Linstruction _stdcall cre la convention dappel correcte pour la fonction (la fonction
appele nettoie le pile et les paramtres sont passs de droite gauche) mais dcore le nom de
la fonction diffremment.
En effet, La dcoration de nom _stdcall fait prcder le nom du symbole dun trait de
soulignement (_) et annexe au symbole un arobase (@) suivi du nombre doctets dans la liste
darguments (lespace de pile requis).
Lutilisation du mot cl _declspec(dllexport) produit leffet suivant :

Si la fonction est exporte laide de la convention dappel C (_cdecl), elle supprime


le trait de soulignement de dbut (_) quand le nom est export.

Si la fonction exporte nutilise pas la convention dappel C (par exemple, _stdcall),


elle exporte le nom dcor.

Comme il nexiste aucun moyen de redfinir les cas o le nettoyage de pile se produit, nous
devons utiliser _stdcall. Pour supprimer la dcoration des noms au moyen de _stdcall, nous
devons spcifier les noms laide dalias dans la section EXPORTS du fichier Rfid.def .

Iyad MANSOUR

57

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Au fait les fonctions dveloppes dans RFID.dll seront imbriques dans dautres fonctions qui
seront incluses dans le fichier principal de la DLL Rfid.cpp et qui elles, seront exportes.
Nous prsenterons dans le prochain chapitre une liste et une description des fonctions
exportables par la DLL.
III.6.7 Fonctions de la DLL
Les fonctions de la DLL sont les suivantes :

short int _stdcall Evaluation_unit_reset (BOOL Mode);

short int _stdcall System_memory_examine(BOOL Mode, char* status);

short int _stdcall Data_medium_type_adjust (BOOL Mode, char* data_medium);

short int _stdcall Double_sided_read_letter_active (BOOL Mode);

short int _stdcall Autoread_letter_terminate (BOOL Mode);

short int _stdcall Version_message (BOOL Mode, char* version);

int _stdcall Comset (int iPort, int iBaud, int iBits, int iStop, int iParity, int iTimeout);

int _stdcall ComReset(int iPort);

short int _stdcall Data_medium_read (BOOL Mode, char* head, char* status, char*
data);

short int _stdcall Bytes_write (BOOL Mode, char* head, char* status, char* adresse,
char* number, char* data);

short int _stdcall Byte_read (BOOL Mode, char* head, char* status, char* adresse,
char* number, char* data);

short int _stdcall Reset (BOOL Mode, char* head, char* status);

Description de quelques fonctions:

Evaluation_unit_reset (BOOL Mode) : cette fonction permet denvoyer une trame


permettant de rinitialiser linterface de lunit dvaluation tout en tenant compte de
la configuration des interrupteurs.

System_memory_examine (BOOL Mode, char* status) : cette fonction permet de


vrifier ltat des mmoires EEPROM et RAM de la puce prsente dans la palette.

Double_sided_read_letter_active (BOOL Mode) : cette fonction est utilise pour la


lecture des donnes dans les deux sens ( du plus faible bit au plus fort et vice versa)

Iyad MANSOUR

58

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Autoread_letter_terminate (BOOL Mode) : cette fonction interrompt la lecture


automatique des donnes.

Comset (int iPort, int iBaud, int iBits, int iStop, int iParity, int iTimeout) : Cette
fonction permet de configurer les deux ports srie (Com1 et Com1) qui sont utiliss
pour la communication avec les deux units dvaluations.

int _stdcall ComReset (int iPort) : Cette fonction permet de librer le port srie
(Com1 ou Com2).

short int _stdcall Bytes_write (BOOL Mode, char* head, char* status, char*
adresse, char* number, char* data) : Cette fonction permet dcrire un Byte dans la
puce. Elle donne la possibilit de choisir la tte dcriture, le mode dcriture et la
destination des donnes crites.

short int _stdcall Byte_read (BOOL Mode, char* head, char* status, char*
adresse, char* number, char* data) : Cette fonction permet de lire toutes les
donnes de la puce. Elle donne la possibilit de choisir la tte de lecture, le mode de
lecture et la destination des donnes lues.

short int _stdcall Reset (BOOL Mode, char* head, char* status) : cette fonction
efface tout le contenu de la puce.

Ainsi, nous avons introduit toutes les fonctions lmentaires pour raliser la nouvelle DLL.
III.6.8 Chargement de la DLL dans WinCC
Chaque application de WinCC (Graphics Designer, Tag Logging, Alarm Logging), contient
son propre API dans une ou plusieurs DLL. On entend ici par DLL (Dynamic Link Library)
une bibliothque de fonctions qui se charge dynamiquement. Les dclarations des fonctions
places dans une DLL se trouvent dans un fichier d'en-tte associ.
Le code ci-dessous montre titre d'exemple la liaison de RFID.dll une action C.
La premire ligne contient le nom de la DLL charger.
Les lignes qui suivent permettent de charger les fonctions de la DLL.
La dclaration se termine par la ligne #pragma code ( ).
Chargement de la DLL sous WinCC :
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{#pragma code ("Rfid.dll")
short int Evaluation_unit_reset(BOOL Mode);
Iyad MANSOUR

59

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

short int System_memory_examine(BOOL Mode, char* status);


short int Data_medium_type_adjust(BOOL Mode, char* data_medium);
short int Double_sided_read_letter_active(BOOL Mode);
short int Autoread_letter_terminate(BOOL Mode);
short int Version_message(BOOL Mode, char* version);
int Comset (int iPort, int iBaud, int iBits, int iStop, int iParity, int iTimeout);
int ComReset(int iPort);
short int Data_medium_read(BOOL Mode, char* head, char* status, char* data);
short int Bytes_write(BOOL Mode, char* head, char* status, char* adresse, char*
number, char* data);
short int Byte_read(BOOL Mode, char* head, char* status, char* adresse, char*
number, char* data);
short int Reset(BOOL Mode, char* head, char* status);
#pragma code ()}
Aprs avoir russi le chargement de la DLL, nous avons ralis une interface graphique avec
WinCC qui nous permet de lire les donnes prsentes dans les palettes via les units RFID et
crire via les units RFID dans les palettes.
Interface dcriture et lecture WinCC RFID

Figure III. 8 : Interface dexploitation des units RFID

Noua allons dans ce qui suit dcrire les fonctions criture dans RFID et lecture des
RFID

Iyad MANSOUR

60

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Code de la fonction criture dans RFID partir de WinCC:


#include "apdefap.h"
Void OnClick(char* lpszPictureName,char* lpszObjectName, char* lpszPropertyName)
{
// Dfinition de la taille de la donne
#define DATA_ARRAY 129
// Chargement de la DLL
#pragma code ("Rfid.dll")
Short int Evaluation_unit_reset(BOOL Mode);
Short int System_memory_examine(BOOL Mode,char* status);
int Comset(int iPort, int iBaud, int iBits, int iStop,int iParity,int iTimeout);
int ComReset(int iPort);
Short int Bytes_write (BOOL Mode, char* head, char* status, char* adresse, char* number,
char* data);
#pragma code ()
// Fin du chargement de la DLL
// Dclaration des variables locales
int i;
Char buffer[3];
Char data[DATA_ARRAY ];
Char input[DATA_ARRAY ];
printf("\Programme d'exploitation des RFID\n\n");
printf("\n ECRITURE\n");
// Ouverture et initialisation du port
Comset(1,9600,8,1,0,20);
// Initialisation de lunit RFID
Evaluation_unit_reset(TRUE);
// Ajustement des donnes
Data_medium_type_adjust(TRUE, "4");
// Copie de la chane de caractre crire dans lunit RFID dans input
Strcpy (input, "pallette 1 ");
Strcpy (buffer, "xx");
// Ecriture de la chane de caractre dans lunit RFID
Bytes_write (TRUE, "1", buffer, "10", "34", input);
// Fermeture du port
ComReset (1);
}
Code de la fonction lecture des RFID partir de WinCC:
#include "apdefap.h"

Iyad MANSOUR

61

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)


{
//Dfinition de la taille de la donne
#define DATA_ARRAY 129
// Chargement de la DLL
#pragma code ("Rfid.dll")
Short int Evaluation_unit_reset(BOOL Mode);
Short int System_memory_examine(BOOL Mode, char* status);
int Comset(int iPort, int iBaud, int iBits, int iStop, int iParity, int iTimeout);
int ComReset(int iPort);
short int Byte_read(BOOL Mode, char* head, char* status, char* adresse, char* number,
char* data);
#pragma code()
// Fin du chargement de la DLL
int i;
// Dclaration des variables locales
char buffer[3];
char data[DATA_ARRAY ];
char input[DATA_ARRAY ];
printf("\nLECTURE PALETTE_1");
// Ouverture et initialisation du port
Comset(1,9600,8,1,0,20);
// Lecture de la chane de caractre de lunit RFID
Byte_read(TRUE, "1", buffer, "10", "34", data);
printf("\nStatus: %s\t", buffer);
printf("\nles donnes sont :\t");
// Affichage de la chane lue
for ( i = 0; i < 10; i++)
{
char c = data[i];
printf("%c ", c);
}
printf("\n");
// Fermeture du port
ComReset(1);
}

III.7

Conclusion

Iyad MANSOUR

62

ENIT 2006/2007

Projet de Fin dEtudes

Conception de la DLL dexploitation des RFID

Nous avons prsent au cours de ce chapitre la DLL ralise par le Sous lieutenant Chevance
Julien, ainsi que les diffrents problmes rencontrs lors du chargement de la DLL dans
WinCC.
Nous avons ensuite dcrit les modifications apportes la DLL afin quelle puisse tre
fonctionnelle avec WinCC .
En effet, le passage des variables en tant quarguments des fonctions nous a limin
dnormes obstacles.
Enfin nous avons prsent les nouvelles fonctions de la DLL RFID.dll .
Le chargement de la DLL sera ncessaire afin quon puisse aiguiller les palettes vers les
stations dsires. Cette partie sera dtaille dans le chapitre IV.

Iyad MANSOUR

63

ENIT 2006/2007

You might also like