<?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>crc Archives - Garikover.com</title>
	<atom:link href="https://garikover.com/tag/crc/feed/" rel="self" type="application/rss+xml" />
	<link>https://garikover.com/tag/crc/</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>crc Archives - Garikover.com</title>
	<link>https://garikover.com/tag/crc/</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>
	</channel>
</rss>
