WinCC 通过VBS脚本进行串口通讯

合集下载

WINCC与串口设备通信方法的研究与应用

WINCC与串口设备通信方法的研究与应用

WINCC与串口设备通信方法的研究与应用摘要:探讨了如何通过OPC来访问WinCC系统的实时数据。

并根据串口设备通讯协议要求,通过Visual Studio平台下的C#语言编程,把采集到的实时数据按通讯协议组织后通过串口发送给串口设备。

结合实际应用给出了具体的实现步骤。

某煤矿水处理系统应用结果表明,系统运行稳定可靠,效率高,具有很强的实用性和推广价值。

关键字:WinCC 实时数据OPC 串口通信随着企业信息化进程的推进,无论是哪个管理相关部门,都希望从工作的现场得到最新的数据,并对这些新的数据进行综合的分析。

然而,不同的控制器来自不同的厂商,通过不同的标准,组成各自需要的系统,并进行控制,各个控制系统形成了互不相连的自动化孤岛,因为很多数据无法整体的采集到并进行整体的分析与研究。

从而更无法建立统一的生产过程数据平台,难以实现管理控制的一体化[1]。

该文通过OPC来访问WinCC系统的实时数据。

并根据串口设备通讯协议要求,通过Visual Studio平台下的C#语言编程,把采集到的实时数据按通讯协议组织后通过串口发送给串口设备。

1?OPC(OLE for Process Control)技术介绍OPC(OLE for Process Control)用于过程控制的对象链接嵌入技术,是基于微软的OLE、COM(组件对象模型)和DCOM(分布式组件对象模型)技术为基础,采用客户/服务器模式,在基于Windows操作平台的工业应用程序之间提供交互功能和高效信息集成的组件。

利用OPC 技术,可以对现场设备及其驱动程序进行封装,形成OPC(OLE for Process Control)服务器,向上与OPC客户应用程序通信以完成数据交换,向下则是对设备数据进行采集。

因此,它的出现为基于Windows 的应用程序和现场过程控制之间做好了铺垫。

这种既开放又高效的通信机制提供了一种从数据源提取数据并且传输到应用程序的标准途径,它能够有效地整合各类控制器和控制系统,众多不同的厂商生产的都能用统一的开口进行传输与控制,很容易解决由不同类型自动化设备构成的大中型系统中的数据交换和传输问题[2] 2?OPC(OLE for Process Control)客户机应用程序开发2.1?OPC开发工具包模块化开发工具包提供了软件设计的基本工具。

WinCC课件十如何使用VBScript

WinCC课件十如何使用VBScript

7
WinCC flexible 如何使用VBScript
WinCC Flexible
如何创建报警系统 如何使用VBScript 如何配方
概述 ——脚本及其使用
在脚本中编写VB脚本代码,可以像使用系统函数一样使用项目 中完成的脚本。创建脚本时,确定其型号并定义传送参数。脚本 有两种类型——“函数”和“Sub(子程序)”。“函数”类型的脚本 具有一个返回值。“Sub”类型脚本作为“过程”引用,没有返回 值。
1. 用鼠标在项目窗口中选择“脚本”元素。 2. 在“脚本”弹出式菜单中选择“添加脚本”命令。在工作区 域中脚本被设置为新建标签。脚本组态设置的输入掩码在属性窗 口中打开。 3. 在属性窗口中为脚本输入一个有意义的名称。 4. 从属性窗口中选择脚本类型。 5. 如果脚本中需要参数,那么在属性窗口中输入参数名称并单 击“添加”。 只有当脚本还未在函数列表中组态或在其他脚本中调用时,才 可以改变脚本的参数或类型。
编写步骤如下:
1. 双击想要写入代码的脚本的项目窗口,脚本打开。 2. 编写代码。 3. 如果脚本是“Function”类型,分配函数名称给返回值。
18
WinCC flexible 如何使用VBScript
WinCC Flexible
如何创建报警系统 如何使用VBScript 如何配方
组态脚本 ——组态脚本 访问变量
系统函数及其使用 脚本及其使用 使用函数列表
2
WinCC flexible 如何使用VBScript
WinCC Flexible
如何创建报警系统 如何使用VBScript 如何配方
概述 ——运行脚本的基本信息 系统函数的使用
WinCC flexible提供了预定义的系统函数,以用于常规的组态 任务。可以用它们在运行系统中完成许多任务,而无需编程技巧。 当然也可以用运行脚本来解决更复杂的问题。运行脚本具有编程 接口,可以在运行时访问部分项目数据。运行脚本的使用是针对 具有Visual Basic (VB)和Visual Basic Script (VBS)知识的项目 设计者的。

在WinCC中实现串行通讯的两种方法

在WinCC中实现串行通讯的两种方法

在WinCC中实现串行通讯的两种方法
林英芸;杨煜普
【期刊名称】《电子测量技术》
【年(卷),期】2006(29)2
【摘要】为了在WinCC组态软件中实现与串口的通讯,文中介绍了两种方法:一是在WinCC中调用VB编写好的串口通讯程序,进行数据交换,实现对串口的访问;二是在WinCC图形编辑器中调用ActiveX控件MSComm,编写全局脚本VBS实现对串口的访问。

这两种方法很好地解决了组态工程师被WinCC所束缚的串行通讯操作限制问题,拓宽了工程师使用WinCC的灵活性,提高了组态效率。

【总页数】3页(P115-116)
【关键词】视窗控制中心;串行通讯;控件
【作者】林英芸;杨煜普
【作者单位】上海交通大学自动化系
【正文语种】中文
【中图分类】TP273;TP368.1
【相关文献】
1.VB6.0实现串行通讯的两种方法 [J], 袁朔;袁赣南;徐锡芬
2.如何在WINCC中使用OLE控件实现串行通讯 [J], 马焉;陈露萍
3.Delphi程序中实现串行口通讯的三种方法 [J], 李志合;易维明;程卫东;张国海
4.Delphi中如何用面向对象方法实现串行通讯 [J], 李磊
5.工控系统中VC++实现串行通讯的两种方法及其比较 [J], 陈静;童名文;范宣志;石俊杰
因版权原因,仅展示原文概要,查看原文内容请购买。

通过vbs脚本读取wincc的数据库

通过vbs脚本读取wincc的数据库

通过vbs脚本读取wincc的数据库'本代码是在E:\WinccProjects\DBSQL工程下完成,功能是对该工程下的CC_DBSQL_11_04_19_19_19_51R数据库中的表GH_table 中的字段“Temp”进行读操作。

读的结果暂存在DBSQL工程下的过程变量Speed中,再有Speed传给IO控件显示。

'该代码由按钮控件作为按下鼠标的响应脚本。

读的时间由按钮动作决定。

'本代码只实现了对其中一条数据的读操作。

Sub OnClick(Byval Item)Dim Speed_hmi,Speed_valDim cn,strSQL,strcn,rs,rs1Dim ResultSet cn = CreateObject("ADODB.Connection")Set rs=CreateObject("ADODB.RecordSet")strcn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CC_DBSQL_11_04_19_19_19_51R;Data Source=.\wincc"cn.ConnectionString = strcncn.Open strcnSet Speed_hmi=HMIRuntime.Tags("Speed")'Temp_hmi.Read'Temp_val=Temp_hmi.ValuestrSQL = "select * from GH_table"'where(Temp)rs.Open strSQL,cn,1,3'rs.AddNew'新建一条记录'rs.fields("Temp")=999rs.updaters.movefirst'使位置移植第一条Result=rs.fields("Temp")读取Speed_hmi.Write Resultrs.closecn.closeSEt cn=NotHingSet rs=NotHingend Sub'*********更新:实现按一定条件读取DB,将结果显示在一个IO 域中*********************Sub OnClick(Byval Item)Dim cn,strSQL,strcn,rsDim ResultSet cn = CreateObject("ADODB.Connection")Set rs=CreateObject("ADODB.RecordSet")strcn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CC_DBSQL_11_04_19_19_19_51R;Data Source=.\wincc"cn.ConnectionString = strcncn.Open strcnstrSQL = "SELECT *FROM GHtable001 WHERE ([Time] = '1900-1-1 12:33:42')" '在GHtable001表中已经存有数据,对应该时间的值为61rs.Open strSQL,cn,1,3rs.updateResult=rs.fields("Temp") '将搜索结果对应的Temp变量值给ResultHMIRuntime.Screens("TagArchive").ScreenItems("IOfield01") .outputvalue=Result '将结果负值给IO域rs.closecn.closeSEt cn=NotHingSet rs=NotHingend Sub'************************************************************** ****************************************************************。

wincc中vbs手册

wincc中vbs手册

对不起,无法提供完整的WinCC VBS手册,但可以提供一些关于WinCC VBS的基本信息和常见问题解答。

WinCC(Windows Control and Communication)是一种工业自动化领域的监控和通信软件,它支持使用VBScript(VBS)进行脚本编程。

VBS是一种基于VB(Visual Basic)语言的脚本编程语言,它具有简单易学、功能强大的特点。

在WinCC中,VBS可用于自动化控制、数据采集、报表生成、用户管理等方面。

以下是一些关于WinCC VBS的基本信息和常见问题解答:1. 什么是WinCC VBS?答:WinCC VBS是用于在WinCC中实现自动化控制、数据采集、报表生成、用户管理等功能的脚本编程语言。

2. WinCC VBS与VBScript有何区别?答:WinCC VBS是基于VBScript的扩展版本,它增加了对WinCC特定功能的支持,如数据类型转换、文件操作、图形显示等。

3. 如何安装和使用WinCC VBS?答:安装WinCC时,需要同时安装VBS插件。

安装完成后,您可以通过编写VBS脚本并将其添加到WinCC项目中,使用VBS实现各种功能。

4. WinCC VBS支持哪些数据类型?答:WinCC VBS支持多种数据类型,包括字符串、数字、日期/时间、布尔值、数组和对象等。

5. 如何调试WinCC VBS脚本?答:您可以使用VBScript调试器来调试WinCC VBS脚本。

调试器提供了变量查看、断点设置、逐步执行等功能,帮助您找到脚本中的错误并进行修复。

6. 如何处理WinCC VBS中的错误?答:当WinCC VBS脚本中出现错误时,调试器会记录错误信息并提示您在哪里出错。

根据错误信息,您可以找到并修复代码中的问题。

7. WinCC VBS可以与哪些外部设备进行通信?答:WinCC VBS支持与多种外部设备进行通信,如串口设备、网络设备、PLC等。

Wincc的VBS脚本使用

Wincc的VBS脚本使用

W i n c c的V B S脚本使用------------------------------------------作者xxxx------------------------------------------日期xxxx变量读写: Write和Read方法的语法:读:1 Dim objTag Set objTag=HMIRunTime.Tags("变量名")2 HMIRunTime.Tags("变量名").Read写:1 Dim objTag Set objTag=HMIRunTime.Tags("变量名")objTag.Write 1 '向变量写入数值12 HMIRunTime.Tags("变量名").Write 1中间变量的值写入:Dim objTag,valSet objTag=HMIRunTime.Tags("变量名")objTag.Readval=objTag.Value '中间变量val存放了变量的值VBS语言使用方法概述:VBScript的全称是:Microsoft Visual Basic Script Editon.(微软公司可视化BASIC 脚本版).正如其字面所透露的信息, VBS(VBScript的进一步简写)是基于Visual Basic的脚本语言.我进一步解释一下, Microsoft Visual Basic是微软公司出品的一套可视化编程工具, 语基于Basic. 脚本语言, 就是不编译成二进制文件, 直接由宿主(host)解释源代码并执行, 简单点说就是你写的程序不需要编译成.exe, 而是直接给用户发送.vbs的源程序, 用户就能执行了.一、入门: 1) 注释(以REM或'开头)行在程序中不起作用, 但能让别人更容易读懂你的程序. 2) 变量好像一个盒子, 或一个代号, 可以代表你想代表的东西. 变量赋值使用"="3)以""包裹起来的字符称之为"字符串"4)函数像一个"黑箱", 有参数和返回值, 用"="左边的变量可以接住返回值5) Inputbox函数弹出一个输入对话框,Msgbox则用于输出例:REM 输入并回显你的名字'使用InputBox和Msgbox函数Dim name,msgmsg="请输入你的名字:"name=Inputbox(msg,"名称")Msgbox(name)上例中,Dim用来声明一个变量, 在VBS中, 变量类型并不是那么重要, 就是说VBS中你不用考虑name储存的是一个整数还是一个小数(学名叫"浮点数"), 也不用考虑是不是字符串(一串字符, 比如:"Hello World"), VBS会自动帮你搞定. 所以第三行语句可以删除, 效果不会变.常量:格式是:const 常量名=常量值.例如: const PI=3.1415926 const NAME="记忆碎片"二、进阶数据类型转换:1)Dim a,b,ca=inputbox("a是:","输入半径")b=Inputbox("b是:","输入半径")c=a*2+b*2Msgbox(c)这个输入1、2时是62)Dim a,b,ca=inputbox("a是:","输入半径")b=Inputbox("b是:","输入半径")c=(a+b)*2Msgbox(c)这个输入1、2时是24为什么会不一样呢? 在数学上c=(a+b)*2 和 c=a*2+b*2是等价的, 在VBS中也是如此. 问题出在"+"上, 在VBS中, +不仅仅是加号的意思还表示把两个字符串连接起来, 例如"Hello"+"World"="HelloWorld" have you understood? 你还记得InoutBox函数的返回值吗? 是字符串! 这就看出问题了吧, 在编程中"1"不等于(<>)1, "1"是一个字符, 而1是一个数, 所以a,b都是字符串变量, "1"+"2"="12", 这就好像我们小时跟伙伴开玩笑问他们1+1=?一样, 我们总是笑着说"错啦,应该是11".但为什么, a可以*2却不发生错误呢? 这时VBS比较智能的一个表现, 如果这个字符串的内容是一个数且对他进行数学运算, 则把字符串强制转换成数参与运算如果字符串代表一个数, 但不参加数学运算, 而是参加字符串运算(合并)则当作字符串处理, 所以你看到a+b=12, 这时候a+b的结果是一个字符串, 当它要乘以2的时候就被强制转换成了数字12, 这样我就得到了结果24怎么修改这个程序呢? 我们需要用到另一个内建的函数:int, int函数的功能是将输入值转成整数值, 我们这样修改: c=(int(a)+int(b))*2四、循环结构for....nextdim i,jfor i=1 to 9for i=1 to 9str=str & i * j & " " '&是和并字符串的符号next '每个next对应一个fornext1)do..loop和exit do的用法2) while当表达式true的时候执行循环体,until反之3) for...next是计数循环, 每次执行计数器递加4) 嵌套循环的作用和写法 4.5) &用于连接字符串5) vbCrLf相当于键盘上的回车键五、数组定义:dim 数组名(元素数量), 这里大家要注意一点, 这里定义的元素数量总是比你要的要少一个, 因为一个数组的起点是0号数据而不是1, 所以大家一定要小心: 你需要10个数据, 就定义"9"。

WinCC 串口通信

WinCC 串口通信

WinCC串口通讯的研究与实现周谷鸣, 雷汝海,步园明中国矿业大学信电学院,徐州 (221008)E-mail:gumingzhou@摘要:本文讨论了在WinCC构筑的上位机监控系统中,通过计算机串口(COM口)从现场智能仪表采集数据的一种实现方法。

该方法采用Microsoft提供的串口通讯控件MScomm作为中间桥梁,在该控件的OnComm事件中使用WinCC脚本语言VBs编写程序,实现对数据采集,接收,处理和显示功能。

本文较为详细地介绍了Mscomm控件的各种主要性能属性,并通过模拟的现场仪表进行了调试,在模拟调试中解决了仪表发送数据和脚本运行速度不匹配的问题。

关键词:串口通讯,VBs,WinCC0 引言WinCC即Windows Ccontrol Center(视窗控制中心),是一个功能强大的全面开放的上位机监控系统,既可以用于小规模简单的过程监控,也可以用于复杂的工控领域[1] WinCC提供的全局脚本系统,使用户有了较大的编程空间。

但是西门子公司基于WinCC 运行系统的稳定性考虑,只提供了一部分驱动和硬件通讯。

所以在实际的工程应用中,往往会遇到许多WinCC没有提供驱动的硬件,用户必须自己写程序来控制这些硬件,还需要编写程序控制实时数据的归档与处理。

例如在WinCC中并没有集成METTLER TOLEDO(梅特勒-托利多)公司8530D称重显示仪表的串行通讯程序,因此需要开发新的串行通讯程序。

本文以付村矿装车系统为背景,开发了WinCC读取串口数据并显示的程序。

1 背景付村矿的装车系统主要包括若干给煤机、皮带运输机、卸料口及翻板、轨道衡和铁牛牵引绞车等,见图1所示:图1 付村矿装车系统图(部分)本文主要涉及图1中仪表与上位机WinCC的通讯,所以只画出了部分系统图。

图1中的仪表是METTLER TOLEDO(梅特勒-托利多)公司8530D称重显示仪表,提供了两个RS232串口。

现利用其中一个来连接打印机;另外一个即用来与上位机连接,经过相关编程使WinCC能准确读取串口数据并显示。

vb串口通讯代码

vb串口通讯代码

严重同意ZZJ1382的观点,可是在wincc里使用VBS还是还是很困难,不知道哪位能说明白一点。

下面是我在VB里的代码,已经测试过,可以读取串口数据,希望有一位高手帮忙研究在wincc中使用,谢谢!Dim SMSType As IntegerDim Senddata() As ByteDim Readsmsno As ByteSub opentestnote()wrap$ = Chr$(13) & Chr$(10)CommonDialog1.Filter = "text filer (*.txt)|*.txt"CommonDialog1.FileName = ""CommonDialog1.ShowOpen '使用通用对话框对象提示用户输入路径名'If Err = cdlCancel Then Exit SubIf CommonDialog1.FileName <> "" ThenForm1.MousePointer = 11Open CommonDialog1.FileName For Input As #1 '打开用户所指定的输入文件(Open...For Input)On Error GoTo toobig ' 处理所有可能发生的错误Do Until EOF(1) '复制过程直至达到文件尾(EOF)或者字符串空间全部被占满为止Line Input #1, lineoftext$ '将文件逐行复制到名为AllText$的字符串中(Line Input)alltext$ = alltext$ & lineoftext$ & wrap$ '在文本框中显示AllText$字符串,并提供滚动条'LoopClose #1Form1.MousePointer = 0Text3.Text = alltext$End IfGoTo nextfiletoobig:nextfile:End SubSub savetestnote()wrap$ = Chr$(13) & Chr$(10)CommonDialog1.Filter = "text filer (*.txt)|*.txt"CommonDialog1.ShowSave '使用通用对话框对象提示用户输入路径名If CommonDialog1.FileName <> "" ThenOpen CommonDialog1.FileName For Output As #3 'COPY到记录Print #3, Text1.TextClose #3End IfEnd SubSub cleartestnote()Form1.Text1.Text = ""End SubFunction ASCNUM(TXT As String) As Bytei = Asc(TXT)Select Case Asc(TXT)Case 48 ASCNUM = 0 Case 49 ASCNUM = 1 Case 50 ASCNUM = 2 Case 51 ASCNUM = 3 Case 52 ASCNUM = 4 Case 53 ASCNUM = 5 Case 54 ASCNUM = 6 Case 55 ASCNUM = 7 Case 56 ASCNUM = 8 Case 57 ASCNUM = 9Case 65ASCNUM = 10Case 66ASCNUM = 11Case 67ASCNUM = 12Case 68ASCNUM = 13Case 69ASCNUM = 14Case 70ASCNUM = 15Case ElseASCNUM = 16End SelectEnd FunctionPrivate Sub Cls_Click() frmProperties.Show vbModal End SubPrivate Sub Print_Click() Form1.Text1 = bufferEnd SubPrivate Sub Init_Click()sign = 0mPort = 1If MSComm1.PortOpen = False ThenMSComm1.Settings = "9600,n,8,1"MSComm1.PortOpen = TrueEnd IfMSComm1.OutBufferCount = 0MSComm1.InBufferCount = 0MSComm1.Output = Chr$(2) & Chr$(27) & "]R" & Chr$(3) MSComm1.Output = Chr$(2) & Chr$(27) & "ZB1" & Chr$(3)buffer = ""End SubPrivate Sub Form_Load()'设置串口Settings = GetSetting(App.Title, "属性", "设置", "") ' frmTerminal.MSComm1.Settings] If Settings <> "" Then MSComm1.Settings = SettingsIf Err ThenMsgBox Error$, 48Exit SubEnd IfElseMSComm1.Settings = "2400,N,8,1"End IfCommPort = GetSetting(App.Title, "属性", "通信端口", "") ' mPortIf CommPort <> "" ThenmPort = CommPortElsemPort = 1End IfHandshaking = GetSetting(App.Title, "属性", "握手", "") 'frmTerminal.MSComm1.HandshakingIf Handshaking <> "" ThenMSComm1.Handshaking = HandshakingIf Err ThenMsgBox Error$, 48Exit SubEnd IfElseMSComm1.Handshaking = 0End IfTHESMSTYPE = GetSetting(App.Title, "属性", "SMS", "") ' mPortIf THESMSTYPE <> "" ThenSMSType = Val(THESMSTYPE)ElseSMSType = 1End IfTHENUMBER = GetSetting(App.Title, "属性", "NUMBER", "") ' mPortIf THENUMBER <> "" ThenEnd IfReadsmsno = 1'显示状态栏With Form1.StatusBar1.Panels.Item(1).Text = "串口状态:" & "COM" & mPort & " Set=" & Form1.MSComm1.Settings & " " & Form1.MSComm1.PortOpenEnd WithEnd SubPrivate Sub mnuclear_Click()cleartestnoteEnd SubPrivate Sub mnuclrdistxt_Click()Form1.Text1.Text = ""End SubPrivate Sub mnucommopen_Click()MSComm1.PortOpen = Not MSComm1.PortOpenmnucommopen.Checked = MSComm1.PortOpenWith Form1.StatusBar1.Panels.Item(1).Text = "串口状态:" & "COM" & mPort & " Set=" & Form1.MSComm1.Settings & " " & Form1.MSComm1.PortOpenEnd WithEnd SubPrivate Sub mnucommseting_Click()frmProperties.Show vbModalEnd SubPrivate Sub mnuexit_Click()Unload MeEnd SubPrivate Sub mnuopen_Click()opentestnoteEnd SubPrivate Sub mnusave_Click()savetestnoteEnd SubPrivate Sub MSComm1_OnComm()Dim buffer() As ByteDim Bufferlength As IntegerSelect Case mEvent' Handle each event or error by placing' code below each case statement' 错误Case comEventBreak ' 收到Break。

基于WINCC平台的串口通讯

基于WINCC平台的串口通讯

基于WINCC平台的串口通讯
郭伟
【期刊名称】《起重运输机械》
【年(卷),期】2012(000)003
【摘要】介绍了计算机与称重显示仪表进行串口通讯的具体实现方法,并将该方法应用于马来西亚HDRI物料运输管理系统的开发.实践证明系统在实际应用中性能稳定,效果良好,系统程序的灵活性、可移植性强.
【总页数】3页(P69-71)
【作者】郭伟
【作者单位】桑德环境资源股份有限公司北京101102
【正文语种】中文
【中图分类】TH22:TP273
【相关文献】
1.基于WinCC和串口通讯的炉温监控系统设计 [J], 张新良;杜韶
2.基于DOS平台的多串口通讯的实现 [J], 宋刈非;张蕊
3.基于Proteus平台的32位单片机LPC2114虚拟串口通讯仿真 [J], 张勇
4.一种基于PC机串口通讯的短信平台方案 [J], 祁长兴
5.基于LabVIEW开发平台的单片机串口通讯系统设计 [J], 李梦;杨金月
因版权原因,仅展示原文概要,查看原文内容请购买。

WinCC中实现串行通讯的两种方法

WinCC中实现串行通讯的两种方法

在WinCC中实现串行通讯的两种方法概要:为了在WinCC组态软件中实现与串口的通讯,文中介绍了两种方法:一是在WinCC中调用VB编写好的串口通讯程序,进行数据交换,实现对串口的访问;二是在WinCC 图形编辑器中调用ActiveX控件MSComm,编写全局脚本VBS实现对串口的访问。

这两种方法很好地解决了组态工程师被WinCC所束缚的串行通讯操作限制问题,拓宽了工程师使用WinCC的灵活性,提高了组态效率。

In order to realize serial communication with ActiveX based on WinCC,two methods are described in this paper.The first method is divided into two steps.First,realize serial communication by programming in Visual Basic,and then call this executive program in WinCC to exchange data.The second method is calling the ActiveX control MSComm directly in the Graphics Designer of WinCC and programming in WinCC Global Scripts to realize serial communication.These two methods are good solutions to the limitations of serial communication operation in WinCC.By these ways,engineers can use WinCC more flexibly,thus improve their configuration efficiency.正文:引言WinCC即Windows Ccontrol Center(视窗控制中心),是一个功能强大的全面开放的上位机监控系统,既可以用于小规模简单的过程监控,也可以用于复杂的工控领域[1]。

用VisualBasic实现串口通信的三种方法

用VisualBasic实现串口通信的三种方法

2. 利用通信控件的实例
Sub Form1 —load ()
form1. show ′设置 COM1
comm1. commport = 1
comm1. Setting = " 9600 ,o ,8 ,1" ′波特率 : 9600 奇校验 ,8
位数据 ,1 位停止位
comm1. Inputlen = 0
一 、利用通信控件( MSCOMM) 完成串口通信
VB 提供了通信控件 MSCOMM,文件名为 MSCOMM. VBX。 该控件可设置串行通信的数据发送和接收 ,对串口状态及串 行通信的信息格式和协议进行设置 。在通信过程中可以触发 OnComm 事件 ,在该事件过程进行数据检验处理及检错 ,还可 以通过编程访问 CommEvent 属性来了解通信的情况 ,进行收 发数据的处理 。每个通信控件对应一个串口 ,如果要访问多 个通信口 ,则要设计多个通信控件 。
利用 VB 提供的这些功能 ,我们可以有三种方法完成串 口通信 。一种是用 VB 提供的具有强大功能的通信控件 ;另一 种方法是调用 WINDOWS API 函数 ,使用 WINDOWS 提供的 通信函数编写移植性强的应用程序 ;第三是利用文件的输 入/ 输出完成 ,该方法简便易行 ,但有一定的局限性 。
EofChar As String 3 1
·6 ·
参数 As 类型 ]) As 类型 在声明中 :DECLARE 表示声明 DLL 中的函数 ,当声明是
不具有返回值的过程时用 SUB 关键字 ,而如果调用的函数具 有返回值 ,则必须用 FUNCTION 关键字将其声明为函数并在 声明语句的最后用 AS 指明函数返回值的类型 。LIB 关键字表 示当前声明的过程或函数是库名所指定的库中函数而非 VB 本身的函数 。库名 ,就是对应动态链接库的名称 ,其中通信函 数在 USER 库中 。ByVal 关键字将原参数数据类型一一对应到 VB 类型中 。

Wincc V7.3 通过VBS 记录连接PLC的时刻以及断开PLC的时刻的方法

Wincc V7.3 通过VBS 记录连接PLC的时刻以及断开PLC的时刻的方法

Wincc V7.3 通过VBS 记录连接PLC的时刻以及断开PLC的时刻的方法今天看QQ群里面有网友问怎么记下WINCC和PLC连接上和断开的时刻,这个问题有点意思,以前没有留意过,这两个事件也的确重要,于是尝试着做了一下试验成功了。

1. PLC一侧的编程新建两个BOOL变量,比如说是M14.0和M14.1,梯形图如下:这样一来,M14.1应该一直为1.2. WINCC一侧的编程在wincc一侧,新建四个变量:status 外部变量,二进制类型地址M14.1 替换值0 断开连接时替换。

注意这个变量不能从AS-OS传输过来,那种传输过来的不能设置替换功能,设置替换值是为了让PLC与上位机断开连接能够改变WINCC变量值。

ConnStatus:内部变量,二进制类型,初始值为0ConnTime:内部变量日期时间类型,记录连接上的时刻DisConnTime:内部变量日期时间类型,记录断开的时刻新建一个VBS全局脚本,触发器设置为周期性1s,这个周期也可以长一点,减少系统负荷。

Option ExplicitFunction actionDim ConnStatus,Status,ConnTime,DisconnTimeSet ConnStatus=HMIRuntime.Tags("ConnStatus") '内部变量Set Status=HMIRuntime.Tags("Status")Set ConnTime=HMIRuntime.Tags("ConnTime")Set DisConnTime=HMIRuntime.Tags("DisConnTime")If ConnStatus.Read =0 And Status.read=1 Then '连接上了ConnTime.Write NowConnStatus.Write 1End IfIfConnStatus.Read =1 And Status.read=0 Then '连接断开了DisConnTime.Write NowConnStatus.Write 0End IfEnd FunctionWincc画面上添加两个输入输出框,连接ConnTime和DisConnTime变量,输入输出框显示类型为日期时间类型。

在WINCC中使用WinSock控件进行TCP_IP通讯的例程

在WINCC中使用WinSock控件进行TCP_IP通讯的例程

在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 版本2002SP3SIMATIC WinCC V6.2 SP2 ASIA‘SIMATIC STEP7 V5.4+SP5+HF3 ChineseTCP&UDP测试工具V1.02目的:使用WINCC用户程序作为客户端程序,与服务器通讯,通讯协议为标准TCP/IP协议,取得服务器发送过来的数据包,按数据包格式文本规定,解析数据包数据,并将相关数据显示在用户程序画面中。

一、WinSock控件介绍(以VB语言表述)1、WinSock控件的主要属性1) Protocol属性通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。

可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。

注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。

通过MSComm控件进行WINCC串口通讯总结

通过MSComm控件进行WINCC串口通讯总结

通过MSComm控件进行WINCC串口通讯总结目的:通过MSComm控件实现WINCC串口通讯(C脚本和VB脚本两种方式)测试环境:操作系统win7WINCC版本:V7.2帮助工具:串口调试工具ASPD虚拟串口工具测试WINCC组态画面:测试试验过程画面:1、通过VB实现串口通讯画面对象“打开画面”VB大事脚本:Sub OnOpen()Dim objMSComm, tagConnectionSet objMSComm = hmiRuntime.Screens("串口通讯VB版").ScreenItems("COM")Set tagConnection = HMIRuntime.Tags("tagConnection1")If objMSComm.PortOpen = False Then' Assign com port numbermport = 4objMSComm.Settings = "9600,N,8,1"objMSComm.RThreshold = 1objMSComm.SThreshold = 0objMSComm.InBufferCount = 0objMSComm.InputLen = 0objMSComm.PortOpen = TruetagConnection.Write (True)HMIRuntime.Trace("Port open." vbCrLf)ElseHMIRuntime.Trace("Port is already opened." vbCrLf)End IfEnd SubMSComm控件OnComm对象大事:Sub OnOpen()Dim objMSComm, tagConnectionSet objMSComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")Set tagConnection = HMIRuntime.Tags("tagConnection1")If objMSComm.PortOpen = False Then' Assign com port numbermport = 4objMSComm.Settings = "9600,N,8,1"objMSComm.RThreshold = 1objMSComm.SThreshold = 0objMSComm.InBufferCount = 0objMSComm.InputLen = 0objMSComm.PortOpen = TruetagConnection.Write (True)HMIRuntime.Trace("Port open." vbCrLf)ElseHMIRuntime.Trace("Port is already opened." vbCrLf)End IfEnd Sub“SEND按钮”鼠标左键按下大事:Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)Dim objMSCommDim strTemp,bufferHMIRuntime.Trace("Communication!" vbCrLf)Set objMsComm = HMIRuntime.Screens("串口通讯VB版").ScreenItems("COM")Set buffer = HMIRuntime.Tags("Buffer1")strTemp = buffer.ReadIf objMSComm.PortOpen = True ThenIf strTemp"" thenobjMSComm.Output=strTempEnd IfEnd IfEnd Sub2、通过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。

Wincc的VBS脚本使用演示教学

Wincc的VBS脚本使用演示教学
2)Dim a,b,c
a=inputbox("a是:","输入半径")
b=Inputbox("b是:","输入半径")
c=(a+b)*2
Msgbox(c)
这个输入1、2时是24
为什么会不一样呢?在数学上c=(a+b)*2和c=a*2+b*2是等价的,在VBS中也是如此.问题出在"+"上,在VBS中, +不仅仅是加号的意思还表示把两个字符串连接起来,例如"Hello"+"World"="HelloWorld" have you understood?你还记得InoutBox函数的返回值吗?是字符串!这就看出问题了吧,在编程中"1"不等于(<>)1, "1"是一个字符,而1是一个数,所以a,b都是字符串变量, "1"+"2"="12",这就好像我们小时跟伙伴开玩笑问他们1+1=?一样,我们总是笑着说"错啦,应该是11".但为什么, a可以*2却不发生错误呢?这时
call who(yname)
sub
who(cname)
msgbox("你好" & cname)
msgbox("感谢你阅读我的课程")
msgbox("这是基础部分的最后一课")
end sub
按钮翻转程序
Sub OnClick(Byval Item)
Dim tag1
Set tag1=HMIRuntime.Tags("Q02")

WINCC串口通讯例子

WINCC串口通讯例子

WINCC串口通讯2 原创该例子为本人第二个通讯例子,更多最新请关注博客/liuyeqinyueye WINCC是非常强大的一个软件,但是大多数功能我们都没有用到,对吧。

市面上关于WINCC 的书籍也不是很多同时也没有讲解更多的高级应用。

前段时间很多的网友问我串口通讯的问题,感觉大家都有很强烈的需求所以再次写一篇串口通讯的例子,这次采用全局脚本来进行控制。

这里我要说一下,WINCC虽然不是通用型的组态软件,但是它是能够和任何设备任何通讯协议进行通讯的。

有网友说老师教的WINCC只能和西门子产品这种观点是错误的。

不管是通用还是非通用的组态软件都会有至少一个接口和第三方设备进行通讯的接口。

通过WINCC的OPC就能够和大部分设备通讯。

再有就是WINCC是一个开放型的组态软件,有很多接口可以提供给第三方软件进行通讯。

虽然我这里讲解的只是串口,TCP/IP也是一样的道理。

如果我有时间会编写一个完成的MODBUS协议的通讯例子和TCP/IP的例子供大家参考实验准备:参考上一篇关于串口通讯的例子即可。

要实现全局脚本对串口的控制首先你需要了解如何使用全局脚本编辑器。

这里不进行讲解如何使用,我们直接上菜第一步先写一个动作脚本:该脚本不需要填写触发器,写好保存即可,因为当WINCC启动时会自动执行所有的脚本动作,该脚本实现功能是对串口控件的通讯参数进行赋值。

(提示,可以直接填写到控件参数也可以)Option ExplicitFunction action'=========用于初始化串口参数========================Dim scrDim comclSet scr=HMIRuntime.Screens("串口通讯")'绑定串口控件所在画面Set comcl=scr.ScreenItems("串口控件")'绑定串口控件(控件名本人由原来的控件1改为现在名,这里注意如果改了控件名务必停止WINCC运行然后在启动WINCC)mport=1' 设定端口comcl.settings="9600,n,8,1"' 设置波特率,无校验,8位数据位,1位停止位comcl.inputmode=1' 设定传输模式(文本为0,二进制为1)End Function以上脚本只是启动WINCC时候执行一次第二步写一个循环执行的脚本(发送数据)该脚本需要填写触发器,如果是一直需要通讯那么选用周期触发即可,触发时间自己定义。

在WinCC中实现串行通讯的两种方法

在WinCC中实现串行通讯的两种方法

在WinCC中实现串行通讯的两种方法0 引言WinCC即Windows Ccontrol Center(视窗控制中心),是一个功能强大的全面开放的上位机监控系统,既可以用于小规模简单的过程监控,也可以用于复杂的工控领域[1]。

WinCC提供了较大的用户编程空间。

WinCC提供内置的语言脚本,可以方便地控制每个程序对象。

通过OLE,其他应用程序可集成到过程画面上,并与WinCC交换相关数据。

采用面向工业的ActiveX控件,用户可以使用已完成的控件来实现复杂的管理与控制功能。

基于系统稳定性的考虑,WinCC提供的这些功能多数还是受限的。

WinCC提供硬件驱动的形式和硬件打交道,但是在实际的工程应用中,往往会用到许多WinCC没有提供驱动的硬件,用户必须自己写程序来控制这些硬件,还需要编写程序控制实时数据的归档与处理。

在WinCC中并没有集成其他公司的智能仪表的串行通讯程序,因此需要开发新的串行通讯程序。

本文介绍在WinCC中实现串行通讯的两种方法。

1 间接通讯自动控制系统中,上位机监控部分主要是用于动态流程画面监视、报警报表输出、趋势图分析等。

在这个系统中,利用WinCC对整个上位机系统进行组态设计,系统在正常工作时,上位机始终处于WinCC的运行环境中。

WinCC提供了OLE,DDE,ActiveX,OPC服务器和客户机等接口或控件,可以很方便地与其他应用程序交换数据。

由于计算机从串行接口接收的数据要与上位机中的WinCC建立连接,因而采用二进制文件形式作为中间桥梁,即将接收的数据按其数据格式存入二进制文件,然后在WinCC中从二进制文件中提取数据[5]。

该方案可分为两个阶段:首先,使用VB语言编写从串口中取数据的可执行程序,采用通讯控件MSComm实现。

通讯实现程序如图1所示。

然后,在WinCC中,调用从串口中取数据的可执行程序,将采集的数据写入二进制文件;将数据从二进制文件中一一取出,赋给WinCC中相应的内部变量标签。

在Wincc中通过VBS调用VB语言编写的DLL

在Wincc中通过VBS调用VB语言编写的DLL

VBS作为一种脚本语言有其局限性,同VB等高级语言比起来,其底层开发能力尤为弱小。

但是,VBS和VB是小弟与大哥的关系。

小弟有事情摆平不了,当然要请求大哥帮助,大哥的能力与作用将在这时展现出来。

动态数据链接库就提供了这样的一个机制,当有难题VBS解决不了的时候,我们可以通过把这个难题交给高级语言,然后在高级语言中生成动态链接库(DLL)来供其他语言调用。

这让我想到了上篇关于VBS编写读串口通讯的那篇文章,里面的某些函数和方法完全可以通过在VB脚本中来编写,然后生成DLL工Wincc调用。

下面来整理一下我的设计思路:
1.在VB中编写程序并声成DLL文件
首先,通过VB6.0新建一个ActiveX DLL项目,将工程名称改为“project”,类名改为“testdll”。

然后新建一个功能“output”,输入以下内容。

保存项目。

在文件菜单下选择“生成project.dll文件”。

保存路径为D:\Work space\VB_DLL
2.将DLL文件添加到注册列表
“开始”——“运行”——“cmd”切换到D:\Work space\VB_DLL,输入regsvr32 project.dll。

此时,会弹出下列对话框,说明注册成功。

3.编写Wincc侧的VBS程序,激活并测试
在Wincc中新建一个按钮并在单击事件中编写如下代码。

激活Wincc项目。

单击“DLL测试”按钮,弹出对话框,说明调用成功。

WinCC 通过VBS脚本进行串口通讯

WinCC 通过VBS脚本进行串口通讯

WinCC 通过VBS脚本进行串口通讯一、打开端口Sub OnClick(Byval Item)Dim objMSComm1, tagConnectionSet objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1") Set tagConnection = HMIRuntime.Tags("Connection")If objMSComm1.PortOpen = False Then' Assign com port numbermport = 1' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - StopbitobjMSComm1.Settings = "9600,N,8,1"objMSComm1.RThreshold = 1objMSComm1.SThreshold = 1objMSComm1.InputLen = 0objMSComm1.PortOpen = TruetagConnection.Write(True)HMIRuntime.Trace("Port open." & vbCrLf)ElseHMIRuntime.Trace("Port is already opened." & vbCrLf)End IfEnd Sub二、读BufferOption ExplicitFunction actionDim strBuffer, strTempDim objMSComm1, tagBufferSet objMsComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1") Set tagBuffer = HMIRuntime.Tags("Buffer")strTemp = ""If objMSComm1.PortOpen = True Then'read the bufferstrTemp = CStr(objMSComm1.Input)If strTemp <> "" Then'checking for the delimited characterIf InStr(strTemp, Chr(6)) ThenstrBuffer = Left(strTemp,Len(strTemp)-1)ElsestrBuffer = strTempEnd IftagBuffer.Value = strBuffertagBuffer.WriteEnd IfElseHMIRuntime.Trace("No port is opened!" & vbCrLf)End IfEnd Function三、发送数据Sub OnClick(ByVal Item)Dim tagOutput, objMSComm1Set tagOutput = HMIRuntime.Tags("Output")Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1")If objMSComm1.PortOpen = True ThentagOutput.ReadobjMSComm1.Output = tagOutput.ValuetagOutput.Write("")ElseHMIRuntime.Trace("No port is opened!" & vbCrLf)End IfEnd Sub四、关闭端口Sub OnClick(Byval Item)Dim objMSComm1, tagConnectionSet objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1") Set tagConnection = HMIRuntime.Tags("Connection")If objMSComm1.PortOpen = True ThenobjMSComm1.PortOpen = FalsetagConnection.Write(False)HMIRuntime.Trace("Port close." & vbCrLf)End IfEnd Sub。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WinCC 通过VBS脚本进行串口通讯
一、打开端口
Sub OnClick(Byval Item)
Dim objMSComm1, tagConnection
Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1") Set tagConnection = HMIRuntime.Tags("Connection")
If objMSComm1.PortOpen = False Then
' Assign com port number
mport = 1
' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit
objMSComm1.Settings = "9600,N,8,1"
objMSComm1.RThreshold = 1
objMSComm1.SThreshold = 1
objMSComm1.InputLen = 0
objMSComm1.PortOpen = True
tagConnection.Write(True)
HMIRuntime.Trace("Port open." & vbCrLf)
Else
HMIRuntime.Trace("Port is already opened." & vbCrLf)
End If
End Sub
二、读Buffer
Option Explicit
Function action
Dim strBuffer, strTemp
Dim objMSComm1, tagBuffer
Set objMsComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1") Set tagBuffer = HMIRuntime.Tags("Buffer")
strTemp = ""
If objMSComm1.PortOpen = True Then
'read the buffer
strTemp = CStr(objMSComm1.Input)
If strTemp <> "" Then
'checking for the delimited character
If InStr(strTemp, Chr(6)) Then
strBuffer = Left(strTemp,Len(strTemp)-1)
Else
strBuffer = strTemp
End If
tagBuffer.Value = strBuffer
tagBuffer.Write
End If
Else
HMIRuntime.Trace("No port is opened!" & vbCrLf)
End If
End Function
三、发送数据
Sub OnClick(ByVal Item)
Dim tagOutput, objMSComm1
Set tagOutput = HMIRuntime.Tags("Output")
Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1")
If objMSComm1.PortOpen = True Then
tagOutput.Read
objMSComm1.Output = tagOutput.Value
tagOutput.Write("")
Else
HMIRuntime.Trace("No port is opened!" & vbCrLf)
End If
End Sub
四、关闭端口
Sub OnClick(Byval Item)
Dim objMSComm1, tagConnection
Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1") Set tagConnection = HMIRuntime.Tags("Connection")
If objMSComm1.PortOpen = True Then
objMSComm1.PortOpen = False
tagConnection.Write(False)
HMIRuntime.Trace("Port close." & vbCrLf)
End If
End Sub。

相关文档
最新文档