如果現(xiàn)在有個項目,需要modbus控制五個變頻器,那該怎么辦?也許你會說,這還不簡單,把前面的通信程序復制五遍不就行了?理論上,這是可行的,但卻是不可行的,為什么呢?因為串口在同一時間,只能進行一次數(shù)據(jù)交互。這個一次,是指一次讀或是寫操作。這就好比一個很窄的路口,一次只能通過一輛汽車,如果五輛汽車一起通過,勢必會引起堵塞,一輛也過不去,但我們需要過五輛怎么辦?那就需要交通燈或是交警指揮交通,通信也一樣,也需要有交通燈或是交警,而在modbus通信中,就需要我們自己來當交警,通過程序控制通信流程,這就是輪詢方式。而modbus通信實現(xiàn)輪詢,有兩個常用的方法。
1.時間間隔法
所謂時間間隔法,就是每個操作分配一個固定的時間,比如第一秒寫入頻率,第二秒讀取頻率,第三秒讀取電流,當然,這個時間是要根據(jù)實際情況來設置的,我們看一個例子
圖一時間間隔
如圖一所示,這是一個blink 和計數(shù)器兩個功能塊組成的程序,blink產(chǎn)生一個50毫秒的脈沖,而計數(shù)器對此脈沖進行計數(shù),因此,計數(shù)器的當前計數(shù)值cv 也就是圖中黃色熒光筆部分,就會從1 到6每隔50毫秒遞增一次。這樣,就為每一次操作分配了50毫秒的時間。
圖二 利用時間間隔觸發(fā)通信
如圖二,紅色圓圈部分,當數(shù)值等于1的時候,我們寫入地址0002,當數(shù)值等于2的時候,我們讀取103,依次類推。黃色熒光筆部分是觸發(fā)路徑。
2.功能塊觸發(fā)法
功能塊觸發(fā)法,是利用功能塊的狀態(tài)參數(shù)來觸發(fā)下一次通信,也就是我在介紹通信的時候使用的busy信號
圖三 利用busy信號觸發(fā)下一次讀寫
如圖三所示,當寫入0002通信完成后,利用busy信號來觸發(fā)下一次通信,讀取103的值。圖中黃色熒光筆的部分,就是觸發(fā)路徑,當上一個通信功能塊的busy信號產(chǎn)生下降沿的時候,證明這次通信已經(jīng)完成,以此來觸發(fā)下一次通信。
以上,就是兩種常用的輪詢方法,它們各有優(yōu)缺點,最好的方式就是兩者結合。利用時間間隔,這個時間間隔的設置就很講究,時間太短,可能通信還沒完成,時間太長影響效率。而利用功能塊的busy信號,可以很好解決這個問題,但是,一旦一個環(huán)節(jié)通信出錯,busy信號無法給出,就會造成后面的通信無法進行,那么該如何結合呢?那就是用時間間隔來確定從站之間的通信間隔,而同一個從站的讀寫就用功能塊信號觸發(fā),這樣即使通信有錯誤,也只是影響一個從站。
我們?yōu)槊總€從站分配30毫秒的時間,那么輪詢10個從站只需要300毫秒,這基本能滿足我們的需求,而又能保證每個站的通信時間。因為超過10個從站,就不建議用modbus通信了,那樣就要考慮使用總線了。而一個從站內(nèi)部,要讀寫多次的時候,就用busy信號觸發(fā)。這樣,即使一個從站通信出現(xiàn)問題,也不會影響下一個從站的通信。