西門子s7-1200 PLC與s7-200 SMART PLC 基于Modbus RTU主從輪詢的通信
一、引言
在應(yīng)用西門子中小型PLC進(jìn)行通信的時(shí)候,盡管西門子目前主推的PLC比如s7-200 Smart、S7-1200系列PLC CPU都自帶有網(wǎng)口,可以非常方便的進(jìn)行以太網(wǎng)組網(wǎng),但一些特殊場合,還是需要采用串口通信。
二、Modbus RTU通信
Modbus協(xié)議是一個(gè)標(biāo)準(zhǔn)、開放、免費(fèi)的協(xié)議,支持RS232、RS485電氣接口類型。在Modbus網(wǎng)絡(luò)中,只能有一個(gè)主站,其他為從站;傳輸方式有ASCII、RTU和TCP,其中Modbus RTU是最常用的Modbus通信協(xié)議。
2.1 配置西門子S7-1200 PLC為Modbus RTU主站
2.1.1 硬件組態(tài)
西門子s7-1200系列PLC,比如CPU型號(hào)為CPU1214C DC/DC/DC,自帶一個(gè)網(wǎng)口,如果需要應(yīng)用串口通信,則必須新增串行通信模塊,比如支持RS422/RS485通信的模塊CM1241。

如圖1所示,在博途V13軟件中配置PLC的硬件組態(tài),CPU位于插槽1,左側(cè)101插槽添加通信模塊CM1241,右側(cè)2號(hào)及往后插槽配置信號(hào)模塊SM。在通信模塊的硬件屬性頁中,可以查看接口的端口組態(tài),尤其注意“操作模式”為“半雙工”,以及波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位。
2.1.2 通信編程
下載硬件組態(tài),確保硬件配置無錯(cuò)誤,再編寫通信程序。將s7-1200 PLC配置為Modbus RTU主站,需要在程序中調(diào)用MB_COMM_LOAD和MB_MASTER指令。

值得注意的是,Modbus RTU通信端口初始化指令MB_COMM_LOAD只能上電調(diào)用一次,為此需要用到系統(tǒng)“FirstScan”位使能和觸發(fā)指令,這個(gè)位可在CPU屬性頁的“系統(tǒng)和時(shí)鐘存儲(chǔ)器”中啟用和設(shè)置。
MB_COMM_LOAD指令各管腳的定義,可按F1獲取幫助信息,其中BAUD、PARITY的值必須與圖1所示的通信模塊CM1241組態(tài)的通信參數(shù)一致。MB_DB為主站數(shù)據(jù)塊,決定了PLC是作為主站還是從站。如圖2。
然后如圖3,調(diào)用通信主站指令MB_MASTER(其實(shí)是一個(gè)FB塊),其背景數(shù)據(jù)塊MB_MASTER_DB(BD7)必須與圖2端口初始化指令的MB_DB設(shè)置相同。

REQ為上升沿觸發(fā)通信,MB_ADDR為從站地址,MODE為讀寫模式(0=讀,1=寫),DATA_ADDR為Modbus地址,DATA_LEN為數(shù)據(jù)長度,DATA_PTR為數(shù)據(jù)接收區(qū)(注意為指針類型指向一片數(shù)據(jù)區(qū),用來收發(fā)數(shù)據(jù)),具體定義可按F1獲取幫助信息。

主站通信程序編程比較復(fù)雜,需要編寫讀、寫并定義讀寫數(shù)據(jù)接收區(qū)。且圖1配置的通信模塊的操作模式為半雙工,只能單個(gè)子站讀或?qū)懀@意味著同一時(shí)刻主站通信塊指令MB_MASTER只能執(zhí)行一次。實(shí)際工程應(yīng)用中,如果只有一個(gè)子站,則讀、寫輪詢;如果有多個(gè)子站,則需要子站間輪詢,再讀寫輪詢;如此形成一個(gè)輪詢鏈。
2.1.3 輪詢通信的說明
以某項(xiàng)目為例,19個(gè)子站需要編寫38條MB_MASTER指令,上一個(gè)子站的寫完成標(biāo)志位(或錯(cuò)誤標(biāo)志位),觸發(fā)本子站讀指令;而本子站讀完成標(biāo)志(或錯(cuò)誤標(biāo)志),觸發(fā)本子站寫指令;進(jìn)而本子站寫完成標(biāo)志位(或錯(cuò)誤標(biāo)志位),觸發(fā)下一個(gè)子站讀指令。首尾相連,形成閉環(huán),不斷輪詢。
如果有子站通信錯(cuò)誤或丟失,則會(huì)影響其他子站通信的實(shí)時(shí)響應(yīng)??稍趫D2的MB_COMM_LOAD的RESP_TO(響應(yīng)超時(shí))設(shè)置響應(yīng)等待時(shí)間,默認(rèn)值為1000毫秒,可設(shè)置為100毫秒,太小會(huì)出現(xiàn)子站超時(shí)誤判斷,太大的話,如果有子站掉線,則會(huì)嚴(yán)重影響其他子站的數(shù)據(jù)刷新。
2.1.4 數(shù)據(jù)接收區(qū)的說明
定義的數(shù)據(jù)接收區(qū)DB3(Modbus_RTU_DB),常規(guī)設(shè)置頁面的屬性中,應(yīng)取消勾選“優(yōu)化的塊訪問”(即s7-1200的符號(hào)訪問),修改之后兼容s7-300/400數(shù)據(jù)塊按地址偏移量訪問的方式。如圖5所示。

數(shù)據(jù)塊DB3修改屬性之后,就可以按絕對地址尋址。打開數(shù)據(jù)塊DB3,在列頭右鍵,勾選“顯示隱藏”>“偏移量”,如圖6。

如圖7所示,在數(shù)據(jù)塊的屬性中取消勾選“優(yōu)化的塊訪問”,就可以查看數(shù)據(jù)塊內(nèi)每個(gè)數(shù)據(jù)存儲(chǔ)區(qū)的偏移地址了。

因?yàn)镸odbus RTU通信設(shè)置的數(shù)據(jù)接收區(qū),是按數(shù)據(jù)塊的偏移量,也就是絕對地址尋址的,所以將數(shù)據(jù)塊設(shè)置為DATA_PTR接收區(qū)的同時(shí)必須修改塊的訪問方式;否則,通信報(bào)錯(cuò)。
2.2 配置西門子S7-200 SMART PLC為Modbus RTU從站
Modbus RTU從站設(shè)置相對要簡單一些,只需要調(diào)用MBUS_INIT和MBUS_SLAVE指令。由于S7-200 SMART PLC自帶串口,無需令加模塊,設(shè)置也簡單。

注意,如圖8所示,MBUS_INI指令輸入HoldStart為V存儲(chǔ)器中保持寄存器的起始地址,如果設(shè)置為&VB1000,則建立了VB1000與Modbus寄存器[40001]的聯(lián)系,即VB1000+VB1001=VW1000=Modbus[40001]。

可以將一些需要通信的數(shù)據(jù)轉(zhuǎn)移到VB1000開始的數(shù)據(jù)區(qū)內(nèi),傳給Modbus主站,也可以接收主站發(fā)送過來的數(shù)據(jù)。
2.3 主從站通信測試
至此,已經(jīng)完成了主從站之間的通信設(shè)置和編程,接下來就可以連接通信口開始數(shù)據(jù)包的測試了。

子站從VB1000開始發(fā)送數(shù)據(jù)至Modbus[40001]開始的寄存器內(nèi),主站從Modbus[40001]開始的寄存器內(nèi)讀取數(shù)據(jù),轉(zhuǎn)存至DB3數(shù)據(jù)塊內(nèi)。如圖10、11所示:3號(hào)子站VD1008,對應(yīng)DB3.DBD168,經(jīng)測試,通信正常。

三、總結(jié)
西門子PLC的通信設(shè)置較為復(fù)雜,尤其是非網(wǎng)口非以太網(wǎng)通信,需要調(diào)用通信指令,定義通信模式,設(shè)置通信參數(shù)和數(shù)據(jù)收發(fā)區(qū)。對于小型PLC s7-200,或s7-200 SMART,由于自帶串口,采用Modbus RTU通信較為經(jīng)濟(jì)、便捷。
而對于中小型PLC s7-1200,由于CPU自帶網(wǎng)口,沒有串口,如非必須,建議采用Modbus TCP通信方式,經(jīng)網(wǎng)口與上位機(jī)或其他設(shè)備交互數(shù)據(jù),特殊場合采取Modbus RTU通信協(xié)議通信,需要增加通信模塊。