Académique Documents
Professionnel Documents
Culture Documents
Problème posé
Un processus chimique demande la mesure continue d ’une grandeur essentielle. Les valeurs
mesurées (type de données REAL) sont rangées dans un bloc de données global. Il s’agit de
programmer une fonction "MOYENNE" déterminant la moyenne arithmétique d’un nombre précisé de
valeurs mesurées. La première valeur mesurée à prendre en compte pour la formation de la
moyenne est également précisée.
Solution
Les valeurs mesurées concernées sont d ’abord additionnées dans une boucle. L’adresse dans le DB
des températures à venir n’étant pas connue à l’avance, on aura recours pour cela à l’adressage
indirect (en mémoire dans le cas présent).
Les valeurs mesurées étant du type de données REAL, le seul format autorisé pour le pointeur est le
double mot. On obtiendra la moyenne arithmétique des températures en divisant la somme des
valeurs mesurées par leur nombre.
Source LIST
//*************************************************************************************
Table des mnémoniques
//****************************************************************************************
DATA_BLOCK "Valeurs_mesurees"
TITLE = DB global contenant les valeurs mesurées
VERSION : 1.0
STRUCT
Valeur : ARRAY [1 .. 100 ] OF REAL ;
END_STRUCT ;
BEGIN
Valeur[1] := 0.000000e+000;
Valeur[2] := 0.000000e+000;
Valeur[3] := 0.000000e+000;
..........
Valeur[50] := 1.000000e+002;
Valeur[51] := 2.000000e+002;
Valeur[52] := 3.000000e+002;
Valeur[53] := 4.000000e+002;
Valeur[54] := 5.000000e+002;
Valeur[55] := 6.000000e+002;
Valeur[56] := 7.000000e+002;
Valeur[57] := 8.000000e+002;
Valeur[58] := 9.000000e+002;
Valeur[59] := 1.000000e+003;
..........
Valeur[100] := 0;
END_DATA_BLOCK
//**************************************************************************************
FUNCTION "Moyenne" : VOID
TITLE = Moyenne arithmétique
VERSION : 1.0
VAR_INPUT
Donnees_val_mes : BLOCK_DB ; //DB global contenant les valeurs mesurées
Debut_zone : INT ; //Nº d’octet de la première valeur mesurée à prendre
//en compte pour la formation de la moyenne
Longueur_zone : INT ; //Nombre de valeurs mesurées à prendre en compte
//pour la formation de la moyenne
END_VAR
VAR_OUTPUT
Moyenne : REAL ;
END_VAR
VAR_TEMP
Pointeur : DWORD ; //Pointeur (format double mot) sur val. mesurée "en
cours"
Nombre : INT ; //Compteur de boucles
END_VAR
BEGIN
NETWORK
TITLE = Formation de valeur moyenne avec adressage indirect en mémoire
L P#0.0;
L #Debut_zone;
SLD 3; //Conversion dans le format du pointeur
+D ;
T #Pointeur; //Pointeur sur la première val. mesurée à prendre en
compte
L #Pointeur; //Pointeur
L P#4.0; //passant
+D ; //au double mot suivant (valeur mesurée suivante)
T #Pointeur;
//***********************************************************************************************************
ORGANIZATION_BLOCK OB 1
TITLE =
VERSION : 1.0
VAR_TEMP
OB1_System : ARRAY [1 .. 20 ] OF BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =
CALL "Moyenne" (
Donnees_val_mes := "Valeurs_mesurees",
Debut_zone := 196, //Nº d’octet de la première valeur
mesurée à prendre
//en compte pour la formation de la moyenne
Longueur_zone := 10, //Nombre de valeurs mesurées
Moyenne := MD 100); //Moyenne obtenue
END_ORGANIZATION_BLOCK