Comment savoir nombre de bits actif sur une liste de sortie ?
-
le 15/01/2019 à 16:29 Citer ce message
Bonjour à tous !
Je développe un programme sous Unity Pro pour un API Schneider Modicom M580, dans ma condition d'initialisation je dois contrôler qu'un minimum de 3 sorties automate / 12 est active.
Exemple (je vais nommé les sorties automate avec la lettre sinon ça va être long) :
S0 = 1
S1 = 1
S2 = 0
S3 = 0
S4 = 0
S5 = 0
S6 = 1
S7 = 0
S8 = 0
S9 = 1
S10 = 0
S11 = 0
S12 = 0
Ces valeurs pouvant changer, je voudrais savoir s'il existe une fonction qui permette de faire ceci ? Et si oui, connaissez-vous la syntaxe (J'ai essayé toto.[0..12].value mais ça ne marche pas) ?
En vous remerciant à tous d'avance pour votre aide. -
le 15/01/2019 à 21:02 Citer ce message
Bonsoir JbOne73
Tu peux essayer ça;
-Déclare un tableau table_sorties de type "ARRAY[0..12] OF EBOOL" avec en adresse, l'adresse de ta premiere sortie genre %Q0.1.0
-Déclare une variable i de type "UINT"
-Déclare une variable Nb_sorties de type "INT"
-Ensuite ecrit le code suivant dans une section en ST;
nb_sorties := 0;
for i := 0 to 12 by 1
do
if table_sorties[i]
then
nb_sorties := nb_sorties + 1;
end_if;
end_for;
Normalement la variable nb_sorties t'indiqueras le nombres de bits a 1 -
le 16/01/2019 à 11:07 Citer ce message
Bonjour EvangerC,
Merci pour ta réponse et ton aide, je viens de tester mais cela fonctionne au niveau de l'affectation de l'adresse pour la variable de type Array, j'ai le message d'erreur suivant : "Le type de l'alias doit être le même que le type de la variable."
Il est bien déclaré en ARRAY[0..12] OF EBOOL, petite précision :
Le programme est développé pour un M580 et celui diffère au niveau de l'affectation des adresses comparaît à un Prémium.
En te remerciant d'avance. -
le 16/01/2019 à 13:21 Citer ce message
Pourrais tu me donner la référence de ta CPU et celui de ta carte de sorties? Pour que je puisse réaliser l'essai dans les même conditions. -
le 17/01/2019 à 14:30 Citer ce message
Bonjour EvangerC,
Désolé pour cette réponse tardive, voici les informations que tu me demandes :
Réf. CPU = BME P583040
Réf. Carte de sortie = BMX DDO 6402K
En te remerciant d'avance. -
le 17/01/2019 à 16:23 Citer ce message
Je viens de faire le test ça fonctionne,
C'est peut être au niveau de ta carte de sortie, tout dépend comment tu l'a déclare;
-Si tu la déclare en type de donnée topologique l'adressage de tes sorties se feras via les adresses %Q0.1.0 ...%Q0.1.1....etc.....
-Si tu la déclare en type de donnée DDT équipement c'est l'automate qui va te crée les variables entrée/sorties
Les variables de ta carte de sortie seront du style PLC0_d0_r0_s2_DDO64_STYIPQ.DIS_CH_OUT[0].VALUE
-
le 18/01/2019 à 11:41 Citer ce message
Bonjour EvangerC,
Après relecture de nos échanges, je viens de me rendre compte que ce n'est pas sur une carte sortie que je veux faire ça mais sur une carte d'entrée.
Alors, est-ce qu'il y a une différence ?
Ma carte est déclarée en type DDT et j'ai essayé avec l'adressage que tu as noté mais cela ne fonctionne toujours pas
PLC0_d0_r0_s2_DDI64_STYIPQ.DIS_CH_IN[0].VALUE
En te remerciant d'avance. -
le 18/01/2019 à 16:59 Citer ce message
Oui il y a une différence, tout dépend la référence de ta carte d'entrée ainsi que son emplacement dans le rack;
Dans cet exemple la carte d'entrée est une DDI6402K dans le module 2 du rack;
nb_sorties := 0;
for i := 0 to 12 by 1
do
if PLC0_d0_r0_s2_DDI6402K.DIS_CH_IN[i].VALUE
then
nb_sorties := nb_sorties + 1;
end_if;
end_for;
Répondre à ce message