亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        VB環(huán)境下基于內(nèi)存共享技術(shù)的串行通訊程序設(shè)計(jì)

        2014-04-29 13:29:02黃頔劉樺杰李艷寧
        關(guān)鍵詞:共享內(nèi)存

        黃頔 劉樺杰 李艷寧

        摘 要:VB由于具有強(qiáng)大的界面生成能力及靈活的數(shù)據(jù)庫(kù)操作功能,是上位軟件的主要編程工具之一,在很多場(chǎng)合領(lǐng)域得到了應(yīng)用。然而,直接采用VB編程的主要問(wèn)題是可靠性較差,特別是在與其它低層設(shè)備,如PLC通訊時(shí)。本文提出一種采用內(nèi)存共享技術(shù)的程序之間數(shù)據(jù)交換方法,將VB的通訊子程序和主程序分離,以解決通訊子程序死鎖等故障對(duì)主程序的影響。本方法用在汽車(chē)安全氣囊裝配生產(chǎn)線的軟件設(shè)計(jì)中,取得了良好的效果。

        關(guān)鍵詞:VB;內(nèi)存映射;共享內(nèi)存;串行通訊;PLC

        中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)號(hào):A 文章編號(hào):2095-2163(2014)05-

        Serial Communications Design based on Data Sharing Technology under VB Platform

        HUANG Di, LIU Huajie, LI Yanning

        (School of Precision Instruments and Optoelectronics Engineering, Tianjin University, Tianjin 300072, China)

        Abstract: VB (Visual Basic) is widely used in many applications as a program tool for host computers, because of its capacity of interface generation and the flexible operation of databases. However, one of the main problems when programming with VB is its unsatisfactory reliability, especially in the communication between the host computer and the lower CPU. The paper proposes a method of data exchange between programs using shared memory, which separates the communication program with the main program, to reduce the impact of faults, such as deadlock, on the main program. The method has been applied on the design of airbag assembly line for automobiles and has obtained good results.

        Keywords: VB; Memory Mapping; Shared-memory Technology; Serial Communications; PLC

        0 引 言

        汽車(chē)安全氣囊作為汽車(chē)行駛過(guò)程的第一很總要安全部件,對(duì)其生產(chǎn)過(guò)程的可靠性以及質(zhì)量控制研究即已成為近年來(lái)的研討熱點(diǎn)。通常,一條汽車(chē)安全氣囊裝配線多會(huì)由若干個(gè)裝配或檢測(cè)工位計(jì)算機(jī),以及一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器工位計(jì)算機(jī)組合設(shè)計(jì)而成[1]。其中,每個(gè)工位計(jì)算機(jī)可能和本工位的條碼掃描器、PLC、電動(dòng)螺栓擰緊機(jī)和專(zhuān)用電氣檢測(cè)儀表等多種串行設(shè)備進(jìn)行廣泛互連,可實(shí)現(xiàn)部件品種糾錯(cuò)及工序間順序控制等功能;進(jìn)一步地,還可記錄操作人員信息、機(jī)械或電氣等檢測(cè)參數(shù)信息,并存入SQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)產(chǎn)品追溯功能。但是,如果計(jì)算機(jī)上的監(jiān)控軟件均采用組態(tài)軟件時(shí),由于站點(diǎn)數(shù)量較多,而使得成本頗高,同時(shí)組態(tài)軟件還存在著對(duì)數(shù)據(jù)庫(kù)支持功能不足等缺陷?;诖朔N情況,經(jīng)過(guò)分析可知,應(yīng)用VB等高級(jí)語(yǔ)言設(shè)計(jì)程序仍然是比較常用的方法之一。但是由于設(shè)計(jì)者技術(shù)等方面的原因,該類(lèi)應(yīng)用程序普遍存在可靠性差,后續(xù)維護(hù)困難等問(wèn)題,特別是在與其它底層設(shè)備,如PLC通訊時(shí),常會(huì)由于通訊錯(cuò)誤而引發(fā)系統(tǒng)死機(jī)或操作反映延遲等現(xiàn)象。本文即針對(duì)這一狀況,提出了一種采用內(nèi)存共享技術(shù)的解決方案[2],并以上位計(jì)算機(jī)與S7-200 PLC進(jìn)行串行通訊為例進(jìn)行了仿真驗(yàn)證,而且取得了良好的應(yīng)用效果。

        1采用內(nèi)存共享技術(shù)的通訊原理

        多數(shù)情況下,普通用戶(hù)會(huì)將通訊子程序嵌入到主程序中,這樣當(dāng)通訊發(fā)生錯(cuò)誤,或通訊返回?cái)?shù)據(jù)需要時(shí)間較長(zhǎng)時(shí),系統(tǒng)將會(huì)發(fā)生死鎖或停頓現(xiàn)象,嚴(yán)重時(shí)還會(huì)影響操作界面程序的正常運(yùn)行。為此,本文采取了一種利用公共數(shù)據(jù)區(qū)交換數(shù)據(jù)的方法,將通訊程序和主程序分成兩個(gè)獨(dú)立的可執(zhí)行文件,并且通訊程序位于后臺(tái)工作,而主程序則位于前臺(tái)。采用這種方法的優(yōu)點(diǎn)在于通訊程序和人機(jī)界面及其它控制程序、也就是主程序是完全分離的,即使通訊程序出現(xiàn)暫時(shí)的死鎖現(xiàn)象,也不致影響主程序的正常運(yùn)行,從而提高了軟件的可靠性和可操作性。同時(shí),由于Win32是一個(gè)基于頁(yè)式虛擬內(nèi)存的操作系統(tǒng),每個(gè)進(jìn)程只能訪問(wèn)自己的虛擬內(nèi)存頁(yè)面空間,若要實(shí)現(xiàn)這種公共數(shù)據(jù)區(qū)的預(yù)設(shè)功能,就要利用內(nèi)存映射文件的概念。

        內(nèi)存映射文件技術(shù)是WINDOWS內(nèi)存管理的一個(gè)重要組成部分。當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)打開(kāi)該應(yīng)用程序的.exe文件,確定該應(yīng)用程序的代碼和數(shù)據(jù)規(guī)模,系統(tǒng)也隨之保留一個(gè)地址空間的區(qū)域,并指明與該區(qū)域相關(guān)聯(lián)的物理存儲(chǔ)器就是.exe文件本身,這一過(guò)程可稱(chēng)為內(nèi)存文件映射,具體來(lái)說(shuō)就是系統(tǒng)裝載.exe文件,并將其映射到進(jìn)程地址空間的過(guò)程。如果使兩個(gè)或多個(gè)進(jìn)程映射同一文件映射對(duì)象的視圖,那么就將共享磁盤(pán)上同一文件或者物理磁盤(pán)的同一頁(yè)面,這樣當(dāng)一個(gè)進(jìn)程將數(shù)據(jù)寫(xiě)入另一個(gè)共享文件映射對(duì)象的視圖時(shí),其他進(jìn)程可以立即在其對(duì)應(yīng)視圖中查看數(shù)據(jù)的變化,從而實(shí)現(xiàn)了進(jìn)程間內(nèi)存級(jí)的高速數(shù)據(jù)傳輸[3],這一過(guò)程如圖1所示。

        圖1 采用內(nèi)存映射文件的公共數(shù)據(jù)交換過(guò)程示意圖

        Fig. 1 Data exchange between programs using shared memory

        需要指出的是,共享文件可以是一個(gè)磁盤(pán)文件,也可以是一個(gè)物理內(nèi)存區(qū)域,或一個(gè)虛擬磁盤(pán)區(qū)域。為了實(shí)現(xiàn)高速交互,一般只使用物理內(nèi)存或虛擬磁盤(pán)文件。另外,對(duì)每一個(gè)通訊程序,根據(jù)數(shù)據(jù)類(lèi)型和應(yīng)用要求,可以設(shè)置多個(gè)共享文件映射對(duì)象。

        2 內(nèi)存映射文件的使用步驟

        VB本身不提供內(nèi)存映射文件操作功能,此時(shí)需要調(diào)用WINDOWS提供的API函數(shù)實(shí)現(xiàn),且將執(zhí)行下列操作步驟[2-3]:

        (1) 創(chuàng)建一個(gè)內(nèi)存映射文件。用函數(shù)Create_FileMapping()在主程序中創(chuàng)建一個(gè)文件映射內(nèi)核對(duì)象,例如

        Long MappingHandle= CreateFileMapping(&HFFFFFFFF,0,PAGE_READWRITE,0,256, “map”)

        即表示創(chuàng)建了一個(gè)可讀寫(xiě)的、256字節(jié)、且名字為“map” 的內(nèi)存映射文件。同時(shí),為了實(shí)現(xiàn)快速數(shù)據(jù)傳輸,設(shè)置第一個(gè)參數(shù)為&HFFFFFFFF,即表示在物理內(nèi)存上創(chuàng)建對(duì)象。通過(guò)調(diào)用本函數(shù)就可獲得文件映射內(nèi)存對(duì)象句柄。

        (2) 在創(chuàng)建文件映射對(duì)象后,主程序調(diào)用MapViewOfFile()函數(shù)映射到本程序的地址空間內(nèi),例如:

        Long MapingAddress = MapViewOfFile(MappingHandle, FILE_MAP_WRITE, 0, 0, 0)

        (3) 通訊程序訪問(wèn)共享內(nèi)存對(duì)象時(shí),需要通過(guò)內(nèi)存對(duì)象名調(diào)用OpenFileMapping()函數(shù),以獲取共享內(nèi)存對(duì)象的句柄。例如:

        Long MappingHandle = OpenFileMapping(FILE_MAP_WRITE, False, "map")

        (4) 如果通訊程序成功獲得了共享內(nèi)存對(duì)象的句柄,也需要執(zhí)行(2)的操作來(lái)獲取映射對(duì)象視圖指針。

        (5) 主程序或通訊后臺(tái)程序利用(2)返回的映射對(duì)象視圖指針MapingAddress,采用CopyMemory()函數(shù)實(shí)現(xiàn)即可實(shí)現(xiàn)對(duì)該空間的訪問(wèn),具體可參見(jiàn)實(shí)例代碼部分。

        當(dāng)完成對(duì)內(nèi)存映射文件的使用時(shí),需要執(zhí)行如下步驟將其徹底清除。具體步驟為:

        (1) 調(diào)用UnmapViewOfFile()從進(jìn)程地址空間中撤銷(xiāo)文件映射內(nèi)核對(duì)象的映像。

        (2) 調(diào)用CloseHandle()關(guān)閉文件映射內(nèi)核對(duì)象。

        3 PC與PLC的串行通訊技術(shù)

        VB中通常采用了MSComm控件以實(shí)現(xiàn)工位PC與PLC等底層設(shè)備的交互通訊。MSComm控件的實(shí)用性強(qiáng)、功能完善,同時(shí)更為應(yīng)用程序提供了通過(guò)串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法[4]。

        MSComm控件提供了兩種處理通信的方式。一種是事件驅(qū)動(dòng)方式,當(dāng)有字符到達(dá)或發(fā)生變化時(shí),MSComm控件都將觸發(fā)OnComm事件。事件驅(qū)動(dòng)方式的優(yōu)點(diǎn)就是程序響應(yīng)及時(shí),但由于接收一個(gè)完整信息卻需多次中斷,如此則不僅降低了程序的執(zhí)行效率,而且也增加了出錯(cuò)的可能性;另外一種即是查詢(xún)方式,通過(guò)定時(shí)或延時(shí)查詢(xún)MSComm控件的某些屬性(比如CommEvent和InBufferCount屬性)值是否發(fā)生變化,以此來(lái)選擇并確定相應(yīng)的處理程序。這種方式的優(yōu)點(diǎn)就在于可以由用戶(hù)控制通訊過(guò)程,尤其當(dāng)程序空閑較多時(shí)多采用這種方式。

        本文將每個(gè)通訊過(guò)程設(shè)計(jì)成獨(dú)立的通訊程序,每一通訊程序?qū)⒉捎貌樵?xún)方法來(lái)實(shí)現(xiàn)和底層設(shè)備的通訊過(guò)程,再通過(guò)各自定義的公共數(shù)據(jù)區(qū)而與主程序?qū)崿F(xiàn)數(shù)據(jù)交換。下面即可、以與西門(mén)子的S7-200PLC的MODBUS通訊方式為例,介紹通訊程序的設(shè)計(jì),PLC側(cè)的MODBUS通訊程序利用西門(mén)子公司所提供的庫(kù)函數(shù)[5]。

        具體地,通訊程序的一次通訊流程則如圖2所示,實(shí)際程序中,每次通訊過(guò)程均由定時(shí)器定時(shí)觸發(fā)。

        由圖2可知,通訊程序設(shè)置定時(shí)器定時(shí)向通訊對(duì)象(如PLC)發(fā)出讀信息命令,并置循環(huán)計(jì)數(shù)器n=0、再休眠(延時(shí))一定時(shí)間間隔后,即進(jìn)入讀取接收信息死循環(huán)。程序首先讀取緩沖區(qū)接收字符長(zhǎng)度(InBufferCount)信息,若該值不為零,說(shuō)明數(shù)據(jù)已經(jīng)收到,接收后分解數(shù)據(jù),同時(shí)根據(jù)接收到的功能號(hào)或校驗(yàn)結(jié)果,判斷接收是否正確。若正確,就將該數(shù)據(jù)更新標(biāo)志G_ShrPLC.bFlag置為1,且更新數(shù)據(jù)G_ShrPLC.nDdata,并調(diào)用WriteToSharedMemory()存入公共數(shù)據(jù)區(qū)(詳情參見(jiàn)程序代碼);若不正確則丟棄。若InBufferCount值為零,說(shuō)明沒(méi)有接收到數(shù)據(jù),空循環(huán),再次讀取InBufferCount信息,并使空循環(huán)計(jì)數(shù)器n加1,當(dāng)n超過(guò)設(shè)定次數(shù)(如10次)時(shí),即預(yù)定為接收失敗,將跳出接收死循環(huán)。

        采用如上方法可以人工控制程序流程,避免出現(xiàn)死循環(huán)現(xiàn)象,而且需要根據(jù)讀信息命令的內(nèi)容,調(diào)節(jié)延時(shí)間隔,即可以實(shí)現(xiàn)正確的接收過(guò)程。

        而對(duì)于通信主程序來(lái)說(shuō),也是由相同定時(shí)間隔的定時(shí)器觸發(fā)定時(shí)讀取公共區(qū)的數(shù)據(jù),再根據(jù)數(shù)據(jù)更新標(biāo)志G_ShrPLC.bFlag來(lái)判斷是否進(jìn)行更新顯示或控制等操作,由此可見(jiàn)數(shù)據(jù)更新標(biāo)志在主程序和通訊子程序之間起到一個(gè)同步作用,詳細(xì)流程則如圖3所示。此外,對(duì)于向PLC下發(fā)控制命令,則采取相反的流程。

        4 部分程序代碼

        在此,給出內(nèi)存映射文件的部分實(shí)例代碼,具體則如下所示。

        Type stShrPLC '定義PLC數(shù)據(jù)結(jié)構(gòu)

        bFalg As Boolean ' PLC數(shù)據(jù)更新標(biāo)志

        nDdata As Integer ' PLC數(shù)據(jù)

        End Type

        Public G_ShrPLC As stShrPLC ' PLC傳遞數(shù)據(jù)

        Public Const Str_ShrPLC = "H_ShrPLC" '內(nèi)存映射文件名稱(chēng)

        Public hMH_ShrPLC As Long '內(nèi)存映射句柄

        Public hMA_ShrPLC As Long '映射視圖指針

        Public Sub Form_Load() '窗口加載函數(shù)

        hMH_ShrPLC =CreateFileMapping(&HFFFFFFFF,0, PAGE_READWRITE,0, Len(G_ShrPLC), Str_ShrPLC)

        '創(chuàng)建內(nèi)存映射文件

        If hMH_ShrPLC = 0 Then MsgBox "創(chuàng)建內(nèi)存映射文件失敗", vbQuestion, "錯(cuò)誤"

        If( Err.LastDllError= 138&) Then '指定內(nèi)存文件已存在,退出

        CloseHandle (hMH_ShrPLC) '關(guān)閉映射文件

        End

        End If

        hMA_ShrPLC = MapViewOfFile(hMH_ShrPLC, FILE_MAP_WRITE, 0, 0, 0) '創(chuàng)建映射視圖

        If hMA_ShrPLC = 0 Then

        CloseHandle(hMH_ShrPLC) '退出前關(guān)閉

        End

        End If

        End Sub

        Public Sub WriteToSharedMemory() '寫(xiě)數(shù)據(jù)函數(shù)

        If hMA_ShrPLC <> 0 Then

        Call CopyMemory(ByVal hMA_ShrPLC, ByVal G_ShrPLC, Len(G_ShrPLC))

        End If

        End Sub

        Public Sub GetFromSharedMemory() '讀數(shù)據(jù)函數(shù)

        If hMA_ShrPLC <> 0 Then

        Call CopyMemory(ByVal G_ShrPLC, ByVal hMA_ShrPLC, Len(G_ShrPLC))

        End If

        End Sub

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

        將主程序與PLC等通訊程序分離,同時(shí)利用共享內(nèi)存技術(shù)實(shí)現(xiàn)程序間數(shù)據(jù)的快速交換,并且充分利用Windows系統(tǒng)自身的多任務(wù)調(diào)度機(jī)制,得到的監(jiān)控程序具有通訊可靠、界面操作流暢等優(yōu)點(diǎn)。應(yīng)用時(shí)由主程序調(diào)用SELL()啟動(dòng)其它通訊程序,并設(shè)其為后臺(tái)運(yùn)行方式。本方法可用于研制的汽車(chē)安全氣囊裝配生產(chǎn)線上,而且通過(guò)在企業(yè)的實(shí)際應(yīng)用,系統(tǒng)已完全達(dá)到了設(shè)計(jì)目標(biāo),獲得了良好的應(yīng)用效果。

        參考文獻(xiàn):

        [1] 胡榮, 沈俊杰. 基于條形碼技術(shù)的汽車(chē)安全氣袋監(jiān)控系統(tǒng)研制[J]. 機(jī)電一體化,2007(2):48-51,54.

        [2] 孫文慶, 劉秉權(quán), 肖鏡輝.基于內(nèi)存映射文件的數(shù)據(jù)共享技術(shù)研究與應(yīng)用[J]. 微計(jì)算機(jī)應(yīng)用,2005,26(2):192-194.

        [3] 黨志斌, 李迎綱, 樊燕京等. 基于內(nèi)存映射的進(jìn)程間通信實(shí)現(xiàn)跨平臺(tái)軟件互聯(lián)互通[J]. 現(xiàn)代電子技術(shù), 2012, 29(14):46-47.

        [4] 裘智峰,成曉明. 基于PLC 的不定字長(zhǎng)的串行通訊的研究及實(shí)現(xiàn)[J]. 工業(yè)控制計(jì)算機(jī),2004,17(2):54-55.

        [5] 夏勇. Modbus通訊協(xié)議在S7-200通訊中的應(yīng)用 [J]. 自動(dòng)化與儀器儀表, ,2009, (1):48-50.

        猜你喜歡
        共享內(nèi)存
        通過(guò)QT實(shí)現(xiàn)進(jìn)程間的通信
        基于PCI總線的多處理器協(xié)同機(jī)制研究
        QNX下PEX8311多路實(shí)時(shí)數(shù)據(jù)采集的驅(qū)動(dòng)設(shè)計(jì)
        電子世界(2014年21期)2014-04-29 06:41:36
        一種高效RTAI 共享內(nèi)存管理層的研究與實(shí)現(xiàn)*
        午夜熟女插插xx免费视频| 国产精品久久久久免费a∨不卡| 久久久久国产精品四虎| 亚洲一区二区三区av无| 狼人伊人影院在线观看国产| 麻豆国产精品va在线观看不卡| 亚洲男人av天堂午夜在| 国产成人免费a在线视频| 国产精品欧美成人片| 国产精品中文字幕日韩精品| 中文字幕亚洲熟女av| 欧美另类人妖| 老太脱裤让老头玩ⅹxxxx| 国产亚洲AV片a区二区| 中文字幕东京热一区二区人妻少妇| 偷拍偷窥女厕一区二区视频| 亚洲精品乱码8久久久久久日本| 亚洲成色在线综合网站| 日韩肥熟妇无码一区二区三区| 99蜜桃在线观看免费视频| 欧美巨鞭大战丰满少妇| 18禁黄久久久aaa片| 任你躁国产自任一区二区三区| 精品日本一区二区视频| 国产白色视频在线观看| 亚洲香蕉成人av网站在线观看| 亚洲av无码日韩精品影片| 国产精品18久久久久久首页| 国产偷闻女邻居av在线观看| 亚洲国产精品无码一线岛国| 少妇无码av无码一区| 国产偷国产偷高清精品| 国内偷拍视频一区二区| 国产乱码一区二区三区精品| 成人av鲁丝片一区二区免费| 国产第19页精品| 蜜桃视频一区二区三区在线| 亚洲色大成人一区二区| 日韩av免费在线不卡一区| 97超碰精品成人国产| 欧美老妇牲交videos|