<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 金剛石合成控制系統中多串口通信技術(shù)的設計與實(shí)現

金剛石合成控制系統中多串口通信技術(shù)的設計與實(shí)現

作者: 時(shí)間:2004-12-07 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:通過(guò)多中的應用,討論了32位Windows操作系統下,VC多方法,并運用面向對象方法和多線(xiàn)程技術(shù)了一個(gè)比較完善的通信類(lèi)。闡述了用VC開(kāi)發(fā)上位機與PLC之間的串口通信程序方法和技術(shù)。

關(guān)鍵詞:串口通信;面向對象方法;多線(xiàn)程;PLC

1 引言

傳統的是由一個(gè)PLC和一個(gè)可顯示終端構成。這種傳統的一般具有如下缺點(diǎn):

(1) 系統所有的工作都由PLC完成,其控制精度較差,致使質(zhì)量較差;

(2) 顯示終端的平面尺寸過(guò)小,這一方面使得操作人員觀(guān)察系統的狀態(tài)很不方便,另一方面?也常常會(huì )引起誤操作;

(3) 金剛石合成工藝復雜,需控制的參數很多,但原控制系統不能對參數進(jìn)行保存,這樣在根據不同產(chǎn)品和工藝要求對部分參數進(jìn)行調整時(shí),每次都必須重新設置所有的參數,操作非常麻煩;

(4) 界面不友好;

(5)不能通過(guò)控制系統自動(dòng)考核操作人員的工作質(zhì)量。

為了提高控制精度、方便操作,開(kāi)發(fā)新的控制系統迫在眉睫。筆者針對以上問(wèn)題,將IPC與PLC有機結合在一起,開(kāi)發(fā)了一套新的控制系統。通過(guò)該系統可在上位機(IPC)和PLC之間通過(guò)RS-232與RS-485進(jìn)行大量串口通信。

2?。郑么谕ㄐ欧治?/B>

在32位Windows系統下使用VC開(kāi)發(fā)串口通信程序通常有如下4種方法:

(1)使用Microsoft公司提供的名為MSCOMM的通信控件;

(2)直接使用Windows應用程序接口(API);

(3)自行設計一個(gè)串口通信類(lèi);

(4)通過(guò)開(kāi)發(fā)一個(gè)ActiveX控件來(lái)串口通信功能。

在上述幾種方法中,實(shí)際上還是使用Windows API函數,然后把串口通信的細節給封裝起來(lái),同時(shí)提供給用戶(hù)幾個(gè)簡(jiǎn)單的接口函數。上述幾種方法各有優(yōu)缺點(diǎn),但在實(shí)際情況下,大多數編程人員喜歡使用API函數自行設計串口通信類(lèi)。

用Windows API函數進(jìn)行串口通信的編程流程如圖1所示。其中打開(kāi)串口是確定串口號與串口的打開(kāi)方式;初始化串口用于配置通訊的波特率、每字節位數、校驗位、停止位和讀寫(xiě)超時(shí)等;讀寫(xiě)串口用于向串口進(jìn)行發(fā)送數據和從串口接收數據;關(guān)閉串口用于將串口關(guān)閉并釋放串口資源(Windows系統下串口是系統資源)。

由于絕大多數控制系統中串口通信是比較費時(shí)的,而且監控系統還要進(jìn)行數據處理和顯示等,所以一般采用多線(xiàn)程技術(shù),并用AfxBeginThread()函數創(chuàng )建輔助線(xiàn)程來(lái)管理串口通信,這樣,主進(jìn)程就能在進(jìn)行串口讀寫(xiě)的同時(shí),處理數據并完成用戶(hù)指令的響應,但是設計時(shí)一定要處理好數據的共享問(wèn)題。

串口讀寫(xiě)既可以選擇同步、異步方式,也可以選擇查詢(xún)、定時(shí)讀寫(xiě)和事件驅動(dòng)方式。由于同步方式容易造成線(xiàn)程阻塞,所以一般采用異步方式;而查詢(xún)方式要占用大量的CPU時(shí)間,所以一般采用定時(shí)讀寫(xiě)或者事件驅動(dòng)方式,事件驅動(dòng)方式相關(guān)文獻較多,故此重點(diǎn)討論定時(shí)讀寫(xiě)方式。定時(shí)讀寫(xiě)方式就是上位機向下位機發(fā)送固定格式的數據,在下位機收到后向上位機返回狀態(tài)信息數據。由于數據的傳輸需要時(shí)間,所有上位機發(fā)送數據后就調用_sleep()函數進(jìn)行休眠,休眠的時(shí)間可根據需要進(jìn)行不同的設置。這樣,可以節?。茫校諘r(shí)間,以使系統能夠很好地進(jìn)行監控工作和處理其它事務(wù)。

3?。郑么谕ㄐ诺脑O計與實(shí)現

筆者在Windows系統下,采用面向對象的方法和多線(xiàn)程技術(shù),并使用Visual C6.0作為編程工具開(kāi)發(fā)了一個(gè)通用串口通信類(lèi)CSerialPort,該CSerialPort類(lèi)封裝了串口通信的基本數據和方法,下面給出CSerialPort類(lèi)的簡(jiǎn)單介紹。

CSerialPort類(lèi)頭文件中的主要成員變量和成員函數如下:

Class CSerialPort

{

private:

HANDEL m_hPort;

DCB m_Dcb;

COMMTIMEOUTS m_TimeOuts;

DWORD m_Error;

Public:

CSerialPort(); ?? //構造函數

virtual~CSerialPort(); ?? //析構函數

//InitPort() 函數實(shí)現初始化串口

BOOL InitPort(

char* str=“com1”,

UINT BaudRate=9600,

UINT Parity=0,

UINT ByteSize=8,

UINT StopBits=1,

UINT ReadMultiplier=0,

UINT ReadConstant=0,

UINT WriteMultiplier=10,

UINT WriteConstant=1000);

DCB GetDCB();? //獲得DCB參數

//SetDCB()函數實(shí)現設置DCB參數

BOOL SetDCB(

UINT BaudRate=9600,

UINT Parity=0,

UNIT ByteSize=8,

UINT StopBits=1);

// GetTimeOuts()函數獲得超時(shí)參數

COMMTIMEOUTS GetTimeOuts();

// SetTimeOuts()函數設置超時(shí)參數

BOOL SetTimeOuts(

UINT ReadMultiplier=0,

UINT ReadConstant=0,

UINT WriteMultiplier=10,

UINT WriteConstant=1000);

// WritePort()函數實(shí)現寫(xiě)串口操作

void WritePort(HANDLE port,CString);

CString ReadPort(HANDLE port); //讀串口操作

BOOL ClosePort();? //關(guān)閉串口

};

下面對該類(lèi)的重要函數作以說(shuō)明:

(1)在構造函數CSerialPort()中已對該類(lèi)的數據成員進(jìn)行了初始化操作。

(2)初始化串口函數InitPort()函數用于完成串口的初始化工作,包括打開(kāi)串口、設置DCB參數、設置通信的超時(shí)時(shí)間等。

打開(kāi)串口使用CreateFile()函數,其中InitPort()函數中的第一個(gè)參數為要打開(kāi)的串口,通常將該參數賦給CreateFile()函數中的第一個(gè)參數;設置DCB參數應調用該類(lèi)中的SetDCB()函數,并將InitPort()函數中的第2至第5參數賦給SetDCB()函數;設置通信的超時(shí)時(shí)間應調用該類(lèi)中的SetTimeOuts()函數,并將InitPort()函數中的第6至第9參數賦給SetTimeOuts()函數。另外,該串口是系統資源,應該根據不同要求對其安全屬性進(jìn)行設置。

(3)SetDCB()函數用于設置DCB參數,包括傳輸的波特率、是否進(jìn)行奇偶校驗、每字節長(cháng)度以及停止位等。

(4)SetTimeOuts()函數用于設定訪(fǎng)問(wèn)的超時(shí)值,根據設置的值可以計算出總的超時(shí)間隔。前面兩個(gè)參數用來(lái)設置讀操作總的超時(shí)值,后面兩個(gè)參數用來(lái)設置寫(xiě)操作總的超時(shí)值。

(5)WritePort()函數用來(lái)完成向串口寫(xiě)數據。由于該系統需要對多個(gè)串口進(jìn)行通信,所以首先應把串口號作為參數傳遞給該函數;接著(zhù)該函數把按參數傳遞過(guò)來(lái)的、要發(fā)送的數據進(jìn)行編碼(也就是加入校驗,這樣能減少誤碼率),然后再調用Windows API函數WriteFile()并把數據發(fā)送到串口。

(6)ReadPort()函數用來(lái)完成從串口讀數據,由于有多個(gè)串口,所以應把串口作為參數傳遞進(jìn)來(lái),然后調用API函數ReadFile(),并把下位機發(fā)送到串口,數據讀出來(lái)放到緩存里面,接著(zhù)對數據進(jìn)行處理以將其變換成字符串(CString)類(lèi)型并返回。

(7)GetDCB()函數主要用于獲得串口的當前配置,可通過(guò)調用API函數GetCommState()來(lái)實(shí)現,然后再進(jìn)行相應的處理。

(8)GetTimeOuts()函數用于獲得訪(fǎng)問(wèn)超時(shí)值。

(9)ClosePort()函數可用來(lái)關(guān)閉串口。因為在Windows系統中串口是系統資源,因而在不用時(shí),應將其釋放掉,以便于其它進(jìn)程對該資源的使用。

4 基于串口通信的金剛石合成控制

金剛石合成控制系統采用主從式控制方式,上位機為微機、下位機為PLC。上位機的主要功能是對系統進(jìn)行實(shí)時(shí)監控,下位機的主要功能是對系統進(jìn)行實(shí)時(shí)控制。上位機采用Windows 98操作系統,其監控程序可用VC開(kāi)發(fā),上、下位機之間通過(guò)RS-232與RS-485串口進(jìn)行通信,它們之間采用的通信波特率為9600bps,無(wú)奇偶校驗,每字節8位,并有1位停止位。上、下位機之間傳送的數據格式可自己定義。由于傳輸數據時(shí)可能會(huì )引起錯誤,所以加入了校驗算法。該系統通過(guò)上位機向下位機發(fā)送數據,下位機收到后就把當前系統的狀態(tài)參數返回給上位機。由于該系統中所控制的參數具有遲滯性,所以應采用定時(shí)發(fā)送數據的方法來(lái)采集現場(chǎng)狀態(tài)信息。

上位機編程時(shí),可用VC6.0生成一個(gè)對話(huà)框類(lèi)型的程序框架,然后將自己編寫(xiě)的CSerialPort類(lèi)加入到該工程中,并在主界面類(lèi)?CCrystal?中添加一個(gè)CSerialPort類(lèi)的成員變量serial。當監控系統開(kāi)始工作時(shí),可用AfxBeginThread??函數創(chuàng )建輔助線(xiàn)程來(lái)管理串口通信,當調用CSerialPort類(lèi)中的WritePort? ?函數向串口發(fā)送數據后,可調用_sleep? ?函數使輔助線(xiàn)程休眠一段時(shí)間,以便使PLC有充分的時(shí)間返回數據;接著(zhù)再調用CSerialPort類(lèi)中的ReadPort()函數并從串口讀數據,然后再調用_sleep()函數使輔助線(xiàn)程再休眠一定的時(shí)間。這樣設計后,當進(jìn)行串口通信時(shí),主線(xiàn)程就能繼續完成監控功能和處理其他事務(wù)。輔助線(xiàn)程函數的主要代碼如下:

UINT SerialPro(void* param)

{

Ccrystal* mdlg=(Ccrystal*)param?

CString str;

int flag=1;

//如果初始化串口失敗返回

if(?。桑睿椋簦校铮颍簦ā埃悖铮恚病保?/P>

{AfxMessageBox(“打開(kāi)串口2失敗”);

return 0;

}

//循環(huán)讀寫(xiě)串口,直到結束

while(flag)

{

//這里把要發(fā)送的數據傳送給變量str

……

//向串口寫(xiě)數據

mdlg->serial.WritePort(hport,str);

//讓輔助線(xiàn)程休眠100ms

_sleep(100);

//從串口讀數據并賦給變量str

str=mdlg->serial.ReadPort(hport);

//這里把從串口得到的數據進(jìn)行處理

……

5 結束語(yǔ)

運用面向對象方法和多線(xiàn)程技術(shù)設計的通用串口通信類(lèi)CSerialPort類(lèi),通過(guò)對Windows API函數的封裝使串口通信變得簡(jiǎn)單方便、容易維護。目前,該軟件系統已成功地應用于金剛石合成控制系統,并成功解決了RS-232與RS-485兩種串口通信的問(wèn)題。經(jīng)過(guò)幾個(gè)月的運行表明,該串口通信軟件工作穩定,出色地完成了系統的實(shí)時(shí)監控和顯示任務(wù)。此外,由于采用了面向對象的方法和模塊化設計,該軟件的維護和升級十分方便;同時(shí)該系統具有很好的移植性,按照不同需求稍微改動(dòng)一些代碼就可以應用于其它控制系統中。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>