在WINCC中使用WinSock控件进行TCPIP通讯的例程Word格式.docx
- 文档编号:22445964
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:24
- 大小:88.87KB
在WINCC中使用WinSock控件进行TCPIP通讯的例程Word格式.docx
《在WINCC中使用WinSock控件进行TCPIP通讯的例程Word格式.docx》由会员分享,可在线阅读,更多相关《在WINCC中使用WinSock控件进行TCPIP通讯的例程Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
打开
SckListening
2
侦听
sckConnectionPending
3
连接挂起
sckResolvingHost
4
识别主机
sckHostResolved
5
已识别主机
sckConnecting
6
正在连接
sckConnected
7
已连接
sckClosing
8
同级人员正在关闭连接
sckError
9
错误
2、WinSock控件的主要方法
1)Bind方法
用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。
2)Listen方法
Listen方法只在使用TCP协议时有用。
它将应用程序置于监听检测状态。
3)Connect方法
当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。
Connect方法调用的规范为:
ConnectRemoteHost,RemotePort
4)Accept方法
当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。
5)SendData方法
当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。
6)GetData方法
当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。
GetData方法调用规范如下:
GetDatadata,[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的文件,编辑文件,加入以下文本:
[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]
@="
mlrljgrlhltlngjlthrligklpkrhllglqlrk"
保存文件退出。
先将mswinsck.ocx拷贝到system32下
再将注册表文件添加到注册表
然后\"
运行\"
,输入\"
regsvr32MSWINSCK.OCX\"
,确定。
2、在WinCC中添加WinSock控件
在WinCC图形编辑器中打开需要显示服务器数据的画面,选择“对象选项板”的“控件”选项卡,在选项卡中选择“添加/删除”,在“选择OCX控件”对话框中选择“MicrosoftWinSockControl,version6.0”进行注册。
在对象选项板中的WinSock控件拖入画面中。
三、服务器端程序介绍
这里所要通讯的服务器端程序是运行于南车资阳机车有限公司生产的V280/285系列船用柴油机机旁控制屏监控系统程序。
以下是协议文本:
通讯方式:
TCP/IP
侦听端口:
9105
机旁柜IP地址定义:
由用户根据具体网络配置决定
PAC数据采集周期:
1秒
上位机记取数据周期:
数据包格式定义如下:
上位机发送命令到PAC的数据包定义:
本数据包由上位机发送到PAC,PAC根据上位机发送的的命令执行,同时返回最新的采集数据到上位机。
数据长度:
10字节。
数据类型:
byte。
数据包详细定义:
命令代码1字节+备用代码1字节+设定转速4字节(single)+备用1字节
其中命令代码意义:
1=“读数据”;
18=“转速升”;
19=“转速降”。
PAC发送到上位机的数据包定义:
650个字节。
BYTE。
数据包内容详细定义及代码示意如下:
起始传80个浮点数,每个浮点数占用四个字节,高位在后,低位在前。
00000000h:
3333E7410000E8416666EA416666EA41;
00000010h:
3333EB416666E6410000E441CDCCE041;
00000020h:
6666DA410000DC410000DC410000DC41;
00000030h:
6666DA41CDCCD441CDCCD4410000D041;
00000040h:
0000DC410000DC413333DB41CDCCD841;
00000050h:
9A3F1C469A3F1C469A3F1C469A3F1C46;
00000060h:
6566894132B39541CECC9441CC2C9541;
00000070h:
CD2C8C413393914101E0914199199241;
00000080h:
01C08F4101008E419A59944100000000;
00000090h:
00000000000000000000000000000000;
000000a0h:
FCFF0A42F6FFFB419A3F1CC69A3F1CC6;
000000b0h:
9A3F1CC69A3F1CC69A3F1CC6A3FF8940;
000000c0h:
9A3F1CC69A3F1CC69A3F1CC60F00B541;
000000d0h:
74FFEF3F9A3F1CC66666B8409A99FD41;
000000e0h:
000000f0h:
00000100h:
00000110h:
8FC20442000000000000000000000000;
00000120h:
00000130h:
.
续:
PAC第一组IO输入点,2字节;
PAC第二组IO输入点,2字节;
PAC第一组IO输出点,1字节;
PAC第二组IO输出点,1字节;
PAC运行状态,1字节;
PAC当前执行的命令,1字节;
备用,1字节;
当前设定转速,4字节;
报警数目,1字节;
报警信息,300字节;
备用,16字节。
00000140h:
05000000000000010000000000000000;
00000150h:
00000160h:
00000170h:
00000180h:
00000190h:
000001a0h:
000001b0h:
000001c0h:
000001d0h:
000001e0h:
000001f0h:
00000200h:
00000210h:
00000220h:
00000230h:
00000240h:
00000250h:
00000260h:
00000270h:
00000280h:
00000000000000000000
四、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”、“YYB”、“SXB”。
2、画面模板组态
新建一个画面,画面名称为pDieselMod.pdl,并在画面中加入一个WinSock控件、一些文字和输入/输入域,以及其它有些相关控件。
如下图如示:
3、调用画面模板及修改变量前缀
新建的画面模板需要在主画面的一个子画面窗口中显示。
主画面文件名称为“pMain.pdl”,子画面窗口名称为“pMainArea”。
在用户程序运行时,有一个界面中显示了三台柴油机的图标,点击某一个柴油机图标,子画面切换到相应的柴油机状态及参数界面。
图标的鼠标动作C代码如下:
#include"
apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
#pragmaoption(mbcs)
#definePIC_0"
pMain"
#definePIC_1"
pDieselMod.PDL"
SetPropChar(PIC_0,"
pMainArea"
"
TagPrefix"
CNB."
);
‘此处”CNB.”在其余两处为”YYB.”、”SXB.”
SetPictureName(PIC_0,"
PIC_1);
}
上面代码中关健代码就是:
)。
该行语句设置了子窗口pMainArea的变量前缀为”CNB.”。
当子窗口设置了变量前缀后,画面窗口中的对象连接变量时,变量一般会自动加上前缀(连接包括动态对话框、变量、C脚本及VBS脚本)。
在设置了子窗口的变量前缀后,如果要切换显示不带变量前缀的画面,则需设置子窗口的变量前缀为空。
例外OpenPrevPicture()函数不受影响。
4、将画面模板中的对象连接到变量
将画面模板中的对象连接到相应的变量,组态方法与常规组态相似,不同之处在于变更量名称需要去掉前缀,在脚本中所使用的变量同样不要带变量前缀,因为变量前缀会自动加上。
在组态时会提示变量不存在,忽略即可。
五、建立TCP/IP连接
要求是在柴油机状态及参数画面显示时自动建立TCP/IP连接,如果连接没有建立,则将相应的结构变量清零,并且每隔两秒重建连接。
连接建立后,发送读数据命令数据包。
在画面对象属性的“显示”属性中加入如下VBS代码(触发器选择2s周期):
FunctionVisible_Trigger(ByvalItem)
DimObj_SockClient
Dimcnvt
Dimobj_Screen
Dimobj_pScreen
DimTag_intTXStatus
Dimi,j
DimTag_f,Tag_b
‘获得当前窗口中的WinSock对象
SetObj_SockClient=ScreenItems("
objSock"
)
‘获得显示当前画面的子窗口对象
Setobj_Screen=HMIRuntime.Screens("
).ScreenItems("
‘这是一个转换DLL,后面还要讲到
Setcnvt=CreateObject("
ADS.ArrayConvert"
‘以下是建立连接前的参数初始化工作,远程地址和端口号根据实际情况修改,此处设置是为了方便测试工作,可使用TCP&
UDP测试工具进行测试。
Obj_SockClient.Protocol="
sckTCPProtocol"
SelectCaseobj_Screen.TagPrefix
Case"
Obj_SockClient.RemoteHost="
192.168.1.100"
Obj_SockClient.RemotePort=4002
YYB."
Obj_SockClient.RemotePort=4003
SXB."
Obj_SockClient.RemotePort=4004
CaseElse
ExitFunction
EndSelect
‘连接没有建立、连接错误、同级人员正在关闭连接,这三种情况下,先关闭连接,再尝试建立连接。
If(Obj_SockClient.State=0)Or(Obj_SockClient.State=9)Or(Obj_SockClient.State=8)Then
Obj_SockClient.Close
Obj_SockClient.Connect
EndIf
‘如果连接没有建立,则使相应的FLOAT型结构变量清零。
IfObj_SockClient.State<
>
7Then
Fori=1To8
Forj=1To8
SetTag_f=HMIRuntime.Tags("
fTag"
&
i&
j)
Tag_f.Value=0
Tag_f.Write,1
Next
Next
‘如果连接没有建立,则使相应的BIT型结构变量复位。
Fori=1To15
SetTag_b=HMIRuntime.Tags("
biTag"
i)
Tag_b.Value=False
Tag_b.Write,1
Else
‘如果连接建立,则发送讯数据命令数据包
Obj_SockClient.SendDatacnvt.CvHexStr2vOctetStr("
01000000000000000000"
‘写入当前连接状态字
SetTag_intTXStatus=HMIRuntime.Tags("
TXStatus"
Tag_intTXStatus.Value=Obj_SockClient.State
Tag_intTXStatus.Write,1
EndFunction
六、接收数据包的处理
当建立连接后,接受到了新数据就会触发这个DataArrival事件。
这里只对前64个模拟量数据、16个开关量输入数据、10条汉字报警信息进行解析,并将解析后的数据赋值给相应的变量,汉字报警信息直接在窗口中的S7FlatEditBox控件中显示。
DataArrival事件的VBS代码如下:
SubDataArrival(ByvalItem,ByvalbytesTotal)
OnErrorResumeNext
Dimobj_OutText
DimstrReceive
DimstrFromRec,strFromRec1
DimstrForBool,iForBoolCheck
ADs.ArrayConvert"
Setobj_OutText=ScreenItems("
objOutText"
‘接收数据包字节数应为650字节,否则不处理
IfbytesTotal=650Then
‘从接收缓冲区取得数据,并清空缓冲区
Item.GetDatastrReceive
strFromRec="
"
'
提取前333个字节所包含的信息,用于模拟量和开关量解析
Fori=0To333'
UBound(strReceive)
‘将接收到的BYTE()型数据转换为String型数据
strFromRec=strFromRec&
Right("
0"
Hex(Ascb(Midb(strReceive,i+1,1))),2)
Next
解析出80个模拟量并赋值给相应的变量
Fori=1To8
Forj=1To8
SetTag_f=HMIRuntime.Tags("
‘此处使用了DLL中的数据转换函数,CvHexStr2vReal2的功能是将十六进制字符串表示的单精度浮点数转换成实际的浮点数值。
该函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WINCC 使用 WinSock 控件 进行 TCPIP 通讯 例程