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.