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