PLC程序猿Modbus是PLC應(yīng)用中常用的通訊手段,輪詢是在進(jìn)行一個(gè)控制器連接多個(gè)從站的通訊時(shí)常用的編程手段,由于ST語(yǔ)言在數(shù)據(jù)處理上的優(yōu)勢(shì),此方法變得更為簡(jiǎn)單。下面以西門子S7 1214C PLC的ModbusRTU通訊為例,展現(xiàn)ST語(yǔ)言下的modbus通訊和輪詢。
硬件連接
要準(zhǔn)備的硬件和軟件:
1.西門子PLC 1214C;
2.通訊板CB1241;
3.USB轉(zhuǎn)RS485轉(zhuǎn)換器;
4.Modscan2/Modsim32電腦模擬軟件模擬主/從站,
5.SPU(serial port Utility),監(jiān)視通訊報(bào)文。
PLC作為主站,使用軟件Modsim32模擬從站,使用兩芯線(最好是帶屏蔽雙絞線)進(jìn)行連接:
硬件連接
將通訊板的AB兩端與轉(zhuǎn)換器的AB兩端進(jìn)行連接,要注意AB兩端區(qū)分正負(fù)極,反接不會(huì)燒壞設(shè)備,但是無法正常通訊。
編寫程序
1.設(shè)備組態(tài)
在博圖軟件中配置西門子PLC和通訊板。modbus通訊需要設(shè)置波特率、數(shù)據(jù)位、停止位和校驗(yàn)位等通訊參數(shù),在博圖中的設(shè)備組態(tài)中設(shè)置此參數(shù),主從站設(shè)置一致即可通訊。
通訊參數(shù)
設(shè)置波特率9600,數(shù)據(jù)位8位,停止位1位,無校驗(yàn),在PLC離線模式下下載硬件組態(tài)。
下載組態(tài)信息
2.調(diào)用modbus功能塊
西門子的通訊一般都需要調(diào)用系統(tǒng)功能塊,在“指令”-“通信”-“通信處理器”下可以找到modbus通訊功能塊:
通訊功能塊
可以看到這里提供兩套modbus通訊模塊,這兩套都可以使用(暫不清楚具體的區(qū)別),本文選用的是下面的版本較低的模塊。
新建程序段,將配置模塊MB_COMM_LOAD和主站模塊MB_MASTER拖入程序中:
調(diào)用功能塊
功能塊調(diào)用后要對(duì)必要的引腳進(jìn)行賦值,各個(gè)引腳的功能可以按F1查看,建立一個(gè)DB數(shù)據(jù)塊,聲明一些變量連接功能塊的引腳:
聲明變量
上面聲明了兩個(gè)容量為5的字?jǐn)?shù)組,用于數(shù)據(jù)的發(fā)送和接受,這個(gè)容量可以根據(jù)需求任意設(shè)置。然后將這寫變量寫入模塊引腳:
模塊賦值
配置模塊MB_COMM_LOAD的觸發(fā)REQ只需要在連接時(shí)觸發(fā)一次啊,因此直接將系統(tǒng)內(nèi)置的變量“firstscan”寫入即可,上電后執(zhí)行一次。
由于通訊的讀和寫都由主站模塊MB_MASTER完成,因此我們對(duì)這個(gè)模塊進(jìn)行兩次賦值,第一次實(shí)現(xiàn)讀的功能,由modbus地址40100開始,讀5個(gè)數(shù)據(jù),寫入"ModbusData".Read_Data中;第二次實(shí)現(xiàn)寫的功能,將"ModbusData".Sent_Data中的數(shù)據(jù)寫入由modbus地址40110開始的5個(gè)數(shù)據(jù)中。
程序?qū)懙竭@里已經(jīng)可以進(jìn)行通訊了,如果想要在線實(shí)驗(yàn)一下,可以將變量寫入監(jiān)控表,手動(dòng)觸發(fā)讀寫觸發(fā)引腳變量,觀察模塊的輸出狀態(tài),這里就不演示了。
3.編寫輪詢程序
所謂輪詢就是依次詢問,假設(shè)我們有3個(gè)設(shè)備作為modbus從站,從站地址(站號(hào))依次為1,2,3,使用case語(yǔ)句依次對(duì)這3個(gè)設(shè)備進(jìn)行讀寫操作,而讀出和寫入的數(shù)據(jù)分別存入3套不同的變量當(dāng)中。
建立設(shè)備變量
使用一個(gè)結(jié)構(gòu)體來描述一個(gè)設(shè)備的所有信息,包括5個(gè)狀態(tài)字(states:Array[0..4] of Word)和5個(gè)控制字(ctrl:Array[0..4] of Word),將結(jié)構(gòu)體聲明為數(shù)量為3的數(shù)組,存放3個(gè)設(shè)備的數(shù)據(jù)。
在整個(gè)循環(huán)開始前,設(shè)定起始設(shè)備地址,然后按照“讀操作觸發(fā),讀數(shù)據(jù),讀設(shè)備地址+1,延時(shí),寫數(shù)據(jù),寫操作觸發(fā),寫設(shè)備地址+1,延時(shí)”的順序持續(xù)循環(huán),按照設(shè)備地址號(hào)選擇上面的結(jié)構(gòu)體變量:
讀操作
iStep=0時(shí),關(guān)閉讀寫觸發(fā),設(shè)定讀寫設(shè)備地址為1;
iStep=10時(shí),讀操作觸發(fā),模塊發(fā)出讀數(shù)據(jù)命令,模塊置位busy信號(hào);
iStep=11時(shí),等待讀操作完成,模塊讀到設(shè)備數(shù)據(jù)后會(huì)置位done信號(hào),復(fù)位busy信號(hào),根據(jù)信號(hào)狀態(tài)將讀到的數(shù)據(jù)(Read_Data)寫入設(shè)備數(shù)據(jù)結(jié)構(gòu)體(DeviceData.states),如果設(shè)備地址=1,則寫入DeviceData[1].states,設(shè)備地址變化,寫入的結(jié)構(gòu)體也會(huì)相應(yīng)的變化,保證不同設(shè)備的數(shù)據(jù)不會(huì)互相干涉。這里加一個(gè)判斷,一段時(shí)間讀不到數(shù)據(jù)返回10步驟重新進(jìn)行讀操作。
iStep=12時(shí),用計(jì)數(shù)的方式做一個(gè)簡(jiǎn)單的延時(shí)功能,避免因讀寫頻率太快導(dǎo)致設(shè)備反應(yīng)不過來。
寫操作
向設(shè)備寫入信息,在寫入操作觸發(fā)前要先將相應(yīng)設(shè)備結(jié)構(gòu)體中的數(shù)據(jù)(DeviceData.ctrl)寫入發(fā)送數(shù)據(jù)緩存區(qū)(Sent_Data),然后再進(jìn)行寫操作,與讀操作類似,寫入完成后設(shè)備地址+1,跳轉(zhuǎn)下一步驟。
運(yùn)行程序
將程序編譯寫入后重啟PLC,可以看到通訊板的指示燈已經(jīng)開始閃爍,而輪詢步驟iStep始終在10,11兩步,證明讀數(shù)據(jù)命令已經(jīng)發(fā)出,但是沒有接受到設(shè)備的反饋,始終在進(jìn)行第一個(gè)設(shè)備的讀操作。
雖然能夠看到通訊燈在閃,但我們?nèi)匀徊荒苤庇^的看到這個(gè)網(wǎng)絡(luò)中的狀態(tài),這是就需要前面提到的SPU軟件,監(jiān)視串口網(wǎng)絡(luò)中的報(bào)文。
監(jiān)視報(bào)文
設(shè)定端口號(hào),選擇Hex數(shù)據(jù)格式,點(diǎn)擊開始,可以看到當(dāng)前網(wǎng)絡(luò)中所有報(bào)文,根據(jù)modbus協(xié)議的規(guī)格(可以自行百度),可以判斷這些報(bào)文就是plc發(fā)出的讀命令。
想要讀到數(shù)據(jù)必須要有從站,我們使用modsim軟件模擬出3個(gè)從站:
modsim
將3個(gè)模擬從站地址分別設(shè)為1,2,3,起始modbus地址與程序設(shè)為一致:40100,長(zhǎng)度設(shè)為20,這樣讀寫地址都能看到。點(diǎn)擊connection設(shè)定通訊參數(shù)(波特率,數(shù)據(jù)位,停止位,校驗(yàn)位與程序中設(shè)為一致)。點(diǎn)擊確定后能后看到通訊板和轉(zhuǎn)換器的接受發(fā)送指示燈開始閃爍,程序中的設(shè)備地址也在1-3中循環(huán)變化:
由于動(dòng)圖的幀率選的較低,會(huì)漏掉幾個(gè)燈的狀態(tài)。。。
變化的設(shè)備地址
監(jiān)看程序中設(shè)備地址,能夠看到地址在1-3之間循環(huán)變化。可惜的是modsim與SPU不能共用一個(gè)串口,看不到modsim反饋的報(bào)文了。
接下來我們?cè)趍odsim中改變幾個(gè)地址的值,看看PLC的設(shè)備數(shù)據(jù)結(jié)構(gòu)體中能否進(jìn)行相應(yīng)的變化,將設(shè)備1的數(shù)據(jù)設(shè)定為:
40100設(shè)置為110,
40101設(shè)置為111,
40102設(shè)置為112,
40103設(shè)置為113,
40104設(shè)置為114,
設(shè)定數(shù)據(jù)
數(shù)據(jù)設(shè)定后在PLC的DB塊中監(jiān)視DeviceData的值:
讀取數(shù)據(jù)
可以看到DeviceData[1].states的值已經(jīng)變化(16進(jìn)制),而DeviceData[2]和DeviceData[3]并沒有變化。
下面進(jìn)行寫數(shù)據(jù)的驗(yàn)證,在程序中將DeviceData[2].ctrl任意賦值,然后再modsim中查看:
寫入數(shù)據(jù)賦值
寫入成功
可以看到modsim 3中相應(yīng)地址的數(shù)據(jù)也已經(jīng)變化,而其他模擬設(shè)備中并沒有改變。
其他
在實(shí)際的項(xiàng)目中,例如變頻器控制,通訊參數(shù)和數(shù)據(jù)地址一般都是設(shè)備(從站)規(guī)定好的,我們需要查閱設(shè)備手冊(cè),在程序中做相應(yīng)的設(shè)置即可,通過通訊獲取的數(shù)據(jù)可以有觸摸屏顯示出來,方便操作人員監(jiān)控設(shè)備狀態(tài),也可以做一寫判斷,用于設(shè)備的報(bào)警等處理。
編輯:黃飛
評(píng)論
查看更多