AM403作為ModbusTCP主站通訊實(shí)例
一、通訊方案實(shí)例
?1.客戶端/服務(wù)端
??客戶端和服務(wù)端是計(jì)算機(jī)網(wǎng)絡(luò)中常見(jiàn)的兩種網(wǎng)絡(luò)設(shè)備類型,在工業(yè)通信中也稱之為主站/從站,它們?cè)诰W(wǎng)絡(luò)通信過(guò)程中扮演著不同的角色。簡(jiǎn)單來(lái)說(shuō),客戶端通常在網(wǎng)絡(luò)中發(fā)起請(qǐng)求,而服務(wù)端則為客戶端提供資源或數(shù)據(jù)。本例中使用主站/從站來(lái)描述這種關(guān)系。
?? 本例以匯川AM403作為ModbusTCP主站,與從站進(jìn)行數(shù)據(jù)交互,主站IP設(shè)為 192.168.0.10,從站IP設(shè)為192.168.0.11。
?閱讀本博文前請(qǐng)先熟悉匯川中型PLC的編程環(huán)境,即 InoProShop。
?2.通訊方案設(shè)計(jì)
?? 在從站未指定的前提下實(shí)現(xiàn)以下幾種通訊方案:
?? ● 讀取從站輸入狀態(tài);
?? ● 讀取從站狀態(tài)寄存器;
?? ● 更新從站線圈;
?? ● 更新保持寄存器;
?? ● 讀取地址連續(xù)的混合類型變量(即struct,結(jié)構(gòu)體);
?? ● 更新地址連續(xù)的混合類型變量(即struct,結(jié)構(gòu)體)。
二、AM403作為Modbus主站的配置過(guò)程
?1.將AM403設(shè)為主站
??AM403本體帶一路EtherNET口(CN3),本例使用該網(wǎng)口作為ModbusTCP通訊口。
??如下圖所示展開項(xiàng)目樹,從設(shè)備樹中找到網(wǎng)絡(luò)組態(tài)(或者Network Configuration):
??雙擊該節(jié)點(diǎn)標(biāo)題打開網(wǎng)絡(luò)組態(tài)設(shè)置界面,在Ethernet選項(xiàng)框中找到ModbusTCP 主站,勾選該復(fù)選框,如下圖所示:
?2.給主站添加從站節(jié)點(diǎn)
??展開【網(wǎng)絡(luò)設(shè)備列表】中的【以太網(wǎng)口】節(jié)點(diǎn):
??雙擊【Modbus_TCP】或拖動(dòng)【Modbus_TCP】放置到網(wǎng)絡(luò)組態(tài)界面即可添加從站設(shè)備,可以添加多個(gè)從站。
?3.修改通訊參數(shù)
-
修改主站通訊參數(shù)
?雙擊設(shè)備節(jié)點(diǎn)打開設(shè)備屬性界面,選擇【系統(tǒng)設(shè)置】選項(xiàng)框:
??找到【網(wǎng)絡(luò)】→【網(wǎng)口0】,在此處的EhtherNet 口地址即是 Modbus TCP 通訊口,將該網(wǎng)口參數(shù)設(shè)置為工程實(shí)際值。
-
修改從站通訊參數(shù)
?找到并展開設(shè)備節(jié)點(diǎn)下的Modbus TCP主站節(jié)點(diǎn),該節(jié)點(diǎn)下掛載了剛才添加的從站設(shè)備:
??雙擊從站節(jié)點(diǎn)打開通訊設(shè)置:
??在【ModbusTCP從站設(shè)置】選項(xiàng)卡里即可設(shè)置從站IP等通訊參數(shù),當(dāng)寄存器SM3001為1時(shí)從站被使能。
三、Modbus主站與從站通訊任務(wù)配置
?匯川AM403通過(guò)設(shè)置通訊任務(wù)而不需要編程即可完成Modbus通訊。
?1.通訊任務(wù)設(shè)置入口
??匯川中型PLC的Modbus TCP通訊任務(wù)是配置在從站節(jié)點(diǎn)中的:
??a).找到Modbus TCP主站節(jié)點(diǎn)下掛載的從站設(shè)備節(jié)點(diǎn):
??b).雙擊從站設(shè)備打開通訊設(shè)置,切換選項(xiàng)卡到【Modbus TCP通信設(shè)置】選項(xiàng):
??c).點(diǎn)擊選項(xiàng)卡最底部的【添加】按鈕或者右擊選項(xiàng)卡空白處在右鍵選項(xiàng)卡中選擇【添加】,彈出【Modbus 通信設(shè)置】頁(yè)面:
??每個(gè)從站可以配置多個(gè)Modbus TCP通信通道,每個(gè)通道對(duì)應(yīng)一條通訊任務(wù)。下面分別介紹實(shí)現(xiàn)實(shí)例的通訊目標(biāo)。
?2.讀取從站輸入狀態(tài)
-
Channel 01:電平觸發(fā)讀取一個(gè)輸入狀態(tài),讀取失敗則返回最后一次成功的值,輸入狀態(tài)地址為0x0000
?存取類型設(shè)置為【讀輸入狀態(tài)(功能碼02)】,觸發(fā)器設(shè)置為電平觸發(fā),觸發(fā)變量為 SM3101;起始地址為0x0000,長(zhǎng)度為1;錯(cuò)誤處理方式是保持最后的值。 -
Channel 02:持續(xù)讀取八個(gè)輸入狀態(tài),讀取失敗則返回0,狀態(tài)起始地址為0x0010
?存取類型設(shè)置為【讀輸入狀態(tài)(功能碼02)】,觸發(fā)器設(shè)置為循環(huán)執(zhí)行,每隔100ms發(fā)起一次請(qǐng)求;起始地址為0x0010,長(zhǎng)度為8;錯(cuò)誤處理方式是設(shè)置為0。
??不建議將循環(huán)事件設(shè)置的太短,會(huì)增加CPU的負(fù)擔(dān)。
?3.讀取從站輸入寄存器
-
Channel 03:電平觸發(fā)讀取一個(gè)輸入寄存器,讀取失敗則返回最后一次成功的值,輸入寄存器地址為0x0002
?存取類型設(shè)置為【讀輸入寄存器(功能碼04)】,觸發(fā)器設(shè)置為電平觸發(fā),觸發(fā)變量為 SM3102;起始地址為0x0002,長(zhǎng)度為1;錯(cuò)誤處理方式是保持最后的值。 -
Channel 04:持續(xù)讀取2個(gè)輸入寄存器,讀取失敗則返回0,輸入寄存器起始地址為0x0003
?存取類型設(shè)置為【讀輸入寄存器(功能碼04)】,觸發(fā)器設(shè)置為循環(huán)執(zhí)行,每隔100ms發(fā)起一次請(qǐng)求;起始地址為0x0003,長(zhǎng)度為2;錯(cuò)誤處理方式是設(shè)置為0。
?4.更新從站線圈
-
Channel 05:電平觸發(fā)更新一個(gè)線圈狀態(tài),線圈地址為0x0000
?存取類型設(shè)置為【寫單個(gè)線圈(功能碼05)】,觸發(fā)器設(shè)置為電平觸發(fā),觸發(fā)變量為 SM3103;起始地址為0x0000。 -
Channel 06:持續(xù)更新一組連續(xù)線圈狀態(tài),線圈起始地址為0x0010
?存取類型設(shè)置為【寫多個(gè)線圈(功能碼15)】,觸發(fā)器設(shè)置為循環(huán)執(zhí)行,起始地址為0x0010,長(zhǎng)度為8。同理,循環(huán)時(shí)間應(yīng)當(dāng)適當(dāng)延長(zhǎng)以降低CPU負(fù)載。
?5.更新保持寄存器
-
Channel 07:電平觸發(fā)更新一個(gè)寄存器,寄存器地址為0x0000
?存取類型設(shè)置為【寫單個(gè)寄存器(功能碼06)】,觸發(fā)器設(shè)置為電平觸發(fā),觸發(fā)變量為 SM3104;起始地址為0x0000。 -
Channel 08:持續(xù)更新2個(gè)寄存器,寄存器起始地址為0x0001
?存取類型設(shè)置為【寫多個(gè)寄存器(功能碼16)】,觸發(fā)器設(shè)置為循環(huán)執(zhí)行,循環(huán)時(shí)間即為兩次通訊間隔時(shí)間;起始地址為0x0001,長(zhǎng)度為2。同理,循環(huán)時(shí)間應(yīng)當(dāng)適當(dāng)延長(zhǎng)以降低CPU負(fù)載。
?5.讀取復(fù)雜數(shù)據(jù)的寄存器
-
Channel 09:讀取Real類型變量,寄存器地址為0x0003
?Modbus無(wú)法直接讀取浮點(diǎn)型變量,需要將數(shù)據(jù)進(jìn)行轉(zhuǎn)換。假如從站有一個(gè)地址為0x0003的Real類型變量(長(zhǎng)度為32位),主站可以通過(guò)讀取兩位寄存器,然后再組裝的方式獲取該Real類型變量。
?利用InoProShop中的聯(lián)合數(shù)據(jù)單元可以方便的實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換,聯(lián)合中可以設(shè)置內(nèi)存對(duì)齊的數(shù)據(jù),這樣無(wú)需編程就可以安全的實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換:
// wBuffer 、byteBuffer 和 rValue 是長(zhǎng)度相同的數(shù)據(jù)結(jié)構(gòu),通過(guò)聯(lián)合 (UNION) ,使它們共用一塊對(duì)齊的內(nèi)存。
// 如果你熟悉西門子的PLC,你可能很容易理解 MW0、MW2和MD0的聯(lián)系,聯(lián)合即是這種關(guān)系的另一種描述。
TYPE uW_R:
UNION
wBuffer : ARRAY[0..1] OF WORD ;
byteBuffer : ARRAY[0..3] OF BYTE;
rValue : REAL;
END_UNION
END_TYPE
-
Channel 10:讀取struct類型變量,寄存器地址為0x0005
?假如從站有連續(xù)的 16個(gè) bool 型變量、1個(gè) word 、1個(gè) float ,主站讀取這寫數(shù)據(jù),bool、word、float 都屬于值類型。InoProShop 中,struct 也是值類型的,int、word、float 等都是 struct 的簡(jiǎn)單方式。使用Modbus通訊復(fù)雜結(jié)構(gòu)的數(shù)據(jù)時(shí)可以將復(fù)雜數(shù)據(jù)組裝成 struct ,然后通過(guò)聯(lián)合獲取 struct 序列化的寄存器(word)數(shù)組:
// 將數(shù)據(jù)組裝成 STRUCT
TYPE MixData :
STRUCT
arrayBool : ARRAY[0..15] OF BOOL;
wValue : WORD;
fValue : REAL;
END_STRUCT
END_TYPE
// 將數(shù)據(jù)序列化成 WORD 數(shù)組
TYPE uW_St:
UNION
wBuffer : ARRAY[0..1] OF WORD ;
stValue : MixData ;
END_UNION
END_TYPE
?? 同理,將float變量換成結(jié)構(gòu)體,即可利用聯(lián)合實(shí)現(xiàn)由寄存器數(shù)組到結(jié)構(gòu)體的數(shù)據(jù)轉(zhuǎn)換。
?6.更新復(fù)雜數(shù)據(jù)的寄存器
-
Channel 11:更新Real類型變量,寄存器地址為0x0007
?和讀取Real類型變量同理。 -
Channel 12:更新struct類型變量,寄存器地址為0x0009
?和讀取復(fù)雜結(jié)構(gòu)數(shù)據(jù)同理。
??其它通信任務(wù)請(qǐng)自行測(cè)試,此處不再贅述。
四、配置通訊地址
?1.IO映射
??完成通訊配置后在從站屬性里會(huì)多出一個(gè)Internal I/O映射選項(xiàng)卡,通過(guò)【通道】名稱,I/O映射表和通訊設(shè)置里的變量形成映射關(guān)系。
??只能將從站的數(shù)據(jù)映射到主站的I/O存儲(chǔ)區(qū),用戶需要通過(guò)編程將數(shù)據(jù)轉(zhuǎn)移到需要的變量存儲(chǔ)區(qū)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-767762.html
?2.修改映射地址
??I/O映射表中的【地址】即為主站與從站通訊的數(shù)據(jù),配置完通信通道后編程環(huán)境會(huì)自動(dòng)為用戶匹配默認(rèn)的通訊地址,用戶可自行修改該地址,但不能修改寄存器類型。對(duì)于單次讀取一個(gè)輸入狀態(tài)和單次讀取多個(gè)輸入狀態(tài),時(shí)間開銷差別并不大,建議將需要通訊的數(shù)據(jù)放到一起一次完成通訊以節(jié)省握手等待時(shí)間。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-767762.html
到了這里,關(guān)于匯川AM403PLC作為ModbusTCP主站通訊實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!