版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、在 WINCC 中使用 WinSock 控件進行 TCP/IP 通訊的例程目錄一、WinSock 控件介紹(以 VB 語言表述) 11、WinSock 控件的主要屬性 12、WinSock 控件的主要方法 23、WinSock 控件的主要事件 3二、WinSock 控件在 WINCC 中的使用 31、WinSock 控件注冊 32、在 WinCC 中添加 WinSock 控件 4三、服務器端程序介紹 4四、WinCC 畫面模板與結構變量的配合使用 61、結構變量定義 62、畫面模板組態(tài) 73、調用畫面模板及修改變量前綴 74、將畫面模板中的對象連接到變量 8五、建立 TCP/IP 連接 8六、
2、接收數(shù)據(jù)包的處理 10附:在 VBS 中進行數(shù)據(jù)處理的局限性及變通解決方法 12摘要: 關鍵詞: VB、VBS、WINCC、WINSOCK 、DLL 、 UNICODE 、 ANSI 、 ASCII 、畫面模板、 結構變量、數(shù)據(jù)轉換。該文檔的軟件環(huán)境:Microsoft Windows XP Professional 版本 2002 SP3SIMA TIC WinCC V6.2 SP2 ASIA,SIMA TIC STEP7 V5.4+SP5+HF3 ChineseTCP&UDP 測試工具 V1.02目的:使用 WINCC 用戶程序作為客戶端程序, 與服務器通訊, 通訊協(xié)議為標準 TC
3、P/IP 協(xié)議, 取得服務器發(fā)送過來的數(shù)據(jù)包, 按數(shù)據(jù)包格式文本規(guī)定, 解析數(shù)據(jù)包數(shù)據(jù), 并將相關數(shù)據(jù)顯 示在用戶程序畫面中。一、WinSock 控件介紹(以 VB 語言表述)1、WinSock 控件的主要屬性1)Protocol 屬性通過 Protocol 屬性可以設置 WinSock 控件連接遠程計算機使用的協(xié)議??蛇x的協(xié)議是 TCP 和 UDP 對應的 VB 的常量分別是 sckTCPProtocol 和 sckUDPProtocol , Winsock 控件默 認協(xié)議是 TCP 。注意:雖然可以在運行時設置協(xié)議,但必須在連接未建立或斷開連接后。2)SocketHandle 屬性Sock
4、etHandle 返回當前 socket 連接的句柄,這是只讀屬性。3)RemoteHostIP 屬性RemoteHostIP 屬性返回遠程計算機的 IP 地址。在客戶端,當使用了控件的 Connect 方法后,遠程計算機的 IP 地址就賦給了 RemoteHostIP 屬性,而在服務器端, 當 ConnectRequest 事件后,遠程計算機(客戶端)的 IP 地址就賦給了這個屬性。如果使用的是 UDP 協(xié)議那么 當 DataArrival 事件后,發(fā)送 UDP 報文的計算機的 IP 才賦給了這個屬性。4) ByteReceived 屬性返回當前接收緩沖區(qū)中的字節(jié)數(shù)5) State 屬性返回
5、Win Sock控件當前的狀態(tài)常數(shù)值描述sckClosed0缺省值,關閉SckOpe n1打開SckListe ning2偵聽sckC onnectionPending3連接掛起sckResolv in gHost4識別主機sckHostResolved5已識別主機sckC onnecting6正在連接sckC onn ected7已連接sckClos ing8冋級人員正在關閉連接sckError9錯誤2、Win Sock控件的主要方法1) Bind 方法用Bind方法可以把一個端口號固定為本控件使用,使得別的應用程序不能再使用這個端口。2) Liste n方法Liste n方法只在使用TCP
6、協(xié)議時有用。它將應用程序置于監(jiān)聽檢測狀態(tài)。3) Conn ect 方法當本地計算機希望和遠程計算機建立連接時,就可以調用Connect方法。Connect方法調用的規(guī)范為:Conn ect RemoteHost,RemotePort4) Accept 方法當服務器接收到客戶端的連接請求后,服務器有權決定是否接受客戶端的請求。5) Sen dData 方法當連接建立后,要發(fā)送數(shù)據(jù)就可以調用SendData方法,該方法只有一個參數(shù),就是 要發(fā)送的數(shù)據(jù)。6) GetData 方法 當本地計算機接收到遠程計算機的數(shù)據(jù)時,數(shù)據(jù)存放在緩沖區(qū)中,要從緩沖區(qū)中取出 數(shù)據(jù),可以使用 GetData 方法。 Ge
7、tData 方法調用規(guī)范如下:GetData data,type,maxLen它從緩沖區(qū)中取得最長為 maxLen的數(shù)據(jù),并以type類型存放在data中,GetData取 得數(shù)據(jù)后,就把相應的緩沖區(qū)清空。7) PeekData 方法和 GetData 方法類似,但 PeekData 在取得數(shù)據(jù)后并不把緩沖區(qū)清空。3、WinSock 控件的主要事件1) ConnectRequest 事件當本地計算機接收到遠程計算機發(fā)送的連接請求時,控件的ConnectRequest 事件將會被觸發(fā)。2) SendProgress 事件當一端的計算機正在向另一端的計算機發(fā)送數(shù)據(jù)時,SendProgress 事件
8、將被觸發(fā)。SendProgress 事件記錄了當前狀態(tài)下已發(fā)送的字節(jié)數(shù)和剩余字節(jié)數(shù)。3) SendComplete 事件當所有數(shù)據(jù)發(fā)送完成時,被觸發(fā)。4) DataArrival 事件 當建立連接后,接受到了新數(shù)據(jù)就會觸發(fā)這個事件。 注意:如果在接受到新數(shù)據(jù)前,緩沖區(qū)中非空,就不會觸發(fā)這個事件。5) Error 事件 當在工作中發(fā)生任何錯誤都會觸發(fā)這個事件。二、WinSock 控件在 WINCC 中的使用1、WinSock 控件注冊在 WinCC 中使用 WinSock 控件前,需要先進行注冊。注冊方法如下: 使用記事本新建一個后綴名為 reg 的文件,編輯文件,加入以下文本:HKEY_CLA
9、SSES_ROOTLicenses2c49f800-c2dd-11cf-9ad6-0080c7e7b78d="mlrljgrlhltlngjlthrligklpkrhllglqlrk" 保存文件退出。先將 mswinsck.ocx 拷貝到 system32 下 再將注冊表文件添加到注冊表然后 "運行 " ,輸入 "regsvr32 MSWINSCK.OCX" ,確定。2、在 WinCC 中添加 WinSock 控件在 WinCC 圖形編輯器中打開需要顯示服務器數(shù)據(jù)的畫面, 選擇“對象選項板” 的“控 件”選項卡, 在選項卡中選擇 “添
10、加 /刪除” ,在“選擇 OCX 控件”對話框中選擇 “Microsoft WinSock Control, version 6.0 ”進行注冊。在對象選項板中的 WinSock 控件拖入畫面中。三、服務器端程序介紹這里所要通訊的服務器端程序是運行于南車資陽機車有限公司生產的 V280/285 系列 船用柴油機機旁控制屏監(jiān)控系統(tǒng)程序。以下是協(xié)議文本:通訊方式: TCP/IP偵聽端口: 9105機旁柜 IP 地址定義:由用戶根據(jù)具體網(wǎng)絡配置決定PAC 數(shù)據(jù)采集周期: 1 秒上位機記取數(shù)據(jù)周期: 1 秒數(shù)據(jù)包格式定義如下:上位機發(fā)送命令到 PAC 的數(shù)據(jù)包定義:本數(shù)據(jù)包由上位機發(fā)送到PAC ,PA
11、C 根據(jù)上位機發(fā)送的的命令執(zhí)行,同時返回最新的采集數(shù)據(jù)到上位機。數(shù)據(jù)長度: 10 字節(jié)。數(shù)據(jù)類型: byte。數(shù)據(jù)包詳細定義:命令代碼1字節(jié)+備用代碼1字節(jié)+設定轉速 4字節(jié)(single) +備 用 1 字節(jié)其中命令代碼意義:1=“讀數(shù)據(jù)”;18=“轉速升”;19=“轉速降”。PAC發(fā)送到上位機的數(shù)據(jù)包定義:數(shù)據(jù)長度:650個字節(jié)。數(shù)據(jù)類型:BYTE。數(shù)據(jù)包內容詳細定義及代碼示意如下:起始傳80個浮點數(shù),每個浮點數(shù)占用四個字節(jié),高位在后,低位在前。00000000h: 33 33 E7 41 00 00 E8 41 66 66 EA 41 66 66 EA 41 ; 00000010h: 3
12、3 33 EB 41 66 66 E6 41 00 00 E4 41 CD CC E0 41 ; 00000020h: 66 66 DA 41 00 00 DC 41 00 00 DC 41 00 00 DC 41 ; 00000030h: 66 66 DA 41 CD CC D4 41 CD CC D4 41 00 00 D0 41 ;00000040h: 00 00 DC 41 00 00 DC 41 33 33 DB 41 CD CC D8 41 ; 00000050h: 9A 3F 1C 46 9A 3F 1C 46 9A 3F 1C 46 9A 3F 1C 46 ; 00000060
13、h: 65 66 89 41 32 B3 95 41 CE CC 94 41 CC 2C 95 41 ;00000070h: CD 2C 8C 41 33 93 91 41 01 E0 91 41 99 19 92 41 ; 00000080h: 01 C0 8F 41 01 00 8E 41 9A 59 94 41 00 00 00 00 ;00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; 000000a0h: FC FF 0A 42 F6 FF FB 41 9A 3F 1C C6 9A 3F 1C C6 ; 00000
14、0b0h: 9A 3F 1C C6 9A 3F 1C C6 9A 3F 1C C6 A3 FF 89 40 ; 000000c0h: 9A 3F 1C C6 9A 3F 1C C6 9A 3F 1C C6 0F 00 B5 41 ;000000d0h: 74 FF EF 3F 9A 3F 1C C6 66 66 B8 40 9A 99 FD 41 ; 000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; 000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00
15、000100h: 00 00 00 00 00 00000000 00 00 00 00 000000;00000110h: 8F C2 04 42 00 00000000 00 00 00 00 000000;00000120h: 00 00 00 00 00 00000000 00 00 00 00 000000;00000130h: 00 00 00 00 00 00000000 00 00 00 00 000000;.續(xù):PAC第一組IO輸入點,2字節(jié);PAC第二組IO輸入點,2字節(jié);PAC第一組10輸 出點,1字節(jié);PAC第二組IO輸出點,1字節(jié);P|行狀PAC當前執(zhí)行的 命令,1字
16、節(jié);備用,1字節(jié);當前設定轉速,4字節(jié);報警數(shù)目,1字節(jié);報警信息,300 字節(jié);備用,16字節(jié)。00000140h: 05 00 00 00 00 00 0Hl|00 00 00 00 00 00 00 |j0 ;.00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;.00000160h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00000170h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00000180h:
17、 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;000001c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;000001d0h:
18、 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;OOOOOIeOh: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;OOOOOIfOh: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00000200h00000210h00000220h00000230h00000240h00000250h00000260h00000270h00000280h00 000000000000000000000000000000;.00 00000000000
19、0000000000000000000;00 000000000000000000000000000000;00 000000000000000000000000000000;00 000000000000000000000000000000;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00四、WinCC畫面模板與結構變量的配合使用本用戶
20、程序需要實時采集顯示三臺同類型柴油機的運行數(shù)據(jù),由于三臺柴油機的數(shù)據(jù)采集和顯示是相同的,而WinCC畫面模板與結構變量配合使用可以在一個畫面中根據(jù)條件顯示具有相同類型參數(shù)的多個對象,避免反復組態(tài)相同畫面布局的工作,減少項目后期某些細節(jié)部位的修改而帶來的工作量,所以本用戶程序采用畫面模板與結構變量配合使用方法進行組態(tài)設計。WinCC中的畫面模板一文提出四種使用畫面模板的方法,這里采用第三種方法, 即“使用變量前綴的畫面窗口”。組態(tài)步驟如下所示:1、結構變量定義在 WinCC中定義一個結構變量,結構變量名稱為sDieselData。結構變量包括 64個FLOAT型變量(數(shù)據(jù)包上傳80個模擬量,但實
21、際使用只有小于 64個,出于編程方便起見, 使用8*8 = 64個單精度浮點變量),16個BIT型變量(只使用PAC的輸入點、其它開關量 不使用),1個SHORT變量(反映通訊狀態(tài))。64個單精度浮點型變量的命名格式為:fTag11、fTag12,fTag21、fTag22,fTag18fTag28,fTag81、fTag82,fTag8816 個 BIT 型變量命名格式為 biTag1、biTag2, biTag16。1個SHORT型變量名稱為 TXStatus。結構變量定義完成后,根據(jù)結構變量定義三個內部結構變量,分別命名為“CNB“YYB ”、“ SXB2、畫面模板組態(tài)新建一個畫面,畫面
22、名稱為pDieselMod.pdl,并在畫面中加入一個Win Sock控件、些文字和輸入/輸入域,以及其它有些相關控件。如下圖如示:第01俎屮冃禮t 曾Q2粗祐渝 算 03«, 鴛的遼杵屈: 顛航菲溫; 慎06址卑目品I 郵昨r菲溫;0.0呱0血DO.OOD當術垃目渦0血 第皿虹菲溫|仇QQO 奚 10=1.菲區(qū)1 u.tw 簞11虹搟溫:叮叫 第1由溫; 第13血UF溫 助4江菲血前渦前排氣晶 后禍前排*罷前周后排氣禺 后渦后排氣溫. 主抽道進口積油= ;機怕泵由口機也 高溫車進術君閔 :奇爲朮出朋侶度:中椅器后術溫,O.04D0.000.000n.OcooaoooO.OflOO.
23、OfiOQ.0000.000T:o.owT:前増壓器進氣, 后增壓器進氣 前増壓器出氣丄 后增壓器出氣 中冷后空氣溫主油這逬口油壓| 0衛(wèi)吒 皿 機油泰岀匚抽氏也五 前増圧器涯前佔 前増壓器濾后油I后増壓器嬉前油:1F«啟増壓器嬉后紙衛(wèi)巴 =溫水泵出壓I O i'C'O 中冷朮泵出口莊:I O.QIW KF1 烯油*誕器進口:-込烯油粽底器出日:飛碩空氣溫度壓力O.flOOo.wio0.000O.WiO前増丞器岀口讓 啟増W盤出口 /| 0.W0 中拎焉空氣恵 撤壓溺竝宅:運行時間O.OMtIF*O.0M> 皿O.OMO.OM*p*發(fā)動機牠逋=.aM増壓器轉淙.
24、o.oa0血¥翁動機n荷率匚各缸規(guī)度20控副箱人信號控制橫式:正常高壓油苣;無泄漏啟幼模式t羊動曲鉅科壓力:正常盤車運鎖:故障腿運:無故滋啟動摂鈕;斷開燃油泵1;爸用停車按鈕;閉合 燃油泵2:備用遇控調速:預供機油泵:夬團砸速狀態(tài):jK殺SE命令:無3、調用畫面模板及修改變量前綴新建的畫面模板需要在主畫面的一個子畫面窗口中顯示。主畫面文件名稱為“pMain.pdl ”,子畫面窗口名稱為"pMainArea ”。在用戶程序運行時,有一個界面中顯示 了三臺柴油機的圖標,點擊某一個柴油機圖標,子畫面切換到相應的柴油機狀態(tài)及參數(shù)界面。圖標的鼠標動作 C代碼如下:#in clude
25、"apdefap.h"void On Click(char* IpszPictureName, char* IpszObjectName, char* IpszPropertyName)#pragma opti on( mbcs)#defi ne PIC_0 "pMai n"#define PIC_1 "pDieselMod.PDL"SetPropChar(PIC_0,"pMainArea","TagPrefix","CNB.");,此處 ” CNB.在其余兩處為” YYB.
26、”、” SXB.”SetPictureName(PIC_O,"pMai nArea",PIC_1);上面代碼中關健代碼就是: SetPropChar(PIC_0,"pMainArea","TagPrefix","CNB.")。該行語句設置了子窗口pMa in Area的變量前綴為” CNB”。當子窗口設置了變量前綴后,畫面窗口中的對象連接變量時,變量一般會自動加上前綴(連接包括動態(tài)對話框、變量、C腳本及VBS腳本)。注意:在設置了子窗口的變量前綴后,如果要切換顯示不帶變量前綴的畫面,則需設置子窗口的變量前綴為空。例
27、外Ope nPrevPicture()函數(shù)不受影響。4、將畫面模板中的對象連接到變量將畫面模板中的對象連接到相應的變量,組態(tài)方法與常規(guī)組態(tài)相似,不同之處在于變更量名稱需要去掉前綴,在腳本中所使用的變量同樣不要帶變量前綴,因為變量前綴會自動加上。在組態(tài)時會提示變量不存在,忽略即可。五、建立TCP/IP連接TCP/IP連接,如果連接沒有建立,要求是在柴油機狀態(tài)及參數(shù)畫面顯示時自動建立則將相應的結構變量清零,并且每隔兩秒重建連接。連接建立后,發(fā)送讀數(shù)據(jù)命令數(shù)據(jù)包。在畫面對象屬性的“顯示”屬性中加入如下VBS代碼(觸發(fā)器選擇 2s周期)Function Visible_Trigger(Byval It
28、em)Dim Obj_SockClie ntDim cnvtDim obj_Scree nDim obj_pScree nDim Tagn tTXStatusDim i,jDim Tag_f,Tag_b,獲得當前窗口中的Win Sock對象Set Obj_SockClie nt = Scree nltems("objSock"),獲得顯示當前畫面的子窗口對象Set obj_Screen = HMIRu ntime.Scree ns("pMai n").Scree nltems("pMai nArea"),這是一個轉換DLL,后面還要講
29、到Set c nvt = CreateObject("ADS.ArrayCo nvert"),以下是建立連接前的參數(shù)初始化工作,遠程地址和端口號根據(jù)實際情況修改,此處設置是為了方便測試工作,可使用TCP&UDP測試工具進行測試。Obj_SockClie nt. Protocol = "sckTCPProtocol"Select Case obj_Scree n.TagPrefixCase "CNB."Obj_SockClie nt.RemoteHost = "192.168.1.100"Obj_SockCl
30、ie nt.RemotePort = 4002Case "YYB."Obj_SockClie nt.RemoteHost = "192.168.1.100"Obj_SockClie nt.RemotePort = 4003Case "SXB."Obj_SockClie nt.RemoteHost = "192.168.1.100"Obj_SockClie nt.RemotePort = 4004Case ElseExit FunctionEnd Select,連接沒有建立、連接錯誤、同級人員正在關閉連接,這三種情況
31、下,先關閉連接,再 嘗試建立連接。If (Obj_SockClie nt.State = 0) Or (Obj_SockClie nt.State = 9) Or (Obj_SockClie nt.State = 8) The nObj_SockClie nt.CloseObj_SockClie nt.Co nnectEnd If,如果連接沒有建立,則使相應的FLOAT型結構變量清零。If Obj_SockClie nt.State <> 7 The nFori = 1 To 8Forj = 1 To 8Set Tagi_f = HMIRuntime.Tags("fTag
32、" & i & j)Tag_f.Value = 0 Tag_f.Write,1NextNext,如果連接沒有建立,則使相應的BIT型結構變量復位。For i = 1 To 15Set Tag_b = HMIR un time.Tags("biTag" & i)Tag_b.Value = FalseTag_b.Write ,1NextElse,如果連接建立,則發(fā)送訊數(shù)據(jù)命令數(shù)據(jù)包Obj_SockClie nt.Se ndData cnvt.CvHexStr2vOctetStr("01000000000000000000")
33、End If,寫入當前連接狀態(tài)字Set Tagn tTXStatus = HMIR un time.Tags("TXStatus")Tagn tTXStatus.Value = Obj_SockClie nt.StateTagn tTXStatus.Write , 1End Fun cti on六、接收數(shù)據(jù)包的處理當建立連接后,接受到了新數(shù)據(jù)就會觸發(fā)這個DataArrival事件。這里只對前 64個模擬量數(shù)據(jù)、16個開關量輸入數(shù)據(jù)、10條漢字報警信息進行解析,并將解析后的數(shù)據(jù)賦值 給相應的變量,漢字報警信息直接在窗口中的S7FlatEditBox控件中顯示。DataArri
34、val 事件的VBS代碼如下:Sub DataArrival(Byval Item, Byval bytesTotal)On Error Resume NextDim Obj_SockClie ntDim cnvtDim obj_OutTextDim strReceiveDim strFromRec,strFromRec1Dim i,jDim Tag_f,Tag_bDim strForBool,iForBoolCheckSet Obj_SockClie nt = Scree nltems("objSock")Set c nvt = CreateObject("AD
35、s.ArrayCo nvert")Set obj_OutText = Scree nItems("objOutText"),接收數(shù)據(jù)包字節(jié)數(shù)應為650字節(jié),否則不處理If bytesTotal = 650 The n,從接收緩沖區(qū)取得數(shù)據(jù),并清空緩沖區(qū)Item.GetData strReceivestrFromRec =""'提取前333個字節(jié)所包含的信息,用于模擬量和開關量解析For i = 0 To 333 'UBou nd(strReceive),將接收到的BYTE()型數(shù)據(jù)轉換為String型數(shù)據(jù)strFromRec =
36、 strFromRec & Right("0" & Hex(Ascb(Midb(strReceive , i + 1 ,1) , 2 )Next '解析出80個模擬量并賦值給相應的變量Fori = 1 To 8Forj = 1 To 8Set Tag=HMIRuntime.Tags("fTag" & i & j),此處使用了 DLL中的數(shù)據(jù)轉換函數(shù),CvHexStr2vReal2的功能是將十六進制字符串表示的單精度浮點數(shù)轉換成實際的浮點數(shù)值。該函數(shù)后面還要講到。Tag_f.Value = cnvt.CvHexStr
37、2vReal2(Mid(strFromRec,(i-1)*8+j-1)*8+1,8) Tag_f.Write,1NextNext'解析開關量輸入字節(jié)(2字節(jié)),并賦值給相應的變量iForBoolCheck = 0strForBool = Mid(strFromRec,643,2) & Mid(strFromRec,641,2) iForBoolCheck = Eval("&H" & strForBool)For i = 1 To 15Set Tag_b = HMIRuntime.Tags("biTag" & i)I
38、f (iForBoolCheck And 2A(i-1) ) = 0 The nTag_b.Value = FalseElseTag_b.Value = TrueEnd IfTag_b.Write ,1NextEnd If'解析漢字報警信息10條(每條信息包含15個漢字)For i = 0 To 9For j =0 To 14,提取漢字信息,并轉換成Uni code字符串。strFromRed = strFromRed & MidB(strReceive,i*30+j*2+335,2)NextstrFromRed = strFromRed & vbCrLfNextobj
39、_OutText.Text = strFromRedEnd Sub附:在VBS中進行數(shù)據(jù)處理的局限性及變通解決方法在VBS中對數(shù)據(jù)進行轉換解析處理,是一個比較普遍的應用問題,并不僅限于在WINCC中的應用,而 VBS在進行數(shù)據(jù)處理時的局限,也使得單靠VBS自身無法圓滿的處理,需要借助其它手段,而VBS結合外部動態(tài)鏈接庫是一個合理的解決方案。VBS( Microsoft Visual Basic Scripting Edition )是一種腳本語言??梢钥醋魇荲B 語言的簡化版,可使用操作系統(tǒng)和其它程序所提供的程序庫,由操作系統(tǒng)解釋運行。WINCCV6.0首次集成了VBS,可以用來使運行環(huán)境動態(tài)
40、化,也可以創(chuàng)建動作(action)和過程(procedure)來動態(tài)化圖形對象。注:腳本語言是使用一種特定的描述性語言,依據(jù)一定的格式編寫的可執(zhí)行文件,又稱作宏或批處理文件,是為了縮短傳統(tǒng)的編寫-編譯-鏈接-運行(edit-compile-link-run )過程 而創(chuàng)建的計算機編程語言。一個腳本通常是解釋運行而非編譯,腳本程序在執(zhí)行時,是由系統(tǒng)的一個解釋器,將其一條條的翻譯成機器可識別的指令,并按程序順序執(zhí)行。VBS只有一種數(shù)據(jù)類型,即Variant (可變的)。VBS在處理數(shù)據(jù)時,按上下文對其處理的方式,把數(shù)據(jù)當作數(shù)字或字符串進行處理,也就是VBS覺得它像什么,就把它當作什么來進行處理。
41、Variant包含的數(shù)值信息類型稱為子類型,大多數(shù)情況下,可將所需的數(shù) 據(jù)放進Variant中,而Variant也會按照最適用于其包含的數(shù)據(jù)的方式進行操作。VBS這種處理數(shù)據(jù)的方法,有其優(yōu)點和局限性。優(yōu)點在于簡單方便,局限性在于降低 了可控性,特別是在處理低層數(shù)據(jù)代碼時,難度較高,而有些要求沒有辦法達到。比如在WINCC中使用MSCOMM控件進行數(shù)據(jù)收發(fā)時,MSCOMM控件處理的是BYTE ()類型數(shù)據(jù),在 VBS中會將它作為 VARIANT ()類型數(shù)據(jù)進行處理,而這種數(shù)據(jù) 類型無法通過串口發(fā)送出去,而在VBS中沒有相應的函數(shù)將其轉換成BYTE ()類型數(shù)據(jù)。又比如在VBS中要將一個如“ 4
42、199999A”的字符串轉換成單精度浮點數(shù)據(jù),會非常困難, 則類似的轉換在 C或VB這類高級語言中卻很容易。在進行上述數(shù)據(jù)處理任務時,結合動態(tài)鏈接庫是比較合理的方法。下面詳細講述一般 需要用到的數(shù)據(jù)轉換如何通過VB編寫DLL來實現(xiàn)。在切換到VB中進行編程之前,先了解熟悉VBS中的有關數(shù)據(jù)類型的處理。1、在VBS中如何定義變量在VBS中定義變量,只能使用一種定義方式,即Dim語句,變量類型只有一種,即VARIANT,而不是象在 VB中可以顯示定義變量為不同的數(shù)據(jù)類型,如String , Interger,Long 等。測試下列一段代碼:Dim A , B , CA = Array(10,20,3
43、0)B = Array("10","20","30")C = Array(CByte(A(0),CByte(A(1),CByte(A (2)Msgbox type name(A),顯示數(shù)據(jù)類型為Variant。Msgbox type name(A(0),顯示數(shù)據(jù)類型為In tergerMsgbox type name(B),顯示數(shù)據(jù)類型為Varian t ()Msgbox type name(B(0),顯示數(shù)據(jù)類型為Stri ngMsgbox type name(C),顯示數(shù)據(jù)類型為Varian t ()Msgbox type nam
44、e(C(0),顯示數(shù)據(jù)類型為Byte測試結果顯示,對于單個變量,雖然不能象在 VB中顯示定義其數(shù)據(jù)類型,但VBS可以大致判斷其數(shù)據(jù)類型,也可以將數(shù)據(jù)通過強制轉換成所需要的數(shù)據(jù)類型。但不管如何定義或轉換,僅通過 VBS中的定義方式和轉換函數(shù),無法改變數(shù)組的類型,最終結果只有一種 數(shù)組類型,即 Varaint()。2、VBS中的字符編碼在VBS中,字符串以 Unicode編碼表示,編碼的實現(xiàn)方案是UTF-16 LE。當VBS調用低層API函數(shù)(VBS不能直接調用,而是通過控件或DLL間接調用)時,大都會由系統(tǒng)自動將Uni code字符串轉換成 ANSI編碼字符串。如通過 Win sock控件發(fā)送字
45、符串, 在接收 端接收到的字符串實際上是ANSI字符串。在簡體中文 WinXP操作系統(tǒng)下,默認的 ANSI編碼是GBK字符集。3、VBS的字符轉換函數(shù)Chr函數(shù)返回與指定的 ANSI字符代碼相對應的字符。調用格式:Chr(charcode) charcode參數(shù)是可以標識字符的數(shù)字。說明:從0到31的數(shù)字表示標準的不可打印的 ASCII代碼。例如,Chr(10)返回換 行符。注意:ChrB函數(shù)與包含在字符串中的字節(jié)數(shù)據(jù)一起使用。ChrB不是返回一個或兩個字節(jié)的字符,而總是返回單個字節(jié)的字符。ChrW 是為使用 Unicode字符的32位平臺提供的。它的參數(shù)是一個Uni code (寬字符)的字
46、符代碼,因此可以避免將ANSI轉化為Uni code 字符。Asc函數(shù)返回與字符串的第一個字母對應的ANSI字符代碼。Asc(string) string參數(shù)是任意有效的字符串表達式。如果string參數(shù)未包含字符,則將發(fā)生運行時錯誤。注意:AscB函數(shù)和包含字節(jié)數(shù)據(jù)的字符串一起使用。AscB不是返回第一個字符的字符代碼,而是返回首字節(jié)。AscW是為使用 Uni code字符的32位平臺提供的。它返回Unicode (寬型)字符代碼,因此可以避免從ANSI至U Unicode的代碼轉換??偨Y如下:chrb/ascb用來做ASCII轉換,但并不僅包括前128個字符,而是全單字節(jié)字符,所以應該是用
47、來做單字節(jié)字符的轉換。chr/asc用來做ANSI轉換,在當前中文簡體 WINDOWS系統(tǒng)中,即對應于GBK字符集 的轉換。在 WinXP中文版下的 VB6.0中,Chr能夠正確轉換遇 0128和255的單字節(jié)字符 碼和GBK字符集中的雙字節(jié)字符碼,超出此范圍的字符碼或解釋成NUL字符,或是其它未料結果。chrw/ascw 用來做 Unicode 轉換。4、在 VBS中調用 MSCOMM 和 WINSOCK的注意事項在VBS中可以調用 MSCOMM和 WINSOCK通訊控件,以完成串口通訊和以太網(wǎng)通 訊。通訊控件可以以字符串或字節(jié)數(shù)組方式進行數(shù)據(jù)發(fā)送或接收,但由于字節(jié)數(shù)組在VBS中不能顯示定義
48、,一個自然而然的想法是通過字符串方式進行數(shù)據(jù)發(fā)送或接收。如果發(fā)送的數(shù)據(jù)范圍在 0x000x7F之間,可以通過Chr函數(shù)將十六進制數(shù)據(jù)轉換成相 應的ASCII碼字符,并且組合成字符串數(shù)據(jù)流,由于在此數(shù)據(jù)范圍內的字符碼可各系統(tǒng)平 臺和軟件環(huán)境中均可以得到唯一正確的解析,所以這個方法是可行的。但如果發(fā)生沖突的數(shù)據(jù)超出此范圍,再想通過Chr函數(shù)(或者ChrB/ChrW函數(shù))將十六進制數(shù)據(jù)轉換成字符,轉換結果將不是我們所預期的結果,這與軟件平臺和操作系統(tǒng)平臺有關,其中一些字符碼被解釋成空字符,或者是”? ”,還有一些被解釋成不同字符集下對應的不同的字符。所以在 VBS中調用通訊控件進行數(shù)據(jù)發(fā)送或接收,使
49、用字符串方式不是合 理的方案。在了解了 VBS中進行數(shù)據(jù)處理的局限后,自然而然我們想到需要用其它的方法來解決 這些問題,可行的方法是通過DLL外部調用。因為 VB簡單實用,在實際應用中,一些在VBS中不能處理或難以處理的任務,可以在VB中進行簡單的處理,用VB來創(chuàng)建編譯 DLL容易掌握,將這些功能編譯進DLL中,可以由VBS調用處理。1、Variant數(shù)組轉換成 Byte數(shù)組如前面提到在VBS中進行定義或轉換,只能得到Variant類型數(shù)組,而在 VB中將Variant類型數(shù)組轉換成 Byte型數(shù)組非常簡單,如下面這個函數(shù)就可以實現(xiàn)這個功能:Public Fun cti on CvVaria
50、ntArray2vByteArray(i nV arArray As Varia nt) As Varia ntDim i As In teger, byteArray() As ByteReDim byteArray(UBou nd(i nV arArray)For i = 0 To UBou nd(i nV arArray)byteArray(i) = inV arArray(i)Next iCvVaria ntArray2vByteArray = byteArrayEnd Fun cti on在上面這個函數(shù)中,僅僅做了兩件事,一是定義一個Byte數(shù)組,二是將 Variant數(shù)組元素拷貝到
51、Byte數(shù)組中。2、十六進制數(shù)據(jù)格式字符串轉換成相應的Byte數(shù)組十六進制數(shù)據(jù)格式字符串是指字符串中的字符(兩個一組)以十六進制數(shù)據(jù)格式表示,范圍在“ 00”至“ FF”之間,如下面這個字符串:“EB9000FF”將這樣一個字符串轉換成相應的Byte數(shù)組,其轉換結果是:BYTE(3) = (0xEB,0x90,0x00,0xFF)相應的VB函數(shù)代碼如下所示:Public Fun ction CvHexStr2vOctetStr(vl nstr As Varia nt) As Varia nt'Use this to convert a Variant containing an ASC
52、II encoded Hex string to a Variant Array of bytes'this allows vbs to create Variants for ADSTYPE_OCTETSTRING from stri ngs of ASCII characters 0-9 A-FDim vOutArray() As Byte, i As LongDim v As Varia ntReDim vOutArray(0 To Len(vln str) 2 - 1)For i = 1 To Le n(vIn str) 2vOutArray(i - 1) = Val(&quo
53、t;&H" & Mid(vl nstr, 2 * i - 1, 1) * 16 + Val("&H" &Mid(vInstr, 2 * i, 1)Next iCvHexStr2vOctetStr = vOutArrayEnd Fun cti on該函數(shù)的工作原理如下(以“EB9000FF ”為例):字符串vlnstr =“EB9000FI是一個Unicode字符串,在內存中的存放的十六進制字節(jié)序為“ 45-00-42-00-39-00-30-00-30-00-30-00-46-00-46-00 ”,字符串長是 8( Len 函數(shù))。
54、新建一個Byte數(shù)組,數(shù)組元素個數(shù)為4。Mid函數(shù)是從指定字符串中返回指定數(shù)目的字符(注意不是字節(jié)),該函數(shù)以字符為基本操作元素,不是字節(jié),由于在 VB中,字符以 Unicode格式(UCS-2/UTF-16 LE,雙字 節(jié))表示,F(xiàn)or循環(huán)開始時(i = 0),Mid(vInstr, 2 * i - 1, 1)首先取出第一個字符,即“ E”(雙字節(jié)十六進制“ 0045”,小端序),這個字符是十六制格式的,所以在前面加上“&H ”前綴表示十六進制書寫格式,將這個十六進制格式字符經Val函數(shù)轉換成對應的數(shù)字,即14,由于這個字符是字節(jié)中的高4位,所以需要*16,等于224。類似,取出同一
55、字節(jié)中的低4位“ B”并轉換成相應的數(shù)字11,并與高4位數(shù)字相加,最終結果是235,在內存中存放的十六進制字節(jié)為“EB ”。循環(huán)結束后,得到字節(jié)數(shù)組(0xEB,0x90,0x00,0xFF )。3、四字節(jié)十六進制數(shù)據(jù)格式字符串轉換成單精度浮點數(shù)據(jù)在IEEE 754標準中定義了單精度浮點數(shù)采用32位二進制數(shù)據(jù)(4字節(jié))表示,二進制數(shù)據(jù)按位分割成符號位、指數(shù)域和尾數(shù)域,將浮點數(shù)轉換成實數(shù),需要按公式進行計算。 如果在VBS中處理這樣的轉換,需要進行移位、判斷、計算等多步處理,比較繁瑣,運行 效率也不見得有多高,而在VB中進行這樣的轉換處理是很方便的。比如在VBS中使用通訊控件接收數(shù)據(jù),在接收到的數(shù)據(jù)包中有四個字節(jié)的數(shù)據(jù)(9A,99,E5,41),這四個字節(jié)的數(shù)據(jù)表示一個IEEE單精度浮點數(shù),在字節(jié)流中以小端序(LE)傳輸(41是高有效字節(jié) MSByte),以DWORD表示即為0x41E5999A,轉換成單精度浮點數(shù) 即為28.7。這樣的字節(jié)流在通訊控件接收到以后,存放在Byte數(shù)組中,在內存中存儲的字節(jié)為9A-99-E5-41,其實這正是IEEE單精度浮點數(shù)在內存中的存放格式,如果能將該內存區(qū)(4字節(jié))拷貝給一個float型變量,就可以很方便的完成轉換工作。但在VBS中沒有直接對內存區(qū)進行操作的命令或函數(shù),所以這個轉
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年冀教版選擇性必修3化學上冊月考試卷含答案
- 2025年外研版2024八年級地理下冊月考試卷含答案
- 2025年新科版八年級地理上冊階段測試試卷含答案
- 2025年蘇教版必修1地理上冊階段測試試卷含答案
- 2025年浙教版九年級歷史上冊階段測試試卷
- 2024年北師大新版必修3地理上冊階段測試試卷含答案
- 2025年仁愛科普版九年級歷史上冊階段測試試卷
- 二零二五年度美容院美容師職業(yè)發(fā)展規(guī)劃聘用合同3篇
- 2025年度專業(yè)潛水員聘用合同范本大全4篇
- 2025年度定制門窗及智能控制系統(tǒng)集成合同4篇
- 安徽省蚌埠市2025屆高三上學期第一次教學質量檢查考試(1月)數(shù)學試題(蚌埠一模)(含答案)
- 【探跡科技】2024知識產權行業(yè)發(fā)展趨勢報告-從工業(yè)轟鳴到數(shù)智浪潮知識產權成為競爭市場的“矛與盾”
- 《中國政法大學》課件
- GB/T 35270-2024嬰幼兒背帶(袋)
- 遼寧省沈陽名校2025屆高三第一次模擬考試英語試卷含解析
- 2024-2025學年高二上學期期末數(shù)學試卷(新題型:19題)(基礎篇)(含答案)
- 2022版藝術新課標解讀心得(課件)小學美術
- Profinet(S523-FANUC)發(fā)那科通訊設置
- 第三章-自然語言的處理(共152張課件)
- 醫(yī)學教程 常見化療藥物歸納
- 行政事業(yè)單位國有資產管理辦法
評論
0/150
提交評論