MELSEC MX Component を Delphi XE5 / 10.2.3 Tokyoで使う

※2019/02/10 USB 接続のコードを追加 (2019/02/10)

■ActiveX の取り込みを行います。

通信設定をプログラムから行う場合は、MITSUBISHI ActProgType Controls Ver1.0, 1.0 をインポートします。

MX Component 付属の 「通信設定ユーティリティ」 を使う場合は、MITSUBISHI ActUtlType Controls Ver1.0, 1.0 をインポートします。
ActUtlType の論理局番 ActLogicalStationNumber := 0; のように設定するだけ通信可能になります。
通信テストもユーティリティーから行え、非常に簡単です。



Delphi のツールパレットの ActiveX に追加されます。


■ ActProgType 用 コード

unit ActProgUnit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.OleCtrls,
  ActProgTypeLib_TLB;

type
  TForm1 = class(TForm)
    ActProgType1: TActProgType;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
// *****************************
// シミュレータ
// *****************************
procedure TForm1.Button1Click(Sender: TObject);
var
  ret : integer;
  szCpuName : WideString;
  lCpuType : Long;
  szDevice : WideString;
  lData : Long;
begin
  Edit1.Text := '';
  with ActProgType1 do begin
    // LLT(ラダーロジックテスト)モード

    // GX Simulator 通信に関係するプロパティのみ
    // MX Component version4 プログラミングマニュアル
    //「第4章各通信経路で設定するプロパティ」を参照
    ActCpuType := $90;      // Q03UDECPU
    ActNetworkNumber := 0;  // 固定(自局)
    ActProtocolType := 6;   // PROTOCOL_SHAREDMEMORY
    ActStationNumber := 255;// 固定(自局)
    ActTimeOut := 500;      // ms単位でユーザ任意
    ActUnitType := $B;      // UNIT_SIMULATOR

    // 接続
    ret := Open;
    if ret <> 0 then begin
      ShowMessage('オープン失敗');
      Exit;
    end;
    // シーケンサ型番読み出し
    GetCpuType(szCpuName, lCpuType);
    Edit1.Text := szCpuName;

    szDevice := 'X10';
    // デバイス読み込み
    GetDevice(szDevice, lData);
    // デバイス書き込み
    SetDevice(szDevice, abs(lData-1));

    // 切断
    Close;
  end;
end;

// *****************************
// TCP
// *****************************
procedure TForm1.Button2Click(Sender: TObject);
var
  ret : integer;
  szCpuName : WideString;
  lCpuType : Long;
  szDevice : WideString;
  lData : Long;
begin
  Edit1.Text := '';
  with ActProgType1 do begin
    // MX Component version4 プログラミングマニュアル
    // 4.3.7 接続局がEthernet ポート内蔵QCPU のEthernet 通信(TCP)
    ActCpuType := $90;          // Q03UDECPU
    ActDestinationIONumber := 0;// 固定
    ActDestinationPortNumber := 5007; // TCP
    ActDidPropertyBit := 1;
    ActDsidPropertyBit := 1;
    ActHostAddress := '169.254.251.71';
    ActIntelligentPreferenceBit := 0; //固定
    ActIONumber := 1023; //シングルCPU時固定
    ActMultiDropChannelNumber := 0; //固定
    ActNetworkNumber := 0;  // 固定(自局)
    ActPassword := '';
    ActProtocolType := 5;   // PROTOCOL_TCPIP

    ActStationNumber := 255;// 固定(自局)
    ActThroughNetworkType := 0;
    ActTimeOut := 500;      // ms単位でユーザ任意
    ActUnitNumber := 0;//
    ActUnitType := $2C;      // UNIT_QNETHER

    // 接続
    ret := Open;
    if ret <> 0 then begin
      ShowMessage('オープン失敗');
      Exit;
    end;
    // シーケンサ型番読み出し
    GetCpuType(szCpuName, lCpuType);
    Edit1.Text := szCpuName;

    szDevice := 'X10';
    // デバイス読み込み
    GetDevice(szDevice, lData);
    // デバイス書き込み
    SetDevice(szDevice, abs(lData-1));

    // 切断
    Close;
  end;
end;
// *****************************
// UDP
// *****************************
procedure TForm1.Button3Click(Sender: TObject);
var
  ret : integer;
  szCpuName : WideString;
  lCpuType : Long;
  szDevice : WideString;
  lData : Long;
begin
  Edit1.Text := '';
  with ActProgType1 do begin

    // MX Component version4 プログラミングマニュアル
    // 4.3.8 接続局がEthernet ポート内蔵QCPU のEthernet 通信(UDP)
    ActCpuType := $90;      // Q03UDECPU
    ActDestinationIONumber := 0;// 固定

    ActDestinationPortNumber := 5006; //UDP

    ActDidPropertyBit := 1;
    ActDsidPropertyBit := 1;

    ActHostAddress := '169.254.251.71';

    // ActHostAddress := '';

    ActIntelligentPreferenceBit := 0;//固定
    ActIONumber := 1023;//シングルCPU時固定
    ActMultiDropChannelNumber := 0; //固定
    ActNetworkNumber := 0;  // 固定(自局)
    ActPassword := '';

    ActProtocolType := 5;   // PROTOCOL_TCPIP
    // ↓どういう訳か OPEN できない
    //ActProtocolType := 8;   // PROTOCOL_UDPIP($08)

    ActStationNumber := 255;// 固定(自局)
    ActThroughNetworkType := 0;
    ActTimeOut := 500;      // ms単位でユーザ任意
    ActUnitNumber := 0;//
    // Host を指定しない(直結)ときは、$2D にする
    ActUnitType := $2C;      // UNIT_QNETHER

    // 接続
    ret := Open;

    if ret <> 0 then begin
      ShowMessage('オープン失敗');
      Exit;
    end;
    // シーケンサ型番読み出し
    GetCpuType(szCpuName, lCpuType);
    Edit1.Text := szCpuName;

    szDevice := 'X10';
    // デバイス読み込み
    GetDevice(szDevice, lData);
    // デバイス書き込み
    SetDevice(szDevice, abs(lData-1));

    // 切断
    Close;
  end;
end;

// *****************************
// USB (2019/02/10 追加)
// *****************************
procedure TForm4.Button1Click(Sender: TObject);
var
  szCpuName : WideString;
  lCpuType : Long;
  szDevice : WideString;
  lData : Long;
begin
  Edit1.Text := '';
  with ActProgType1 do begin

    // FXCPU USB 通信
    // 「4.5.7 接続局がFXCPU のUSB 通信」
    ActCpuType := $20A;          // FX3S
    ActDestinationIONumber := 0; // 0(0x00) 固定
    ActIONumber := 0;            // 0(0x00) 固定
    ActProtocolType := $0D;      // PROTOCOL_USB(0x0D)
    ActTimeOut := 500;
    ActUnitNumber := 0;          // 0(0x00) 固定
    ActUnitType := $0F;          // UNIT_FXCPU(0x0F)

    // 接続
    if Open <> 0 then begin
      ShowMessage('オープン失敗');
      Exit;
    end;
    // シーケンサ型番読み出し
    GetCpuType(szCpuName, lCpuType);
    Edit1.Text := szCpuName;

    szDevice := 'Y0';
    // デバイス読み込み
    GetDevice(szDevice, lData);
    // デバイス書き込み
    SetDevice(szDevice, abs(lData - 1));

    // 切断
    Close;
  end;
end;

end.