<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>modbus Archives - Garikover.com</title>
	<atom:link href="https://garikover.com/tag/modbus/feed/" rel="self" type="application/rss+xml" />
	<link>https://garikover.com/tag/modbus/</link>
	<description>Le monde d&#039;un Paladin</description>
	<lastBuildDate>Mon, 01 Aug 2016 07:11:19 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>

<image>
	<url>https://garikover.com/wp-content/uploads/image-facebook.png</url>
	<title>modbus Archives - Garikover.com</title>
	<link>https://garikover.com/tag/modbus/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">109537588</site>	<item>
		<title>Résumé ModBus RTU en VB</title>
		<link>https://garikover.com/resume-modbus-rtu-en-vb/</link>
					<comments>https://garikover.com/resume-modbus-rtu-en-vb/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 08 Mar 2013 06:29:43 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[crc]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[série]]></category>
		<category><![CDATA[vb]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4027</guid>

					<description><![CDATA[<p>La série d&#8217;article sur le sujet est maintenant terminée, je vais donc sortir un petit résumé et surtout une méthode pour retrouver l&#8217;ordre d&#8217;utilisation des fonctions afin d&#8217;établir une communication correcte. En premier lieu et c&#8217;est sans doute l&#8217;étape la plus importante dont on ne peut pas se passer, il faut ouvrir le port série [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/resume-modbus-rtu-en-vb/">Résumé ModBus RTU en VB</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>La série d&rsquo;article sur le sujet est maintenant terminée, je vais donc sortir un petit résumé et surtout une méthode pour retrouver l&rsquo;ordre d&rsquo;utilisation des fonctions afin d&rsquo;établir une communication correcte.<span id="more-4027"></span></p>
<p>En premier lieu et c&rsquo;est sans doute l&rsquo;étape la plus importante dont on ne peut pas se passer, il faut ouvrir le port série qui permettra la communication. Pour le moment je ne passe que par un port COM, je travaille sur une mise à joueur pour passer en ethernet.</p>
<p>1. <a title="Ouvrir un port série en VB" href="https://garikover.com/ouvrir-un-port-serie-en-vb/">Ouvrir un port série en VB</a></p>
<p>Ensuite, maintenant que le port est ouvert&#8230; et avec les bons paramètres, on peut envoyer une trame de lecture pour recevoir une réponse.</p>
<p>2. <a title="Envoyer une trame en ModBus" href="https://garikover.com/envoyer-une-trame-en-modbus/">Envoyer une trame en ModBus</a></p>
<p>Pour cette étape, on peut utiliser les constructeurs de trame pour ressortir ce qu&rsquo;on veut envoyer, le tout combiné avec les fonctions CRC indispensable si vous utilisez les constructeurs.</p>
<p>2.1. <a href="https://garikover.com/constructeurs-de-trame-modbus/">Constructeurs de trame ModBus</a></p>
<p>2.2. <a title="Le CRC16 en ModBus" href="https://garikover.com/le-crc16-en-modbus/">Le CRC16 en ModBus</a></p>
<p>Maintenant qu&rsquo;on sait se connecter et envoyer des infos, il faut pouvoir les recevoir.</p>
<p>3. <a title="Recevoir une trame en ModBus" href="https://garikover.com/recevoir-une-trame-en-modbus/">Recevoir une trame en ModBus</a></p>
<p>Arrivé à ce point là, le plus dur est fait, déjà on peut savoir si on communique ou non avec l&rsquo;appareil et si les trames reçues sont correctes. L&rsquo;étape suivante consiste à décoder la trame en fonction de l&rsquo;envoie et d&rsquo;établir une correspondance entre les données reçues et celles demandées. Pour cela on va utiliser une fonction de décodage.</p>
<p>4. <a href="https://garikover.com/decodage-de-trame-modbus-recue/">Décodage de trame ModBus reçue</a></p>
<p>A partir de là vous êtes tout seul et votre principale problématique sera de trouver une solution pour stocker les correspondances en fonction des machines. Personnellement, j&rsquo;ai opté pour un stockage en base de données, ce qui a le gros avantage de n&rsquo;avoir qu&rsquo;à mettre la base à jour pour rajouter des infos. Le soucis c&rsquo;est que ça demande pas mal de code pour intégrer la base de données, donc si on n&rsquo;a qu&rsquo;une ou deux machines à gérer ce n&rsquo;est pas spécialement conseillé, l&rsquo;utilisation d&rsquo;un tableau serait plus adapté.</p>
<p>Au besoin je posterais une solution simple.</p>
<p>Cet article <a href="https://garikover.com/resume-modbus-rtu-en-vb/">Résumé ModBus RTU en VB</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/resume-modbus-rtu-en-vb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4027</post-id>	</item>
		<item>
		<title>Décodage de trame ModBus reçue</title>
		<link>https://garikover.com/decodage-de-trame-modbus-recue/</link>
					<comments>https://garikover.com/decodage-de-trame-modbus-recue/#comments</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 01 Mar 2013 06:34:22 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[crc]]></category>
		<category><![CDATA[lead]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[vb]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4113</guid>

					<description><![CDATA[<p>Voici la dernière partie du code pour le ModBus en VB. Public Function ReadDecoder(ByVal ligne As String) &#039;Passage de la trame en Array Dim MyBytes As Array = Split(ligne, &#34;/&#34;) Dim i, partie1, partie2 As Integer Dim grille As ListView Dim ReponseValeur As String Dim MyValue As Array &#039;Remplissage table Dim _AliasDBData As New GTCDataSet.AliasDBDataTable [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/decodage-de-trame-modbus-recue/">Décodage de trame ModBus reçue</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Voici la dernière partie du code pour le ModBus en VB.<br />
<span id="more-4113"></span></p>
<pre class="brush: vbnet; gutter: false">    Public Function ReadDecoder(ByVal ligne As String)
        &#039;Passage de la trame en Array
        Dim MyBytes As Array = Split(ligne, &quot;/&quot;)
        Dim i, partie1, partie2 As Integer
        Dim grille As ListView
        Dim ReponseValeur As String
        Dim MyValue As Array

        &#039;Remplissage table
        Dim _AliasDBData As New GTCDataSet.AliasDBDataTable
        Dim _AliasDBAdapter As New GTCDataSetTableAdapters.AliasDBTableAdapter
        _AliasDBAdapter.Fill(_AliasDBData)

        If MyBytes(1) = &quot;&quot; Then &#039;Erreur de retour Trame
            Return 0
        Else &#039;Pas d&#039;erreur
            For i = 4 To UBound(MyBytes) - 1
                If i / 2 = Int(i / 2) Then &#039;nombre pair

                    partie1 = MyBytes(i - 1)
                    partie2 = MyBytes(i)

                End If
            Next i
        End If
        Return 0
    End Function</pre>
<p>La trame ModBus de retour est composé de plusieurs données :</p>
<p>{num esclave} {fonction} {nbr de valeurs} {valeur 1, partie 1} {valeur 1, partie 2}&#8230;{CRC1}{CRC2}</p>
<p>Pour avoir valeur 1 en entier, il faut combiner les deux parties en hexadécimale, puis reconvertir en décimal. C&rsquo;est pour cette raison qu&rsquo;on récupère les nombres paires et que pour chaque « i » pair, on récupère deux valeurs.</p>
<p>La traitement des données est à votre charge. Mais par exemple, quand vous demandez en trame X mots à partir de l’adresse Y, vous savez que pour i = 4, adresse = Y.</p>
<p>Si vous avez besoin d&rsquo;infos supplémentaires, n&rsquo;hésitez pas à demander.</p>
<p>Cet article <a href="https://garikover.com/decodage-de-trame-modbus-recue/">Décodage de trame ModBus reçue</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/decodage-de-trame-modbus-recue/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4113</post-id>	</item>
		<item>
		<title>Constructeurs de trame ModBus</title>
		<link>https://garikover.com/constructeurs-de-trame-modbus/</link>
					<comments>https://garikover.com/constructeurs-de-trame-modbus/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 22 Feb 2013 09:50:32 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[crc]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[vb]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4060</guid>

					<description><![CDATA[<p>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 [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/constructeurs-de-trame-modbus/">Constructeurs de trame ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>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.<span id="more-4060"></span></p>
<p>On commence avec les trames de lecture :</p>
<pre class="brush: vbnet; gutter: false">    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

        &#039;Decoupage adresse
        s1 = Microsoft.VisualBasic.Right(Hex(startaddress), 2)
        s2 = Replace(Hex(startaddress), s1, &quot;&quot;)
        If s2 = &quot;&quot; Then
            sa2 = 0
        Else
            sa2 = &quot;&amp;h&quot; &amp; s2
        End If
        sa1 = &quot;&amp;h&quot; &amp; s1

        &#039;Decoupage nombre registres
        s1 = Microsoft.VisualBasic.Right(Hex(nbregisters), 2)
        s2 = Replace(Hex(nbregisters), s1, &quot;&quot;)
        If s2 = &quot;&quot; Then
            ss2 = 0
        Else
            ss2 = &quot;&amp;h&quot; &amp; s2
        End If
        ss1 = &quot;&amp;h&quot; &amp; s1

        &#039;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</pre>
<p>Pour cette fonction, vous l&rsquo;aurez remarqué, on a besoin de 3 paramètres :</p>
<ol>
<li>La fonction « func » qui peut prendre comme valeur 3 ou 4 (ou autre mais plus rare)</li>
<li>L&rsquo;adresse de départ « startaddress » qui indique par quel registre on commence (fonction de la machine)</li>
<li>Le nombre de registres « nbregisters » (c&rsquo;est explicite)</li>
</ol>
<p>La fonction <a href="https://garikover.com/le-crc16-en-modbus/">AddCRC16</a> est aussi nécessaire pour le fonctionnement du constructeur, ainsi que de la Form1 qui contient le numéro d&rsquo;esclave de la machine.</p>
<p>Le constructeur suivant est plus simple d&rsquo;utilisation :</p>
<pre class="brush: vbnet; gutter: false">    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

        &#039;Decoupage de Value
        s1 = Microsoft.VisualBasic.Right(Hex(valeur), 2)
        s2 = Replace(Hex(valeur), s1, &quot;&quot;)
        If s2 = &quot;&quot; Then
            ss2 = 0
        Else
            ss2 = &quot;&amp;h&quot; &amp; s2
        End If
        ss1 = &quot;&amp;h&quot; &amp; s1

        &#039;Decoupage adresse
        s1 = Microsoft.VisualBasic.Right(Hex(address), 2)
        s2 = Replace(Hex(address), s1, &quot;&quot;)
        If s2 = &quot;&quot; Then
            sa2 = 0
        Else
            sa2 = &quot;&amp;h&quot; &amp; s2
        End If
        sa1 = &quot;&amp;h&quot; &amp; s1

        &#039;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</pre>
<p>Les deux paramètres sont très simples :</p>
<ol>
<li>« address » indique le registre à modifier</li>
<li>« valeur » la valeur à appliquer à ce registre</li>
</ol>
<p>Les pré-requis sont les mêmes que pour l&rsquo;autre constructeurs.</p>
<p>C&rsquo;est tout pour aujourd&rsquo;hui, dans le prochain épisode, vous verrez&#8230;. d&rsquo;autres choses, mais je ne sais pas encore quoi.</p>
<p>Cet article <a href="https://garikover.com/constructeurs-de-trame-modbus/">Constructeurs de trame ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/constructeurs-de-trame-modbus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4060</post-id>	</item>
		<item>
		<title>Le CRC16 en ModBus</title>
		<link>https://garikover.com/le-crc16-en-modbus/</link>
					<comments>https://garikover.com/le-crc16-en-modbus/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 08 Feb 2013 08:38:14 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[crc]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[pc]]></category>
		<category><![CDATA[vb]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4024</guid>

					<description><![CDATA[<p>Quand on parle de communication entre une machine et un PC (ou un automate), c&#8217;est un dialogue en question/réponse. Mais si on peut envoyer n&#8217;importe quoi, il faut quand même que la machine comprenne en quelle langue on parle et comment décoder la trame. Pour ce faire, on utilise le CRC (Contrôle de redondance cyclique) [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/le-crc16-en-modbus/">Le CRC16 en ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Quand on parle de communication entre une machine et un PC (ou un automate), c&rsquo;est un dialogue en question/réponse. Mais si on peut envoyer n&rsquo;importe quoi, il faut quand même que la machine comprenne en quelle langue on parle et comment décoder la trame. Pour ce faire, on utilise le CRC (Contrôle de redondance cyclique) et il en existe plusieurs en fonction du type de codage utilisé (8, 16 ou 32 bits) pour la communication.<span id="more-4024"></span></p>
<p>Le plus souvent, on utilise un CRC16, c&rsquo;est le système le plus courant, l&rsquo;autre étant le 32 bits (CRC32).</p>
<p>Le calcul du CRC fait appel à des notions de programmation logique avec des OR, XOR, AND et XAND&#8230; autant dire que si on ne connait pas c&rsquo;est le bordel, et même moi qui connait le principe je n&rsquo;arrive pas à le traduire en code. Ci dessous vous trouverez deux fonctions, CRC16 et AddCRC16 :</p>
<ul>
<li>CRC16 : renvoie un tableau contenant le bit de poids fort et le bit de poids faible en fonction d&rsquo;une trame sans CRC en Byte().</li>
<li>AddCRC16 : corrige la trame envoyé sans CRC en Byte() en rajoutant le CRC à la fin.</li>
</ul>
<p>Quand on souhaite envoyer une trame, on a souvent besoin d&rsquo;ajouter le CRC après calcul quand le trame est variable, d&rsquo;où la modification de la fonction CRC16 (qui n&rsquo;est pas de moi) en AddCRC16 (que j&rsquo;ai adapté) qui permet de restituer une trame exploitable immédiatement.</p>
<pre class="brush: vbnet; gutter: false">Function CRC16(ByVal data() As Byte) As Array
        Dim CRC16Lo As Byte, CRC16Hi As Byte &#039;CRC register
        Dim CL As Byte, CH As Byte &#039;Polynomial codes &amp; HA001
        Dim SaveHi As Byte, SaveLo As Byte
        Dim i As Integer
        Dim Flag As Integer
        Dim ReturnData(2) As Byte

        CRC16Lo = &amp;HFF
        CRC16Hi = &amp;HFF
        CL = &amp;H1
        CH = &amp;HA0

        For i = 0 To UBound(data)
            CRC16Lo = CRC16Lo Xor data(i) &#039;for each data and CRC register XOR

            For Flag = 0 To 7
                SaveHi = CRC16Hi
                SaveLo = CRC16Lo
                CRC16Hi = CRC16Hi  2 &#039;peak shift to the right one
                CRC16Lo = CRC16Lo  2 &#039;shift to the right a low

                If ((SaveHi And &amp;H1) = &amp;H1) Then &#039;If the high byte last one for a
                    CRC16Lo = CRC16Lo Or &amp;H80 &#039;then the low byte shifted to the right after the meeting in front of a
                End If &#039;Otherwise, auto-fill 0

                If ((SaveLo And &amp;H1) = &amp;H1) Then &#039;If the LSB is 1, then XOR with the polynomial codes
                    CRC16Hi = CRC16Hi Xor CH
                    CRC16Lo = CRC16Lo Xor CL
                End If
            Next Flag
        Next i

        ReturnData(0) = CRC16Hi &#039;CRC high
        ReturnData(1) = CRC16Lo &#039;CRC low
        Return ReturnData
    End Function</pre>
<p>Fonction suivante&#8230;</p>
<pre class="brush: vbnet; gutter: false">Function AddCRC16(ByVal data() As Byte) As Byte()
        Dim CRC16Lo As Byte, CRC16Hi As Byte &#039;CRC register
        Dim CL As Byte, CH As Byte &#039;Polynomial codes &amp; HA001
        Dim SaveHi As Byte, SaveLo As Byte
        Dim i As Integer
        Dim Flag As Integer
        &#039;Dim ReturnData(2) As Byte

        CRC16Lo = &amp;HFF
        CRC16Hi = &amp;HFF
        CL = &amp;H1
        CH = &amp;HA0

        For i = 0 To UBound(data)
            CRC16Lo = CRC16Lo Xor data(i) &#039;for each data and CRC register XOR

            For Flag = 0 To 7
                SaveHi = CRC16Hi
                SaveLo = CRC16Lo
                CRC16Hi = CRC16Hi  2 &#039;peak shift to the right one
                CRC16Lo = CRC16Lo  2 &#039;shift to the right a low

                If ((SaveHi And &amp;H1) = &amp;H1) Then &#039;If the high byte last one for a
                    CRC16Lo = CRC16Lo Or &amp;H80 &#039;then the low byte shifted to the right after the meeting in front of a
                End If &#039;Otherwise, auto-fill 0

                If ((SaveLo And &amp;H1) = &amp;H1) Then &#039;If the LSB is 1, then XOR with the polynomial codes
                    CRC16Hi = CRC16Hi Xor CH
                    CRC16Lo = CRC16Lo Xor CL
                End If
            Next Flag
        Next i

        &#039;Agrandissement du data pour mettre 2 paramètres supplémentaires
        ReDim Preserve data(UBound(data) + 2)

        &#039;Stock le CRC
        data(UBound(data) - 1) = Convert.ToByte(CRC16Lo)
        data(UBound(data)) = Convert.ToByte(CRC16Hi)

        Return data
    End Function</pre>
<p>Bien sur il faut quand même créer la trame pour lui ajouter le CRC. Dans le prochain chapitre, je donnerais deux fonctions pour créer des trames de lecture et d&rsquo;écriture qui font justement appellent à la fonction AddCRC16.</p>
<p>Cet article <a href="https://garikover.com/le-crc16-en-modbus/">Le CRC16 en ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/le-crc16-en-modbus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4024</post-id>	</item>
		<item>
		<title>Recevoir une trame en ModBus</title>
		<link>https://garikover.com/recevoir-une-trame-en-modbus/</link>
					<comments>https://garikover.com/recevoir-une-trame-en-modbus/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 01 Feb 2013 08:47:39 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[logiciel]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[vb]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4009</guid>

					<description><![CDATA[<p>Une fois qu&#8217;on sait ouvrir un port série et y envoyer des infos, il faut s&#8217;attendre à recevoir des infos de la part de la machine. Pour comprendre ça, on va voir un petit court de ModBus. Le principe est assez simple finalement, quand on envoie un message à la machine, et transmet sa réponse [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/recevoir-une-trame-en-modbus/">Recevoir une trame en ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Une fois qu&rsquo;on sait ouvrir un port série et y envoyer des infos, il faut s&rsquo;attendre à recevoir des infos de la part de la machine. Pour comprendre ça, on va voir un petit court de ModBus.<span id="more-4009"></span></p>
<p>Le principe est assez simple finalement, quand on envoie un message à la machine, et transmet sa réponse qui contient ce qu&rsquo;on lui a demandé. Une chaîne standard de modbus contient diverses infos, la trame « question » a généralement une longueur fixe, alors que la réponse dépend de la question.</p>
<p style="text-align: center;"><em>Question : {adresse machine} {fonction lecture/ecriture} {adresse départ lecture} {nombre de registre} {CRC}</em></p>
<p>L&rsquo;adresse machine, c&rsquo;est son identifiant dans le cas où il y a plusieurs appareils ModBus sur le même réseau, la fonction permet de lire ou d&rsquo;écrire des registres. L&rsquo;adresse départ est la case par laquelle on commence et on prend autant de case que demandé après. Le CRC est particulier, c&rsquo;est une valeur calculer en fonction des valeurs précités pour confirmer à la machine qu&rsquo;on envoie des données viables.</p>
<p>Dans beaucoup de cas, le CRC est calculé par un logiciel en dur, donc pas besoin de la calculer.</p>
<p>Voici un exemple de trame : <span style="color: #ff0000;">01</span> 04 <span style="color: #0000ff;">00 00</span> <span style="color: #339966;">00 14</span> <span style="color: #ff00ff;">F0 H5</span></p>
<p>Là je lis sur la machine « 01 », avec la fonction « 04 », 20 cases (le « 00 14 » est en hexadécimal) à partir de 00. « F0 H5 » correspond au CRC.</p>
<p>La principale difficulté est de comprendre le codage de la trame à envoyer et de savoir comment recevoir les données. Vous avez sans doute remarquer que certaines valeurs sont codées sur 2 bits « 00 00 » et « 00 14 », alors que la fonction et l&rsquo;esclave sont codés sur 1 bit.</p>
<p>Mais je ne vais pas faire durer le suspens plus longtemps, voici le code de réception des données.</p>
<pre class="brush: vb; gutter: false">Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
 Dim ByteArr(SerialPort1.ReadBufferSize) As Byte
 Dim NbBytesRecu As Integer
 Dim i As Integer
 Dim BytesEnString As String = &quot;&quot;

&#039;Tempo pour laisser le temps à la trame d&#039;arriver
 Threading.Thread.Sleep(200)

&#039;Nombre de bytes reçus
 NbBytesRecu = SerialPort1.Read(ByteArr, 0, SerialPort1.ReadBufferSize)

&#039;Chainage des bytes reçus
 For i = 0 To NbBytesRecu - 1
 BytesEnString = BytesEnString &amp; ByteArr(i) &amp; &quot;/&quot;
 Next

&#039;A ce niveau la chaine BytesEnString contient toutes les valeurs retour de trame séparées d&#039;un &quot;/&quot;

End Sub</pre>
<p>C&rsquo;est un système événement qui se déclenche automatiquement à chaque arrivé d&rsquo;information. J&rsquo;ai épuré la véritable fonction que j&rsquo;utilise car elle contient des données sensibles, mais également un système d&rsquo;espion et un système de cycle.</p>
<p>Le cycle me permet en cas de case « cycle » coché, de renvoyer une trame quand le traitement de la trame reçue est terminé. Du coup a chaque fois que j&rsquo;ai fini de traiter la réponse, je repose la question pour revérifier les données.</p>
<p>L&rsquo;espion quant à lui me permet juste d&rsquo;afficher dans une fenêtre les trames que je reçois pour les décoder manuellement au besoin.</p>
<p>La trame de retour se compose ainsi :</p>
<p style="text-align: center;"><em>Réponse : {adresse machine} {fonction lecture/ecriture} {nombre de registre} {registre 0} {registre 1} &#8230; {registre X} {CRC}</em></p>
<p>Si j&rsquo;ai demandé trois registres dans ma question à la machine 1, le retour sera : 01 04 03 <span style="color: #ff00ff;">00 45</span> <span style="color: #3366ff;">06 F4</span> <span style="color: #ff0000;">00 0A</span> CRC</p>
<p>Le CRC renvoyé sera différent que celui que vous avez transmis puisqu&rsquo;il est recalculé à chaque question et à chaque réponse. Les trois registres demandés, à partir de l&rsquo;adresse X sont donc « 00 45 », « 06 F4 » et « 00 0A ». A vous de retravailler les valeurs pour obtenir des données concrètes.</p>
<p>Dans le prochain chapitre, je vous donnerais quelques fonctions et astuce pour traiter vos données.</p>
<p>Cet article <a href="https://garikover.com/recevoir-une-trame-en-modbus/">Recevoir une trame en ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/recevoir-une-trame-en-modbus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4009</post-id>	</item>
		<item>
		<title>Envoyer une trame en ModBus</title>
		<link>https://garikover.com/envoyer-une-trame-en-modbus/</link>
					<comments>https://garikover.com/envoyer-une-trame-en-modbus/#comments</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Mon, 21 Jan 2013 15:54:28 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[défi]]></category>
		<category><![CDATA[modbus]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=3982</guid>

					<description><![CDATA[<p>La dernière fois que j&#8217;ai traité de Visual Basic, j&#8217;ai donné le code pour ouvrir un port COM de notre choix. Maintenant que le port COM est ouvert, l&#8217;étape suivante est de poser une question à la machine. Il vous faudra un bouton (btnSend) pour envoyer la trame. Private Sub btnSend_Click_1(ByVal sender As System.Object, ByVal [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/envoyer-une-trame-en-modbus/">Envoyer une trame en ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>La dernière fois que j&rsquo;ai traité de Visual Basic, j&rsquo;ai donné le code pour <a href="https://garikover.com/ouvrir-un-port-serie-en-vb/">ouvrir un port</a> COM de notre choix. Maintenant que le port COM est ouvert, l&rsquo;étape suivante est de poser une question à la machine.<span id="more-3982"></span></p>
<p>Il vous faudra un bouton (btnSend) pour envoyer la trame.</p>
<pre class="brush: vbnet; gutter: false">    Private Sub btnSend_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
        Dim ByteArr As Byte()

        ByteArr = New Byte() {Convert.ToByte(NumEsclave), _ &#039;numéro de l&#039;esclave
Convert.ToByte(FonctionModbus), _ &#039;fonction de lecture modbus
0, Convert.ToByte(0), _ &#039;Adresse de démarreg
0, Convert.ToByte(20), _ &#039;nombre de mots a partir de l&#039;adresse
Convert.ToByte(&amp;HF0), Convert.ToByte(&amp;H5)} &#039;CRC
        SerialPort1.Write(ByteArr, 0, ByteArr.Length)
        Threading.Thread.Sleep(200)
    End Sub</pre>
<p>Le CRC se calcule, mais pour commencer, je conseille de créer une trame en dur avec des valeurs prédéfinies.</p>
<p>N&rsquo;hésitez pas a poser des questions, ou à demander des détails. Dans le prochain exemple, on verra la réception des données.</p>
<p>Cet article <a href="https://garikover.com/envoyer-une-trame-en-modbus/">Envoyer une trame en ModBus</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/envoyer-une-trame-en-modbus/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3982</post-id>	</item>
		<item>
		<title>Ouvrir un port série en VB</title>
		<link>https://garikover.com/ouvrir-un-port-serie-en-vb/</link>
					<comments>https://garikover.com/ouvrir-un-port-serie-en-vb/#comments</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 11 Jan 2013 07:16:20 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[défi]]></category>
		<category><![CDATA[logiciel]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[vb]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=3962</guid>

					<description><![CDATA[<p>Pendant de longues heures, j&#8217;ai cherché une solution à ce problème. A force de recouper plusieurs dizaines de codes, de fonctions, j&#8217;ai établis le code suivant. J&#8217;ai prévu une suite d&#8217;article pas forcément passionnante pour ceux qui n&#8217;y pipent rien, mais ô combien utile pour ceux qui cherches ce genre de chose. Ce premier code [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/ouvrir-un-port-serie-en-vb/">Ouvrir un port série en VB</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Pendant de longues heures, j&rsquo;ai cherché une solution à ce problème. A force de recouper plusieurs dizaines de codes, de fonctions, j&rsquo;ai établis le code suivant. J&rsquo;ai prévu une suite d&rsquo;article pas forcément passionnante pour ceux qui n&rsquo;y pipent rien, mais ô combien utile pour ceux qui cherches ce genre de chose.<span id="more-3962"></span></p>
<p>Ce premier code concerne le chargement de la Form1. Il vous faudra trois Combobox (cmbPort, cmbParity et cmbBaud), un bouton de connection (btnConnect) et un bouton de deconnection (btnDisconnect).</p>
<pre class="brush: vb; gutter: false">Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        btnConnect.Enabled = True
        btnDisconnect.Enabled = False
        btnSend.Enabled = False

        Dim myPort As Array = IO.Ports.SerialPort.GetPortNames() &#039;Récupère tous les ports COM disponibles

        &#039;Inclusion des Baud standard
        cmbBaud.Items.Add(9600)
        cmbBaud.Items.Add(19200)
        cmbBaud.Items.Add(38400)
        cmbBaud.Items.Add(57600)
        cmbBaud.Items.Add(115200

        &#039;Inclusion des parités standard
        cmbParity.Items.Add(&quot;Even&quot;)
        cmbParity.Items.Add(&quot;Odd&quot;)
        cmbParity.Items.Add(&quot;None&quot;)</pre>
<pre class="brush: vb; gutter: false">End Sub</pre>
<pre class="brush: vb; gutter: false">Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click

        &#039;Sécurité si le port est déjà ouvert
        If SerialPort1.IsOpen = True Then
            MsgBox(&quot;Port &quot; &amp; SerialPort1.PortName &amp; &quot; déjà ouvert. Communication en court.&quot;, vbCritical)
            Exit Sub
        End If

        SerialPort1.PortName = cmbPort.Text
        SerialPort1.BaudRate = cmbBaud.Text 

        &#039;Selection de parité
        If cmbParity.Text = &quot;Even&quot; Then
            SerialPort1.Parity = IO.Ports.Parity.Even
        ElseIf cmbParity.Text = &quot;Odd&quot; Then
            SerialPort1.Parity = IO.Ports.Parity.Odd
        ElseIf cmbParity.Text = &quot;None&quot; Then
            SerialPort1.Parity = IO.Ports.Parity.None
        Else
            MsgBox(&quot;Parité non définie.&quot;)
            Exit Sub
        End If

        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.DataBits = 8

        Try
            SerialPort1.Open()
        Catch ex As Exception
            MsgBox(&quot;Vérifiez les paramètres de connection ou qu&#039;un autre logiciel ne soit pas déjà en communication avec l&#039;appareil&quot;)
            Exit Sub
        End Try

        If SerialPort1.IsOpen = True Then
            btnConnect.Enabled = False
            btnDisconnect.Enabled = True
            btnSend.Enabled = True
        Else
            MsgBox(&quot;Le Port &quot; &amp; SerialPort1.PortName &amp; &quot; n&#039;a pas pu être ouvert. Vérifiez les paramètres de connection.&quot;, vbCritical)
        End If
    End Sub</pre>
<p>Dans une autre partie, je publierai un code pour envoyer une trame Modbus RS232 à un automate.</p>
<p>Cet article <a href="https://garikover.com/ouvrir-un-port-serie-en-vb/">Ouvrir un port série en VB</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/ouvrir-un-port-serie-en-vb/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3962</post-id>	</item>
	</channel>
</rss>
