在WINCC项目中,有两个场景经常会遇到。首先说说第一个场景:“某个关键的设备在运行过程中不能随便停止或者已经停止运行的设备不能随便启动。”这种场景下,特别是在远程HMI操作的时候,必须要考虑到人为的误操作(鼠标误点击)将“启动”或者“停止”的控制按钮或者开关选中而发出“误指令”。第二个场景:“工艺控制过程中的某个关键参数值在正常生产过程中必须设定在合理的范围内,如果参数设定有误将对生产工况或者产品质量造成严重影响。”
针对以上场景,通过WINCC的脚本功能对HMI的指令控件采用“操作授权”和“二次确认”等特殊措施进行处理。
1、设备启动/停止指令的操作授权

1.1在需要增加操作授权的指令控件旁边增加一个复选框控件并命名为操作授权。在复选框事件中添加C脚本动作:
#include "apdefap.h"
void OnPropertyChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, long value)
{
#pragma option(mbcs)
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
switch(value)
{
case 1:
SetTagBit("enable",1); //Return-Type: BOOL
break;
case 0:
SetTagBit("enable",0); //Return-Type: BOOL
break;
}
// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
}


1.2修改原指令控件属性,在“允许控制员控制”动态对话框中关联变量“enable”,用于使能控制是否允许操作员控制。

1.3修改原指令控件的鼠标操作事件,增加操作变更警告弹窗脚本代码。

弹窗脚本代码:
#include "apdefap.h"
void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)
{
#pragma option(mbcs)
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
#pragma option(mbcs);
#pragma code("Kernel32.dll");
void Sleep(int Milliseconds);
#pragma code()
int ZW,i;
ZW= MessageBox(NULL,"你确定启动吗?","警告",MB_YESNO|MB_SETFOREGROUND|MB_SYSTEMMODAL);
if (ZW==IDYES)
{SetTagBit("Pump1",1); //“Pump1”plc中的BOOL变量
Sleep(5000); // 确认之后的复位时间5S
SetTagBit("Pump1",0);}
else
{SetTagBit("Pump1",0);
}
// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
}

2、工艺参数变更输入的二次确认

2.1在原参数设置输入输出域增加“DisplayValue”和“TempValue”两个数据。

2.2修改参数设置输入输出域的键盘操作事件,增加数值变更二次弹窗脚本代码。

二次确认弹窗脚本代码:
#include "apdefap.h"
void OnKeyUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nChar, UINT nRepCnt, UINT nFlags)
{
#pragma option(mbcs)
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
int TempValue=GetTagWord("TempValue");
char szBuffer[20];
sprintf( szBuffer,"Input number:%d",TempValue);
if ( nChar==13 )//if press enter
{
int xRet = MessageBox(NULL,szBuffer," 确认窗口",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL);//message
if ( xRet == IDYES )//confirm operate
{
SetTagWord("DisplayValue",TempValue);// set data
}
}
// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
}

以上是WINCC项目在生产现场实际应用过程中经常遇到的两个非常普遍的应用场景。是实际应用过程中发生过非常多的人为误操作导致生产、设备事故教训后而不得不采取的“特殊措施”。虽然看起来显得非常繁琐,但是对于避免人为因素引发的事故却非常必要!