Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Domotique avec Panoramic. RS485, la réception de données | |
| | Auteur | Message |
---|
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Domotique avec Panoramic. RS485, la réception de données Mer 26 Mai 2021 - 23:00 | |
| Bonjour à tous !
Pour l’instant nous avons vu et mis en pratique une méthode pour commander un périphérique via une liaison série RS485 sous le standard Modbus RTU. Nous n’avons fait que de l’émission de données. Autrement dit, nous n’avons qu’écrit dans le port COM pour communiquer avec l’extérieur à l’aide de l’instruction serial_write.
Dans ce nouveau fil de discussion, je vous propose d’aborder la réception de données avec Panoramic. Les mots clés employés seront on_receive() et serial_read$(). N’hésitez pas à consulter la documentation de Panoramic à ce sujet.
La réception de données est utile pour : - contrôler la bonne réception d’une trame envoyée à un périphérique ; - lire des données dans un périphérique.
Je vous proposerai deux démonstrations. La première avec la carte 8 relais précédemment utilisée et la seconde avec une nouvelle carte d’interface qui sera connectée à 4 sondes de température. Dans Panoramic, nous verrons comment interroger et afficher la valeur de chaque sonde.
A bientôt !
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Domotique avec Panoramic. RS485, la réception de données Dim 30 Mai 2021 - 16:45 | |
| Bonjour à tous ! La réception de données sur le bus série : Passons à la pratique ! 1) Contrôler la bonne réception d’une trame envoyée à la carte utilisée dans ce post : https://panoramic.1fr1.net/t6603-domotique-avec-panoramic-rs485-modbus-rtuLors de l'envoi d'un ordre à la carte électronique, cette dernière renvoie sur le bus une trame pour annoncer la bonne ou la mauvaise exécution de cet ordre. C’est l’accusé-réception (en anglais : acknowledge, abréviation : ACK). Dans la documentation de la carte utilisée ici, il est dit que si la trame envoyée est identique à celle reçue, c’est que tout va bien. En démonstration, je vous propose une petite application qui va envoyer la trame « 01 06 00 05 01 00 98 5B » pour actionner le relais numéro 5. Dans le code-source ci-dessous, j’ai utilisé la commande d’évènement ON_RECEIVE associée à la fonction SERIAL_READ$() pour récupérer l’ACK. - Code:
-
label controleAck :' dim ordre$ :' trame envoyée dim ack$ :' trame reçue
serial 1 serial_port 1,8 serial_baudrate 1,9600 serial_databits 1,8 serial_parity 1,0 serial_stopbits 1,1 serial_open 1
on_receive 1,controleAck
' trame en hexa à envoyer : 01 06 00 05 01 00 98 5B ordre$ = chr$(1)+chr$(6)+chr$(0)+chr$(5)+chr$(1)+chr$(0)+chr$(152)+chr$(91) serial_write 1,ordre$
end
controleAck: ack$ = serial_read$(1)
' décodage, mise en forme et affichage en hexa de la trame reçue print decoderTrame$(ack$) return
fnc decoderTrame$(trameRecue$) dim_local trameHexa$, i%, char$, c%, h$ for i% = 1 to len(trameRecue$) char$ = mid$(trameRecue$,i%,1) c% = asc(char$) h$ = hex$(c%) if len(h$) = 1 h$ = "0" + h$ end_if trameHexa$ = trameHexa$ + h$ + " " next i%
result trameHexa$ end_fnc
L’ACK envoyé par la carte sur le port série, va réveiller la commande ON_RECEIVE. Cette dernière va lancer l’exécution du sous-programme controleAck. Dans notre cas c’est un « LABEL ». Dans le sous-programme controlAck, la fonction serial_read$() va récupérer l’ACK présent et le copier dans la variable ack$. A ce stade, l’affichage brut de la variable ack$ serait totalement incompréhensible. Pour le rendre plus humain, j’ai mis sous forme d’une fonction appelée decoderTrame$(), une conversion au format hexadécimal de ladite trame. En image, voici le résultat : Je remarque que c’est la réplique exacte de l’ordre envoyé. L’ordre a donc été parfaitement exécuté, sans erreur. Une différence entre les trames envoyée et reçue, voire l’absence d’ACK, aurait indiqué une défaillance. En conclusion, cette manipulation nous a permis de mettre en pratique l’utilisation de la commande d’évènement ON_RECEIVE du port série. Nous avons pu voir également l’intérêt de l’ACK. Le traitement de l’ACK, bien que facultatif, permet d’être sûr que l’ordre envoyé est bien arrivé et traité correctement par le processeur de la carte. A suivre… | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Domotique avec Panoramic. RS485, la réception de données Lun 31 Mai 2021 - 15:16 | |
| Bonjour à tous ! Suite de mon post précédent : 2) Interroger et afficher les données reçues d’une carte d’interface avec 4 sondes de température. Pour cette deuxième démonstration, j’ai câblé une carte électronique R4DCB08 qui permet d’interfacer jusqu’à huit sondes de température sur le bus série. Seules quatre sondes sont connectées. Pour récupérer les valeurs des sondes, je vais lire les données dans la carte. Le retour des informations s’effectue par une trame hexadécimale envoyée depuis la carte électronique. Dans le code-source de démonstration ci-dessous, un timer va lire les données dans la carte toutes les secondes. - Code:
-
dim trameRecue$ dim octetRecu$(13)
label lectureTemperatures, lecturePortSerie, quitter
on_close 0,quitter
' initialisation port COM serial 1 serial_port 1,8 serial_baudrate 1,9600 serial_databits 1,8 serial_parity 1,0 serial_stopbits 1,1 serial_open 1 on_receive 1,lecturePortSerie
timer 2 timer_interval 2,1000 on_timer 2,lectureTemperatures
end
lectureTemperatures: serial_write 1,chr$(1)+chr$(3)+chr$(0)+chr$(0)+chr$(0)+chr$(4)+chr$(68)+chr$(9) return
lecturePortSerie: receptionDecoderAfficher() return
sub receptionDecoderAfficher() dim_local i%, char$, c%, valeurHexa$, valeurHexaSonde$, valeurDecimaleSonde%, temperature trameRecue$ = serial_read$(1)
for i% = 1 to len(trameRecue$) char$ = mid$(trameRecue$,i%,1) c% = asc(char$) valeurHexa$ = hex$(c%) if len(valeurHexa$) = 1 valeurHexa$ = "0" + valeurHexa$ end_if octetRecu$(i%) = valeurHexa$ next i%
' affichage en hexadécimal de la trame reçue cls print "Trame reçue : "; for i% = 1 to 13 print octetRecu$(i%)+" "; next i% print print ' affichage de la température de la première sonde codée sur 2 octets (octets 4 et 5) valeurHexaSonde$ = octetRecu$(4) + octetRecu$(5) valeurDecimaleSonde% = hex(valeurHexaSonde$) if bin_and(valeurDecimaleSonde%,32768) = 32768 :' vrai si température négative temperature = (valeurDecimaleSonde%-65536) / 10 print "sonde n° 1: " + str$(temperature) + "°C" else temperature = valeurDecimaleSonde% / 10 print "sonde n° 1: " + str$(temperature) + "°C" end_if print ' affichage de la température de la deuxième sonde codée sur 2 octets (octets 6 et 7) valeurHexaSonde$ = octetRecu$(6) + octetRecu$(7) valeurDecimaleSonde% = hex(valeurHexaSonde$) if bin_and(valeurDecimaleSonde%,32768) = 32768 :' vrai si température négative temperature = (valeurDecimaleSonde%-65536) / 10 print "sonde n° 2: " + str$(temperature) + "°C" else temperature = valeurDecimaleSonde% / 10 print "sonde n° 2: " + str$(temperature) + "°C" end_if print ' affichage de la température de la première sonde codée sur 2 octets (octets 8 et 9) valeurHexaSonde$ = octetRecu$(8) + octetRecu$(9) valeurDecimaleSonde% = hex(valeurHexaSonde$) if bin_and(valeurDecimaleSonde%,32768) = 32768 :' vrai si température négative temperature = (valeurDecimaleSonde%-65536) / 10 print "sonde n° 3: " + str$(temperature) + "°C" else temperature = valeurDecimaleSonde% / 10 print "sonde n° 3: " + str$(temperature) + "°C" end_if print ' affichage de la température de la quatrième sonde codée sur 2 octets (octets 10 et 11) valeurHexaSonde$ = octetRecu$(10) + octetRecu$(11) valeurDecimaleSonde% = hex(valeurHexaSonde$) if bin_and(valeurDecimaleSonde%,32768) = 32768 :' vrai si température négative temperature = (valeurDecimaleSonde%-65536) / 10 print "sonde n° 4: " + str$(temperature) + "°C" else temperature = valeurDecimaleSonde% / 10 print "sonde n° 4: " + str$(temperature) + "°C" end_if end_sub
quitter: timer_off 2 pause 200 serial_close 1 return Tous les détails sur codes hexadécimaux à envoyer, et également ceux reçus, sont décrits dans la documentation de la carte. La trame que j’envoie est une demande de lecture des valeurs des quatre premières sondes de températures. En retour, je recevrai une trame m’indiquant les valeurs mesurées par les quatre sondes. Le trame retour déclenchera automatiquement l’évènement ON_RECEIVE, puis sera traitée par le sous-programme receptionDecoderAfficher(). Le programme affiche en clair la trame reçue et les valeurs des quatre sondes de température avec un rafraîchissement toutes les secondes. Lors de cette capture d’écran, une sonde était dans le réfrigérateur, une dans le congélateur, une à l’extérieur de la maison et une à l’intérieur de la maison. A vous de retrouver dans quel ordre ! Conclusion : Dans cette deuxième démonstration, nous avons mis en pratique la lecture de capteurs de température sur un bus série avec Panoramic. Ces capteurs auraient pu être de simples interrupteurs avec un simple retour d’information «ouvert ou fermé». | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 31 Mai 2021 - 16:43 | |
| @Marc, Je vois sur ton montage que nous avons : - 2 fils (jaune et rouge) pour la connexion RS - 2 fils (noir et rouge) pour l'alimentation - 3 fils (noir rouge et jaune) pour les sondes l' alim et le RS là, jusque là, tout va bien. mais ceux des sondes ? lequel fait quoi ? Je sais, je suis pénible. Papydall a "Mr Bourin" moi c'est "Mr Nul". Mais je ne désespère pas de faire un truc un jour. D'où mon intérêt. J'adore les trucs à la "James Bond" NB: J'espère pour toi qu'il ne fait pas 32.6°c dans ton congélateur. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Domotique avec Panoramic. RS485, la réception de données Lun 31 Mai 2021 - 17:13 | |
| Bonjour Yannick !
Les sondes possèdent effectivement 3 fils. Elles intègrent une partie électronique. Leur sortie est numérique. Elles ont besoin d’une alimentation (fils rouge et noir) et la sortie numérique est le fil jaune. Ce sont des DS18B20.
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 31 Mai 2021 - 18:40 | |
| @Marc, Merci pour ces précisions qui seront utiles à ceux qui, comme moi, ont besoin de visualiser pour comprendre. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Domotique avec Panoramic. RS485, la réception de données Lun 31 Mai 2021 - 18:50 | |
| Bonjour Marc et bonjour à tous ! Bravo pour cette mini-série que tu nous propose. C'est très instructif. Par contre le problème c'est qu'il y a des fils partout !! N'aurai tu pas prévu dans les prochains épisodes une utilisation sans fil ou par courant porteur comme l'indiqué Mindstorm ? | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 31 Mai 2021 - 21:31 | |
| Bein alors Minibug, on n'aime pas les spaghetti ? | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Domotique avec Panoramic. RS485, la réception de données Lun 31 Mai 2021 - 23:22 | |
| Bonsoir les Panoramiciens ! @Minibug Merci Minibug pour tes encouragements. Je n’ai rien de prévu pour un éventuel futur épisode… @ tous Le but de ces articles était de démontrer par la pratique, les capacités de Panoramic à communiquer avec le monde extérieur via la prise USB. Je souhaite y être parvenu. Voici les liens pour télécharger les documentions des cartes utilisées : La carte 8 relais : https://mon-partage.fr/f/Sv7rNlgE/La carte pour huit sondes de température : https://mon-partage.fr/f/8xkVzxZx/Si vous avez des questions techniques au sujet du protocole de communication Modbus, de la composition d’une trame, de la signification de chaque octet, du CRC, des registres internes aux cartes, du bus RS485, du câblage… , je reste à votre disposition pour y répondre. A bientôt ! | |
| | | Contenu sponsorisé
| Sujet: Re: Domotique avec Panoramic. RS485, la réception de données | |
| |
| | | | Domotique avec Panoramic. RS485, la réception de données | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |