摘要:利用C#語(yǔ)言基于MODBUS通信協(xié)議開(kāi)發(fā)了自動(dòng)上料機(jī)監(jiān)控系統(tǒng),該系統(tǒng)實(shí)現(xiàn)了對(duì)設(shè)備的手動(dòng)、自動(dòng)控制和監(jiān)視,并能對(duì)相關(guān)的運(yùn)行參數(shù)進(jìn)行設(shè)置,介紹了系統(tǒng)開(kāi)發(fā)中的主要方案及關(guān)鍵技術(shù),經(jīng)實(shí)際驗(yàn)證,該系統(tǒng)穩(wěn)定可靠,達(dá)到了預(yù)期的目標(biāo)。
關(guān)鍵詞:上位機(jī);MODBUS-ASCII;串口;監(jiān)控
《網(wǎng)絡(luò)科技時(shí)代》雜志創(chuàng)刊于2001年1月,是中華人民共和國(guó)教育部主管,中央電化教育館等單位主辦的電腦普及月刊,全國(guó)公開(kāi)發(fā)行。
某自動(dòng)上料機(jī)用于將工件傳輸給測(cè)試設(shè)備進(jìn)行測(cè)試,該上料機(jī)有3個(gè)放料區(qū),分別為待測(cè)區(qū)、PASS區(qū)、FAIL區(qū),完成從待測(cè)區(qū)取料,送料給測(cè)試設(shè)備,測(cè)試完成后取回并根據(jù)測(cè)試結(jié)果(好或壞)將工件自動(dòng)進(jìn)行分撿放置到PASS區(qū)和FAIL區(qū);3個(gè)放料區(qū)都由馬達(dá)和相應(yīng)的傳感器來(lái)控制,根據(jù)物料的高度自動(dòng)升降料臺(tái),以使料臺(tái)保持在合適的高度,方便上料機(jī)抓取和存放物料。該設(shè)備涉及啟動(dòng)按鈕、安全光柵、限位開(kāi)關(guān)等輸入端口40個(gè),氣缸控制、直流電機(jī)控制等輸出端口16個(gè),并由下位機(jī)直接控制,為了便于對(duì)設(shè)備進(jìn)行操作、監(jiān)視、控制和設(shè)置參數(shù),開(kāi)發(fā)了自動(dòng)上料機(jī)的監(jiān)控軟件,采用串口與下位機(jī)進(jìn)行通信,為了確保通信的穩(wěn)定可靠,采用了MODBUS-ASCII通信協(xié)議。
1 上位機(jī)功能介紹
根據(jù)上料機(jī)的工藝要求,本監(jiān)控軟件由自動(dòng)運(yùn)行,工藝設(shè)置,輸出狀態(tài),輸入狀態(tài),手動(dòng)控制,報(bào)警信息,電機(jī)參數(shù)等七個(gè)模塊構(gòu)成,各自完成相應(yīng)的功能,具體功能需求如圖1所示。
其中:自動(dòng)運(yùn)行主要用于監(jiān)視運(yùn)行時(shí)物料及測(cè)試相關(guān)的2個(gè)主要參數(shù),設(shè)置錯(cuò)開(kāi)放板數(shù)量和測(cè)試速度,顯示當(dāng)前測(cè)試通過(guò)和測(cè)試失敗的數(shù)量信息,以及對(duì)設(shè)備的緊急控制和啟動(dòng)等。
工藝設(shè)置主要是進(jìn)行馬達(dá)控制、行程設(shè)定、氣缸控制以及馬達(dá)的參數(shù)設(shè)置。
輸出狀態(tài):主要是各電機(jī)的正反轉(zhuǎn)控制,以及各端口的輸出狀態(tài)。
輸入狀態(tài):主要顯示各輸入端口的狀態(tài),用于顯示監(jiān)控。
手動(dòng)控制:主要用于手動(dòng)控制各執(zhí)行機(jī)構(gòu)的動(dòng)作。
電機(jī)參數(shù):主要用于設(shè)置各驅(qū)動(dòng)軸的各項(xiàng)電機(jī)控制、氣缸控制參數(shù)等。
2 上位機(jī)系統(tǒng)設(shè)計(jì)
本系統(tǒng)運(yùn)行環(huán)境為WINDOS 7及以上系統(tǒng),C#語(yǔ)言是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\(yùn)行于.NET Framework和.NET Core(完全開(kāi)源,跨平臺(tái))之上的高級(jí)程序設(shè)計(jì)語(yǔ)言。能使用SerialPort類(lèi)庫(kù)直接進(jìn)行串口通信程序的開(kāi)發(fā),并且提供了事件驅(qū)動(dòng)模式,開(kāi)發(fā)方便,WINFORM程序開(kāi)發(fā)非常適合上位機(jī)軟件開(kāi)發(fā),所以本系統(tǒng)采用C#語(yǔ)言開(kāi)發(fā)。
2.1 界面設(shè)計(jì)思路及關(guān)鍵方法
根據(jù)上位機(jī)的功能需求,使用WINFORM繪制所需要的界面及相關(guān)的控件,具體如圖2(以自動(dòng)運(yùn)行為例)。
由上圖可知,軟件分為左側(cè)的功能選擇區(qū)和右側(cè)的功能實(shí)現(xiàn)區(qū),左側(cè)功能選擇區(qū)包含7個(gè)按鈕(鎖定除外),對(duì)應(yīng)右側(cè)會(huì)包含7個(gè)界面,但任一時(shí)刻只顯示和左側(cè)選擇的功能相對(duì)應(yīng)的一個(gè)功能實(shí)現(xiàn)界面,為方便后期各功能界面之間的切換,每一個(gè)功能實(shí)現(xiàn)區(qū)所有控件組合成一個(gè)用戶自定義控件(UserControl)放到一個(gè)Panel控件中,故將整個(gè)界面分為兩部分:一是workbench,即整個(gè)軟件的主要界面,該workbench左側(cè)包含了各功能選擇按鈕區(qū)和右側(cè)的一個(gè)大的Panel控件,其中Panel控件用來(lái)作為各功能實(shí)現(xiàn)區(qū)用戶控件的容器;二是右側(cè)的功能實(shí)現(xiàn)區(qū),功能實(shí)現(xiàn)區(qū)實(shí)際是前面所述用戶自定義控件(UserControl),是放在Panel中的一個(gè)控件,每個(gè)控件對(duì)應(yīng)左側(cè)的一個(gè)功能按鈕,所以一共需要定義7個(gè)用戶自定義控件。
為了保證軟件的可靠性和可維護(hù)性,軟件界面只能有一個(gè)實(shí)例,所以使用singleton模式來(lái)構(gòu)建用戶界面(workbench),對(duì)應(yīng)的界面類(lèi)名MainFrom,定義singleton類(lèi):WorkBenchSingleTon,并定義MainFrom類(lèi)型的私有類(lèi)成員workBench,同時(shí)定義公開(kāi)的靜態(tài)屬性WorkBench,但只提供外部對(duì)workBench的獲取,方便在整個(gè)軟件中其它控件對(duì)workBench訪問(wèn)的同時(shí)又保證了只有一個(gè)workbench,具體代碼如下:
public class WorkBenchSingleTon
{
private static MainForm workBench = new MainForm();
public static MainForm WorkBench {
get{
if (workBench == null) {
workBench = new MainForm();
}
return workBench;
}
}
}
2.2 通信功能實(shí)現(xiàn)
根據(jù)該系統(tǒng)的整體設(shè)計(jì)方案,上位機(jī)與下位機(jī)之間的通信采用串口通信,且為了保證通信的可靠性使用MODBUS-ASCII通信協(xié)議。為了開(kāi)發(fā)的方便,使用開(kāi)源的類(lèi)庫(kù)NMODBUS,NMODBUS基于.NET封裝了MODBUS協(xié)議的各項(xiàng)功能,使用方便,在此將NMODBUS提供的Master類(lèi)作為workBench的成員,同時(shí)提供公開(kāi)訪問(wèn)器,不提供賦值,也確保整個(gè)系統(tǒng)中只有一個(gè)Master被實(shí)例化。各項(xiàng)參數(shù)的初始化都在MainForm的構(gòu)造函數(shù)中進(jìn)行。
由前面的分析可知,右側(cè)的功能實(shí)現(xiàn)區(qū),都需要和下位機(jī)通過(guò)MODBUS進(jìn)行通信,而MODBUS的特點(diǎn)是通信由主機(jī)發(fā)起,從機(jī)不能主動(dòng)發(fā)起通信,在此系統(tǒng)中,上位機(jī)為主機(jī),下位機(jī)為從機(jī),所以所有的通信都由上位機(jī)發(fā)起。上位機(jī)要實(shí)時(shí)獲取從機(jī)的數(shù)據(jù),必須以一定的時(shí)間間隔不停地向從機(jī)發(fā)送查詢命令,而本系統(tǒng)中,每個(gè)功能選擇都對(duì)應(yīng)一個(gè)功能實(shí)現(xiàn)區(qū),但同一時(shí)刻只有一個(gè)功能實(shí)現(xiàn)區(qū)才被顯示,故只需要查詢被顯示的功能實(shí)現(xiàn)區(qū)中所需要的數(shù)據(jù),其它的不用顯示,也就不需要向從機(jī)查詢。根據(jù)MODBUS通信的特性,需要定時(shí)向從機(jī)查詢數(shù)據(jù),若每個(gè)功能實(shí)現(xiàn)區(qū)均使用定時(shí)器定時(shí)查詢,則需要判斷自己當(dāng)前是否被顯示來(lái)確定是否訪問(wèn)下位機(jī),容易造成多個(gè)功能實(shí)現(xiàn)區(qū)同時(shí)訪問(wèn)從機(jī)造成軟件通信不穩(wěn)定,軟件不易維護(hù)等問(wèn)題,因此定義一個(gè)接口IBaseControl,作為各功能實(shí)現(xiàn)區(qū)的接口約束,其中ReadModbusInfo用于實(shí)現(xiàn)各功能實(shí)現(xiàn)區(qū)需要向從機(jī)讀取數(shù)據(jù)的函數(shù),而Title用于標(biāo)識(shí)各功能實(shí)現(xiàn)區(qū)的名稱,其接口如下:
interface IBaseControl : IDisposable
{
string Title{get;set;}
bool ReadModbusInfo();
}
因此在各功能實(shí)現(xiàn)區(qū)只需要實(shí)現(xiàn)ReadModbusInfo成員函數(shù),實(shí)現(xiàn)需要讀取下位機(jī)數(shù)據(jù)的邏輯,而自身并不需要調(diào)用該成員函數(shù)。而將所有調(diào)用該函數(shù)的職責(zé)放到workBench中,在workBench中定義一個(gè)定時(shí)器,在定時(shí)器的事件響應(yīng)函數(shù)中調(diào)用當(dāng)前顯示的功能實(shí)現(xiàn)區(qū)的ReadModbusInfo接口函數(shù)即可,這樣所有功能實(shí)現(xiàn)區(qū)讀取從機(jī)數(shù)據(jù)的函數(shù)調(diào)用都集中在了一處,會(huì)自動(dòng)根據(jù)當(dāng)前顯示的功能實(shí)現(xiàn)區(qū)而自動(dòng)調(diào)用相應(yīng)的ReadModbusInfo實(shí)現(xiàn)函數(shù),方便軟件維護(hù)的同時(shí)提高了穩(wěn)定性。需要注意的是,由于使用了串口通信,其數(shù)據(jù)接收在另一個(gè)線程中實(shí)現(xiàn),所以在更新界面數(shù)據(jù)時(shí),需要使用到委托才能更新數(shù)據(jù)。
對(duì)從機(jī)的控制命令,同樣集中在workBench中,功能實(shí)現(xiàn)區(qū)的用戶控件需要向從機(jī)寫(xiě)數(shù)據(jù)時(shí)只需通過(guò)WorkBenchSingleTon.WorkBench.Master.WriteSingleCoil()語(yǔ)句調(diào)用workbench中定義的寫(xiě)寄存器函數(shù)向從機(jī)寫(xiě)入相應(yīng)的數(shù)據(jù)即可實(shí)現(xiàn)向下位機(jī)發(fā)送命令。
3 結(jié)語(yǔ)
通過(guò)對(duì)自動(dòng)上料機(jī)功能的分析,合理劃分軟件功能和實(shí)現(xiàn)方式,提高了軟件的可維護(hù)性和穩(wěn)定性,經(jīng)現(xiàn)場(chǎng)測(cè)試,本上位機(jī)軟件系統(tǒng)運(yùn)行穩(wěn)定,與下位機(jī)的通信可靠達(dá)到了預(yù)期的目標(biāo)。
參考文獻(xiàn)
[1] 李植鵬,徐政.設(shè)計(jì)模式在高壓直流輸電設(shè)計(jì)軟件包中的應(yīng)用[J].電力建設(shè),2013,34(11):17-21.
[2] 夏浩波.單例模式的設(shè)計(jì)與應(yīng)用[J].電腦開(kāi)發(fā)與應(yīng)用,2011,24(01):58-59.
[3] 代濤,楊麗紅.基于C#的空調(diào)壓縮機(jī)聲強(qiáng)測(cè)試平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)[J].農(nóng)業(yè)裝備與車(chē)輛工程,2019,57(01):75-79.
[4] 呂志剛,魯可心,李亮亮.基于C#的變電站運(yùn)行參數(shù)監(jiān)控系統(tǒng)設(shè)計(jì)[J].工業(yè)控制計(jì)算機(jī),2018,31(07):32-33+36.
[5] 楊少朋,趙龑驤.基于C#的溫濕度傳感器串口通信程序的實(shí)現(xiàn)[J].中國(guó)新通信,2019,21(15):22.
論文指導(dǎo) >
SCI期刊推薦 >
論文常見(jiàn)問(wèn)題 >
SCI常見(jiàn)問(wèn)題 >