技术论坛

【分享】通过MSComm控件进行WINCC串口通讯总结

作者 主题
侠圣

经验值: 2323
发帖数: 157
精华帖: 6
主题:【分享】通过MSComm控件进行WINCC串口通讯总结
精华帖精华帖星级4级 推荐帖


只看楼主 只看精华 楼主 2016-06-24 10:39:54

目的:通过MSComm控件实现WINCC串口通讯(C脚本和VB脚本两种方式)

测试环境:操作系统  win7

          WINCC版本:V7.2

辅助工具:串口调试工具

               ASPD虚拟串口工具

测试WINCC组态画面:

测试实验过程画面:

1、通过VB实现串口通讯

画面对象“打开画面”VB事件脚本:

Sub OnOpen()                                       

Dim objMSComm, tagConnection

Set objMSComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")

    Set tagConnection = HMIRuntime.Tags("tagConnection1")

        

If objMSComm.PortOpen = False Then

                 

' Assign com port number

objMSComm.Commport = 4

' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit

objMSComm.Settings = "9600,N,8,1"

objMSComm.RThreshold = 1

objMSComm.SThreshold = 0

objMSComm.InBufferCount = 0

objMSComm.InputLen = 0

objMSComm.PortOpen = True

tagConnection.Write (True)

HMIRuntime.Trace("Port open." & vbCrLf)

Else

HMIRuntime.Trace("Port is already opened." & vbCrLf)

End If

End Sub


MSComm控件OnComm对象事件:

Sub OnOpen()                                       

Dim objMSComm, tagConnection

Set objMSComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")

    Set tagConnection = HMIRuntime.Tags("tagConnection1")

        

If objMSComm.PortOpen = False Then

                 

' Assign com port number

objMSComm.Commport = 4

' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit

objMSComm.Settings = "9600,N,8,1"

objMSComm.RThreshold = 1

objMSComm.SThreshold = 0

objMSComm.InBufferCount = 0

objMSComm.InputLen = 0

objMSComm.PortOpen = True

tagConnection.Write (True)

HMIRuntime.Trace("Port open." & vbCrLf)

Else

HMIRuntime.Trace("Port is already opened." & vbCrLf)

End If

End Sub


“SEND按钮”鼠标左键按下事件:

Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)            

Dim objMSComm

Dim strTemp,buffer

HMIRuntime.Trace("Communication!" & vbCrLf)

Set objMsComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")

Set buffer = HMIRuntime.Tags("Buffer1")

strTemp = buffer.Read

If objMSComm.PortOpen = True Then

If strTemp<>"" then

objMSComm.Output=strTemp

End If

End If

End Sub


2、通过C脚本实现串口通讯

画面对象“打开画面”C事件脚本:

#include "apdefap.h"

void OnOpenPicture(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

#define GetObject GetObject

__object *pdl=NULL; 

__object *pic=NULL; 

__object *obj=NULL;

 int i,j; 

pdl = __object_create("PDLRuntime"); 

if(pdl)

{

    printf("portopen get pdl ok ");

}

pic=pdl->GetPicture("串口通讯C版");  

if(pic)

{

    printf("portopen get pic ok ");

}

obj=pic->GetObject("COM");

if(obj)

{

    printf("portopen get obj ok ");

}


if(obj->PortOpen==0)

{

    obj->Commport = 3;

    obj->Settings = "9600,N,8,1";

    obj->RThreshold = 1;

    obj->SThreshold = 0;

    obj->InBufferCount = 0;

    obj->InputLen = 0;

    obj->PortOpen = 1;

}


__object_delete(obj);

__object_delete(pic); 

__object_delete(pdl);

}

MSComm控件OnComm对象事件:

#include "apdefap.h"

void OnComm(char* lpszPictureName, char* lpszObjectName )

{

#define GetObject GetObject

__object *pdl=NULL; 

__object *pic=NULL; 

__object *obj=NULL;

char  *data="";

pdl = __object_create("PDLRuntime"); 

if(pdl)

{

    printf("portopen get pdl ok ");

}

pic=pdl->GetPicture("串口通讯C版");  

if(pic)

{

    printf("portopen get pic ok ");

}

obj=pic->GetObject("COM");

if(obj)

{

    printf("portopen get obj ok ");

}

SetTagChar("BufferTemp",obj->Input);

printf("BufferTemp:%s ",GetTagChar("BufferTemp"));


if(strcmp(GetTagChar("BufferTemp"),""))

{

    SetTagChar("Buffer1",GetTagChar("BufferTemp"));

}

__object_delete(obj);

__object_delete(pic); 

__object_delete(pdl);

}

“SEND按钮”鼠标左键按下事件:

#include "apdefap.h"

void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)

{

#define GetObject GetObject

__object *pdl=NULL; 

__object *pic=NULL; 

__object *obj=NULL;

char  *data="";

pdl = __object_create("PDLRuntime"); 

if(pdl)

{

    printf("portopen get pdl ok ");

}

pic=pdl->GetPicture("串口通讯C版");  

if(pic)

{

    printf("portopen get pic ok ");

}

obj=pic->GetObject("COM");

if(obj)

{

    printf("portopen get obj ok ");

}

if(strcmp(GetTagChar("Buffer1"),""))

{

    obj->Output=GetTagChar("Buffer1");

}

__object_delete(obj);

__object_delete(pic); 

__object_delete(pdl);

}


附:测试工具

MSComm控件.rar


hongxi-002@qq.com
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1306016&b_id=5&s_id=0&num=12

侠圣

经验值: 3725
发帖数: 149
精华帖: 0
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 1楼 2016-06-25 20:59:59

学习学习,谢谢分享!


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2608
发帖数: 407
精华帖: 5
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 2楼 2016-06-26 10:40:23

厉害厉害,就是看着代码就头疼


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5059
发帖数: 335
精华帖: 6
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 3楼 2016-06-27 08:06:01

学习学习C控制的串口通讯


仰望星空,脚踏实地
以下网友喜欢您的帖子:

  
侠圣

经验值: 2412
发帖数: 66
精华帖: 0
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 4楼 2016-06-27 13:48:13

谢谢分享,不错的资料。


 
以下网友喜欢您的帖子:

  
版主

经验值: 69053
发帖数: 12266
精华帖: 59
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 5楼 2016-06-27 21:42:28


不错

我也做过简单的通讯,不过一些通讯用串口测试和实际通讯还是有区别的


Q群:https://jq.qq.com/?k=9BDuEgf6
以下网友喜欢您的帖子:

  
版主

经验值: 69053
发帖数: 12266
精华帖: 59
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 6楼 2016-06-27 21:43:29

学习了~c语言还可以这样访问控件属性之类的


Q群:https://jq.qq.com/?k=9BDuEgf6
以下网友喜欢您的帖子:

  
游侠

经验值: 411
发帖数: 6
精华帖: 0
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 7楼 2016-06-28 03:11:19


谢谢分享!


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3804
发帖数: 500
精华帖: 3
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 8楼 2016-06-29 06:59:28


谢谢分享,好好看一下。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 28599
发帖数: 10824
精华帖: 131
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 9楼 2016-07-03 20:38:00

用的啥mode方式?



微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
侠圣

经验值: 2644
发帖数: 781
精华帖: 1
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 10楼 2016-09-17 10:27:00
以下是引用HUO1921在2016-06-24 10:39:54的发言 >楼主

目的:通过MSComm控件实现WINCC串口通讯(C脚本和VB脚本两种方式)

测试环境:操作系统  win7

          WINCC版本:V7.2

辅助工具:串口调试工具

               ASPD虚拟串口工具

测试WINCC组态画面:

测试实验过程画面:

1、通过VB实现串口通讯

画面对象“打开画面”VB事件脚本:

Sub OnOpen()                                       

Dim objMSComm, tagConnection

Set objMSComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")

    Set tagConnection = HMIRuntime.Tags("tagConnection1")

        

If objMSComm.PortOpen = False Then

                 

' Assign com port number

objMSComm.Commport = 4

' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit

objMSComm.Settings = "9600,N,8,1"

objMSComm.RThreshold = 1

objMSComm.SThreshold = 0

objMSComm.InBufferCount = 0

objMSComm.InputLen = 0

objMSComm.PortOpen = True

tagConnection.Write (True)

HMIRuntime.Trace("Port open." & vbCrLf)

Else

HMIRuntime.Trace("Port is already opened." & vbCrLf)

End If

End Sub


MSComm控件OnComm对象事件:

Sub OnOpen()                                       

Dim objMSComm, tagConnection

Set objMSComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")

    Set tagConnection = HMIRuntime.Tags("tagConnection1")

        

If objMSComm.PortOpen = False Then

                 

' Assign com port number

objMSComm.Commport = 4

' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit

objMSComm.Settings = "9600,N,8,1"

objMSComm.RThreshold = 1

objMSComm.SThreshold = 0

objMSComm.InBufferCount = 0

objMSComm.InputLen = 0

objMSComm.PortOpen = True

tagConnection.Write (True)

HMIRuntime.Trace("Port open." & vbCrLf)

Else

HMIRuntime.Trace("Port is already opened." & vbCrLf)

End If

End Sub


“SEND按钮”鼠标左键按下事件:

Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)            

Dim objMSComm

Dim strTemp,buffer

HMIRuntime.Trace("Communication!" & vbCrLf)

Set objMsComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")

Set buffer = HMIRuntime.Tags("Buffer1")

strTemp = buffer.Read

If objMSComm.PortOpen = True Then

If strTemp<>"" then

objMSComm.Output=strTemp

End If

End If

End Sub


2、通过C脚本实现串口通讯

画面对象“打开画面”C事件脚本:

#include "apdefap.h"

void OnOpenPicture(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

#define GetObject GetObject

__object *pdl=NULL; 

__object *pic=NULL; 

__object *obj=NULL;

 int i,j; 

pdl = __object_create("PDLRuntime"); 

if(pdl)

{

    printf("portopen get pdl ok ");

}

pic=pdl->GetPicture("串口通讯C版");  

if(pic)

{

    printf("portopen get pic ok ");

}

obj=pic->GetObject("COM");

if(obj)

{

    printf("portopen get obj ok ");

}


if(obj->PortOpen==0)

{

    obj->Commport = 3;

    obj->Settings = "9600,N,8,1";

    obj->RThreshold = 1;

    obj->SThreshold = 0;

    obj->InBufferCount = 0;

    obj->InputLen = 0;

    obj->PortOpen = 1;

}


__object_delete(obj);

__object_delete(pic); 

__object_delete(pdl);

}

MSComm控件OnComm对象事件:

#include "apdefap.h"

void OnComm(char* lpszPictureName, char* lpszObjectName )

{

#define GetObject GetObject

__object *pdl=NULL; 

__object *pic=NULL; 

__object *obj=NULL;

char  *data="";

pdl = __object_create("PDLRuntime"); 

if(pdl)

{

    printf("portopen get pdl ok ");

}

pic=pdl->GetPicture("串口通讯C版");  

if(pic)

{

    printf("portopen get pic ok ");

}

obj=pic->GetObject("COM");

if(obj)

{

    printf("portopen get obj ok ");

}

SetTagChar("BufferTemp",obj->Input);

printf("BufferTemp:%s ",GetTagChar("BufferTemp"));


if(strcmp(GetTagChar("BufferTemp"),""))

{

    SetTagChar("Buffer1",GetTagChar("BufferTemp"));

}

__object_delete(obj);

__object_delete(pic); 

__object_delete(pdl);

}

“SEND按钮”鼠标左键按下事件:

#include "apdefap.h"

void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)

{

#define GetObject GetObject

__object *pdl=NULL; 

__object *pic=NULL; 

__object *obj=NULL;

char  *data="";

pdl = __object_create("PDLRuntime"); 

if(pdl)

{

    printf("portopen get pdl ok ");

}

pic=pdl->GetPicture("串口通讯C版");  

if(pic)

{

    printf("portopen get pic ok ");

}

obj=pic->GetObject("COM");

if(obj)

{

    printf("portopen get obj ok ");

}

if(strcmp(GetTagChar("Buffer1"),""))

{

    obj->Output=GetTagChar("Buffer1");

}

__object_delete(obj);

__object_delete(pic); 

__object_delete(pdl);

}


附:测试工具

MSComm控件.rar


,大长见识了


开朗,爱学
以下网友喜欢您的帖子:

  
侠士

经验值: 1089
发帖数: 473
精华帖: 0
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 11楼 2016-09-17 14:59:05


真是学习了


 
以下网友喜欢您的帖子:

  
至圣

经验值: 23744
发帖数: 3385
精华帖: 52
回复:【分享】通过MSComm控件进行WINCC串口通讯总结


只看楼主 只看精华 12楼 2016-09-29 15:45:36

楼主的方法, 必须将空间放置主画面上, 其他画面放到窗口里。

我更喜欢用c脚本直接做串口通讯, 不受画面影响


不忘初心
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
【分享】通过MSComm控件进行WINCC串口通讯总结
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。