ComPort Lib で MELSEC Q RS232C を使う
MCプロトコルによるシーケンサCPUへのアクセスです。
詳細については、マニュアル「MELSEC コミュニケーションプロトコル」 (sh080003.pdf) を参照して下さい。
QnA互換3Cフレーム(形式4)サムチェック無し
ComPort:Default からの変更点(すべて必要であるとは限りません)
・DiscardNull : True (バイナリ通信の時は、False)
・ControlDTR : dtrEnable
・ControlRTS : rtstrHandshake
・OutCTSFlow : True
・ReadInterval : 50
・ReadTotalConstant : 500
・WriteTotalConstant : 500
※バイナリ通信の時、データ長は必ず 8 ビットにして下さい。(7ビットでは、'7F' 以上が送受信できません)
※手元に実機が無いので、動作確認はしておりません。
// QnA互換3Cフレーム(形式4)
// ビットデバイス(X,Y,Mなど)を1点単位で読みだす
procedure ReadBitDevice;
var
sStationNo : string;
sDevice : string;
iBits : integer;
s : string;
n : integer;
sResult : string;
fReslut : boolean;
begin
sStationNo := '00'; // 局番号
sDevice := 'X*000000'; // 読み出し開始デバイス(8文字)
iBits := 16; // 読み出しビット数
fResult := false;
try
if not ComPort1.Connected then
ComPort1.Open;
if ComPort1.Connected then begin
s := #05 + 'F9'; // ENQ(#05) + フレーム識別番号(F9)
s := s + sStationNo // 局番号(2文字) = アクセスするC24の局番設定
s := s + '00FF00'; // ネットワーク番号(00) + PC番号(FF) + 自局番号(00)
//ビットデバイス(X,Y,Mなど)を1点単位で読みだす
s := s + '0401' + '0001'; // コマンド + サブコマンド
s := s + sDevice; // 読み出し開始デバイス
s := s + IntToHex(iBits, 4); // 読み出しビット数
s := s + #13#10; // CRLF を付加
// 送信
ComPort1.WriteStr(s);
// 受信
n := 1024;
ComPort1.ReadStr(s, n);
// 正常終了時:
// STX(#02) + 'F90000FF00' + RES + ETX(#03) + CRLF(#13#10)
if (Copy(s, 1, 1) = #02) and (Length(s) = 14 + iBits) then begin
sResult := Copy(s, 12, iBits);
fResult := True; // 正常終了
end
// 異常終了時:
// NAK(#$15) + 'F90000FF00' + ERRORCODE(4文字) + CRLF(#13#10)
else if (Copy(s, 1, 1) = #$15) and (Length(s) = 17) then
sResult := Copy(s, 12, 4);
end;
ComPort.Close;
except
ShowMessage('通信エラー');
end;
end;
// QnA互換3Cフレーム(形式4)
// ビットデバイス(X,Y,Mなど)を1点単位で書き込む
procedure WriteBitDevice;
var
sStationNo : string;
sDevice : string;
sBits : string;
s : string;
n : integer;
sResult : string;
fReslut : boolean;
begin
sStationNo := '00'; //ステーションNo
sDevice := 'X*000000'; //書き込み開始デバイス
sBits := '01001001'; //書き込み内容('01001001'など)
try
if not ComPort1.Connected then
ComPort.Open;
if ComPort1.Connected then begin
s := #05 + 'F9' + sStationNo + '00FF00';
//ビットデバイス(X,Y,Mなど)を1点単位で読みだす
s := s + '1401' + '0001'; // コマンド + サブコマンド
s := s + sDevice; // 書き込み開始デバイス
s := s + IntToHex(Length(sBits), 4); // 書き込みビット数
s := s + sBits; // 書き込み内容
s := s + #13#10; // CRLF を付加
// 送信
ComPort1.WriteStr(s);
// 受信
n := 1024;
ComPort1.ReadStr(s, n);
// 正常終了時:
// ACK(#06) + 'F90000FF00' + CRLF(#13#10)
if (Copy(s, 1, 1) = #06) and (Length(s) = 13) then
fResult := true;
// 異常終了時:
// NAK(#$15) + 'F90000FF00' + ERRORCODE(4文字) + CRLF(#13#10)
end;
ComPort.Close;
except
;
end;
end;