Décoder le type de données ANY (STEP 7]
Publié : 29 mai 2019, 08:03
Bonjour,
Pour les personnes curieuses/intéressées voici un bout de code pour décortiquer une variable ANY et comprendre comment ce type de données est construit.
Petit rappel : le type de donnée ANY est codé sur 10 octets
Pour les détails, n'hésitez pas à consulter l'aide de STEP7, rubrique "Format du type de données Paramètre ANY"
Dans l'écriture du code on peut remarquer la manière assez unique d'aller chercher les infos dans une zone mémoire qui n'est pas définie :
L W [AR1,P#4.0] par exemple.
En général on utilise l'identifiant de la zone (L pour temporaire, M pour les mémentos, DB pour les blocs de données, etc...).
C'est assez déroutant et pas très bien documenté au niveau de l'aide
Source à compiler (FC2), puis à simuler avec différentes variantes en variable d'entrée (mots,bit, tableaux, DB, entrée, pointeurs ANY...).
Observez les valeurs en sorties de blocs en fonction de la variable d'entrée.
Le type ANY accepte tout type de données.
Pour les personnes curieuses/intéressées voici un bout de code pour décortiquer une variable ANY et comprendre comment ce type de données est construit.
Petit rappel : le type de donnée ANY est codé sur 10 octets
Pour les détails, n'hésitez pas à consulter l'aide de STEP7, rubrique "Format du type de données Paramètre ANY"
Code : Tout sélectionner
FUNCTION FC 2 : VOID
TITLE =Extraction d'un pointer ANY
//Permet de décomposer le pointeur ANY :
//le Type de données
//le facteur de répetition (combien de données)
//La zone pointeur (la zone affectée avec l'adresse de départ)
//le Numero de DB (si c'est un DB en entrée)
AUTHOR : jedri
FAMILY : test
VERSION : 1.0
VAR_INPUT
pANY : ANY ; //Pointeur ANY d'entrée
END_VAR
VAR_OUTPUT
DataTyp : BYTE ; //Type de Données (02 : octet)
Count : INT ; //Facteur de répetition
numDB : INT ; //Numéro de DB
Pointeur : DWORD ; //Pointeur de zone (type de mémoire et adresse (format octet.bit)
Adresse : INT ; //Adresse Simple au format Octet
END_VAR
BEGIN
NETWORK
TITLE =
SET ;
L P##pANY;
LAR1 ;
L B [AR1,P#0.0]; // le fameux 10h pour visu uniquement
L B [AR1,P#1.0]; // type de données
T #DataTyp;
L W [AR1,P#2.0];
T #Count;
L W [AR1,P#4.0];
T #numDB;
L D [AR1,P#6.0];
T #Pointeur;
SRD 3;
T #Adresse;
END_FUNCTION
L W [AR1,P#4.0] par exemple.
En général on utilise l'identifiant de la zone (L pour temporaire, M pour les mémentos, DB pour les blocs de données, etc...).
C'est assez déroutant et pas très bien documenté au niveau de l'aide
Source à compiler (FC2), puis à simuler avec différentes variantes en variable d'entrée (mots,bit, tableaux, DB, entrée, pointeurs ANY...).
Observez les valeurs en sorties de blocs en fonction de la variable d'entrée.
Le type ANY accepte tout type de données.