IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Web & réseau Delphi Discussion :

Protocole MODBUS TCP et RTU Over TCP


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Protocole MODBUS TCP et RTU Over TCP
    Bonjour tout le monde,
    J'ai une application développée en Delphi 6 qui tourne sous Windows 7 à l'intérieur de laquelle je dois ajouter un module qui me permette de communiquer en MODBUS avec une carte électronique (Système Sodar(Direction et la vitesse du vent)).
    Quelqu'un peut'il m'indiquer vers ou m'orienter pour ce problème?
    Merci à tous.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Modbus n'est qu'un premier niveau, il faut savoir ensuite ce que ta carte met dans les registres

    Pour ma part, j'ai gagné de temps en passant par un composant payant chez ProconX mais tu n'auras pas le budget en tant qu'étudiant
    Par contre, j'étais en USB (en fait un port COM virtuel) en mode Serial physique en RS-232, voire même des borniers type RS485

    Commence déjà par jouer avec le TClientSocket et TServerSocket, tu as plien d'exemple, tu peux utiliser Telnet pour tester aussi
    Un fois la communication TCP maitrisée, il va te falloir bien gérer des trames binaires (et non du texte comme Telnet)

    As-tu une documentation sur la structure d'une Tram Modbus,
    je sais que sur le forum, certains se sont amuser à sniffer les trams échangées entre deux appareils pour comprendre les données.
    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 chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Pour ma part, j'avais utilisé ces composants:
    https://github.com/coassoftwaresystems/delphi-modbus

    Je ne faisais que de la lecture de registre. Le souci étant surtout de trouver les bons registres.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour l'info.
    Par contre j'ai installer le package DelphiModbus60.dpk, mais du coup il reste : IdBaseComponent, IdComponent, IdTCPConnection,
    ModbusTypes , FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo;
    ??
    Merci.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour les infos.

    Oui j'ai dèjà commencé à jouer avec les Sockets Client-Server, je vais passer maintenant pour faire des tests en mode Démo de Modbus sous DELPHI 6, mais j'arrive pas à installer tout les composants pour compiler le programme!
    Avez-vous une idée comment installer ou bien ajouter : IdBaseComponent, IdComponent, IdTCPConnection,
    ModbusTypes, FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo;

    Merci d'avance.

    voila un exemple de code ou il y ces composants par exemple :
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    { $Id: frm_Main.pas,v 1.1 2011/08/25 10:04:33 plpolak Exp $ }
     
    unit frm_Main;
     
    interface
     
    uses
      SysUtils, Types, Classes, Variants, FMX.Types, FMX.Controls, FMX.Forms,
      FMX.Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      ModbusTypes,
      IdModBusClient, FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo;
     
    type
      TfrmMain = class(TForm)
        mctPLC: TIdModBusClient;
        Label1: TLabel; 
        edtIPAddress: TEdit;
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        Label2: TLabel;
        Label3: TLabel;
        edtReadReg: TEdit;
        edtReadAmount: TEdit;
        btnRead: TButton;
        Label4: TLabel;
        Label5: TLabel;
        edtWriteReg: TEdit;
        edtValue: TEdit;
        btnWrite: TButton;
        Memo1: TMemo;
        Button1: TButton;
        procedure btnReadClick(Sender: TObject);
        procedure btnWriteClick(Sender: TObject);
        procedure mctPLCConnected(Sender: TObject);
        procedure mctPLCDisconnected(Sender: TObject);
        procedure mctPLCResponseError(const FunctionCode, ErrorCode: Byte;
          const ResponseBuffer: TModBusResponseBuffer);
    (*
        procedure mctPLCResponseMismatch(const RequestFunctionCode,
          ResponseFunctionCode: Byte; const ResponseBuffer: TModBusResponseBuffer);
    *)
        procedure mctPLCSocketAllocated(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure mctPLCStatus(ASender: TObject; const AStatus: TIdStatus;
          const AStatusText: string);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      frmMain: TfrmMain;
     
    implementation
     
    {$R *.fmx}
     
     
    procedure TfrmMain.btnReadClick(Sender: TObject);
    var
      Data: array[0..4096] of Word;
      iAmount: Integer;
      i: Integer;
      sLine: String;
    begin
      iAmount := StrToInt(edtReadAmount.Text);
      if (iAmount > 0) then
      begin
        mctPLC.Host := edtIPAddress.Text;
        if mctPLC.ReadHoldingRegisters(StrToInt(edtReadReg.Text), iAmount, Data) then
        begin
          sLine := 'Register value(s) read:';
          for i := 0 to (iAmount - 1) do
            sLine := sLine +
                     #13#10'     ' +
                     IntToStr(StrToInt(edtReadReg.Text) + i) +
                     ': 0x'  +
                     IntToHex(Data[i], 4);
          ShowMessage(sLine);
        end
        else
          ShowMessage('PLC read operation failed!');
      end;
    end;
     
     
    procedure TfrmMain.btnWriteClick(Sender: TObject);
    begin
      mctPLC.Host := edtIPAddress.Text;
      if mctPLC.WriteRegister(StrToInt(edtWriteReg.Text), StrToInt(edtValue.Text)) then
        ShowMessage('PLC register write successful!')
      else
        ShowMessage('PLC register write failed!');
    end;
     
     
    procedure TfrmMain.Button1Click(Sender: TObject);
    begin
      If not mctPLC.Connected then
      begin
        mctPLC.Connect;
        Button1.Text := 'Deconnecte';
      end else begin
         mctPLC.Disconnect;
        Button1.Text := 'connect';
      end;
    end;
     
    procedure TfrmMain.mctPLCConnected(Sender: TObject);
    begin
      Memo1.Lines.Add('connecté')
    end;
     
    procedure TfrmMain.mctPLCDisconnected(Sender: TObject);
    begin
      Memo1.Lines.Add('déconnecté')
    end;
     
    procedure TfrmMain.mctPLCResponseError(const FunctionCode, ErrorCode: Byte;
      const ResponseBuffer: TModBusResponseBuffer);
    begin
    //  Memo1.Lines.Add('ResponseError>'+ResponseBuffer.Header);
      Memo1.Lines.Add('ResponseError>'+IntToStr(ResponseBuffer.FunctionCode));
    //  Memo1.Lines.Add('ResponseError>'+ResponseBuffer.MBPData);
    end;
     
    (*
    procedure TfrmMain.mctPLCResponseMismatch(const RequestFunctionCode,
      ResponseFunctionCode: Byte; const ResponseBuffer: TModBusResponseBuffer);
    begin
      Memo1.Lines.Add('ResponseMismatch>');
    end;
    *)
     
    procedure TfrmMain.mctPLCSocketAllocated(Sender: TObject);
    begin
      Memo1.Lines.Add('SocketAllocated>');
    end;
     
    procedure TfrmMain.mctPLCStatus(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: string);
    begin
      Memo1.Lines.Add('CStatus>'+AStatusText);
    end;
     
    end.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par GHOUCHMI Voir le message
    IdBaseComponent, IdComponent, IdTCPConnection
    il s'agit des composants Indy
    Citation Envoyé par GHOUCHMI Voir le message
    FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo;
    ici on à affaire à une version récente de Delphi multiplateforme ! je croyais avoir lu qu'il s'agissait de D6
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par GHOUCHMI Voir le message
    Merci pour l'info.
    Par contre j'ai installer le package DelphiModbus60.dpk, mais du coup il reste : IdBaseComponent, IdComponent, IdTCPConnection,
    ModbusTypes , FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo;
    ??
    Merci.
    - "FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo"
    FMX c'est genre Delphi 16 (surnom XE2), maintenant c'est Delphi 25 (surnom 10.2), on est loin Delphi 6, environ 15 ans de version.

    - "IdBaseComponent, IdComponent, IdTCPConnection"
    De plus, c'est basé sur Indy, je n'ai plus souvenir si Indy existait en D6 (en D7 c'est certain)
    et même du coup faut partir sur la version Indy9 pour la démo de Delphi-Modbus : https://github.com/coassoftwaresyste...op/demos/Indy9

    Je pense que lire le ReadMe est nécessaire : https://github.com/coassoftwaresyste...mos/readme.txt
    et la DOC : https://github.com/coassoftwaresyste...e/develop/docs
    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

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour ,
    En fait ma carte renvoi les informations suivantes :

    ALT CT SPEED DIR W SW SU SV ETAM

    160 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    150 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    140 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    130 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    120 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    110 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    100 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    90 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    80 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    70 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    60 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    50 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
    40 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9

    d'une autre façon :
    40001 ALT hauteur 1 40
    40002 CT hauteur 1
    40003 SPEED hauteur 1
    40004 DIR hauteur 1
    40005 W hauteur 1
    40006 SW hauteur 1
    40007 SU hauteur 1
    40008 SV hauteur 1
    40009 ETAM hauteur 1

    40010 ALT hauteur 2 50
    40011 CT hauteur 2
    40012 SPEED hauteur 2
    40013 DIR hauteur 2
    40014 W hauteur 2
    40015 SW hauteur 2
    40016 SU hauteur 2
    40017 SV hauteur 2
    40018 ETAM hauteur 2

    .....etc pour les autres hauteur 60, 70, 80, ....160

    Au début j'ai utiliser deux programmes : serveur (ServerSocket) et Client (ClientSocket) sous Delphi 6 et j'ai réussi la communication entre les deux (@IP du sysème (carte électronique) et @Ip du PC).

    Ma question maintenant comment je peux programmer un programme modbus TCP sous delphi pour qu'un Client peux se communiquer avec ce systèmes Sodar( Mésure de la direction et la vitesse du vent)

    Je vous remercie d'avance.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Ing. électronicien
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing. électronicien
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Salut,
    Tu peux éventuellement essayer d'utiliser la librairie MBusDrv.dll téléchargeable ici :
    http://www.automelec.ch/files/MBusDrv.zip
    Le logiciel pilote est très simple à configurer et à utiliser.
    A ta dispo au besoin.
    Christophe


    .....etc pour les autres hauteur 60, 70, 80, ....160

    Au début j'ai utiliser deux programmes : serveur (ServerSocket) et Client (ClientSocket) sous Delphi 6 et j'ai réussi la communication entre les deux (@IP du sysème (carte électronique) et @Ip du PC).

    Ma question maintenant comment je peux programmer un programme modbus TCP sous delphi pour qu'un Client peux se communiquer avec ce systèmes Sodar( Mésure de la direction et la vitesse du vent)

    Je vous remercie d'avance.[/QUOTE]

Discussions similaires

  1. Protocole MODBUS TCP/IP
    Par probo dans le forum Web & réseau
    Réponses: 12
    Dernier message: 25/01/2019, 09h11
  2. Modbus over TCP/IP
    Par Emery95 dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 08/08/2016, 08h11
  3. Android avec Protocole Modbus TCP/IP
    Par iio0n dans le forum Android
    Réponses: 1
    Dernier message: 21/10/2015, 08h38
  4. Supervision Cimplicity - Protocol MODBUS RTU
    Par IlyesBH dans le forum Automation
    Réponses: 5
    Dernier message: 21/11/2009, 21h41
  5. Envoi caractère 0x00 pour Protocole MODBUS/TCP
    Par nanar06 dans le forum C++
    Réponses: 3
    Dernier message: 31/08/2009, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo