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
    Automaticien vétéran

    270 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
    Automaticien vétéran

    270 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
    Automaticien vétéran

    270 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
    Automaticien vétéran

    270 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