Parlons Arduino > Vos projets

projet de reseau etagere analogique

<< < (4/5) > >>

Dominique:
Bonjour Pascal,

Je m'inquiète: toujours pas d' Ids, ni dans le tableau, ni surtout dans les exemples où c'est vraiment nécessaire.
Ces filtres ne correspondent pas aux Ids du tableau du message du septembre 05, 2021, 12:47:41 am

Le système peut fonctionner sans masque (vous le rendez inefficace ici) et sans filtres, mais pas sans Ids.
D'ailleurs la bibliothèque (ACAN et autres) ne propose que 2 masques et 6 filtres en tout donc je ne vois pas comment vous allez implémenter toute votre liste.

Je vous encourage de faire un test en réel entre 3 Arduinos simulant un MASTER, un TCO et un SOLENOIDE.
Vous commencez sans masque ni filtre, puis vous les introduisez progressivement : vous verrez que ce n'est pas trivial.

Concernant le programme des détecteurs RFID, il faut bien lire l'article.
Je n'utilise pas la fonction
--- Code: ---controleurCAN.dispatchReceivedMessage()
--- Fin du code ---
qui passe la main à la fonction
--- Code: --- messageCmd
--- Fin du code ---
dans les filtres, mais j'explique seulement ce qu'on peut faire.
De plus l'exemple utilise les Ids longs pour l'exemple seulement.
Et on ne la retrouve donc pas dans la loop où d'autres fonctions d'émission sont utilisées.

palou:
Bonjour Dominique

J'ai vraiment des lacunes concernant le CAN entre le filtre et l'id

Pour moi, le filtre est utilisé pour inhiber la réception de messages inutiles pour le controleur.

Par exemple Si j'ai un masque 0x7FF et un filtre à 0x7A0 , je ne recevrai que les messages dont l'id sera 0xA0, toute autre valeur d'id sera ignorée

Dans votre exemple

--- Code: ---const ACAN2515Mask masque = extended2515Mask (0x1FFFFFFF) ; // For filter #0 and #1
  const ACAN2515AcceptanceFilter filtres [] = {
    {extended2515Filter (0x1FFFFF7A), messageCmd},
    {extended25l15Filter (0x1FFFFF7B), messageCmd},
  } ;
--- Fin du code ---
les filtres refletent les ID 0x7A et 0x7B

Si je reprend mon tableau
Le master a pour IDs 01/03/05/07/09/0A/0F (les MASTER_XXXX)
Le tableau des filtres implanté dans le master sera le suivant

--- Code: ---const ACAN2515Mask masque = 0x7FF);
  const ACAN2515AcceptanceFilter filtres [] = {
    {0x701, messageAlert}, // Réception alertes depuis les contrôleurs
    {0x703, messageErr},   // notification d'erreurs depuis les contrôleurs
    {0x705, messageOrdre}, // réception des ordres depuis le TCO
    {0x707, messageAck},  // notifications d’acquittement depuis les controleurs
    {0x709, messageAccessoire}, // réception des ordres pour les accessoires
    {0x70A, messageFini}, // notifications de fin d'opérations pour les ordres "longs" (par exemple déplacement d'aiguille)
    {0x70F, messageInfo} // messages d'informations depuis les contrôleurs
} ;
--- Fin du code ---

Le TCO a pour Ids 0xF0 (TCO_AFFICHAGE)
Le tableau des filtres implanté dans le TCO sera le suivant

--- Code: ---const ACAN2515Mask masque = 0x7FF);
  const ACAN2515AcceptanceFilter filtres [] = {
    {0x7F0, messageAffichage} // Réception commandes d'affichage
} ;
--- Fin du code ---

Le meme principe est appliqué pour les autres types de controleurs :
Un masque identique pour tous les types,
les filtres adaptés en fonction des ID pouvant être reçus par le controleur implanté
Par exemple on peut avoir jusqu'à 16 controleurs d'aiguilles de 0 à 15 (0x00 à 0x0F). Les id de bases sont 0x40 et 0x70 (SOLENOIDE_ORDRE et SOLENOIDE INFO)
Pour le controleur d'aiguille N°2 on aurait

--- Code: ---const ACAN2515Mask masque = 0x7FF);
  const ACAN2515AcceptanceFilter filtres [] = {
    {0x742, messageOrdre}, // Réception commandes d'aiguille (SOLENOIDE_ORDRE)
    {0x772, messageInfo}, // Réception demande d'état (SOLENOIDE_INFO)

} ;
--- Fin du code ---
et pour le controleur d'aiguille n° 4

--- Code: ---const ACAN2515Mask masque = 0x7FF);
  const ACAN2515AcceptanceFilter filtres [] = {
    {0x744, messageOrdre}, // Réception commandes d'aiguille (SOLENOIDE_ORDRE)
    {0x774, messageInfo}, // Réception demande d'état (SOLENOIDE_INFO)

} ;
--- Fin du code ---

Maintenant, la ou je ne suis pas sur c'est comment doit etre effectué le dialogue dans le programme:
Par exemple le TCO pour transmettre un ordre au master va utiliser la commande CAN.sendMsgBuf en envoyant le message au Master sur l'id MASTER_ORDRE
Mais doit il utilisé l'ID (0x05) ou la valeur de masque (0x705) pour envoyer le message ?

--- Code: ---CAN.sendMsgBuf(0x05,8,buff)

--- Fin du code ---
ou


--- Code: ---CAN.sendMsgBuf(0x705,8,buff)

--- Fin du code ---

Cdt
Pascal

Dominique:
N’oubliez pas qu’il n’y a que 6 filtres par module.

palou:
Le seul qui soit impacté est le Master (7 ID). il va falloir que je fusionne 2 ID.
MASTER_ACK et MASTER_ERREUR me semblent les plus appropriés. Si il y a une erreur on enverra un "NACK" si c'est OK on enverra un "ACK".

Dominique:

--- Citation de: palou le septembre 06, 2021, 11:59:40 am ---Bonjour Dominique

J'ai vraiment des lacunes concernant le CAN entre le filtre et l'id

--- Fin de citation ---
OUI


--- Citer ---Pour moi, le filtre est utilisé pour inhiber la réception de messages inutiles pour le controleur.
--- Fin de citation ---
OUI


--- Citer ---Par exemple Si j'ai un masque 0x7FF et un filtre à 0x7A0 , je ne recevrai que les messages dont l'id sera 0xA0, toute autre valeur d'id sera ignorée
--- Fin de citation ---
OUI mais ausi 7A0


--- Citer ---Dans votre exemple

--- Code: ---const ACAN2515Mask masque = extended2515Mask (0x1FFFFFFF) ; // For filter #0 and #1
  const ACAN2515AcceptanceFilter filtres [] = {
    {extended2515Filter (0x1FFFFF7A), messageCmd},
    {extended25l15Filter (0x1FFFFF7B), messageCmd},
  } ;
--- Fin du code ---
les filtres refletent les ID 0x7A et 0x7B
--- Fin de citation ---
NON : il n'acceptent que les Ids de messages longs 1FFFFF7A et 1FFFFF7B mais n'émettent surtout pas de messages avec ces Ids


--- Citer ---Si je reprend mon tableau
Le master a pour IDs 01/03/05/07/09/0A/0F (les MASTER_XXXX)
Le tableau des filtres implanté dans le master sera le suivant

--- Code: ---const ACAN2515Mask masque = 0x7FF);
  const ACAN2515AcceptanceFilter filtres [] = {
    {0x701, messageAlert}, // Réception alertes depuis les contrôleurs
    {0x703, messageErr},   // notification d'erreurs depuis les contrôleurs
    {0x705, messageOrdre}, // réception des ordres depuis le TCO
    {0x707, messageAck},  // notifications d’acquittement depuis les controleurs
    {0x709, messageAccessoire}, // réception des ordres pour les accessoires
    {0x70A, messageFini}, // notifications de fin d'opérations pour les ordres "longs" (par exemple déplacement d'aiguille)
    {0x70F, messageInfo} // messages d'informations depuis les contrôleurs
} ;
--- Fin du code ---

Le TCO a pour Ids 0xF0 (TCO_AFFICHAGE)
Le tableau des filtres implanté dans le TCO sera le suivant

--- Code: ---const ACAN2515Mask masque = 0x7FF);
  const ACAN2515AcceptanceFilter filtres [] = {
    {0x7F0, messageAffichage} // Réception commandes d'affichage
} ;
--- Fin du code ---

--- Fin de citation ---
NON: le MASTER, comme le TCO ne reçoit jamais de messages avec les Ids des messages qu'il envoie : 2 entités (noeuds) ne peuvent émettre avec le même Id.
Quand vous écrivez "Le master a pour IDs 01/03/05/07/09/0A/0F ", ça veut dire quoi ? Qu'il envoie des messages avec ces Ids ou qu'il en reçoit avec ces Ids ?


--- Citer ---Le meme principe est appliqué pour les autres types de controleurs :
--- Fin de citation ---
C'est bien ça qui est à revoir !



--- Citer ---les filtres adaptés en fonction des ID pouvant être reçus par le controleur implanté
--- Fin de citation ---
OUI ça c'est vrai




--- Citer ---Maintenant, la ou je ne suis pas sur c'est comment doit etre effectué le dialogue dans le programme:
Par exemple le TCO pour transmettre un ordre au master va utiliser la commande CAN.sendMsgBuf en envoyant le message au Master sur l'id MASTER_ORDRE
Mais doit il utilisé l'ID (0x05) ou la valeur de masque (0x705) pour envoyer le message ?
--- Fin de citation ---
l'Id uniquement (le masque c'est en réception seulement)

Vous n'arrivez pas à séparer l'Id d'un message émis et le filtre d'un message reçu  >:( >:(
Le meilleur moyen est de laisser tomber les masques et filtres tant que vous n'avez pas bien saisi le rôle des Ids

Reprenez votre exemple
--- Citer ---Premier exemple, action sur aiguillage depuis le TCO
utilisateur   TCO   message   MASTER   message   SOLENOIDE
modifie position aiguille n° 7   envoi de l'information au MASTER   ==> MASTER_ORDRE   convertit le numéro de l'aiguille en couple contrôleur/sortie et envoie l'info au contrôleur de solénoide   ==> SOLENOIDE_ORDRE   réception du message
Affichage clignotant de l'aiguille   <== TCO_AFFICHAGE   réception du ACK et demande d'affichage (aiguille en attente)   <== MASTER_ACK   Mise en liste d'attente de la commande (pas d'activation simultanée de solénoïdes)
Affichage fixe de l'aiguille   <== TCO_AFFICHAGE   modification aiguille terminée. On affiche le résultat final sur le TCO   <== MASTER_FINI   L'aiguille a été actionnée
--- Fin de citation ---
et mettez les valeurs des Ids dans les messages

Montez donc un test comme j'ai proposé, sans utiliser de filtre/masque : vous verrez plus clair ensuite.

Cdt
.

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique