找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
小程序查看
手机扫码追踪该问题
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
以下可做参考:
如何实现用户登陆日志(wincc中用c脚本实现?)( 柳树成林原创)
用户登陆日志:(包括用户的登陆退出信息,以便查询在什么时间段是哪个用户在使用这个监控软件)
#i nclude "apdefap.h"
int gscAction( void )
{
#pragma code("kernel32.dll")
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code()
char* username;
char buf[128];
static char preuser[128];
unsigned a,b,c,d,e,f;
FILE* fp;
SYSTEMTIME sysTime;
//读取系统时间,并且复制给变量a,b,c,d,e,f
GetLocalTime(&sysTime);
a=sysTime.wHour;
b=sysTime.wMinute;
c=sysTime.wSecond;
f=sysTime.wYear;
e=sysTime.wMonth;
d=sysTime.wDay;
//得到当前用户名称
username = GetTagChar("@CurrentUser");
fp= fopen("c:\\wincclog.txt", "a+");
if(strcmp(username, preuser)!=0) //如果当前用户名称和前一个用户名不同
{
if((strcmp(username, "") != 0)&&(strcmp(preuser, "") == 0)) //如果当前用户名称不空同时前一个用户名为空
{
sprintf(buf, "用户:%s\t登陆时间是:\t %d-%d-%d,%d-%d-%d\n", username,a,b,c,d,e,f);
fputs(buf, fp);
}
else
{
if((strcmp(username, "") == 0)&&(strcmp(preuser, "") != 0)) //如果当前用户名称为空同时前一个用户名不空
{
sprintf(buf, "用户:%s\t退出时间是:\t %d-%d-%d,%d-%d-%d\n", preuser,a,b,c,d,e,f);
fputs(buf, fp);
}
else
{
sprintf(buf, "用户:%s\t退出时间是:\t %d-%d-%d,%d-%d-%d\n", preuser,a,b,c,d,e,f);
fputs(buf, fp);
sprintf(buf, "用户:%s\t登陆时间是:\t %d-%d-%d,%d-%d-%d\n", username,a,b,c,d,e,f);
fputs(buf, fp);
}
}
}
strcpy(preuser, username);
fclose(fp);
return 0;
}
准备信息:
使用 WinCC Audit 选件不需要过多的组态便可以实现在 Audit Trail 中获得操作员输入消息。那么对于整个工厂通过 WinCC 客户端/服务器(非 WebNavigator 客户端/服务器)的项目画面可以使操作员输入消息集中显示在 Audit Trail 中。Audit Trail 被保护以防止修改。
此外,在项目设计中的修改也能够在 Audit Trail 中记录。WinCC Audit 选件是相应配套发布的标准 WinCC 选件。
说明:
Operator inputs are generated automatically in WinCC by using the I/O fields 如果在组态 I/O 域时已将“Operator Input”属性设置为“Yes”,通过使用 I/O 域会在 WinCC 中自动生成操作员输入消息。
本条目展示如何使用 WinCC 选件“WinCC Open Development Kit”(ODK) 生成用户自定义的操作员输入消息。例如可能在按钮按下时需要生成一条操作员输入消息。在本条目中的 C 函数使用的是在 WinCC V6.0 SP3 和更高版本中的 ODK 函数。与此相反,条目 ID 218555 使用的是也可在 WinCC 早期版本中实现的 ODK 函数。有关 ODK 的信息可在条目 ID 9652128 中获得。
注意,关于操作员输入消息可在 WinCC 在线帮助“WinCC Information System > Working with WinCC > Setting Up an Alarm System > Alarm Logging in WinCC”中获得。
下表描述了如何组态用户自定义的操作员输入消息。在本条目中假定使用了 WinCC OS project editor。 对于 OS project editor 生成的画面(消息窗口)不必进行任何修改。用户自定义的操作员输入消息显示在消息窗口的“operation list”中。
步骤 描述
1 在报警记录中组态操作员输入消息
打开报警记录编辑器创建一个消息类别“Operator Input Message”的消息。为消息任意选择一个编号。在本例中将使用消息编号“1001”。
Fig. 01
在“Text”选项卡中设置那些在运行时显示的用户文本块参数。在本例中过程值块 1 到5 的值以文本显示在用户文本块 1 到 5 中。
Fig. 02
这里仅将过程值块分配给用户文本块。过程值块的实际设置是在运行时通过函数“MSRTCreateMsgInstanceWithComment()”完成的(见步骤 2)。
注意:
原则上也可使用消息编号“12508141”的内部消息生成操作员输入消息。因此完全不需要本组态步骤。可是,消息编号“12508141”的操作员输入消息的结构是预先定义不可更改的。操作前的数值(原有数值) 显示在过程值块_2 中而更改后的数值(新数值)显示在过程值块_3 中。包含已登录用户名的用户文本块_3 和用户文本块_5 跟随着新数值和原有数值。
2 编写生成操作员输入消息的函数
下列下载包含文件“isalg_operationlog.fct”。
WinCC_OperationLog.zip ( 7 KB )
拷贝文件到 WinCC 项目目录中的“library”目录中。打开“Global Script C”编辑器并执行“Tools > Regenerate Header”菜单命令。然后“ISALG_OperationLog()”函数可作为项目函数使用。
为了生成在运行时的操作员输入消息同样必须在客户端的 WinCC 项目(多客户)中执行这一步骤。
注意:
“ISALG_OperationLog()”函数的结构描述如下。
INIT_MESSAGE_STRUCT
在这部分中填写结构“MsgCreateEx”用于生成消息。“GetLocalTime()”函数获取本地计算机时间。“GetComputerNameA()”函数获取计算机名。“PWRTGetCurrentUser()”函数获取当前登录的 WinCC 用户名。在这部分中对于作为文本值的过程值块 1 到 5 的有效性及初始化函数检查传输参数。
Process value block_1
参数 pszSource
在“pszSource”参数中能够传输消息来源(例如,变量名称或测量点名称) 到操作员输入消息。如果使用这个参数(数值不能等于零),此文本显示在消息的过程值块_1 中。
Process value block_2
参数 pszArea
在参数“pszArea”中可以传递区域(例如系统区域或子系统)到操作员输入消息。如果使用这个参数(数值不能等于零),此文本显示在消息的过程值块_2 中。
Process value block, Process value block_5
参数 pszEvent, fOld, fNew, pszUnit
在参数“pszEvent”中可以传递一个事件文本(例如“Specify setpoint value”或“Motor ON”)到操作员输入消息。在参数“fOld"”中可以传递操作前的数值以及在参数“fNew”中修改后的数值。在参数“pszUnit”中可以传递度量单位。这个数据以及计算机名和用户名显示在消息的过程值块_3 和过程值块_5 中。
Process value block_4
参数 pszBatch
在参数“pszBatch”中可以传递批次名称到操作员输入消息。 此文本显示在消息的过程值块_4 中。
START_MESSAGE_SERVICE
在这个部分“MSRTStartMsgService()”函数被调用。
注意:
如果“MSRTStartMsgService()”函数在客户端(多客户)上使用,操作员输入消息会输出到所组态的标准服务器上。如果没有组态标准服务器,函数调用失败。为了组态标准服务器在 WinCC 浏览器的项目树中右键点击“Server data”条目。然后在弹出的菜单中打开选择“Standard server...”条目。分配期望的 WinCC 服务器符号计算机名给报警记录(报警组件)。可用的符号计算机名的服务器数据可被倒入。
CREATE_MESSAGE_INSTANCE
在这部分“MSRTCreateMsgInstanceWithComment()”函数被调用。
STOP_MESSAGE_SERVICE
在这部分“MSRTStopMsgService()”函数被调用。
函数包含“printf()”语句,可在运行时的全局脚本诊断窗口或在 APDIAG “Output Window”中生成诊断消息。
3 调用函数生成操作员输入消息
可直接在过程画面或面板中使用“ISALG_OperationLog()”函数。下图显示了通过点击按钮实现函数的调用。
Fig. 03
注意:
“MSRTCreateMsgInstanceWithComment()”函数从 WinCC V6.0 SP3 开始可以使用。它需要使用结构类型“MSG_RTDATA_INSTANCECOMMENT_STRUCT”。过程值块可支持最多 256 个以“ZERO”结尾的字符文本。然而文本的实际的最大程度不超过 255 个字符。因为在 WinCC 报警记录中的用户文本块只能显示最多 255 个字符。而且,在 WinCC 报警控件中显示长文本并不实用。
在 WinCC V6.0 SP3 之前 的版本中可以使用“MSRTCreateMsg()”函数作替代来生成操作员输入消息。在这种情况下注意过程值块的字符长度最大为 32 (与结构“MSG_RTCREATE_STRUCT”有关)。 如果想要在用户文本块中显示更多的字符,可使用多个过程值块显示已过用户文本块。使用单独的函数“MSRTSetComment()”设置消息的注释。
本条目中的脚本已在 WinCC 单用户和 WinCC 客户机项目中经过测试。适合于下列版本:WinCC V6.0 SP3,WinCC V6.0 SP4 和 WinCC V6.2,WinCC 6.2 SP2 和 WinCC V7.0。也与 WinCC Web Navigator V6.2,WinCC Web Navigator V6.2 SP2 和 WinCC Web Navigator V7.0 成功测试。
警告:
Audit 仅记录 Web Navigator client 的登录,所有 Web Navigator 的其他操作不记录。
如果 WinCC 已安装在计算机中,或者如果传输到 Web Navigator 服务器的 ISALG_OperationLog 函数注释了第 7,8,9,60 行,那么只可使用 Web Navigator client。如果这些指定的行被注释,那么没有用户名能被确定。
当使用 Web Navigator client 时,只能传输计算机名且没有用户名。
版本:
这些说明已通过下列版本进行测试。
组件 产品及版本名称
PC 操作系统 Microsoft Server 2003 SP2
标准工具 ---
HMI 软件 WinCC V7.0
选件 WinCC Web Navigator V7.0
控制器 ---
条目号:24325381 日期:2009-05-12
http://support.automation.siemens.com/CN/llisapi.dll?func=cslib.csinfo&lang=zh&siteid=cseus&objid=24325381
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!