999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

VB環境下基于內存共享技術的串行通訊程序設計

2014-04-29 13:29:02黃頔劉樺杰李艷寧
智能計算機與應用 2014年5期

黃頔 劉樺杰 李艷寧

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

關鍵詞:VB;內存映射;共享內存;串行通訊;PLC

中圖分類號:TP311 文獻標識號:A 文章編號: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 引 言

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

1采用內存共享技術的通訊原理

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

內存映射文件技術是WINDOWS內存管理的一個重要組成部分。當一個應用程序啟動時,系統打開該應用程序的.exe文件,確定該應用程序的代碼和數據規模,系統也隨之保留一個地址空間的區域,并指明與該區域相關聯的物理存儲器就是.exe文件本身,這一過程可稱為內存文件映射,具體來說就是系統裝載.exe文件,并將其映射到進程地址空間的過程。如果使兩個或多個進程映射同一文件映射對象的視圖,那么就將共享磁盤上同一文件或者物理磁盤的同一頁面,這樣當一個進程將數據寫入另一個共享文件映射對象的視圖時,其他進程可以立即在其對應視圖中查看數據的變化,從而實現了進程間內存級的高速數據傳輸[3],這一過程如圖1所示。

圖1 采用內存映射文件的公共數據交換過程示意圖

Fig. 1 Data exchange between programs using shared memory

需要指出的是,共享文件可以是一個磁盤文件,也可以是一個物理內存區域,或一個虛擬磁盤區域。為了實現高速交互,一般只使用物理內存或虛擬磁盤文件。另外,對每一個通訊程序,根據數據類型和應用要求,可以設置多個共享文件映射對象。

2 內存映射文件的使用步驟

VB本身不提供內存映射文件操作功能,此時需要調用WINDOWS提供的API函數實現,且將執行下列操作步驟[2-3]:

(1) 創建一個內存映射文件。用函數Create_FileMapping()在主程序中創建一個文件映射內核對象,例如

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

即表示創建了一個可讀寫的、256字節、且名字為“map” 的內存映射文件。同時,為了實現快速數據傳輸,設置第一個參數為&HFFFFFFFF,即表示在物理內存上創建對象。通過調用本函數就可獲得文件映射內存對象句柄。

(2) 在創建文件映射對象后,主程序調用MapViewOfFile()函數映射到本程序的地址空間內,例如:

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

(3) 通訊程序訪問共享內存對象時,需要通過內存對象名調用OpenFileMapping()函數,以獲取共享內存對象的句柄。例如:

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

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

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

當完成對內存映射文件的使用時,需要執行如下步驟將其徹底清除。具體步驟為:

(1) 調用UnmapViewOfFile()從進程地址空間中撤銷文件映射內核對象的映像。

(2) 調用CloseHandle()關閉文件映射內核對象。

3 PC與PLC的串行通訊技術

VB中通常采用了MSComm控件以實現工位PC與PLC等底層設備的交互通訊。MSComm控件的實用性強、功能完善,同時更為應用程序提供了通過串行接口收發數據的簡便方法[4]。

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

本文將每個通訊過程設計成獨立的通訊程序,每一通訊程序將采用查詢方法來實現和底層設備的通訊過程,再通過各自定義的公共數據區而與主程序實現數據交換。下面即可、以與西門子的S7-200PLC的MODBUS通訊方式為例,介紹通訊程序的設計,PLC側的MODBUS通訊程序利用西門子公司所提供的庫函數[5]。

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

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

采用如上方法可以人工控制程序流程,避免出現死循環現象,而且需要根據讀信息命令的內容,調節延時間隔,即可以實現正確的接收過程。

而對于通信主程序來說,也是由相同定時間隔的定時器觸發定時讀取公共區的數據,再根據數據更新標志G_ShrPLC.bFlag來判斷是否進行更新顯示或控制等操作,由此可見數據更新標志在主程序和通訊子程序之間起到一個同步作用,詳細流程則如圖3所示。此外,對于向PLC下發控制命令,則采取相反的流程。

4 部分程序代碼

在此,給出內存映射文件的部分實例代碼,具體則如下所示。

Type stShrPLC '定義PLC數據結構

bFalg As Boolean ' PLC數據更新標志

nDdata As Integer ' PLC數據

End Type

Public G_ShrPLC As stShrPLC ' PLC傳遞數據

Public Const Str_ShrPLC = "H_ShrPLC" '內存映射文件名稱

Public hMH_ShrPLC As Long '內存映射句柄

Public hMA_ShrPLC As Long '映射視圖指針

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

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

'創建內存映射文件

If hMH_ShrPLC = 0 Then MsgBox "創建內存映射文件失敗", vbQuestion, "錯誤"

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

CloseHandle (hMH_ShrPLC) '關閉映射文件

End

End If

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

If hMA_ShrPLC = 0 Then

CloseHandle(hMH_ShrPLC) '退出前關閉

End

End If

End Sub

Public Sub WriteToSharedMemory() '寫數據函數

If hMA_ShrPLC <> 0 Then

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

End If

End Sub

Public Sub GetFromSharedMemory() '讀數據函數

If hMA_ShrPLC <> 0 Then

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

End If

End Sub

5 結束語

將主程序與PLC等通訊程序分離,同時利用共享內存技術實現程序間數據的快速交換,并且充分利用Windows系統自身的多任務調度機制,得到的監控程序具有通訊可靠、界面操作流暢等優點。應用時由主程序調用SELL()啟動其它通訊程序,并設其為后臺運行方式。本方法可用于研制的汽車安全氣囊裝配生產線上,而且通過在企業的實際應用,系統已完全達到了設計目標,獲得了良好的應用效果。

參考文獻:

[1] 胡榮, 沈俊杰. 基于條形碼技術的汽車安全氣袋監控系統研制[J]. 機電一體化,2007(2):48-51,54.

[2] 孫文慶, 劉秉權, 肖鏡輝.基于內存映射文件的數據共享技術研究與應用[J]. 微計算機應用,2005,26(2):192-194.

[3] 黨志斌, 李迎綱, 樊燕京等. 基于內存映射的進程間通信實現跨平臺軟件互聯互通[J]. 現代電子技術, 2012, 29(14):46-47.

[4] 裘智峰,成曉明. 基于PLC 的不定字長的串行通訊的研究及實現[J]. 工業控制計算機,2004,17(2):54-55.

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

主站蜘蛛池模板: 欧美人与牲动交a欧美精品| 91福利在线观看视频| 精品国产香蕉伊思人在线| 免费无码AV片在线观看国产| 一区二区三区成人| 久久大香伊蕉在人线观看热2| aⅴ免费在线观看| 欧美一级高清片欧美国产欧美| 热热久久狠狠偷偷色男同| 免费99精品国产自在现线| 国产精品久久久精品三级| 激情综合图区| av在线人妻熟妇| 亚洲欧美在线精品一区二区| 国产亚洲成AⅤ人片在线观看| 91色在线观看| 国产福利一区二区在线观看| 国产一区成人| 国产打屁股免费区网站| 在线观看视频一区二区| 国产一在线观看| 久久精品国产精品青草app| 欧美区一区| 国产精品成人久久| 婷婷激情五月网| 国产成年无码AⅤ片在线| 免费播放毛片| 久久香蕉国产线看精品| 婷婷亚洲最大| 综合色亚洲| 欧美激情,国产精品| 69国产精品视频免费| 91精品国产自产在线观看| 国产精品视频久| 日韩a级毛片| 婷婷色一二三区波多野衣| 最新国产午夜精品视频成人| 国产精品xxx| 99精品影院| 精品视频一区在线观看| 熟妇丰满人妻| 亚洲天堂视频在线观看| 亚洲国产精品久久久久秋霞影院| 九九免费观看全部免费视频| 精品三级在线| 日本欧美成人免费| 91尤物国产尤物福利在线| AV不卡在线永久免费观看| 欧美国产三级| 国产在线91在线电影| 狠狠色噜噜狠狠狠狠色综合久 | 久久精品国产精品青草app| 亚洲免费三区| 久久久久青草大香线综合精品 | 国产麻豆91网在线看| 91精品福利自产拍在线观看| 热re99久久精品国99热| 色欲国产一区二区日韩欧美| 日日拍夜夜嗷嗷叫国产| 成人午夜久久| 亚洲日韩在线满18点击进入| 国产在线一二三区| 国产高清不卡| 久久黄色一级视频| 美女扒开下面流白浆在线试听| 亚洲综合九九| 在线观看无码av免费不卡网站| 久久不卡国产精品无码| 免费看美女自慰的网站| 亚洲婷婷丁香| 免费啪啪网址| 色香蕉影院| 亚洲资源站av无码网址| 激情午夜婷婷| 国产福利免费在线观看| 成人毛片在线播放| 在线精品亚洲国产| 中国一级特黄大片在线观看| 欧美区国产区| 亚洲一区二区三区中文字幕5566| 多人乱p欧美在线观看| 超薄丝袜足j国产在线视频|