一、 概述
本文描述的程序文件可以在西門(mén)子300 400通過(guò)CPU本體以太網(wǎng)口,以開(kāi)放式通信方式實(shí)現(xiàn)MODBUS TCP 主站通信。
本程序特點(diǎn):
1. 無(wú)需官方授權(quán)。
2. 實(shí)現(xiàn)MODBUS RTU 功能號(hào)1、2、3、4、5、6、15、16。
3. 支持單臺(tái)CPU下多網(wǎng)口通信,一個(gè)連接使用一套程序,互不干擾。
4. 可單條或多條輪詢(xún)指令 離線,即從站掉電,可手動(dòng)讓其離線,減少輪詢(xún)時(shí)間。
5. 程序量再大也不必?fù)?dān)心CPU掃描時(shí)間,因?yàn)槲催\(yùn)行的指令會(huì)跳過(guò)。
6. 每條指令單獨(dú)返回錯(cuò)誤信息。
7. 不必?fù)?dān)心程序塊和數(shù)據(jù)塊多,支持多重背景。
8. 程序組態(tài)直觀,簡(jiǎn)單,方便,靈活。
二、硬件支持
所有支持關(guān)于通信網(wǎng)絡(luò)施工,盡量選擇西門(mén)子以太網(wǎng)綠皮電纜及,
你胡弄網(wǎng)絡(luò),網(wǎng)絡(luò)就胡弄你,所以質(zhì)量可靠的硬件是保證通信正常的前提。通信網(wǎng)絡(luò)的布線要保證EMA電磁兼容性,遠(yuǎn)離強(qiáng)電及強(qiáng)磁場(chǎng)。
三、硬件組態(tài)
現(xiàn)以CPU315-2 PN/DP為例進(jìn)行硬件組態(tài)說(shuō)明
1. 添加機(jī)架及CPU315-2 PN/DP到機(jī)架,雙擊PN-IO-1如圖:
2. 常規(guī)屬性頁(yè),點(diǎn)CPU以太網(wǎng)接口屬性按鈕。
3. 加入子網(wǎng),沒(méi)有的話新建。設(shè)置IP地址和子網(wǎng)掩碼,如果需要路由則還需要設(shè)置網(wǎng)關(guān)。單擊確定完成,保存并編譯硬件組態(tài)。
四、 開(kāi)放式以太網(wǎng)通信組態(tài)
1. 開(kāi)放式以太網(wǎng)通信向?qū)У陌惭b
開(kāi)放式以太網(wǎng)通信向?qū)荢TEP7安裝光盤(pán)根目錄的Optional ComponentsOC Wizardsetup.exe。正常安裝就可以,此向?qū)к浖恍枰跈?quán)。
2. 運(yùn)行開(kāi)放式以太網(wǎng)通信向?qū)В瑝K上右鍵,選OC Wizard
3. 這里點(diǎn)OK
4. 這里可以新建,改變,復(fù)制開(kāi)放式通信連接,我們選擇新建,點(diǎn)擊Next。
5. 我們這里選擇TCP native,點(diǎn)Next。
6. 我們是與第三方通信,所以我們選擇B設(shè)備為不是S7-CPU。點(diǎn)擊Next。
7. 1.Connection ID:連接ID可以任意,但不能重復(fù),ID號(hào)記下來(lái),在程序中會(huì)用到。2.Connection name:連接名稱(chēng)可以任意。3Active:主動(dòng),我們這里選擇PLC主動(dòng)建立連接。4.Used interface:這里選擇使用的接口,我們選擇CPU315/317,5.這里填寫(xiě)從站IP地址。6.點(diǎn)擊Next。
8. 這里我們要填寫(xiě)從站的TCP通信端口號(hào),通常從站的端口號(hào)為502。點(diǎn)擊Next。
9. 這里是建立開(kāi)放式通信的連接指針數(shù)據(jù)塊,可以任意。點(diǎn)擊Next。
10. 這里是建立好連接的列表,點(diǎn)擊Next。
11. 這里問(wèn)你是否還配置其它的連接,點(diǎn)Finish。
12. 點(diǎn)“是”關(guān)閉向?qū)А?br />13. 這是向?qū)Ы⒌耐ㄐ胚B接用的數(shù)據(jù)塊,具體說(shuō)明見(jiàn)其說(shuō)明文檔。
五、 程序說(shuō)明及使用方法
1. 您得到的程序如圖:
這是由STEP7歸檔后文件,應(yīng)使用STEP7恢復(fù)命令,恢復(fù)后會(huì)看到項(xiàng)目已經(jīng)打開(kāi)。
2. 程序工作原理
3. 程序塊功能說(shuō)明:
MbusPointerDB:用戶(hù)數(shù)據(jù)塊。可以是單個(gè)數(shù)據(jù)塊,也可以是多個(gè)數(shù)據(jù)塊。從站返回的數(shù)據(jù)保存在這個(gè)數(shù)據(jù)里,向從站寫(xiě)入的數(shù)據(jù)也在這個(gè)數(shù)據(jù)塊里。
MbusBufferDB:緩沖區(qū)數(shù)據(jù)塊。一個(gè)緩沖區(qū)數(shù)據(jù)塊對(duì)應(yīng)一個(gè)通信連接。將要發(fā)送的數(shù)據(jù)在這里進(jìn)行校驗(yàn)操作,接收回的數(shù)據(jù)同樣在這里校驗(yàn)操作。
MBTcpMaserMsg:主站輪詢(xún)指令功能塊。可以單個(gè)塊運(yùn)行,也可以多個(gè)塊輪流運(yùn)行。根據(jù)輸入?yún)?shù)決定把哪些用戶(hù)數(shù)據(jù)放入緩沖區(qū)數(shù)據(jù)塊,再將從站返回?cái)?shù)據(jù)放回用戶(hù)數(shù)據(jù)塊。注意:同一時(shí)刻只允許一個(gè)主站輪詢(xún)指令工作,否同返回06錯(cuò)誤。
MBTcpMasterCtrl:主站通信控制功能塊。一個(gè)通信控制功能塊對(duì)應(yīng)一個(gè)通信連接。主要功能為發(fā)送和接收與從站的通信的報(bào)文。
4. 功能塊參數(shù)說(shuō)明
MBTcpMasterCtrl
MBTcpMasterCtrl
|
|
|
|
|
功能腳名稱(chēng) | 類(lèi)型 | 數(shù)據(jù)類(lèi)型 | 說(shuō)明 | 允許值,說(shuō)明 |
OpenIEConActive | INPUT | BOOL | 開(kāi)放式通信連接是否激活 | 真為啟用,假為不啟用 |
OpenIeID | INPUT | WORD | 開(kāi)放式通信連接標(biāo)識(shí)符 | 前面向?qū)傻腎D號(hào) |
SendTime | INPUT | TIME | 發(fā)送前定時(shí) | 此值為指令的間隔時(shí)間 |
RcvTimeOut | INPUT | TIME | 接收信息時(shí)的超時(shí)時(shí)間,通常為1S | 值可以很大,但沒(méi)有必要 |
MbusBufferDB | INPUT | BLOCK_DB | 緩沖區(qū)數(shù)據(jù)塊 | 如:DB3000 |
MbusBufferDbNO | INPUT | INT | 緩沖區(qū)數(shù)據(jù)塊號(hào) | 如:3000,需與上面一致,但沒(méi)有DB字母 |
OpenIEConConnect | IN_OUT | ANY | 開(kāi)放式通信連接指令的連接說(shuō)明指針 | 見(jiàn)例程 |
License | OUTPUT | BOOL |
|
|
OpenIEConDone | OUTPUT | BOOL |
| 建立連接時(shí)0: 作業(yè)尚未開(kāi)始或仍在運(yùn)行 1: 無(wú)錯(cuò)執(zhí)行作業(yè) |
OpenIEConBusy | OUTPUT | BOOL |
| 建立連接時(shí)1:作業(yè)尚未完成0:作業(yè)完成
|
OpenIEConError | OUTPUT | BOOL |
| 建立連接時(shí)1:處理作業(yè)期間出現(xiàn)錯(cuò)誤。STATUS返回有關(guān)錯(cuò)誤類(lèi)型的詳細(xì)信息 |
OpenIEConStatus | OUTPUT | WORD |
| 建立連接時(shí)錯(cuò)誤信息 |
OpenIEDisconDone | OUTPUT | BOOL |
| 斷開(kāi)連接時(shí)0: 作業(yè)尚未開(kāi)始或仍在運(yùn)行 1: 無(wú)錯(cuò)執(zhí)行作業(yè) |
OpenIEDisconBusy | OUTPUT | BOOL |
| 斷開(kāi)連接時(shí)1:作業(yè)尚未完成0:作業(yè)完成
|
OpenIEDisconError | OUTPUT | BOOL |
| 斷開(kāi)連接時(shí)1:處理作業(yè)期間出現(xiàn)錯(cuò)誤。STATUS返回有關(guān)錯(cuò)誤類(lèi)型的詳細(xì)信息 |
OpenIEDisconStatus | OUTPUT | WORD |
| 斷開(kāi)連接時(shí)錯(cuò)誤信息 |
WorkingSlave | OUTPUT | INT | 正在與從站通信的從站地址 | 可能值為1到247 |
Done | OUTPUT | BOOL | 完成標(biāo)志位 | 通信連接后,一直為真 |
MBTcpMasterMsg
MBTcpMasterMsg
功能腳名稱(chēng) | 類(lèi)型 | 數(shù)據(jù)類(lèi)型 | 說(shuō)明 | 允許值,說(shuō)明 |
InstructionActive | INPUT | BOOL | 真為激活指令,假為不激活指令 |
|
NewRequest | INPUT | BOOL | 讀寫(xiě)請(qǐng)求位 | 每一個(gè)新的讀寫(xiě)請(qǐng)求必須使用脈沖觸發(fā) |
Slave | INPUT | INT | 從站地址 | 1到247 |
ReadWrite | INPUT | INT | 0=讀,1=寫(xiě) | 1. 開(kāi)關(guān)量輸出和保持寄存器支持讀和寫(xiě)功能 2. 開(kāi)關(guān)量輸入和模擬量輸入只支持讀功能 |
Addr | INPUT | DINT | 讀寫(xiě)從站的數(shù)據(jù)地址 | 選擇讀寫(xiě)的數(shù)據(jù)類(lèi)型 00001 至 0xxxx - 開(kāi)關(guān)量輸出 10001 至 1xxxx - 開(kāi)關(guān)量輸入 30001 至 3xxxx - 模擬量輸入 40001 至 4xxxx - 保持寄存器 400001 至 465535 - 保持寄存器 |
Count | INPUT | INT | 數(shù)據(jù)個(gè)數(shù) | 通訊的數(shù)據(jù)個(gè)數(shù)(位或字的個(gè)數(shù)) Modbus主站可讀/寫(xiě)的最大數(shù)據(jù)量為120個(gè)字(是指每一個(gè) MBUS_MASTER_MSG 指令) |
MbusBufferDB | INPUT | BLOCK_DB | 緩沖區(qū)數(shù)據(jù)塊 | 如:DB3000 |
MbusPointerDB | INPUT | BLOCK_DB | 用戶(hù)數(shù)據(jù)塊 | 如:DB2000 |
MbusPointerBYTE | INPUT | INT | 用戶(hù)數(shù)據(jù)塊字節(jié)地址 | 1. 如果是讀指令,讀回的數(shù)據(jù)放到數(shù)據(jù)區(qū)這個(gè)字節(jié)開(kāi)始的區(qū)域中 2. 如果是寫(xiě)指令,要寫(xiě)出的數(shù)據(jù)從這個(gè)字節(jié)開(kāi)始的數(shù)據(jù)區(qū)取出 |
Done | OUTPUT | BOOL | 完成位 | 此位為脈沖信號(hào),需要保持信號(hào),用戶(hù)自行加起保停程序,完成位為啟動(dòng),讀寫(xiě)請(qǐng)求位為停止即可。 |
Error | OUTPUT | INT | 通信錯(cuò)誤 | 0無(wú)錯(cuò)誤 3接收超時(shí) 4輸入?yún)?shù)錯(cuò)誤 5 Modbus通信未激活 6忙,正在處理其它請(qǐng)求 7接收的數(shù)據(jù)CRC校驗(yàn)錯(cuò)誤 8接收的數(shù)據(jù)長(zhǎng)度與預(yù)長(zhǎng)長(zhǎng)度不符 9響應(yīng)錯(cuò)誤,響應(yīng)不是請(qǐng)求的操作 10發(fā)送出錯(cuò) 11接收出錯(cuò) 14本指令未啟用 101從站不支持請(qǐng)求的功能 102從站不支持?jǐn)?shù)據(jù)地址 103從站不支持此種數(shù)據(jù)類(lèi)型 104從站設(shè)備故障 105從站接收的信息,但響應(yīng)被延遲 106從站忙,拒絕了該消息 107從站拒絕了消息 108從站存儲(chǔ)器奇偶錯(cuò)誤
|
MbusSendStatus | OUTPUT | WORD |
| 見(jiàn)發(fā)送指令規(guī)范 |
MbusRevStatus | OUTPUT | WORD |
| 發(fā)接收指令規(guī)范 |
MbusBufferDB
緩沖區(qū)數(shù)據(jù)塊是一個(gè)400(不可小于400)個(gè)字節(jié)數(shù)據(jù)塊,可以復(fù)制,可改符號(hào),可改絕對(duì)地址。
MbusPointerDB
用戶(hù)數(shù)據(jù)塊用戶(hù)可自行定義,無(wú)要求。
六、 程序注意
例程內(nèi)有PLC上電初始化脈沖(FirstScanOn),見(jiàn)OB1最下方程序及OB100。指令使用此脈沖初始化。指令內(nèi)使用符號(hào)尋址,所以絕對(duì)地址可更改。
其它指令的符號(hào)地址和絕對(duì)地址都可更改。
當(dāng)功能號(hào)為5時(shí),用戶(hù)數(shù)據(jù)塊的字節(jié)地址的第0位有效。當(dāng)功能號(hào)為1,2,15時(shí),用戶(hù)數(shù)據(jù)塊的字節(jié)地址的從第0位開(kāi)始有效。程序無(wú)法在仿真器內(nèi)工作。七、 程序高級(jí)應(yīng)用
1. 當(dāng)有多臺(tái)從站執(zhí)行相同操作時(shí),如讀取相同數(shù)據(jù)寄存器。這時(shí)可將指令的完成位連接到讀寫(xiě)請(qǐng)求位,將從站地址和用戶(hù)數(shù)據(jù)塊字節(jié)號(hào)做成變量,使用完成位改變這兩個(gè)變量,就可以實(shí)現(xiàn)單指令輪詢(xún)多主站。
2. 當(dāng)用通信控制設(shè)備啟停等操作時(shí),或多從站時(shí)快速刷新單個(gè)從站數(shù)據(jù)時(shí),要求響應(yīng)時(shí)間快一些,而有些程序沒(méi)有這方面考慮。本程序在應(yīng)對(duì)此方面可以將單一輪詢(xún)指令的激活位置真,其它指令置假(用上升沿,僅一個(gè)掃描即可),這時(shí)不管其它指令在什么狀態(tài)都會(huì)將連接使用權(quán)讓出,優(yōu)先讓激活的指令運(yùn)行。
八、 不足之處
這里共享出所有已經(jīng)編好的例程,由于硬件有限,只有在winAC和cpu315中經(jīng)過(guò)通信驗(yàn)證,如果網(wǎng)友使用其它通信模塊有問(wèn)題,我們會(huì)根據(jù)問(wèn)題完善程序。通信程序?yàn)槿δ?4天運(yùn)行版,24天后可對(duì)PLC進(jìn)行清除復(fù)位,程序繼續(xù)可用。如項(xiàng)目需要無(wú)限時(shí)版,指令屬性?xún)?nèi)有聯(lián)系方式。
本文未盡事宜,歡迎來(lái)電了解。
[ 此帖被wlmissyou在2020-08-16 10:31重新編輯 ]