版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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、画面模板组态 73、调用画面模板及修改变量前缀 74、将画面模板中的对象连接到变量 8五、建立 TCP/IP 连接 8六、
2、接收数据包的处理 10附:在 VBS 中进行数据处理的局限性及变通解决方法 12摘要: 关键词: VB、VBS、WINCC、WINSOCK 、DLL 、 UNICODE 、 ANSI 、 ASCII 、画面模板、 结构变量、数据转换。该文档的软件环境:Microsoft Windows XP Professional 版本 2002 SP3SIMA TIC WinCC V6.2 SP2 ASIA,SIMA TIC STEP7 V5.4+SP5+HF3 ChineseTCP&UDP 测试工具 V1.02目的:使用 WINCC 用户程序作为客户端程序, 与服务器通讯, 通讯协议为标准 TC
3、P/IP 协议, 取得服务器发送过来的数据包, 按数据包格式文本规定, 解析数据包数据, 并将相关数据显 示在用户程序画面中。一、WinSock 控件介绍(以 VB 语言表述)1、WinSock 控件的主要属性1)Protocol 属性通过 Protocol 属性可以设置 WinSock 控件连接远程计算机使用的协议。可选的协议是 TCP 和 UDP 对应的 VB 的常量分别是 sckTCPProtocol 和 sckUDPProtocol , Winsock 控件默 认协议是 TCP 。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。2)SocketHandle 属性Sock
4、etHandle 返回当前 socket 连接的句柄,这是只读属性。3)RemoteHostIP 属性RemoteHostIP 属性返回远程计算机的 IP 地址。在客户端,当使用了控件的 Connect 方法后,远程计算机的 IP 地址就赋给了 RemoteHostIP 属性,而在服务器端, 当 ConnectRequest 事件后,远程计算机(客户端)的 IP 地址就赋给了这个属性。如果使用的是 UDP 协议那么 当 DataArrival 事件后,发送 UDP 报文的计算机的 IP 才赋给了这个属性。4) ByteReceived 属性返回当前接收缓冲区中的字节数5) State 属性返回
5、Win Sock控件当前的状态常数值描述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、协议时有用。它将应用程序置于监听检测状态。3) Conn ect 方法当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Conn ect RemoteHost,RemotePort4) Accept 方法当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。5) Sen dData 方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是 要发送的数据。6) GetData 方法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出 数据,可以使用 GetData 方法。 Ge
7、tData 方法调用规范如下:GetData data,type,maxLen它从缓冲区中取得最长为 maxLen的数据,并以type类型存放在data中,GetData取 得数据后,就把相应的缓冲区清空。7) PeekData 方法和 GetData 方法类似,但 PeekData 在取得数据后并不把缓冲区清空。3、WinSock 控件的主要事件1) ConnectRequest 事件当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest 事件将会被触发。2) SendProgress 事件当一端的计算机正在向另一端的计算机发送数据时,SendProgress 事件
8、将被触发。SendProgress 事件记录了当前状态下已发送的字节数和剩余字节数。3) SendComplete 事件当所有数据发送完成时,被触发。4) DataArrival 事件 当建立连接后,接受到了新数据就会触发这个事件。 注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。5) Error 事件 当在工作中发生任何错误都会触发这个事件。二、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 图形编辑器中打开需要显示服务器数据的画面, 选择“对象选项板” 的“控 件”选项卡, 在选项卡中选择 “添
10、加 /删除” ,在“选择 OCX 控件”对话框中选择 “Microsoft WinSock Control, version 6.0 ”进行注册。在对象选项板中的 WinSock 控件拖入画面中。三、服务器端程序介绍这里所要通讯的服务器端程序是运行于南车资阳机车有限公司生产的 V280/285 系列 船用柴油机机旁控制屏监控系统程序。以下是协议文本:通讯方式: TCP/IP侦听端口: 9105机旁柜 IP 地址定义:由用户根据具体网络配置决定PAC 数据采集周期: 1 秒上位机记取数据周期: 1 秒数据包格式定义如下:上位机发送命令到 PAC 的数据包定义:本数据包由上位机发送到PAC ,PA
11、C 根据上位机发送的的命令执行,同时返回最新的采集数据到上位机。数据长度: 10 字节。数据类型: byte。数据包详细定义:命令代码1字节+备用代码1字节+设定转速 4字节(single) +备 用 1 字节其中命令代码意义:1=“读数据”;18=“转速升”;19=“转速降”。PAC发送到上位机的数据包定义:数据长度:650个字节。数据类型:BYTE。数据包内容详细定义及代码示意如下:起始传80个浮点数,每个浮点数占用四个字节,高位在后,低位在前。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;.续:PAC第一组IO输入点,2字节;PAC第二组IO输入点,2字节;PAC第一组10输 出点,1字节;PAC第二组IO输出点,1字节;P|行状PAC当前执行的 命令,1字
16、节;备用,1字节;当前设定转速,4字节;报警数目,1字节;报警信息,300 字节;备用,16字节。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、程序需要实时采集显示三台同类型柴油机的运行数据,由于三台柴油机的数据采集和显示是相同的,而WinCC画面模板与结构变量配合使用可以在一个画面中根据条件显示具有相同类型参数的多个对象,避免反复组态相同画面布局的工作,减少项目后期某些细节部位的修改而带来的工作量,所以本用户程序采用画面模板与结构变量配合使用方法进行组态设计。WinCC中的画面模板一文提出四种使用画面模板的方法,这里采用第三种方法, 即“使用变量前缀的画面窗口”。组态步骤如下所示:1、结构变量定义在 WinCC中定义一个结构变量,结构变量名称为sDieselData。结构变量包括 64个FLOAT型变量(数据包上传80个模拟量,但实
21、际使用只有小于 64个,出于编程方便起见, 使用8*8 = 64个单精度浮点变量),16个BIT型变量(只使用PAC的输入点、其它开关量 不使用),1个SHORT变量(反映通讯状态)。64个单精度浮点型变量的命名格式为:fTag11、fTag12,fTag21、fTag22,fTag18fTag28,fTag81、fTag82,fTag8816 个 BIT 型变量命名格式为 biTag1、biTag2, biTag16。1个SHORT型变量名称为 TXStatus。结构变量定义完成后,根据结构变量定义三个内部结构变量,分别命名为“CNB“YYB ”、“ SXB2、画面模板组态新建一个画面,画面
22、名称为pDieselMod.pdl,并在画面中加入一个Win Sock控件、些文字和输入/输入域,以及其它有些相关控件。如下图如示:第01俎屮冃礼t 曾Q2粗祐渝 算 03«, 鴛的辽杵屈: 颠航菲温; 慎06址卑目品I 郵昨r菲温;0.0呱0血DO.OOD當術垃目渦0血 第皿虹菲温|仇QQO 奚 10=1.菲區1 u.tw 箪11虹擀溫:叮叫 第1由温; 第13血UF温 助4江菲血前涡前排气晶 后祸前排*罷前周后排气禺 后涡后排气溫. 主抽道进口积油= ;机怕泵由口机也 高温車进术君閔 :奇爲朮出朋侶度:中椅器后术温,O.04D0.000.000n.OcooaoooO.OflOO.
23、OfiOQ.0000.000T:o.owT:前増压器进气, 后增压器进气 前増压器出气丄 后增压器出气 中冷后空气温主油這逬口油压| 0卫吒 皿 机油泰岀匚抽氏也五 前増圧器涯前佔 前増压器滤后油I后増压器嬉前油:1F«启増压器嬉后紙卫巴 =温水泵出压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*发动机牠逋=.aM増压器转淙.
24、o.oa0血¥翁动机n荷率匚各缸規度20控副箱人信号控制橫式:正常高压油苣;无泄漏启幼模式t羊动曲鉅科压力:正常盘车运锁:故障腿運:无故滋启动摂钮;斷开燃油泵1;爸用停车按钮;闭合 燃油泵2:备用遇控调速:预供机油泵:夬团砸速状态:jK杀SE命令:无3、调用画面模板及修改变量前缀新建的画面模板需要在主画面的一个子画面窗口中显示。主画面文件名称为“pMain.pdl ”,子画面窗口名称为"pMainArea ”。在用户程序运行时,有一个界面中显示 了三台柴油机的图标,点击某一个柴油机图标,子画面切换到相应的柴油机状态及参数界面。图标的鼠标动作 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”。当子窗口设置了变量前缀后,画面窗口中的对象连接变量时,变量一般会自动加上前缀(连接包括动态对话框、变量、C脚本及VBS脚本)。注意:在设置了子窗口的变量前缀后,如果要切换显示不带变量前缀的画面,则需设置子窗口的变量前缀为空。例
27、外Ope nPrevPicture()函数不受影响。4、将画面模板中的对象连接到变量将画面模板中的对象连接到相应的变量,组态方法与常规组态相似,不同之处在于变更量名称需要去掉前缀,在脚本中所使用的变量同样不要带变量前缀,因为变量前缀会自动加上。在组态时会提示变量不存在,忽略即可。五、建立TCP/IP连接TCP/IP连接,如果连接没有建立,要求是在柴油机状态及参数画面显示时自动建立则将相应的结构变量清零,并且每隔两秒重建连接。连接建立后,发送读数据命令数据包。在画面对象属性的“显示”属性中加入如下VBS代码(触发器选择 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"),以下是建立连接前的参数初始化工作,远程地址和端口号根据实际情况修改,此处设置是为了方便测试工作,可使用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,如果连接建立,则发送讯数据命令数据包Obj_SockClie nt.Se ndData cnvt.CvHexStr2vOctetStr("01000000000000000000")
33、End If,写入当前连接状态字Set Tagn tTXStatus = HMIR un time.Tags("TXStatus")Tagn tTXStatus.Value = Obj_SockClie nt.StateTagn tTXStatus.Write , 1End Fun cti on六、接收数据包的处理当建立连接后,接受到了新数据就会触发这个DataArrival事件。这里只对前 64个模拟量数据、16个开关量输入数据、10条汉字报警信息进行解析,并将解析后的数据赋值 给相应的变量,汉字报警信息直接在窗口中的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"),接收数据包字节数应为650字节,否则不处理If bytesTotal = 650 The n,从接收缓冲区取得数据,并清空缓冲区Item.GetData strReceivestrFromRec =""'提取前333个字节所包含的信息,用于模拟量和开关量解析For i = 0 To 333 'UBou nd(strReceive),将接收到的BYTE()型数据转换为String型数据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中的数据转换函数,CvHexStr2vReal2的功能是将十六进制字符串表示的单精度浮点数转换成实际的浮点数值。该函数后面还要讲到。Tag_f.Value = cnvt.CvHexStr
37、2vReal2(Mid(strFromRec,(i-1)*8+j-1)*8+1,8) Tag_f.Write,1NextNext'解析开关量输入字节(2字节),并赋值给相应的变量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中进行数据处理的局限性及变通解决方法在VBS中对数据进行转换解析处理,是一个比较普遍的应用问题,并不仅限于在WINCC中的应用,而 VBS在进行数据处理时的局限,也使得单靠VBS自身无法圆满的处理,需要借助其它手段,而VBS结合外部动态链接库是一个合理的解决方案。VBS( Microsoft Visual Basic Scripting Edition )是一种脚本语言。可以看作是VB 语言的简化版,可使用操作系统和其它程序所提供的程序库,由操作系统解释运行。WINCCV6.0首次集成了VBS,可以用来使运行环境动态
40、化,也可以创建动作(action)和过程(procedure)来动态化图形对象。注:脚本语言是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件,是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run )过程 而创建的计算机编程语言。一个脚本通常是解释运行而非编译,脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。VBS只有一种数据类型,即Variant (可变的)。VBS在处理数据时,按上下文对其处理的方式,把数据当作数字或字符串进行处理,也就是VBS觉得它像什么,就把它当作什么来进行处理。
41、Variant包含的数值信息类型称为子类型,大多数情况下,可将所需的数 据放进Variant中,而Variant也会按照最适用于其包含的数据的方式进行操作。VBS这种处理数据的方法,有其优点和局限性。优点在于简单方便,局限性在于降低 了可控性,特别是在处理低层数据代码时,难度较高,而有些要求没有办法达到。比如在WINCC中使用MSCOMM控件进行数据收发时,MSCOMM控件处理的是BYTE ()类型数据,在 VBS中会将它作为 VARIANT ()类型数据进行处理,而这种数据 类型无法通过串口发送出去,而在VBS中没有相应的函数将其转换成BYTE ()类型数据。又比如在VBS中要将一个如“ 4
42、199999A”的字符串转换成单精度浮点数据,会非常困难, 则类似的转换在 C或VB这类高级语言中却很容易。在进行上述数据处理任务时,结合动态链接库是比较合理的方法。下面详细讲述一般 需要用到的数据转换如何通过VB编写DLL来实现。在切换到VB中进行编程之前,先了解熟悉VBS中的有关数据类型的处理。1、在VBS中如何定义变量在VBS中定义变量,只能使用一种定义方式,即Dim语句,变量类型只有一种,即VARIANT,而不是象在 VB中可以显示定义变量为不同的数据类型,如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),显示数据类型为Variant。Msgbox type name(A(0),显示数据类型为In tergerMsgbox type name(B),显示数据类型为Varian t ()Msgbox type name(B(0),显示数据类型为Stri ngMsgbox type name(C),显示数据类型为Varian t ()Msgbox type nam
44、e(C(0),显示数据类型为Byte测试结果显示,对于单个变量,虽然不能象在 VB中显示定义其数据类型,但VBS可以大致判断其数据类型,也可以将数据通过强制转换成所需要的数据类型。但不管如何定义或转换,仅通过 VBS中的定义方式和转换函数,无法改变数组的类型,最终结果只有一种 数组类型,即 Varaint()。2、VBS中的字符编码在VBS中,字符串以 Unicode编码表示,编码的实现方案是UTF-16 LE。当VBS调用低层API函数(VBS不能直接调用,而是通过控件或DLL间接调用)时,大都会由系统自动将Uni code字符串转换成 ANSI编码字符串。如通过 Win sock控件发送字
45、符串, 在接收 端接收到的字符串实际上是ANSI字符串。在简体中文 WinXP操作系统下,默认的 ANSI编码是GBK字符集。3、VBS的字符转换函数Chr函数返回与指定的 ANSI字符代码相对应的字符。调用格式:Chr(charcode) charcode参数是可以标识字符的数字。说明:从0到31的数字表示标准的不可打印的 ASCII代码。例如,Chr(10)返回换 行符。注意:ChrB函数与包含在字符串中的字节数据一起使用。ChrB不是返回一个或两个字节的字符,而总是返回单个字节的字符。ChrW 是为使用 Unicode字符的32位平台提供的。它的参数是一个Uni code (宽字符)的字
46、符代码,因此可以避免将ANSI转化为Uni code 字符。Asc函数返回与字符串的第一个字母对应的ANSI字符代码。Asc(string) string参数是任意有效的字符串表达式。如果string参数未包含字符,则将发生运行时错误。注意:AscB函数和包含字节数据的字符串一起使用。AscB不是返回第一个字符的字符代码,而是返回首字节。AscW是为使用 Uni code字符的32位平台提供的。它返回Unicode (宽型)字符代码,因此可以避免从ANSI至U Unicode的代码转换。总结如下:chrb/ascb用来做ASCII转换,但并不仅包括前128个字符,而是全单字节字符,所以应该是用
47、来做单字节字符的转换。chr/asc用来做ANSI转换,在当前中文简体 WINDOWS系统中,即对应于GBK字符集 的转换。在 WinXP中文版下的 VB6.0中,Chr能够正确转换遇 0128和255的单字节字符 码和GBK字符集中的双字节字符码,超出此范围的字符码或解释成NUL字符,或是其它未料结果。chrw/ascw 用来做 Unicode 转换。4、在 VBS中调用 MSCOMM 和 WINSOCK的注意事项在VBS中可以调用 MSCOMM和 WINSOCK通讯控件,以完成串口通讯和以太网通 讯。通讯控件可以以字符串或字节数组方式进行数据发送或接收,但由于字节数组在VBS中不能显示定义
48、,一个自然而然的想法是通过字符串方式进行数据发送或接收。如果发送的数据范围在 0x000x7F之间,可以通过Chr函数将十六进制数据转换成相 应的ASCII码字符,并且组合成字符串数据流,由于在此数据范围内的字符码可各系统平 台和软件环境中均可以得到唯一正确的解析,所以这个方法是可行的。但如果发生冲突的数据超出此范围,再想通过Chr函数(或者ChrB/ChrW函数)将十六进制数据转换成字符,转换结果将不是我们所预期的结果,这与软件平台和操作系统平台有关,其中一些字符码被解释成空字符,或者是”? ”,还有一些被解释成不同字符集下对应的不同的字符。所以在 VBS中调用通讯控件进行数据发送或接收,使
49、用字符串方式不是合 理的方案。在了解了 VBS中进行数据处理的局限后,自然而然我们想到需要用其它的方法来解决 这些问题,可行的方法是通过DLL外部调用。因为 VB简单实用,在实际应用中,一些在VBS中不能处理或难以处理的任务,可以在VB中进行简单的处理,用VB来创建编译 DLL容易掌握,将这些功能编译进DLL中,可以由VBS调用处理。1、Variant数组转换成 Byte数组如前面提到在VBS中进行定义或转换,只能得到Variant类型数组,而在 VB中将Variant类型数组转换成 Byte型数组非常简单,如下面这个函数就可以实现这个功能: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在上面这个函数中,仅仅做了两件事,一是定义一个Byte数组,二是将 Variant数组元素拷贝到
51、Byte数组中。2、十六进制数据格式字符串转换成相应的Byte数组十六进制数据格式字符串是指字符串中的字符(两个一组)以十六进制数据格式表示,范围在“ 00”至“ FF”之间,如下面这个字符串:“EB9000FF”将这样一个字符串转换成相应的Byte数组,其转换结果是:BYTE(3) = (0xEB,0x90,0x00,0xFF)相应的VB函数代码如下所示: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该函数的工作原理如下(以“EB9000FF ”为例):字符串vlnstr =“EB9000FI是一个Unicode字符串,在内存中的存放的十六进制字节序为“ 45-00-42-00-39-00-30-00-30-00-30-00-46-00-46-00 ”,字符串长是 8( Len 函数)。
54、新建一个Byte数组,数组元素个数为4。Mid函数是从指定字符串中返回指定数目的字符(注意不是字节),该函数以字符为基本操作元素,不是字节,由于在 VB中,字符以 Unicode格式(UCS-2/UTF-16 LE,双字 节)表示,For循环开始时(i = 0),Mid(vInstr, 2 * i - 1, 1)首先取出第一个字符,即“ E”(双字节十六进制“ 0045”,小端序),这个字符是十六制格式的,所以在前面加上“&H ”前缀表示十六进制书写格式,将这个十六进制格式字符经Val函数转换成对应的数字,即14,由于这个字符是字节中的高4位,所以需要*16,等于224。类似,取出同一
55、字节中的低4位“ B”并转换成相应的数字11,并与高4位数字相加,最终结果是235,在内存中存放的十六进制字节为“EB ”。循环结束后,得到字节数组(0xEB,0x90,0x00,0xFF )。3、四字节十六进制数据格式字符串转换成单精度浮点数据在IEEE 754标准中定义了单精度浮点数采用32位二进制数据(4字节)表示,二进制数据按位分割成符号位、指数域和尾数域,将浮点数转换成实数,需要按公式进行计算。 如果在VBS中处理这样的转换,需要进行移位、判断、计算等多步处理,比较繁琐,运行 效率也不见得有多高,而在VB中进行这样的转换处理是很方便的。比如在VBS中使用通讯控件接收数据,在接收到的数据包中有四个字节的数据(9A,99,E5,41),这四个字节的数据表示一个IEEE单精度浮点数,在字节流中以小端序(LE)传输(41是高有效字节 MSByte),以DWORD表示即为0x41E5999A,转换成单精度浮点数 即为28.7。这样的字节流在通讯控件接收到以后,存放在Byte数组中,在内存中存储的字节为9A-99-E5-41,其实这正是IEEE单精度浮点数在内存中的存放格式,如果能将该内存区(4字节)拷贝给一个float型变量,就可以很方便的完成转换工作。但在VBS中没有直接对内存区进行操作的命令或函数,所以这个转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息网络代理商协议范本
- 工厂内部劳务调配协议
- 商品销售代理合同范本
- 承包合同协议书模板
- 建筑安装工程分承包合同书范例
- 欧帝燃气灶公司精益生产运营管理优化研究7500字
- 科研任务委托合同
- 员工内部借款协议范本
- 混凝土工入场教育试卷及答案
- 安全检查隐患清单
- 走进鱼类世界智慧树知到答案2024年中国海洋大学
- 代卖商品合同协议书
- 十字相乘法解一元二次方程练习100题及答案
- 中外合作办学规划方案
- 厂房屋顶光伏分布式发电项目建议书
- 2024年人教版初一道德与法治上册期中考试卷(附答案)
- 2024年第九届“鹏程杯”六年级语文邀请赛试卷(复赛)
- 国开2024年《建筑结构#》形考作业1-4答案
- DL-T1475-2015电力安全工器具配置与存放技术要求
- 漏检分析改善措施
- 新制定《公平竞争审查条例》学习课件
评论
0/150
提交评论