SIOC : programmer le debounce

N308WA

PILOTE PRO
Messages
292
Réactions
35
Points
75
Bonjour à tous,

Est ce que quelqu'un a déjà programmé la fonction de debounce avec SIOC ?

Je précise un peu le besoin : j'ai des starter switches OEM pour lesquels la position ground correspond à trois broches actives simultanément et la position CONT à deux broches actives simultanément... sauf que les deux broches de ground sont aussi deux des trois broches de la position CONT. Donc quand je bascule sur CONT, ça bascule d'abord sur GRD puis une fraction de seconde suivante ça bascule bien sur CONT. Pas génant pour le simu mais pas très propre quand même. Mon idée est de temporiser chaque position pour "masquer" l'aller-retour start - CONT... mais je ne sais pas comment faire (la fonction delay ne me semble pas appropriée).

Code:
Mon script :

// ======================================================================
// ENGINE 2 START
// ======================================================================

Var 1726, Link IOCARD_SW, device 1, Input 23 // Eng Start 2
{
  CALL V1725     // Check status of all SW
}
Var 1727, Link IOCARD_SW, device 1, Input 24 // Eng Start 2
{
  CALL V1725     // Check status of all SW
}
Var 1728, Link IOCARD_SW, device 1, Input 25 // Eng Start 2
{
  CALL V1725     // Check status of all SW
}
Var 1729, Link IOCARD_SW, device 1, Input 26 // Eng Start 2
{
  CALL V1725     // Check status of all SW
}


Var 1725, Link SUBRUTINE    
{
    IF V1726 = 1 // input 23
        {
            &IFLY737CMD = 495 // ENGAPU_ENG2_START_POS4, position 4 = FLT
        }
    IF V1727 = 1 // input 25
        {
        IF V1728 = 1 // input 26
            {
            IF V1727 = 1 // input 24
                {
                &IFLY737CMD = 492 // ENGAPU_ENG2_START_POS1, position 1 = GRD START
                }
            }
        }
    IF V1727 = 1 // input 24
        {
        IF V1728 = 1 // input 25
            {
            IF V1729 = 0 // input 26
                {
                &IFLY737CMD = 494 // ENGAPU_ENG2_START_POS1, position 3 = CONT
                }
            }
        }
    IF V1726 = 0
        {
        IF V1727 = 0
               {
             IF V1728 = 0
                {
                IF V1729 = 0
                        {
                               &IFLY737CMD = 493 // ENGAPU_ENG2_START_POS2, position 2 = OFF
                                }
                }   
            }
        }
}

Merci pour votre aide et vos lumières.

Arnaud
 
Arnaud, quand tu mets du code pense à utiliser les balises.
C'est pour moi cette fois ci, pense s'y la prochaine fois.
 
Si ça peut sevir :

Cole.jpg
 
Bonjour !

delay est une solution je pense, qui déclenche le test de la position que tu veux vérifier ...

Ce que je propose :
Note que j'ai mis une tempo de 1 seconde pour pouvoir tester le code avec la console IOCP, tu peux diminuer en changeant le "1000" sur les lignes des delay

Le code fait de la position n'est prise en compte que si elle reste plus de 1 seconde en place

Code:
// ======================================================================
// ENGINE 2 START
// ======================================================================
// Var 10, name IFLY737CMD


Var 1726, Link IOCARD_SW, device 1, Input 23 // Eng Start 2
{
  &tempo = delay 1, 1000     // Check status of all SW
}
Var 1727, Link IOCARD_SW, device 1, Input 24 // Eng Start 2
{
  &tempo = delay 1, 1000     // Check status of all SW
}
Var 1728, Link IOCARD_SW, device 1, Input 25 // Eng Start 2
{
  &tempo = delay 1, 1000     // Check status of all SW
}
Var 1729, Link IOCARD_SW, device 1, Input 26 // Eng Start 2
{
  &tempo = delay 1, 1000     // Check status of all SW
}


Var 1725, name tempo
{
IF V1725 = 1 // si la variable est active
{
    IF V1726 = 1 // input 23
        {
            &IFLY737CMD = 495 // ENGAPU_ENG2_START_POS4, position 4 = FLT
        }
    IF V1727 = 1 // input 25
        {
        IF V1728 = 1 // input 26
            {
            IF V1727 = 1 // input 24
                {
                &IFLY737CMD = 492 // ENGAPU_ENG2_START_POS1, position 1 = GRD START
                }
            }
        }
    IF V1727 = 1 // input 24
        {
        IF V1728 = 1 // input 25
            {
            IF V1729 = 0 // input 26
                {
                &IFLY737CMD = 494 // ENGAPU_ENG2_START_POS1, position 3 = CONT
                }
            }
        }
    IF V1726 = 0
        {
        IF V1727 = 0
               {
             IF V1728 = 0
                {
                IF V1729 = 0
                        {
                               &IFLY737CMD = 493 // ENGAPU_ENG2_START_POS2, position 2 = OFF
                                }
                }
            }
         }
   }
&tempo = 0 // desactive la variable
}
 
Merci à tous. Dans l'ordre d'arrivée :

Windy, je me suis fais rattrapé par la patrouille ... je me doutais de qqch mais je ne sais comment mettre une balise

Jack, tu m'avais passé ce schéma il y a qq années... je l'ai gardé. Mes starters ne permettent pas un câblage unique comme tu le montres parce chaque position du bouton active plusieurs contacts et les 2 contacts de la position GRD sont communs avec 2 des 3 contacts CONT (je dois tester l'état de 26 / 27 / 28)

Fab, je vais aller essayer ton code tout de suite.

Arnaud
 
  • Like
Les réactions: fab
Salut Arnaud !

pour mettre du code :

Capture d’écran 2021-03-16 à 08.59.36.png

puis :
Capture d’écran 2021-03-16 à 09.00.05.png
 
Fabien, je viens de tester. Le retard fonctionne correctement mais j'ai toujours le bouton qui part sur GRD et ensuite se positionne sur CONT. Il faudrait mettre en mémoire les trois valeurs de variable 27 / 28 / 29 puis faire le test de la combinaison 27/28/28. Si combinaison = 1/1/0 alors CONT, =1/1/1 alors GRD

Je crois que SIOC ne permet que 2 variables volatiles simultanément, non ?
 
Le test est fait comme cela donc je ne vois pas trop ce qui se passe ?
Code:
    IF V1727 = 1 // input 24
        {
        IF V1728 = 1 // input 25
            {
            IF V1729 = 0 // input 26
                {
                &IFLY737CMD = 494 // ENGAPU_ENG2_START_POS1, position 3 = CONT
                }
            }
        }


La seule fois ou cela peut passer sur GRD c'est quand les 3 variables sont à 1 :
Code:
    IF V1727 = 1 // input 25
        {
        IF V1728 = 1 // input 26
            {
            IF V1727 = 1 // input 24
                {
                &IFLY737CMD = 492 // ENGAPU_ENG2_START_POS1, position 1 = GRD START
                }
            }
        }
 
Ca marche tip top... juste un 7 qui devait être un 9 ! La tempo fait bien son boulot.

Merci pour votre aide, un problème en moins. Au suivant (la luminosité) !
 
  • Like
Les réactions: fab
Ah ... tu veux dire que le code fonctionne ?
C'est une erreur de frappe ?

La luminosité de quoi ?
 
En fait il y avait deux problèmes : une erreur de frappe et le doublon de commande que ta modif avec delay m'a permis de corriger.

La luminosité, c'est mon autre post en cours sur le forum
 
  • Like
Les réactions: fab
Jack, je viens de tester les solénoides selon le schéma que tu as posté (en 24 volts, ça suffit pour maintenir le switch collé sur GRD).

(y). Merci.
 
Retour
Haut