Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

récupérer les informations d'un pont bascule


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    récupérer les informations d'un pont bascule
    Bonjour à tous,

    Je cherche un moyen de récupérer les données d'un pont bascule à la pesé et ainsi pouvoir les traiter

  2. #2
    Expert éminent sénior
    Bonsoir,

    C'est juste une balance géante, contactez le constructeur de l'appareil pour les protocoles de communication et les spécifications des données.
    Lorsque vous aurez cette information (ex: API en DLL, un mini Serveur Web embarqué, un protocol binaire spécifique, ...), nous pourrons vous aider à partir d'un début de code que vous aurez tenté.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué
    Bonjour,
    Justement c'est ce que je veut éviter. En fait, je voudrais créer un code qui peut communiquer avec n'importe quelle balance.

  4. #4
    Expert éminent sénior
    Peut-être qu'il existe une norme mais pourquoi poser la question sur un forum Delphi et non pas sur un forum spécialisé dans ce type de matériel ?
    Contactez les constructeurs dont vous savez qu'il faudra interfacer, renseignez-vous si ils utilisent des connectiques et protocoles similaires, voire unifiés, un peu à la façon d'un ModBus, un beau travail d'étude qui semble très intéressant.

    Pour ma part, j'ai travaillé avec du matériel, c'est passionnant, j'ai programmé avec plusieurs protocoles, plusieurs API ou différentes connectiques, pour en faire en sorte ensuite que cela soit transparent comme si tout était sur le même système.
    C'est le concept de Wrapper, d'abstraction du matériel (c'était Caméra, DVR, Centrale Incendie, Détecteur de Mouvement ...), j'ai mis en place une floppée de DLL, chacune implémentant la couche Hardware commune (système d'exploration) et la couche Entity\Purpose pour les éléments spécifiques à chaque catégorie de matériel, depuis le programme principal, c'était totalement transparent, un code générique et un jeu d'interface cachant les différentes techniques de connexion.

    A vous d'unifier les protocoles de chaque constructeur pour ensuite les utiliser dans votre application via abstraction et drivers.

    Une norme, une méthode commune n’apparaît pas par hasard, c'est parce que les industriels se concertent pour faciliter l'utilisation (ou parce que ne pas le faire serait un obstacle à la vente)
    A vous de trouvez si il existe une telle norme pour les Pont-Bascule
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert confirmé
    salut

    pour cela il faut tout de même avoir des donnée constructeur
    pas 1 constructeur mais tous
    dans l'industrie chacun y vas de son protocole prioritaire meme si la tendance
    est a normaliser
    exemple de protocole modbus tcp/ip,profinet ... chacun vas de son fonctionnement
    il existe souvent des passerelles entre chaque protocole mais rien n'est simple

    c'est pour cela qu'il est important de connaitre la technologie employé afin
    de pouvoir déterminer la meilleur des solution
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre habitué
    merci pour vos réponses, cependant j'ai essayé de commencer du commencement avec les Tcomport dont j'ai aucune notion, j'ai installé les bibliothèque nécessaires et j'ai essayé de faire un test rapide avec le composant Tcomport qui en principe doit afficher les ports existants, mais chez moi il affiche rien!!!.

  7. #7
    Membre émérite
    Procédons par étape.
    Quel est le branchement entre la bascule et l'ordinateur ? RS232, RJ45, USB ou autre ?

  8. #8
    Membre habitué
    Bonjour,

    j'ai testé une imprimante avec un cable usb et ensuite avec rs232 mais aucun port n'est affiché dans Tcomport.

  9. #9
    Expert éminent sénior
    Affiché ?
    TComport n'affiche rien, vous confondez avec la Démo qui fourni un tas de composant visuel pour faire une petite console.



    USB, vous avez monté un pont entre USB et COM ?
    Généralement c'est l'option "USB-to-Serial" sur les ports COM\LPT dans la Gestionnaire de périphériques Windows.
    De plus c'est parfois un Driver de périphérique qui ajoute un "Virtual COM Port" qui n'est pas configuré par défaut

    Citation Envoyé par ALWEBER Voir le message
    Procédons par étape.
    Quel est le branchement entre la bascule et l'ordinateur ? RS232, RJ45, USB ou autre ?
    Sinon, tout le monde vous répète de vérifier la cible, de faire une étude, de voir avec votre client quel est son matériel et pas vous lancer en aveugle.
    Savez-vous si vous serez connecté directement sur la Hardware ou en réalité sur un PC équipé d'un logiciel d'exploitation du Pont-Bascule qui lui vous offrira une abstraction, voir tout simplement, un envoie de fichier sur un FTP, un WebService, ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre habitué
    bonjour,
    mais alors pourquoi il m'affiche pas les port com?

  11. #11
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par chekkal Voir le message

    mais alors pourquoi il m'affiche pas les port com?
    vous vous y prenez mal.
    La première chose à faire, avant même de penser Delphi, est de vérifier votre système windows.
    Avant même de communiquer, je ferais aussi une vérification des données fournies par WMI ce qui permettrait certainement de récupérer des informations utiles.
    C'est seulement ensuite que je me pencherai sur les diverses connexions possibles
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  12. #12
    Membre habitué
    bonjour sergio,
    J'ai pas compris votre raisonnement, j'ai pris des exples ici sur ce forum et j'ai suivi toutes les instructions mais j'ai pas le même résultat.

  13. ###raw>post.musername###
    Expert éminent sénior
    Citation Envoyé par chekkal Voir le message
    bonjour,
    mais alors pourquoi il m'affiche pas les port com?
    Il est amusant que vous posiez la question alors que nous vous avions indiqué de vérifier votre Gestionnaire de périphériques Windows.
    Vous lisez nos réponses ?

    Citation Envoyé par ShaiLeTroll Voir le message
    USB, vous avez monté un pont entre USB et COM ?
    Généralement c'est l'option "USB-to-Serial" sur les ports COM\LPT dans la Gestionnaire de périphériques Windows.
    De plus c'est parfois un Driver de périphérique qui ajoute un "Virtual COM Port" qui n'est pas configuré par défaut


    Vous continuez sur votre idée d'une connexion COM via USB sans savoir si cela ne sera pas une connexion Ethernet RJ45 ou même Wifi (sur un ordinateur intermédiaire) !



    N'ayant pas installé le package mais juste récupéré comport411f, je fais une instanciation dynamique et cela fonctionne parfaitement pour le port COM physique.
    Et cela affiche le port visible dans le gestionnaire, avez-vous étudier les WMI pour lister les ports ?
    Je n'ai pas le poste sous les yeux car à distance, le Port COM1 est il me semble physique au dos de l'appareil
    Il n'y a pas de port COM virtuel pour mapper pour les USB, comme je le sais, il faut que le Driver face le boulot !

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    unit SerialListPortCOM_MainForm;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        procedure ShowCOM();
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses CPortCtl,
      ActiveX,
      ComObj;
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ShowCOM();
     
      with TComComboBox.Create(Self) do
      begin
        Parent := Self;
        Align := alTop;
        ComProperty := cpPort;
      end;
    end;
     
    function VarArrayToStr(const vArray: variant): string;
     
        function _VarToStr(const V: variant): string;
        var
        Vt: integer;
        begin
        Vt := VarType(V);
            case Vt of
              varSmallint,
              varInteger  : Result := IntToStr(integer(V));
              varSingle,
              varDouble,
              varCurrency : Result := FloatToStr(Double(V));
              varDate     : Result := VarToStr(V);
              varOleStr   : Result := WideString(V);
              varBoolean  : Result := VarToStr(V);
              varVariant  : Result := VarToStr(Variant(V));
              varByte     : Result := char(byte(V));
              varString   : Result := String(V);
              varArray    : Result := VarArrayToStr(Variant(V));
            end;
        end;
     
    var
    i : integer;
    begin
        Result := '[';
         if (VarType(vArray) and VarArray)=0 then
           Result := _VarToStr(vArray)
        else
        for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do
         if i=VarArrayLowBound(vArray, 1)  then
          Result := Result+_VarToStr(vArray[i])
         else
          Result := Result+'|'+_VarToStr(vArray[i]);
     
        Result:=Result+']';
    end;
     
    function VarStrNull(const V:OleVariant):string; //avoid problems with null strings
    begin
      Result:='Null';
      if not VarIsNull(V) then
      begin
        if VarIsArray(V) then
           Result:=VarArrayToStr(V)
        else
        Result:=VarToStr(V);
      end;
    end;
     
    function GetWMIObject(const objectName: String): IDispatch; //create the Wmi instance
    var
      chEaten: Integer;
      BindCtx: IBindCtx;
      Moniker: IMoniker;
    begin
      OleCheck(CreateBindCtx(0, bindCtx));
      OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
      OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
    end;
     
    //
    procedure TForm1.ShowCOM();
    var
      objWMIService : OLEVariant;
      colItems      : OLEVariant;
      colItem       : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      Memo1.Lines.Clear();
      objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2');
      colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity WHERE PNPClass = ''Ports''','WQL',0);
      oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
      while oEnum.Next(1, colItem, iValue) = 0 do
        Memo1.Lines.Add(VarStrNull(colItem.Caption));
    end;
     
    end.


    à la place du SQL, une autre variante

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    procedure TForm1.ShowCOM();
    var
      objWMIService : OLEVariant;
      colItems      : OLEVariant;
      colItem       : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      Memo1.Lines.Clear();
      objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2');
    //  colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity WHERE PNPClass = ''Ports''','WQL',0);
     // colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity','WQL',0);
    //  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
     
      Memo1.Lines.Add('COM:');
      colItems := objWMIService.InstancesOf('Win32_SerialPort', 1, Null);
      oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
      while oEnum.Next(1, colItem, iValue) = S_OK do
        Memo1.Lines.Add(VarStrNull(colItem.Caption));
     
      Memo1.Lines.Add('USB:');
      colItems := objWMIService.InstancesOf('Win32_USBController', 1, Null);
      oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
      while oEnum.Next(1, colItem, iValue) = S_OK do
        Memo1.Lines.Add(VarStrNull(colItem.Caption));
    end;


    Sur mon PC Local, pas de port physique, la liste COM est vide, c'est normal.
    N'ayant pas de périphérique USB Serial, je n'ai pas de port virtuel COM monté par-dessus un USB
    Et j'ai les USB bien présent
      2  0

  14. #14
    Membre habitué
    Bonjour shailetroll,

    C'est vrai j'ai pas de port com, par contre comment détecter les ports usb et les ports reseau ac TComport?

  15. #15
    Expert confirmé
    salut

    tcomport ne sert pas a detecter mais a comuniquer
    il faut avant tout savoir si le port existe pour cela les wmi sont tres utile
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Membre habitué
    Bonjour anapurna,

    Je suis pas vraiment un expert dans ce domaine, j'ai passé 2 jours à lire des documents qui parle des systèmes de connexion et franchement j'ai rien compris. Je voudrais seulement pouvoir communiquer avec un périphérique (pont bascule) qui est connecté soit en cable usb ou cable reseau.

  17. #17
    Expert éminent sénior
    Je vous invite encore à relire ceci

    Citation Envoyé par ShaiLeTroll Voir le message
    USB, vous avez monté un pont entre USB et COM ?
    Généralement c'est l'option "USB-to-Serial" sur les ports COM\LPT dans la Gestionnaire de périphériques Windows.
    De plus c'est parfois un Driver de périphérique qui ajoute un "Virtual COM Port" qui n'est pas configuré par défaut

    https://www.developpez.net/forums/d1...t-com-virtuel/
    https://sourceforge.net/projects/com0com/files/

    Certains périphériques USB contiennent le driver à installer pour émuler le port COM
    Tant que vous n'avez pas le matériel (encombrant ), faut voir avec le fabricant ciblé, si il fourni un simulateur.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  18. #18
    Membre habitué
    Bonjour shailetroll,

    Excusez mon niveau dans ce domaine mais j'ai vu les liens et j'ai téléchargé et installer le programme "com0com", mais franchement j'ai rien compris. Pour faire simple, j'ai mon imprimante connecté en usb comment puis-je communiquer avec elle. Je me rappelle d'un programme qui date maintenant ou on communiqué avec l'imprimante en port parallèle avec des ligne de commande exple:"esc P ..' et je voudrais faire la même chose avec mon périphérique connecté en usb.

  19. #19
    Rédacteur/Modérateur

    Bonjour,

    Quand deviendrez vous précis ?
    Nous sommes partis d'un pont bascule (que l'on trouve généralement sur des parkings) à une imprimante USB qui, je présume, si on suit l'historique de vos discussions sur le forum, est plutôt une bascule de pesée (genre pesée légume) qui imprime (peut-être) un ticket puisque vous parlez d'imprimante maintenant

    Je me rappelle d'un programme qui date maintenant ou on communiqué avec l'imprimante en port parallèle avec des ligne de commande
    Oui, les séquences d'échappement, cela existe toujours et un simple write vers le terminal de sortie (dans ce cas une imprimante) suffit pas besoin de chercher loin

    le problème c'est que vous voulez généraliser avant même d'avoir une solution pour un terminal précis, vous mélangez allégrement USB et RS232 (port série), LPT (imprimante) et COM.
    Quand on voit ce qu'il peut y avoir sur le marché en terme de balance http://www.aazpesage.com/index.html
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  20. #20
    Membre habitué
    Oui, les séquences d'échappement, cela existe toujours et un simple write vers le terminal de sortie (dans ce cas une imprimante) suffit pas besoin de chercher loin
    Voila le problème. C'est comment déterminer le terminal de sortie et comment passer la communication?.

    le problème c'est que vous voulez généraliser avant même d'avoir une solution pour un terminal précis, vous mélangez allégrement USB et RS232 (port série), LPT (imprimante) et COM.
    Désolé, c'est que j'ai voulu des exples simple de connexion. Mon but premier c'est toujours le pont bascule, mais j'ai donné l'exple de l'imprimante du fait que l'imprimante est comme le pont bascule et périphérique externe.

###raw>template_hook.ano_emploi###