III.1
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
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.
Iyad MANSOUR
40
ENIT 2006/2007
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 ;
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]
Taper_commande ()
Lecture_octet ()
Ok_donnees ()
Ecriture_texte ()
Read_all_octet ()
Lecture_32 ()
Trame_c ()
Tableau III. 1 : Fonctions de la DLL
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
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
ce qui revient choisir lunit dvaluation travers laquelle la communication sera tablie.
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.
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
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.
trame envoyer.
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 ().
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.
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
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>
Exemple
Iyad MANSOUR
44
ENIT 2006/2007
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
Voil le principe global de fonctionnement des procdures que nous avons cres et qui
permettent de grer les units RFID.
III.5
Iyad MANSOUR
46
ENIT 2006/2007
Puis nous choisissons un projet vide puisque nous allons le crer entirement (voir figure
III.5).
//Macro dexportation
Iyad MANSOUR
47
ENIT 2006/2007
Iyad MANSOUR
48
ENIT 2006/2007
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
Architecture de la DLL
Iyad MANSOUR
49
ENIT 2006/2007
Le fichier principal Rfid.cpp qui fait appel aux sous fichiers Comtools.cpp et
Comtools.h ;
Rfid.dsw
Rfid.cpp
Comtools.h
Comtools.cpp
Rfid.def
Aprs Build
Rfid.dll
Iyad MANSOUR
50
ENIT 2006/2007
La chane de caractre crire ou la variable qui contiendra la valeur lue (char* data).
COM1
Superviseur
Units
dvaluation
RS232C
COM2
Lecture - Ecriture
Port srie du PC de
supervision
Unit RFID
Figure III. 7 : Etapes de la communication WinCC - RFID
dexpliquer
la
fonction
Comset
nous
tenons
introduire
quelques
fonctions lmentaires:
Iyad MANSOUR
51
ENIT 2006/2007
Paramtrage du bit de
parit
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
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;}
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;
}
return ret;}
Fonction de fermeture du port :
Nom de la fonction
Arrt du Thread
if (comin_buf[com-1]!=NULL)
delete comin_buf[com-1];
comin_buf[com-1]=NULL;
Fermeture du port
ret=CloseHandle(hCom[com-1]);
hCom[com-1]=(HANDLE)0xffffffff;
Iyad MANSOUR
53
ENIT 2006/2007
CloseHandle(comWriteOverlapped[com-1].hEvent);
CloseHandle(comReadOverlapped[com-1].hEvent);
} return ret;}
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.
Dclaration des
variables locales
WaitHandles[0]=comReadOverlapped[com-1].hEvent;
Iyad MANSOUR
54
Cration de lvnement
de lecture
ENIT 2006/2007
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)
{
Iyad MANSOUR
55
ENIT 2006/2007
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';
}
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.
}
return bAllesOk;
}
Les fonctions Send () et Receive() sont expliques dans le dossier technique.
Iyad MANSOUR
56
ENIT 2006/2007
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 {
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
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 :
int _stdcall Comset (int iPort, int iBaud, int iBits, int iStop, int iParity, int iTimeout);
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);
Iyad MANSOUR
58
ENIT 2006/2007
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
Noua allons dans ce qui suit dcrire les fonctions criture dans RFID et lecture des
RFID
Iyad MANSOUR
60
ENIT 2006/2007
Iyad MANSOUR
61
ENIT 2006/2007
III.7
Conclusion
Iyad MANSOUR
62
ENIT 2006/2007
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