Bonjour, vu que ce que je voulais faire est fait, je partage ce que j'ai appris, tout en sachant que les codes ne sont pas optimisé, et que cela pourra paraitre 'bancale' pour un pro
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Il y a surement plus simple.
@Cyril : pour la com, drivers MODBUS de chez Schneider (sur le PC), et pour envoyer les requêtes la classe SerialPort en vb.net (sachant qu'avec l'adaptateur USB TSXCUSB485, on ouvre un port COM, donc j'ai dialogué via ce port COM (le 7 pour moi))
Explications :
Config de l'automate :
Voie 0 :
Code : Tout sélectionner
Fonction métier : Liaison Modbus
Type de voie : Voie intégrée
Tâche : MAST
Type : Esclave
Vitesse de transmission : 9 600 bits/s Données : 8 bits
Stop : 1 bit Parité : Aucune
Délai inter-trames : 4 ms
Numéro d'esclave : 1
Ligne physique : RS485
Bref un config en esclave.
Config des drivers :
On fait la même config
Code : Tout sélectionner
Ne pas cocher 'use modem'
COM PORT : COM XX (TSXUSB485 [ready]
où le XX est le port COM à utiliser!
Stop bit : 1
Parity NONE
MOde (data bits) : RTU 8 bits
et on valide
La connexion est faite, il ne reste plus qu'à échanger
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Pour ce faire j'ai utilisé le SerialPort en vb.net .
J'ai fait une page, avec un bouton "envoyer", des TextBox qui affiche ce que je recoit (le message d'envois est toujours le même, à vous de le changer
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Perso j'ai lu 20 mots depuis le mot 0, soit la trame {Convert.ToByte(&H1), Convert.ToByte(&H3), Convert.
ToByte(&H0), Convert.ToByte(&H0), Convert.ToByte(&H0), Convert.ToByte(&HC), Convert.
ToByte(&H45), Convert.ToByte(&HCF)} envoyée .
Côté Vb.net :
Au début de la classe j'ai mis :
Code : Tout sélectionner
Dim WithEvents ADRport As SerialPort = New _
System.IO.Ports.SerialPort("COM7", _
9600, _
Parity.None, _
8, _
StopBits.One)
Soit les même config que l'automate et le driver. Mon COM7, c'est parce que mon driver m'indique que l'adaptateur est en COM7
Maintenant pour communiquer, on utiliser ADRport.
Code : Tout sélectionner
Dim buffer() As Byte = {Convert.ToByte(&H1), Convert.ToByte(&H3), Convert.
ToByte(&H0), Convert.ToByte(&H0), Convert.ToByte(&H0), Convert.ToByte(&HC), Convert.
ToByte(&H45), Convert.ToByte(&HCF)}
'On envois le message
ADRport.Write(buffer, 0, 8)
'On attends que la commande soit envoyée
Thread.Sleep(50)
'On défini le delais d'attente avant un dépassement
ADRport.ReadTimeout = 100
On envoit donc avec ADRPort.Write notre trame , le 8 étant le nombre d'octets envoyé (c'est toujours 8 en modbus)
On attends 50ms que le message s'envois, le timeout est le delais de réponse.
Code : Tout sélectionner
'tableau contenant ce que l'on recoit
Dim ByteArr(ADRport.ReadBufferSize) As Byte
Dim NbBytesRecu As Integer
'On essaye de lire le message recu. Si on n'y arrive pas, on affiche un
message
Try
NbBytesRecu = ADRport.Read(ByteArr, 0, ADRport.ReadBufferSize)
Catch generatedExceptionName As TimeoutException
MsgBox("L’envoi ne s’est pas fait, vérifier vos paramètres", 4096 + 16,
"ATTENTION")
Exit Sub
End Try
Le message reçu est stocké dans ByteArr qui est un tableau de la taille du message reçu.
Le try/catch permet d'afficher un message si aucune trame n'a été reçue en réponse (il y a donc eu un soucis d'envois)
il reste plus qu'à afficher chaque éléments de byteArr dans une textbox par exemple, ou alors directement utiliser les valeurs.
Je n'ai pas fait de vérification sur la réponse que me fait l'automate. Pour cela il faut vérifier que le CRC16 de la trame reçue est bon. Je n'ai pas voulu le faire car pour moi c'était juste "histoire de voir"
Je vous conseil de lire les documents sur le modbus pour savoir les trames à envoyer (pour lire/écrire, les mots, les CRC16, etc...).
Voilà, si vous avez des questions, j'y répondrais dans la mesure de mes connaissances, sachant que je suis débutant en VB.net (et en modbus)
EDIT: désolé pour les bouts de code qui ne sont pas visible directement, il faut appuyer sur EXPAND