WINCC中使用C脚本获得操作记录的方法(原创)
Wincc画面制作中C脚本的应用分析
Wincc画面制作中C脚本的应用分析简介本文档旨在分析Wincc画面制作中C脚本的应用。
Wincc是一款用于监控和控制系统的软件,而C脚本是一种编程语言,用于在Wincc中实现自定义功能和逻辑。
C脚本的优势C脚本在Wincc画面制作中具有以下优势:1. 灵活性:C脚本可以通过编程实现各种复杂的逻辑和功能,使得用户能够根据自己的需求进行定制。
2. 功能丰富:C脚本提供了丰富的函数和方法,可以实现数据处理、图像操作、用户交互等各种功能。
3. 高效性:C脚本可以直接访问Wincc的内部对象和属性,因此可以快速地完成任务而无需额外的开发工作。
C脚本的应用场景C脚本在Wincc画面制作中可以应用于以下场景:1. 数据处理:通过C脚本可以对Wincc中的数据进行处理和转换,例如计算数据的平均值、最大值、最小值等。
2. 图像操作:C脚本可以实现图像的显示、隐藏、切换等操作,使得用户能够根据需要动态控制画面的内容。
3. 用户交互:C脚本可以响应用户的操作,例如点击按钮时执行特定的功能,弹出对话框等。
4. 报警处理:C脚本可以监测系统中的报警信息,并根据用户定义的逻辑进行相应的处理,例如发送邮件、生成报表等。
C脚本的注意事项在使用C脚本时,需要注意以下事项:1. 熟悉语法:了解C脚本的语法和基本概念是使用它的前提,只有掌握了基础知识才能更好地应用。
2. 错误处理:编写C脚本时要考虑到可能出现的错误情况,并进行合理的错误处理,以保证程序的稳定性和可靠性。
3. 代码维护:在编写C脚本时,要注重代码的可读性和可维护性,使用合适的命名和注释,方便后续的修改和调试工作。
结论C脚本在Wincc画面制作中具有广泛的应用,可以实现各种复杂的功能和逻辑。
在使用C脚本时,需要熟悉其语法和基本概念,并注意错误处理和代码维护,以提高程序的稳定性和可维护性。
通过充分发挥C脚本的优势,用户可以实现定制化的画面制作,并满足自己的特定需求。
Wincc画面制作---C脚本的使用
Wincc画面制作---C脚本的使用相关介绍,请参考我的百度文库其它文章:Step7及Wincc新手入门教程:介绍西门子Step7和Wincc通讯方法Wincc画面制作--窗口的使用:介绍画面切换及弹出框Wincc画面制作--动态变化:动态跟踪等Wincc画面制作—报警:WinccAlarmControl及语音报警本文介绍Wincc画面编辑使用的一些C脚本,相关框架都基于上述文章,这里不再赘述。
1.调用同一个窗口画面实现不同的指令功能例如现在有3个阀,对每个阀的操作都是打开关闭,我们新建一个窗口画面来实现此功能。
我们先新建一个画面ValveConfirm.PDL,添加两个按钮如下:在HMI3上添加2个阀及一个画面窗口,画面窗口连接到ValveConfirm.PDL如下:对画面窗口设置如下:名称为Confirm,写脚本需要设置打开的窗口可否移动,大小,边框,标题等连接画面ValveConfirm.PDL标题连接内部变量,实现动态变化创建3个内部变量如下,Valve_Name用于打开画面窗口的标题,Valve_Open用于阀打开指令,Valve_Close用于阀关闭指令。
再创建6个变量连接PLC,如下,Valve1OpnCmd, Valve1ClsCmd, Valve1Opned用于阀1打开指令,关闭指令以及打开反馈信号,同理对阀2建立变量。
对阀1添加鼠标事件:y=GetTop(lpszPictureName,lpszObjectName)+35; x=GetLeft(lpszPictureName,lpszObjectName)+15; SetTop(lpszPictureName,"Confirm",y);SetLeft(lpszPictureName,"Confirm",x); SetVisible(lpszPictureName,"Confirm",1); SetVisible(lpszPictureName,"Confirm",1);SetTagChar("Valve_Name","阀1");SetTagChar("Valve_Open","Valve1OpnCmd"); SetTagChar("Valve_Close","Valve1ClsCmd");此段代码调整弹出框的位置,我们让它弹出的位置在阀的下方在当前画面HMI3显示对象名称为”Confirm”的画面;对象名称”Confirm”连接的就是ValveConfirm.PDL画面把内部变量“Valve_Name”赋值为“阀1”把内部变量“Valve_Open”赋值为“Valve1OpnCmd”; “Valve_Close”赋值为“Valve1ClsCmd”同样的,对阀2添加鼠标事件:同样的,在对阀2操作时,我们就把内部变量“Valve_Name”赋值为“阀2”;内部变量“Valve_Open”赋值为“Valve2OpnCmd”;“Valve_Close”赋值为“Valve2ClsCmd”接下来对ValveConfirm.PDL上的打开关闭按钮添加鼠标事件:阀1打开按钮按左键C代码阀1打开按钮释放左键C代码SetTagBit(GetTagChar("Valve_Open"),1);这段代码是先获取“Valve_Open”的值,然后再把获取的值置1,因此当打开阀1时,获取的Valve_Open值就是Valve1OpnCmd,最终就是把Valve1OpnCmd置;当打开阀2时,获取的Valve_Open 值就是Valve2OpnCmd,最终就是把Valve2OpnCmd置1SetTagBit(GetTagChar("Valve_Open"),0);同上当打开阀1时,最终把Valve1OpnCmd置0;当打开阀2时,最终把Valve2OpnCmd置0,通过以上2行代码,实现点击按钮给PLC发一次打开脉冲指令同样对关闭按钮添加C代码:若打开阀1,把Valve1ClsCmd置1;若打开阀2,把Valve2ClsCmd置1;若打开阀1,把Valve1ClsCmd置0;若打开阀2,把Valve2ClsCmd置0;再对阀背景颜色连接变量,打开是显示绿色:这个是阀1连接的变量,阀2同样处理最后PLC 侧编写代码:画面效果如下:阀1打开关闭阀2打开关闭1.弹出框在阀图标的下方2.点击打开,程序中M3.0来了下脉冲,模拟的反馈信号M3.7置1,阀图标变绿色同样的,点击阀2,弹出框会显示在阀2图标的下方2. 对按钮做密码保护实现功能为点击按钮需在弹出框输入正确密码才能打开画面。
Wincc画面制作中C脚本的应用分析
Wincc画面制作中C脚本的应用分析Wincc是一种用于人机界面(HMI)开发的软件,它提供了丰富的功能和工具,以便于用户制作交互性强的画面。
在Wincc画面制作中,C脚本是一种常用的编程语言,用于实现画面的特定功能和逻辑。
1. C脚本的基本概念和语法C脚本是一种类似于C语言的编程语言,它具有简单易学的特点。
在Wincc画面制作中,C脚本用于处理各种事件和操作,例如按钮点击、数据读写、画面切换等。
C脚本的语法与C语言基本相同,包括变量声明、条件语句、循环语句、函数定义等。
通过使用C脚本,用户可以根据自己的需求编写特定的逻辑代码,实现画面的自定义功能。
2. C脚本在Wincc画面制作中的应用场景2.1 数据处理和计算在Wincc画面制作中,常常需要对实时数据进行处理和计算,例如计算平均值、最大值、最小值等。
通过使用C脚本,可以方便地实现这些功能,提高画面的实用性和可读性。
2.2 事件处理和交互操作用户在与画面进行交互时,往往需要对按钮点击、鼠标移动等事件进行处理。
通过使用C脚本,可以捕捉这些事件,并编写相应的逻辑代码,实现画面的交互操作。
2.3 画面切换和导航在复杂的画面系统中,用户可能需要进行画面之间的切换和导航。
通过使用C脚本,可以实现画面之间的跳转和导航,提高用户的操作效率和便捷性。
3. C脚本的优势和注意事项3.1 灵活性和可扩展性C脚本作为一种编程语言,具有很高的灵活性和可扩展性。
用户可以根据自己的需求编写特定的逻辑代码,实现画面的自定义功能。
3.2 需要一定的编程知识使用C脚本进行画面制作需要一定的编程知识和经验。
对于不熟悉编程的用户来说,和掌握C脚本可能需要一定的时间和精力投入。
3.3 注意安全性和稳定性在使用C脚本进行画面制作时,需要注意安全性和稳定性。
编写的代码应该经过充分的测试和验证,以确保其能够正常运行并不会对系统造成不良影响。
4. 结论C脚本在Wincc画面制作中具有广泛的应用,可以实现画面的自定义功能和逻辑。
wincc常用C脚本功能
.用户注销:#pragma code ("useadmin.dll")#include "PWRT_api.h"#pragma code()PWRTLogout();2.用户登录:#pragma code ("useadmin.dll")#include "PWRT_api.h"#pragma code()PWRTLogin('c');3.关闭项目并退出wincc:ExitWinCC ();4.退出运行到wincc资源管理器:DeactivateRTProject ();按钮变三种颜色#include "apdefap.h"long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName){#pragma option(mbcs)if(GetTagWord("TX/ZSH001")==1)return 0x0000ff00;elseif(GetTagWord("TX/ZSL001")==1)return 0x000000ff;elsereturn 0x00c0c0c0;}一个调用按钮变色#include "apdefap.h"long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName){#pragma option(mbcs)if(GetTagWord("NewTag")==0)return 0x0000ff00;elsereturn 0x00ffffff;}5.结束监控并关闭计算机(会弹出确认对话框)HWND hWnd = NULL;//Author:Smartsysint iRet;hWnd = FindWindow(NULL,"WinCC-运行系统- ");iRet=MessageBox(hWnd,"结束监控并关闭计算机","关闭操作站",MB_YESNO|MB_ICONWARNING|MB_APPLMODAL);if(iRet==IDYES)DMExitWinCCEx (DM_SDMODE_POWEROFF);6.点击事件弹出对话框,通过点击弹出对话框的确定和取消按钮实现对变量的置位或取消:int r;r=MessageBox(NULL, "YES为开,NO为关", "确定开命令:", MB_YESNO |MB_SYSTEMMODAL);if (r==IDYES)SetTagBit("TAGNAME",TRUE);elseSetTagBit("TAGNAME",FALSE);7.开显示关显示:(要在内部变量中建立三个二进制变量COLSE_DISPLAY、DISPLAY_NO和DISPLAY_COMMENT)// Funktion: Bit in Doppelwort setzen;if (GetTagBitWait("COLSE_DISPLAY")==1 ){SetTagBit("COLSE_DISPLAY",0);SetTagBit("DISPLAY_NO",0); //Return-Type: BOOL SetTagBit("DISPLAY_COMMENT",0);}else{SetTagBit("COLSE_DISPLAY",1);SetTagBit("DISPLAY_NO",1); //Return-Type: BOOL SetTagBit("DISPLAY_COMMENT",0);}8.开阀确认:BOOL a;a=GetTagBit("30T制水启动"); //Return-Type :short intif (a==0){if(MessageBox(NULL,"真的要启动制水吗?","操作提示",MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND|MB_ SYSTEMMODAL) == 6){ SetTagBit("30T制水启动",1);//Return-Type :BOOL}}else{if(MessageBox(NULL,"真的要停止制水吗?","操作提示",MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND|MB_ SYSTEMMODAL) == 6){ SetTagBit("30T制水停止",1);}}9.将WinCC运行画面最小化HWND WinCCHwnd;WinCCHwnd=FindWindow(NULL,"WinCC-Runtime - "); //如果运行语言为英文if (WinCCHwnd==0)WinCCHwnd=FindWindow(NULL,"WinCC-运行系统- "); //如果运行语言为中文CloseWindow(WinCCHwnd);10.显示或不显示(其中hiddVtext为内部的二进制变量)if(GetTagBit("hiddVtext")==0) //Return-Type: BOOL{SetTagBit("hiddVtext",TRUE); //Return-Type: BOOL//Return-Type: BOOL}else{SetTagBit("hiddVtext",FALSE);}10.打开编辑画面的脚本#pragma option(mbcs)#ifdef RUN_ON_WEBNAVIGATOR#elseHWND hExplorerWindow= NULL;HWND hRuntimeWindow= NULL;hExplorerWindow=FindWindow("WinCCExplorerFrameWndClass",NULL);hRuntimeWindow=FindWindow("PDLRTisAliveAndWaitsForYou",NULL);if(hExplorerWindow){ShowWindow(hExplorerWindow, SW_MINIMIZE); // This entry is only necessary for Windows 2000ShowWindow(hExplorerWindow,SW_SHOWNORMAL);SetForegroundWindow(hExplorerWindow);}elseprintf("rn SetForeground failed");#endif11.如何在WINCC中制作一个保持型按钮方法1:if( GetTagBit("M10") )SetTagBit("M10",0);elseSetTagBit("M10",1);方法2:SetTagBit("M1.0",(SHORT)!GetTagBit("M1.0"));求反指令,如果为1点击变为0,如果为0点击变为1方法3:或者做两个按钮,按钮一:显示,直接连接m1.0,是--不显示,否--显示。
WINCC中使用C脚本获得操作记录的方法(原创)
技术总结C脚本获得操作记录的方法版本日期作者校对批准说明0目录1应用范围 (3)1.1详述 (3)1.2适用的系统 (4)2硬、软件配置 (4)3解决方法 (4)附件附件文档号说明1 应用范围1.1 详述在生产中,有很多时候需要记录操作员的操作,以便进行事故分析。
WINCC本身提供了一些对象可以产生操作记录,但是在复杂的情况下是无法兼顾既获得操作记录又满足特殊操作的要求。
这时,可以使用C脚本来获得操作记录。
目前,在WINCC中以下对象可以很方便地获得操作记录:●任何对象,将Event\Direct Connection\Operator Input Message选中。
图1 通过DirectConnection获得操作记录的组态●Check Box对象和Option Group对象,将property\Operator Input Message属性选择为yes。
图2 Check Box对象和Option Group对象获得操作记录的组态●IO Field对象和Slider对象:将property\Operator Input Message属性选择为yes;或将property\Operator Activities Report属性选择为yes。
Operator Input Message和Operator ActivitiesReport的区别是后者可以输入操作理由,确认之后操作记录的Comment中可以查看到操作理由。
图3 IO Field对象和Slider对象获得操作记录的组态以上方法可以快捷地实现获取操作记录的功能,但是在某些情况下,功能要求更复杂,通过以上方法并不能满足要求。
比如:操作员操作一个启动按钮,要求系统能够记录操作员操作信息。
在单步操作的情况下,通过Direct Connection能够很方便地实现这一功能。
但是在两步操作的情况下,需要操作员先确认,在得到确认之后操作才能生效,由于Direct Connection并没有提供操作确认功能,显然通过Direct Connection并不能满足要求。
Wincc页面开发---C脚本的基础教程
Wincc页面开发---C脚本的基础教程本教程将向您介绍如何在Wincc页面开发中使用C脚本。
Wincc是一个用于监控和控制系统的优秀软件,它提供了丰富的功能和灵活的脚本支持。
通过使用C脚本,您可以扩展Wincc的功能,实现更复杂的数据处理和业务逻辑。
1. 准备工作在开始编写C脚本之前,请确保您已经安装了Wincc软件,并且熟悉Wincc的基本操作。
此外,您还需要具备一定的C语言编程基础。
2. C脚本概述C脚本是一种特殊的脚本语言,它可以嵌入到Wincc项目中,用于实现特定的功能。
C脚本具有较高的灵活性和可扩展性,可以处理各种数据类型和运算符,还可以调用Wincc提供的API接口。
3. 创建C脚本在Wincc中创建C脚本非常简单。
请按照以下步骤操作:1. 打开Wincc项目,选择一个合适的文件夹。
2. 在文件夹中右键单击,选择“新建”>“C脚本”。
3. 输入脚本名称,点击“确定”。
4. C脚本基本语法C脚本的基本语法与C语言类似,主要包括以下几个部分:1. 变量声明:用于声明变量及其数据类型,如int、float、char 等。
2. 运算符:包括算术运算符、关系运算符、逻辑运算符等。
3. 控制结构:包括if语句、for循环、while循环等。
4. 函数:用于实现特定功能的自定义函数。
5. 编写C脚本以下是一个简单的C脚本示例,用于实现一个简单的计算功能:include <stdio.h>int main() {int a, b, result;// 输入两个整数printf("请输入两个整数,用空格分隔:"); scanf("%d %d", &a, &b);// 计算两数之和result = a + b;// 输出结果printf("两数之和为:%d\n", result);return 0;}在这个示例中,我们使用C语言的标准输入输出库,实现了从用户那里获取两个整数,计算它们的和,并将结果输出到控制台。
Wincc视觉界面创建---C脚本的实战教程
Wincc视觉界面创建---C脚本的实战教程本教程旨在帮助用户了解如何使用Wincc视觉界面创建C脚本,以便实现数据的可视化和控制功能。
通过本教程的学习,用户将能够掌握Wincc视觉界面创建C脚本的基本方法和实战技巧。
1. Wincc视觉界面简介Wincc视觉界面是用于创建数据可视化和控制界面的工具,它提供了丰富的控件和功能,可以帮助用户快速构建复杂的监控和控制系统。
在Wincc视觉界面中,用户可以通过拖拽控件、设置属性、编写脚本等方式实现各种功能。
2. C脚本概述C脚本是Wincc视觉界面的重要组成部分,它使用C语言编写,可以实现复杂的数据处理和控制逻辑。
通过编写C脚本,用户可以自定义控件的行为、实现数据联动、执行定时任务等。
3. 创建C脚本工程在Wincc视觉界面中创建C脚本工程,需要遵循以下步骤:1. 打开Wincc视觉界面,创建一个新的项目。
2. 在项目中添加一个新的C脚本工程。
3. 双击工程文件,打开C脚本编辑器。
4. 编写C脚本在C脚本编辑器中,用户可以使用C语言编写脚本。
以下是一个简单的示例,实现了一个控件的显示和隐藏功能:// 导入头文件include "wincc.h"// 定义控件显示函数void ShowControl(int controlID) {// 获取控件句柄HWND hwndControl = GetDlgItem(hwnd, controlID);// 设置控件可见ShowWindow(hwndControl, SW_SHOW);}// 定义控件隐藏函数void HideControl(int controlID) {// 获取控件句柄HWND hwndControl = GetDlgItem(hwnd, controlID);// 设置控件不可见ShowWindow(hwndControl, SW_HIDE);}// 主函数int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {// 创建窗口CreateWindow(TEXT("对话框"), TEXT("示例窗口"),WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, NULL, NULL);// 添加控件CreateWindow(TEXT("按钮"), TEXT("显示"), WS_VISIBLE | WS_CHILD, 50, 50, 50, 30, NULL, (HMENU)1, NULL, NULL);CreateWindow(TEXT("按钮"), TEXT("隐藏"), WS_VISIBLE | WS_CHILD, 100, 50, 50, 30, NULL, (HMENU)2, NULL, NULL);// 注册消息处理函数MSG msg = {0};while (GetMessage(&msg, NULL, NULL, NULL)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}5. 编译和运行C脚本在编写完C脚本后,需要进行编译和运行。
【WinCC】使用VBS读取报警记录数据到EXCEL讲解
【WinCC】使用VBS读取报警记录数据到EXCEL1概述介绍如何在WinCC项目中使用VBS脚本读取报警记录归档数据,并把获取的数据保存成新的Excel文件。
2软件环境Windows XP SP3中文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 20073访问原理WinCC报警记录数据是以压缩的形式存储在数据库中,需要通过WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。
当使用OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。
连接字符串格式为“Provider=WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;”,其中:Catalog为WinCC运行数据库的名称,当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。
建议使用WinCC内部变量“@DatasourceNameRT”获得当前项目的Catalog。
Data Source 为服务器名称,格式为“<计算机名称>\WinCC”。
3.1 查询语句格式查询语句的格式要求如下:AlARMVIEW:SELECT * FROM [ WHERE……optional ]其中参数信息如下所示:ViewName:数据库表名。
必须用需要的语言指定该表。
比如:中文字符表名为:ALGVIEWCHT,英文字符表明为:ALGVIEWENU等。
Condition:为过滤标准。
详细说明请参见下表:表1查询参数表3.2查询结果查询结果作为记录集返回。
可以根据需要有选择的返回特定的数据集。
例如:oRs.Fields(0).Value 返回的是消息的编号;oRs.Fields(2).Value 返回的是消息的时间戳;oRs.Fields(37).Value返回的是消息文本的内容。
记录集的结构如下表所示:表2记录集结构表3记录集结构(续表)注意:WinCC的归档数据是使用UTC(协调世界时)时间保存的。
WINCC中使用C脚本获得操作记录的方法(原创)
目录1应用围 (3)1.1详述 (3)1.2适用的系统 (4)2硬、软件配置 (4)3解决方法 (4)附件附件文档号说明1 应用围1.1 详述在生产中,有很多时候需要记录操作员的操作,以便进行事故分析。
WINCC本身提供了一些对象可以产生操作记录,但是在复杂的情况下是无法兼顾既获得操作记录又满足特殊操作的要求。
这时,可以使用C脚本来获得操作记录。
目前,在WINCC中以下对象可以很方便地获得操作记录:●任何对象,将Event\Direct Connection\Operator Input Message选中。
图1 通过DirectConnection获得操作记录的组态●Check Box对象和Option Group对象,将property\Operator Input Message属性选择为yes。
图2 Check Box对象和Option Group对象获得操作记录的组态●IO Field对象和Slider对象:将property\Operator Input Message属性选择为yes;或将property\Operator Activities Report属性选择为yes。
Operator Input Message和Operator Activities Report的区别是后者可以输入操作理由,确认之后操作记录的Comment中可以查看到操作理由。
图3 IO Field对象和Slider对象获得操作记录的组态以上方法可以快捷地实现获取操作记录的功能,但是在某些情况下,功能要求更复杂,通过以上方法并不能满足要求。
比如:操作员操作一个启动按钮,要求系统能够记录操作员操作信息。
在单步操作的情况下,通过Direct Connection能够很方便地实现这一功能。
但是在两步操作的情况下,需要操作员先确认,在得到确认之后操作才能生效,由于Direct Connection并没有提供操作确认功能,显然通过Direct Connection并不能满足要求。
wincc如何用一个按钮记录上一次操作的数值。
wincc如何用一个按钮记录上一次操作的数
值。
wincc如何用一个按钮记录上一次操作的数值。
想用一个按钮记录一下上一次操作的数值,当点击该按钮时所有的参数全部返回上一次的操作。
举个例子,当前输入的数值是10,这时又从新输入了一个数为20,当点击一个按钮时该数值又变回了10。
如果不点击该按钮,当把20改为30,这时如果点击该按钮,数值又变回了20。
通过上述意思想实现的功能就是用该按钮记录上一值,只要点击该数值就能返回上一输入。
知道可以通过内部变量结合脚本实现。
在这里想问问有没有更好的方法。
最佳答案
一般修改数值都是用io域来完成的,假设io域1连接变量tag1,io域2连接变量tag2,io域1的事件--鼠标动作中vbs:hmiruntime.tags(“tag2”).writehmiruntime.tags(“tag1”).read
返回按钮中vbs:hmiruntime.tags(“tag1”).writehmiruntime.tags(“tag2”).read 运行后在io域1第二次输入新输入数据的时候,io域2
显示的就是第一次输入的数据,点击返回按钮则io域1显示io域2的数据。
没有比这个更好的办法了,只是变量多了可以用组的概念来处理,只是一个变量的处理。
Wincc画面生成技巧——C脚本详解
Wincc画面生成技巧——C脚本详解介绍本文档旨在详细解释Wincc画面生成中的C脚本技巧,帮助读者更好地理解和应用这些技术。
C脚本简介C脚本是Wincc中用于编写逻辑和功能的一种脚本语言。
通过使用C脚本,我们可以实现画面的自动化操作和控制。
C脚本技巧以下是一些C脚本技巧,可以帮助您在Wincc画面生成中更高效地编写代码:1. 变量使用:合理使用变量可以提高代码的可读性和可维护性。
在使用变量时,应注意变量的作用范围和命名规范。
变量使用:合理使用变量可以提高代码的可读性和可维护性。
在使用变量时,应注意变量的作用范围和命名规范。
2. 条件语句:使用条件语句可以根据不同的情况执行不同的操作。
常见的条件语句包括if语句和switch语句。
条件语句:使用条件语句可以根据不同的情况执行不同的操作。
常见的条件语句包括if语句和switch语句。
3. 循环语句:使用循环语句可以重复执行某段代码。
常见的循环语句有for循环和while循环。
循环语句:使用循环语句可以重复执行某段代码。
常见的循环语句有for循环和while循环。
4. 函数封装:将常用的代码封装成函数,可以提高代码的重用性和可维护性。
在编写函数时,应注意函数的输入参数和返回值。
函数封装:将常用的代码封装成函数,可以提高代码的重用性和可维护性。
在编写函数时,应注意函数的输入参数和返回值。
5. 错误处理:在编写代码时,应考虑可能出现的错误,并进行相应的错误处理。
可以使用try-catch语句来捕捉和处理异常。
错误处理:在编写代码时,应考虑可能出现的错误,并进行相应的错误处理。
可以使用try-catch语句来捕捉和处理异常。
6. 调试技巧:在编写代码时,应养成良好的调试惯,通过使用断点、打印变量值等方式来调试代码,以确保代码的正确性。
调试技巧:在编写代码时,应养成良好的调试习惯,通过使用断点、打印变量值等方式来调试代码,以确保代码的正确性。
7. 代码优化:在编写代码时,应尽量优化代码结构和算法,以提高代码的执行效率。
WinccV7.3 使用VBS脚本读取excel文件数值
WinccV7.3使用VBS脚本读取excel文件数值案例:wincc项目路径下有一个excel文件,数据表sheet1内容如下:现在我们需要把这个文件中的数据读取出来,显示在输入输出域当中,本例以读取R1C1和R2C2为例。
在wincc页面上放置两个输入输出域,名字分别为R1C1和R2C2,R1C1数据类型为字符串,R2C2数据类型为十进制数,页面上放置一个按钮,用于读取数据。
wincc新建一个内部变量path,用于存放excel文件的路径。
在wincc 页面打开事件中写入一下VBS脚本。
Sub OnOpen()Dim pathSet path=hmiruntime.Tags("path")path.write HMIRuntime.ActiveProject.Path & "\myxls.xlsx"End Sub在按钮的点击事件中写入以下脚本:Sub OnClick(Byval Item)Dim xlApp,xlBook,pathDim r1c1,r2c2Set r1c1=ScreenItems("r1c1")Set r2c2=ScreenItems("r2c2")path=HMIRuntime.Tags("path").ReadSet xlApp=CreateObject("excel.application")xlApp.Visible=FalsexlApp.Workbooks.Open pathxlApp.Worksheets("Sheet1").Activater1c1.outputvalue= xlApp.Worksheets("Sheet1").cells(1,1).valuer2c2.outputvalue= xlApp.Worksheets("Sheet1").cells(2,2).valuexlApp.Workbooks.ClosexlApp.QuitSet xlApp=NothingEnd Sub经测试可以实现需要的功能。
WINCC中使用C脚本获得操作记录方法
目录1应用范围 (3)1.1详述 (3)1.2适用的系统 (4)2硬、软件配置 (4)3解决方法 (4)附件附件文档号说明1 应用范围1.1 详述在生产中,有很多时候需要记录操作员的操作,以便进行事故分析。
WINCC本身提供了一些对象可以产生操作记录,但是在复杂的情况下是无法兼顾既获得操作记录又满足特殊操作的要求。
这时,可以使用C脚本来获得操作记录。
目前,在WINCC中以下对象可以很方便地获得操作记录:●任何对象,将Event\Direct Connection\Operator Input Message选中。
图1 通过DirectConnection获得操作记录的组态●Check Box对象和Option Group对象,将property\Operator Input Message属性选择为yes。
图2 Check Box对象和Option Group对象获得操作记录的组态●IO Field对象和Slider对象:将property\Operator Input Message属性选择为yes;或将property\Operator Activities Report属性选择为yes。
Operator Input Message和Operator Activities Report的区别是后者可以输入操作理由,确认之后操作记录的Comment中可以查看到操作理由。
图3 IO Field对象和Slider对象获得操作记录的组态以上方法可以快捷地实现获取操作记录的功能,但是在某些情况下,功能要求更复杂,通过以上方法并不能满足要求。
比如:操作员操作一个启动按钮,要求系统能够记录操作员操作信息。
在单步操作的情况下,通过Direct Connection能够很方便地实现这一功能。
但是在两步操作的情况下,需要操作员先确认,在得到确认之后操作才能生效,由于Direct Connection并没有提供操作确认功能,显然通过Direct Connection并不能满足要求。
WINCC 脚本初步使用ADO往数据表添加纪录
以前测试用使用vbs往数据表添加纪录,今天尝试着c脚本实现同样的功能,c语言不是太熟,磕磕绊绊测试了较长时间,总算是实现了功能。
假设在wincc附带的sql server管理器下的master数据库下有一个report表,表有flow1、flow2、flow3三个字段,数据库启用了sa用户。
由于仅仅是测试功能,所以也没有做太复杂的设计,脚本放在按钮里面如下:#include "apdefap.h"void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName){__object *cn, *rs;char *connstr="Provider = SQLOLEDB.1;password = sa;user id = sa;Initial Catalog =master;Data Source=ES\\wincc";char *sql="insert into Report(flow1,flow2,flow3) values(1,2,3) ";cn=__object_create("ADODB.Connection");rs=__object_create("ADODB.RecordSet");cn->open(connstr);if (cn->State == 0)// 为0表示连接数据库不成功MessageBox(NULL,"连接数据库失败!","警告",MB_OK);else{rs->Open(sql,cn);rs->Close;}if(cn->State != 0)cn->Close;}。
Wincc常用C脚本及常用功能
Wincc常用C脚本及常用功能打开用户管理器ProgramExecute("Passcs.exe"); 取消激活#include "apdefap.h"void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName,UINT nFlags, int x, int y){#pragma option(mbcs)HWND hwnd=NULL;int iRet;hwnd=FindWindow(NULL,"WinCC-运行系统 - "); //获得句柄iRet=MessageBox(hwnd,"是否取消激活?","Deactivate",MB_OKCANCEL|MB_ICONWARNING|MB_APPLMODAL);if(iRet==1)DeactivateRTProject (); //Return-Type: BOOL}关闭计算机#include "apdefap.h"void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName,UINT nFlags, int x, int y){#pragma option(mbcs)HWND hwnd=NULL;int iRet;hwnd=FindWindow(NULL,"WinCC-运行系统 - ");iRet=MessageBox(hwnd,"是否关闭计算机?","ShutDown",MB_OKCANCEL|MB_ICONWARNING|MB_APPLMODAL);if(iRet==1)DMExitWinCCEx(DM_SDMODE_SYSTEM); }==================================================================== ==登陆代码:#pragma code(“useadmin.dll”)#include <pwrt_api.h>#pragma code()PWRTLogin (…e?);==================================== 取消激活(Deactivate)DeactivateRTProject();====================================== Wincc变量操作GetTagDWord(“变量名称”); 获取Wincc变量值SetTagDWord(“变量“,设定值); 设置Wincc变量对文本读写操作写操作#include "apdefap.h"void OnLButtonUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName,UINT nFlags, int x, int y) {#pragma option(mbcs)FILE* lpFile;char *shuzhu[6]={"tag_1","tag_2","tag_3","tag_4","tag_5","tag_6"};char* lpszStr;int i,j;lpszStr=SysMalloc(60); //Return-Type: void*lpFile = fopen("D:\\test.txt", "w+");for(i=0;i<6;i++){lpszStr=GetTagChar(shuzhu[i]); strcat(lpszStr,"\r\n");if(lpFile == NULL){ printf("can not open file\r\n"); return;}fprintf(lpFile, lpszStr); }SysFree(lpszStr);fclose(lpFile);}读操作#include "apdefap.h"void OnLButtonUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName,UINT nFlags, int x, int y) {#pragma option(mbcs)char* shuzhu[6]={"tag_1","tag_2","tag_3","tag_4","tag_5","tag_6"}; char tmp[255];int i=0;int ChrNumLine=38;FILE *fp;fp=fopen("D:\\test.txt","r"); if (fp==NULL){return;}else{rewind(fp);while(!feof(fp)){fgets(tmp,ChrNumLine,fp);SetTagChar(shuzhu[i],tmp);i++;}}fclose(fp);}画面窗口显示界面切换SetPictureName(lpszPictureName,"PicWindow_button","produce_manage_bu tton.pdl");SetVisible(lpszPictureName,"PicWindow_button",1);注:PicWindow_button是画面窗口名称;produce_manage_button.pdl是要显示的子画面。
通过VBS脚本在ListView控件中显示WinCC的变量记录
表01关于WinCC连通性软件包的使用,请参考下面的帮助文档:374361592.实现方式总体思路介绍本文档通过调用WinCC OLE DB数据库接口驱动(需要WinCC连通性软件包的授权)来访问WinCC的变量归档,并在微软的ListView控件中显示归档数据。
程序结构如下所示:图1其中,自定义函数的说明如下表所示:表02具体代码见附件。
3.具体实现方法和代码3.1 创建到归档数据库的连接由于WinCC的变量归档为压缩数据,所以必须通过WinCC OLE DB来读取归档数据。
对于已经安装WinCC的计算机,不需要安装WinCC连通性软件包。
对于未安装WinCC的客户端,必须安装WinCC连通性软件包。
该软件包含在WinCC V7.0的安装光盘中。
数据库连接的脚本如下所示:'定义数据库连接变量Dim connSet conn = CreateObject("ADODB.Connection")'定义数据库查询脚本(可以根据需要自定义修改)Dim sSQLsSQL="Tag:R,'ProcessValueArchive\Tag1','0000-00-00 00:01:00.000','0000-00-00 00:00:00.000'"'通过调用自定义的数据库连接函数,建立与数据库的连接Dim oRsSet oRs= WinCCDataSourceAccess(conn,sSQL)其中,自定义的数据库连接函数WinCCDataSourceAccess(connObj,pSQL),参数connObj为连接对象(ADODB.Connection),参数pSQL为要执行的SQL查询语句,具体代码如下所示:Function WinCCDataSourceAccess(connObj,pSQL)'建立到数据库的连接On Error Resume Next'读取本地的WinCC运行数据库名称Dim DatasourceNameRT,DataConnectionNameSet DatasourceNameRT = HMIRuntime.Tags("@DatasourceNameRT")DatasourceNameRT.Read'定义数据库连接字符串Dim sPro, sDsn,sSersPro = "Provider=WinCCOLEDBProvider.1;"sDsn = "Catalog=" & DatasourceNameRT.Value & ";"sSer = "Data Source=.\WinCC"DataConnectionName = sPro + sDsn + sSer' 定义查询语句字符串Dim sSQLsSQL=pSQL'建立连接Dim oRs,oCom,connSet conn = CreateObject("ADODB.Connection")Set conn=connObjconn.ConnectionString = DataConnectionNameconn.CursorLocation = 3conn.Open' 创建查询的命令文本Set oRs = CreateObject("ADODB.Recordset")Set oCom = CreateObject("mand")mandType = 1Set oCom.ActiveConnection = connmandText=sSQL'执行查询Set oRs = oCom.Execute'返回结果Set WinCCDataSourceAccess=oRsIf err.number <> 0 ThenMsgBox "error Code" & Err.Number & "Source:" & Err.Source & "error description" & Err.Descriptionerr.clearEnd IfOn Error Go to 0End Function自定义函数的创建过程为:在WinCC项目管理器中右键点击全局脚本 打开VBS全局脚本编辑器 项目函数 新建函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WINCC中使用C脚本获得操作记录的方法(原创)目录1应用范围 (4)1.1详述 (4)1.2适用的系统 (5)2硬、软件配置 (5)3解决方法 (5)附件附件文档号说明1 应用范围1.1 详述在生产中,有很多时候需要记录操作员的操作,以便进行事故分析。
WINCC本身提供了一些对象可以产生操作记录,但是在复杂的情况下是无法兼顾既获得操作记录又满足特殊操作的要求。
这时,可以使用C脚本来获得操作记录。
目前,在WINCC中以下对象可以很方便地获得操作记录:●任何对象,将Event\Direct Connection\Operator Input Message选中。
图1 通过DirectConnection获得操作记录的组态●Check Box对象和Option Group对象,将property\Operator Input Message属性选择为yes。
图2 Check Box对象和Option Group对象获得操作记录的组态●IO Field对象和Slider对象:将property\Operator Input Message属性选择为yes;或将property\Operator Activities Report属性选择为yes。
Operator Input Message和Operator Activities Report的区别是后者可以输入操作理由,确认之后操作记录的Comment中可以查看到操作理由。
图3 IO Field对象和Slider对象获得操作记录的组态以上方法可以快捷地实现获取操作记录的功能,但是在某些情况下,功能要求更复杂,通过以上方法并不能满足要求。
比如:操作员操作一个启动按钮,要求系统能够记录操作员操作信息。
在单步操作的情况下,通过Direct Connection能够很方便地实现这一功能。
但是在两步操作的情况下,需要操作员先确认,在得到确认之后操作才能生效,由于Direct Connection并没有提供操作确认功能,显然通过Direct Connection并不能满足要求。
在这一的情况下,可以考虑采用C脚本来实现这一功能,通过MessageBox()函数来完成操作确认的功能,然后通过特别的函数来使系统产生操作记录。
1.2 适用的系统该方法适用于安装有WINCC的系统中。
2 硬、软件配置安装有WINCC软件,无版本限制。
3 解决方法通过C脚本产生操作记录主要完成两部分组态工作,首先要在Alarm Logging中组态消息类型和定制消息内容;然后编写C脚本来产生操作记录。
第一步:在Alarm Logging中组态消息类型和定制消息内容。
1.新建消息并定义消息类型。
系统产生的消息(包括了操作记录)和定制的消息都存储在Alarm Logging中,编号从1000000开始的消息为系统使用的消息,不能组态。
如果需要定制消息,可以使用1~1000000之间的消息号。
在WINCC explorer中打开Alarm Logging,新建一条消息,消息号为1,打开该消息的属性对话框,如图4所示。
在Parameters一栏中,将Class和Type都选为Operator Input Message,保留其余默认设置。
图4 消息的参数组态2.定制操作记录的内容。
每条操作记录都在单独的消息行中显示,消息行的内容取决于选定的消息块,每个选定的消息块组成消息行中的一列。
如图5所示,系统提供了三种不同类型的消息块:①系统块显示预定义的消息,如日期、时间、持续时间、注释…;②用户文本块允许最多为一条消息指定十个可定义文本,包含操作来源、操作内容、时间等信息。
③过程值块:系统提供了十个过程值,通过过程值块可以在消息行中显示已定义的标签值。
并非消息块中每一项都需要在消息中显示,可以在系统图形文件@AlarmOperation.pdl 中进行定制。
图5 消息块类型通常,在进行事故分析时,需要了解操作日期、时间、操作来源以及操作内容。
前面提到,系统块提供了操作日期和时间信息,只需要选中这两个选项,无需特别的组态。
因此,定制操作记录只需要再对操作来源和操作内容进行组态就可以了。
先来了解下通过Direction Connection产生的操作记录的内容,如图6所示:操作来源中显示的是变量名称,变量包含了工厂层级信息。
操作内容中包含了用户名、新值和旧值的信息。
变量名、用户名、新值和旧值可以从过程值块的变量中获得。
先对过程值模块中10个过程值的用处作如表1中的定义:图6 操作记录列表过程值 1 2 3 4 5 6 7 8 9 10用处消息号变量的新值变量的旧值备用备用当前登录的用户名变量名备用备用备用表1 过程值块变量用处的定义在进行上述的定义之后,进入消息组态对话框,选择Text一栏,进行用户文本块的定义,如图7所示:图7 用户文本块的组态用户文本块中的内容可以手动输入,也可以通过点击右边的进入文本组态对话框进行消息格式的组态,如图8所示:图8 用户文本块中输出格式的组态到这里,我们就完成了在Alarm Logging中操作记录的组态工作,接下来就要进行C脚本的编写了。
第二步:编写C脚本。
C脚本中要做的工作主要有分两步,先是进行变量的赋值,然后再创建消息。
1.变量的赋值。
在触发消息的事件(如按钮的鼠标左键释放事件)的C脚本中定义变量并给变量赋值,根据表1中的定义,需要定义两个数组,一个是数值类型为Double,另一个数值类型为字符指针,前者用于存放消息号、变量的新值和旧值,后者用于存放当前登录的用户名和变量名。
以下是按钮鼠标释放事件的C脚本程序。
***************************************************************************#include "apdefap.h"void OnLButtonUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y){// WINCC:TAGNAME_SECTION_START// syntax: #define TagNameInAction "DMTagName"// next TagID : 1#define Apc_CurrentUserName "@local::@CurrentUserName"#define Var "AS_FAR05_1107_2/HS_806B"// WINCC:TAGNAME_SECTION_END//定义消息号,并赋值int nMsgNr = 1;int iNewValue=1;int iOldValue;int RetMsg;double dValue[5] = {0,0,0,0,0}; //定义double型数组,对应过程值块的前5个变量char* lpszVal[5] = {"","","","",""}; //定义字符指针数组,对应过程值块的后5个变量//确认操作RetMsg = MessageBox (NULL, "确定要启动吗?", "启动确认", MB_OKCANCEL);if (RetMsg==IDOK){//获取旧值、赋予新值iOldValue=GetTagBit(Var);SetTagBitWait(Var,(WORD)iNewValue);//将用户名、变量名、消息号、新值和旧值放到定义的数组中lpszVal[0] = GetTagCharWait(Apc_CurrentUserName);lpszVal[1] =Var;dValue[0] = nMsgNr;dValue[1] = iNewValue;dValue[2] = iOldValue;//调用产生消息的函数OperationLog_V6(lpszPictureName,nMsgNr,dValue,lpszVal);}}************************************************************************************************2.创建消息。
消息创建函数需定义为全局脚本函数,主要将值传递给消息块的结构变量并创建消息。
以下是产生消息函数的C脚本。
***************************************************************************#ifndef RUN_ON_WEBNAVIGATOR#include "apdefap.h"#pragma code ("ssmrt.dll")#include "ssmrt.h"#pragma code ()#endifvoid OperationLog_V6(char* lpszPictureName, int nMsgNr,double dValue[5],char*lpszVal[5]){BOOL bOkay;CMN_ERROR Error;MSG_RTDATA_INSTANCECOMMENT_STRUCT MsgCreate;//定义为消息到达MsgCreate.dwMsgState = MSG_STATE_COME;//赋消息号给将要创建的消息MsgCreate.dwMsgNr = nMsgNr;//定义用到了过程值块中的哪些过程值MsgCreate.wPValueUsed = 0x001F;//定义用到了用户文本块中的哪些选项MsgCreate.wTextValueUsed = 0x03E0;// 拷贝数值到消息块的过程值中MsgCreate.dPValue[0] = dValue[0]; // @1%x@ ; x can be replaced by d,fMsgCreate.dPValue[1] = dValue[1]; // @2%x@ ; x can be replaced by d,fMsgCreate.dPValue[2] = dValue[2]; // @3%x@ ; x can be replaced by d,fMsgCreate.dPValue[3] = dValue[3]; // @4%x@ ; x can be replaced by d,fMsgCreate.dPValue[4] = dValue[4]; // @5%x@ ; x can be replaced by d,fstrcpy(MsgCreate.mtTextValue[5].szText, lpszVal[0]); // @6%s@strcpy(MsgCreate.mtTextValue[6].szText, lpszVal[1]); // @7%s@strcpy(MsgCreate.mtTextValue[7].szText, lpszVal[2]); // @8%s@strcpy(MsgCreate.mtTextValue[8].szText, lpszVal[3]); // @9%s@strcpy(MsgCreate.mtTextValue[9].szText, lpszVal[4]); // @10%s@// 发送消息到Alarm LoggingbOkay = MSRTCreateMsgInstanceWithComment(0,&MsgCreate,&Error);if (!bOkay)printf("MSRTCreateMsgInstanceWithComment szErrorText = %s \r\n",Error.szErrorText );}后记:通过C脚本不仅可以产生操作记录,也可以产生报警记录、日志记录,只需要在Alarm Logging 中将消息类型改成对应的类型。