Modbus是一種串(chuan)行通(tong)信協議,是Modicon公司(現(xian)在(zai)的施耐德(de)電氣 Schneider Electric)于(yu)1979年為使用可編程邏輯控(kong)制(zhi)器(PLC)通(tong)信而發表。Modbus已經成為工業領(ling)域通(tong)信協議的業界標準(De facto),并且現(xian)在(zai)是工業電子設備之間(jian)常用的連接方(fang)式。
Modbus協議同樣也是物聯網平臺(tai)的(de)流行協議(yi)之一(yi),采樣(yang)(yang)命令作為Modbus協議(yi)的(de)主要功(gong)能(neng),其主要流程是設(she)備(bei)在平臺(tai)設(she)置周期(qi)采樣(yang)(yang)命令,平臺(tai)會周期(qi)性主動(dong)對在線設(she)備(bei)下發采樣(yang)(yang)命令。
我們在為雄安建設物聯網平(ping)臺時,正(zheng)好平(ping)臺就(jiu)有Modbus的能力(li),平(ping)臺交付就(jiu)必須要測試Modbus的采樣(yang)命(ming)令并發。
物聯網平臺Modbus協議采樣命令(ling)下發流程如下:
創建設(she)(she)備(bei),在平臺(tai)給設(she)(she)備(bei)設(she)(she)置采(cai)樣命令:采(cai)樣周期、功能編號、從機地址、數據長度等(deng)信息。
設備(bei)上(shang)線后,平臺按照采樣周期對設備(bei)進(jin)行(xing)周期性發送采樣命令。
設備收到(dao)采(cai)樣(yang)命令(ling)后將寄存器數據返回結果(guo)給平臺,并保(bao)存采(cai)樣(yang)數據。
通常情(qing)況下我們做性能(neng)測試(shi)都是(shi)客戶(hu)端發(fa)起請求服務的(de)響應客戶(hu)端,而Modbus的(de)采樣命令恰好相反,以往我們常用的(de)性能(neng)測試(shi)工具就不可行(xing)了。
要如何才(cai)能測試服務的采樣命令(ling)的并發呢?
為了測(ce)試物聯網平臺(tai)Modbus協議采(cai)(cai)樣命(ming)令(ling)并發性能(neng),我們研(yan)究出了一種高(gao)并發的(de)采(cai)(cai)樣命(ming)令(ling)并發性能(neng)測(ce)試方(fang)法。該方(fang)法采(cai)(cai)用異步IO的(de)方(fang)式批量(liang)模擬設備連接(jie)服務器、接(jie)收(shou)采(cai)(cai)樣命(ming)令(ling)并響應命(ming)令(ling),并統計(ji)每(mei)秒(miao)接(jie)收(shou)的(de)命(ming)令(ling)數量(liang)。技術實現細(xi)節(jie)如下:
1、通過API批量(liang)創(chuang)建(jian)Modbus設(she)備(bei),并給每個設(she)備(bei)創(chuang)建(jian)n個采樣命令(ling)。即無需(xu)提(ti)前創(chuang)建(jian)設(she)備(bei)和設(she)備(bei)的(de)采樣命令(ling);
2、批量初始化(hua)設(she)備(bei)的socket連接,socket設(she)置(zhi)為非阻塞,生成socket列(lie)表。采用異步IO,減(jian)少多線程線程切換帶來的資(zi)源消(xiao)耗,提升(sheng)CPU利用率;
3、同時(shi)啟動以下三個線程(cheng):
①批量(liang)設備注(zhu)冊線(xian)程:批量(liang)上報注(zhu)冊報文,設備注(zhu)冊完(wan)成(cheng)后線(xian)程退出;
②采樣命令(ling)條(tiao)數統(tong)計線程:所有設備注冊成功后,每秒統(tong)計一次(ci)最近(jin)1秒內收到采樣命令(ling)條(tiao)數;
③采(cai)樣命令(ling)(ling)接收(shou)(shou)處(chu)理線(xian)程(cheng):采(cai)用(yong)select批量管理設備socket列(lie)表,接收(shou)(shou)并立即響應采(cai)樣命令(ling)(ling),并實時記錄(lu)采(cai)樣命令(ling)(ling)條數。select模(mo)型為(wei)非阻塞式(shi)IO,能夠一定程(cheng)度上減(jian)少服務器瞬間的并發線(xian)程(cheng)數,從而提高(gao)CPU執行效(xiao)率(lv);
Python代碼(ma)示例(片段)
4、根據(ju)運行設(she)備數(shu)(shu)量以(yi)及平均每(mei)秒接收到采(cai)樣命(ming)令數(shu)(shu)量來判斷平臺是否滿(man)足當前的采(cai)樣命(ming)令的處理性(xing)能。性(xing)能滿(man)足的條(tiao)件(jian)下(xia)預期(qi)結果為
預期每秒命令接收數量(liang) ≈ 設(she)備數量(liang) * n
逐步(bu)增加設備數量(liang),當預(yu)期每秒(miao)命令接(jie)收數量(liang) > 設備數量(liang) * n時,即服(fu)務(wu)已達到瓶頸。則最(zui)終(zhong)測試服(fu)務(wu)的采樣命令最(zui)大并發量(liang)為,滿足預(yu)期結(jie)果(guo)時的設備最(zui)大接(jie)入量(liang) * n。
該測試方法優點:
1、無(wu)需單獨添(tian)加創建設(she)備(bei)和(he)設(she)備(bei)的(de)采樣(yang)(yang)命令,簡化了Modbus協(xie)議(yi)采樣(yang)(yang)命令性能測試的(de)準(zhun)備(bei)工作;
2、在設備端(duan)統計并發(fa)量,無需在服務(wu)端(duan)增加任何統計邏輯;
3、采(cai)用模擬設備(bei)(bei),無需(xu)準備(bei)(bei)大量(liang)真實設備(bei)(bei),降低(di)了(le)Modbus協議采(cai)樣命令性能(neng)測試的成本;
4、通過非阻(zu)塞式IO,顯(xian)著提(ti)升(sheng)Modbus協議采樣(yang)命令并發(fa)性能測試的設備響應(ying)速度,解決Modbus協議采樣(yang)命令并發(fa)性能測試高并發(fa)狀態下的資源(yuan)浪費問題;
5、設備(bei)響應(ying)速度(du)的提(ti)升,有效提(ti)高(gao)Modbus協議采(cai)樣命(ming)令并發性能(neng)測(ce)試(shi)的準確度(du)。
我(wo)們采(cai)用(yong)此種方法編寫的(de)(de)Python代碼,單個腳(jiao)本可(ke)以支撐1秒(miao)內(nei)1萬(wan)+次(ci)的(de)(de)命令處理能(neng)力(li)。在雄安(an)物(wu)聯網平臺的(de)(de)性能(neng)測(ce)試中起到了非常好的(de)(de)作用(yong),同時(shi)運(yun)行10個腳(jiao)本,完成了雄安(an)平臺Modbus協(xie)議采(cai)樣(yang)命令10萬(wan)并發(fa)的(de)(de)測(ce)試。