1、文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdf版本 日期 作者 校对 批准 说明0技术总结C 脚本获得操作记录的方法文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdf目录 1 应用范围 .31.1 详述 31.2 适用的系统 .32 硬、软件配置 .33 解决方法 .4附件附件 文档号 说明文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdf1 应用范围1.1 详述在生产中,有很多时候需要记录操作员的操作,以便进行事故分析。WINCC 本身提供了一些对象可
2、以产生操作记录,但是在复杂的情况下是无法兼顾既获得操作记录又满足特殊操作的要求。这时,可以使用 C 脚本来获得操作记录。目前,在 WINCC 中以下对象可以很方便地获得操作记录: 任何对象,将 EventDirect ConnectionOperator Input Message 选中。图 1 通过 DirectConnection 获得操作记录的组态 Check Box 对象和 Option Group 对象,将 propertyOperator Input Message 属性选择为 yes。图 2 Check Box 对象和 Option Group 对象获得操作记录的组态 IO Fi
3、eld 对象和 Slider 对象:将 propertyOperator Input Message 属性选择为 yes;或将propertyOperator Activities Report 属性选择为 yes。Operator Input Message 和 Operator Activities 文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdfReport 的区别是后者可以输入操作理由,确认之后操作记录的 Comment 中可以查看到操作理由。图 3 IO Field 对象和 Slider 对象获得操作记录的组态以上方法可以快捷地实现获取
4、操作记录的功能,但是在某些情况下,功能要求更复杂,通过以上方法并不能满足要求。比如:操作员操作一个启动按钮,要求系统能够记录操作员操作信息。在单步操作的情况下,通过 Direct Connection 能够很方便地实现这一功能。但是在两步操作的情况下,需要操作员先确认,在得到确认之后操作才能生效,由于 Direct Connection 并没有提供操作确认功能,显然通过 Direct Connection 并不能满足要求。在这一的情况下,可以考虑采用 C 脚本来实现这一功能,通过 MessageBox()函数来完成操作确认的功能,然后通过特别的函数来使系统产生操作记录。1.2 适用的系统 该方
5、法适用于安装有 WINCC 的系统中。2 硬、软件配置安装有 WINCC 软件,无版本限制。3 解决方法通过 C 脚本产生操作记录主要完成两部分组态工作,首先要在 Alarm Logging 中组态消息类型和定制消息内容;然后编写 C 脚本来产生操作记录。第一步:在 Alarm Logging 中组态消息类型和定制消息内容。1 新建消息并定义消息类型。系统产生的消息(包括了操作记录)和定制的消息都存储在 Alarm Logging 中,编号从 1000000 开始的消息为系统使用的消息,不能组态。如果需要定制消息,可以使用 11000000 之间的消息号。在 WINCC explorer 中打
6、开 Alarm Logging,新建一条消息,消息号为 1,打开该消息的属性对话框,如图 4 所示。在 Parameters 一栏中,将 Class 和 Type都选为 Operator Input Message,保留其余默认设置。文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdf图 4 消息的参数组态2 定制操作记录的内容。每条操作记录都在单独的消息行中显示,消息行的内容取决于选定的消息块,每个选定的消息块组成消息行中的一列。如图 5 所示,系统提供了三种不同类型的消息块: 系统块显示预定义的消息,如日期、时间、持续时间、注释; 用户文本块允许
7、最多为一条消息指定十个可定义文本,包含操作来源、操作内容、时间等信息。 过程值块:系统提供了十个过程值,通过过程值块可以在消息行中显示已定义的标签值。并非消息块中每一项都需要在消息中显示,可以在系统图形文件AlarmOperation.pdl 中进行定制。图 5 消息块类型通常,在进行事故分析时,需要了解操作日期、时间、操作来源以及操作内容。前面提到,系统块提供了操作日期和时间信息,只需要选中这两个选项,无需特别的组态。因此,定制操作记录只需要再对操作来源和操作内容进行组态就可以了。文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdf先来了解下通过
8、Direction Connection 产生的操作记录的内容,如图 6 所示:操作来源中显示的是变量名称,变量包含了工厂层级信息。操作内容中包含了用户名、新值和旧值的信息。变量名、用户名、新值和旧值可以从过程值块的变量中获得。先对过程值模块中 10 个过程值的用处作如表 1 中的定义:图 6 操作记录列表过程值 1 2 3 4 5 6 7 8 9 10用处 消息号变量的新值变量的旧值备用备用当前登录的用户名 变量名备用备用备用表 1 过程值块变量用处的定义在进行上述的定义之后,进入消息组态对话框,选择 Text 一栏,进行用户文本块的定义,如图 7 所示:图 7 用户文本块的组态用户文本块中
9、的内容可以手动输入,也可以通过点击右边的 进入文本组态对话框进行消息格式的组态,如图 8 所示:文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdf图 8 用户文本块中输出格式的组态到这里,我们就完成了在 Alarm Logging 中操作记录的组态工作,接下来就要进行 C 脚本的编写了。第二步:编写 C 脚本。C 脚本中要做的工作主要有分两步,先是进行变量的赋值,然后再创建消息。1 变量的赋值。在触发消息的事件(如按钮的鼠标左键释放事件)的 C 脚本中定义变量并给变量赋值,根据表 1 中的定义,需要定义两个数组,一个是数值类型为 Double,另一
10、个数值类型为字符指针,前者用于存放消息号、变量的新值和旧值,后者用于存放当前登录的用户名和变量名。以下是按钮鼠标释放事件的 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
11、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 dValue5 = 0,0,0,0,0; /定义 double 型数组,对应过程值块的前 5 个变量char* lpszVal5 = “,“,“,“,“; /定义字符指针数组,对应过程值块的后 5 个变量/确认操作文档号 版本 日期 页数b
12、44213edb000a26dda4c618ca4eb4103.pdfRetMsg = MessageBox (NULL, “确定要启动吗?“, “启动确认“, MB_OKCANCEL);if (RetMsg=IDOK)/获取旧值、赋予新值iOldValue=GetTagBit(Var); SetTagBitWait(Var,(WORD)iNewValue);/将用户名、变量名、消息号、新值和旧值放到定义的数组中lpszVal0 = GetTagCharWait(Apc_CurrentUserName); lpszVal1 =Var; dValue0 = nMsgNr; dValue1 = i
13、NewValue;dValue2 = 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* lpsz
14、PictureName, int nMsgNr,double dValue5,char* lpszVal5)BOOL bOkay;CMN_ERROR Error;MSG_RTDATA_INSTANCECOMMENT_STRUCT MsgCreate;/定义为消息到达MsgCreate.dwMsgState = MSG_STATE_COME; /赋消息号给将要创建的消息MsgCreate.dwMsgNr = nMsgNr; /定义用到了过程值块中的哪些过程值MsgCreate.wPValueUsed = 0x001F; /定义用到了用户文本块中的哪些选项MsgCreate.wTextValueU
15、sed = 0x03E0;/ 拷贝数值到消息块的过程值中MsgCreate.dPValue0 = dValue0; / 1%x ; x can be replaced by d,fMsgCreate.dPValue1 = dValue1; / 2%x ; x can be replaced by d,fMsgCreate.dPValue2 = dValue2; / 3%x ; x can be replaced by d,fMsgCreate.dPValue3 = dValue3; / 4%x ; x can be replaced by d,fMsgCreate.dPValue4 = dVa
16、lue4; / 5%x ; x can be replaced by d,fstrcpy(MsgCreate.mtTextValue5.szText, lpszVal0); / 6%s strcpy(MsgCreate.mtTextValue6.szText, lpszVal1); / 7%s strcpy(MsgCreate.mtTextValue7.szText, lpszVal2); / 8%s strcpy(MsgCreate.mtTextValue8.szText, lpszVal3); / 9%s strcpy(MsgCreate.mtTextValue9.szText, lpszVal4); / 10%s / 发送消息到 Alarm Logging文档号 版本 日期 页数b44213edb000a26dda4c618ca4eb4103.pdfbOkay = MSRTCreateMsgInstanceWithComment(0,if (!bOkay)printf(“MSRTCreateMsgInstanceWithComment szErrorText = %s rn“,Error.szErrorText );后记:通过 C 脚本不仅可以产生操作记录,也可以产生报警记录、日志记录,只需要在 Alarm Logging中将消息类型改成对应的类型。