Ban2020 1

Comment savoir nombre de bits actif sur une liste de sortie ?

JbOne73
JbOne73
Modérateur
Automaticien habitué

32 messages
Inscrit le 12/02/2017

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.
EvangerC
EvangerC
Modérateur

178 messages
Inscrit le 01/07/2017

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
JbOne73
JbOne73
Modérateur
Automaticien habitué

32 messages
Inscrit le 12/02/2017

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.
EvangerC
EvangerC
Modérateur

178 messages
Inscrit le 01/07/2017

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.
JbOne73
JbOne73
Modérateur
Automaticien habitué

32 messages
Inscrit le 12/02/2017

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.
EvangerC
EvangerC
Modérateur

178 messages
Inscrit le 01/07/2017

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
JbOne73
JbOne73
Modérateur
Automaticien habitué

32 messages
Inscrit le 12/02/2017

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.
EvangerC
EvangerC
Modérateur

178 messages
Inscrit le 01/07/2017

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

7 choses à savoir si Tu débutes en automatisme...

7 choses que tu dois savoir si tu debutes en automatismeCliquez ici pour télécharger le guide PDF

Superv 3