Rebol pour E/S industrielles sur Modbus/TCP
Liste des forums > Forum CoreJe souhaiterai utiliser Rebol pour gérer (Lecture/Ecriture) des Entrées/Sorties industrielles sur réseau Modbus/TCP (port 502).
N'étant pas un spécialiste des réseaux, je me suis contenté de reprendre des exemples du bouquin d'Olivier Auverlot, jusqu'à ....... buter sur un Pb
Au début, tout va bien. Le code :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; OUVERTURE PORTS 502 MODULE TCP/MODBUS + LOCAL ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; if not error? try [p_trame: open/write tcp://192.168.00.17:502] [print "le port 502 vient d'etre ouvert en écriture sur IP distante (17)"] if not error? try [p_reponse: open/read tcp://:502] [print "le port 502 vient d'etre ouvert en lecture sur IP locale (13)"] print ""
me permet d'ouvrir le port 502 distant des E/S indus en écriture et le port 502 local de ma machine en lecture, avec dans la console :
le port 502 vient d'etre ouvert en écriture sur IP distante (17)
le port 502 vient d'etre ouvert en lecture sur IP locale (13)
Ensuite, c'est toujours OK à priori. Le code :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ECRITURE SORTIES VERS MODULE TCP/MODBUS ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mot_ecriture_sortie: copy [ 5 0 0 255 0 ] foreach valeur mot_ecriture_sortie [ envoi: join (pick (to-hex valeur) 7) (pick (to-hex valeur) 8) insert p_trame envoi prin envoi ] print ""
permet d'envoyer la reqête en Hexa vers les E/S indus, avec dans la console :
050000FF00
Pour la réponse, cela se gâte puisque :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ATTENTE DE REPONSE DU MODULE TCP/MODBUS ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; reponse: copy "" read-io p_reponse reponse 255 wait p_reponse reponse: copy p_reponse print reponse
produit le message d'erreur suivant sur l'instruction "read-io" :
** Script Error: Cannot use read on this type port
** Near: read-io p_reponse reponse 255
Merci de me donner vos avis et conseils
Mais je ne me suis jamais collé pratiquement aux ports Rebol pour te donner un exemple de code qui marche.
D'autres vont s'en charger, j'en suis sûre.
Ne faut-il pas que ton serveur soit dans une boucle d'écoute ?
Et ce n'est pas p_reponse mais "first p_reponse" .
Essaye cela ?
[code=rebol]
forever [
print "attente connexion"
wait p_reponse
print "connexion OK"
connexion: first p_reponse
reponse: copy ""
read-io connexion reponse 255
print reponse
close connexion
]
[/code]
===Philippe
===Philippe
PS: Tu peux tester ton serveur p_response avec un "telnet localhost 500", par exemple.
===Philippe
Je teste tout cela Lundi de retour ...... à mon boulot !
Encore merci
j'ai fait un "mixe" de vos propositions jusqu'à ne plus obtenir d'erreurs, ce qui donne pour le code :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ATTENTE DE REPONSE DU MODULE TCP/MODBUS ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print "attente connexion" wait p_reponse print "connexion OK" connexion: first p_reponse reponse: copy "" read-io connexion reponse 255 print join "longueur reponse : " length? reponse prin "reponse : " print reponse if not error? try [close p_trame] [print "le port 502 est fermé sur IP distante 17"] if not error? try [close p_reponse] [print "le port 502 est fermé sur IP locale 13"] print ""
qui affiche dans la console :
trame (12 bytes) : 00000000000600050000FF00
attente connexion
connexion OK
longueur reponse : 0
reponse :
le port 502 est fermé sur IP distante 17
le port 502 est fermé sur IP locale 13
Comme vous le voyez, plus d'erreurs mais toujours pas la moindre réponse du serveur TCP/modbus distant à destination de ma machine. Je suis certain du format de la trame de 12 bytes envoyée en requête (2 documents concordant en ma possession). De plus comme le serveur TCP/modbus posséde un mini-serveur Web me donnant quelques infos, il semble que le nombre de paquets émis et reçus augmentent à chacun de mes tests !
Mais alors, pourquoi toujours un réponse "nulle" avec le script ???
Merci de vos idées ......