Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 5052|回复: 53

Lazarus 讀寫 PLC 範例 (MC 協議)

[复制链接]

该用户从未签到

发表于 2020-4-8 15:58:52 | 显示全部楼层 |阅读模式
[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
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2020-4-8 16:02:37 | 显示全部楼层

RE: Lazarus 讀寫 PLC 範例 (MC 協議)

MC 協議 之 Qna-3E 協議二進制

IdTCPClient 元件的使用方法同上面 A-1E 協議
只是送信資料內容(組合字串命令)不同


■ 組合字串命令

500000FFFF03000C001000010400000A0000A80100      讀取 D10 的 1 個值
D00000FFFF0300040000000000        讀取結果(最後四碼)
         
說明
(送出)
5000    副頭部(固定)
00      網路編號(固定)
FF      PLC 編號(固定)
FF03    IO 編號(固定)
00      模塊站號(站編號)
0C00    請求數據長度(此欄位之後的 BYTE 數)
1000    時鐘(固定)
0104    指令(讀取=0104, 寫入=0114)
0000    子指令
0A0000  數據區(0A0000=00000A=10 暫存器的第 10 個位址)
A8      起始地址(D暫存器都用A8)
0100    長度(0100=0001 表示讀取 1 個值)

(讀回)
D000    副頭部(固定)
00      網路編號(固定)
FF      PLC 編號(固定)
FF03    IO 編號(固定)
00      模塊站號(站編號)
0400    應答數據長度(0400=0004 表示此欄位之後有四個 BYTES, 也就是八個字元)
0000    結束代碼
0000    數據部分



■ 舉一反三 (以下資料間的空格為方便閱讀之用, 實際應用之資料間勿加空格)

如下指令为向D7000写入0x000C (7000=0x1B58)
送出:50 00 00 FF FF 03 00 OE 00 10 00 01 14 00 00 58 1B 00 A8 01 00 0C 00
讀回:D0 00 00 FF FF 03 00 02 00 00 00

如下指令为读取D100开始的20个D值 (20=0x14)
送出:50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 64 00 00 A8 14 00
讀回:D0 00 00 FF FF 03 00 2A 00 00 00 00 00 FF FF FF FF FF FF 00 00 01 00 FD FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  讀取結果(最後 80 個字元即為連續的 20 個 D 值)




參考資料
https://www.cnblogs.com/haozhanggy/p/12213159.html
https://blog.csdn.net/jackiewu3/article/details/82343531
https://blog.csdn.net/sinat_36988961/article/details/103087932
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

发表于 2020-4-24 14:10:27 | 显示全部楼层

RE: Lazarus 讀寫 PLC 範例 (MC 協議)

Good job!

我也有接觸工控(雖然對三菱的PLC不熟),能這樣摸懂一個通訊協定並實作可用的作品想必也費了番功夫吧!

感謝您的分享
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2024-9-12 03:26 , Processed in 0.030920 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表