在WINCC中使用WinSock控件進(jìn)行TCPIP通訊的例程_第1頁
在WINCC中使用WinSock控件進(jìn)行TCPIP通訊的例程_第2頁
在WINCC中使用WinSock控件進(jìn)行TCPIP通訊的例程_第3頁
在WINCC中使用WinSock控件進(jìn)行TCPIP通訊的例程_第4頁
在WINCC中使用WinSock控件進(jìn)行TCPIP通訊的例程_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、在 WINCC 中使用 WinSock 控件進(jìn)行 TCP/IP 通訊的例程目錄一、WinSock 控件介紹(以 VB 語言表述) 11、WinSock 控件的主要屬性 12、WinSock 控件的主要方法 23、WinSock 控件的主要事件 3二、WinSock 控件在 WINCC 中的使用 31、WinSock 控件注冊 32、在 WinCC 中添加 WinSock 控件 4三、服務(wù)器端程序介紹 4四、WinCC 畫面模板與結(jié)構(gòu)變量的配合使用 61、結(jié)構(gòu)變量定義 62、畫面模板組態(tài) 73、調(diào)用畫面模板及修改變量前綴 74、將畫面模板中的對象連接到變量 8五、建立 TCP/IP 連接 8六、

2、接收數(shù)據(jù)包的處理 10附:在 VBS 中進(jìn)行數(shù)據(jù)處理的局限性及變通解決方法 12摘要: 關(guān)鍵詞: VB、VBS、WINCC、WINSOCK 、DLL 、 UNICODE 、 ANSI 、 ASCII 、畫面模板、 結(jié)構(gòu)變量、數(shù)據(jù)轉(zhuǎn)換。該文檔的軟件環(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 用戶程序作為客戶端程序, 與服務(wù)器通訊, 通訊協(xié)議為標(biāo)準(zhǔn) TC

3、P/IP 協(xié)議, 取得服務(wù)器發(fā)送過來的數(shù)據(jù)包, 按數(shù)據(jù)包格式文本規(guī)定, 解析數(shù)據(jù)包數(shù)據(jù), 并將相關(guān)數(shù)據(jù)顯 示在用戶程序畫面中。一、WinSock 控件介紹(以 VB 語言表述)1、WinSock 控件的主要屬性1)Protocol 屬性通過 Protocol 屬性可以設(shè)置 WinSock 控件連接遠(yuǎn)程計(jì)算機(jī)使用的協(xié)議。可選的協(xié)議是 TCP 和 UDP 對應(yīng)的 VB 的常量分別是 sckTCPProtocol 和 sckUDPProtocol , Winsock 控件默 認(rèn)協(xié)議是 TCP 。注意:雖然可以在運(yùn)行時(shí)設(shè)置協(xié)議,但必須在連接未建立或斷開連接后。2)SocketHandle 屬性Sock

4、etHandle 返回當(dāng)前 socket 連接的句柄,這是只讀屬性。3)RemoteHostIP 屬性RemoteHostIP 屬性返回遠(yuǎn)程計(jì)算機(jī)的 IP 地址。在客戶端,當(dāng)使用了控件的 Connect 方法后,遠(yuǎn)程計(jì)算機(jī)的 IP 地址就賦給了 RemoteHostIP 屬性,而在服務(wù)器端, 當(dāng) ConnectRequest 事件后,遠(yuǎn)程計(jì)算機(jī)(客戶端)的 IP 地址就賦給了這個(gè)屬性。如果使用的是 UDP 協(xié)議那么 當(dāng) DataArrival 事件后,發(fā)送 UDP 報(bào)文的計(jì)算機(jī)的 IP 才賦給了這個(gè)屬性。4) ByteReceived 屬性返回當(dāng)前接收緩沖區(qū)中的字節(jié)數(shù)5) State 屬性返回

5、Win Sock控件當(dāng)前的狀態(tài)常數(shù)值描述sckClosed0缺省值,關(guān)閉SckOpe n1打開SckListe ning2偵聽sckC onnectionPending3連接掛起sckResolv in gHost4識別主機(jī)sckHostResolved5已識別主機(jī)sckC onnecting6正在連接sckC onn ected7已連接sckClos ing8冋級人員正在關(guān)閉連接sckError9錯(cuò)誤2、Win Sock控件的主要方法1) Bind 方法用Bind方法可以把一個(gè)端口號固定為本控件使用,使得別的應(yīng)用程序不能再使用這個(gè)端口。2) Liste n方法Liste n方法只在使用TCP

6、協(xié)議時(shí)有用。它將應(yīng)用程序置于監(jiān)聽檢測狀態(tài)。3) Conn ect 方法當(dāng)本地計(jì)算機(jī)希望和遠(yuǎn)程計(jì)算機(jī)建立連接時(shí),就可以調(diào)用Connect方法。Connect方法調(diào)用的規(guī)范為:Conn ect RemoteHost,RemotePort4) Accept 方法當(dāng)服務(wù)器接收到客戶端的連接請求后,服務(wù)器有權(quán)決定是否接受客戶端的請求。5) Sen dData 方法當(dāng)連接建立后,要發(fā)送數(shù)據(jù)就可以調(diào)用SendData方法,該方法只有一個(gè)參數(shù),就是 要發(fā)送的數(shù)據(jù)。6) GetData 方法 當(dāng)本地計(jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)的數(shù)據(jù)時(shí),數(shù)據(jù)存放在緩沖區(qū)中,要從緩沖區(qū)中取出 數(shù)據(jù),可以使用 GetData 方法。 Ge

7、tData 方法調(diào)用規(guī)范如下:GetData data,type,maxLen它從緩沖區(qū)中取得最長為 maxLen的數(shù)據(jù),并以type類型存放在data中,GetData取 得數(shù)據(jù)后,就把相應(yīng)的緩沖區(qū)清空。7) PeekData 方法和 GetData 方法類似,但 PeekData 在取得數(shù)據(jù)后并不把緩沖區(qū)清空。3、WinSock 控件的主要事件1) ConnectRequest 事件當(dāng)本地計(jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)發(fā)送的連接請求時(shí),控件的ConnectRequest 事件將會(huì)被觸發(fā)。2) SendProgress 事件當(dāng)一端的計(jì)算機(jī)正在向另一端的計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),SendProgress 事件

8、將被觸發(fā)。SendProgress 事件記錄了當(dāng)前狀態(tài)下已發(fā)送的字節(jié)數(shù)和剩余字節(jié)數(shù)。3) SendComplete 事件當(dāng)所有數(shù)據(jù)發(fā)送完成時(shí),被觸發(fā)。4) DataArrival 事件 當(dāng)建立連接后,接受到了新數(shù)據(jù)就會(huì)觸發(fā)這個(gè)事件。 注意:如果在接受到新數(shù)據(jù)前,緩沖區(qū)中非空,就不會(huì)觸發(fā)這個(gè)事件。5) Error 事件 當(dāng)在工作中發(fā)生任何錯(cuò)誤都會(huì)觸發(fā)這個(gè)事件。二、WinSock 控件在 WINCC 中的使用1、WinSock 控件注冊在 WinCC 中使用 WinSock 控件前,需要先進(jìn)行注冊。注冊方法如下: 使用記事本新建一個(gè)后綴名為 reg 的文件,編輯文件,加入以下文本:HKEY_CLA

9、SSES_ROOTLicenses2c49f800-c2dd-11cf-9ad6-0080c7e7b78d="mlrljgrlhltlngjlthrligklpkrhllglqlrk" 保存文件退出。先將 mswinsck.ocx 拷貝到 system32 下 再將注冊表文件添加到注冊表然后 "運(yùn)行 " ,輸入 "regsvr32 MSWINSCK.OCX" ,確定。2、在 WinCC 中添加 WinSock 控件在 WinCC 圖形編輯器中打開需要顯示服務(wù)器數(shù)據(jù)的畫面, 選擇“對象選項(xiàng)板” 的“控 件”選項(xiàng)卡, 在選項(xiàng)卡中選擇 “添

10、加 /刪除” ,在“選擇 OCX 控件”對話框中選擇 “Microsoft WinSock Control, version 6.0 ”進(jìn)行注冊。在對象選項(xiàng)板中的 WinSock 控件拖入畫面中。三、服務(wù)器端程序介紹這里所要通訊的服務(wù)器端程序是運(yùn)行于南車資陽機(jī)車有限公司生產(chǎn)的 V280/285 系列 船用柴油機(jī)機(jī)旁控制屏監(jiān)控系統(tǒng)程序。以下是協(xié)議文本:通訊方式: TCP/IP偵聽端口: 9105機(jī)旁柜 IP 地址定義:由用戶根據(jù)具體網(wǎng)絡(luò)配置決定PAC 數(shù)據(jù)采集周期: 1 秒上位機(jī)記取數(shù)據(jù)周期: 1 秒數(shù)據(jù)包格式定義如下:上位機(jī)發(fā)送命令到 PAC 的數(shù)據(jù)包定義:本數(shù)據(jù)包由上位機(jī)發(fā)送到PAC ,PA

11、C 根據(jù)上位機(jī)發(fā)送的的命令執(zhí)行,同時(shí)返回最新的采集數(shù)據(jù)到上位機(jī)。數(shù)據(jù)長度: 10 字節(jié)。數(shù)據(jù)類型: byte。數(shù)據(jù)包詳細(xì)定義:命令代碼1字節(jié)+備用代碼1字節(jié)+設(shè)定轉(zhuǎn)速 4字節(jié)(single) +備 用 1 字節(jié)其中命令代碼意義:1=“讀數(shù)據(jù)”;18=“轉(zhuǎn)速升”;19=“轉(zhuǎn)速降”。PAC發(fā)送到上位機(jī)的數(shù)據(jù)包定義:數(shù)據(jù)長度:650個(gè)字節(jié)。數(shù)據(jù)類型:BYTE。數(shù)據(jù)包內(nèi)容詳細(xì)定義及代碼示意如下:起始傳80個(gè)浮點(diǎn)數(shù),每個(gè)浮點(diǎn)數(shù)占用四個(gè)字節(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輸入點(diǎn),2字節(jié);PAC第二組IO輸入點(diǎn),2字節(jié);PAC第一組10輸 出點(diǎn),1字節(jié);PAC第二組IO輸出點(diǎn),1字節(jié);P|行狀PAC當(dāng)前執(zhí)行的 命令,1字

16、節(jié);備用,1字節(jié);當(dāng)前設(shè)定轉(zhuǎn)速,4字節(jié);報(bào)警數(shù)目,1字節(jié);報(bào)警信息,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畫面模板與結(jié)構(gòu)變量的配合使用本用戶

20、程序需要實(shí)時(shí)采集顯示三臺(tái)同類型柴油機(jī)的運(yùn)行數(shù)據(jù),由于三臺(tái)柴油機(jī)的數(shù)據(jù)采集和顯示是相同的,而WinCC畫面模板與結(jié)構(gòu)變量配合使用可以在一個(gè)畫面中根據(jù)條件顯示具有相同類型參數(shù)的多個(gè)對象,避免反復(fù)組態(tài)相同畫面布局的工作,減少項(xiàng)目后期某些細(xì)節(jié)部位的修改而帶來的工作量,所以本用戶程序采用畫面模板與結(jié)構(gòu)變量配合使用方法進(jìn)行組態(tài)設(shè)計(jì)。WinCC中的畫面模板一文提出四種使用畫面模板的方法,這里采用第三種方法, 即“使用變量前綴的畫面窗口”。組態(tài)步驟如下所示:1、結(jié)構(gòu)變量定義在 WinCC中定義一個(gè)結(jié)構(gòu)變量,結(jié)構(gòu)變量名稱為sDieselData。結(jié)構(gòu)變量包括 64個(gè)FLOAT型變量(數(shù)據(jù)包上傳80個(gè)模擬量,但實(shí)

21、際使用只有小于 64個(gè),出于編程方便起見, 使用8*8 = 64個(gè)單精度浮點(diǎn)變量),16個(gè)BIT型變量(只使用PAC的輸入點(diǎn)、其它開關(guān)量 不使用),1個(gè)SHORT變量(反映通訊狀態(tài))。64個(gè)單精度浮點(diǎn)型變量的命名格式為:fTag11、fTag12,fTag21、fTag22,fTag18fTag28,fTag81、fTag82,fTag8816 個(gè) BIT 型變量命名格式為 biTag1、biTag2, biTag16。1個(gè)SHORT型變量名稱為 TXStatus。結(jié)構(gòu)變量定義完成后,根據(jù)結(jié)構(gòu)變量定義三個(gè)內(nèi)部結(jié)構(gòu)變量,分別命名為“CNB“YYB ”、“ SXB2、畫面模板組態(tài)新建一個(gè)畫面,畫面

22、名稱為pDieselMod.pdl,并在畫面中加入一個(gè)Win Sock控件、些文字和輸入/輸入域,以及其它有些相關(guān)控件。如下圖如示:第01俎屮冃禮t 曾Q2粗祐渝 算 03«, 鴛的遼杵屈: 顛航菲溫; 慎06址卑目品I 郵昨r菲溫;0.0呱0血DO.OOD當(dāng)術(shù)垃目渦0血 第皿虹菲溫|仇QQO 奚 10=1.菲區(qū)1 u.tw 簞11虹搟溫:叮叫 第1由溫; 第13血UF溫 助4江菲血前渦前排氣晶 后禍前排*罷前周后排氣禺 后渦后排氣溫. 主抽道進(jìn)口積油= ;機(jī)怕泵由口機(jī)也 高溫車進(jìn)術(shù)君閔 :奇爲(wèi)朮出朋侶度:中椅器后術(shù)溫,O.04D0.000.000n.OcooaoooO.OflOO.

23、OfiOQ.0000.000T:o.owT:前増壓器進(jìn)氣, 后增壓器進(jìn)氣 前増壓器出氣丄 后增壓器出氣 中冷后空氣溫主油這逬口油壓| 0衛(wèi)吒 皿 機(jī)油泰岀匚抽氏也五 前増圧器涯前佔(zhàn) 前増壓器濾后油I后増壓器嬉前油:1F«啟増壓器嬉后紙衛(wèi)巴 =溫水泵出壓I O i'C'O 中冷朮泵出口莊:I O.QIW KF1 烯油*誕器進(jìn)口:-込烯油粽底器出日:飛碩空氣溫度壓力O.flOOo.wio0.000O.WiO前増丞器岀口讓 啟増W盤出口 /| 0.W0 中拎焉空氣恵 撤壓溺竝宅:運(yùn)行時(shí)間O.OMtIF*O.0M> 皿O.OMO.OM*p*發(fā)動(dòng)機(jī)牠逋=.aM増壓器轉(zhuǎn)淙.

24、o.oa0血¥翁動(dòng)機(jī)n荷率匚各缸規(guī)度20控副箱人信號控制橫式:正常高壓油苣;無泄漏啟幼模式t羊動(dòng)曲鉅科壓力:正常盤車運(yùn)鎖:故障腿運(yùn):無故滋啟動(dòng)摂鈕;斷開燃油泵1;爸用停車按鈕;閉合 燃油泵2:備用遇控調(diào)速:預(yù)供機(jī)油泵:夬團(tuán)砸速狀態(tài):jK殺SE命令:無3、調(diào)用畫面模板及修改變量前綴新建的畫面模板需要在主畫面的一個(gè)子畫面窗口中顯示。主畫面文件名稱為“pMain.pdl ”,子畫面窗口名稱為"pMainArea ”。在用戶程序運(yùn)行時(shí),有一個(gè)界面中顯示 了三臺(tái)柴油機(jī)的圖標(biāo),點(diǎn)擊某一個(gè)柴油機(jī)圖標(biāo),子畫面切換到相應(yīng)的柴油機(jī)狀態(tài)及參數(shù)界面。圖標(biāo)的鼠標(biāo)動(dòng)作 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);上面代碼中關(guān)健代碼就是: SetPropChar(PIC_0,"pMainArea","TagPrefix","CNB.")。該行語句設(shè)置了子窗口pMa in Area的變量前綴為” CNB”。當(dāng)子窗口設(shè)置了變量前綴后,畫面窗口中的對象連接變量時(shí),變量一般會(huì)自動(dòng)加上前綴(連接包括動(dòng)態(tài)對話框、變量、C腳本及VBS腳本)。注意:在設(shè)置了子窗口的變量前綴后,如果要切換顯示不帶變量前綴的畫面,則需設(shè)置子窗口的變量前綴為空。例

27、外Ope nPrevPicture()函數(shù)不受影響。4、將畫面模板中的對象連接到變量將畫面模板中的對象連接到相應(yīng)的變量,組態(tài)方法與常規(guī)組態(tài)相似,不同之處在于變更量名稱需要去掉前綴,在腳本中所使用的變量同樣不要帶變量前綴,因?yàn)樽兞壳熬Y會(huì)自動(dòng)加上。在組態(tài)時(shí)會(huì)提示變量不存在,忽略即可。五、建立TCP/IP連接TCP/IP連接,如果連接沒有建立,要求是在柴油機(jī)狀態(tài)及參數(shù)畫面顯示時(shí)自動(dòng)建立則將相應(yīng)的結(jié)構(gòu)變量清零,并且每隔兩秒重建連接。連接建立后,發(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,獲得當(dāng)前窗口中的Win Sock對象Set Obj_SockClie nt = Scree nltems("objSock"),獲得顯示當(dāng)前畫面的子窗口對象Set obj_Screen = HMIRu ntime.Scree ns("pMai n").Scree nltems("pMai nArea"),這是一個(gè)轉(zhuǎn)換DLL,后面還要講

29、到Set c nvt = CreateObject("ADS.ArrayCo nvert"),以下是建立連接前的參數(shù)初始化工作,遠(yuǎn)程地址和端口號根據(jù)實(shí)際情況修改,此處設(shè)置是為了方便測試工作,可使用TCP&UDP測試工具進(jìn)行測試。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,連接沒有建立、連接錯(cuò)誤、同級人員正在關(guān)閉連接,這三種情況

31、下,先關(guān)閉連接,再 嘗試建立連接。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,如果連接沒有建立,則使相應(yīng)的FLOAT型結(jié)構(gòu)變量清零。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,如果連接沒有建立,則使相應(yīng)的BIT型結(jié)構(gòu)變量復(fù)位。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,寫入當(dāng)前連接狀態(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ù)包的處理當(dāng)建立連接后,接受到了新數(shù)據(jù)就會(huì)觸發(fā)這個(gè)DataArrival事件。這里只對前 64個(gè)模擬量數(shù)據(jù)、16個(gè)開關(guān)量輸入數(shù)據(jù)、10條漢字報(bào)警信息進(jìn)行解析,并將解析后的數(shù)據(jù)賦值 給相應(yīng)的變量,漢字報(bào)警信息直接在窗口中的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ù)應(yīng)為650字節(jié),否則不處理If bytesTotal = 650 The n,從接收緩沖區(qū)取得數(shù)據(jù),并清空緩沖區(qū)Item.GetData strReceivestrFromRec =""'提取前333個(gè)字節(jié)所包含的信息,用于模擬量和開關(guān)量解析For i = 0 To 333 'UBou nd(strReceive),將接收到的BYTE()型數(shù)據(jù)轉(zhuǎn)換為String型數(shù)據(jù)strFromRec =

36、 strFromRec & Right("0" & Hex(Ascb(Midb(strReceive , i + 1 ,1) , 2 )Next '解析出80個(gè)模擬量并賦值給相應(yīng)的變量Fori = 1 To 8Forj = 1 To 8Set Tag=HMIRuntime.Tags("fTag" & i & j),此處使用了 DLL中的數(shù)據(jù)轉(zhuǎn)換函數(shù),CvHexStr2vReal2的功能是將十六進(jìn)制字符串表示的單精度浮點(diǎn)數(shù)轉(zhuǎn)換成實(shí)際的浮點(diǎn)數(shù)值。該函數(shù)后面還要講到。Tag_f.Value = cnvt.CvHexStr

37、2vReal2(Mid(strFromRec,(i-1)*8+j-1)*8+1,8) Tag_f.Write,1NextNext'解析開關(guān)量輸入字節(jié)(2字節(jié)),并賦值給相應(yīng)的變量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'解析漢字報(bào)警信息10條(每條信息包含15個(gè)漢字)For i = 0 To 9For j =0 To 14,提取漢字信息,并轉(zhuǎn)換成Uni code字符串。strFromRed = strFromRed & MidB(strReceive,i*30+j*2+335,2)NextstrFromRed = strFromRed & vbCrLfNextobj

39、_OutText.Text = strFromRedEnd Sub附:在VBS中進(jìn)行數(shù)據(jù)處理的局限性及變通解決方法在VBS中對數(shù)據(jù)進(jìn)行轉(zhuǎn)換解析處理,是一個(gè)比較普遍的應(yīng)用問題,并不僅限于在WINCC中的應(yīng)用,而 VBS在進(jìn)行數(shù)據(jù)處理時(shí)的局限,也使得單靠VBS自身無法圓滿的處理,需要借助其它手段,而VBS結(jié)合外部動(dòng)態(tài)鏈接庫是一個(gè)合理的解決方案。VBS( Microsoft Visual Basic Scripting Edition )是一種腳本語言??梢钥醋魇荲B 語言的簡化版,可使用操作系統(tǒng)和其它程序所提供的程序庫,由操作系統(tǒng)解釋運(yùn)行。WINCCV6.0首次集成了VBS,可以用來使運(yùn)行環(huán)境動(dòng)態(tài)

40、化,也可以創(chuàng)建動(dòng)作(action)和過程(procedure)來動(dòng)態(tài)化圖形對象。注:腳本語言是使用一種特定的描述性語言,依據(jù)一定的格式編寫的可執(zhí)行文件,又稱作宏或批處理文件,是為了縮短傳統(tǒng)的編寫-編譯-鏈接-運(yùn)行(edit-compile-link-run )過程 而創(chuàng)建的計(jì)算機(jī)編程語言。一個(gè)腳本通常是解釋運(yùn)行而非編譯,腳本程序在執(zhí)行時(shí),是由系統(tǒng)的一個(gè)解釋器,將其一條條的翻譯成機(jī)器可識別的指令,并按程序順序執(zhí)行。VBS只有一種數(shù)據(jù)類型,即Variant (可變的)。VBS在處理數(shù)據(jù)時(shí),按上下文對其處理的方式,把數(shù)據(jù)當(dāng)作數(shù)字或字符串進(jìn)行處理,也就是VBS覺得它像什么,就把它當(dāng)作什么來進(jìn)行處理。

41、Variant包含的數(shù)值信息類型稱為子類型,大多數(shù)情況下,可將所需的數(shù) 據(jù)放進(jìn)Variant中,而Variant也會(huì)按照最適用于其包含的數(shù)據(jù)的方式進(jìn)行操作。VBS這種處理數(shù)據(jù)的方法,有其優(yōu)點(diǎn)和局限性。優(yōu)點(diǎn)在于簡單方便,局限性在于降低 了可控性,特別是在處理低層數(shù)據(jù)代碼時(shí),難度較高,而有些要求沒有辦法達(dá)到。比如在WINCC中使用MSCOMM控件進(jìn)行數(shù)據(jù)收發(fā)時(shí),MSCOMM控件處理的是BYTE ()類型數(shù)據(jù),在 VBS中會(huì)將它作為 VARIANT ()類型數(shù)據(jù)進(jìn)行處理,而這種數(shù)據(jù) 類型無法通過串口發(fā)送出去,而在VBS中沒有相應(yīng)的函數(shù)將其轉(zhuǎn)換成BYTE ()類型數(shù)據(jù)。又比如在VBS中要將一個(gè)如“ 4

42、199999A”的字符串轉(zhuǎn)換成單精度浮點(diǎn)數(shù)據(jù),會(huì)非常困難, 則類似的轉(zhuǎn)換在 C或VB這類高級語言中卻很容易。在進(jìn)行上述數(shù)據(jù)處理任務(wù)時(shí),結(jié)合動(dòng)態(tài)鏈接庫是比較合理的方法。下面詳細(xì)講述一般 需要用到的數(shù)據(jù)轉(zhuǎn)換如何通過VB編寫DLL來實(shí)現(xiàn)。在切換到VB中進(jìn)行編程之前,先了解熟悉VBS中的有關(guān)數(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測試結(jié)果顯示,對于單個(gè)變量,雖然不能象在 VB中顯示定義其數(shù)據(jù)類型,但VBS可以大致判斷其數(shù)據(jù)類型,也可以將數(shù)據(jù)通過強(qiáng)制轉(zhuǎn)換成所需要的數(shù)據(jù)類型。但不管如何定義或轉(zhuǎn)換,僅通過 VBS中的定義方式和轉(zhuǎn)換函數(shù),無法改變數(shù)組的類型,最終結(jié)果只有一種 數(shù)組類型,即 Varaint()。2、VBS中的字符編碼在VBS中,字符串以 Unicode編碼表示,編碼的實(shí)現(xiàn)方案是UTF-16 LE。當(dāng)VBS調(diào)用低層API函數(shù)(VBS不能直接調(diào)用,而是通過控件或DLL間接調(diào)用)時(shí),大都會(huì)由系統(tǒng)自動(dòng)將Uni code字符串轉(zhuǎn)換成 ANSI編碼字符串。如通過 Win sock控件發(fā)送字

45、符串, 在接收 端接收到的字符串實(shí)際上是ANSI字符串。在簡體中文 WinXP操作系統(tǒng)下,默認(rèn)的 ANSI編碼是GBK字符集。3、VBS的字符轉(zhuǎn)換函數(shù)Chr函數(shù)返回與指定的 ANSI字符代碼相對應(yīng)的字符。調(diào)用格式:Chr(charcode) charcode參數(shù)是可以標(biāo)識字符的數(shù)字。說明:從0到31的數(shù)字表示標(biāo)準(zhǔn)的不可打印的 ASCII代碼。例如,Chr(10)返回?fù)Q 行符。注意:ChrB函數(shù)與包含在字符串中的字節(jié)數(shù)據(jù)一起使用。ChrB不是返回一個(gè)或兩個(gè)字節(jié)的字符,而總是返回單個(gè)字節(jié)的字符。ChrW 是為使用 Unicode字符的32位平臺(tái)提供的。它的參數(shù)是一個(gè)Uni code (寬字符)的字

46、符代碼,因此可以避免將ANSI轉(zhuǎn)化為Uni code 字符。Asc函數(shù)返回與字符串的第一個(gè)字母對應(yīng)的ANSI字符代碼。Asc(string) string參數(shù)是任意有效的字符串表達(dá)式。如果string參數(shù)未包含字符,則將發(fā)生運(yùn)行時(shí)錯(cuò)誤。注意:AscB函數(shù)和包含字節(jié)數(shù)據(jù)的字符串一起使用。AscB不是返回第一個(gè)字符的字符代碼,而是返回首字節(jié)。AscW是為使用 Uni code字符的32位平臺(tái)提供的。它返回Unicode (寬型)字符代碼,因此可以避免從ANSI至U Unicode的代碼轉(zhuǎn)換??偨Y(jié)如下:chrb/ascb用來做ASCII轉(zhuǎn)換,但并不僅包括前128個(gè)字符,而是全單字節(jié)字符,所以應(yīng)該是用

47、來做單字節(jié)字符的轉(zhuǎn)換。chr/asc用來做ANSI轉(zhuǎn)換,在當(dāng)前中文簡體 WINDOWS系統(tǒng)中,即對應(yīng)于GBK字符集 的轉(zhuǎn)換。在 WinXP中文版下的 VB6.0中,Chr能夠正確轉(zhuǎn)換遇 0128和255的單字節(jié)字符 碼和GBK字符集中的雙字節(jié)字符碼,超出此范圍的字符碼或解釋成NUL字符,或是其它未料結(jié)果。chrw/ascw 用來做 Unicode 轉(zhuǎn)換。4、在 VBS中調(diào)用 MSCOMM 和 WINSOCK的注意事項(xiàng)在VBS中可以調(diào)用 MSCOMM和 WINSOCK通訊控件,以完成串口通訊和以太網(wǎng)通 訊。通訊控件可以以字符串或字節(jié)數(shù)組方式進(jìn)行數(shù)據(jù)發(fā)送或接收,但由于字節(jié)數(shù)組在VBS中不能顯示定義

48、,一個(gè)自然而然的想法是通過字符串方式進(jìn)行數(shù)據(jù)發(fā)送或接收。如果發(fā)送的數(shù)據(jù)范圍在 0x000x7F之間,可以通過Chr函數(shù)將十六進(jìn)制數(shù)據(jù)轉(zhuǎn)換成相 應(yīng)的ASCII碼字符,并且組合成字符串?dāng)?shù)據(jù)流,由于在此數(shù)據(jù)范圍內(nèi)的字符碼可各系統(tǒng)平 臺(tái)和軟件環(huán)境中均可以得到唯一正確的解析,所以這個(gè)方法是可行的。但如果發(fā)生沖突的數(shù)據(jù)超出此范圍,再想通過Chr函數(shù)(或者ChrB/ChrW函數(shù))將十六進(jìn)制數(shù)據(jù)轉(zhuǎn)換成字符,轉(zhuǎn)換結(jié)果將不是我們所預(yù)期的結(jié)果,這與軟件平臺(tái)和操作系統(tǒng)平臺(tái)有關(guān),其中一些字符碼被解釋成空字符,或者是”? ”,還有一些被解釋成不同字符集下對應(yīng)的不同的字符。所以在 VBS中調(diào)用通訊控件進(jìn)行數(shù)據(jù)發(fā)送或接收,使

49、用字符串方式不是合 理的方案。在了解了 VBS中進(jìn)行數(shù)據(jù)處理的局限后,自然而然我們想到需要用其它的方法來解決 這些問題,可行的方法是通過DLL外部調(diào)用。因?yàn)?VB簡單實(shí)用,在實(shí)際應(yīng)用中,一些在VBS中不能處理或難以處理的任務(wù),可以在VB中進(jìn)行簡單的處理,用VB來創(chuàng)建編譯 DLL容易掌握,將這些功能編譯進(jìn)DLL中,可以由VBS調(diào)用處理。1、Variant數(shù)組轉(zhuǎn)換成 Byte數(shù)組如前面提到在VBS中進(jìn)行定義或轉(zhuǎn)換,只能得到Variant類型數(shù)組,而在 VB中將Variant類型數(shù)組轉(zhuǎn)換成 Byte型數(shù)組非常簡單,如下面這個(gè)函數(shù)就可以實(shí)現(xiàn)這個(gè)功能: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在上面這個(gè)函數(shù)中,僅僅做了兩件事,一是定義一個(gè)Byte數(shù)組,二是將 Variant數(shù)組元素拷貝到

51、Byte數(shù)組中。2、十六進(jìn)制數(shù)據(jù)格式字符串轉(zhuǎn)換成相應(yīng)的Byte數(shù)組十六進(jìn)制數(shù)據(jù)格式字符串是指字符串中的字符(兩個(gè)一組)以十六進(jìn)制數(shù)據(jù)格式表示,范圍在“ 00”至“ FF”之間,如下面這個(gè)字符串:“EB9000FF”將這樣一個(gè)字符串轉(zhuǎn)換成相應(yīng)的Byte數(shù)組,其轉(zhuǎn)換結(jié)果是:BYTE(3) = (0xEB,0x90,0x00,0xFF)相應(yīng)的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是一個(gè)Unicode字符串,在內(nèi)存中的存放的十六進(jìn)制字節(jié)序?yàn)椤?45-00-42-00-39-00-30-00-30-00-30-00-46-00-46-00 ”,字符串長是 8( Len 函數(shù))。

54、新建一個(gè)Byte數(shù)組,數(shù)組元素個(gè)數(shù)為4。Mid函數(shù)是從指定字符串中返回指定數(shù)目的字符(注意不是字節(jié)),該函數(shù)以字符為基本操作元素,不是字節(jié),由于在 VB中,字符以 Unicode格式(UCS-2/UTF-16 LE,雙字 節(jié))表示,F(xiàn)or循環(huán)開始時(shí)(i = 0),Mid(vInstr, 2 * i - 1, 1)首先取出第一個(gè)字符,即“ E”(雙字節(jié)十六進(jìn)制“ 0045”,小端序),這個(gè)字符是十六制格式的,所以在前面加上“&H ”前綴表示十六進(jìn)制書寫格式,將這個(gè)十六進(jìn)制格式字符經(jīng)Val函數(shù)轉(zhuǎn)換成對應(yīng)的數(shù)字,即14,由于這個(gè)字符是字節(jié)中的高4位,所以需要*16,等于224。類似,取出同一

55、字節(jié)中的低4位“ B”并轉(zhuǎn)換成相應(yīng)的數(shù)字11,并與高4位數(shù)字相加,最終結(jié)果是235,在內(nèi)存中存放的十六進(jìn)制字節(jié)為“EB ”。循環(huán)結(jié)束后,得到字節(jié)數(shù)組(0xEB,0x90,0x00,0xFF )。3、四字節(jié)十六進(jìn)制數(shù)據(jù)格式字符串轉(zhuǎn)換成單精度浮點(diǎn)數(shù)據(jù)在IEEE 754標(biāo)準(zhǔn)中定義了單精度浮點(diǎn)數(shù)采用32位二進(jìn)制數(shù)據(jù)(4字節(jié))表示,二進(jìn)制數(shù)據(jù)按位分割成符號位、指數(shù)域和尾數(shù)域,將浮點(diǎn)數(shù)轉(zhuǎn)換成實(shí)數(shù),需要按公式進(jìn)行計(jì)算。 如果在VBS中處理這樣的轉(zhuǎn)換,需要進(jìn)行移位、判斷、計(jì)算等多步處理,比較繁瑣,運(yùn)行 效率也不見得有多高,而在VB中進(jìn)行這樣的轉(zhuǎn)換處理是很方便的。比如在VBS中使用通訊控件接收數(shù)據(jù),在接收到的數(shù)據(jù)包中有四個(gè)字節(jié)的數(shù)據(jù)(9A,99,E5,41),這四個(gè)字節(jié)的數(shù)據(jù)表示一個(gè)IEEE單精度浮點(diǎn)數(shù),在字節(jié)流中以小端序(LE)傳輸(41是高有效字節(jié) MSByte),以DWORD表示即為0x41E5999A,轉(zhuǎn)換成單精度浮點(diǎn)數(shù) 即為28.7。這樣的字節(jié)流在通訊控件接收到以后,存放在Byte數(shù)組中,在內(nèi)存中存儲(chǔ)的字節(jié)為9A-99-E5-41,其實(shí)這正是IEEE單精度浮點(diǎn)數(shù)在內(nèi)存中的存放格式,如果能將該內(nèi)存區(qū)(4字節(jié))拷貝給一個(gè)float型變量,就可以很方便的完成轉(zhuǎn)換工作。但在VBS中沒有直接對內(nèi)存區(qū)進(jìn)行操作的命令或函數(shù),所以這個(gè)轉(zhuǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論