Réception de trames en RS232 [Résolu]

Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
- - Dernière réponse : NHenry
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
- 20 mai 2012 à 14:12
Bonjour,

Dans le cadre d'un projet universitaire je dois créer une interface en VB.NET afin de visualiser en temps réel les productions d'énergie d'une éolienne et de panneaux solaires. Ceux-ci sont reliés à un compteur d'impulsions qui doit communiquer avec l'interface VB en RS232. J'ai commencé a éditer ce programme mais n'y connaissant pas grand chose en programmation je me suis heurté à plusieurs problèmes, en particulier l'envoi et la réception des trames de réponse de la part du compteur. En effet lorsqu'une trame est envoyée celle-ci est bien visible à l'oscilloscope mais le compteur ne réagit pas ; de plus je ne sais pas comment programmer l'interface pour qu'elle m'affiche les trames renvoyées par le compteur. Quelqu'un aurait-il quelques idées ? Voici le code en VB.NET :

 Public Function Stringvershexa(ByVal trame As String) As String
        'Convertit une string en char hexa pour en faire une trame hexa RTU

        Dim i, j As Integer

        i 1 : Stringvershexa ""
        While (i < Len(trame))
            j = CInt("&H" & Mid(trame, i, 2))
            Stringvershexa = Stringvershexa & Chr(j)
            i = i + 2
        End While
    End Function

    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click

        Dim trame As String

        trame = "FE 10 00 0A 00 02 04 00 00 00 00 C1 4B"
        SerialPort1.Write(trame, 0, trame.Length)


    End Sub


    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        ReceivedText(SerialPort1.ReadExisting())    'Automatiquement activé dès que le port série reçoit une information
    End Sub
    Private Sub ReceivedText(ByVal [texte] As String)
        'Compare la chaîne envoyée à celle qui est reçue
        If Me.RtbReceived.InvokeRequired Then
            Dim x As New SetTextCallback(AddressOf ReceivedText)
            Me.Invoke(x, New String() {(texte)})
        Else
            Me.RtbReceived.Text &= [texte]
        End If
    End Sub

    Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPort.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.PortName = cmbPort.Text         'Affiche un messagebox à l'utilisateur dès qu'il change de port
        Else                                            'sans s'être déconnecté au préalable.
            MsgBox("Port Ouvert", vbCritical)
        End If
    End Sub

    Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaud.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.BaudRate = cmbBaud.Text         'Affiche un msgbox à l'utilisateur dès qu'il modifie la vitesse
        Else                                            'sans s'être déconnecté au préalable
            MsgBox("Port Ouvert", vbCritical)
        End If
    End Sub
   
    Private Sub BtnSend2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend2.Click
        Dim trame2, trame3 As String
        trame2 = "FE 10 01 5E 00 0B 16 00 0A 01 2C 57 6B 00 68 1C BA 68 5D 57 6B 68 00 00 00 00 00 00 00 D5 16"
        trame3 = "FE 10 01 72 00 01 02 99 13 D2 2B"
        SerialPort1.Write(trame2, 0, trame2.Length)
        Threading.Thread.Sleep(300)
        SerialPort1.Write(trame3, 0, trame3.Length)

    End Sub
End Class
Afficher la suite 

Votre réponse

20/34 réponses

Meilleure réponse
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
3
Merci
Bonjour,

Plusieurs raisons à une non réponses d'un exclave Modbus (JBus et Modbus, c'est pareil) :
- Mauvais numéro d'esclave
- Mauvais CRC
- Mauvaise adresse/longueur

Sinon, utuilises plutot un tableau d'octet qu'une chaine de caractère, il y aura moins de risquie de traduction erronée

Dim MonTab() As Byte=new Byte(){&hEF,&h10,1,&h...}

Comme ça tu es sûr que les données sont transmises correctement.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
3
Merci
Bonjour,

C'est déjà plus clair.
Pour information, le code fonction &h03 c'est une lecture de mot, comme &h04, l'écriture de mot c'est &h10.

le &h20 c'est le nombre d'octet lu (8*4=32).

Il te faut utiliser la lecture binaire à partir de ton port (pas de texte) ensuite, tu peux utiliser un code de ce genre :
Dim lValue as Long=0
lValue=MonTab(0)
lValue*=256
lValue+=Montab(1)
lValue*=256
lValue+=Montab(2)
lValue*=256
lValue+=Montab(3)


Ensuite, à toi d'appliquer le décalage nécessaire.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
3
Merci
Bonjour,

Dans la formule 3+X*4 :
3, index de la première donnée utile
4, nombre d'octets par enregistrement utiles
X, Index (base 0) de l'enregistrement désiré
Mon tout donne l'index du premier octet de l'enregistrement désiré.

Quand tu fais :
Dim lTrame As Long
lTrame += trame(0)
lTrame *= 256
C'est comme si tu faisais :
Dim lTrame As Long=trame(0)*256
Donc loin du but initial qui est de récupérer la conversion de 4 octets en entiers pour lire la valeur.
De plus, si tu as un dépassement d'index en accédant à l'index 0, c'est que ton tableau est vide.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Peut être que le format de communication est différent, quelques pistes :
- C'est pas du binaire mais de l'hexa (texte) attendu.
- Si c'est du texte, peut être que c'est du 7 bits au lieu des 8 par défaut attendu pour les données
- Pas le bon nombre de bits de stop
- Pas la bonne vitesse
- Le handshaking mal configuré
- La parité mal configurée
- ...

De plus, SerialPort supporte l'envoi de tableaux d'octet, donc, préfères utiliser un tableau d’octet pour les données binaires plutôt de des chaines.

As-tu essayé de mettre des points d'arrêt et de faire du pas à pas pour voir le déroulement du programme ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Merci d'avoir réagi !

Alors en ce qui concerne les paramètres propres au compteur il n'y a aucun problème, il s'agit bien de la bonne configuration, 9600bauds, 8 bits, 1 bit de stop, sans parité (j'ai la notice du compteur ainsi que les codes hexadécimaux de configuration JBus). Je pense que le problème vient plutôt du codage ; en revanche comme je l'ai annoncé lorsque le j'effectue un débogage, j'envoie une trame vers le compteur, que je peux visualiser à l'oscilloscope mais le compteur ne réagit pas (la trame envoyée visant à remettre à zéro l'une de ses voies de comptage)Y aurait-il un lien avec le DCE ready ou le RTS du câble de liaison ?
Commenter la réponse de cs_Catilina
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Un tableau d'octets ? Hum... Pour ceci j'y ai jeté un oeil mais je n'ai pas très bien compris à quoi cela servait '-_-
Commenter la réponse de cs_Catilina
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
pas bon, ca :
trame = "FE 10 00 0A 00 02 04 00 00 00 00 C1 4B"
SerialPort1.Write(trame, 0, trame.Length)

pas confondre representation 'humaine' en l'hexa de tes octets
avec un tableau d'octets, attendu et transmis par le compteur...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Ah voilà j'ai compris la table d'octets ! Merci beaucoup pour votre aide ! =) Voici le code modifié pour ceux qui seraient dans le même problème que moi :
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click

        Dim TabTrame() As Byte = New Byte() {&HFE, &H10, 0, &HA, 0, 2, 4, 0, &H64, 0, 0, &H80, &H94} 'trame réini compteur 1 , 10kWh

        SerialPort1.Write(TabTrame, 0, TabTrame.Length & vbCr) ' Le texte contenu dans le txtText est envoyé au port série comme trame en ASCII avec le retour chariot

    End Sub

    Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPort.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.PortName = cmbPort.Text         'Affiche un messagebox à l'utilisateur dès qu'il change de port
        Else                                            'sans s'être déconnecté au préalable.
            MsgBox("Port Ouvert", vbCritical)
        End If
    End Sub

    Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaud.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.BaudRate = cmbBaud.Text         'Affiche un msgbox à l'utilisateur dès qu'il modifie la vitesse
        Else                                            'sans s'être déconnecté au préalable
            MsgBox("Port Ouvert", vbCritical)
        End If
    End Sub

    Private Sub BtnSend2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend2.Click
        Dim trame2() As Byte = New Byte() {&HFE, &H10, 1, &H5E, 0, &HB, &H16, 0, &HA, &H1, &H2C, &H57, &H6B, &H0, &H68, &H1C, &HBA, &H68, &H5D, &H57, &H6B, &H68, 0, 0, 0, 0, 0, 0, 0, &HD5, &H16}
        Dim trame3() As Byte = New Byte() {&HFE, &H10, 1, &H72, 0, 1, 2, &H99, &H13, &HD2, &H2B}
        SerialPort1.Write(trame2, 0, trame2.Length)
        Threading.Thread.Sleep(200)
        SerialPort1.Write(trame3, 0, trame3.Length)

    End Sub
End Class
Commenter la réponse de cs_Catilina
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Ton esclave Mmodbus répond maintenant ?
As-tu réussi à faire ce que tu voulais ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Eh bien en ce qui concerne la réponse je ne reçois rien car je ne l'ai pas très bien programmé et je ne sais pas trop comment faire. En revanche le compteur est fourni avec un logiciel de configuration de base. J'avais analysé les trames envoyées par ce logiciel et j'en ai mis quelques unes dans mes commandes VB (la première que vous voyez correspond ainsi à la remise à zéro de la voie 1 du compteur). J'ai donc testé en envoyant la trame donnant cet ordre au compteur et j'ai vérifié par le biais du logiciel de configuration si la remise à zéro a bien été effectuée, ce qui a été le cas.
En ce moment je cherche à récupérer les trames envoyées par le compteur via l'appli que je suis en train de programmer mais ça ne marche pas. En fait je dois programmer une interface graphique m'affichant en temps réel les productions d'énergie des panneaux solaires et de l'éolienne. J'ai trouvé quelques pistes sur des tutoriaux mais je n'avance pas et je ne sais pas comment stocker les données reçues (avec un tableau DataSet ? ou via Excel ?) voili voilou^^
Commenter la réponse de cs_Catilina
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Tu ne passes pas dans l'évènement SerialPort1_DataReceived ?
Il y aurait pas une propriété Thresold (ou similaire), qui permet de généré l'évènement à partir d'un certain nombre d'octet reçu ?

(Je n'utilise cette classe qu'en thread)

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Bonjour,

J'ai réussi à programmer la réponse du compteur (via l'event DataReceived), il me renvoie des trames que j'ai pu visualiser sous forme de MessageBox. Cependant chaque groupe d'octets de la trame correspondant à une valeur de comptage ainsi qu'à son unité, je ne parviens pas à isoler ces groupes au sein de la trame pour les traduire en ASCII et les afficher séparément dans des labels ou des TextBox. J'ai essayé avec la fonction Split mais je n'arrive qu'à isoler les caractères hexadécimaux deux à deux et les affiche aussi sous forme de MsgBox. Y aurait-il un autre moyen pour isoler et traduire les octets quatre par quatre par exemple ? (les valeurs de comptage et les unités sont codés sur quatre octets). Voici le code que j'ai actuellement :
  Private Sub BtnIndex_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnIndex.Click

        Dim tcompteur8() As Byte = New Byte() {&HFE, 3, 1, &H60, 0, 9, &H90, &H21}
        Dim tcompteur7() As Byte = New Byte() {&HFE, 3, 1, &H4F, 0, 9, &HA1, &HE8}
        Dim tcompteur6() As Byte = New Byte() {&HFE, 3, 1, &H3E, 0, 9, &HF1, &HF3}
        Dim tcompteur5() As Byte = New Byte() {&HFE, 3, 1, &H2D, 0, 9, 0, &H36}
        Dim tcompteur4() As Byte = New Byte() {&HFE, 3, 1, &H1C, 0, 9, &H51, &HF9}
        Dim tcompteur3() As Byte = New Byte() {&HFE, 3, 1, &HB, 0, 9, &HE1, &HFD}
        Dim tcompteur2() As Byte = New Byte() {&HFE, 3, 0, &HFA, 0, 9, &HB9, &HF2}
        Dim tcompteur1() As Byte = New Byte() {&HFE, 3, 0, &HE9, 0, 9, &H40, &H37}

        SerialPort1.Write(tcompteur8, 0, tcompteur8.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur7, 0, tcompteur7.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur6, 0, tcompteur6.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur5, 0, tcompteur5.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur4, 0, tcompteur4.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur3, 0, tcompteur3.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur2, 0, tcompteur2.Length & vbCr)
        Threading.Thread.Sleep(350)
        SerialPort1.Write(tcompteur1, 0, tcompteur1.Length & vbCr)

    End Sub



    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Thread.Sleep(100)

        Dim b(18) As Byte 'b()=longeur de la trame de retour affichée en hexa
        Dim reponseindex As String = Nothing
        SerialPort1.Read(b, 0, 18)

        For ii As Integer = 0 To 18
            'reponseindex = reponseindex & ":" & Hex(b(ii))
            reponseindex = reponseindex & ":" & Chr(b(ii))
            MsgBox(reponseindex)
        Next

        'MessageBox.Show(reponseindex)

        Dim reptronque() As String
        Dim count As Integer
        'Dim table() As String
        reptronque = reponseindex.Split(":")
        For count = 0 To reptronque.Length - 1
            'table = reptronque

            'MsgBox(reptronque(count))

        Next

    End Sub
   

    Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmbPort.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.PortName = CmbPort.Text         'Affiche un messagebox à l'utilisateur dès qu'il change de port
        Else                                            'sans s'être déconnecté au préalable.
            MsgBox("Port Ouvert", vbCritical)
        End If
    End Sub

    Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmbBaud.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.BaudRate = CmbBaud.Text         'Affiche un msgbox à l'utilisateur dès qu'il modifie la vitesse
        Else                                            'sans s'être déconnecté au préalable
            MsgBox("Port Ouvert", vbCritical)
        End If
    End Sub

    Private Sub BtnSend2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend2.Click
        Dim trame2() As Byte = New Byte() {&HFE, &H10, 1, &H5E, 0, &HB, &H16, 0, &HA, &H1, &H2C, &H57, &H6B, &H0, &H68, &H1C, &HBA, &H68, &H5D, &H57, &H6B, &H68, 0, 0, 0, 0, 0, 0, 0, &HD5, &H16}
        Dim trame3() As Byte = New Byte() {&HFE, &H10, 1, &H72, 0, 1, 2, &H99, &H13, &HD2, &H2B} 'Modification temps d'intégration voie 5 à t=5mn
        SerialPort1.Write(trame2, 0, trame2.Length)
        Threading.Thread.Sleep(200)
        SerialPort1.Write(trame3, 0, trame3.Length)

    End Sub


End Class
Commenter la réponse de cs_Catilina
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Sans la doc des registres en lectures, il est plus dur de répondre, as-tu un exemple ou un morceau de doc (juste la partie utile) ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
La doc des registres en lecture ? Hum.. Qu'entends-tu par là ? J'ai la documentation relative à toutes les commandes JBus en hexa que l'on peut envoyer au compteur en revanche ; il s'agit de ça ?
Commenter la réponse de cs_Catilina
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Quand tu lui envoi une trame de lecture (code fonction 3 ou 4 le plus souvent), quels sont les adresses lues ?
Et quel est le format des données lues ?

De la manière que tu dis, j'ai l'impression que tu ne controle pas le CRC des réceptions, dans le cas d'une erreur de communication, tu liras et traiteras les données pourtant erronnées.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Très bien alors je vais tenter de m'expliquer^^ ; les trames de lecture que j'envoie au compteur consistent à l'interroger sur la production des panneaux solaires ou de l'éolienne. Par exemple, les trames Hexa que tu peux voir dans le code sous le Private Sub du BtnIndex correspondent à l'interrogation de chaque unité des voies du compteur qui sont reliées aux onduleurs (l'unité étant représentée par les troisième et quatrième octets des trames de lecture, par exemple 0160h est le code hexa de l'unité de la voie 8 du compteur etc.) En envoyant ces trames le compteur me répond en une seule trame qui me rend compte de la valeur de chaque voie du compteur, voie identifiée par son unité, dans le même ordre où j'ai effectué l'envoi des trames d'interrogation. Les valeurs que je reçois sont sous la forme de deux mots en hexadécimal (par exemple 00 64 00 00, qui correspond à 100Wh) que je traduis en décimal pour obtenir la valeur qui pourra être lue. Ayant le logiciel de configuration fourni avec le compteur, j'ai effectué des modifications sur la configuration et ai intercepté les trames via un pc espion avec Hyper terminal et un éditeur hexa. J'ai ensuite analysé les trames échangées pour connaître la signification de chaque octet ou groupe d'octets pui reproduit à l'identique les commandes de configuration du logiciel sur mon appli VB afin d'être sûr de l'exactitude des données échangées, ce que j'ai pu constater d'une part par le fait que le compteur a bien validé les modifications que je lui ai apportées et d'autre part par les réponses qu'il m'a renvoyées qui correspondaient à ce dont je m'attendais, donc sur ce point je suis quasiment sûr de l'exactitude des données (CRC compris), seulement étant donné que le compteur me renvoie les valeurs de ses voies sur une seule trame (ce qu'il fait également avec le logiciel de configuration), je ne parviens pas à isoler chaque paire de mots dans la trame pour que celle-ci soit traduite en Décimal et affichée dans une textbox ou autre. Après je ne sais pas s'il faut que j'envoie les données les unes après les autres ou toutes en même temps comme je l'ai fait avec des temporisations entre. Peut être devrais-je faire en sorte que les données de réponse soit stockées directement dans un tableau que je puis visualiser et ensuite faire une fonction qui traduit l'hexa en décimal chaque case du tableau, mais après ça a l'air encore plus compliqué ça^^
Commenter la réponse de cs_Catilina
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Désolé pour la durée de réponse, mais ton paragraphe de texte très peu lisible m'a demandé pas mal de temps.

Il faut que tu fasse un système d'échange, ce système sera capable d'associer une réponse avec une question.
Comme cela tu pourra être sûr des données reçues.

Pour comprendre le protocole Modbus (RTU série binaire dans ton cas, apparemment), il y a beaucoup de doc sur le net.

Si c'est cela qui te pose pb, précises le code de fonction que tu recherche et je peux te fournir le format des trames en question.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Bonjour,

Excuse-moi pour la durée de la réponse mais je n'ai guère eu le temps de travailler sur mon projet ces derniers jours. Cependant je crois que tu n'as très bien compris^^ Quand j'envoie une question au compteur celui-ci ne me répond justement pas la même chose pour la même question. En fait il me renvoie une trame assez longue contenant dans l'ordre toutes les informations dont j'ai besoin (en l'occurrence il s'agit des données du comptage actualisées de chaque voie du compteur, et la position des mots dans la trame définit le numéro de la voie du compteur concernée) mais j'essaie de créer une fonction qui permette "d'éclater" chaque groupe de mots de la trame, qui correspondent aux productions actualisées, pour qu'ils soient convertis en ASCII puis visibles dans des textbox ou des label. J'ai compris ce qui concernait le protocole ModBus mais il semble que celui qui est utilisé est encore à un format spécial propre à la société qui commercialise ce type de compteur, au vu de la longueur des trames que je reçois en réponse. J'ai eu le temps de me renseigner auprès de quelques profs qui connaissent le protocole mais ceux-ci n'ont pas compris les trames que le compteur me renvoyait '-_-. A la rigueur ça ne m'étonnerait pas que tu ne trouves pas de solution^^
Commenter la réponse de cs_Catilina
Messages postés
14321
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
13 décembre 2018
0
Merci
Bonjour,

Comme les données sont formées en mot de 16 bits, et que tu connais la longueur des données d'un mesureur, tu peux extraire des blocs concernant chaque mesureur.

Car, je pense que ton problème se situe sur la manipulation des tableaux.
As-tu un exemple de retour, pour que je puisse m'appuyer dessus (une trame réelle) ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
Messages postés
20
Date d'inscription
mercredi 18 janvier 2012
Dernière intervention
21 juillet 2012
0
Merci
Bonjour,

J'ai pu me remettre sur mon projet et grâce à un analyseur de trames que j'ai reçu j'ai pu identifier avec certitude les trames que je recevais (en effet, avant j'espionnais le PC avec Hyper Terminal et traduisais les données interceptées avec un éditeur hexa). J'ai (enfin!) pu trouver la trame qui m'intéresse pour mon projet, celle correspondant à la question visant à interroger le compteur sur les valeurs intrinsèques des productions énergétiques (car la liste des commandes JBus que m'a fourni la société ne me mentionne aucune commande de ce type...). J'ai également pu comprendre davantage de choses en ce qui concerne le fonctionnement de l'actualisation des données du compteur, je vais tenter de t'expliquer je que j'ai cru comprendre.
Alors, j'ai donc identifié cette fameuse trame interrogeant le compteur sur les valeurs intrinsèques des productions sur chaque voie de celui-ci, il semble que la question soit toujours la même, et la trame de réponse que me renvoie le compteur contient toujours les valeurs intrinsèques des productions actualisées. Le code de la trame de question étant FE 03 00 04 00 10 11 C8. Maintenant que je connais cette trame, je pense judicieux de réaliser une structure en Do...Loop ou While...End WHile pour que mon programme récupère ces valeurs de manière permanente, toutes les 10 mn par exemple. Cette démarche est-elle juste d'après toi ?
Autrement donc, pour répondre à mon problème de tableau, je puis te fournir un exemple réel de la trame complète de réponse à la question précédente :
FE 03 20 9B 54 00 01 4A 94 00 03 C6 58 00 09 01 2C 00 00 01 90 00 00 01 F4 00 00 02 58 00 00 02 BC 00 00 FC 46.
Je t'explique sa structure : FE étant l'adresse et 03 la commande d'écriture, 20 je ne sais pas exactement ce que c'est, après cet octet, il faut lire par quatuors d'octets (au nombre de 8, un pour chaque voie), ce qui donne les valeurs décimales intrinsèques de chaque voie du compteur, de la voie 1 à la 8e, par exemple 9B 54 00 01, qui se lit 19B54 correspond à 10530,0 kWh,de même pour la voie 2 4A 94 00 03, qui se lit 34A94, correspond à 21570,0 kWh, ainsi de suite. Le CRC16 FC 46 est bien exact.
Donc il s'agit d'isoler chaque paire de mots dans une "case" de façon à ce que je puisse la convertir en décimal pour la stocker dans un TextBox ou Label pour être visible en temps réel ainsi que dans un tableau de valeurs me permettant d'en tirer un graphe.
En ce qui concerne le graphe, on m'a dit d'utiliser le tableur Excel mais bon ça me paraît un peu compliqué.
Commenter la réponse de cs_Catilina

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.