Page 1 sur 2
Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 12 mai 2016, 07:37
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
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 12 mai 2016, 08:40
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.
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 12 mai 2016, 09:06
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
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 12 mai 2016, 09:50
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
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 12 mai 2016, 15:19
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
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 15 mai 2016, 20:29
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.
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 16 mai 2016, 09:41
par Cyril93
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 16 mai 2016, 11:12
par itasoft
slts,
ya pas de fonction "Général Boulanger" sur Siemens ????
Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 16 mai 2016, 13:19
par Cyril93
itasoft a écrit :slts,
ya pas de fonction "Général Boulanger" sur Siemens ????
Que veux tu dire ?
edit : ahah, croissant

Re: Tri d'un db par ordre croissant (titre peut être pas explicite mais bon pas d idée)
Posté : 16 mai 2016, 14:01
par itasoft
slts,
Tri croissant , lol