|
[size=14.6667px]與三菱 PLC 通訊, 使用 MC 協議 中的 A-1E 協議
[size=14.6667px]■ 組合字串命令
[size=14.6667px][讀取] 從 D100 讀取一個值
[size=14.6667px]01FF0A006400000020440100
[size=14.6667px]01 副頭部(01=讀取)
[size=14.6667px]FF PLC 編號(固定)
[size=14.6667px]0A00 時鐘(固定)
[size=14.6667px]64000000 首地址(100=00000064)
[size=14.6667px]2044 設備標識號(D=44)
[size=14.6667px]0100 讀取長度(1個BYTES=0001)
[size=14.6667px][寫入] 將 100 這個值寫入 D100
[size=14.6667px]03FF0A0064000000204401006400
[size=14.6667px]03 副頭部(03=寫入)
[size=14.6667px]FF PLC 編號(固定)
[size=14.6667px]0A00 時鐘(固定)
[size=14.6667px]64000000 起始地址(100=00000064)
[size=14.6667px]2044 設備標識(D=44)
[size=14.6667px]0100 寫入長度(1個BYTES=0001)
[size=14.6667px]6400 寫入數據(100=0064)
[size=14.6667px]■ Lazarus 程式碼
[size=14.6667px]//connect
[size=14.6667px]procedure TForm1.LbSpeedButton1Click(Sender: TObject);
[size=14.6667px]begin
[size=14.6667px] if (IdTCPClient1.Connected) then IdTCPClient1.Disconnect;
[size=14.6667px] IdTCPClient1.Host := Edit1.Text; //PLC ip address
[size=14.6667px] IdTCPClient1.Port := StrToInt(Edit2.Text); //PLC port
[size=14.6667px] IdTCPClient1.ConnectTimeout := 1000;
[size=14.6667px] IdTCPClient1.ReadTimeout := 200;
[size=14.6667px] IdTCPClient1.Connect;
[size=14.6667px]end;
[size=14.6667px]//SEND "write command" to PLC
[size=14.6667px]procedure TForm1.LbSpeedButton2Click(Sender: TObject);
[size=14.6667px]var B:TBytes;
[size=14.6667px] var Buffer: array [0..99] of byte;
[size=14.6667px] res: string;
[size=14.6667px]begin
[size=14.6667px] //送信 Edit5.Text:='03FF0A0064000000204401006400';
[size=14.6667px] _PByteFromStr(@Buffer, _HexToStr(Edit5.Text), Length(_HexToStr(Edit5.Text)));
[size=14.6667px] IdTCPClient1.IOHandler.Write(TIdBytes(Buffer), Length(_HexToStr(Edit5.Text)));
[size=14.6667px] //受信
[size=14.6667px] SetLength(B, 0);
[size=14.6667px] IdTCPClient1.IOHandler.ReadBytes(TIdBytes(B), -1); //uses idGlobal
[size=14.6667px] res:=BytesToString(B); //Indy has BytesToString() and ToBytes() functions for converting between String and TIdBytes
[size=14.6667px] //授信文字列
[size=14.6667px] Edit7.Text := '('+_StrToHex(res)+')';
[size=14.6667px]end;
[size=14.6667px]//SEND "read command" to PLC
[size=14.6667px]procedure TForm1.LbSpeedButton3Click(Sender: TObject);
[size=14.6667px]var B:TBytes;
[size=14.6667px] Buffer: array [0..99] of byte;
[size=14.6667px] res: string;
[size=14.6667px]begin
[size=14.6667px] //送信 Edit6.Text:='01FF0A006400000020440100';
[size=14.6667px] _PByteFromStr(@Buffer, _HexToStr(Edit6.Text), Length(_HexToStr(Edit6.Text)));
[size=14.6667px] IdTCPClient1.IOHandler.Write(TIdBytes(Buffer), Length(_HexToStr(Edit6.Text)));
[size=14.6667px] //受信
[size=14.6667px] SetLength(B, 0);
[size=14.6667px] IdTCPClient1.IOHandler.ReadBytes(TIdBytes(B), -1); //uses idGlobal
[size=14.6667px] res:=BytesToString(B); //Indy has BytesToString() and ToBytes() functions for converting between String and TIdBytes
[size=14.6667px] //授信文字列
[size=14.6667px] Edit7.Text := '('+_StrToHex(res)+')';
[size=14.6667px]end;
[size=14.6667px]download : [size=14.6667px]https://mega.nz/file/A1knGCga#gO ... df6DCV0VQmKoJyj07MI
文章來源 : http://lazarus.freebbs.tw/viewthread.php?tid=111&extra=page%3D1
|
|