Delphi で Modbus/TCP を使う

 2017/02/01 追加
 最新バージョンは、ここにありました。Ver.1.66(Delphi 10.1 Berlin まで対応)
 https://github.com/coassoftwaresystems/delphi-modbus/releases

ネットで検索し、delphimodbus-1.6.3.zip (Delphi XE7 まで対応)を、ダウンロードし、適当なフォルダに解凍します。

■インストール
[ファイル] - [プロジェクトを開く] をクリックします。




解凍したフォルダ内の packages フォルダの「DelphiModbusXE5.dproj」または、同名の[.dpk」を選択し、[ 開く ] ボタンをクリックします。



プロジェクトマネージャーの 「DelphiModbusXE5.bpl」 を右クリックします。



ポップアップメニューから[コンパイル]をクリックします。



同じように、「dclDelphiModbusXE5.dproj」 を開きます。




プロジェクトマネージャーの 「dclDelphiModbusXE5.bpl」 を右クリックします。




ポップアップメニューから「インストール」をクリックします。



インストールが終了すると、メッセージが表示されます。



Delphi を起動し、[ファイル] - [新規作成] - [VCL フォームアプリケーション] で、フォームを作成します。
ツールパレットに 「Modbus」 カテゴリが追加されています。



順番が前後しますが、オプションでパスを追加します。
[ツール] - [オプション] をクリックします。



環境オプション-Delphiオプション-ライブラリを開きます。
ライブラリパスの右側の [ ... ] ボタンをクリックします。



ディレクトリ入力画面が表示されます。



入力ボックスに delphimodbus の source フォルダを入力し、[追加] ボタンをクリックします。
(まちがっても [不正なパスを削除] ボタンをクリックしないように。)
[OK] ボタンをクリックします。



サンプルコード(というほどではありませんが・・・)
2017/02/01 ReadInputResister .. を追加しました。

unit modbusUnit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdModBusClient, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    IdModBusClient1: TIdModBusClient;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  // 出力用データを格納
  OutputData: array[0..127] of boolean;
  // 読込用データを格納
  ReadData  : array [0..1023] of boolean;

  StartIndex: Word;
  WriteCount: Word;
  ReadCount : Word;
  
  // アナログデータ取得用
  wRes : WORD;
  wResAry : array [0..3] of WORD;
begin
  with IdModBusClient1 do begin
    AutoConnect := False;
    Host := '192.168.0.100';
    Port := 502;

    TimeOut := 500;
    ReadTimeout := 0;
    ConnectTimeout := 0;

    try
      // 接続
      Connect;

      if Connected then begin

        // 書き込みデータをセット
        for i := 0 to 127 do OutputData[i] := True;

        StartIndex := 1;
        WriteCount := 128;

        // 出力
        WriteCoils(StartIndex, WriteCount, OutputData);

        StartIndex := 1;
        ReadCount := 1024;

        // ビット読込
        if ReadInputBits(StartIndex, ReadCount, ReadData) then begin
          // 読込データ処理
          ;
        end;
       
        // アナログデータ ch0 読込
        if ReadInputResister(1, wRes) then begin
          // 読込データ処理
          ;
        end;
        // アナログデータ ch0 ~ ch3 一括読込
        if ReadInputResisters(1, 4, wResAry) then begin
          // 読込データ処理
          ;
        end;

        // 切断
        Disconnect;
      end;
    except
      ShowMessage('接続エラー');
    end;
  end;
end;

end.