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.