VB.NET Jbus/Modbus

dakota77 Messages postés 11 Date d'inscription samedi 1 septembre 2007 Statut Membre Dernière intervention 25 février 2010 - 19 févr. 2010 à 09:14
NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 - 26 févr. 2010 à 22:30
Bonjour,

Sous VB 2008 je voudrais établir une communication avec un automate en mode Jbus/modbus.
Avec cet automate, j'ai un petit soft qui permet de vérifier que la communication avec l'automate fonctionne correctement.
A ce niveau pas de problème : lorsque le soft envoie la trame
"0x05 0x03 0x07 0x00 0x00 0x10 0x44 0xF6"
L'automate répond :
0x05 0x03 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x09 0x04 0x00 0x00 0x00 0x00 0x13 0x87 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xE8 0x00 0x00 0x40 0xD8

Cependant lorsque la trame est envoyée à partir de VB.NET je n'obtiens aucune réponse de la part de l'automate.
comm1.BaudRate = 9600
Comm1.Parity = Ports.Parity.None
Comm1.Handshake = 1
Comm1.PortName = "COM4"
Comm1.Open()
CMD = "0x05 0x03 0x07 0x00 0x00 0x10 0x44 0xF6"
Comm1.Write(CMD)

Sur le module de conversion USB RS485 une lampe TX confirme que les données sont envoyées vers l'automate. Mais la lampe RX reste éteinte ce qui signifie que la trame envoyé n'est pas reconnue.

J'ai aussi essayé :
CMD = "0x050x030x070x000x000x100x440xF6"
CMD = "05030700001044F6"

Et en décimal:
CMD = Chr(5) & Chr(3) & Chr(7) & Chr(0) & Chr(0) & Chr(1) & Chr(132) & Chr(250)

Quelqu'un aurait-il une idée ?
Merci pour votre aide

10 réponses

NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
19 févr. 2010 à 20:37
Bonjour,

La notation 0x* veut dire Hexa, par exemple 0xF6, veut dire F6 en hexadéximal, soit 246 en décimal. En VB, c'est l'équivalent de &h*

Dans ton cas, ce n'est pas une chaine à envoyer, mais un tableau d'octet :
Dim CMD as byte() =new byte(){ &h05, &h03, &h07, &h00, &h00, &h10, &h44, &hF6}
Et ensuite, envoyer CMD.

Mon site
0
dakota77 Messages postés 11 Date d'inscription samedi 1 septembre 2007 Statut Membre Dernière intervention 25 février 2010
22 févr. 2010 à 11:44
Bonjour,

Tout d'abord merci pour ta réponse.

Le problème est qu'avec comm1.write je ne peux pas envoyer un byte. Il faut que ce soit un string.
Et quand CMD est converti en string, l'automate ne répond rien.
Voici le code :

Comm1.BaudRate = 9600
Comm1.Parity = Ports.Parity.None
Comm1.Handshake = 1
Comm1.PortName = "COM4"
Comm1.Open()
Dim CMD As Byte() = New Byte() {&H5, &H3, &H7, &H0, &H0, &H10, &H44, &HF6}
Comm1.Write(CMD.ToString)
Comm1.close()

Merci
0
dakota99 Messages postés 2 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 février 2010
22 févr. 2010 à 18:03
Oops, correction du code utilisé mais qui ne donne pas de résultat :
Comm1.BaudRate = 9600
Comm1.Parity = Ports.Parity.None
Comm1.Handshake = 1
Comm1.PortName = "COM4"
Comm1.Open()
Dim CMD As Byte() = New Byte() {&H5, &H3, &H7, &H0, &H0, &H10, &H44, &HF6}
for x = 0 to 7
Comm1.Write(CMD(x))
next x
Comm1.close()

Malheureusement aucune réponse de la part de l'automate.
Merci
0
NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
22 févr. 2010 à 21:15
Bonjour,

Pour le binaire, il faut utiliser une surcharge de Write :
Comm1.Write(CMD, 0, CMD.Length)

Mon site
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dakota77 Messages postés 11 Date d'inscription samedi 1 septembre 2007 Statut Membre Dernière intervention 25 février 2010
23 févr. 2010 à 08:41
Bonjour,
C'est déjà mieux ! Lorsque j'envoie CMD Pour la première fois (Comm1.Write(CMD, 0, CMD.Length)), je vois la lampe RX de l'automate qui s'allume donc c'est qu'il a compris la trame et qu'il renvoie sa réponse.
Malheureusement, lorsque je renvoie une deuxième fois plus rien ne répond. Même l'utilitaire fourni à l'automate n'obtient pas de réponse de celui-ci. Il faut déconnecter l'automate du pc puis c'est reparti.
Ci-dessous le code utilisé pour capturer les données qui arrivent sur le port série.

dim buf as string

Private Sub Comm1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Comm1.DataReceived
buf = buf & Comm1.ReadExisting
TB01.Text = buf
End Sub

Un grand merci pour ton aide car je patauge allègrement ...:)
0
NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
23 févr. 2010 à 20:27
Bonjour,

Pour lire, voici la bonne ligne :
ReDim ltData(mPort.BytesToRead - 1)
mPort.Read(ltData, 0, ltData.Length)

N'oublie pas que c'est du binaire et pas du texte.

Concernant le problème de réiteration de l'envoi, je ne comprend pas pourquoi.
Je bosse tous les jours (ou presque) avec des équipements qui communiquent par ModBus et je n'ai pas ce genre de pb.
Un bug dans l'automate est aussi possible (bien que j'en doute quand même).

Mon site
0
dakota99 Messages postés 2 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 23 février 2010
23 févr. 2010 à 22:03
Bonsoir,
Merci pour ta réponse.
Comme tu l'as sûrement constaté, je ne suis pas familier au monde de l'automatisation... j'ai essayé d'appliquer le code que tu m'as proposé mais il génère des messages d'erreur :
Comm1.BaudRate = 9600
Comm1.Parity = Ports.Parity.None
Comm1.Handshake = 1
Comm1.PortName = "COM4"
Comm1.Open()
Dim CMD As Byte() = New Byte() {&H5, &H3, &H7, &H0, &H0, &H10, &H44, &HF6}
Comm1.Write(CMD, 0, CMD.Length)

Private Sub Comm1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Comm1.DataReceived
Dim ltData(Comm1.BytesToRead - 1)
Comm1.Read(ltData, 0, ltData.Length)
End Sub
Cette ligne : Comm1.Read(ltData, 0, ltData.Length)n'est pas acceptée par l'éditeur - message d'erreur : "la résolution de surcharge a échoué car aucun read accessible ne peut être appelé avec ces arguments: public function Read (buffers as char, offset as integer, count as integer) as integer. Une valeur de type tableau à 1 dimension de byte ne peut être convertie en tableau à 1 dimension de char car byte n'est pas dérivé de char. ltdata devrait être du type byte non ?
Par contre si je remplace cette ligne par Comm1.Read(CMD, 0, ltData.Length) il n'y plus d'erreur mais est-ce correct ?
Ensuite il faut convertir le byte CMD en hexa ?

Encore merci.
Mario
0
NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
23 févr. 2010 à 22:19
Bonjour,

ltData est déclarée :
dim ltData as byte()

Car après elle est redimensionnée dynamiquement, donc pas de taille dans le Dim :)

Oui, ensuite, il faudra traduire la réception en hexa pour pouvoir la faire comprendre à un humain :)

Mon site
0
dakota77 Messages postés 11 Date d'inscription samedi 1 septembre 2007 Statut Membre Dernière intervention 25 février 2010
25 févr. 2010 à 08:44
Bonjour,
Le code semble fonctionner mais seulement une fois.
J'ai une form avec 3 boutons : ouvrir le port, interroger l'automate et fermer le port.
Quand je lance la form, j'ouvre le port COM4 puis j'interroge l'automate.
Je reçois une chaîne de caractères en hexa qui semble correspondre à la réponse attendue.
Si j'appuye une deuxième fois sur le bouton d'interrogation, rien ne se passe et aucun message d'erreur.
Je ferme le port, je l'ouvre à nouveau et je renvoie le test, la lampe TX sur le convertisseur USB RS485 ne s'allume pas. Donc rien ne part du pc.
Il faut que je déconnecte le câble reliant le pc à l'automate et c'est reparti...

Je n'imaginais pas le monde de l'automatisation aussi compliqué !
Quelqu'un aurait-il une suggestion ?

Merci pour votre aide.
0
NHenry Messages postés 15030 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
26 févr. 2010 à 22:30
Bonjour,

D'après ce que je comprend, c'est ton adaptateur USB/RS485 qui pose problème, et sur ce point, je ne pourrais pas t'aider, n'ayant pas de connaissance précise sur ce sujet.
Je te conseil de rechercher sur le net pour plus d'information sur ce problème.

Mon site
0