在 WINCC 中使用 WinSock 控件进行 TCP/IP 通讯的例程
目录
一、WinSock 控件介绍(以 VB 语言表述).................................................................................1
1、WinSock 控件的主要属性.................................................................................................. 1
2、WinSock 控件的主要方法.................................................................................................. 2
3、WinSock 控件的主要事件.................................................................................................. 3
二、WinSock 控件在 WINCC 中的使用.........................................................................................3
1、WinSock 控件注册 .............................................................................................................. 3
2、在 WinCC 中添加 WinSock 控件....................................................................................... 4
三、服务器端程序介绍 .................................................................................................................... 4
四、WinCC 画面模板与结构变量的配合使用 ...............................................................................6
1、结构变量定义...................................................................................................................... 6
2、画面模板组态...................................................................................................................... 7
3、调用画面模板及修改变量前缀 ..........................................................................................7
4、将画面模板中的对象连接到变量......................................................................................8
五、建立 TCP/IP 连接 ...................................................................................................................... 8
六、接收数据包的处理 .................................................................................................................. 10
附:在 VBS 中进行数据处理的局限性及变通解决方法 ............................................................12
摘要:
关键词:VB、VBS、WINCC、WINSOCK、DLL、UNICODE、ANSI、ASCII、画面模板、
结构变量、数据转换。
该文档的软件环境:
Microsoft Windows XP Professional 版本 2002 SP3
SIMATIC WinCC V6.2 SP2 ASIA
‘SIMATIC STEP7 V5.4+SP5+HF3 Chinese
TCP&UDP 测试工具 V1.02
目的:
使用 WINCC 用户程序作为客户端程序,与服务器通讯,通讯协议为标准 TCP/IP 协议,
取得服务器发送过来的数据包,按数据包格式文本规定,解析数据包数据,并将相关数据显
示在用户程序画面中。
一、WinSock 控件介绍(以 VB 语言表述)
1、WinSock 控件的主要属性
1) Protocol 属性
通过 Protocol 属性可以设置 WinSock 控件连接远程计算机使用的协议。可选的协议是
TCP 和 UDP 对应的 VB 的常量分别是 sckTCPProtocol 和 sckUDPProtocol,Winsock 控件默
认协议是 TCP。
注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。
2) SocketHandle 属性
SocketHandle 返回当前 socket 连接的句柄,这是只读属性。
3) RemoteHostIP 属性
RemoteHostIP 属性返回远程计算机的 IP 地址。在客户端,当使用了控件的 Connect
方法后,远程计算机的 IP 地址就赋给了 RemoteHostIP 属性,而在服务器端,当 ConnectRequest
事件后,远程计算机(客户端)的 IP 地址就赋给了这个属性。如果使用的是 UDP 协议那么
当 DataArrival 事件后,发送 UDP 报文的计算机的 IP 才赋给了这个属性。
4) ByteReceived 属性
1
返回当前接收缓冲区中的字节数
5) State 属性
返回 WinSock 控件当前的状态
常数
值
描述
0
1
2
3
4
5
6
7
8
9
缺省值,关闭
打开
侦听
连接挂起
识别主机
已识别主机
正在连接
已连接
同级人员正在关闭连接
错误
sckClosed
SckOpen
SckListening
sckConnectionPending
sckResolvingHost
sckHostResolved
sckConnecting
sckConnected
sckClosing
sckError
2、WinSock 控件的主要方法
1) Bind 方法
用 Bind 方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这
个端口。
2) Listen 方法
Listen 方法只在使用 TCP 协议时有用。它将应用程序置于监听检测状态。
3) Connect 方法
当本地计算机希望和远程计算机建立连接时,就可以调用 Connect 方法。
Connect 方法调用的规范为:
Connect RemoteHost,RemotePort
4) Accept 方法
当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。
5) SendData 方法
当连接建立后,要发送数据就可以调用 SendData 方法,该方法只有一个参数,就是
2
要发送的数据。
6) GetData 方法
当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出
数据,可以使用 GetData 方法。GetData 方法调用规范如下:
GetData data,[type,][maxLen]
它从缓冲区中取得最长为 maxLen 的数据,并以 type 类型存放在 data 中,GetData 取
得数据后,就把相应的缓冲区清空。
7) PeekData 方法
和 GetData 方法类似,但 PeekData 在取得数据后并不把缓冲区清空。
3、WinSock 控件的主要事件
1) ConnectRequest 事件
当本地计算机接收到远程计算机发送的连接请求时,控件的 ConnectRequest 事件将
会被触发。
2) SendProgress 事件
当一端的计算机正在向另一端的计算机发送数据时,SendProgress 事件将被触发。
SendProgress 事件记录了当前状态下已发送的字节数和剩余字节数。
3) SendComplete 事件
当所有数据发送完成时,被触发。
4) DataArrival 事件
当建立连接后,接受到了新数据就会触发这个事件。
注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。
5) Error 事件
当在工作中发生任何错误都会触发这个事件。
二、WinSock 控件在 WINCC 中的使用
1、WinSock 控件注册
在 WinCC 中使用 WinSock 控件前,需要先进行注册。
注册方法如下:
使用记事本新建一个后缀名为 reg 的文件,编辑文件,加入以下文本:
3
[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]
@="mlrljgrlhltlngjlthrligklpkrhllglqlrk"
保存文件退出。
先将 mswinsck.ocx 拷贝到 system32 下
再将注册表文件添加到注册表
然后\"运行\",输入\"regsvr32 MSWINSCK.OCX\",确定。
2、在 WinCC 中添加 WinSock 控件
在 WinCC 图形编辑器中打开需要显示服务器数据的画面,选择“对象选项板”的“控
件”选项卡,在选项卡中选择“添加/删除”,在“选择 OCX 控件”对话框中选择“Microsoft
WinSock Control, version 6.0”进行注册。
在对象选项板中的 WinSock 控件拖入画面中。
三、服务器端程序介绍
这里所要通讯的服务器端程序是运行于南车资阳机车有限公司生产的 V280/285 系列
船用柴油机机旁控制屏监控系统程序。
以下是协议文本:
通讯方式:TCP/IP
侦听端口:9105
机旁柜 IP 地址定义:由用户根据具体网络配置决定
PAC 数据采集周期:1 秒
上位机记取数据周期:1 秒
数据包格式定义如下:
上位机发送命令到 PAC 的数据包定义:本数据包由上位机发送到 PAC,PAC 根据上
位机发送的的命令执行,同时返回最新的采集数据到上位机。
数据长度:10 字节。
数据类型:byte。
数据包详细定义:命令代码 1 字节+备用代码 1 字节+设定转速 4 字节(single)+备
用 1 字节
其中命令代码意义:1=“读数据”;18=“转速升”;19=“转速降”。
4
PAC 发送到上位机的数据包定义:
数据长度:650 个字节。
数据类型:BYTE。
数据包内容详细定义及代码示意如下:
起始传 80 个浮点数,每个浮点数占用四个字节,高位在后,低位在前。
00000000h: 33 33 E7 41 00 00 E8 41 66 66 EA 41 66 66 EA 41 ;
00000010h: 33 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 ;
00000060h: 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 ;
000000b0h: 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 ;
00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000110h: 8F C2 04 42 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000120h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000130h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;.
续:
PAC 第一组 IO 输入点,2 字节;PAC 第二组 IO 输入点,2 字节;PAC 第一组 IO 输
出点,1 字节;PAC 第二组 IO 输出点,1 字节;PAC 运行状态,1 字节;PAC 当前执行的
命令,1 字节;备用,1 字节;当前设定转速,4 字节;报警数目,1 字节;报警信息,300
字节;备用,16 字节。
00000140h: 05 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ;.
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: 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: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
5
000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000200h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;.
00000210h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000220h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000230h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000240h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000250h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000260h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000270h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000280h: 00 00 00 00 00 00 00 00 00 00
四、WinCC 画面模板与结构变量的配合使用
本用户程序需要实时采集显示三台同类型柴油机的运行数据,由于三台柴油机的数据
采集和显示是相同的,而 WinCC 画面模板与结构变量配合使用可以在一个画面中根据条件
显示具有相同类型参数的多个对象,避免反复组态相同画面布局的工作,减少项目后期某些
细节部位的修改而带来的工作量,所以本用户程序采用画面模板与结构变量配合使用方法进
行组态设计。
《WinCC 中的画面模板》一文提出四种使用画面模板的方法,这里采用第三种方法,
即“使用变量前缀的画面窗口”。
组态步骤如下所示:
1、结构变量定义
在 WinCC 中定义一个结构变量,结构变量名称为 sDieselData。结构变量包括 64 个
FLOAT 型变量(数据包上传 80 个模拟量,但实际使用只有小于 64 个,出于编程方便起见,
使用 8*8=64 个单精度浮点变量),16 个 BIT 型变量(只使用 PAC 的输入点、其它开关量
不使用),1 个 SHORT 变量(反映通讯状态)。
64 个单精度浮点型变量的命名格式为:
fTag11、fTag12……fTag18
fTag21、fTag22……fTag28
………………………………
fTag81、fTag82……fTag88
16 个 BIT 型变量命名格式为 biTag1、biTag2……biTag16。
1 个 SHORT 型变量名称为 TXStatus。
结构变量定义完成后,根据结构变量定义三个内部结构变量,分别命名为“CNB”、
6
“YYB”、“SXB”。
2、画面模板组态
新建一个画面,画面名称为 pDieselMod.pdl,并在画面中加入一个 WinSock 控件、一
些文字和输入/输入域,以及其它有些相关控件。如下图如示:
3、调用画面模板及修改变量前缀
新 建 的 画 面 模 板 需 要 在 主 画 面 的 一 个 子 画 面 窗 口 中 显 示 。 主 画 面 文 件 名 称 为
“pMain.pdl”,子画面窗口名称为“pMainArea”。在用户程序运行时,有一个界面中显示
了三台柴油机的图标,点击某一个柴油机图标,子画面切换到相应的柴油机状态及参数界面。
图标的鼠标动作 C 代码如下:
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
#pragma option(mbcs)
#define PIC_0 "pMain"
#define PIC_1 "pDieselMod.PDL"
7