LOCODUINO

Discussions Générales => Bus DCC => Discussion démarrée par: Tony04 le octobre 28, 2018, 12:03:22 pm

Titre: Perte des fonctions
Posté par: Tony04 le octobre 28, 2018, 12:03:22 pm
Bonjour à tous,

dans la lignée de ma question sur le sifflement des locos (http://forum.locoduino.org/index.php?topic=623.0), je me heurte à un autre soucis de fonctions.

Au club où j'ai fait tester une centrale fonctionnant sous DCCpp avec un MEGA, on me dit que toutes les fonctions se perdent lorsque survient une micro-coupure suite à un mauvais contact sur la voie, je précise bien coupure et non court-circuit qui coupe le DCC.

Avez-vous ce même type de comportement avec cette configuration ?

Bon dimanche à tous et merci pour vos futures réponses.

Cordialement
Antoine
Titre: Re : Perte des fonctions
Posté par: msport le octobre 28, 2018, 03:07:45 pm
Bonjour,
cela dépend en fait du couple décodeur / centrale. Sauf erreur, DCCpp n'envoie les fonctions qu'une fois.
Les décodeurs ne conservent pas la position des fonctions (constaté sur les LENZ), par exemple l'éclairage s'éteint sur une coupure du DCC.
Bien sur les CV, eux, sont conservés.
Donc seules les centrales réémettant les fonctions ne présentent pas cette anomalie.
Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 28, 2018, 03:12:50 pm
Merci Michel, cela confirme les dires des membres du club qui me dident que sur une centrale Lenz la loco ne perd pas les fonctions.

C'est quand même un soucis assez ennuyeux surtout lorsque tu as plusieurs locos sur le réseau.
Penses-tu qu'il y ai une solutions en dehors de renvoyer toutes les xx secondes toutes les fonctions en route ?
Titre: Re : Perte des fonctions
Posté par: CATPLUS le octobre 28, 2018, 03:33:57 pm
Bonjour Tony

Au risque de me répéter et de rendre impopulaire, les coupures ou micros coupures sont à bannir (voir le câblage).

http://forum.locoduino.org/index.php?topic=356.0
http://teamtrack.soforums.com/t1490-Module-N.htm?start=45


Marcel


Titre: Re : Perte des fonctions
Posté par: msport le octobre 28, 2018, 05:56:47 pm
@ Marcel, il est toujours bon de rappeler les fondamentaux, mais comme on sait la perfection n'est pas de ce monde ...
@ Tony, lançons une bouteille à la mer à destination de ceux qui se sentent de taille à intervenir dans le code de DCCpp pour y ajouter cette option. Option qui a peut-être ses contreparties, car sinon, j'imagine que Gregg y avait pensé.
Titre: Re : Perte des fonctions
Posté par: Dominique le octobre 28, 2018, 10:39:57 pm
Bonjour à tous,

Il suffit d'ajouter l'envoi périodique des fonctions dans la loop(), ou au moins de les répéter après une coupure longue (supérieure à la durée de réaction des détecteurs de conso)

Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 28, 2018, 11:14:48 pm
Bonsoir (jour) Dominique,

c'est exactement ce que j'ai fait, mais si DCCpp pouvait garder en mémoire comme la vitesse par exemple, ce serait plus PRO, non ?

Bon début de semaine à tous.
Antoine
Titre: Re : Perte des fonctions
Posté par: Dominique le octobre 28, 2018, 11:20:29 pm
Ce n'est pas facile de demander cela à DCC++ !

Pourquoi ?
Parce que les commandes de vitesses sont inscrites dans des registres qui sont relus périodiquement et indéfiniment; il y en a 12, un par machine.
mais les commandes des fonctions sont inscrites dans un seul registre, pour toutes les machines donc elles ne peuvent pas être répétées.

S'il fallait répéter les commandes il faudrait aussi 12 registres et les multiplier par le nombre de commandes à répéter : c'est une énorme modification et le résultat ne tiendrait plus dans un Uno. Il y aurait peut-être même un risque sur les performances.

Donc forget it et gère les répétitions comme tu le fais déjà.
Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 29, 2018, 09:10:48 am
Bonjour Dominique,

réponse claire et sans appel comme toujours, merci à toi et bon courage pour Orléans où je ne pourrai pas me rendre car je suis en cure à Digne les Bains.

Amicalement
Antoine
Titre: Re : Perte des fonctions
Posté par: Thierry le octobre 29, 2018, 10:19:07 am
La non répétition des fonctions fait partie de la norme DCC, la conservation de cette info est à la charge des décodeurs pour des micro-coupures. Malheureusement, si la machine n'est pas équipée avec des condensateurs, dès que l'on 'plante un choux' l'info est perdue.

La solution de renvoyer périodiquement les fonctions est possible, le problème est d'identifier le bon moment...

L'autre solution me parait pourtant acceptable. Utiliser deux registres par machine, avec un registre pour la vitesse et l'autre pour les fonctions, ça marche. Par contre il faut supporter de n'avoir que six machines à piloter.  C'est la stratégie que j'ai employée dans DcDccNanoController, sachant que c'est fait pour un Nano et donc pour une toute petite centrale.
Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 29, 2018, 03:29:03 pm
Bonjour Thierry,

Citer
L'autre solution me parait pourtant acceptable. Utiliser deux registres par machine, avec un registre pour la vitesse et l'autre pour les fonctions, ça marche. Par contre il faut supporter de n'avoir que six machines à piloter.  C'est la stratégie que j'ai employée dans DcDccNanoController, sachant que c'est fait pour un Nano et donc pour une toute petite centrale.

Je me suis retourné vers la solution de renvoyer périodiquement les fonctions de la façon suivante: Suite à un court-circuit, en appuyant le bouton de remise en route du DCC je renvoie toutes les fonctions qui étaient à ON, puis par la suite je refais la même opération toutes les 5 secondes, cela semble convenir aux gars du club. Qu'en penses-tu ?

Par contre ta réponse me fait poser une autre question dont je n'ai pas trouvé la réponse dans la doc html: Combien de machines peut-on gérer en même temps avec DCCpp ?

Antoine
Titre: Re : Perte des fonctions
Posté par: Thierry le octobre 29, 2018, 03:35:44 pm
Pourquoi pas toutes les cinq secondes, mais il faut le faire pour toutes les machines qui sont pilotées en vitesse par ailleurs.
Le nombre de machines pilotables est limité par le nombre de registres de répétition de commande DCC utilisés par DCC++. La version de Greeg déclare 12 registres par défaut, un pour les ordres temporaires comme les fonctions, l'interrogation de CVs ou la commande d'accessoires, 11 pour les ordres répétitifs comme la vitesse d'une machine. C'est un moyen terme entre un Nano limité par sa mémoire et un Mega moins limité. Dans DcDccNanoController, j'ai limité à beaucoup moins puisque le but n'est que de piloter une machine. Et puis moins de canaux, c'est moins de mémoire utilisée !
Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 29, 2018, 03:53:57 pm
Citer
Pourquoi pas toutes les cinq secondes, mais il faut le faire pour toutes les machines qui sont pilotées en vitesse par ailleurs.

Oui, c'est comme cela que je fait avec un tableau qui garde en RAM les 5 variables par loco.

Donc je dispose de 11 machines simultanées si j'ai bien compris.

Titre: Re : Re : Perte des fonctions
Posté par: Tony04 le octobre 30, 2018, 11:18:18 pm
Bonjour à tous,

j'aimerais bien suivre ton conseil ci-dessous Thierry,
La solution de renvoyer périodiquement les fonctions est possible, le problème est d'identifier le bon moment...
mais j'ai fait des essai avec des mises à jour par la commande TextCommand::parse() qui doit faire perdre beaucoup de temps au MEGA car si j'utilise plusieurs locos avec chacune plusieurs fonctions activées il arrive qu'une loco s'arrête et ne reprend qu'avec une nouvelle commande de vitesse.

J'aimerais beaucoup essayer la même technique que pour l'écriture et lecture des CVs que tu m'as appris ici: http://forum.locoduino.org/index.php?topic=617.msg7017#msg7017 et qui fonctionne à merveille, mais avec la commande DCCpp::setFunctionsMain() (si c'est bien la bonne) et qui à mon avis serait plus appropriée, mais je n'arrive pas à en trouver la syntaxe, je bloque sur le dernier argument "FunctionsState & inStates" que je ne comprend pas malgré mes recherches dans l'aide DCCpp.

Pourrais-tu me donner cette syntaxe pour par exemple allumer la lumière d'une loco avec adresse 12 ?  Ou m'orienter vers une autre solution selon le cas.

Merci par avance
Titre: Re : Perte des fonctions
Posté par: Dominique le octobre 31, 2018, 09:48:19 am
Bonjour Antoine,

Tu trouveras un exemple dans mon programme de va et vient :
http://www.locoduino.org/spip.php?article232 (http://www.locoduino.org/spip.php?article232)

Dans la fonction Train::feux()

C’est aussi documenté dans la bibliothèque et les exemples.

Amicalement
Dominique
Titre: Re : Re : Perte des fonctions
Posté par: Tony04 le octobre 31, 2018, 11:49:25 am
C’est aussi documenté dans la bibliothèque et les exemples.

Bonjour Dominique,

merci pour ces infos, j'ai bien réussi à allumer et éteindre les feux par "DCCpp::setFunctionsMain(1, 13, gLocoFunctions);" mais, d'une part je ne sais pas ce que représente le 1 dans la parenthèse (je suppose que c'est un registre), d'autre part je n'ai pas trouvé la doc dont tu me parles ni dans la biblio ni dans les exemples.
Si je veux activer d'autres fonctions par exemple, comment dois-je m'y prendre ? Plus j'avance plus je découvre mes lacunes  :(

Amitiés
Antoine
Titre: Re : Perte des fonctions
Posté par: Thierry le octobre 31, 2018, 11:58:44 am
Bonjour

Dans cette fonction, le 1 est effectivement le numéro de registre. Mais comme je le disais précédemment c'est plutôt le 0 qui devrait être utilisé ici, parce que le 1 est probablement utilisé par une machine pour sa vitesse, ce qui signifie qu'au lieu de répéter la vitesse comme c'est la norme, on répète l'état des fonctions ! Le 13 est l'adresse DCC de la loco, et gLocoFonction est une structure qui connait l'état de l'ensemble des fonctions d'une loco. En effet, le DCC ne permet pas d'activer les fonctions une par une. A la place il faut envoyer l'état voulu par groupes de quatre, ce qui fait que l'on doit se souvenir de l'état des autres fonctions du groupe à chaque envoi...
Accessoirement, il faudra que je change l'aide de la fonction qui dit de ne pas utiliser le registre 0...
Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 31, 2018, 12:30:28 pm
Je comprends un (tout petit) mieux.

Par contre grâce à tous ces essais je viens de découvrir un gros problème sur ma config MEGA. Le blocage que j'imaginais venir de mes répétitions trop rapides des fonctions vient d'ailleurs, je m'explique:

Je mets une loco 13 sur le rail
j'envoie par le moniteur série "<t 1 13 1 1>", la loco avance bien sur le cran 1
j'envoie par le moniteur série "<t 1 14 1 1>" même qu'il n'y a pas de loco 14 sur le rail
je crée une petite coupure en soulevant la loco 13, en la remettant elle ne démarre plus. Mon erreur vient-elle de l'utilisation du même registre "1" ? Et si oui, combien de registres puis utiliser ? Est-ce 11 si j'ai bien compris la réponse de Thierry ici: http://forum.locoduino.org/index.php?topic=625.msg7100#msg7100

En faisant un essai avec, pour la loco 14, le registre 2, tout rentre dans l'ordre, le problème semble donc bien venir de là. Y-a-t-il un endroit ou ces registres sont expliqués ?

Beaucoup de question mais oh combien utiles.

Titre: Re : Perte des fonctions
Posté par: Thierry le octobre 31, 2018, 01:45:32 pm
Malheureusement, il n'y a pas de doc très claire sur le sujet. Par contre ce n'est pas très compliqué. Sur une config normale, il y a douze registres permis, de 0 à 11. Un registre, c'est juste une commande DCC prête à être envoyée. On a donc dans le logiciel une liste de 12 commandes DCC.

- Le registre 0 ne concerne que les ordres transitoires : fonctions, réglage CV, accessoires.
- Les autres, 1 à 10, répètent simplement inlassablement leur contenu sur la ligne DCC.

A charge pour celui qui utilise DCC++ de gérer lui-même l'affectation d'un registre à une loco particulière, ou à la répétition d'autre chose, comme les fonctions d'une loco. J'avais par exemple envisagé de pouvoir gérer cinq locos, avec les registres impair pour la vitesse (1, 3, 5, 7, 9) et les pairs pour les fonctions (2, 4, 6, 8, 10), le 0 restant pour les accessoires. Ce n'est qu'une affaire de convention, DCC++ ne décide de rien, juste de répéter ou pas les commandes selon le registre.
Titre: Re : Perte des fonctions
Posté par: Tony04 le octobre 31, 2018, 01:54:55 pm
Bien compris Thierry, cela commence à être plus limpide pour moi. J'étais entrain de poser une question à Dominique à ce sujet, la voilà:

Tu trouveras un exemple dans mon programme de va et vient :
Dans la fonction Train::feux()

FunctionsState gLocoFunctions;     // Current functions of the loco

void Train::feux(bool l) {
  if (l) {
    gLocoFunctions.activate(0);
  } else {
    gLocoFunctions.inactivate(0);
  }
  DCCpp::setFunctionsMain(1, adresse_dcc, gLocoFunctions);
}

J'essaye au maximum de comprendre l'utilisation de la fonction feux: Je vais déjà passer le N° de registre à 0 comme le suggère Thierry, ensuite je suppose que dans activate(0) le (0) est le N° de la fonction à traiter.
Mais comme je veux garder en mémoire toutes les fonctions de 10 locos par exemple, je suppose que je suis obligé de créer pour chaque loco une structure séparée dans le style:
FunctionsState gLoco_1_Functions;
FunctionsState gLoco_2_Functions;
FunctionsState gLoco_3_Functions;

Peux-t-on le faire avec un indice (question peut-être idiote)?
FunctionsState gLocoFunctions[0];
FunctionsState gLocoFunctions[1];
FunctionsState gLocoFunctions[2];

Fin de la question à Dominique.

Quand j'aurais la réponse à ces questions il suffira que je définisse les registres que je veux utiliser pour les fonctions et cela devrait rouler non ?
Titre: Re : Perte des fonctions
Posté par: Dominique le octobre 31, 2018, 05:00:47 pm
Si je comprends bien il vaudrait mieux écrire

FunctionsState gLocoFunctions;     // Current functions of the loco

void Train::feux(bool l) {
  if (l) {
    gLocoFunctions.activate(0);
  } else {
    gLocoFunctions.inactivate(0);
  }
  DCCpp::setFunctionsMain(2, adresse_dcc, gLocoFunctions);
}

Car le registre 1 est utilisé pour le vitesse/direction et le registre 2 sera donc utilisé par la fonction.

Comme il n'y a qu'un seul train sur le va et vient, il y a assez de registres.

Si je veux utiliser 12 trains (ou 11 ?) alors je dois répéter pour chaque machine, une séquence de commande de fonction (une fois) suivi de la commende de vitesse pour que cette dernière soit bien répétée automatiquement. Mais la répétition de la séquence, est à faire dans la loop sur condition de millis().
Titre: Re : Re : Perte des fonctions
Posté par: Tony04 le novembre 01, 2018, 12:28:33 am
@ Tony, lançons une bouteille à la mer à destination de ceux qui se sentent de taille à intervenir dans le code de DCCpp pour y ajouter cette option. Option qui a peut-être ses contreparties, car sinon, j'imagine que Gregg y avait pensé.

La bouteille à la mer a visiblement portée ses fruits. Avec l'aide de Dominique et Thierry + un peu le fichier d'aide en html j'ai trouvé la solution de sauvegarde des fonctions.

J'ai décidé d'un maximum de 12 locos, c'est pour un club et ma centrale tourne avec un MEGA donc pas de problème de mémoire.
Modifié la ligne 23 de config.h MAX_MAIN_REGISTERS = 24 (le registre 0 n'étant pas utilisable à la demande), registre 1 à 12 pour la sauvegarde des vitesses et sens, 13 à 24 pour la sauvegarde des fonctions.
J'ai un tableau d'int de 12 adresses DCC qui se rempli au fur et à mesure de l'arrivée d'une nouvelle loco.
L'indice de ce tableau me permet de pointer soit les 12 registres de vitesse (indice+1), soit les 12 registres de fonctions(indice+13). Ces tableaux sont remplis au fur et à mesure des ordres DCC qui arrivent. Pour les fonctions par le code de Dominique ci-dessous:

FunctionsState gLocoFunctions; // définir la structure

if (etat_fct) {
gLocoFunctions.activate(num_fct);
} else {
gLocoFunctions.inactivate(num_fct);
}
DCCpp::setFunctionsMain(num_registre, adr_loco, gLocoFunctions);  // MAJ registre loco

Et le tour est joué, je ne perds plus aucune fonction et sans faire de mise à jour dans le loop.

Reste à faire l'essai avec le maximum de locos et le maximum de fonctions pour être sûr du résultat, ce qui sera fait en fin de semaine. Je vous tiendrai au courant pour ceux que cela intéresse.

Bonne nuit à tous, je vais me coucher  :)

Titre: Re : Re : Re : Perte des fonctions
Posté par: Dominique le novembre 01, 2018, 09:10:45 am
Modifié la ligne 23 de config.h MAX_MAIN_REGISTERS = 24 (le registre 0 n'étant pas utilisable à la demande), registre 1 à 12 pour la sauvegarde des vitesses et sens, 13 à 24 pour la sauvegarde des fonctions.

Attention : de 0 à 24, ça fait 25 registres !
Titre: Re : Perte des fonctions
Posté par: Tony04 le novembre 01, 2018, 11:28:15 am
Oui, il semblerait d'après ma calculette  :D

mais comme je l'ai précisé et que les essais m'ont prouvés, le registre 0 ne peut pas être utilisé avec l'instruction DCCpp::setFunctionsMain(num_registre, adr_loco, gLocoFunctions);  // MAJ registre loco