<?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>Programmation Archives - Garikover.com</title>
	<atom:link href="https://garikover.com/category/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>https://garikover.com/category/programmation/</link>
	<description>Le monde d&#039;un Paladin</description>
	<lastBuildDate>Mon, 01 Aug 2016 07:11:21 +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>Programmation Archives - Garikover.com</title>
	<link>https://garikover.com/category/programmation/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">109537588</site>	<item>
		<title>Tuto POO en Vb.NET : La suite</title>
		<link>https://garikover.com/tuto-poo-en-vb-net-la-suite/</link>
					<comments>https://garikover.com/tuto-poo-en-vb-net-la-suite/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Mon, 03 Feb 2014 14:50:39 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[vb.net]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=5091</guid>

					<description><![CDATA[<p>Après un premier tuto assez simple, enfin j&#8217;espère, on sait déclarer et initialiser une classe, utiliser ses données et un peu les modifier. Nous allons maintenant voir comment accroître la puissance de la POO via diverses méthodes. Class Imbriquées Pour commencer, on va reprendre l&#8217;exemple de notre classe société. J&#8217;enlève volontairement le contenu de New() [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/tuto-poo-en-vb-net-la-suite/">Tuto POO en Vb.NET : La suite</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Après un <a title="Tuto POO en Vb.NET : La base" href="https://garikover.com/tuto-poo-en-vb-net/" target="_blank">premier tuto</a> assez simple, enfin j&rsquo;espère, on sait déclarer et initialiser une classe, utiliser ses données et un peu les modifier. Nous allons maintenant voir comment accroître la puissance de la POO via diverses méthodes.<span id="more-5091"></span></p>
<h2>Class Imbriquées</h2>
<p>Pour commencer, on va reprendre l&rsquo;exemple de notre classe société. J&rsquo;enlève volontairement le contenu de New() car il ne sera pas nécessaire d&rsquo;y revenir et je considère que vous savez initialiser une class.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    &#039;Déclaration des variables
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Adresse As String = &quot;&quot;
    Public CP As String = &quot;&quot;
    Public Ville As String = &quot;&quot;

    Sub New(ByVal id_societe As String)
        &#039;Initialisation de la class
    End Sub

End Class</pre>
<p>On admettra qu&rsquo;au delà de la fiche d&rsquo;identité d&rsquo;une société qui peut être intéressante, il nous faut également une classe Interlocuteur qui pourra contenir les informations de la personne concerné. Pour commencer une rajoute une class, rien de particulier là dedans.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    &#039;Déclaration des variables
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Adresse As String = &quot;&quot;
    Public CP As String = &quot;&quot;
    Public Ville As String = &quot;&quot;

    Sub New(ByVal id_societe As Integer)
        &#039;Initialisation de la class
    End Sub

End Class

Public Class Interlocuteur
    &#039;Déclaration des variables
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Prenom As String = &quot;&quot;
    Public Telephone As String = &quot;&quot;

    Sub New(ByVal id_interlocuteur As integer)
        &#039;Initialisation de la class
    End Sub

End Class</pre>
<p>Alors comment faire pour compléter la class Interlocuteur quand on appelle la class Société et les relier ? On va partir du principe qu&rsquo;on veut avoir les données du directeur pour chaque instance de Société qu&rsquo;on créé, et que dans la base de données des Sociétés il existe un champs id_directeur qui contient le numéro de l&rsquo;interlocuteur.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    &#039;Déclaration des variables
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Adresse As String = &quot;&quot;
    Public CP As String = &quot;&quot;
    Public Ville As String = &quot;&quot;
    Public Directeur As Interlocteur

    Sub New(ByVal id_societe As Integer)
        &#039;Initialisation de la class
        Directeur = New Interlocuteur(id_directeur)
    End Sub

End Class

Public Class Interlocuteur
    &#039;Déclaration des variables
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Prenom As String = &quot;&quot;
    Public Telephone As String = &quot;&quot;

    Sub New(ByVal id_interlocuteur As integer)
        &#039;Initialisation de la class
    End Sub

End Class</pre>
<p>Donc on a déclaré la class Interlocuteur comme variable de la class Société. Mais maintenant, comment on utilise les valeurs ?</p>
<pre class="brush: vbnet; gutter: false">Dim Client As New Societe()

Client.Nom &#039;Renvoie le nom de la société
Client.Directeur.Nom &#039;Renvoie le nom du Directeur</pre>
<p>Simple non ?</p>
<h2>Méthodes et attributs</h2>
<p>Derrière ces deux appellations se cachent une seule est unique chose, les fonctions. Dans une class, on peut déclarer une fonction (ou sub) qui sera appelée pour une action particulière. Alors pourquoi deux noms ? Simplement car : méthodes = private, attributs = public. Au final ça ne change pas grand chose sur leur utilisation si ce n&rsquo;est qu&rsquo;en « private », la fonctione ne sera pas accessible en dehors de la class.</p>
<p>Voici un exemple de fonction.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    &#039;Déclaration des variables
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Adresse As String = &quot;&quot;
    Public CP As String = &quot;&quot;
    Public Ville As String = &quot;&quot;
    Public Directeur As Interlocteur

    Sub New(ByVal id_societe As Integer)
        &#039;Initialisation de la class
        Directeur = New Interlocuteur(id_directeur)
    End Sub

    Sub Sauvegarde(ByVal id_societe As Integer)
        &#039;Cette fonction sauvegarde les modifications dans la base de données
    End Sub

End Class</pre>
<p>Pour appeler ma sauvegarde c&rsquo;est très simple.</p>
<pre class="brush: vbnet; gutter: false">Client.Sauvegarde()</pre>
<p>Rien n’empêche de passer des paramètres bien sur donc la seule différence c&rsquo;est la manière dont on va appeler cette fonction.</p>
<h2>Conclusion</h2>
<p>C&rsquo;est la fin de ce tuto sur la POO en VB.Net. J&rsquo;espère que j&rsquo;ai été assez clair, n&rsquo;hésitez pas à poser des questions s&rsquo;il vous manque des éléments.</p>
<p>Cet article <a href="https://garikover.com/tuto-poo-en-vb-net-la-suite/">Tuto POO en Vb.NET : La suite</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/tuto-poo-en-vb-net-la-suite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5091</post-id>	</item>
		<item>
		<title>Tuto POO en Vb.NET : La base</title>
		<link>https://garikover.com/tuto-poo-en-vb-net/</link>
					<comments>https://garikover.com/tuto-poo-en-vb-net/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Mon, 27 Jan 2014 07:08:18 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[vb.net]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=5078</guid>

					<description><![CDATA[<p>Le problème qu&#8217;on rencontre le plus souvent quand on souhaite apprendre un concept de programmation, c&#8217;est de trouver LE tuto qui montre tout ce qu&#8217;on doit savoir et surtout qui montre comment programmer sans avoir spécialement de grosses connaissances ou encore s&#8217;envahir l&#8217;esprit avec un vocabulaire trop pointu. Donc voici un tuto allégé sur la [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/tuto-poo-en-vb-net/">Tuto POO en Vb.NET : La base</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le problème qu&rsquo;on rencontre le plus souvent quand on souhaite apprendre un concept de programmation, c&rsquo;est de trouver LE tuto qui montre tout ce qu&rsquo;on doit savoir et surtout qui montre comment programmer sans avoir spécialement de grosses connaissances ou encore s&rsquo;envahir l&rsquo;esprit avec un vocabulaire trop pointu. Donc voici un tuto allégé sur la Programmation Orientée Objet en VB.NET.<span id="more-5078"></span></p>
<h2>Problématique</h2>
<p>Alors pourquoi ne pas se satisfaire des tutos déjà présent sur internet ?</p>
<p>Pour le simple et bonne raison que je les trouve surchargés, sans réel intérêt dans le sens ou il explique des principes de base sans exemple très parlant. J&rsquo;ai été amené à faire pas mal de recherche post-tuto pour savoir comment on faisait ceci ou cela, qui sont des principes de base, mais rien de simple à trouver. Donc je réalise ce tuto avec un exemple qui marche (puisque je l&rsquo;utilise réellement en programmation).</p>
<h2>La POO ?</h2>
<p>La Programmation Orientée Objet est présente dans plusieurs langages de programmation et a pour objectif de faciliter le traitement des données. Elle présente pas mal d&rsquo;avantages et peu d&rsquo;inconvénient.</p>
<p>Actuellement en programmation, quand on veut obtenir une valeur à partir d&rsquo;une base de données, on fait une requête est on traite les informations au cas par cas. Or un des principes de base est de ne jamais répéter plusieurs fois un code identique. Si on a besoin d&rsquo;un même bout de code plusieurs fois, on créé une fonction pour le remplacer, ce qui facilite la maintenance du code.</p>
<p>L&rsquo;idée de la POO est de centraliser la gestion des données et de faciliter leur exploitation grâce à une formulation plus explicite.</p>
<p>Si on compare l&rsquo;avant et l&rsquo;après POO :</p>
<ul>
<li>Avant : Une multitude de boite qu&rsquo;on doit ouvrir au pied de biche pour en modifier le contenu</li>
<li>Après : une commode avec une infinité de tiroir et une jolie clé toute simple pour modifier le contenu</li>
</ul>
<h2>Vocabulaire</h2>
<p>Oui j&rsquo;ai dit qu&rsquo;on n&rsquo;allait pas aborder de vocabulaire très poussé, mais il en faut un minimum.</p>
<ul>
<li>La POO s&rsquo;articule autour des Class. Pour faire simple, il s&rsquo;agit d&rsquo;une fonction en plus poussée (c&rsquo;est notre commode).</li>
<li>Ensuite, chaque Class possède ses attributs qui ne sont que des variables avec une syntaxe particulière (ce sont nos tiroirs).</li>
<li>Les propriétés qui sont là pour accéder aux tiroirs attributs et les modifier (la clé du tiroir).</li>
<li>Et pour finir, les méthodes qui sont des sous-fonctions (c&rsquo;est l&rsquo;équivalent de la personne qui change le contenu des tiroirs).</li>
</ul>
<h2>Code</h2>
<h3>Déclaration de la Class</h3>
<p>Avant toute chose, histoire d&rsquo;avoir un code clair, on ouvre un nouveau module de Class et on la déclare. Cette syntaxe ne doit pas vous être étrangère car c&rsquo;est de cette manière qu&rsquo;est déclaré une UserForm.</p>
<pre class="brush: vbnet; gutter: false">Public Class MaClasse

End Class</pre>
<p>Alors ça peut paraître très simple, mais c&rsquo;est parce que ça l&rsquo;est. Mais on va entrer tout de suite dans le vif du sujet avec une classe assez simple à propos qui contient les informations d&rsquo;une société.</p>
<h3>Ajout des attribus (propriétés)</h3>
<p>Là on rajoute les attributs de la classe. Jusque là rien de bien compliqué puisqu&rsquo;on utilise la même méthode pour déclarer une variable Public.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    Public Nom As String
    Public Adresse As String
    Public CP As String
    Public Ville As String

End Class</pre>
<p>Jusque là ce ne sont que des choses déjà vu et connu mais qu&rsquo;on ne remarque pas forcément (voir ci-dessous).</p>
<h3>Le constructeur</h3>
<p>Tout comme une fonction, une classe s&rsquo;initialise quand on l&rsquo;appelle. Alors tout l’intérêt de cet appel est qu&rsquo;il peut intégrer des paramètres pour adapter les variables.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    Public Nom As String
    Public Adresse As String
    Public CP As String
    Public Ville As String

    Sub New(&lt;paramètres comme=&quot;&quot; n&#039;importe=&quot;&quot; quelle=&quot;&quot; fonction=&quot;&quot;&gt;)

    End Sub

End Class</pre>
<p>Vous avez déjà vu ce genre de structure avant, quand vous utilisez une Form dans un projet et des variables Public.</p>
<pre class="brush: vbnet; gutter: false">Public Class Form1

    Public Stockage As String

    Private Sub MaSub()

    End Sub

End Class</pre>
<p>Histoire de faire avancer le schmilblick, on va voir immédiatement comment utiliser le Constructeur en lui passant un paramètre. Ici, on va passer un identifiant unique de la société. On va également prévoir le cas où la base de donnée ne contient pas de société avec cet identifiant et utiliser des valeurs par défaut. Ça évite une erreur en cas d&rsquo;utilisation d&rsquo;une variable sans valeur.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    Public Id As Integer = 0
    Public Nom As String = &quot;&quot;
    Public Adresse As String = &quot;&quot;
    Public CP As String = &quot;&quot;
    Public Ville As String = &quot;&quot;

    Sub New(ByVal id_societe As String)
        &#039;On transforme id_client en membre de la classe
        Id = id_client
        Dim Dr As OleDbDataReader
        Dim Command As OleDbCommand
        Connection.Open()
        Command = New OleDbCommand(&quot;SELECT * FROM SOCIETE WHERE id_societe = &quot; &amp; id_societe &amp; &quot;;&quot;, Connection)
        Dr = Command.ExecuteReader
        While Dr.Read()
            Nom = Dr(&quot;nom&quot;).ToString
            Adresse = Dr(&quot;adresse&quot;).ToString
            CP = Dr(&quot;code_postal&quot;).ToString
            Ville = Dr(&quot;ville&quot;).ToString
        End While
        Connection.Close()
    End Sub

End Class</pre>
<h2> L&rsquo;utilisation dans le code</h2>
<p>Maintenant qu&rsquo;on a vu comment ça fonctionne, on va voir comment exploiter ces résultats.</p>
<pre class="brush: vbnet; gutter: false">&#039;Création d&#039;une instance &quot;client&quot;
Dim client As New Societe(id_client)</pre>
<p>Cette simple ligne permet d&rsquo;instancié le client. Donc pour reprendre l&rsquo;exemple de la commode à tiroir, <strong>client</strong> est notre commode. Donc comment utiliser ses tiroirs ? En fait c&rsquo;est très simple.</p>
<pre class="brush: vbnet; gutter: false">&#039;Création d&#039;une instance &quot;client&quot;
Dim client As New Societe(id_client)

&#039;On place le nom du client dans une TextBox
TextBox1.Text = client.Nom

&#039;On change le contenu d&#039;une valeur
client.Ville = TextBox2.Text</pre>
<p>Vous comprenez maintenant ? C&rsquo;est simple, propre, presque beau. Mais on peut encore allé bien plus loin en multipliant les instances. Si je souhaite avoir deux commodes, l&rsquo;une étant un client l&rsquo;autre un fournisseur&#8230;</p>
<pre class="brush: vbnet; gutter: false">&#039;Création d&#039;une instance &quot;client&quot;
Dim client As New Societe(id_client)

&#039;Création d&#039;une instance &quot;fournisseur&quot;
Dim fournisseur As New Societe(id_fournisseur)</pre>
<p>Le client et le fournisseur étant deux sociétés, ils contiennent les mêmes informations : Nom de société, adresse, ville, code postal&#8230; Donc ma class société est en fait un archétype que je peux remplir.</p>
<h2>Shared !</h2>
<p>Le dernier point de ce tuto est l&rsquo;utilisation de l&rsquo;option Shared. Cette option permet d&rsquo;utiliser la variable à laquelle elle a été rattachée sans avoir à instancié la class.</p>
<p>L&rsquo;exemple ci-dessous devrait vous éclairer.</p>
<pre class="brush: vbnet; gutter: false">Public Class Societe
    Public Shared Nom As String
    Public Ville As String

    Sub New()
    End Sub

End Class

Sub Instance()
    &#039;Initialise la class sans nom
    TextBox1.Text = Societe.Nom &#039;Fonctionne
    TextBox2.Text = Societe.Ville &#039;Ne Fonctionne Pas

    &#039;Fonctionne
    Dim client As New Societe(id)
    TextBox2.Text = client.Ville
End Sub</pre>
<h2>Conclusion</h2>
<p>C&rsquo;est la fin de la première partie du tuto POO. Pour le moment vous savez déclarer une Class, l&rsquo;initialiser via un <strong>constructeur</strong> et exploiter ses données.</p>
<p>Dans la prochaine partie, on verra les class imbriquées et les méthodes (si j&rsquo;en ai parlé au début).</p>
<p>Cet article <a href="https://garikover.com/tuto-poo-en-vb-net/">Tuto POO en Vb.NET : La base</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/tuto-poo-en-vb-net/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5078</post-id>	</item>
		<item>
		<title>Auto Pictures</title>
		<link>https://garikover.com/auto-pictures/</link>
					<comments>https://garikover.com/auto-pictures/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Wed, 15 Jan 2014 06:43:35 +0000</pubDate>
				<category><![CDATA[Addons]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[AutoTrackerAchievement]]></category>
		<category><![CDATA[film]]></category>
		<category><![CDATA[histoire]]></category>
		<category><![CDATA[jeu]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[voyage]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4954</guid>

					<description><![CDATA[<p>Comme le prouve mes deux plugins World of Warcraft AutoTrackerAchievement et CustomGear, j&#8217;aime bien quand les choses sont automatiques et qu&#8217;elles ne nécessitent que peu d&#8217;intervention de notre part. J&#8217;avais créé plusieurs plugins WordPress il y a quelques temps histoire de me faire la main. Il n&#8217;avait pas un impact si intéressant que ça, mais c&#8217;était [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/auto-pictures/">Auto Pictures</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Comme le prouve mes deux plugins World of Warcraft AutoTrackerAchievement et CustomGear, j&rsquo;aime bien quand les choses sont automatiques et qu&rsquo;elles ne nécessitent que peu d&rsquo;intervention de notre part. J&rsquo;avais créé plusieurs plugins WordPress il y a quelques temps histoire de me faire la main. Il n&rsquo;avait pas un impact si intéressant que ça, mais c&rsquo;était drôle. Aussi, je me suis mis à coder un nouveau plugin dans la même veine que le regretté CateGari (l&rsquo;affichage d&rsquo;image au début de chaque article) mais dans un genre nouveau.<span id="more-4954"></span></p>
<h2>L&rsquo;idée</h2>
<p>Lassé de la fonction upload de WordPress qui est assez lourde et surtout très pénible avec la multiplication des pains miniatures et des différents formats quand j&rsquo;upload une affiche de film ou une pochette de Cd ou de jeu vidéo, j&rsquo;ai créé <span style="text-decoration: underline;">Auto Pictures</span> afin de répondre à une problématique simple : ajouter automatiquement une image en début d&rsquo;article si le titre correspond.</p>
<p>Le gros plus de ce plugin, c&rsquo;est qu&rsquo;il gère tous les articles, donc pas besoin de rééditer à la main chaque article, il suffit de rajouter les images avec le bon nom sur le serveur.</p>
<h2>Première version</h2>
<p>Même si le développement ne m&rsquo;a pris que quelques heures sur quelques jours, je suis passé par plusieurs étapes de réflexions. Au départ, le plugin ne devait avoir aucune interface administration et simplement récupérer le nom de l&rsquo;article et de chercher l&rsquo;image correspondante.</p>
<p>Par exemple, l&rsquo;article « The Hobbit : un voyage inattendu » cherchait l&rsquo;image « the-hobbit-un-voyage-inattendu », avec plusieurs extensions possibles (jpg, jpeg, png, gif).</p>
<p>Vous avez compris que l&rsquo;idée est de charger via FTP l&rsquo;image déjà dimensionnée dans un dossier spécifique afin que l&rsquo;article se charge de lui même de l&rsquo;afficher. Si une image était déjà présente dans l&rsquo;article, aucune recherche n&rsquo;était faite.</p>
<h2>Seconde version</h2>
<p>Là, le plugin est fonctionnel, mais il manque quelque chose. Comment savoir si une image est belle et surtout si le nom correspond ?</p>
<p>J&rsquo;ai donc rajouté un bout de code qui indique juste après le titre d&rsquo;un article le nom de doit avoir l&rsquo;image histoire de faire un copier/coller. Mais comme c&rsquo;est très moche vis-à-vis du visiteur d&rsquo;avoir « image manquante », cette ligne ne s&rsquo;affiche que si on est connecté en tant qu&rsquo;administrateur.</p>
<h2>Troisième version</h2>
<p>Quand on rédige l&rsquo;article, on ne sait pas si l&rsquo;image est déjà présente. Du coup j&rsquo;ai simplement rajouté une petite fenêtre qui affiche l&rsquo;image si elle est trouvée ou qui affiche le nom qu&rsquo;elle devrait avoir. Aucune option sur cette <em>meta box</em> (c&rsquo;est le nom d&rsquo;une case administration sur wordpress), elle n&rsquo;a que vocation à affichage (pour le moment&#8230;).</p>
<h2>Quatrième version</h2>
<p>LA question ultime&#8230; Comment retrouver les articles qui n&rsquo;ont pas d&rsquo;image ?</p>
<p>LA réponse ultmie&#8230;. En faisant une vérification article par articles filtrés par catégorie.</p>
<p>Du coup, j&rsquo;ai créé une interface administrateur qui permet de consulter les images manquantes pour tous les articles. On peut bien sur filtrer sur une catégorie particulière et masquer les articles sont les images sont présentes sur le serveur. Petit plus, en cas d&rsquo;image manquante, un lien vers google avec recherche selon le titre de l&rsquo;article pour trouver notre image en un clique, et lien vers l&rsquo;image quand elle est présente.</p>
<h2>Cinquième version (avenir ?)</h2>
<p>L&rsquo;idéal serait que l&rsquo;interface d&rsquo;édition de l&rsquo;article (la meta box du début) permette de charger une image depuis le disque dur en la redimensionnant et en la renommant avec le bon nom. Mais ce n&rsquo;est pas pour tout de suite.</p>
<h2>Conclusion</h2>
<p>Au final, j&rsquo;ai l&rsquo;impression d&rsquo;avoir créé toute une interface de gestion qui me correspond mieux.</p>
<p>Au passage, je ferais un article sur le logiciel XnView qui permet de redimensionner des images à la volée (ce qui est très pratique avec ce plugin).</p>
<p>Cet article <a href="https://garikover.com/auto-pictures/">Auto Pictures</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/auto-pictures/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4954</post-id>	</item>
		<item>
		<title>[VB.NET] Le ContextMenuStrip</title>
		<link>https://garikover.com/vb-net-le-contextmenustrip/</link>
					<comments>https://garikover.com/vb-net-le-contextmenustrip/#respond</comments>
		
		<dc:creator><![CDATA[Garikover]]></dc:creator>
		<pubDate>Fri, 06 Dec 2013 06:54:19 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[contextmenustrip]]></category>
		<category><![CDATA[vb.net]]></category>
		<guid isPermaLink="false">http://paladin-world.com/?p=4836</guid>

					<description><![CDATA[<p>Je n&#8217;ai pas vocation à faire un tutorial complet sur le sujet, mais juste donner quelques éléments d&#8217;information sur ce magnifique control de VB.NET qui a sans doute été responsable de plusieurs crises d&#8217;hystéries et de calvities. La problématique que j&#8217;ai est de récupérer le nom du control sur lequel je fais un clique droit. [&#8230;]</p>
<p>Cet article <a href="https://garikover.com/vb-net-le-contextmenustrip/">[VB.NET] Le ContextMenuStrip</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Je n&rsquo;ai pas vocation à faire un tutorial complet sur le sujet, mais juste donner quelques éléments d&rsquo;information sur ce magnifique control de VB.NET qui a sans doute été responsable de plusieurs crises d&rsquo;hystéries et de calvities.<span id="more-4836"></span></p>
<p>La problématique que j&rsquo;ai est de récupérer le nom du <em>control</em> sur lequel je fais un clique droit. Après plusieurs heures de recherche, j&rsquo;ai trouvé un truc tout bête :</p>
<ol>
<li>Créer le ContextMenuStrip (CMS)</li>
<li>Assigner le CMS à tous les controls que vous souhaitez utiliser</li>
<li>Utiliser le code suivant</li>
</ol>
<pre class="brush: vbnet; gutter: false">Private Sub ContextMenuStrip1_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening

        &#039;Acquisition des références
        Dim c As Control = ContextMenuStrip1.SourceControl
        Dim tsi As ToolStripDropDownItem = ContextMenuStrip1.OwnerItem
        Dim nomControl As String = c.Name
        ContextMenuStrip1.Items.Clear()

        If nomControl = &quot;xxx&quot; Then

        ElseIf nomControl = &quot;yyy&quot; Then

        End If
        e.Cancel = False
    End Sub</pre>
<p>Cet article <a href="https://garikover.com/vb-net-le-contextmenustrip/">[VB.NET] Le ContextMenuStrip</a> est apparu en premier sur <a href="https://garikover.com">Garikover.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://garikover.com/vb-net-le-contextmenustrip/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4836</post-id>	</item>
		<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>
	</channel>
</rss>
