張意愷
(西安交通大學(xué) 陜西省西安市 710049)
本系統(tǒng)一共包含三個(gè)模塊:PC 主控系統(tǒng)、RS232 四進(jìn)四出控制模塊、后端MySQL 數(shù)據(jù)庫。實(shí)現(xiàn)的主要功能:通過串口,PC主控系統(tǒng)對外部控制器的4 個(gè)輸入開關(guān)信號(hào)進(jìn)行讀入,并根據(jù)設(shè)定的規(guī)則進(jìn)行4 路開關(guān)信號(hào)的輸出控制。
PC 主控系統(tǒng)基于Visual Studio 2012 中的面向?qū)ο笤O(shè)計(jì),界面的設(shè)計(jì)上采用MFC Dialog 類。Dialog 類的模態(tài)窗口給開發(fā)帶來了極大的便利,其中大量控件在開發(fā)過程中能更好、更便捷地實(shí)現(xiàn)界面功能,大大減少界面可視化上的時(shí)間,從而可把主要精力放在核心的控制邏輯的實(shí)現(xiàn)上,同時(shí)又帶給使用者良好的互動(dòng)體驗(yàn)。
本系統(tǒng)中的四進(jìn)四出控制模塊可連接不同類型外部設(shè)備,實(shí)現(xiàn)不同控制效果,四個(gè)輸入可以手動(dòng)或自動(dòng)觸發(fā)。為確保整個(gè)操作過程可追溯,系統(tǒng)自動(dòng)記錄所有的操作日志,并寫入到數(shù)據(jù)庫中,通過標(biāo)準(zhǔn)化的SQL 查詢語句,可實(shí)現(xiàn)按照日期或通道號(hào)查詢,從而快速排除問題。
系統(tǒng)控制模塊與電腦之間的通過RS232 通信接口連接,采用db9 標(biāo)準(zhǔn)。
串口通信(Serial Communications)應(yīng)用范圍廣泛、價(jià)格便宜、編程容易并且可以比其它接口使用更長的傳輸距離。一般使用3 根線就可通信,即地線、發(fā)送、接收。串口通信是異步方式,能夠在發(fā)送數(shù)據(jù)同時(shí)接收數(shù)據(jù)。
串口通信主要參數(shù)為波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。兩個(gè)進(jìn)行通信的設(shè)備,相關(guān)參數(shù)必須一致。常用的通信為:9600,8個(gè)數(shù)據(jù)位,1 個(gè)停止位,沒有檢驗(yàn)位。
見圖1。
系統(tǒng)使用RS232 控制模塊進(jìn)行信號(hào)采集,選用無源輸入型,其包含四個(gè)繼電器輸出和四個(gè)光電隔離開關(guān)輸入。
每個(gè)繼電器引出三個(gè)接線端子,分別是 NO(常開端)、COM(公共端)、NC(常閉端)。繼電器斷開時(shí),COM 與 NC 相通,COM 與 NO 斷開。 繼電器吸合狀態(tài)時(shí):COM 與 NO 相通,COM 與 NC 斷開。
控制端在Visual Studio 2015 環(huán)境下開發(fā),基于面向?qū)ο笤O(shè)計(jì)。各類功能的實(shí)現(xiàn)主要通過MFC 程序的對話框編輯控件以及相關(guān)函數(shù)實(shí)現(xiàn)。

圖1:系統(tǒng)框架

圖2
系統(tǒng)主要包括chuankou.h,chuankouDlg.h,Rsource.h,stdafx.h, targetver.h 以及對應(yīng)的.cpp 文件。
chuankouDlg.h 及對應(yīng)cpp 文件實(shí)現(xiàn)主界面。在主界面中對整個(gè)系統(tǒng)進(jìn)行操控。
cs.h 和對應(yīng)cpp 文件實(shí)現(xiàn)參數(shù)選擇界面。在參數(shù)選擇界面中對串口通信的參數(shù)進(jìn)行選擇。
mscomm1.h 和對應(yīng)cpp 文件為串口控件對應(yīng)文件,是添加串口控件時(shí)系統(tǒng)生成,包含了打開串口關(guān)閉串口等串口相關(guān)函數(shù)。
para.h 和對應(yīng)cpp 文件為串口參數(shù)文件。在主界面和參數(shù)選擇界面之間傳遞串口參數(shù)。
此外工程中還包括了使用MySql 數(shù)據(jù)庫所需要的資源文件。
系統(tǒng)運(yùn)行效果如圖2。
4.2.1 主要功能設(shè)計(jì)
4.2.1.1 系統(tǒng)初始化
系統(tǒng)主要包含:串口控制,繼電器輸出控制,信號(hào)輸入控制,數(shù)據(jù)查詢4 個(gè)主要功能。啟動(dòng)控制平臺(tái)后,首先進(jìn)行系統(tǒng)初始化:界面的顯示元素初始化,包括各個(gè)控件,圖標(biāo),靜態(tài)文字;隨后讀取參數(shù)配置文件config,ini 中的數(shù)據(jù)庫相關(guān)參數(shù),包括IP 地址、用戶名、密碼、數(shù)據(jù)庫名,調(diào)用函數(shù)連接數(shù)據(jù)庫。如果連接失敗,則彈出消息框提示使用者;如果成功,則繼續(xù)運(yùn)行,讀取config.ini文件中的串口通信參數(shù),存入在para.h 中定義的四個(gè)串口通信參數(shù)中,并打開串口,如果讀取失敗,則彈出消息框提示使用者選擇串口通信參數(shù)再打開串口。待打開串口成功后便可操控系統(tǒng)。
4.2.1.2 串口控制
在使用系統(tǒng)之前需要打開串口與控制模塊成功連接。串口控制區(qū)有一個(gè)Combo Box(下拉菜單)控件,三個(gè)Button(按鈕)控件。下拉菜單控件選擇端口號(hào)。三個(gè)按鈕控件功能分別是調(diào)出串口參數(shù)選擇界面、打開串口、關(guān)閉串口。
(1)“打開串口”按鈕。當(dāng)按鈕按下,進(jìn)入響應(yīng)函數(shù)準(zhǔn)備打開串口。首先判斷串口狀態(tài),若異常打開則關(guān)閉。然后讀取使用者所選擇端口號(hào),建立Combo Box(下拉菜單)控件的對象,調(diào)用GetCurSel()讀取選項(xiàng)編號(hào),由于下拉菜單控件的選項(xiàng)編號(hào)從0 開始,所以實(shí)際端口號(hào)為控件自身編號(hào)加一。接著設(shè)置串口緩沖區(qū)、讀寫方式、相關(guān)參數(shù),打開串口,打開失敗或成功都將在消息框中提示。打開成功后將當(dāng)前串口4 參數(shù)(波特率,檢驗(yàn)位,數(shù)據(jù)位,停止位)記錄至config.ini 中更新數(shù)據(jù)。
(2)關(guān)閉串口。當(dāng)需要對系統(tǒng)進(jìn)行特殊操作,比如控制模塊與其他設(shè)備的連接等,此時(shí)我們不希望關(guān)閉控制臺(tái),但是需要關(guān)閉串口以避免出錯(cuò),所以設(shè)置單獨(dú)關(guān)閉串口按鈕,在關(guān)閉串口的同時(shí),也會(huì)關(guān)閉只有在串口開啟下才運(yùn)行的進(jìn)程,比如讀取入開關(guān)輸量定時(shí)器避免程序跑飛。關(guān)閉后會(huì)通過消息框提示串口已經(jīng)關(guān)閉。
4.2.1.3 繼電器輸出控制
繼電器輸出控制有四組控件,每一組控件包含一個(gè)顯示繼電器狀態(tài)的控件和一個(gè)控制繼電器的按鈕控件。每一組控件對應(yīng)一個(gè)繼電器。由于四組控件地位平等,并且代碼上也僅有編號(hào)差別,下面僅對一組(第一組)進(jìn)行說明。
控件有兩個(gè)顯示狀態(tài),黑色表示繼電器狀態(tài)是斷開,紅色表示閉合。為與按鈕控件進(jìn)行聯(lián)動(dòng) ,創(chuàng)建一個(gè)控件的對象。
按鈕控件控制繼電器的狀態(tài)。初始化時(shí),默認(rèn)控件為黑色(斷開狀態(tài)),按鈕上文字顯示為“k1 閉合”即按下按鈕后k1 閉合。當(dāng)按下按鈕時(shí),控件顯示切換為紅色,同時(shí)按鈕文字顯示切換為“k1斷開”即再次按下按鈕后k1 斷開,同時(shí),根據(jù)通訊協(xié)議R20 向控制模塊發(fā)送k1 閉合的命令。成功后調(diào)用函數(shù)讀取系統(tǒng)時(shí)間信息,將日期時(shí)間和k1 閉合的信息組合作為一條數(shù)據(jù),調(diào)用自定義的函數(shù)insertmysqlout 插入到數(shù)據(jù)庫com 的comlog 表格中。再次按下按鈕時(shí),控件顯示切換為黑色,同時(shí)按鈕文字顯示切換為“k1 閉合”即再次按下按鈕后k1 閉合,同時(shí),根據(jù)通訊協(xié)議R20 向控制模塊發(fā)送k1 斷開的命令。成功后調(diào)用函數(shù)讀取系統(tǒng)時(shí)間信息,將日期時(shí)間和k1 斷開的信息作為一條數(shù)據(jù),記錄到數(shù)據(jù)庫com 的comlog表格中。
4.2.1.4 信號(hào)輸入控制
信號(hào)輸入控制包含四個(gè)控件,一個(gè)Check Box(復(fù)選框),一個(gè)按鈕控件。四個(gè)控件用來顯示四個(gè)開關(guān)輸入狀態(tài),黑色表示無信號(hào)輸入,紅色表示有信號(hào)輸入。按鈕每按下一次都會(huì)讀取一次輸入狀態(tài)的并根據(jù)輸入狀態(tài)改變控件的顯示。復(fù)選框只有在串口打開的狀態(tài)下才可以使用。復(fù)選框被選中時(shí),按鈕變?yōu)榛疑珶o法使用,并且設(shè)定一個(gè)定時(shí)器,每250ms 出發(fā)一次定時(shí)器事件,讀取一次輸入狀態(tài)并根據(jù)輸入狀態(tài)改變控件的顯示。
讀取輸入狀態(tài)的過程:
在按鈕事件和復(fù)選框事件中根據(jù)R20 通訊協(xié)議向控制模塊發(fā)送獲取輸入狀態(tài)的命令,控制模塊將輸入通道的狀態(tài)用一串16 進(jìn)制代碼返回,并且暫存在接收緩存區(qū)中。由于返回時(shí)是將代碼按字節(jié)傳回,所以要使返回結(jié)果包含所有通道的輸入狀態(tài),在打開串口前設(shè)置參數(shù)時(shí)緩存區(qū)進(jìn)行如下設(shè)置“m_mscomm.put_RThreshold(6)”(m_mscomm 為串口控件對象),當(dāng)接收緩存區(qū)有6及6 個(gè)以上的字節(jié)時(shí),會(huì)觸發(fā)串口控件事件。這樣可以一次獲得四個(gè)通道的狀態(tài)。
在串口控件事件中,提取接收緩存區(qū)內(nèi)容并且將其拼接為最終返回結(jié)果,根據(jù)結(jié)果判斷四個(gè)通道的輸入狀態(tài),改變四個(gè)控件的顯示(調(diào)用min1、min2、min3、min4 四個(gè)控件下的函數(shù)加載),同時(shí)讀取系統(tǒng)日期時(shí)間,并將日期時(shí)間、有輸入的通道合并為一條數(shù)據(jù)調(diào)用上文提到的insertmysqlout 函數(shù)插入數(shù)據(jù)庫com 的comlog 表格中。
4.2.1.5 數(shù)據(jù)查詢區(qū)
數(shù)據(jù)查詢區(qū)包括一個(gè)日歷控件,一個(gè)文本編輯框,一個(gè)下拉菜單,兩個(gè)按鈕控件。一共有兩種數(shù)據(jù)查詢方式:一是按日期查詢,對應(yīng)日歷控件和一個(gè)查詢按鈕;二是按通道查詢,對應(yīng)一個(gè)下拉菜單和一個(gè)查詢按鈕。查詢結(jié)果將在本文編輯框中顯示。
查詢過程:調(diào)用日歷控件對象或下拉菜單對象下的函數(shù)獲取所選信息,組成CString 型的所要執(zhí)行的sql 語句,再轉(zhuǎn)化的char 類型調(diào)用mysql_query 函數(shù)執(zhí)行以查詢數(shù)據(jù)。
4.2.1.6 參數(shù)選擇界面
參數(shù)選擇界面包含五個(gè)下拉菜單以選擇串口參數(shù)分別為波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位、流控制,使用者選擇參數(shù),保存至para.h 中對應(yīng)的參數(shù)中,傳遞給主界面用以打開串口。如果配置文件中已經(jīng)寫有相關(guān)參數(shù),則會(huì)讀取并顯示在下拉菜單中。
4.2.1.7 數(shù)據(jù)庫模塊
本系統(tǒng)中我們使用的是免費(fèi)的社區(qū)版MySQL 數(shù)據(jù)庫。MySQL是傳統(tǒng)關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。
在開發(fā)過程中,使用Navicat Premium 數(shù)據(jù)庫管理工具進(jìn)行管理,及數(shù)據(jù)庫、表設(shè)計(jì)、輔助調(diào)試。
利用Navicat Premium 創(chuàng)建名為com 的數(shù)據(jù)庫,在其中添加名為comlog 的表。 表結(jié)構(gòu)設(shè)計(jì)如下:
(1)id:在插入數(shù)據(jù)時(shí)自動(dòng)生成并且設(shè)定為自動(dòng)增長,作為主鍵,用于保證數(shù)據(jù)都不一樣。
(2)cur_date:日期,在程序中獲得。
(3)cur_time:時(shí)間,在程序中獲得。
(4)waynum:通道號(hào)。
(5)inorout:輸入或輸出,0 表示輸出(繼電器),1 表示輸入。
(6)operation:當(dāng)通道為輸出時(shí),繼電器閉合或斷開,1 表示斷開(switch off),0 表示閉合(switch on),可以為空。
(7)isDelete:邏輯刪除標(biāo)志位,可以對其賦值在篩選來達(dá)到邏輯刪除的目的。