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;