Delphi ComPortLIb で MELSEC FX RS232C 通信

■GX-Works 2 での設定画面
・プロトコルを「専用プロトコル」、伝送制御手順を「形式4(CR,LFあり)」にします。



Delphi のフォームに ComPort を貼り付けます。

これをダブルクリックすると、ComPort のセットアップが行えます。コード、またはプロパティーで設定しても同じです。


■実行結果


実用するには、アプリ起動でOPEN、終了でCLOSE。
切断された時の再接続処理、マルチスレッド化は必須です。

■コード

unit FXRS232CUnit;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ComPort1: TComPort;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
const
  STX = #$02; // テキスト開始
  ETX = #$03; // テキスト終了
  EOT = #$04; // テキスト終結
  ENQ = #$05; // 問合せ
  ACK = #$06; // 肯定応答
  CR  = #$0D; // キャリッジリターン
  LF  = #$0A; // 改行
  CL  = #$0C; // クリア
  NAK = #$15; // 否定応答
var
  cmd, res : string;
begin
  try
    with ComPort1 do begin
      Port := 'COM5';
      BaudRate := br9600;
      DataBits := dbSeven;
      StopBits := sbOneStopBit;
      Parity.Bits := prOdd;
      FlowControl.FlowControl := fcNone;
      Timeouts.ReadInterval := -1;
      Timeouts.WriteTotalConstant := 500;
      Timeouts.ReadTotalConstant := 500;

      // ポートオープン
      Open;
      if Connected then begin
        cmd := ENQ;
        cmd := cmd + '00';    // 局番号(PLC側の設定による)
        cmd := cmd + 'FF';    // PC番号(FXの場合、固定)
        cmd := cmd + 'BR';    // コマンド(ビット読み出し)
        cmd := cmd + '0';     // 伝文ウェイト('0'~'F' = 0~150ms)
        cmd := cmd + 'X0000'; // 5桁で指示:X0000から
        cmd := cmd + '16';    // 16個読み出し
        cmd := cmd + CR + LF;
        // 送信
        WriteStr(cmd);
        // 受信
        ReadStr(res, 1024);
        Edit1.Text := res;
        // レスポンスチェック
        if res.Length > 0 then begin
          if (res[1] = STX) and (res[res.Length] = LF) then begin
            // 前後の制御文字を削除
            res := Trim(res);
            // 情報だけを取り出す
            Edit2.Text := Copy(res, 5);
          end
          else
            Edit2.Text := IntToHex(Ord(res[1]), 2);
        end;
      end;
      // ポートクローズ
      Close;
    end;
  except
    ShowMessage('COM ERROR');
  end;
end;

end.