Je viens vers vous en ce début d'année car j'ai créé un petit programme pour enregistrer le poids d'une meule afin de l'enregistrer dans une BDD et de l'afficher a l’écran.
Le probleme c'est qu'a l’exécution d'une mesure, le programme rame avant de me donner un résultat dans la BDD; j'ai mis le programme dans la tache FAST mais je pense que je peux faire mieux et le laisser en MAST.
Voici le code en question (j'ai mis des commentaire
Code : Tout sélectionner
(*Traitement du pesage des meules dans la BDD*)
IF BDD_poids.poids_mesure <= BDD_poids.Poids_a_vide AND En_auto (*Si aucune meule detecté, si la machine fonctionne, que la BDD n'est pas pleine*)
THEN BDD_poids.Top_mesure := TRUE ; (*Alors, j'autorise la mesure*)
END_IF;
IF BDD_poids.index_nb_meule >= 1300
THEN BDD_poids.BDD_poids_enregistrement[0] :=0;
BDD_poids.index_nb_meule := 0;
END_IF;
IF BDD_poids.poids_mesure > BDD_poids.Poids_a_vide AND (BDD_poids.poids_mesure < BDD_poids.Poids_coherent_min OR BDD_poids.poids_mesure > BDD_poids.Poids_coherent_max) OR BDD_poids.Poids_coherent_max = 0 OR BDD_poids.Poids_coherent_min = 0(*Si j'ai une mesure superieur au poids a vide et que la
valeur n'est pas cohérente et que les variable de cohérence sont égale à 0*)
THEN BDD_poids.Discordance_mesure := TRUE; (*alors, j'active la variable de discordance*)
END_IF;
IF BDD_poids.Poids_a_vide >= BDD_poids.Poids_coherent_min
THEN BDD_poids.Poids_a_vide := BDD_poids.Poids_coherent_min - 0.1;
END_IF;
IF BDD_poids.poids_mesure > BDD_poids.Poids_a_vide AND BDD_poids.BDD_poids_enregistrement[BDD_poids.index_poids] = 0 AND BDD_poids.Top_mesure AND NOT BDD_poids.Discordance_mesure AND BDD_poids.Poids_stable
(*Si le poids mesuré est superieur au poids minimum attendu et si la valeur de la BDD correspondante est bien vide (a 0), que j'autorise une mesure, qu'il n'y a pas de defaut de discordence et que le poids est stable*)
THEN BDD_poids.BDD_poids_enregistrement[BDD_poids.index_poids] := BDD_poids.poids_mesure; (*Alors, je mets le poids en cours dans la BDD*)
BDD_poids.BDD_poids_enregistrement[BDD_poids.index_poids + 1] := 0;
BDD_poids.Calcul_Nb_meule := TRUE; (*je demande un calcul du nombre de meule*)
BDD_poids.Nb_meule_dans_BDD := 0; (*je mets a 0 le nombre de meule pour le recalcul*)
BDD_poids.Top_mesure := FALSE; (*j'interdit une nouvelle mesure*)
BDD_poids.index_poids := 0; (*Je remet l'index a 0*)
ELSIF BDD_poids.poids_mesure > BDD_poids.Poids_a_vide AND BDD_poids.BDD_poids_enregistrement[BDD_poids.index_poids] <> 0 AND BDD_poids.Top_mesure AND NOT BDD_poids.Discordance_mesure
(*Sinon, si le poids mesuré et superieur au poids a vide, que l'emplacement de la BDD n'est pas vide, que j'autorise la mesure mais que je n'est pas ni de discordance ni que la BDD est pleine*)
THEN BDD_poids.index_poids := BDD_poids.index_poids + 1; (*Alors, J'incremente l'index de 1*)
END_IF;
IF BDD_poids.BDD_poids_enregistrement[BDD_poids.index_nb_meule] <> 0 AND BDD_poids.Calcul_Nb_meule = TRUE (*Si l'emplacement de la BDD actuel est differant de 0 et que le Calcul de meule est actif*)
THEN BDD_poids.Nb_meule_dans_BDD := BDD_poids.Nb_meule_dans_BDD + 1;(*Alors, J'incremente le nombre de meule de 1*)
BDD_poids.index_nb_meule := BDD_poids.index_nb_meule + 1; (*J'incremente l'index de 1*)
ELSE BDD_poids.Calcul_Nb_meule := FALSE; (*Sinon, je desactive la demande de calcul de meule*)
BDD_poids.Nb_occurence_BDD := BDD_poids.Nb_meule_dans_BDD;(*je transfert le nombre de meule calculé dans la variable d'affichage IHM*)
BDD_poids.index_nb_meule := 0;(*je remet l'index a 0*)
BDD_poids.Calcul_Nb_meule := FALSE;(*Je desactive le calcul de meule*)
END_IF;
IF BDD_poids.RAZ_BDD (*A la demande de RAZ*)
THEN MOVE_REAL_ARREAL(0.0,BDD_poids.BDD_poids_enregistrement);(*Met a 0 tout le tableau de la BDD*)
BDD_poids.index_poids := 0;(*reset l'index*)
BDD_poids.Nb_meule_dans_BDD := 0; (*RAZ nombre de meuledans BDD*)
BDD_poids.Nb_occurence_BDD := 0;
BDD_poids.RAZ_BDD := FALSE; (*reset la demande de RAZ*)
END_IF;
BDD_poids.Poids_total_BDD:= SUM_ARREAL(BDD_poids.BDD_poids_enregistrement); (*Calcul du poids total*)
BDD_poids.Poids_moyen_BDD:= SUM_ARREAL(BDD_poids.BDD_poids_enregistrement)/BDD_poids.Nb_occurence_BDD; (*Calcul du poids moyen*)
IF BDD_poids.Nb_occurence_BDD = 0
THEN BDD_poids.Poids_moyen_BDD := 0;
END_IF;Merci d'avance pour vos proposition




