afficher la liste des articles
STEP 7 -- Création de programmes S7 -- Appeler des blocs et des fonctions
Quel est le nombre maximum de paramètres que l'on peut indiquer à un FC et un FB dans une CPU S7-300 ?
Comment peut-on installer une protection de bloc pour des blocs créés par les utilisateurs?
Trucs et astuces pour l'appel et le paramétrage de SFBs, SFCs et de fonctions standards IEC
Comment se fait le transfert de variables String par ex. d'un bloc de données à un bloc fonctionnel ?
Informations sur le thème "Appel de Fonctions et Blocs Fonctionnels "
Comment programmer un type de données complexes dans la zone IN_OUT d'un FB et paramétrer un appel de fonction avec une variable ARRAY ?
Comment créer et modifier de la multiinstance ?
Comment actualiser des appels de blocs devenus invalides (conflits d'horodatage) dans les blocs appelants ?
Comment se fait la vérification de la cohérence des blocs après une modification dans un programme STEP 7 ?
Comment déterminer dans un programme, le numéro de bloc de "Types de données pour les paramètres" et comment transmettre ce paramètre à un FC ?
Quelle est la différence entre les instructions d'appel de bloc CALL et les instructions UC ou CC ?
Quelle est la différence entre un bloc de données d'instance et un bloc de données global, et comment un appel CALL peut-il influencer le registre du DB ?
Comment programmer un type de données complexes dans la zone IN_OUT d'un FB et paramétrer un appel de fonction avec une variable ARRAY ?
Nº de référence:

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é

 ID contribution:19106712   Date:2010-04-12 
Cette contribution...m´a aidéne m´a pas aidé                                 
mySupport
My Documentation Manager 
Lettre d'information 
CAx-Download-Manager 
Demande d'assistance technique
A propos de cet article
Imprimer
Créer PDF 
Envoyer l'article
QuickLinks
Outil de compatibilité 
Aide
Aide en ligne
Guided Tour