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