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.