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
Bien à vous
Glam
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
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

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