Page 1 sur 2

Archivage Sur S7-1200 (TIA V13)

Posté : 17 janv. 2016, 15:39
par mhdaip
Bonjour,
je suis à la recherche d'une solution qui me permet d'archiver certaines données (en format Entier ou réel) dans un DB, et ce, à chaque top de 10 ou 15 min, j'ai déjà vue ça sur des S7-300 avec Step7 5.5 en utilisant l'adressage indirect et des registre à décalage, sauf que dans TIA et surtout avec le 1200 les fonction d'adressage indirect et les décalage ne peuvent pas être utilisée (d’après ma petite expérience).

alors si quelqu'un a une idée je suis preneur.
merci d'avance
@+

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 18 janv. 2016, 11:31
par Mantysse
Bonjour,

Alors l'adressage indirect sur S7-1200 est disponible au format PL7-PRO
Exemple:
%MW10 = %MW[%MW0];
Alors c'est possible faudrait que je retrouve l'email exemple que j'avais reçu a l'époque.

Bref grosso modo Siemens a développé une "boite fonction" permettant les équations arithmétiques d'un seul tenant (Comme avec PL7-PRO).

Je sais que ça existe, je sais juste plus ou ça se trouve XD (Comme d'hab quoi ^^)

A+
Mant'

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 18 janv. 2016, 13:25
par mhdaip
bonjour, merci pour la réponse, et ça serai chic de ta part si tu pouvais me le refilé, ou même juste me donner une idée comment faire un truc dans le genre, car je projette d’utiliser des 1200 pour de la télégestion, et sans archivage local sur automate ça ne serait pas intéressant.

@+.

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 18 janv. 2016, 15:30
par Mantysse
L'email que j'ai reçu d'un distributeur Siemens est le suivant:
Voici la syntaxe du pointeur pour un S7-1200
La voici donc:

"tableau".TEMP["index"]

tableau est le nom du DB
TEMP le nom de l'array dans le DB
index nom d'une variable API (mémento) déclaré en Int
A priori c'est utilisable a peu prêt n'importe ou dans le code, On a testé sur une fonction "Move" ça fonctionnait
Reste plus qu'a faire tourner le pointeur

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 18 janv. 2016, 16:29
par itasoft
slts,
en PL7-PRO ça s'écris comme ça:

(* Décalage de la table de 1000 mots %MW0 à %MW999 *)
%MW1:999:=%MW0:999;
(* Enregistrement de la valeur en haut de la table *)
%MW0:=valeur

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 19 janv. 2016, 09:11
par mhdaip
Merci Itasoft, mais ça ne m'avance pas trop , ce que je cherche c'est de programmer un décalage dans un DB à chaque Top d'une tempo par exemple

@+

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 19 janv. 2016, 09:32
par dehell
Bonjour,
J'avais créé un FB qui réalise ce que tu souhaites . Il enregistre un réel dans un DB soit sur changement d'état soit sur requete. C'est écrit en SCL. Pour l'importer, il faut aller dans "source externe" =>Ajouter nouveau fichier externe.

Code : Tout sélectionner

FUNCTION_BLOCK "FB209_RECORD_REAL"
TITLE = 'RECORD_REAL'
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : DEHELL
FAMILY : DIAG
NAME : REC_REAL
VERSION : 1.0
   VAR_INPUT 
      VALEUR : Real;   // On peut changer en REAL ou DINT
      NUM_DB : Int;   // Numéro bloc de donnée
      DEBUT_DB : DInt;   // Adresse de début du DB
      NBRE_MOT : DInt;   // Nbre de capture
      RESET_TBL : Bool;   // Commande Raz du tableau
      TOP_RECORD : Bool;   // A chaque Top on enregistre "VALEUR" dans un DB
      MODE_CHANGE : Bool;   // si=1 alors "VALEUR" est stocké à chaque changement de la valeur de la variable   Si=0 la valeur est stocké à chaque top record
   END_VAR

   VAR 
      INDICE : DInt;   // indice de boucle
      VAL_MEMO : Real;   // valeur mémorisé en mode enregistrement sur changement de variable
      Valeur_Nulle : Real;   // Valeur nulle
      DB_NR : DInt;   // Numéro DB
   END_VAR


BEGIN
	
	#DB_NR:= INT_TO_DINT(#NUM_DB);
	#Valeur_Nulle:=0.0;
	
	IF #INDICE>=(#NBRE_MOT-#DEBUT_DB) THEN #INDICE:=0;END_IF;
	//Enregistrement de valeur en mode top
	IF #TOP_RECORD=TRUE AND NOT #MODE_CHANGE AND NOT #RESET_TBL THEN
	  POKE(area:=16#84,dbNumber:=#DB_NR,byteOffset:=(#DEBUT_DB+#INDICE),value:=#VALEUR);
	    #INDICE:=#INDICE+4;
	END_IF;    
	//Enregistrement de valeur en mode changement de valeur
	IF #TOP_RECORD=FALSE AND #MODE_CHANGE AND #VALEUR <> #VAL_MEMO AND NOT #RESET_TBL THEN
	    POKE(area:=16#84,dbNumber:=#DB_NR,byteOffset:=(#DEBUT_DB+#INDICE),value:=#VALEUR);
	    #INDICE:=#INDICE+4;
	    #VAL_MEMO:=#VALEUR;
	END_IF;    
	
	//Raz de la table de valeur
	IF #RESET_TBL= TRUE THEN #INDICE:=0;
	    FOR 
	    #INDICE:=0 TO #NBRE_MOT BY 4 DO
	    POKE(area:=16#84,dbNumber:=#DB_NR,byteOffset:=(#DEBUT_DB+#INDICE),value:=#Valeur_Nulle);
	    END_FOR;
	    END_IF;
	 
	   
END_FUNCTION_BLOCK


Test le bloc en mode simulation.
Attention, ce bloc ne gère pas les erreurs d'adressage du DB et de longueur du DB.
Cordialement.

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 19 janv. 2016, 16:06
par steph68
hello,

au lieu de déplacer un certain volume de données, fais plutôt un "buffer" (tableau) circulaire.

tu gères un pointeur (un indice de tableau par ex) qui indique la position de la nouvelle donnée à archiver.
tu gères un autre pointeur (ou une taille de tableau) qui indique le début des données archivées.

à chaque enregistrement, tu incrémentes tes pointeurs (le pointeur de début uniquement si le buffer est plein) et tu fais un modulo de la taille du tableau pour reboucler.

c'est tout simple et beaucoup plus efficace.

le seul avantage à décaler les données (et non les pointeurs) c'est quand les données sont plus souvent lues séquentiellement qu'écrites.

@+

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 19 janv. 2016, 16:54
par itasoft
slts,
mais l'avantage du décalage est que tu as toutes les données a même endroit et t'as pas besoin de pointeur,
surtout que c'est la machine qui les décale et t'as pas besoin de faire d'efforts musculaires.
LOL

Re: Archivage Sur S7-1200 (TIA V13)

Posté : 19 janv. 2016, 17:24
par steph68
mouais, mais la boucle pour le déplacement il faut quand même l'écrire (avec un pointeur :mrgreen: )

oui oui je sais PL7-Pro ... avec un adressage direct suivi de ":" ... c'est fini ça (équivalent de BLK_MOVE sur SIEMENS)
même sur unity il faut faire une boucle

tout dépend du volume de données, du temps de cycle acceptable ...

après on peut aussi faire ça :

Code : Tout sélectionner

tableau[0] := tableau[1];
tableau[1] := tableau[2];
...
avec un copier/coller on ne se fatigue pas trop ... ok je sors