Ayant déjà communiqué avec quelques pont de pesage (pour camion), le nom me dit quelque chose.
Mais le faire en VBA, j'ai jamais fait.
Il faut déjà que tu sache quel est le format des données ainsi que le moyen de communication que tu veux utiliser.
Déjà comment accéder à la liaison (à supposer que tu as déjà connecté en physique l'équipement) :
Port COM,
si le composant "MSCOMM" est disponible ajoutes-le à ton projet VBA (dans les références), c'est le plus simple à gérer, il est juste limité de COM1 à COM16,
Sinon, j'ai trouvé ça : https://github.com/Serialcomms/Serial-Ports-in-VBA-new-for-2022 il faut lire la doc et importer le fichier "SERIAL_PORT_VBA.bas" je l'ai trouvé sur cette page : https://techcommunity.microsoft.com/t5/excel/serial-com-ports-in-excel-vba/td-p/3601929
Pour le TCP, il faut ajouter la référence Winsock à ton projet VBA, et ensuite le mettre sur une Form non afficher ou pas selon tes besoins.
N'ayant pas de Windows chez moi, je ne peux pas forcément être plus didactique, mais c'est déjà des pistes pour commencer.
Si tu as besoin de plus d'aide, il faudra donner les points de blocages et le protocole de communication.
Merci beaucoup pour ta réponse.
En fait, J'ai essayer avec le TCP/IP La connexion marche bien mais pas la récupération des données. voici le code que j'ai écris :
Option Explicit Sub ConnectMicrobalance() Dim ipAddress As String Dim portNumber As Integer Dim socketNumber As Integer Dim conn As Object Dim data As String ' Paramètres de connexion ipAddress = "192.168.2.112" ' Adresse IP de la microbalance portNumber = 8000 ' Numéro de port par défaut pour la communication Modbus TCP socketNumber = 139 ' Numéro du socket ' Création de l'objet de connexion Set conn = CreateObject("MSWinsock.Winsock") ' Configuration de la connexion With conn .RemoteHost = ipAddress .RemotePort = portNumber .LocalPort = socketNumber .Connect End With ' Vérification de la connexion If conn.State = 7 Then ' 7 correspond à l'état "Connected" ' Connexion réussie MsgBox "Connexion établie avec la microbalance." ' Fermeture de la connexion conn.Close Else ' Connexion échouée MsgBox "La connexion à la microbalance a échoué." End If ' Libération de l'objet de connexion Set conn = Nothing End Sub
Après pour le transfère de données je n'ai aucune idée surtout que je dois ajouter des commande MT-SCIS dans mon code pour demander à la microbalance d'envoyer les données.
Après, j'ai essayé avec le RS232 et comme avant la connexion marche toujours mais pas le transfère des données. J'ai essayé un code en Vb.Net mais aucun résultat. Voici le code VBA pour la connexion :
Private Sub CommandButton1_Click() 'Vider le buffer MSComm1.InBufferCount = 0 'choisir un port série MSComm1.CommPort = 3 ' 1 est le n° de port que vous pouvez modifier 'Paramétrage du port; les valeurs sont fournies par le constructeur de l'appareil. 'Ces valeurs peuvent être entrées ici (pas très "propre"!) 'ou dans une procédure d'initialisation (c'est mieux) 'ou dans la propriété "Setting" du contrôle 'L'idéal étant d'offrir à l'utilisateur la possibilité de changer ces valeurs à partir d'un menu "Réglage" 'La balance utilisée dans cet exemple requiert les valeurs suivantes: 1200 bauds, bit de parité, 7 bits de données, bit d'arrêt MSComm1.Settings = "9600,o,8,1" ' indique au contrôle qu'il doit lire 1 seul caractère 'ce caractère servira à repérer la stabilisation de la balance MSComm1.InputLen = 1 'ouvre le port MSComm1.PortOpen = True 'Boucle dans le vide tant que le caractère lu n'est pas un signe plus (+) Do While MSComm1.Input <> "+" Loop 'lecture sur le port des 5 1ers caractères et stockage dans la boite de dialogue et dans la feuille active MSComm1.InputLen = 5 Label1.Caption = MSComm1.Input ActiveCell.Value = CSng(Label1.Caption) ActiveCell.Offset(1, 0).Select 'ferme le port MSComm1.PortOpen = False End Sub
Et voici le code VB.Net :
Imports System.IO.Ports Public Class Form1 Dim _serialport As SerialPort Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim portName As String = "COM3" Dim baudRate As Integer = 9600 Dim parity As Parity = Parity.None Dim dataBits As Integer = 8 Dim stopBits As StopBits = StopBits.One _serialport = New SerialPort(portName, baudRate, parity, dataBits, stopBits) _serialport.Open() End Sub Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed _serialport.Close() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ''Envoyer la commande de demande de poids stable Dim cmd As String = "S " + vbCrLf 'cmd: "S " & vbCrLf _serialport.WriteLine(cmd) 'Attendez une seconde System.Threading.Thread.Sleep(1000) 'Réception des données de réponse Dim data = _serialport.ReadExisting For i = 0 To 10 'Vérification de la queue 'If data.Substring(data.Length - 2, 2) = vbCrLf Then If data.Length >= 2 AndAlso data.Substring(data.Length - 2, 2) = vbCrLf Then Dim dataArray = data.Split(" ") Me.Label1.Text = dataArray(dataArray.Length - 2) Exit Sub End If System.Threading.Thread.Sleep(1000) data += _serialport.ReadExisting Next i MessageBox.Show("Recevoir du temps") End Sub End Class
Dans une analyse rapide :
Pour la partie Winsock, la création par CreateObject je ne vois pas le code de lecture des données.
Pour le cas MSComm, le bloc :
Do While MSComm1.Input <> "+"
Loop
Doit bloquer ton code, car en l'absence de pause les données ne sont pas rafraichies, il faut mettre un "DoEvents" ou mieux, plutôt utiliser les événements prévus pat le contrôle pour être notifié de l'arrivée des messages (et gérer que le découpage ne soit pas favorable, gérer un buffer de ton côté)
Pour le test en VB.NET, la présence de "vbCrLf" indique que tu n'as pas appliqué les conseils de base, incluant le fait de désactiver l'import automatique de l'espace de nom Microsoft.VisualBasic, c'est un truc de compatibilité qui fait un code pas propre au final.
Le fait de contrôler si la fin de la chaine est CrLf peut te pose problème si il y a d'autres caractères à la fin de la chaine.
As-tu essayé en pas à pas pour voir les valeurs des variables et essayer de comprendre d'où vient le souci ?