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;