三菱FX-5U MODBUS Tcp主站程序?qū)W習(xí)筆記
程序如下







=========================通信程序解析==============================
(*ModbusTcp通信中用到的指令*)
(*
// SP_SOCOPEN
// SP_SOCCLOSE
// SP_CPRTCL
*)
(*
5u做為 ModbusTcp_主站?
通信數(shù)據(jù)包的設(shè)置
工具--》通信協(xié)議支持功能--》模塊類型? CPU(以太網(wǎng))--》
添加協(xié)議(手動(dòng)添加)--》通信協(xié)議庫(kù)? 選擇制造商 型號(hào) (ModbusTcp) 協(xié)議句(對(duì)應(yīng)Modbus功能碼)
也可直接添加下面這個(gè)數(shù)據(jù)包
D:\mitsubishi\通信DEMO\三菱Q內(nèi)置以太網(wǎng)socket通信的程序\ModbusTcpClient數(shù)據(jù)包設(shè)置.tpx
需要單獨(dú)將數(shù)據(jù)包下載到PLC中
數(shù)據(jù)包的作用就是將報(bào)文協(xié)議中的信息存入到程序員分配的寄存器中(內(nèi)部進(jìn)行轉(zhuǎn)化)比如D1000……,
然后可對(duì)分配的寄存器進(jìn)行讀寫操作
*)
//執(zhí)行工程工具中登錄的通信協(xié)議。
(*
SP.ECPRTCL "U0" K1 K1 D1400 M200;
SP_CPRTCL( ?BOOL_EN? , 'U0' , ?ANY16_ARRAY_s? , ?ANY16_U_n1? , ?ANY16_U_n2??
?ANYBIT_ARRAY_d? );
*)
(*MOV K1 D1402
SP.ECPRTCL "U0" K1 K1 D1400 M200;*這里是和通信數(shù)據(jù)包中的設(shè)置參數(shù)對(duì)應(yīng)的
控制數(shù)據(jù) D1400? D14002? ?(D14002? ? D14003? D14004 D14005 D14006 D14007 D14008 D14009? 這8個(gè)寄存器對(duì)應(yīng)8外協(xié)議號(hào))
通信狀態(tài)M200 M201? M200 通信完成? M200通信異常
*)?
(* 數(shù)據(jù)包設(shè)置說(shuō)明
SP.ECPRTCL "U0" K1 K1 D1400 M200;
D1000 Transaction ID 傳輸標(biāo)識(shí)? 就像表格中的序號(hào),便于區(qū)分,可在程序中對(duì)其加1,每次完成后對(duì)傳輸標(biāo)識(shí)加1,這樣就知道通信了幾次了
D1001? 單元標(biāo)識(shí)符??
D1002 寄存器起始地址?
D1003 讀取數(shù)量 (在這里是4個(gè)線圈)
*)
(*?
D1499是干什么的?
MOV H0 D1499
(*Request發(fā)送的數(shù)據(jù)*)
MOV D1499 D1000? //D1000? Transaction ID傳送標(biāo)識(shí)符? ?
MOV H1 D1001 //D1001? Module ID 單元標(biāo)識(shí)符(從站編號(hào))
(假設(shè)有5個(gè)從站,從站編號(hào)為1號(hào)從站2號(hào)從站3號(hào)從站4號(hào)從站當(dāng)Protocol ID=1時(shí)表示指定1號(hào)從站與主站通信)
MOV H0 D1002? //Head input number? (首個(gè)輸入的地址)
MOV H4 D1003? ?//Read Points
MOV K1 D1402? //調(diào)用第1個(gè)協(xié)議號(hào)
SP.ECPRTCL "U0" K1 K1 D1400 M200;*這里是和通信數(shù)據(jù)包中的設(shè)置參數(shù)對(duì)應(yīng)的
控制數(shù)據(jù) D1400? D14002? ?(D14002? ? D14003? D14004 D14005 D14006 D14007 D14008 D14009? 這8個(gè)寄存器對(duì)應(yīng)8個(gè)協(xié)議號(hào)
MOV D1010 K1Y0
D1009 數(shù)據(jù)長(zhǎng)度? D1010 數(shù)據(jù)存儲(chǔ)區(qū) 將讀到的數(shù)據(jù)存到這里
*)
(*
主站發(fā)送的報(bào)文
0644 0000 0006 0102 00 00 00 04
傳送標(biāo)識(shí)符0644?
0000? 協(xié)議標(biāo)識(shí)符? 0000 表示MODBUS TCP協(xié)議
0006 數(shù)據(jù)長(zhǎng)度6個(gè)字節(jié)(0102 00 00 00 04? 占用6個(gè)字節(jié)的存儲(chǔ)空間)
01? 單元標(biāo)識(shí)符(從站設(shè)備地址)
02? 功能碼為02? 讀離散量輸入
00 00? 起始地址
00 04? 寄存器數(shù)量(離散量個(gè)數(shù))
*)
(*?
報(bào)文分析
https://blog.csdn.net/weixin_39608394/article/details/110456624
主機(jī)請(qǐng)求消息
07 78 00 00 00 06 03 03 00 00 00 14
一 二? 三四 ? ?五六? ? ? 七 八? ? ? ?九十? ? ? 十一 十二
****************************
1,2事務(wù)處理標(biāo)識(shí)(傳送標(biāo)識(shí)符)
2字節(jié)
07 78可以理解為報(bào)文的序列號(hào),一般每次通信之后就要加1以區(qū)別不同的通信數(shù)據(jù)報(bào)文。
************************************************************************************
3,4協(xié)議標(biāo)識(shí)符
2字節(jié)
00 00表示ModbusTCP協(xié)議。
****************************
5,6長(zhǎng)度
2字節(jié)
00 06表示接下來(lái)的數(shù)據(jù)長(zhǎng)度,單位為字節(jié)。
****************************
7單元標(biāo)識(shí)符
1字節(jié)
03可以理解為Slave設(shè)備地址。
****************************
8功能碼
1字節(jié)
03 功能碼,讀保持寄存器
****************************
9,10起始地址
2字節(jié)
00 00 起始地址}
****************************
11,12寄存器數(shù)量
2字節(jié)
00 14 讀取寄存器數(shù)量}
======================================================================
從機(jī)回復(fù)消息
07 78 00 00 00 2B 03 03 28 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
事務(wù)處理標(biāo)識(shí)
2字節(jié)
07 78可以理解為報(bào)文的序列號(hào),一般每次通信之后就要加1以區(qū)別不同的通信數(shù)據(jù)報(bào)文。
協(xié)議標(biāo)識(shí)符
2字節(jié)
00 00表示ModbusTCP協(xié)議。
長(zhǎng)度
2字節(jié)
00 2B表示接下來(lái)的數(shù)據(jù)長(zhǎng)度,單位為字節(jié)。
單元標(biāo)識(shí)符
1字節(jié)
03可以理解為Slave設(shè)備地址。
功能碼
1字節(jié)
03 功能碼,讀保持寄存器
起始地址
1字節(jié)
28 回復(fù)的數(shù)據(jù)大小
寄存器數(shù)據(jù)
xxx字節(jié)
讀取的寄存器數(shù)據(jù)
*)