Lire les données d'une balance METTLER TOLEDO

Camille_el Messages postés 1 Date d'inscription jeudi 29 juin 2023 Statut Membre Dernière intervention 29 juin 2023 - Modifié le 29 juin 2023 à 10:26
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 30 juin 2023 à 11:40

Bonjour, 

J'ai une balance METTLER TOLEDO XP contient un port R232 et une carte Ethernet que j'ai intégré moi-même. J'ai essayé toute les pistes pour communiquer avec la balance depuis mon PC et de transférer les données de pesée mais j'ai pas réussi.

Est ce que vous pouvez m'aider svp sachant que je veux faire un code VBA qui permettre la communication et la récupération des données.
La balance communique en MT-SCIS.

2 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
29 juin 2023 à 20:20

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.


0

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


 

0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
30 juin 2023 à 11:40

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 ?

0
Rejoignez-nous