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