Vous êtes sur la page 1sur 3

Exemple d'adressage indirect en mémoire

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

Valeurs_mesurees DB 103 DB 103 Bloc de données global


Moyenne FC 24 FC 24 Formation de la moyenne

//****************************************************************************************
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

AUF Donnees_val_mes; //Ouvrir leDB


L 0.000000e+000;
T #Moyenne; //Initialiser la moyenne à former

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 #Longueur_zone; //Initialiser le compteur de boucles


//******************************
Next: T #Nombre;
L #Moyenne; //Moyenne jusqu’ici
L DBD [#Pointeur]; //Valeur mesurée x
+R;
T #Moyenne; //Nouvelle moyenne

L #Pointeur; //Pointeur
L P#4.0; //passant
+D ; //au double mot suivant (valeur mesurée suivante)
T #Pointeur;

L #Nombre; //Décrémenter le compteur de boucles en cours


LOOP Next; //Parcourir de nouveau la boucle ou la quitter
//******************************
// Former la valeur moyenne
L #Moyenne;
L #Longueur_zone;
ITD ; //Conversion de type de données d’INT en DINT
DTR ; //Conversion de type de données de DINT en REAL
/R ; //Moyenne jusqu’ici /Nombre de valeurs à prendre
//en compte
T #Moyenne;
END_FUNCTION

//***********************************************************************************************************
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

Vous aimerez peut-être aussi