Constructeurs de trame ModBus

On reprend la partie programmation avec les constructeurs. Alors sous ce nom barbare se cache en réalité deux fonctions qui permettent de sortir une trame à partir de paramètres.

On commence avec les trames de lecture :

    Function ConstructTrameLecture(ByVal func As Integer, ByVal startaddress As Integer, ByVal nbregisters As Integer) As Byte()
        Dim ByteArr As Byte()
        Dim s1, s2 As String
        Dim ss1, ss2, sa1, sa2 As Integer

        'Decoupage adresse
        s1 = Microsoft.VisualBasic.Right(Hex(startaddress), 2)
        s2 = Replace(Hex(startaddress), s1, "")
        If s2 = "" Then
            sa2 = 0
        Else
            sa2 = "&h" & s2
        End If
        sa1 = "&h" & s1

        'Decoupage nombre registres
        s1 = Microsoft.VisualBasic.Right(Hex(nbregisters), 2)
        s2 = Replace(Hex(nbregisters), s1, "")
        If s2 = "" Then
            ss2 = 0
        Else
            ss2 = "&h" & s2
        End If
        ss1 = "&h" & s1

        'Construction
        ByteArr = New Byte() {Convert.ToByte(Val(Form1.SlaveId.Value)), Convert.ToByte(func), Convert.ToByte(sa2), Convert.ToByte(sa1), Convert.ToByte(ss2), Convert.ToByte(ss1)}
        ByteArr = AddCRC16(ByteArr)

        Return ByteArr
    End Function

Pour cette fonction, vous l’aurez remarqué, on a besoin de 3 paramètres :

  1. La fonction « func » qui peut prendre comme valeur 3 ou 4 (ou autre mais plus rare)
  2. L’adresse de départ « startaddress » qui indique par quel registre on commence (fonction de la machine)
  3. Le nombre de registres « nbregisters » (c’est explicite)

La fonction AddCRC16 est aussi nécessaire pour le fonctionnement du constructeur, ainsi que de la Form1 qui contient le numéro d’esclave de la machine.

Le constructeur suivant est plus simple d’utilisation :

    Function ConstructTrameEcriture(ByVal address As Integer, ByVal valeur As Integer) As Byte()
        Dim ByteArr As Byte()
        Dim s1, s2 As String
        Dim ss1, ss2, sa1, sa2 As Integer

        'Decoupage de Value
        s1 = Microsoft.VisualBasic.Right(Hex(valeur), 2)
        s2 = Replace(Hex(valeur), s1, "")
        If s2 = "" Then
            ss2 = 0
        Else
            ss2 = "&h" & s2
        End If
        ss1 = "&h" & s1

        'Decoupage adresse
        s1 = Microsoft.VisualBasic.Right(Hex(address), 2)
        s2 = Replace(Hex(address), s1, "")
        If s2 = "" Then
            sa2 = 0
        Else
            sa2 = "&h" & s2
        End If
        sa1 = "&h" & s1

        'Construction
        ByteArr = New Byte() {Convert.ToByte(Form1.SlaveId.Value), Convert.ToByte(16), Convert.ToByte(sa2), Convert.ToByte(sa1), 0, Convert.ToByte(1), Convert.ToByte(2), Convert.ToByte(ss2), Convert.ToByte(ss1)}
        ByteArr = AddCRC16(ByteArr)

        Return ByteArr
    End Function

Les deux paramètres sont très simples :

  1. « address » indique le registre à modifier
  2. « valeur » la valeur à appliquer à ce registre

Les pré-requis sont les mêmes que pour l’autre constructeurs.

C’est tout pour aujourd’hui, dans le prochain épisode, vous verrez…. d’autres choses, mais je ne sais pas encore quoi.

Series Navigation<< Le CRC16 en ModBusDécodage de trame ModBus reçue >>

Laisser un commentaire