利用C++Builder開(kāi)發(fā)串口通信程序?qū)に嚵髁坑?jì)進(jìn)行實(shí)時(shí)監(jiān)控
一、前言
C++Builder是當(dāng)今世界上相當(dāng)優(yōu)秀的WINDOWS開(kāi)發(fā)工具之一,其良好的圖形用戶接口(GUI)、面向?qū)ο蟮某绦蛟O(shè)汁和結(jié)構(gòu)化的事件與驅(qū)動(dòng)編程模式,使得編程效率提高,現(xiàn)場(chǎng)應(yīng)用功能大大增強(qiáng)。加拿大C0MPU-WATT稱重系統(tǒng)公司的工藝流量計(jì)―智能型功率表是一種可編程的智能型電工儀表,具有稱重計(jì)量設(shè)備的全部功能,同時(shí)具有RS232和RS485通訊接口, 可實(shí)現(xiàn)遠(yuǎn)程聯(lián)網(wǎng)操作。本文介紹了在Windows98/NT操作系統(tǒng)下用C++Builder開(kāi)發(fā)串行通信程序?qū)?a href="http://j3l.com.cn" target="_blank" class="autolink">流量計(jì)進(jìn)行監(jiān)控的編程方法。
二、C0MPU-WATT工藝流量計(jì)通訊協(xié)議簡(jiǎn)介
1、該流量計(jì)的通訊設(shè)置如下:數(shù)據(jù)長(zhǎng)度:8位;停止位:1位;奇偶校驗(yàn):無(wú);波特率:1200或9600
2、通訊協(xié)議如下:
1)、命令幀格式:
第1個(gè)字符 | 第2個(gè)字符 | 第3個(gè)字符 | 第4、5個(gè)字符 | 第6個(gè)字符 |
$ | 設(shè)備地址 | 命令字符 | 校驗(yàn)碼 | 回車符 |
設(shè)備地址為地址為流量計(jì)的編號(hào),為字符1-9、A-Z中的一個(gè)。
命令字符的代號(hào)和含義如下:
S― 停止重量累計(jì) K― 清除累計(jì)的重量數(shù)據(jù)C― 繼續(xù)重量累計(jì) m― 指定設(shè)備工作模式,可取值1―6
z― 零校準(zhǔn) w― 傳送重量數(shù)據(jù)和滿載百分率R― 傳送瞬時(shí)流量和平均流量
校驗(yàn)碼的計(jì)算方法為:第1、2、3字符的ASCII碼相加的和轉(zhuǎn)換為l6進(jìn)制。
2)、應(yīng)答幀格式:
a、如果命令幀的設(shè)備地址和命令字符都正確,則應(yīng)答幀的第1個(gè)字符是*,第2、3個(gè)字符與命令幀的第2、3個(gè)字符相同,第4、5、6個(gè)字符為校驗(yàn)和與回車符。
于W命令 | |||||||||
第1個(gè) 字符 |
第2個(gè) 字符 |
第3個(gè) 字符 |
前4個(gè) 字符 |
第5個(gè) 字符 |
后7個(gè) 字符 |
第13個(gè) 字符 |
后4個(gè) 字符 |
第18、19個(gè)字符 |
第20個(gè) 字符 |
# | 設(shè)備地址 | 設(shè)備狀態(tài) | 設(shè)備模式 | ? | 流量數(shù)據(jù) | ? | 滿載百分率 | 校驗(yàn)和 | 回車符 |
對(duì)于R命令 | |||||||||
第1個(gè) 字符 |
第2個(gè) 字符 |
第3個(gè) 字符 |
第4個(gè) 字符 |
第5個(gè) 字符 |
后6個(gè) 字符 |
第12個(gè) 字符 |
后6個(gè) 字符 |
第19、20個(gè)字符 |
第21個(gè) 字符 |
# | 設(shè)備地址 | 設(shè)備狀態(tài) | 設(shè)備模式 | ? | 瞬時(shí)流量 | ? | 平均流量 | 校驗(yàn)和 | 回車符 |
b、如果命令幀的設(shè)備地址或命令字符中的任何一個(gè)不正確,則應(yīng)答幀的第1個(gè)字符是?,第2、3個(gè)字符與命令幀的第2、3個(gè)字符相同,第4、5、6個(gè)字符為校驗(yàn)和與回車符。
c、如果命令幀的校驗(yàn)碼不正確,則應(yīng)答幀的第1個(gè)字符是?,第2、3個(gè)字符是CE,第4、5、6個(gè)字符為校驗(yàn)和與回車符。
d、當(dāng)命令字符是W或R時(shí),則流量計(jì)會(huì)直接將請(qǐng)求的數(shù)據(jù)返回,而不會(huì)返回應(yīng)答幀。返回的數(shù)據(jù)格式如:
三、編程實(shí)現(xiàn)
1、首先利用C++Builder的可視化編程工具建立如下運(yùn)行界面。
2、然后在C++/Builder中建立串口類,該類定義了操作串口的方法,綜述如下:
1)、打開(kāi)串口: BOOLOpenCom(intnPort=1);
2)、關(guān)閉串口:BOOLClose(?void);
3)、取得串口通信配置:void GetComState(DCB*dcb);
4)、設(shè)置串口通信配置:void SetComState(DCB*dcb);
5)、讀串口:int ReadData(void*);
6)、寫(xiě)串口:int SendData(const char*int);
7)、獲取緩沖區(qū)字符個(gè)數(shù):int GetCharNumber (void);
8)、判斷串口是否打開(kāi):BOOL IsOpened(void);
3、串口的打開(kāi)、關(guān)閉和配置
利用串口類的打開(kāi)串口、關(guān)閉串口和配置串口通信配置方法,對(duì)給定的串口進(jìn)行相關(guān)的操作。
4、命令的發(fā)送和數(shù)據(jù)的處理
為了連續(xù)進(jìn)行數(shù)據(jù)采集,在程序中設(shè)置了一個(gè)定時(shí)器,用于周期性的發(fā)送命令幀給流量計(jì),同時(shí)讀取接收到的數(shù)據(jù)。下面以讀取重量數(shù)據(jù)為例,介紹發(fā)送命令和處理數(shù)據(jù)的方法。
第l步,建立發(fā)送的命令字符串“SlWACr”。
第2步,利用串口類的寫(xiě)串口方法將上面建立的字符串寫(xiě)入串口。
第3步,利用串口類的讀串口方法將從流量計(jì)返回的重量數(shù)據(jù)讀入監(jiān)控程序。
第4步,利用C++Builder的字符串函數(shù)處理接收的重量數(shù)據(jù),抽取其中的第6位到12位字符,然后將其顯示在重量數(shù)據(jù)文本框中。
對(duì)于瞬時(shí)流量的命令發(fā)送和數(shù)據(jù)處理,可以用與上面相同的方法進(jìn)行處理。
5、為了便于同上位機(jī)組態(tài)軟件交換數(shù)據(jù),本程序采用了DDE(動(dòng)態(tài)數(shù)據(jù)交換)方式進(jìn)行設(shè)計(jì)。
四、結(jié)束語(yǔ)
利用以上方法,筆者成功地將其應(yīng)用于糧庫(kù)倉(cāng)儲(chǔ)自動(dòng)化監(jiān)控系統(tǒng)。同時(shí)筆者也成功的實(shí)現(xiàn)了對(duì)OMRON PLC的監(jiān)控。
參考文獻(xiàn)
1、《C++Builder3 編程指南》徐新華編著人民郵電出版社
2、MSDN技術(shù)文檔
3、加拿大COMPU-WATT智能型功率表技術(shù)文檔