Mes premiers pas en SIOC : Help !!!

Questions de programmation / Offset FSUIPC et IOCP

Mes premiers pas en SIOC : Help !!!

Messagede pierre01 » Ven 18 Fév 2011 19:49

Bonsoir à tous,

Bon, après quelques heures de galère pour essayer mon premier programme, j'appelle à l'aide.

Petite précision avant :
J'ai beaucoup programmé en assembleur par le passé (il y a ... 20ans déjà) mais je me rends compte que ça va beaucoup m'aider.
Je veux dire que les commandes ne me poseront pas de problème de compréhension (var, if-else, subroutine etc.)
J'ai également assimilé que SIOC n'est pas séquenciel mais évenementiel (mais ai-je bien compris justement ?).
Une fois assimilé la syntaxe, ça devrait aller de ce coté !

Par contre, je pèche dans la compréhension de l'ordre d'écriture des commandes !
Je veux dire que je ne vois pas la logique dans l'ordre d'écriture de certaines variables ou commandes.

Voilà mon premier programme pour faire clignoter une LED (out 42 de ma master)
J'ai voulu en même temps faire appel à une subroutine ... Pas une bonne idée peut-être ?
En voilà le texte :

// timer

// Var 0000, name init, value 0 // Variable d'initialisation

Var 0100, name clignote_LED, link IOCARD_OUT, Output 42 // Led clignotante
Var 0101, name voyant_LED, link IOCARD_OUT, Output 46 // Pour controler si inter = 1

Var 0110, name start_timer_SW, link IOCARD_SW, Input 4 // Inter démarrage timer
{
IF &start_timer_SW = 1 // Inter timer ON
{
&voyant_LED = 1 // Indique inter = on
CALL &clignote_sub // Appel subr timer
}
ELSE
{
&clignote_LED = 0 // LED clignotante off
&clignot = 0 // Stop timer
&voyant_LED = 0 // Indique inter = off
}
}

Var 0200, name clignote_sub, Link SUBRUTINE // Timer
Var 0300, name clignot, value 10
{
&clignot = TIMER 0, -1, 50 // De 10 a 0 pas -1 cycle 1s
L0 = MOD &clignot, 2
&clignote_LED = L0 // Clignotement LED 42
}


C'est la ligne Var 0300 ... qui me pose PB (il y a peut-être aussi d'autres erreurs) :

- Là ou elle est, ça clignote mais en permanence (alors que je veux 5 cycles) et de façon ératique.
Si je met cette ligne en début (après Var 0101 par Ex.) : le timer ne démarre pas !
Si elle est dans le "if" avant le "call", j'ai une erreur de compilation !!!

Petite précision que j'ai découvert et n'est expliquée nulle part (dans ce que j'ai lu !) :
Il faut mettre un espace après les // dans une ligne de commande sinon "erreur" à la compilation !

Merci d'avance pour vos remarques et explications merci affiche
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1774
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)

Re: Mes premiers pas en SIOC : Help !!!

Messagede ganlhi » Ven 18 Fév 2011 21:14

Oui, tu as bien compris, c'est un langage événementiel. Déjà avec ça tu as compris 75% du SIOC cligneoeil

Je n'ai plus trop en tête comment j'ai écris mes timers, mais il y a un truc qui me chiffonne dans ton code : à quoi sert ta sous-routine clignote_sub, puisqu'elle n'a pas de code associé ?
Guilhem

Image
Avatar de l’utilisateur
ganlhi
 
Messages: 734
Inscription: 19/04/09
Localisation: Castelnaudary

Re: Mes premiers pas en SIOC : Help !!!

Messagede pierre01 » Ven 18 Fév 2011 21:46

Merci, ça me fait comprendre que les commandes associées doivent suivre le nom de la subroutine (logique ...).

Donc, je remet mon code modifié :
Code: Tout sélectionner
// timer

// Var 0000, name init, value 0 // Variable d'initialisation

Var 0100, name clignote_LED, link IOCARD_OUT, Output 42    // Led clignotante
Var 0101, name voyant_LED, link IOCARD_OUT, Output 46    // Pour controler si inter = 1
Var 0300, name clignot, value 0
Var 0110, name start_timer_SW, link IOCARD_SW, Input 4       // Inter démarrage timer
{
   IF &start_timer_SW = 1      // Inter timer ON
   {
      &voyant_LED = 1         // Indique inter = on
      &clignot = 10
      CALL &clignote_sub      // Appel subr timer
   }
   ELSE
   {
      &clignote_LED = 0      // LED clignotante off
      &clignot = 0         // Stop timer
      &voyant_LED = 0         // Indique inter = off
   }
}
Var 0200, name clignote_sub, Link SUBRUTINE      // Timer
{
   &clignot = TIMER 0, -1, 50   // De 10 a 0 pas -1 cycle 1s
   L0 = MOD &clignot, 2
   &clignote_LED = L0         // Clignotement LED 42
}


Et là, ça ne clignote pas, pourtant iocpconsole me dit bien :
- Que mon inter change bien d'état (ma LED 46 s'allume)
- Que le timer décompte bien de 10 à 0 !

Mais c'est comme si la commande "clignote_LED = L0" n'existait pas !
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1774
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)

Re: Mes premiers pas en SIOC : Help !!!

Messagede stevelep » Ven 18 Fév 2011 22:04

Hello,

Pour commencer avec le SIOC tu choisis le plus dur ... Les timers c'est pas évident à comprendre

Je n'ai pas essayé ton code mais je ne suis pas sur qu'une SUBROUTINE soit nécessaire
Et comme le timer n'active pas la subroutine à chaque clignotement, la led ne clignote pas.
Il faut toujours penser événement: c'est la variable associée au timer qui va décroitre et c'est sous
cette variable qu'il faut écrire les commandes de led car à chaque changement de valeur le code va être lancé.

Je pense que l'exemple de Niko Kaan est plus juste:

http://www.lekseecon.nl/howto.html#blinkled

Si c'est pas exactement ce que tu veux tu peux modifier les valeurs de temps et de cycles

BOB
Avatar de l’utilisateur
stevelep
Administrateur du site
 
Messages: 2075
Inscription: 27/03/09
Localisation: LSGN Neuchâtel, Suisse

Re: Mes premiers pas en SIOC : Help !!!

Messagede pierre01 » Ven 18 Fév 2011 22:52

Merci BOB,
En fait, je n'ai pas "besoin" de cette routine, j'apprends à utiliser SIOC.
Pour ce qui est de la subroutine, c'est simplement comme exercice.
Quand je regarde Iocpconsole, je vois bien le timer démarrer et stopper à 0 ou si je remet l'inter off.
Et le timer s'arrête en cours si je met l'inter off au milieu du décompte.
Donc, ça fonctionne et je ne comprends pas pourquoi ma LED ne suit pas la valeur de "L0" dans la subroutine ?
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1774
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)

Re: Mes premiers pas en SIOC : Help !!!

Messagede pierre01 » Ven 18 Fév 2011 23:14

Voilà, après avoir regardé des exemple, ça fonctionne avec ce code :

Code: Tout sélectionner
// timer

// Var 0000, name init, value 0 // Variable d'initialisation

Var 0100, name clignote_LED, link IOCARD_OUT, Output 42    // Led clignotante
Var 0101, name voyant_LED, link IOCARD_OUT, Output 46    // Pour controler si inter = 1

Var 0110, name start_timer_SW, link IOCARD_SW, Input 4       // Inter démarrage timer
{
   IF &start_timer_SW = 1      // Inter timer ON
   {
      &voyant_LED = 1         // Indique inter = on
      
      CALL &clignote_sub      // Appel subr timer
   }
   ELSE
   {
      &clignote_LED = 0      // LED clignotante off
      &clignot = 0         // Stop timer
      &voyant_LED = 0         // Indique inter = off
   }
}
Var 0200, name clignote_sub, Link SUBRUTINE      // Timer
{
   &clignot = 10
   &clignot = TIMER 0, -1, 50   // De 10 a 0 pas -1 cycle 1s
}
Var 0300, name clignot
   {
      L0 = MOD &clignot, 2
      &clignote_LED = L0         // Clignotement LED 42
   }


Mais je ne suis pas sur que j'ai bien une subroutine complète (à partir de "Var 0200" jusqu'à la fin !)
J'ai pas encore tout compris ...
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1774
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)

Re: Mes premiers pas en SIOC : Help !!!

Messagede stevelep » Sam 19 Fév 2011 00:48

Ok,

note que l'ordre et les n° des variables n'ont aucune importance, tu peux mettre ta subroutine
en premier et ca fonctionnera de la même manière.

C'est la modification de la valeur d'une variable qui lance l'exécution du code en dessous.

Dans ton premier code la commande de changement d'état de ta led était dans la subroutine.
Or cette subroutine n'est executée qu'une seule fois quand tu enclenche ton switch.
C'est la variable &clignot qui est exécutée plusieurs fois par le timer. Il fallait donc mettre
la commande de la led dans la variable &clignot.

BOB
Avatar de l’utilisateur
stevelep
Administrateur du site
 
Messages: 2075
Inscription: 27/03/09
Localisation: LSGN Neuchâtel, Suisse

Re: Mes premiers pas en SIOC : Help !!!

Messagede pierre01 » Sam 19 Fév 2011 09:51

Ok BOB, merci,
Cette fois, j'ai compris. Toujours le même principe : "Action - Réaction" ...
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1774
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)

Re: Mes premiers pas en SIOC : Help !!!

Messagede stevelep » Sam 19 Fév 2011 16:37

Concernant les Subroutines:

Dans ton code, tu as une subroutine qui n'a qu'un seul CALL, donc elle est inutile, elle devient
un simple prolongement du code. Tu peux donc copier le code dans la subroutine et le coller
à la place du CALL, ca marchera pareil.

Une subroutine sert plutôt à centraliser des codes à conditions multifactoriels

exemple:

Tu as une LED qui nécessite 5 conditions pour s'allumer donc 5 variables différentes
(3 switch, 1 potard et 2 valeur d'offset FSUIPC par exemple)
Pour ne pas avoir à recopier les lignes de code qui test les 5 conditions d'allumage dans les
5 variables différentes, tu mets simplement un CALL dans chaque variable puis dans la subroutine
tu tapes les 5 conditions nécessaire à l'allumage de ta led (IF THEN IF THEN IF THEN ...)
Tu centralises le test de tes variables.
Ainsi à chaque changement de valeur de l'une de tes 5 variables, la subroutine est appellée
et les conditions sont de nouveau checkées .

Voila

BOB
Avatar de l’utilisateur
stevelep
Administrateur du site
 
Messages: 2075
Inscription: 27/03/09
Localisation: LSGN Neuchâtel, Suisse

Re: Mes premiers pas en SIOC : Help !!!

Messagede pierre01 » Sam 19 Fév 2011 18:13

Merci BOB pour ces explications rigolus
A+
Pierre.
Avatar de l’utilisateur
pierre01
 
Messages: 1774
Inscription: 19/04/09
Localisation: Vers Vesoul (Haute Saône)


Retourner vers Programmation Sioc





Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 33 invités