Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Forum traitant des automates industriels de marque Siemens.
glamdring
Code son premier grafcet
Code son premier grafcet
Messages : 50
Enregistré le : 25 nov. 2015, 15:52

Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par glamdring »

Bonjour ,

Est ce que quelqu'un à déjà réalisé une fonction de tri par ordre croissant d'un db? En faite , mon soucis comme trop souvent c'est que je comprend ce que je dois faire mais alors pour le réaliser je cale très voir trop souvent :( je dois trier 12 valeurs auxquelles sont associés 12 Do (commande de ventilo). Le principe serait de trier le 1er tableau et de faire suivre les DO correspondantes. Je sais pas si je suis clair donc hésité pas à me le dire. Au niveau du langage , je ne maîtrise que le contact et le logique, je pense que c'est faisable mais que ça va être lourd à mettre en place. Pour le list , j'en ai fait un peu mais pas assez pour être à l'aise et il reste le scl que je n'ai jamais pratiqué (mais cela ressemble à du C,VBA,etc... )donc la je peux encore m'y retrouver. Que me conseilleriez vous?

Bien à vous

Glam
Avatar du membre
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Enregistré le : 29 oct. 2015, 14:22
Localisation : IDF

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par Cyril93 »

Salut,

Je pense qu'il faut le faire en SCL se serait plus simple. quelle sont tes critères de tri de tes variables ? c'est quelle type de variable des INT ?
Ah oui par ordre croissant excuse.
dehell
Codeur fou
Codeur fou
Messages : 253
Enregistré le : 19 janv. 2016, 09:24
Localisation : Alès

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par dehell »

Bonjour,
J'avais créé un FB pour cela en SCL.
Par contre tu as pas précisé le modèle de ton automate.
Tu trouveras ci-dessous la source SCL pour un S7-300.
Attention, c'est valable pour un DB non optimisé.
Cordialement.

Code : Tout sélectionner

FUNCTION_BLOCK "FB205_TRI_DB_INTEGER"
TITLE =  'TRI DE VALEUR '
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : DEHELL
FAMILY : TRI_INT
NAME : TRI_INT
VERSION : 0.1
// VALEUR MODIFFIABLE   TRI UNE ARRAY IMPAIRE D'ENTIER     NECESSITE UN DB D'INSTANCE   
   VAR_INPUT 
      NUM_DB : Int;   // Numéro de DB
      LENGH : Int;   // Longueur du DB à trier   CONST    LIMITE := 9; // DOIT ETRE EGAL A LA DIMENSION DE L'ARRAY  END_CONST   VAR_IN_OUT    memoire_tri  : ARRAY[0..9] OF INT; // L'ARRAY DOIT ETRE IMPAIRE (DERNIER CHIFFRE)  END_VAR
   END_VAR

   VAR_TEMP 
      echanger : Bool;
      essai : Bool;
      indice : Int;
      aux : Word;
      DB_NR : Word;
      LIMITE : Int;
   END_VAR


BEGIN
	
	(***************************************************************** 
	1ère partie : tri par échange de paires. Les valeurs sont échangées 
	par paires jusqu'à ce que la mémoire des valeurs de mesure soit 
	triée.  
	*****************************************************************) 
	#DB_NR:=INT_TO_WORD(#NUM_DB);
	#LIMITE:=((#LENGH*2)-2);
	REPEAT 
	#echanger := FALSE; 
	 FOR #indice := #LIMITE TO 2 BY -2 DO 
	          IF WORD_TO_INT(WORD_TO_BLOCK_DB(#DB_NR).DW(#indice-2)) > WORD_TO_INT(WORD_TO_BLOCK_DB(#DB_NR).DW(#indice))
	   THEN 
	   #aux:=WORD_TO_BLOCK_DB(#DB_NR).DW(#indice); 
	   WORD_TO_BLOCK_DB(#DB_NR).DW(#indice)  := WORD_TO_BLOCK_DB(#DB_NR).DW(#indice-2); 
	   WORD_TO_BLOCK_DB(#DB_NR).DW(#indice-2) := #aux; 
	   #echanger        := TRUE; 
	  END_IF; 
	 END_FOR; 
	UNTIL NOT #echanger 
	END_REPEAT; 
	
	
END_FUNCTION_BLOCK


glamdring
Code son premier grafcet
Code son premier grafcet
Messages : 50
Enregistré le : 25 nov. 2015, 15:52

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par glamdring »

Bonjour ,

merci de vos réponses et de votre aide. Pour l'automate c'est un S7-1513 donc pas de soucis avec le Src_list. Je vais voir pour analyser le code.

Bien à vous


Glam
dehell
Codeur fou
Codeur fou
Messages : 253
Enregistré le : 19 janv. 2016, 09:24
Localisation : Alès

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par dehell »

ok, Si c'est un S7-1500 certaines instructions du S7-300 ont été remplacées (word_to_Block_db...)
J'ai le même code pour un S7-1200, ça devrait fonctionner pour un S7-1500.

Code : Tout sélectionner

FUNCTION_BLOCK "FB205_TRI_DB_INTEGER"
TITLE =  'TRI DE VALEUR '
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : DEHELL
FAMILY : TRI_INT
NAME : TRI_INT
VERSION : 0.1
// VALEUR MODIFFIABLE   TRI UNE ARRAY IMPAIRE D'ENTIER     NECESSITE UN DB D'INSTANCE   
   VAR_INPUT 
      NUM_DB : Int;   // Numéro de DB
      LENGH : DInt;   // Longueur du DB à trier   CONST    LIMITE := 9; // DOIT ETRE EGAL A LA DIMENSION DE L'ARRAY  END_CONST   VAR_IN_OUT    memoire_tri  : ARRAY[0..9] OF INT; // L'ARRAY DOIT ETRE IMPAIRE (DERNIER CHIFFRE)  END_VAR
   END_VAR

   VAR 
      echanger : Bool;
      essai : Bool;
      indice : DInt;
      aux : Word;
      DB_NR : DInt;
      LIMITE : DInt;
   END_VAR


BEGIN
	
	(***************************************************************** 
	1ère partie : tri par échange de paires. Les valeurs sont échangées 
	par paires jusqu'à ce que la mémoire des valeurs de mesure soit 
	triée.  
	*****************************************************************) 
	#DB_NR:=INT_TO_DINT(#NUM_DB);
	#LIMITE:=#LENGH*2;
	REPEAT 
	#echanger := FALSE; 
	 FOR #indice := #LIMITE TO 2 BY -2 DO 
	   IF WORD_TO_INT(IN:=PEEK(area:=16#84,dbNumber:= #DB_NR,byteOffset:=(#indice-2)))>WORD_TO_INT(IN:=PEEK(area:=16#84,dbNumber:= #DB_NR,byteOffset:=(#indice)))
	    
	   THEN
	   #aux:=PEEK(area:=16#84,dbNumber:= #DB_NR,byteOffset:= #indice);
	   POKE(area:=16#84,dbNumber:= #DB_NR,byteOffset:=(#indice),value:=PEEK(area:=16#84,dbNumber:= #DB_NR,byteOffset:=(#indice-2)));   
	   POKE(area:=16#84,dbNumber:= #DB_NR,byteOffset:=(#indice-2),value := #aux); 
	   #echanger        := TRUE; 
	  END_IF; 
	 END_FOR; 
	UNTIL NOT #echanger 
	END_REPEAT; 
	
	
END_FUNCTION_BLOCK


Yacub
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 102
Enregistré le : 07 févr. 2016, 18:27

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par Yacub »

Bonjour Dehell,

Aurais tu le temps de m'expliquer ton code pour le s7-1200 ? J'aimerai connaitre en details les operations que tu fais ligne par ligne car je ne suis pas a l'aise avec les fonctions que tu utilises.
Avatar du membre
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Enregistré le : 29 oct. 2015, 14:22
Localisation : IDF

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par Cyril93 »

Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par itasoft »

slts,
ya pas de fonction "Général Boulanger" sur Siemens ????
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
Cyril93
Maître du binaire
Maître du binaire
Messages : 484
Enregistré le : 29 oct. 2015, 14:22
Localisation : IDF

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par Cyril93 »

itasoft a écrit :slts,
ya pas de fonction "Général Boulanger" sur Siemens ????
Que veux tu dire ?

edit : ahah, croissant :D
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)

Message par itasoft »

slts,

Tri croissant , lol
Automaticien privé (de tout)
itasoft@free.fr
Répondre