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.