Guide
Les variables de type de données complexes sont mémorisées sous forme de renvoi avec un POINTER 6 octets (48 bits) dans le DB d'instance en cas de paramètres d'entrées-sorties (IN_OUT) de FB. Ce n'est donc pas la valeur qui est contenue dans le DB d'instance mais un POINTER 6 octets. Ce POINTER pointe sur le paramètre effectif qui doit donc être impérativement paramétré. Les types de données complexes du STEP 7 sont "Date_and_Time", "String", "Array", "Struct" et "UDT".
Vous trouverez un exemple de programmation d'un accès indirect sur le premier octet d'un tel type de données à la figure 01. Cette procédure dans l'exemple sert à la sauvegarde des données.

Figure 01
Le POINTER 6 octets est chargé via la variable IN_OUT "Symbol_des_InOut". Le numéro du bloc de données issu du POINTER 6 octets est ensuite transféré dans une variable temporaire "DB_Num". Le DB est ouvert avec ce numéro de DB mémorisé via l'instruction "AUF DB[#DB_Num]" et l'adresse est ensuite chargée dans le registre d'adresse 1.
L'instruction "+AR1" interprète la valeur contenue dans l'accu 1 comme un nombre au format INT, l'étend à 24 bits en tenant compte du signe et l'ajoute au contenu du registre d'adresses. Un débordement de la plage maximale de l'adresse d'octet ( 0 ... 65535) n'a pas de conséquences, car les bits de poids fort sont supprimés.
L'instruction "L B[AR1,P#0.0]" vous permet de récupérer les données mémorisées ou la bonne adresse. Si, à la place de cet exemple, vous aviez utilisé l'instruction "L Symbol_des_InOut[1]", vous n'auriez pas chargé les données mémorisées depuis le registre d'adresse, mais directement les données du paramètre IN_OUT. Cette valeur aurait pu être modifiée. Consultez à ce sujet les informations de l'aide en ligne du STEP 7 sous
- "Eviter les erreurs à l'appel de blocs".
Note
L'exemple décrit n'est valable que pour la zone DB car sinon la CPU passe en STOP. Une numérotation avec 0 (DB0) n'est pas autorisée.
Le fichier "InOutvar.zip" contient un projet STEP 7 avec deux stations S7 pour l'exemple de programme décrit ci-dessus :
- Station: "Beispiel in deutsch" avec des commentaires en allemand,
- Station: "Example in english" avec des commentaires en anglais.
InOutvar.zip ( 222 KB )
Paramétrer un appel de fonction avec type de données complexes Une méthode efficace pour transférer un grand nombre de données ayant un lien entre elles depuis un bloc appelant vers un bloc appelé est l'utilisation de paramètres ayant un type de données complexes (ARRAY et STRUCT). Un champ ou une structure peut être transféré sous forme de variable complète à la fonction appelée.
Les variables de type de données complexes ne peuvent être stockées que dans un bloc de données ou dans la pile des données locales. Le paramètre effectif doit alors être déclaré soit dans un bloc de données (DB global ou DB d'instance) soit dans la pile locale du bloc appelant.
Pour pouvoir être transféré, un paramètre du même type que le paramètre effectif dans la fonction appelante doit être déclaré dans la fonction appelée. Ce paramètre doit être renseigné de manière mnémonique (type d données : ARRAY, STRUCT, DATE_AND_TIME et STRING).
L'éditeur CONT/LIST/LOG vérifie, lors de la saisie de paramètre d'une fonction, la compatibilité des types de données du paramètre effectif et du paramètre du bloc. Le transfert du paramètre effectif à la fonction appelée se fait via un pointeur avec un numéro de DB et un pointeur interzone. Ce pointeur est stocké dans la pile L du bloc appelé par la macro CALL.

Figure 02
Les variables de type de données complexes ne peuvent être stockées que dans la pile des données locales (variable TEMP dans le FC12) ou dans un bloc de données (DB5).
Environnement de création
Les figures et les téléchargements de ce FAQ ont été créés avec STEP 7 Version 5.4.
Mots-clefs
structuré
|