Page 1 sur 1

Décoder le type de données ANY (STEP 7]

Publié : 29 mai 2019, 08:03
par djé
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"


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


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.

Re: Décoder le type de données ANY

Publié : 29 mai 2019, 08:23
par djé
djé a écrit : 29 mai 2019, 08:03
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 :
En visu dynamique, on s'aperçoit que le registre d'adresse AR1 pointe sur les "données locales précédentes" (Zone V);
Cette zone correspond à une zone mémoire située au delà de la zone d'adresse locale (zone L) définie (ou pas) dans l'interface du bloc appelant.

Re: Décoder le type de données ANY (STEP 7]

Publié : 29 mai 2019, 11:23
par itasoft
slts,
disons que les logiciels de programmation automates évoluent mais ça manque encore cruellement de pointeurs
surtout quand on as fait du "C++ qui est un langage fait exclusivement de pointeurs, ceci dit ça rend le programme incompressible, type usine à gaz
les pointeurs c'est bien mais pas trop n'en faut

Re: Décoder le type de données ANY (STEP 7]

Publié : 29 mai 2019, 19:55
par Daviddu90
Hi,

Merci pour la note.

@++