国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线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ù)庫操作功能,是上位軟件的主要編程工具之一,在很多場(chǎng)合領(lǐng)域得到了應(yīng)用。然而,直接采用VB編程的主要問題是可靠性較差,特別是在與其它低層設(shè)備,如PLC通訊時(shí)。本文提出一種采用內(nèi)存共享技術(shù)的程序之間數(shù)據(jù)交換方法,將VB的通訊子程序和主程序分離,以解決通訊子程序死鎖等故障對(duì)主程序的影響。本方法用在汽車安全氣囊裝配生產(chǎn)線的軟件設(shè)計(jì)中,取得了良好的效果。

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

中圖分類號(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 引 言

汽車安全氣囊作為汽車行駛過程的第一很總要安全部件,對(duì)其生產(chǎn)過程的可靠性以及質(zhì)量控制研究即已成為近年來的研討熱點(diǎn)。通常,一條汽車安全氣囊裝配線多會(huì)由若干個(gè)裝配或檢測(cè)工位計(jì)算機(jī),以及一臺(tái)數(shù)據(jù)庫服務(wù)器工位計(jì)算機(jī)組合設(shè)計(jì)而成[1]。其中,每個(gè)工位計(jì)算機(jī)可能和本工位的條碼掃描器、PLC、電動(dòng)螺栓擰緊機(jī)和專用電氣檢測(cè)儀表等多種串行設(shè)備進(jìn)行廣泛互連,可實(shí)現(xiàn)部件品種糾錯(cuò)及工序間順序控制等功能;進(jìn)一步地,還可記錄操作人員信息、機(jī)械或電氣等檢測(cè)參數(shù)信息,并存入SQL數(shù)據(jù)庫實(shí)現(xiàn)產(chǎn)品追溯功能。但是,如果計(jì)算機(jī)上的監(jiān)控軟件均采用組態(tài)軟件時(shí),由于站點(diǎn)數(shù)量較多,而使得成本頗高,同時(shí)組態(tài)軟件還存在著對(duì)數(shù)據(jù)庫支持功能不足等缺陷?;诖朔N情況,經(jīng)過分析可知,應(yīng)用VB等高級(jí)語言設(shè)計(jì)程序仍然是比較常用的方法之一。但是由于設(shè)計(jì)者技術(shù)等方面的原因,該類應(yīng)用程序普遍存在可靠性差,后續(xù)維護(hù)困難等問題,特別是在與其它底層設(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ù)情況下,普通用戶會(huì)將通訊子程序嵌入到主程序中,這樣當(dāng)通訊發(fā)生錯(cuò)誤,或通訊返回?cái)?shù)據(jù)需要時(shí)間較長時(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è)基于頁式虛擬內(nèi)存的操作系統(tǒng),每個(gè)進(jìn)程只能訪問自己的虛擬內(nèi)存頁面空間,若要實(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)打開該應(yīng)用程序的.exe文件,確定該應(yīng)用程序的代碼和數(shù)據(jù)規(guī)模,系統(tǒng)也隨之保留一個(gè)地址空間的區(qū)域,并指明與該區(qū)域相關(guān)聯(lián)的物理存儲(chǔ)器就是.exe文件本身,這一過程可稱為內(nèi)存文件映射,具體來說就是系統(tǒng)裝載.exe文件,并將其映射到進(jìn)程地址空間的過程。如果使兩個(gè)或多個(gè)進(jìn)程映射同一文件映射對(duì)象的視圖,那么就將共享磁盤上同一文件或者物理磁盤的同一頁面,這樣當(dāng)一個(gè)進(jìn)程將數(shù)據(jù)寫入另一個(gè)共享文件映射對(duì)象的視圖時(shí),其他進(jìn)程可以立即在其對(duì)應(yīng)視圖中查看數(shù)據(jù)的變化,從而實(shí)現(xiàn)了進(jìn)程間內(nèi)存級(jí)的高速數(shù)據(jù)傳輸[3],這一過程如圖1所示。

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

Fig. 1 Data exchange between programs using shared memory

需要指出的是,共享文件可以是一個(gè)磁盤文件,也可以是一個(gè)物理內(nèi)存區(qū)域,或一個(gè)虛擬磁盤區(qū)域。為了實(shí)現(xiàn)高速交互,一般只使用物理內(nèi)存或虛擬磁盤文件。另外,對(duì)每一個(gè)通訊程序,根據(jù)數(shù)據(jù)類型和應(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è)可讀寫的、256字節(jié)、且名字為“map” 的內(nèi)存映射文件。同時(shí),為了實(shí)現(xiàn)快速數(shù)據(jù)傳輸,設(shè)置第一個(gè)參數(shù)為&HFFFFFFFF,即表示在物理內(nèi)存上創(chuàng)建對(duì)象。通過調(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) 通訊程序訪問共享內(nèi)存對(duì)象時(shí),需要通過內(nèi)存對(duì)象名調(diào)用OpenFileMapping()函數(shù),以獲取共享內(nèi)存對(duì)象的句柄。例如:

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

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

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

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

(1) 調(diào)用UnmapViewOfFile()從進(jìn)程地址空間中撤銷文件映射內(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)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法[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ò)的可能性;另外一種即是查詢方式,通過定時(shí)或延時(shí)查詢MSComm控件的某些屬性(比如CommEvent和InBufferCount屬性)值是否發(fā)生變化,以此來選擇并確定相應(yīng)的處理程序。這種方式的優(yōu)點(diǎn)就在于可以由用戶控制通訊過程,尤其當(dāng)程序空閑較多時(shí)多采用這種方式。

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

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

由圖2可知,通訊程序設(shè)置定時(shí)器定時(shí)向通訊對(duì)象(如PLC)發(fā)出讀信息命令,并置循環(huán)計(jì)數(shù)器n=0、再休眠(延時(shí))一定時(shí)間間隔后,即進(jìn)入讀取接收信息死循環(huán)。程序首先讀取緩沖區(qū)接收字符長度(InBufferCount)信息,若該值不為零,說明數(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ū)(詳情參見程序代碼);若不正確則丟棄。若InBufferCount值為零,說明沒有接收到數(shù)據(jù),空循環(huán),再次讀取InBufferCount信息,并使空循環(huán)計(jì)數(shù)器n加1,當(dāng)n超過設(shè)定次數(shù)(如10次)時(shí),即預(yù)定為接收失敗,將跳出接收死循環(huán)。

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

而對(duì)于通信主程序來說,也是由相同定時(shí)間隔的定時(shí)器觸發(fā)定時(shí)讀取公共區(qū)的數(shù)據(jù),再根據(jù)數(shù)據(jù)更新標(biāo)志G_ShrPLC.bFlag來判斷是否進(jì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)存映射文件名稱

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() '寫數(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é)束語

將主程序與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ǎn)線上,而且通過在企業(yè)的實(shí)際應(yīng)用,系統(tǒng)已完全達(dá)到了設(shè)計(jì)目標(biāo),獲得了良好的應(yīng)用效果。

參考文獻(xiàn):

[1] 胡榮, 沈俊杰. 基于條形碼技術(shù)的汽車安全氣袋監(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 的不定字長的串行通訊的研究及實(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)存
通過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)*
汤阴县| 黎城县| 涞源县| 尖扎县| 米泉市| 济宁市| 蓬莱市| 定州市| 磐安县| 若尔盖县| 大田县| 商城县| 礼泉县| 太康县| 枞阳县| 阿克陶县| 祁门县| 济宁市| 永福县| 佛冈县| 西安市| 渭南市| 灵川县| 南阳市| 德格县| 连城县| 喀喇沁旗| 阿勒泰市| 白朗县| 海阳市| 深泽县| 张家界市| 龙口市| 隆德县| 光山县| 甘德县| 阳曲县| 海城市| 桦南县| 太仓市| 萝北县|