當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]1 引言傳統(tǒng)的金剛石合成機(jī)控制系統(tǒng)是由一個(gè)PLC和一個(gè)可顯示終端構(gòu)成。這種傳統(tǒng)的控制系統(tǒng)一般具有如下缺點(diǎn):(1) 系統(tǒng)所有的工作都由PLC完成,其控制精度較差,致使合成的金

1 引言

傳統(tǒng)的金剛石合成機(jī)控制系統(tǒng)是由一個(gè)PLC和一個(gè)可顯示終端構(gòu)成。這種傳統(tǒng)的控制系統(tǒng)一般具有如下缺點(diǎn):

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

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

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

(4) 界面不友好;

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

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

2 VC串口通信分析

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

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

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

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

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

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

 

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

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

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

3 VC串口通信的設(shè)計(jì)與實(shí)現(xiàn)

筆者在Windows系統(tǒng)下,采用面向?qū)ο蟮姆椒ê投嗑€程技術(shù),并使用Visual C6.0作為編程工具開(kāi)發(fā)了一個(gè)通用串口通信類(lèi)CSerialPort,該CSerialPort類(lèi)封裝了串口通信的基本數(shù)據(jù)和方法,下面給出CSerialPort類(lèi)的簡(jiǎn)單介紹。

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

Class CSerialPort

{

private:

HANDEL m_hPort;

DCB m_Dcb;

COMMTIMEOUTS m_TimeOuts;

DWORD m_Error;

Public:

CSerialPort(); ? //構(gòu)造函數(shù)

virtual~CSerialPort(); ? //析構(gòu)函數(shù)

//InitPort() 函數(shù)實(shí)現(xiàn)初始化串口

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參數(shù)

//SetDCB()函數(shù)實(shí)現(xiàn)設(shè)置DCB參數(shù)

BOOL SetDCB(

UINT BaudRate=9600,

UINT Parity=0,

UNIT ByteSize=8,

UINT StopBits=1);

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

COMMTIMEOUTS GetTimeOuts();

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

BOOL SetTimeOuts(

UINT ReadMultiplier=0,

UINT ReadConstant=0,

UINT WriteMultiplier=10,

UINT WriteConstant=1000);

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

void WritePort(HANDLE port,CString);

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

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

};

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

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

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

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

(3)SetDCB()函數(shù)用于設(shè)置DCB參數(shù),包括傳輸?shù)牟ㄌ芈?、是否進(jìn)行奇偶校驗(yàn)、每字節(jié)長(zhǎng)度以及停止位等。

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

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

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

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

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

(9)ClosePort()函數(shù)可用來(lái)關(guān)閉串口。因?yàn)樵赪indows系統(tǒng)中串口是系統(tǒng)資源,因而在不用時(shí),應(yīng)將其釋放掉,以便于其它進(jìn)程對(duì)該資源的使用。

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

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

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

UINT SerialPro(void* param)

{

Ccrystal* mdlg=(Ccrystal*)param?

CString str;

int flag=1;

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

if(!InitPort(“com2”))

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

return 0;

}

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

while(flag)

{

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

……

//向串口寫(xiě)數(shù)據(jù)

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

//讓輔助線程休眠100ms

_sleep(100);

//從串口讀數(shù)據(jù)并賦給變量str

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

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

……

5 結(jié)束語(yǔ)

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉