[M340] Code qui fait ramer le PLC
Posté : 12 janv. 2024, 09:28
Bonjour a tous et meilleurs vœux
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
) :
Peut-etre avec une boucle while ou for ou je ne sais quoi ? le ST c'est pas le truc que je maitrise le plus et je veux pas le faire en LD, je veux changer un peu ^^
Merci d'avance pour vos proposition
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