Conception d'une armoire de commande PC
Conception d'une armoire de commande PC
MEMOIRE
MAGISTER EN ELECTROTECHNIQUE
Par
RAISEMCHE Aziz
Thème
Mes remerciements vont aussi aux membres de jury qui ont accepté de
juger mon travail.
Introduction générale………………..……………………………………………………….……1
1.1 - Introduction………………………………………………………………………………….3
1.2 - Dispositifs Industriels de Commande……………………………………………………….3
1.2.1 - Sectionneurs……………………………………………………………………….3
1.2.2 - Disjoncteurs manuels………….……….………………………………………….............4
1.2.3 - Commutateurs à cames……………………………………………………………... 4
1.2.4 - Boutons poussoirs…………………………………………………………………... 5
1.2.5 - Relais de phase……………………………………………………………………... 5
1.2.6 - Relais thermiques…………………………………………………………………... 5
1.2.7 - Contacteurs magnétiques…………………………………………….…………….. 6
1.2.8 - Temporisateurs……………………………………………………………………... 6
1.2.9 - Lampes témoins……………………………………………………………………. 7
1.3 - Les Schémas en Électrotechnique…………………………………………………………..... 7
1.3.1 - Respect de la normalisation………………………………………………………… 7
1.3.2 - Quelques règles essentielles sur les schémas……………………………………. 8
1.3.2.1 - Principe de marquage des bornes…………………..……………………………8
1.3.2.2 - Principe de marquage des contacts……………………………………….…… 8
1.3.2.2 - Principe d’identification des éléments…………………………………….9
1.3.3 - Types de schémas…………………………………………………………………... 9
1.3.3.1 - Diagramme synoptique ("block diagram")……………………………….. 9
1.3.3.2 - Diagramme unifilaire ("one-line diagram")……………………………….
10
1.3.3.3 - Diagramme schématique ("schematic diagram")………………………….
10
1.3.3.4 - Diagramme des connections ("wiring diagram")………………………….
10
1.3.3.5 - Diagramme développé…………………………………………………...10
1.4 - Démarrage Industriel des Moteurs……...……………………………………………………. 11
1.4.1 - Démarrage Direct…………………………………………………………………… 12
1.4.2 - Démarrage Statorique………………………………………………………………. 13
1.4.3 - Démarrage Rotorique……………………………………………………………….. 14
1.4.4 - Démarrage Étoile-Triangle…………….……..…………………………………….15
1.4.5 - Démarrage par Autotransformateurs……………………………………………….. 18
1.5 - Freinage Industriel des Moteurs……………………………………………………………… 18
1.5.1 - Freinage rhéostatique (dynamique)………………………………………………… 19
1.5.2 - Freinage par inversion (contre-courant)……………………………………………. 20
1.5.3 - Freinage par injection de courant continu………………………………………….. 21
1.5.4 - Freinage par récupération d'énergie………………………………………………… 22
1.6 - Conclusion……………………………………………………………………………………. 24
CHAPITRE 2 - Conception et programmation du système 25
2.1 - Introduction…………………………………………………………………………………... 26
2.2 - Généralités sur la commande industrielle par PC……………………………………………. 26
2.3 - Exemple de commande par PC - démarrage statorique programmé…………………………. 27
2.3.1 - Principe……………………………………………………………………………... 27
2.3.2 - Application à un démarrage statorique d’une MAS à cage………………………… 28
2.3.3 - La carte INTEL 486………………………………………………………………… 29
2.3.4 - Programmation du port d'imprimante sous DOS………………………………… 30
2.3.5 - Détection du port parallèle………………………………………………………….. 31
2.3.6 - Principe du montage………………………………………………………………... 32
2.3.7 - L’algorithme de commande………………………………………………………… 34
2.3.8 - Le banc d’essai……………………………………………………………………... 35
2.4 - L’algorithme d’acquisition en ligne………………………………………………………….. 36
2.4.1 - Le problème d’accès au port sous Windows……………………………………….. 36
2.4.2 - La logique de programmation sous langage C……………………………………... 39
2.4.3 - Le préprocesseur et les bibliothèques de bases de données………………………… 39
2.4.4 - Les principales instructions………………………………………………………… 40
2.4.5 - Lecture et écriture dans des fichiers………………………………………………... 41
2.4.5.1 - Création des fichiers……………………………………………………… 41
2.4.5.2 - Lire et écrire dans le fichier………………………………………………. 46
2.4.5.3 - Création de fichiers graphiques…………………………………………... 50
2.5 - Conception de l’armoire de commande………………………………………………………. 52
2.5.1 - Description de la station de pompage………………………………………………. 52
2.5.2 - Etude de l’optimisation du fonctionnement d’une station de pompage……………. 54
2.5.3 - Algorithme d’optimisation…………………………………………………………. 55
2.5.4 - Conception de l’armoire de commande……………………………………………. 57
2.6 - Conclusion……………………………………………………………………………………. 63
3.1 - Introduction…………………………………………………………………………………... 65
3.2 - Modélisation des éléments du système……………………………………………………..… 65
3.2.1 - Modèle du disjoncteur……………………………………………………………… 65
3.2.2 - Modèle du contacteur………………………………………………………………. 66
3.2.3 - Modèle du relais de phases…………………………………………………………. 66
3.2.4 - Modèle du relais de niveau…………………………………………………………. 67
3.2.5 - Modèle du relais thermique………………………………………………………… 69
3.2.6 - Modèle de la pompe………………………………………………………………… 70
3.3 - Simulation de l’exemple du chapitre 2……………………………………………………….. 70
3.4 - Simulation de l’armoire commandée par PC…………………………………………………. 72
3.5 - Conclusion……………………………………………………………………………………. 75
La pompe représente l’une des éléments les plus importants dans une station de
pompage, mais le problème qui se pose c’est que le prix de l’énergie (électricité) est cher
pendant les heures de pointe, c’est pour cela qu’il est préférable de procéder au pompage hors
de cette période de temps. Notre but est de concevoir un système qui permet la gestion et
l’optimisation du fonctionnement des stations de pompage.
L’idée de ce projet est nouvelle, en effet il existe sur le marché des milliers de modèles
de cartes de commande, mais cette approche est basé sur l’utilisation des ordinateurs standard
que n’import qu’elle d’entre nous à chez lui. D’une part, leurs disponibilités et leur faible coût
nous permettra une conception à budget minime, et d’autre part, la puissance et la rapidité
d’exécution des processeurs du moment pourra prendre en charge le traitement des données
lors d’une communication entre les modules de commandes.
En plus l’originalité de notre étude est d’essayer à partir d’une carte simple et surtout
non coûteuse d’optimiser le fonctionnement des ouvrages d’extraction d’eau dans les stations
de pompages. Mais aussi notre système permet le stockage des données de consommation
durant toute une année. Ces données peuvent être transmises à un PC à l’aide d’un simple
câble d’imprimante (LPT/DB25) pour un éventuel traitement externe (traçage des courbes de
modulation…).
1
Le point fort aussi de ce mémoire c’est l’utilisation du plus connus des langages de
programmation qui est sans nul doute « le langage C ». Il est utilisé particulièrement par les
informaticiens pour la conception des programmes et des logiciels et c’est dommage de ne pas
voir ce type de langage intégré dans le programme d’étude en électrotechnique dans la mesure
où cela ouvrira des portes pour de nombreuses applications dans la commande programmable.
Ce langage possède une base de donné très riche et facile à manié, certainement plus
intéressante à manipuler que les langages assembleur utilisé pour programmer les
microcontrôleurs (PIC, Motorola, Atmel, etc…). De ce fait, on démontrera plus tard la
simplicité de la programmation avec le langage C cela en réalisant une application typique de
commande par PC pour un simple démarrage statorique d’un moteur asynchrone triphasé. On
notera que cet exemple à été l’objet d’une participation durant un congrès international en
informatique appliquée à Bordj Bou Arreridj [ICAI09].
Maintenant que nous avons présenté l’idée générale de notre projet, nous allons
présenter la démarche que nous avons envisagée en indiquant le contenu des différentes
parties qui constituent cet ouvrage : Le premier chapitre consistera, pour un premier temps, à
faire une présentation des différents éléments utilisés dans les commandes industrielles. Dans
le deuxième chapitre nous commencerons par la présentation globale des principaux
commande en C qui nous permettrons de réaliser notre programme de commande par la suite
une bonne partie sera consacrée pour décrire l’exemple précédemment citée ainsi que l’étude
de la procédure de conception de notre système pour un bon fonctionnement des pompes en
vue de l’optimiser. Dans le troisième chapitre nous attaquerons la partie simulation du
système, la démarche se veut avant tout progressive. Nous partirons donc des montages de
base des différents modules qui ont été présentés dans le schéma synoptique puis nous allons
essayer de les améliorer suivant les simulations et les expériences que nous décrirons dans
cette partie.
Ainsi, le premier et le deuxième chapitre qui ont pour but de se familiariser avec les
systèmes de commande et de programmation constituent la base puisqu’ils sont
indispensables à la compréhension du montage. Dans l’annexe nous décrirons la réalisation
pratique, cette présentation débutera par le traçage du schéma électrotechnique et des circuits
imprimés ainsi que la programmation.
2
Chapitre I Introduction à la commande industrielle des moteurs
Chapitre I
Introduction à la Commande
Industrielle des Moteurs
2
Chapitre I Introduction à la commande industrielle des moteurs
1 - Introduction :
La commande industrielle désigne l’ensemble des méthodes qui permettent de contrôler
les performances d’un appareil électrique, d’une machine ou d’un système. Appliquée aux
moteurs, la commande industrielle contrôle le démarrage, l’accélération, le sens de rotation,
la vitesse, la décélération et l’arrêt des parties tournantes.
Dans ce chapitre, nous étudierons la commande industrielle des moteurs (Continus
/Alternatifs). On se limitera à l’étude des circuits élémentaires car le montage industriel est
souvent trop élaboré pour permettre une représentation simple et des explications faciles.
Toutefois, les principes de base que nous examinons s’appliquent à tout système de
commande, quelque soit sa complexité.
3
Chapitre I Introduction à la commande industrielle des moteurs
2 3
1 4
4
Chapitre I Introduction à la commande industrielle des moteurs
Symbole
Figure 1.4 - Différents types de boutons poussoirs
15
16
18
RV 25
28
A1 L1 L2 L3 A2
5
Chapitre I Introduction à la commande industrielle des moteurs
6
Chapitre I Introduction à la commande industrielle des moteurs
Rouge
Moteur à l’arrêt (hors service)
Jaune/Orange
Défaut (Pb d’une phase, surintensité,…)
Blanc
Présence du courant (armoire alimentée)
7
Chapitre I Introduction à la commande industrielle des moteurs
règles de représentation sont à respecter, elles sont répertoriées dans des normes nationales,
européennes et internationales :
Monde ISO (CEI/CEI 439-1)
Europe CEN (CENELEC/EN50439-1)
France AFNOR (UTE/NF EN 50439-1)
8
Chapitre I Introduction à la commande industrielle des moteurs
Appareil mécanique de
Les contacteurs et relais auxiliaires :
connexion pour circuit de
- les contacteurs et relais
commande :
auxiliaires temporisé
- interrupteur-sélecteur S KA Condensateurs C
- auxiliaires et contacteurs à
- bouton poussoir
accrochage
- commutateur
- relais polarisé
- interrupteur de position
- résistance
Dispositif de protection :
Appareil mécanique actionné - shunt
- coupe-circuit à fusible
électriquement : - thermistance
- parafoudre
F - électro-aimant Y - potentiomètre R
- relais thermique
- embrayage - résistance
- relais magnétique
- frein électromécanique variable
- relais magnétothermique
- varistance
boutons-poussoirs
marche-arrêt
9
Chapitre I Introduction à la commande industrielle des moteurs
NO
S F NO T
600 V 2
3ph M
S F NO T
3
NO
A
NC
10
Chapitre I Introduction à la commande industrielle des moteurs
600V 3 ph
L1 L2 L3 L1 L2 L3
sectionneur démarreur
T1
B1 B2 B3 1 2 T2
T3
M
moteur
A
boutons-poussoirs
11
Chapitre I Introduction à la commande industrielle des moteurs
raccordés sur la même ligne. Dans ces circonstances, il faut limiter le couple de démarrage ou
le courant de démarrage en réduisant la tension aux bornes du moteur [1].
On trouve plusieurs procédés de démarrage, les plus courants sont :
1. Démarrage Direct
2. Démarrage Statorique
3. Démarrage Rotorique
4. Démarrage Étoile Triangle
5. Démarrage par Autotransformateur
In
Cn
8-
6- Cem
4- Cr
2- Ωn Ω
1-
Une impulsion sur S2 alimente le relais (KM1) : les contacteurs KM1 se ferment et le
relais est auto-alimenté → le moteur démarre, l’arrêt est obtenu par une impulsion sur S1. Le
moteur démarre sur ses caractéristiques "naturelles". Au démarrage, le moteur se compose
comme un transformateur dont le secondaire (rotor) est en court-circuit, d'où la pointe de
courant au démarrage [6].
12
Chapitre I Introduction à la commande industrielle des moteurs
14
Chapitre I Introduction à la commande industrielle des moteurs
3U U 2 cos ϕ U 3 U 2 cos ϕ
IY = PY = I∆ = 3 P∆ =
3 Z Z Z Z
Cette propriété est utilisée pour les démarrages des moteurs asynchrones triphasés où au
premier temps les enroulements sont couplés en étoile (In et P trois (3) fois plus faible) et au
deuxième temps on effectue le couplage triangle. Il en résulte de la même façon que le couple
de démarrage en étoile est trois fois plus faible qu'en triangle.
Ce type de démarrage s’applique uniquement au moteur possédant 6 bornes dans la plaque de
connexion. En effet, c’est impossible de réaliser ce type de montage avec une plaque à 3
bornes.
15
Chapitre I Introduction à la commande industrielle des moteurs
16
Chapitre I Introduction à la commande industrielle des moteurs
Lors du couplage étoile, chaque enroulement est alimenté sous une tension 3 fois plus
faible, de ce fait, le courant et le couple sont divisés par 3. Lorsque les caractéristiques du
courant ou du couple sont admissibles, on passe au couplage triangle. Le passage du couplage
étoile au couplage triangle n'étant pas instantané, le courant est coupé pendant 30 à 50 ms
environ. Cette coupure du courant provoque une démagnétisation du circuit magnétique. Lors
de la fermeture du contacteur triangle, une pointe de courant réapparaît brève mais importante
(magnétisation du moteur) [5].
Avantages Utilisations
- Bon rapport couple/courant - Moteurs AC
- Réduction importante du - Machines démarrant à vide
courant de démarrage - Ventilateurs et pompes
centrifuges
Inconvénients - Machines outils
- Couple au démarrage faible - Machine à bois
-Pas de possibilité de
réglage de la vitesse
- Apparition de
phénomènes transitoires
au changement du
couplage
- Puissance limitée (< 75
KW)
17
Chapitre I Introduction à la commande industrielle des moteurs
~
3 X 400v + PE
Ph1 Ph2 Ph3
1 3 5 Q2
Q1
Q1
2 4 6
95
F2
1/L1 3/L2 5/L3 1/L1 3/L2 5/L3 96
95
KM3 KM2
L1 L2 L3
S1
2
KM3 KM2
S2
4
L4 L5 L6
67
KM1
KA1
68
A1 A1 A1 A1
F2
KM1 KM3 KM2 KA1
2-4-6
M
3~ A2 A2 A2 A2
M1
Figure 1.21 – Schéma d’un démarrage par autotransformateur
~
3x400v alt +PE
2
Q2
3 4
95
1 3 5
F1
96
Q1
2 4 6
6 4 2 3
R
S2 KM1 KM2
5 3 1 4
F1
2/T1 4/T2 6/T3
A1 A1
U V W
KM1 KM2
M
A2 A2
3~
M1
19
Chapitre I Introduction à la commande industrielle des moteurs
Q2
3 4 2
95
1 3 5
F1
Q1 96
2 4 6
S1
2 1 3 1
KM1 S4
4 3
S3
4 2
6 5
R
1/L1 3/L2 5/L3
F1
KM2
2/T1 4/T2 6/T3 KM1
U V W
A1 A1
M
3~ KM1 KM2
M1
A2 A2
20
Chapitre I Introduction à la commande industrielle des moteurs
L'idée générale pour freiner un moteur asynchrone est de faire baisser la fréquence
d'alimentation, pour le faire travailler en alternateur plutôt qu'en moteur, le cas extrême est
l'injection de courant continu (fréquence = 0). On arrive dans ce cas particulier à un
alternateur qui a un rendement nul, l'intégralité de la puissance est alors dissipée dans le rotor
sous forme de pertes joules. L’alimentation en courant continu du stator crée un champ fixe
dans la machine qui s'oppose au mouvement. C'est la méthode la plus efficace pour freiner la
machine, mais les contraintes en courant sont également très sévères. Le contrôle de l'intensité
du courant continu permet de contrôler le freinage [12].
~
3 X 400v + PE Q2
Ph1 Ph2 Ph3
1 3 5
Q1
Q1
2 4 6
F2
KM3 KM2
F1
2/T1 4/T2 6/T3 2/T1 4/T2 6/T3
96
A1 B1 C1
T1
S3
2
N A2 B2 C2
3 1 3
1/L1 3/L2 5/L3 alt2 alt1
PD3
F1 KM1
- +
2/T1 4/T2 6/T3 S1
4 2 4
1 3 67
KM1
4/T2 6/T3 KM3 KM3
2/T1 KM2 S2 KA1
U V W
2 4 68
F3
RW
RU
RV
2 4 6 A1 A1 A1 A1 A1
A2 A2 A2 A2 A2
Lorsque l'ordre de démarrage est donné, KM3 se ferme et le moteur se met en rotation.
Lorsque l'arrêt est demandé, KM3 s'ouvre, puis KM1 et KM2 se ferment. Un courant continu
(limité par la résistance R1) est envoyé dans le stator. Le moteur se comporte comme un
alternateur en court-circuit. L'inducteur, constitué par 2 phases du stator, produit un champ
magnétique fixe.
Des courants rotoriques apparaissent : l'énergie cinétique est transformée en pertes par
effet Joule au niveau du rotor : le moteur ralentit. Lorsque le moteur est à l'arrêt, KM2 s'ouvre
21
Chapitre I Introduction à la commande industrielle des moteurs
[9]. Puisqu’en courant continu il n'y a pas d'inductance pour limiter le courant, il faut une
tension beaucoup plus faible que la tension normale. Le contacteur envoie 12V ou 24V entre
2 phases d'un moteur 380V pendant quelques secondes : ça freine très bien ! Parfois sur
certains moteurs il vaut mieux se contenter de 6V pour ne pas freiner trop brutalement.
Cette méthode est basée sur la dissipation d’une partie de l’énergie de freinage dans le
réseau, cette méthode se fait selon l’exemple suivant :
Supposons qu’un moteur soit raccordé à un réseau de 400V, 50Hz. Il entraîne une charge qui
exige un couple constant de 50 N.m (point 1). Supposons que l’on réduit brusquement la
tension et la fréquence à 85% de leurs valeurs nominales de sorte que la courbe A soit
subitement remplacée par la courbe B.
Les nouvelles conditions d’alimentation sont : E = 400x0,85 = 340V, f = 50x0,85 = 42,5Hz.
Comme la vitesse du moteur ne change pas instantanément, l’état de fonctionnement passe du
point 1 au point 2. Dans ces conditions, le moteur exerce un couple négatif de 180 N.m, celui-
ci s’ajoute au couple de charge (50 N.m), de sorte que le couple total de freinage devient 230
N.m, cela induit logiquement une diminution rapide de la vitesse. À mesure que la vitesse
diminue, le couple exercé par le moteur décroît progressivement, en suivant la courbe B.
Rendu à 1275 tr/min (point 3), le couple s’annule, mais sa vitesse continue à décroître
rapidement à cause du couple imposé par la charge. Après ce point, le moteur développe un
couple positif qui augmente progressivement, jusqu’au moment où il devient égale à celui de
[N.m]
300
Courbe B Courbe A
(Freinage - 42,5 Hz) (Naturel - 50 Hz) 200
↓ ↓
100 4 1
3
A 400V
0 50 Hz
2
-100
B 340V
-200 42,5 Hz
22
Chapitre I Introduction à la commande industrielle des moteurs
Courant de
4 à 8 In 2,5 In 2 à 4 In 5 In 3/4,5/6 In 1,5 à 2 In
démarrage
Couple au
0,6 à 1,5 Cn 0,2 à 0,5 Cn 0,6 à 0,85 Cn 0,4 à 0,85 Cn 0,4 à 0,85 Cn <2,5 Cn
démarrage
Commande 1 temps 2 temps 2 temps (ou +) 2 temps (ou +) 3 temps électroniques
-démarrage sans à
- démarreur -très bon rapport coup
-bon rapport
simple et -possibilités de couple/courant -montée
-économiques couple/courant
économique réglages des -possibilité de progressive en
Avantages -bon rapport - possibilités de
-couple au valeurs au réglage des vitesse
couple/courant réglages des valeurs au
démarrage démarrage valeurs au -limitation de
démarrage
important démarrage l’appel de courant
au démarrage
-couple de -faible réduction
-pointe de démarrage faible de la pointe de
-nécessite un auto
courant très -coupure courant au
-moteur à bague transformateur onéreux
Inconvénients importante d’alimentation au démarrage -prix
plus onéreux -présente des risques de
-démarrage changement de -nécessite des
réseau perturbé
brutal couplage résistances
-moteur 6 bornes volumineuses
Tableau 1.3 – Résumé des procédés de démarrage
Vitesse
100 %
Sans freinage
75%
50%
25%
Freinage Freinage
Freinage dynamique
par courant par inversion
continu
0
0 T0 2T0 3T0 4T0 5T0
Seconde (T0 : Constante de temps)
Mécanique
Figure 1.26 – Taux de décroissance de la vitesse selon le genre de freinage utilisé [1]
23
Chapitre I Introduction à la commande industrielle des moteurs
6 - Conclusion :
Dans ce chapitre, nous avons vu qu’avec une dizaine de dispositifs de base, on peut
réaliser des systèmes de commande allant du plus simple démarreur de moteur aux
contrôleurs de procédés industriels les plus complexes. Certain de ces dispositifs, comme les
sectionneurs, disjoncteurs, contacteur, relais thermique sont introduits directement dans le
circuit de puissance pour interrompre, mesurer ou modifier le courant de l’appareil
commandé.
D’autres dispositifs sont utilisés dans le circuit de commande à basse tension. Ces
composants comprennent les boutons-poussoirs, les interrupteurs spéciaux, les lampes
témoins, les relais de commande qui peuvent comporter plusieurs contacts. Ils sont
interconnectés de façon à réaliser l’intelligence du système de commande et les fonctions de
signalisation.
Pour le chapitre II, on utilisera les dispositifs industriels vus précédemment, ainsi que
les principes de démarrage détaillés précédemment tout ça sera commandé par un dispositif
informatisé assisté par PC.
24
Chapitre 2 Conception et programmation du système
Chapitre 2
Conception et programmation
du système
25
Chapitre 2 Conception et programmation du système
2.1 - Introduction
On va se focaliser pour l’instant sur le dispositif qui gère les signaux de commande.
On pourrait bien sûr, utiliser les systèmes habituels à base de carte DSP ou DSPACE et qui
sont pilotés par des logiciels spécifiques comme Matlab, Labview et qui ne pourrait être
réalisables sans la présence d’un PC. Mais aux lieux de ça, on pourrait générer les signaux de
commande en utilisant directement les entrées/sorties de l’ordinateur, en particulier le port
imprimante connue sous le nom de LPT (Local Parallel Transmition).
La commande par ordinateur offre une grande fiabilité et une flexibilité optimale. Pour
la périphérie intégrée dans la commande, le PC industriel offre une fonctionnalité multitâche
en temps réel [13]. En plus de l’utilisation d’un ordinateur, des interfaces matérielles et des
algorithmes d’asservissement en ligne doivent être adaptés en vue de piloter le système.
Choisir et concevoir des algorithmes de commande permettant d’imposer des
spécifications dynamiques appropriées tout en respectant certaines contraintes.
26
Chapitre 2 Conception et programmation du système
Réseau FIPWAY : c’est un réseau local industriel assurant la communication entre les
différents automates programmables. Il sert de bus de synchronisation entre automates. Il est
dérivé de la norme FIP.
Réseau MOBUS/JBUS : C’est un réseau local industriel qui répond aux architectures
Maitre/Esclave. Le bus est composé d’une station Maitre et de stations Esclave. Seule la
station Maître peut être à l’initiative de l’échange (la communication directe entre stations
Esclave n’est pas possible). Mobus
Master
Instrument Bus
Mobus
Slave
27
Chapitre 2 Conception et programmation du système
Ligne
triphasée
Lame de contact F
Cette application est un peu spéciale car elle traite les étapes de conception d’un
système de démarrage statorique informatisé à base d’un microprocesseur INTEL 486 en
utilisant son port parallèle (LPT) destiné généralement à la gestion des imprimantes. Le but
est donc de créer des signaux de commande numérique capables de piloter n’importe quel
actionneur électromagnétique, en l’occurrence dans notre cas, un moteur asynchrone à cage.
L’algorithme de commande sera écrit en langage C sous Windows Me seulement (on verra
pourquoi dans le § 2.4.1). L’interface de commande sera complétée par des contacteurs et
relais qui constitueront la partie puissance. Comme tout système de commande, le cœur de
l’installation contient en général au moins un microprocesseur ou microcontrôleur, dans notre
cas c’est le µp Intel 486 qui est relié par ses périphériques d’entrée/sortie. Pour la partie
puissance, on aura des coupleurs d'interfaces (Relais, contacteurs 1 et 2) et bien sûr un moteur
asynchrone à démarrage statorique. La chaîne globale est schématisée par la figure 2.4.
Clavier
Alimentation
AT
HDD Ecran
Carte Intel 486
Relais 2RT
(5/220)V
Source
Protection Contacteur KM2 Contacteur KM1 M
AC (Démarrage)
3~
Rhéostat de
démarrage
28
Chapitre 2 Conception et programmation du système
Figure 2.5 - Le relais 2RT Figure 2.6 - µP Intel 486 DX2 50MHz
L'Intel 80486 (figure 2.6) est un microprocesseur CISC fabriqué par Intel® qui fait
partie de la famille des x86. Du point de vue de l'architecture, c'est une grande amélioration. Il
y a un cache d'instruction et de donnée unifiée intégrée, en option, une unité de calcul en
virgule flottante intégrée (FPU), et une unité d'interface de bus améliorée. En outre, le cœur
du processeur peut soutenir un rythme d'exécution d'une instruction par cycle. Ces
améliorations permettent approximativement de doubler la vitesse d'exécution à 100MHz [5].
Les éléments suivants constituent la carte Intel 486 :
29
Chapitre 2 Conception et programmation du système
Figure 2.7 - Photo de la carte mère avec son processeur Intel 486
Pour commencer à programmer le port, nous allons utiliser le système DOS. Sous
DOS, nous avons des commandes pour accéder directement au port LPT mais ces
programmes ne fonctionnent pas sur les systèmes basés sur Windows NT, XP, Vista ou
versions supérieures. En effet, pour des raisons de sécurité, ces versions de Windows ne
permettent pas d'accéder directement au port. Pour programmer le port parallèle sous XP,
nous avons besoin d'écrire des pilotes en mode noyau (voir annexe). Maintenant, si on prend
une fiche imprimante LPT plus connue sous le nom de DB-25. Le nombre 25 représente en
général, le nombre de connexions existantes et dans notre cas c’est une prise à 25 broches. Le
tableau ci-dessous nous donne l’aspect de ce type de prise avec la désignation de chaque
broche.
30
Chapitre 2 Conception et programmation du système
On aura donc sur ce type de prise 8 broches de données bidirectionnelles allant du pin
2 au pin 9, contrairement au port série cela nous donnera une transmission de 8 signaux
binaires simultanés, en d’autres termes on aura un mot binaire de 1 Octet en transmission
parallèle. En plus, vu qu’on a une communication bidirectionnelle, on doit avoir un système
permettant de choisir la direction de transmission de données, soit pour saisir les données ou
soit pour les transmettre. Ce protocole est symbolisé par I/O c'est-à-dire input/output.
Code : C
#include <stdio.h>
#include <dos.h>
void main()
{
unsigned int far *ptraddr; /* Pointeur pour localiser
l’adresse des ports LPT */
unsigned int adresse; /* Adresse du Port */
int a;
ptraddr=(unsigned int far *)0x00000408;
clrscr();
31
Chapitre 2 Conception et programmation du système
else
printf("L’adresse assignée à LPT%d est 0x%X
\n",a+1,adresse);
ptraddr++;
}
getch();
}
Code C
L’adresse assignée à LPT1 est 0x3BC
L’adresse assignée à LPT1 est 0x378
L’adresse assignée à LPT1 est 0x278
6/T3
3/L2
4/T2
1/L1
2/T1
KM2
5/L3
6/T3
Ph3
W
5
6
2
~3x400v alt +PE
3/L2
4/T2
Ph2
3~
V
4
M
1/L1
2/T1
Ph1
U
3
M1
Q1
KM1
32
Chapitre 2 Conception et programmation du système
Fermeture de KM1
Démarrage du moteur
Temporisation de 5s
(5s = 5000ms = 1388 en hexa)
Fermeture de KM 2
Le rhéostat est court-circuité
Non
Fin
33
Chapitre 2 Conception et programmation du système
- Pour faire entrer un bit au port parallèle, on doit utiliser l’instruction [inportb]
- Pour faire sortir un bit du port parallèle, on doit utiliser l’instruction [outportb]
- Pour faire une temporisation, on utilise l’instruction [delay]
- Pour afficher un message sur écran, on utilise l’instruction [printf]
Bien sûr ça parait facile, mais il faut synchroniser le processeur avec le port LPT, pour
cela on doit mettre les sorties (les bits de commande) dans la case mémoire dont l’adresse est
celle du port LPT de la carte, en l’occurrence c’est 0x378 (0x : veut dire hexadécimal).
Vue la longueur du programme, on ne tient compte que des lignes principales, celles
qui prennent en charge la commande. Le programme simplifié sous VisualC++ sera comme
suit :
Code : C
#include"conio.h"
#include"dos.h"
#include"stdio.h"
void main()
{
printf("Démarrage du moteur: statorique de %ld secondes,
TDS");
outportb(PORT,0x01); /*sortie du code %00000001*/
delay(TDS); /*temporisation de 5 sec*/
outportb(PORT,0x03);
printf("Fin du démarrage, le moteur tourne à plain
régime");
while(!kbhit())
{
Printf(Appuyer sur une touche pour arrêter le moteur");
outportb(PORT,0x00); /*sortie du code %00000011*/
}
return 0;
}
34
Chapitre 2 Conception et programmation du système
Cette exemple nous donne un léger aperçu de nos projets en vue de leur réalisation. En
effet, les programmes précédents on été compilés avec Turbo C sous Windows Melinium
mais on utilisera pour ce projet le compilateur de Visual C++ et on changera DOS pour passer
à Windows XP.
On devra en plus faire quelques rectifications au sujet du contrôle des ports PC. Tout
cela va être détaillé dans les paragraphes qui suivent.
35
Chapitre 2 Conception et programmation du système
Pour programmer un port sous ces systèmes, on a besoin d’écrire sous un mode
nommé « Mode Noyau », qui existe déjà sous Linux et Windows Me mais reste absent sous
XP. La solution est : si l’on veut exécuter le même programme on doit utiliser Visual C++ au
lieu de Turbo C. En plus, on doit créer une application en suivant ces étapes [17]:
• Sur l’onglet « Projects », on choisi « MFC AppWizard (exe) » et on nomme notre projet
« ParallelPort »
• Dans la fenêtre suivante on choisi « Dialog based » et on clic sur « Next » en laissant les
autres options par défaut
• On clic sur « Finish » puis « OK » pour avoir une fenêtre avec deux boutons et une
phrase disant « TODO : Place Dialog control here », on doit supprimer cette phrase.
• Si on exécute cette application en cliquant sur cette icône : , cela ne nous donnera
aucune erreur et aucun avertissement du coup on peut accéder à la fenêtre de la figure
2.11 :
36
Chapitre 2 Conception et programmation du système
Code : C
void CParallelPortDlg::ChangePin(int pin)
{
int data_register, new_register;
UpdateData(TRUE);
data_register=_inp( DATA );
new_register=0;
_outp(DATA, new_register);
}
void CParallelPortDlg::ChangeControl()
{
int control_register, new_register;
UpdateData(TRUE);
control_register = _inp( CONTROL );
new_register = control_register;
_outp(CONTROL, new_register);
}
37
Chapitre 2 Conception et programmation du système
La fenêtre de conception étant terminée, la prochaine partie est le codage. Nous avons
placé des contrôles dans la boîte de dialogue. Pour obtenir les valeurs de ces contrôles, nous
avons besoin de variables associées. Pour cela, dans le menu contextuel on sélectionne
« ClassWizard » puis « Variables membres ». On obtiendra une liste de contrôle d'identité.
On sélectionne chaque ID séparément et on clique sur ajouter une variable. On tape le nom de
variable comme m_pin1. m_pin10, m_pin11, etc ... et dans la catégorie type de variable on
met : BOOL. Cela nous donnera la configuration suivante :
Maintenant, c’est la dernière étape (la plus importante), c’est celle qui donne l’accès au
port sous XP. L’astuce est d’utiliser le fichier DLL « InpOut32 » est qui peut envoyer des
données au port parallèle (On peut télécharger ce fichier gratuitement à partir de
http://logix4u.net).
Pour savoir comment utiliser les fichiers DLL dans VC++, nous allons convertir notre
projet pour l’activé sous XP.
• On ajoute ces deux lignes dans le fichier « ParallelPortDlg.cpp » après les directives de
préprocesseur.
Code : C
Bref Inp32 _stdcall (portaddr courte);
void Out32 _stdcall (portaddr court, datum courte);
38
Chapitre 2 Conception et programmation du système
Pour notre programme on a choisi le langage C car c’est un langage normalisé qui
comprend des instructions de préprocesseur, des instructions C et des symboles dont la
sémantique peut varier selon le contexte, c'est vrai que ça demande une initiation longue, mais
on va bien devoir passer par là. Petit à petit, on expliquera les étapes de conception du
programme d’acquisition des données de l’historique de fonctionnement de la pompe, en
s’aidant bien sur de ce qui a été fait dans l’exemple précédent (§2.3). Bien sur on ne va pas
mettre toutes les instructions du langage C, mais on se limitera sur ce qu’on a besoin dans nos
travaux, avec ce qui suit on apprendra suffisamment de choses pour commencer à réaliser des
programmes de plus en plus complexes. Le but étant pour nous d’essayer de nous débrouiller
tous seuls dans n'importe quel programme écrit en C.
Les bibliothèques les plus utilisées dans la plupart des programmes sont :
39
Chapitre 2 Conception et programmation du système
Heureusement, on peut lire et écrire dans des fichiers en langage C. Les fichiers seront
écrits sur le disque dur de l’ordinateur : l'avantage est donc qu'ils restent les mêmes si on
arrête le programme ou l'ordinateur.
Pour lire et écrire dans des fichiers, nous allons avoir besoin de réutiliser tout ce que
nous avons appris jusqu'ici : pointeurs, structures, pointeurs de structures, chaînes de
caractères etc. Pour une bonne compréhension de ce chapitre, il faut donc avoir une petite
base en programmation si c’est possible en langage C.
Pour lire et écrire dans des fichiers, nous allons nous servir de fonctions situées dans le fichier
source nommée stdio.h (.h est une extension qui veut dire header). Elle contient plusieurs fonctions,
notamment des fonctions faites pour travailler sur des fichiers.
Tous les fichiers sources que nous allons utiliser : stdlib.h, stdio.h, math.h, string.h...,
sont ce qu'on appelle des fichiers source standards. Ce sont des fichiers livrées avec l’IDE et
qui ont la particularité de fonctionner sur tous les OS. On peut donc les utiliser partout, qu’on
soit sous Dos, Windows, Linux, Mac ou autre. Les fichiers source standards ne sont pas très
nombreux et ne permettent de faire que des choses très basiques.
Maintenant que les bons fichiers source sont inclus, nous allons pouvoir s’attaquer aux
choses les ardues. Voici ce qu'il faut faire à chaque fois dans l'ordre quand on veut ouvrir un
fichier (que ce soit pour lire ou pour écrire dedans) :
• On appelle la fonction d'ouverture de fichier fopen qui nous renvoie un pointeur sur le
fichier.
• On vérifie si l'ouverture a réussi (c'est-à-dire si le fichier existait) en testant la valeur du
pointeur qu'on a reçu. Si le pointeur vaut NULL, c'est que l'ouverture du fichier n'a pas
marché, dans ce cas on ne peut pas continuer (il faut afficher un message d'erreur).
• Si l'ouverture a marché (si le pointeur est différent de NULL ), alors on peut lire et écrire
dans le fichier à travers des fonctions que nous verrons un peu plus loin.
• Une fois qu'on a terminé de travailler sur le fichier, il faut penser à le "fermer" avec la
fonction fclose.
41
Chapitre 2 Conception et programmation du système
Nous allons dans un premier temps apprendre à nous servir de fopen et fclose. Une
fois que nous saurions faire cela, nous apprendrons à lire le contenu du fichier et à écrire
dedans. Voir justement le prototype de la fonction fopen :
Code : C
FILE* fopen(const char* nomDuFichier, const char*
modeOuverture);
• Le mode d'ouverture du fichier, c'est-à-dire une indication qui dit si vous voulez juste
écrire dans le fichier, juste lire dans le fichier, ou les deux à la fois.
Cette fonction renvoi un pointeur sur FILE. C'est un pointeur sur une structure de type FILE.
Cette structure est définie dans stdio.h. La fonction fopen renvoi un FILE*. Il est
extrêmement important de récupérer ce pointeur, pour pouvoir ensuite lire et écrire dans le
fichier. Le pointeur est initialisé à NULL dès le début. Je vous rappelle que c'est une règle
fondamentale que d'initialiser ses pointeurs à NULL dès le début si on n'a pas d'autre valeur à
leur donner. Si on ne le fait pas, on risque des plantages par la suite.
Notez que la forme de la structure peut changer d'un OS à l'autre (elle ne contient pas
forcément les mêmes sous-variables partout). Pour cette raison, on ne modifiera jamais le
contenu d'un FILE directement, on passera par des fonctions qui manipulent le FILE à notre
place.
Maintenant, nous allons appeler la fonction fopen et récupérer la valeur qu'elle renvoi
dans le pointeur "fichier". Mais avant ça, il faut savoir comment se servir du second
paramètre, le paramètre "modeOuverture". En effet, il y a un code à envoyer qui indiquera à
l'ordinateur si on ouvre le fichier en mode de lecture seule, d'écriture seule, ou des deux à la
fois, ce qui semble logique.
• "r" : lecture seule. On pourra lire seulement le contenu du fichier. Le fichier doit être
créé au préalable.
42
Chapitre 2 Conception et programmation du système
• "w" : écriture seule. On pourra seulement écrire dans le fichier. Si le fichier n'existe
pas, il sera créé.
• "a" : mode d'ajout. On écrit dans le fichier en partant de la fin. On peut rajouter donc
du texte à la fin du fichier. Si le fichier n'existe pas, il sera créé.
• "r+" : lecture et écriture. On pourra lire et écrire dans le fichier. Le fichier doit être
créé au préalable.
• "a+" : ajout en lecture / écriture à la fin. On écrit et on lit du texte à partir de la fin
du fichier. Si le fichier n'existe pas, il sera créé.
Et encore, pour chaque mode qu'on a vu par exemple si vous rajoutez un "b" après le
premier caractère ("rb", "wb", "ab", "rb+", "wb+", "ab+"), alors le fichier est ouvert en mode
binaire. On a déjà fort à faire avec ces 6 modes d'ouverture à retenir personnellement, j'utilise
souvent "r" (lecture), "w" (écriture) et "r+" (lecture et écriture). Le mode "w+" est un peu
dangereux parce qu'il vide de suite le contenu du fichier, sans demande de confirmation. Il ne
doit être utilisé que si vous voulez réinitialiser le fichier. Le mode d'ajout ("a") peut être utile
dans certains cas, juste pour rajouter des informations à la fin du fichier.
Code : C
int main(int argc, char *argv[])
{
FILE* fichier = NULL;
fichier = fopen("test.txt", "r+");
return 0;
}
Le pointeur "fichier" devient alors un pointeur sur "test.txt". Le fichier conçu doit être
situé dans le même dossier que notre exécutable (.exe).
43
Chapitre 2 Conception et programmation du système
• Soit l'ouverture a échoué parce que le fichier n'existait pas ou était utilisé par un autre
programme. Dans ce cas, on doit arrêter de travailler sur le fichier.
Code : C
int main(int argc, char *argv[])
{
FILE* fichier = NULL;
fichier = fopen("test.txt", "r+");
if (fichier != NULL)
{
// On peut lire et écrire dans le fichier
}
44
Chapitre 2 Conception et programmation du système
else
{
// On affiche un message d'erreur si on veut
printf("Impossible d'ouvrir le fichier test.txt");
}
return 0;
}
On fait toujours ça lorsqu’on ouvre un fichier et si on ne le fait pas et que le fichier n'existe
pas, on risque un plantage du programme par la suite.
Une fois qu’on a fini de travailler avec le fichier, il faudra le "fermer". On utilise pour
cela la fonction fclose qui a pour rôle de libérer la mémoire, c'est-à-dire supprimer notre
fichier chargé dans la mémoire vive.
Code : C
Int fclose(FILE*pointeurSurFichier);C
Cette fonction prend un paramètre : le pointeur sur le fichier. Elle renvoie un int qui indique
si elle a réussi à fermer le fichier. Cet int vaut :
• 0 : si la fermeture a marché
• EOF : si la fermeture a échoué. EOF est un define situé dans stdio.h qui correspond à
un nombre spécial, utilisé pour dire soit qu'il y a eu une erreur, soit qu'on est arrivé à la
fin du fichier. Dans le cas présent cela signifie qu'il y a eu une erreur.
Enfin, le schéma que nous allons suivre pour ouvrir et fermer un fichier sera le suivant :
Code : C
int main(int argc, char *argv[])
{
FILE* fichier = NULL;
fichier = fopen("test.txt", "r+");
if (fichier != NULL)
{
// On lit et on écrit dans le fichier
// ...
45
Chapitre 2 Conception et programmation du système
On n'a pas mis le else ici pour afficher un message d'erreur si l'ouverture a échoué.
Il faut toujours penser à fermer le fichier une fois que l'on a fini de travailler avec, cela
permet de libérer de la mémoire. Si on oublie ça, notre HDD risque à la fin de se saturer. Sur
de petit programme ce n'est pas flagrant, mais sur un gros programme ça devient plus sérieux.
Maintenant que nous avons écrit le code qui ouvre et ferme le fichier, nous n'avons
plus qu'à insérer le code qui lit et écrit dedans. Nous allons commencer par voir comment
écrire dans un fichier (ce qui est un peu plus simple), puis nous verrons ensuite comment lire
dans un fichier.
Ecrire dans le fichier : Il existe plusieurs fonctions capables d'écrire dans un fichier. Ce sera
à vous de choisir celle qui est la plus adaptée à votre cas.
46
Chapitre 2 Conception et programmation du système
Se déplacer dans un fichier : On a parlé d'un terme "curseur" virtuel tout à l'heure. Nous
allons l'étudier maintenant plus en détail. A chaque fois qu’on ouvre un fichier, il existe en
effet un curseur qui indique notre position dans le fichier. Nous pouvons imaginer que c'est
exactement comme le curseur dans un éditeur de texte (tel bloc-notes). Il indique où nous
sommes dans le fichier, et donc où nous allons écrire.
En résumé : le système de curseur nous permet d'aller lire et écrire à une position précise
dans le fichier. Il existe 3 fonctions à connaître :
ftell : position dans le fichier : Cette fonction est très simple à utiliser. Elle renvoie la
position actuelle du curseur sous la forme d'un long. Le prototype de ftell est le suivant ::
Code : C
long ftell(FILE* pointeurSurFichier);
fseek : se positionner dans le fichier : La fonction fseek permet de déplacer le "curseur" d'un
certain nombre de caractères (indiqué par déplacement) à partir de la position indiquée par
origine. Le prototype de fseek est le suivant :
Code : C
int fseek(FILE* pointeurSurFichier, long deplacement, int
origine);
• Le nombre déplacement peut être un nombre positif (pour se déplacer en avant), nul (=
0) ou négatif (pour se déplacer en arrière).
• Quant au nombre origine, vous pouvez mettre comme valeur l'une des 3 constantes
(généralement des defines) listées ci-dessous :
47
Chapitre 2 Conception et programmation du système
Voici quelques exemples pour bien comprendre comment utiliser déplacement et origine
Code : C
fseek(fichier, 2, SEEK_SET);
Code : C
fseek(fichier, -4, SEEK_CUR);
Code : C
fseek(fichier, 0, SEEK_END);
Si on écrit après avoir fait un fseek qui mène à la fin du fichier, cela rajoutera vos
informations à la suite dans le fichier (ça complètera notre fichier).
En revanche, si on place le curseur au début et qu’on écrit, cela écrasera le texte qui se
trouvait là. Il n'y a pas de moyen "d’insérer" de texte dans le fichier (à moins de coder soi-
même une fonction qui lit les caractères d'après pour s'en souvenir avant de les écraser). Mais
maintenant le problème qui reste à résoudre c’est comment on sait à quelle position on doit
aller lire et écrire dans le fichier ? Alors ça, c'est nous qui gérons cette étape.
Si c'est un fichier que nous avons nous-mêmes écrit, nous savons comment il est
construit. On sait donc où aller chercher nos informations (par exemple le temps de
fonctionnement de la pompe est en position 0, le nombre de mise en marche/arrêt de la pompe
est en position 50 etc...)
On fera une mise au point plus tard dans lequel nous comprendrons (si ce n'est pas déjà
le cas) comment on fait pour aller chercher l'information qui nous intéresse. N'oublions pas
que c'est nous qui définissons comment notre fichier est construit.
48
Chapitre 2 Conception et programmation du système
La fonction fseek peut se comporter bizarrement sur des fichiers ouverts en mode
texte. En général, on l'utilise plutôt pour se déplacer dans des fichiers ouverts en mode
binaire.
Quand on lit/écrit dans un fichier en mode texte, on le fait généralement caractère par
caractère. La seule chose qu'on se permet en mode texte avec fseek c'est de revenir au début
ou à la fin.
rewind : retour au début : Cette fonction est équivalente à fseek pour revenir à la position 0
dans le fichier. Si on a eu un magnétoscope un jour dans notre vie, eh bien c'est le même nom
de la touche qui permet de revenir en arrière.
Le prototype est :
Code : C
Aussi étonnant que cela puisse paraître, ce chapitre ne vous a enseigné aucune
nouvelle connaissance en langage C. Car on n’a pas encore parlée des pointeurs, des tableaux,
des structures. Ici, nous n'avons fait qu'utiliser des fonctions de stdio, une bibliothèque
standard. Nous avons donc fait l'étude d'une bibliothèque.
En fait, le langage C est vite appris pour ce qui est de la base. Le plus long est
certainement d'arriver à comprendre les pointeurs, à ne pas confondre valeur et adresse en
analogie avec l’assembleur, Motorola ou PIC.
Mais, une fois que c'est fait, on est en théorie capable de tout programmer. Le tout est
de savoir utiliser des bibliothèques, c'est-à-dire faire ce qu'on vient de faire ici : apprendre à
utiliser des fonctions de ces bibliothèques.
Sans bibliothèque, un programme ne peut donc rien faire. Même le printf nous
n'aurions pas pu le faire, vu qu'il est situé dans stdio.
49
Chapitre 2 Conception et programmation du système
Nous allons réaliser une visualisation des données en SDL, plus précisément, on
dessinera la courbe de fonctionnement du système à partir des données recueillies. C’est sûr
que ce n’est pas aussi facile que ça mais on va essayer d’expliquer seulement les commandes
principales qui sont nécessaires pour ce projet.
On utilisera FMOD (qui possède d’immense capacité). Elle peut lire aussi des CD,
effectuer des enregistrements, des modifications, etc... Nous allons ici nous intéresser à un de
ses modules, appelé DSP. Ce sont justement celles qui nous donnent des informations sur les
données, afin que nous puissions visualiser la courbe. Pour cela, il va falloir activer ce
module :
Code : C
FGRAPH_DSP_SetActive(FGRAPH_DSP_GetFFTUnit(), 1);
Récupérer les données : Maintenant que le module DSP est activé, on peut faire appel à la
fonction FGRAPH_DSP_GetSpectrum(). Il n'y a aucun paramètre à lui donner. En revanche,
elle offre des choses très intéressantes : un pointeur vers un tableau de 512 float. Il nous
faudra donc déclarer un pointeur vers float. On peut ensuite parcourir ce tableau pour obtenir
les valeurs de chacune des cases :
Code : C
donnée[0] // première case (à gauche)
donnée [1]
donnée [2]
...
donnée [509]
donnée [510]
donnée [511] // dernière case (à droite)
50
Chapitre 2 Conception et programmation du système
Chaque case est un nombre décimal compris entre 0 (rien) et 1 (maximum). Notre
travail va consister à afficher une barre plus ou moins grande en fonction de la valeur que
contient chaque case du tableau. Par exemple, si la valeur est 0.5, nous devrons tracer une
barre dont la hauteur correspondra à la moitié de la fenêtre destinée à accueillir le graph. Si la
valeur est 1, elle devra faire toute la hauteur de la même fenêtre. Mais les barres doivent
bouger au fur et à mesure du temps. Comme les données changent tout le temps, il faut mettre
à jour le graphique. En effet, le tableau de 512 floats que nous renvoie FMOD change toutes
les 25 ms (pour être à jour par rapport aux nouvelles données actuelles). Il va donc falloir
dans le code de relire le tableau de 512 floats (en refaisant appel à
FGRAPH_DSP_GetSpectrum()) toutes les 25 ms, puis mettre à jour le graphique en barres.
• SDL_PollEvent : elle renvoie une valeur qu'il y ait eu un évènement ou pas. On dit
que la fonction n'est pas "bloquante" : elle ne met pas en pause le programme, la
boucle infinie va donc tourner indéfiniment tout le temps.
Comme nous pouvons le voir, notre CPU est utilisé à 100% par notre programme
testsdl.exe. Il vaut mieux utiliser le moins de CPU possibles pour que l'utilisateur puisse faire
autre chose sans que son PC ne "rame". On va reprendre exactement le même code source
mais on va lui ajouter en plus un SDL_Delay pour patienter le temps qu'il faut afin que ça
fasse 30ms. C’est comme si on effectue un échantillonnage de 30 ms pour chaque acquisition.
51
Chapitre 2 Conception et programmation du système
Le principal élément dans une station est les pompes, leur rôle est de refouler une
quantité d’eau d’un niveau bas à un niveau haut. C’est pour cela qu’une pompe se compose de
deux parties essentielles qui sont : l’aspiration et le refoulement.
Mais il diffère d’une pompe à une autre suivant des critères bien définis comme le
débit, la pression, la hauteur, le rendement et la puissance [19]. Pour cela, on va étudier les
pompes centrifuges qui ont des performances très variables ce qui leur confèrent à des
utilisations diverses : Transfert de fluide (débit important), transmission de puissances
(pression importante).
Une pompe centrifuge est construite pour répondre à des conditions précises de
52
Chapitre 2 Conception et programmation du système
fonctionnement : débit Q à élever à une hauteur H. Quand la pompe ne comporte qu’une seule
cellule elle est dite monocellulaire et se compose d’une roue et d’une volute ou corps de
pompe qui joue le rôle de diffuseur de la pompe multicellulaire. Le problème se pose sur
l’économie d’énergie pour une station de pompage. Tout d’abord, nous allons analyser des
données tirées d’un document qui nous a été donné par un entrepreneur, ce document présente
des données de consommation d’eau enregistrées à la station de pompage de la commune de
Boutaleb.
Pour montrer que la consommation d’eau se diffère d’une saison à une autre. Nous
avons tiré quelques valeurs dans les tableaux suivants.
On constate d’après les deux tableaux que la consommation d’eau varie en passant
d’une saison à une autre c’est à dire en été on consomme plus qu’en hiver. Mais aussi en
remarque que la quantité d’eau consommée varie de façon remarquable durant toute la
journée.
D’une part, si le niveau d’eau atteint son niveau bas, il faut que les moteurs
démarrent. D’autre part, il faut essayer de minimiser le temps de fonctionnement des
53
Chapitre 2 Conception et programmation du système
motopompes durant la période critique définie préalablement où le tarif de l‘énergie est cher
(heures de pointe). Par la suite, il faut démarrer les moteurs de telle sorte qu’on puisse avoir
un réservoir plein au début de la période critique. Pour assurer cet objectif on va faire une
étude sur l’optimisation.
EXEMPLE :
Heure 00 → 04 04 → 08 08 → 12 12 → 16 16 → 20 20 → 24
Nous avons partagé les heures du jour en six périodes, chaque période comporte
quatre heures. Notre unité de contrôle va calculer la quantité d’eau consommée pendant cette
période et par la suite nous obtiendrons une courbe de modulation journalière représentée par
la figure 2.14.
60
Volume consommé (x1000m3 )
50
40
30
20
10
00 04 08 12 16 20 24
Heure
Cette étude va être répétée chaque jour, ensuite une courbe de consommation moyenne
va être déduite et stockée en mémoire qui servira comme base de données pour les calculs
d’optimisation.
Après avoir enregistré les données de chaque mois, l’unité de contrôle va stocker ces
données en mémoire pour un éventuel traitement externe, nous avons prévu alors une liaison
avec un PC. Après avoir tracé la courbe de modulation, et pour attaquer la partie
programmation, il faut tout d’abord identifier certains paramètres qui seront utiles pour notre
étude et cela en suivant le schéma de la station de la figure 2.15 (qu’on a simplifié au
maximum).
Qe capteur de niveau
Nh ~
~ P1,P2 : Pompes
M P1 M P2 x M : moteur
Qe : Débit des pompes
h
Qs : Débit de consommation
h : Hauteur du réservoir
Nb Qs x : Volume vide
Nh : capteur de niveau haut
Nb : capteur de niveau bas
Etant donnée la hauteur (h), la surface du réservoir (S) et le volume d’eau pompée
(débit des pompes constant Qe) on peut déterminer par un simple calcul la quantité
consommée d’eau pendant un temps t2-t1.
Q s = S.[x(t 2 ) − x(t 1 )] − Qe (3)
55
Chapitre 2 Conception et programmation du système
En conclusion, nous pouvons dire que la consommation d’eau varie d’une saison à une
autre, nous voulons alors optimiser le fonctionnement des pompes à des conditions précises,
c’est à dire commander le démarrage et l’arrêt des moteurs. Pour assurer cet objectif nous
réalisons un montage à base d’un PC standard dont le programme de commande sera basé sur
l’ensemble des algorithmes de fonctionnement qui ont été établis dans ce chapitre.
56
Chapitre 2 Conception et programmation du système
Dans cette partie nous présenterons une description de l’armoire pour répondre aux
spécifications de notre cahier de charges et en abordant la conception de chaque partie du
système afin d’obtenir une schématisation complète et précise. Notons que nous avons utilisé
le logiciel XRelais 3.1 pour la conception du schéma.
Notre montage, comme l’indique la figure 2.16, est muni de plusieurs unités qui
assurent le bon fonctionnement du système. La liaison entre l’armoire et le PC se fait à travers
des relais 5/220 V ainsi que d’un câble LPT bidirectionnel.
Vue le faible courant délivré par le port LPT, on doit impérativement utiliser un étage
amplificateur, soit avec des transistors, soit avec un circuit spécial à 8 entrées/sorties comme
l’ULN 2803.
En effet, on trouve l’unité de traitement et de contrôle des données qui est le PC et des
actionneurs qui assurent la commande des deux pompes (relais).
Liaison LPT
ULN 2803
NH
Relais Relais Relais
NB
(5/220)V (5/220)V de niveau Réf
Source Relais
AC 3ph de phases
57
Chapitre 2 Conception et programmation du système
0 logique 1 logique
Entrée 0 à 0,8 V 2à5V
DC 0,4 mA max 8 mA max
Sortie 0 à 0,4 V 2,5 à 5 V
DC 0,4 mA max 8 mA max
Pour pouvoir dialoguer avec le PC, on utilise un câble imprimante. Le PC utilise son
circuit interne de communication parallèle (se trouvant dans n’importe quelle carte mère),
intégrant des tests de tension électrique permettant de différencier et évitant tout risque
d'erreur côté PC.
Le standard IEEE 1284 (1994) [21] définit 5 modes d'opérations pour un port parallèle
: SPP, EPP, ECP, Nibble Mode et Byte Mode. Nous allons utiliser le protocole standard (SPP,
Standard Parallel Port).
58
Chapitre 2 Conception et programmation du système
L’ULN 2803 :
59
Chapitre 2 Conception et programmation du système
Les relais :
Dans notre application nous avons utilisé deux relais dans l’un est principal et l’autre
de secours. Ces 2 sorties sont disponibles sur connecteur à vis. Le relais qu’on a utilisé dans
l’exemple au début du chapitre (§2.3.2) et un relais qui ne consomme pas énormément de
courant (10 mA) c’est pour ça qu’on n’a pas utilisé un circuit d’amplification, mais vue que
les modèles de pompes consomment des pointes de courant importantes (200A) on devra
utiliser des éléments imposant que le choix des relais doit être adapté aux caractéristiques des
contacteurs et plus précisément à leurs bobines de maintien.
La logique de câblage :
Au cours de l'étude du thème qui nous est proposé et que nous présenterons, nous
serons amenés à produire des schémas électriques répondant aux normes de sécurité. Toutes
les mesures de sécurité ont leur importance mais certaines règles de base doivent être connues
par cœur. Les normes en Algérie étant de concevoir une commande alimentée par une phase
et le neutre. Les consignes seront comme suit :
• Les différents états de l'équipement doivent être signalés par des voyons lumineux dont
les couleurs ont une signification définie:
• Le coffret électrique doit être alimenté par un câble 5 conducteurs (3 phases + neutre +
PE) ou 4 conducteurs (3 phases + PE) raccordé directement en amont de l'interrupteur
sectionneur général sans passer par les borniers.
• L'entrée du câble d'alimentation dans le coffret doit être faite par presse-étoupe.
60
Chapitre 2 Conception et programmation du système
• Le passage de ce câble dans les goulottes est interdit et son identification doit être claire.
• Suivant la fonction et la nature du réseau dans lequel le conducteur est placé, celui-ci a
une couleur définie par la norme:
• C'est le plus simple à mettre en œuvre. Tous les conducteurs toujours soumis au même
potentiel portent un même numéro. Le numéro change lorsqu'il y a possibilité d'ouverture
du circuit.
Vue que j’étais indisponible pour la période d’installation de l’armoire, on n’a pas pu
installer le système sur site comme prévue, mais le système a été testé en atelier (sans le
câblage de puissance). La commande entre relais/contacteurs fonctionne parfaitement, elle
montre que les contacteurs de démarrage réagissent instantanément aux directives des relais et
qu’il n’y a aucun court-circuit dans la partie commande. De ce fait, vu que le système n’a pas
été installé sur site, le rapport ne peut être généré. Mais théoriquement le rapport simplifié du
fonctionnement sera similaire à celui qui suit :
61
Chapitre 2 Conception et programmation du système
21/03/2010 au 28/03/2010
nbr dém P1 : 6
temps fct P1/jours: 15 h
nbr dém P2 : 2
temps fct P2/jours: 5 h
phase : ok
déphase : ok
R therm 1: ok
R therm 2: ok
default : 0
Q déb/sem [m^3]
dimanche lundi mardi mercredi jeudi vendredi samedi
173 265 171 033 170 979 169 836 171637 173 006 170 469
60000
50000
40000
30000
20000
10000
Le graphe qu’on aura a l’impression est semblable à celui de la figure 2.15, on pourra
varier le temps d’échantillonnage pour avoir une période plus longue entre chaque mesure vue
qu’il n'y a pas de changement d’état pour le débit d’eau pendant le démarrage des pompes.
62
Chapitre 2 Conception et programmation du système
juste un test fait à partir des résultats de la station de pompage pour l’année 2009, qui nous
ont été gentiment restitué par le responsable de la station. Ainsi on verra que les heures de
pointes sont situées au milieu de la journée vue qu’il faut alimenter la population en eau pour
qu’ils puissent l’utiliser le soir, ainsi on aura un fonctionnement des deux pompes P1 et P2
pour avoir le rendement maximal de la station. En revanche la station ne débite pas une
grande quantité d’eau au milieu de la nuit.
Ces résultats sont juste une partie de ce qu’on peut mettre sur l’historique de
fonctionnement d’une station de pompage, on pourra mettre plus de détails si cela nous donne
envie comme par exemple affichage du débit d’eau, la quantité maximale ou minimale de
l’eau débitée, l’heure de chaque démarrage et arrêt, etc…
2.6 - Conclusion :
L’étude et la conception des montages était pour nous une expérience très
enrichissante du fait que nous avons vécu un cas réel de conception, il nous a fallut pour ça
apprendre un nouveau langage de programmation.
Les expériences que nous avons menées durant ce projet nous ont montré que l’étude
de la partie programmation est obligatoire et c’est elle qui commande tout le fonctionnement
de l’armoire. Une approche pratique a été envisagé mais malheureusement, vue mon
indisponibilité, nous avons donc pu tester notre montage sur le site.
Pour le dernier chapitre on va simuler tout le système sous Matlab pour vérifier son
bon fonctionnement, ainsi élargir la durée et déterminer ses performances et ses limites.
63
Chapitre 3 Simulation du dispositif sous Matlab
Chapitre 3
Simulation du dispositif
sous MATLAB
64
Chapitre 3 Simulation du dispositif sous Matlab
3.1 - Introduction :
Comme tout projet, l’expérimentation en labo ou en atelier est une étape obligatoire
pour valider un prototype mais la simulation numérique s’impose comme une deuxième
approche dans la plupart des disciplines [25]. Elle ne remet nullement en cause l’efficacité de
l’expérimentation mais elle s’efforce à apporter des explications aux phénomènes étudiés pour
mieux comprendre et prévoir des perspectives futures.
Le logiciel MATLAB joue plus que jamais un rôle respectable dans le monde des
logiciels de simulation. Possédant une large base de données et incluant l’outil Simulink pour
les simulations électrotechniques, on pourra l’utiliser pour reproduire le comportement d’un
relais de commande, d’un relais de phase, d’un relais de niveau, d’un contacteur électrique ou
thermique et de tout ce qui compose notre dispositif.
65
Chapitre 3 Simulation du dispositif sous Matlab
Le relais détecte l'ordre incorrect des phases ainsi que la perte de phase, cela permet de
couper l’alimentation si la tension est incorrecte. Le relais opère lorsque toutes les phases sont
présentes, l'ordre des phases est correct et que chaque tension de phase soit dans la tolérance
désirée (± 10% ou ± 15%). De ce fait, on peut réaliser un modèle en comparant une référence
66
Chapitre 3 Simulation du dispositif sous Matlab
sinusoïdale avec celles du réseau ainsi que des comparateurs en cascade relié directement aux
interrupteurs internes du relais.
En plus, lors d’un déphasage des tensions du réseau, le relais ne s’ouvre pas
instantanément. En effet, le déphasage peut être temporaire causé par une perturbation, cela
n’infecte pas le fonctionnement de la pompe mais peut s’avérer fatal lors d’un délai supérieur
à 10s. De ce fait, une temporisation de contrôle sera prise en considération pour l’élaboration
du modèle.
Le principe de fonctionnement du relais de niveau est très spécial, il est basé sur une
logique combinatoire à base de portes logiques et de bascules, de ce fait son modèle se fera à
base de portes AND, OR et NOT.
Le relais comporte 3 sondes : une de niveau haut (NH), une de niveau bas (NB) et une
sonde de référence (Réf). Grace à la conduction de l’eau, les deux sondes NH et Réf se
touchent en cas où le réservoir est plein, on aura donc la fermeture du relais activant ainsi la
pompe. Le niveau d’eau baissera et la sonde NH ne sera plus immergée mais le relais ne
67
Chapitre 3 Simulation du dispositif sous Matlab
s’ouvrira pas pour autant, ça attendra jusqu’à ce que le niveau atteigne la sonde NB et c’est à
ce moment-là que le relais s’ouvrira arrêtant ainsi le fonctionnement de la pompe. Le
réservoir étant vide, il va se remplir à nouveau jusqu'à atteindre la sonde NH et le processus
recommencera de nouveau. Ce procédé est très utilisé dans les stations de pompage car ça
assure la mise en marche et l’arrêt automatique des pompes d’une manière économique. La
figure 3.4 représente la manière la plus utilisée pour le câblage d’un relais de niveau.
Les entrées N1 (Niveau MIN) et N2 (Niveau MAX) sont à "1" s'il n'y a pas contact
avec l'eau. Le tableau suivant reflète, en fonction des états des entrées, les actions que le relais
doit effectuer.
Niveau Niveau Etat du Actions Lampe niveau Lampe niveau Lampe niveau
MAX (N2) MIN (N1) réservoir associées MAX atteint NORMAL MIN dépassé
Q4 = 1 Q1 = 1
N2 = 0 N1 = 0 Vide Q3 = 0 Q2 = 0
NB dépassé Allumée
Q2 = 1
N2 = 0 N1 = 1 Normal Niveau normal Q3 = 0 Q1 = 0
Allumée
N2 = 1 N1 = 0 Impossible - - - -
Q4 = 1 Allumée
N2 = 1 N1 = 1 Plein Q2 = 0 Q1 = 0
NH atteint Q3 = 1
68
Chapitre 3 Simulation du dispositif sous Matlab
La table de vérité étant faite, il ne restera plus que construire le modèle sous Matlab en
utilisant le bloc logique se trouvant dans : Simulink/Math Operations/Logical Operator.
69
Chapitre 3 Simulation du dispositif sous Matlab
Vue qu’une pompe est un moteur asynchrone à cage, on utilisera directement le bloc
de la MAS inclue dans la bibliothèque de Matlab ainsi que le modèle mathématique
couramment utilisé.
70
Chapitre 3 Simulation du dispositif sous Matlab
71
Chapitre 3 Simulation du dispositif sous Matlab
Les résultats de simulation confirme le bon fonctionnement de l’exemple cité au début
du chapitre 2, cela indique qu’une commande assistée par ordinateur est fiable et peut être
élargie vers un système plus complexe comme celui que l’on va voir dans la section suivante.
Vue que l’on a le modèle de chacun des éléments du système, il ne restera plus qu’à
créer des boites noires et de les relier suivant le schéma synoptique de la figure 2.16 (chapitre
2). Le reste des composants dans le schéma comme par exemple l’ULN 2803, sera reproduit
sous forme de groupement parallèle de gain d’une valeur de 50 et les signaux de commande
seront générés par des sources préprogrammées variant entre 0 et 5 volts induisant ainsi
l’excitation des bobines de déclenchements internes des relais de commande.
La figure 3.11 représente le modèle de notre système sous Matlab, on préfère faire une
simulation seulement pour la pompe 1 car la pompe 2 n’est qu’une pompe auxiliaire dans le
système et une seule section suffira.
72
Chapitre 3 Simulation du dispositif sous Matlab
Le moteur est alimenté en U V W et bouclé en Z X Y étoile (voir figure 3.11). Quand
les contacts temporisés de KM1 basculent, KM D1 décolle, et KM Y1 est excité. Le moteur
fonctionne donc en triangle et le relais thermique de protection est alors en circuit. Le relais
thermique doit être calculé pour [In /1,732].
73
Chapitre 3 Simulation du dispositif sous Matlab
Y ∆
La figure 3.14 représente les signaux de commande injectés au relais. Pour donner
plus de clarté dans la qualité de la figure, on a préféré les représenter sous forme de schémas
au lieu de donner la visualisation sous Matlab. Le chronogramme de fonctionnement pour la
pompe 1 sera comme suit :
S1
S2
KA1
KA2
KM1
KM∆1
KMY1
Ces créneaux de commande ne sont qu’une infime partie de celle généré par notre
algorithme, car la plus grande partie des signaux est localisée dans la partie acquisition des
données du fonctionnement (Data in) et surtout pour le suivie en temps réel du dispositif.
74
Chapitre 3 Simulation du dispositif sous Matlab
3.5 - Conclusion :
En fait, on pourra faire encore mieux en élaborant des modèles pour le reste des
actionneurs existants sur le marché et qui n’ont pas été utilisés dans ce mémoire, comme par
exemple : sectionneur, interrupteur fin de course, temporisateurs, électrovannes, capteurs, etc
…
75
Conclusion générale et perspectives
Partant d’une étude générale des stations de pompage telle que la description de ces
équipements et leur principe de fonctionnement, on a pu montrer l’importance de
l’optimisation de fonctionnement des ouvrages d’extraction d’eau. Ceci a été fait par une
étude complète comportant des courbes de modulation sur la consommation d’eau en fonction
de temps.
Les résultats ont été satisfaisants et ont montré un bonne mise en condition du procédé
de démarrage. En effet, l’introduction d’un système informatisé à l’intérieur d’un dispositif de
commande industrielle n’a pas eu d’influence néfaste sur son fonctionnement, au contraire,
avec ce procédé on a fait l’acquisition en ligne de l’installation en vue de suivre son
fonctionnement et transmettre le maximum d’informations aux techniciens à partir de
l’armoire de commande.
Comme tout prototype, les erreurs ne sont pas exclues. Les deux montages que l’on a
réalisé ne sont pas parfaits à 100% et on ne pourra les vérifier qu’en faisant des tests à long
termes sous différentes contraintes induisant ainsi tout les cas qu’on pourra trouver dans une
situation réelle sur site.
[1] - T. Wildi, Gilbert Sybille, « Électrotechnique - 4ème édition » [Commande Industrielle des
Moteurs], Série de Boeck, 2005
[2] - P. Graftieaux, « Schémas en Électrotechnique », Série AGS, 1999
[3] - J. B. Delambre, « Principales Règles de Schéma Électrique et de Câblage », Support de
Cours, Université d’Amiens, 1999
[4] - B. Ben Ghanem, « Démarrage et Freinage des Moteurs Asynchrones Triphasés», Support
de Cours, École d'Ingénieurs de Monastir, 2008
[5] - F. Fabrice, « Démarrage des Moteurs Asynchrones », Dossier Ressource Génie
Électrique, 2001
[6] - Positron-libre.com, « Le Démarrage Étoile Triangle », 1999
[7] - J. Lebanere, « Cours Freinage des Moteurs », Maxicours RCS, Paris, 2008
[8] - www.techno-science.net/Machine-asynchrone/Encyclopdie-scientifique-en-ligne.com
[9] - P. Abati, « Freinage par Injection de Courant Continu », Support de Cours, Génie
électrique Aix-Marseille, 2008
[10] - O, Lejeune, « Schéma d'Électricité Industrielle et d’Électrotechnique », Olivier Lejeune
(2005)
[11] - http://www.typonrelais.com, http://www.micrelec.fr
[12] - R. Bourgeois, D Cogniel, « Mémotech Plus Électrotechnique 7ème édition», Edition
Casteilla, Paris, 2007
[13] - P. Bigras, « Gpa-781 Commande Par Ordinateur », Notes De Cours, École de
Technologie Supérieure de Québec, 2002
[14] - Fiche Télémécanique, « Plate-forme d’automatisme Modicon Premium », France, 2005
[15] - Elec_Intro, « industrial modbus », Revue d’électronique, N°224, Chine, 2009
[16] - D. Mateo, « Apprenez à Programmer en C », www.siteduzero.com, 2005
[17] - H. Perla, « Parallel Port Programming with C », Revue Electrosoft, N°56, 2005
[18] - K. Sinna, R. Goularchi, « Les Stations de Pompage d’eau », Mémoire d’Ingéniorat,
Département de Génie Electrique, Tunisie, 2006
[19] - A. Zobeiri, «Investigations of Time Dependent Flow Phenomena in a Turbine and a
Pump-Turbine of Francis Type: Rotor-Stator Interactions and Precessing Vortex Rope»,
Thèse de Doctorat, École Polytechnique Fédérale de Lausanne, France, 2009
[20] - M. Hubin, «Paramètres des circuits logiques», Support de Cour, CNRS, France, 2010
http://pagespersoorange.fr/michel.hubin/physique/logique/chap_log9.htm
[21] - Datasheet de l’ULN 2803A
[22] - M. Gook, «PC Hardware Interfaces - 1ère édition », Edition Alist, UK, 2004.
[23] - T. Gantar, «Hydraulic Behaviour of Unconventional Radial Pump Stages», Université
de Ljubljana, Faculté d’Ingénieur de Mécanique, Slovenia, 2008
[24] - G. Patri, « Des outils classiques à la commande numérique », Revue aérospatiale, N°
hors série, France, 1990
[25] - P. Marcotte, « Étude sur la modélisation mathématique informatisée de la commande
d'un robot afin d'améliorer sa précision d'opération », Thèse de Doctorat, Université Laval,
1994
[26] - P.M. Grojean, « Conception Assistée par Ordinateur de Commande en Temps Réel
d'Automatismes Complexes », 3ème édition, France, 1999
[27] - C. Cyrot, « Conception assistée par ordinateur de systèmes de commande robuste temps
réel: applications aux procédés mécaniques flexibles »,
[28] - L. Soete, H. Coeckelberghs, J. Pinte, « Les Systèmes de Programmation Assistée par
Ordinateur des Machines-Outils à Commande Numérique: Une Synthèse de Leurs
Caractéristiques », Centre de Recherche du SIFM, Bruxelles, 2002
[29] - D. Meyer, « Péri-PC 2, Plus de 20 Circuits d'Interface Spécifiques pour RS232, USB et
le Port Parallèle », Edition GEODIF, France, 2001
[30] - Revues Elektor, N°66, « Les périphériques d’acquisitions PC », Février 1998
N°124, « Programmation et gestions des entrées/sorties », Mars 2003
N°130, « La commande et le langage de programmation», Septembre
2003
[31] - Y. Magda, « Complete Practical Measurement System using a PC », Edition GEODIF,
UK, 2006
Annexe
79
Schéma électrotechnique de l’armoire de commande de notre dispositif, il a été réalisé à laide du
logiciel XRelais 3.1 :
80
Fig. A2- Schéma de puissance de l’armoire de commande
81
Photos prises lors de la conception de l’armoire, il faut dire qu’elle n’est fini qu’à 70% et le
câblage de la partie commande sera différent de celui dans les photos.
Relais de niveau
Disjoncteur différentiel
Relais de phase principal
KM2 KM1
F2 F1
82
L’amplification est utilisée avec un ULN 2803 se fera avec cette configuration avec des
protections en amont et aval du circuit :
Pour des raisons d’expérimentation il faut toujours réaliser les montages électroniques
sous une plaque de test ou avec, dans notre cas, une plaque à pastilles de groupement de 3
comme est représenté sur la Fig. A4.
83
Le programme qui suit est écrit en C et il représente la quasi-totalité de l’algorithme, la
plus grande difficulté été dans tout ce qui est acquisition et visualisation. La partie qui traite la
communication vers l’armoire de commande étant la plus facile.
Code : C
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "test.h"
#include <SDL/SDL.h>
#include <FMOD/fmod.h>
void main()
{
outportb(PORT,0x01); /*sortie du code %00000001*/
delay(TDS); /*temporisation de 3 sec*/
outportb(PORT,0x03);
printf("Fin du démarrage, le moteur tourne à plain régime");
while(!kbhit())
{
outportb(PORT,0x00); /*sortie du code %00000011*/
}
return 0;
}
pixel* BMP(char* nomDuFichier){
unsigned char chaine1[54] = "";/*on met à l'intérieur l'entête du fichier qui fait
54*/ octets
unsigned char chaine[LONGEURX*LARGEURY*3];/*chaque pixel étant sur 3 octet*/
pixel Im[LONGEURX][LARGEURY];/*je déclare une matrice de la taille longueur largeur*/
FILE* fichier = NULL;
int i=0;//les variables d'incrémentation
int j=0;
fichier = fopen(nomDuFichier, "r");/*ouverture du fichier*/
if (fichier != NULL)
{
fgets(chaine1,54,fichier);/*la chaine ne sert qu'a incrémenter le pointeur pour qu'il
se positionne juste avant les informations concernants les pixels de l'image*/
fgets(chaine,3*LONGEURX*LARGEURY,fichier);//je met les pixels dans une chaine
for(j=0;j<LARGEURY;j++){
for(i=0;i<LONGEURX;i++){
/*le format bmp commence par le pixel en bas à gauche donc j 'ai fait un petit chgt de
variable pour commencer par en haut à gauche.
chque 3 octets forment un pixel*/
Im[i][LARGEURY-j-1].R=chaine[3*i+j*LONGEURX];
Im[i][LARGEURY-j-1].G=chaine[3*i+1+j*LONGEURX];
Im[i][LARGEURY-j-1].B=chaine[3*i+2+j*LONGEURX];
}}
return Im;/*on renvoie en sortie un pointeur sur le tableau*/
}
else
{
//PS: j ai choisi fgets comme fct parce qu'elle renvoie des char ( 1 octet ) en sortie
}
void main(){
pixel im[LONGEURX][LARGEURY];
84
im=BMP("image.bmp");
int i=0;
int j =0;
for(i=0;i<LONGEURX-1;i++){
for(j=0;j<LARGEURY-1;j++){
printf("rouge=%d\t",im[i][j].R);
printf("vert=%d\t",im[i][j].G);
printf("bleu=%d\t\n",im[i][j].B);
}
avec test.h :
/* Initialisation de FMOD
----------------------
85
On charge FMOD, la musique, on active le module DSP et on lance la lecture
de la musique */
FSOUND_Init(44100, 4, 0);
FSOUND_STREAM* musique = FSOUND_Stream_Open("Hype_Home.mp3", 0, 0, 0);
if (musique == NULL)
{
fprintf(stderr, "Impossible d'ouvrir la musique");
exit(EXIT_FAILURE);
}
FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 1);
FSOUND_Stream_Play(FSOUND_FREE, musique);
/* Initialisation de la SDL
------------------------
SDL_Init(SDL_INIT_VIDEO);
ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_SWSURFACE |
SDL_DOUBLEBUF);
SDL_WM_SetCaption("Visualisation spectrale du son", NULL);
/* Initialisation du tableau */
return 0;
}
/* Boucle principale */
while (continuer)
{
SDL_PollEvent(&event); /* On doit utiliser PollEvent car il ne faut pas
attendre d'évènement
de l'utilisateur pour mettre à jour la fenêtre*/
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
}
/* Gestion du temps
-----------------
On compare le temps actuel par rapport au temps précédent (dernier passage
dans la boucle)
Si ça fait moins de 25 ms (DELAI_RAFRAICHISSEMENT), alors on attend le
temps qu'il faut pour qu'au moins 25 ms se soit écoulées. On met ensuite à
86
jour tempsPrecedent avec le nouveau temps */
tempsActuel = SDL_GetTicks();
if (tempsActuel - tempsPrecedent < DELAI_RAFRAICHISSEMENT)
{
SDL_Delay(DELAI_RAFRAICHISSEMENT - (tempsActuel - tempsPrecedent));
}
tempsPrecedent = SDL_GetTicks();
/* Dessin du phraphique
------------------------
SDL_Flip(ecran);
}
87
/* Le programme se termine.
On désactive le module DSP, on libère la musique de la mémoire
et on ferme FMOD et SDL */
FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), 0);
FSOUND_Stream_Close(musique);
FSOUND_Close();
SDL_Quit();
return EXIT_SUCCESS;
}
/* La fonction setPixel permet de dessiner pixel par pixel dans une surface */
void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
return 0;
}
88
Résumé - Ce mémoire traite les étapes de conception d’un système de commande informatisé
à base d’un ordinateur standard en utilisant son port parallèle (LPT) destiné généralement à
la gestion des imprimantes. Le but est donc de créer des signaux de commande numérique
capables de piloter n’importe quel actionneur électromagnétique, en l’occurrence dans notre
cas, deux pompes hydrauliques. L’algorithme de commande sera écrit en langage C sous
Windows XP et l’interface de commande sera complétée par des contacteurs et relais qui
constitueront respectivement la partie puissance et la partie commande.
Mots clés : Commande par PC, pompe hydraulique, station de pompage, langage C
Abstract - This work deals the conception stage of computerized control system based on a
basic computer using parallel port (LPT) which it is generally used to printer management.
The aim is to create numerical control signals able to drive any electro-magnetically actuator
by occurrence in our case two hydraulic pomp. The control algorithm will be write in C
language under Windows XP, and interfacing control will be completed with the contactors
and relays which made respectively the power and command part.
Key words : PC control, hydraulic pump, Purification station, C language
"و! ول ا م ا ة ز ا# ا$%ه :
ت-دارة ا ﺏ3 د4 ( اLPT) ازي%' ﺏﺱ )(ام ر ا- أﺱس
5 وه5"6 أي ﺹ م ا و8 أن: ا < ! ی8 وا (ف ه ﺥ? إ=رات ا
! و واXP وی(وزH8 C !6 ا5D ! ی آ ﺏ! ا )ارز. : E : )B و، 5D
ءL(رة و4 ء اL M 5 وا5 ت ا ا-"4 ت واI ا: ءKﺱ ا. 8 ا
. 8 ا
C !6 ا، !' ! ا8 ، !E )! اB ا، ﺱب8 ﺏ8 ا: اﻝ