wincc函数实例DOC.docx
- 文档编号:25433192
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:15
- 大小:34KB
wincc函数实例DOC.docx
《wincc函数实例DOC.docx》由会员分享,可在线阅读,更多相关《wincc函数实例DOC.docx(15页珍藏版)》请在冰豆网上搜索。
wincc函数实例DOC
如何在WinCC运行时通过按下一个按钮来启动一个程序,打印一个文本文件或者打开一个PDF文件?
隐藏订货号显示订货号订货号:
说明:
WinCC在动态向导里提供了方便的“启动其他应用程序”功能来启动一个外部程序。
这个向导生成一个C脚本。
为了给这个程序添加参数,可以打开该脚本并添加相关参数。
下面提供了一些例子,这里只显示了脚本中最重要的那一行语句。
序号.
例程
1
调用标准程序:
∙ProgramExecute("C:
\\WINDOWS\\winhlp32.exe");
2
打开PDF文件:
∙ProgramExecute("C:
\\programfiles\\Adobe\\Reader8.0\\Reader\\AcroRD32.exeC:
\\Temp\\document.pdf");
3
打印文本文件:
∙ProgramExecute("C:
\\WINDOWS\\system32\\print.exeC:
\\Temp\\document.txt/C");
也可以在WinCC在线帮助中找到相关描述,在目录"WinCC信息系统>使用WinCC>用于创建函数和动作的ANSI-C>ANSI-C函数描述>标准函数>Windows",如果您使用的是VBS,则在目录"使用WinCC>用于创建程序和动作的VBS >VBScript实例>常规例程"。
注意:
∙在编写C动作时,当指定路径时必须输入双斜线("\"),否则会被解释为一个控制字符。
∙当调用某些文件类型(如MicrosoftExcel文件)时,需要输入不止一个函数参数。
因此,如果路径规范里包含一个路径,需要在函数参数里面将该路径放在反斜线和双引号标志之间,(如,ProgramExecute("C:
\\Programme\\MicrosoftOffice\\OFFICE11\\EXCEL.EXE\"C:
\\temp\\NewFolder\\Mappe1.xls\""))。
∙注意当操作员打开系统窗口的时候,可能会有操作系统级别的系统操作。
执行完程序之后关闭这些窗口。
∙您可以用Win32API函数终止一个程序,更多信息和例程可参考条目号2976503。
使用C函数“Sleep”
隐藏订货号显示订货号订货号:
问题:
如何在WinCC中编程“Sleep”等待功能?
解答:
为此,可以使用WindowsAPI功能“Sleep()”。
下面的样例程序演示了如何使用“Sleep”功能。
#pragmacode("Kernel32.dll")
voidSleep(intMilliseconds);
#pragmacode()
Sleep(1000);//timeinmilliseconds
警告:
“Sleep”函数对动作处理性能有很大的负面影响。
因此,如果想用此函数的话,请注意以下几点:
∙使用Sleep()时,C脚本的处理在特定的一段时间内被中断。
在此期间内,任何对于被中断功能的请求将不被处理。
∙而且,使用相同触发器的所有动作将不再被处理。
使用相同的触发器意味着用同一个循环触发器所有动作或变量触发器的所有动作将不再被处理。
如果同步地调用动作,这种调用通过一个变量触发器或事件被周期性地或非周期性地启动,而且所有这些功能使用了Sleep()函数,那么所有的动作会被终止。
最坏情况下是;由于启动这四个动作将终止对所有动作的处理。
∙如果说,在一个带10-秒延迟触发器的动作中使用了Sleep()函数。
那么所有被循环调用的动作将被中断。
结果是,如:
用1-秒触发器的动作操作中断,除此以外,所有后继的动作也不被执行。
这就是说,不仅当前的动作不被处理,其它还没有启动的动作也不会被处理。
∙作业不被处理是因为中断仍储存在队列中。
一旦中断结束,所有在队列中的动作将开始被处理。
但是,中断结束后,在队列中的动作不会在他们原来指定的循环中被处理。
因此,如同前面所述的那样,那么队列中剩下的动作将被一个接一个的处理而不再由触发器启动。
并且这些动作只是尽可能快的被处理掉。
(理论上同步)。
如何打开一个应用程序并保持其始终在前台显示?
隐藏订货号显示订货号订货号:
描述:
以AdobeReader8.0作为示例,我们将演示如何打开一个程序窗口并始终在前台显示。
No.
程序
1
在按钮事件的“鼠标动作”中创建以下 C语言函数,例如:
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
HWNDHandle=NULL;
Handle=FindWindow("AcrobatSDIWindow",NULL);
if(Handle)
{
ShowWindow(Handle,SW_SHOWNORMAL);
}else{
ProgramExecute("C:
/ProgramFiles/Adobe/Reader8.0/Reader/AcroRD32.exe");
Handle=FindWindow(NULL,"AdobeReader");
}
SetWindowPos(Handle,HWND_TOPMOST,400,200,520,420,0);
}
注意:
为了参数传递,Windows 函数“HWNDFindWindow(LPCSTRlpClassName,LPCSTRlpWindowName);”需要窗口的类名或者窗口自己的名字。
可以很容易的通过打开相关程序获得窗口的名字(没有文档)。
窗口名字会显示在标题栏。
然而使用窗口名字时,当打开文档时窗口名字也许会发生改变。
这也是为什么最好使用“lpClassName”参数的原因。
2
在按钮事件的“鼠标动作”中以下的C语言函数,从窗口名称中确定了窗口的类名:
为了显示“printf()”函数的输出,可以在WinCC画面中加载“GSC-Diagnostics”应用程序窗口或者启动“apdiag.exe”程序。
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
charwinclass[256];
HWNDHandle=NULL;
Handle=FindWindow(NULL,"AdobeReader");
if(!
Handle){
ProgramExecute("C:
/ProgramFiles/Adobe/Reader8.0/Reader/AcroRD32.exe");
Handle=FindWindow(NULL,"AdobeReader");
}
GetClassName(Handle,winclass,sizeof(winclass)-1);
printf("WindowClassName:
%s\r\n",winclass);
}
在WinCC中如何加载用户自定义DLLs?
隐藏订货号显示订货号订货号:
描述:
在WinCC中,您希望使用用户自定义动态链接库,在此条目,我们演示了如何在WinCC中加载一个实例DLL。
在带有VBS的WinCC运行模式下,使用VB创建的DLLs不能被加载。
关于DLLs更多的信息可以在WinCC在线帮助系统下“使用WinCC>用于创建函数和动作的ANSI-C>在函数和动作中使用DLL”
编号.
过程
1
实例DLL:
使用下面的程序代码,利用C编译器创建动态链接库"T1_C.dll"。
在这里,您可以下载已经可以编译的DLL。
T1_C.zip(17KB)
extern"C"__declspec(dllexport)intaufruf1(inta);
#include
#include
FILE*h_test;
FILE*h_trace;
extern"C"__declspec(dllexport)intaufruf1(inta)
{
h_test=fopen("C:
/temp/test_dll.txt","a");
if(h_test)
{
fprintf(h_test,"Function'aufruf1'wascalled!
\n");
fclose(h_test);
}
a+=100;
returna;
};
N.B.
∙必须在无出错信息后,创建动态链接库。
∙所有在WinCC中使用的DLL功能都必须使用相应的语法在DLL的开始部分进行指定(在实例动态链接库"T1_C.dll"的第一行)。
∙为了能够使用DLL功能,在WinCC中的动作或者函数中调用DLL,必须使用"#pragmacode"语法。
2
在WinCC中的C脚本加载"T1_C.dll"动态链接库并且执行"aufruf1"功能:
使用下列的WinCC变量:
∙var1(signed32-bitvalue)
∙result(signed32-bitvalue)
在一个按钮的事件的“鼠标单击”C动作中输入下面的C脚本:
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
#pragmacode("c:
/temp/T1_C.dll")
intaufruf1(inta);
#pragmacode()
intvalue;
value=GetTagDouble("var1");//Return-Type:
double
SetTagDouble("result",aufruf1(value));//Return-Type:
BOOL
}
3
结果:
图.01
关键字:
函数调用,API
调用打印机的状态框
隐藏订货号显示订货号订货号:
问题:
如何从WinCC调用打印机的状态框?
解答:
“控制打印机”从控制面板上调用该框。
下面的动作必须在一个按钮下加以编辑,比方说:
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*
lpszPropertyName)
{
//打印机框的调用
ProgramExecute("C:
\\WIN.95\\control.exeprinters");
}
当在WinCC脚本中结合一个DLL时,使用的内存空间增加了
隐藏订货号显示订货号订货号:
问题:
如果使用VisualC++创建的一个DLL文件时,发现PC上使用的内存增加了。
对于这种情况,应该怎么办?
解答:
检查是否用正式发行的版本创建了DLL。
所提供WinCC是正式发行的版本。
这意味着WinCC也可以使用MicrosoftDLLMFC42.DLL的发行版本。
如果在测试版本中有DLL文件,那么全局脚本中必须另外加载MFC42.DLL的测试版本。
另外,这会增加对内存的用量。
在WinCC中始终使用DLL文件的发行版本。
可按如下方法创建发行版本:
1.打开DLL的项目文件。
2.检查是否DLL已在Win32Release组态下被创建。
3.如有必要,把活化的组态切换到“Win32Release”。
在MicrosoftVisualC++Studio中的“创建”->“定义活化的组态”中做该切换。
4.重新创建DLL。
5.用DLL的发行版本替换测试版本的DLL。
在WinCC中通过C脚本输出声音
隐藏订货号显示订货号订货号:
问题:
如何在WinCC中通过C脚本输出声音?
解答:
附件是一个小实例。
该C动作位于按钮后,这样只需单击该按钮就可产生声音。
C动作:
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName,UINTnFlags,intx,inty)
{
#pragmacode("Winmm.dll")
VOIDWINAPIPlaySoundA(char*pszSound,char*hmode,DWORDdwflag);
#pragmacode()
PlaySoundA("C:
\\Winnt.400\\Media\\tada.wav",NULL,1);
}
该功能需要有声卡。
PlaySoundA函数的说明:
1.参数char*pszSound:
指定声音文件(*.wav文件)的全路径。
2.参数char*hmode:
总为0。
3.参数DWORDdwflag:
SND_SYNC=0x0000:
声音文件播放一次,该脚本一直等到播放结束
SND_ASYNC=0x0001:
声音文件播放一次,同时并行处理该脚本
SND_NODEFAULT=0x0002:
如果未找到该声音文件,则不播放默认值,而是什么也不播放。
SND_LOOP=0x0008:
重复该声音文件直到下个PlaySoundA调用(只能通过0x0001)=>总是指定0x0009。
这些参数也可通过逐位逻辑‘或’进行组合(如:
SND_ASYNC|SND_LOOP)
注意事项:
如果想使用计算机内部扬声器的蜂鸣声而不是声音文件,则实现如下脚本:
由于寻址内部扬声器,无需声卡。
#include"apdefap.h"
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName,UINTnFlags,intx,inty)
{
#pragmacode("Kernel32.dll")
BOOLBeep(DWORDdwFreq,DWORDdwDuration);//dwFreq 定义蜂鸣声的频率,单位:
Hz
//dwDuration指定蜂鸣声的持续时长,单位:
ms
#pragmacode()
Beep(1000,100); //实例:
频率:
1000Hz,100ms
}
如何创建WindowsMessageBox并且确定操作员按下的是哪个按钮?
隐藏订货号显示订货号订货号:
说明:
使用动态向导“PictureFunctions>Displayerrorbox”可以创建在WinCC运行系统中显示WindowsMessageBox的C脚本。
使用该向导生成的C脚本使用的是WindowsAPI函数“MessageBox()”。
关于这个函数的详细信息可从Microsoft的“MSDNLibrary”中获得。
MessageBox()函数的参数:
MessageBox的显示受以下这些参数的影响。
参数
描述
HWNDhWnd
父窗口的处理
零=消息没有父窗口
LPCTSTRlpText
消息文本
LPCTSTRlpCaption
文本的标题
如果该参数设为零,标题将使用默认的文本“Error”。
UINTuType
MessageBox的类型;
这个参数定义了MessageBox的外观和行为。
它是不同“Flags”的组合(逐位进行“或”操作)。
以下列出了一些主要的标记:
MB_OK,
MB_OKCANCEL,
MB_YESNO,
MB_YESNOCANCEL,
MB_ABORTRETRYIGNORE,
MB_CANCELTRYCONTINUE,
MB_HELP,
MB_RETRYCANCEL
使用这些标记中的一个可以定义MessageBox中显示哪些按钮。
MB_ICONEXCLAMATION,
MB_ICONQUESTION,
MB_ICONWARNING,
MB_ICONINFORMATION,
MB_ICONQUESTION,
MB_ICONASTERISK,
MB_ICONSTOP,
MB_ICONERROR,
MB_ICONHAND
使用这些标记中的一个可以定义MessageBox中显示的图标。
MB_DEFBUTTON1,
MB_DEFBUTTON2,
MB_DEFBUTTON3,
MB_DEFBUTTON4
使用这些标记中的一个可以定义默认的按钮。
MB_SETFOREGROUND
MessageBox显示在最前面。
MB_SYSTEMMODAL
MessageBox定义为系统模式。
消息直到确认之前一直显示在最前面。
重要事项:
“MB_SYSTEMMODAL”标记应该总用于避免发生阻塞整个系统的可能。
MessageBox()函数的返回值:
返回值
描述
IDABORT,
IDCANCEL,
IDCONTINUE,
IDIGNORE,
IDNO,
IDOK,
IDRETRY,
IDTRYAGAIN,
IDYES
函数的返回值是“int”类型并告知操作员按下的是哪个按钮。
注意事项:
∙如果MessageBox有“Cancel”键,并且操作员使用“ESC”键终止MessageBox,系统将返回IDCANCEL的值。
∙如果函数使用失败,将返回“0”。
更多的错误信息可通过调用“GetLastError()”函数获得。
∙如果函数调用成功,函数将返回左边给出的某个值(常数)中的一个。
下图显示了如何使用“MessageBox()”函数以及如何评价函数返回值。
(26KB)
图01
为何不能在WinCC中使用Windows消息框?
隐藏订货号显示订货号订货号:
描述:
不能在WinCC中使用Windows消息框有多个原因:
∙只要打开消息框,就阻塞系统
只要打开Windows消息框,WinCC运行系统保持“阻塞”状态,直到用户关闭消息框。
一旦关闭消息框,就缓冲并处理消息框外的鼠标单击事件。
∙可能阻塞整个系统
打开消息框时如果没有置位"MB_SYSTEMMODAL"标志,则系统不能操作。
这种情况下,如果在消息框外单击鼠标左键,则消息框切换到后台,而单击的应用程序(通常为WinCC运行系统)切换到前台。
打开消息框时不能操作 WinCC运行时。
但要关闭消息框,则消息框必须返回前台。
但是这在通过组合键(例如,"ALT-TAB")切换任务被阻止的情况下是不能实现的。
只能通过断开/接通计算机来实现。
当仍然需要使用消息框时,使用"MB_SYSTEMMODAL"标志来确保系统保持可操作。
∙按钮文本语言取决于Windows操作系统的语言
在Windows消息框按钮上显示的文本取决于当前为操作系统设定的语言。
对于多种语言,则需要使用多语言版本(MUI)的操作系统。
在运行时中,必须改变操作系统的语言。
欲知详情,请参见条目号21923800。
∙必须手动组态消息文本和标题的语言切换
条目号22907359介绍了如何组态消息文本和标题的语言切换。
补救措施:
可使用WinCC工具来模拟Windows消息框功能。
为此,可以将一个WinCC画面窗口切换为可见。
该画面窗口应包含所要求的相关消息文本和按钮。
如果操作一个按钮,则触发期望动作,画面窗口再次“切换”为隐藏状态。
可使用WinCCDynamicWizard"PictureFunctions>DisplayWCCDialogbox"来组态该任务。
注意事项:
只有在尚未运行OS项目编辑器时系统才能使用该向导,因为这将安装PCS7标准向导。
通过Start>SIMATIC >WinCC >Tools >DynamicWizardEditor来启动动态向导编辑器,可以通过DynamicWizard>GenerateCWDorReadinWizardScript功能导入缺少的向导。
为什么应该使用内部C函数“SysMalloc()”来提供内存?
隐藏订货号显示订货号订货号:
描述:
使用C脚本保留内存或许是必要的。
例如,对一个应用程序而言,通过一个C函数将图形目标的“Text”属性动态化。
在这种情况下应使用内部函数“SysMalloc()”。
“SysMalloc()”为动作保留内存。
为该动作分配存储区域。
一旦此动作处理完毕,而且结果也已发送,系统将再次释放内存。
使用“SysFree()”函数,可以提早释放内存。
如果使用其它函数保留内存,例如,“malloc()”,则必须明确地释放内存,避免内存不足。
如何知道硬盘剩余空间的大小?
解答:
1. 通过所附的脚本可以确定硬盘上剩余磁盘空间的大小(盘最大至4GB):
getDiskFreeSpace.pdf(1KB)
2.也可以通过WinCC的系统信息通道来确定硬盘上剩余磁盘空间大小。
该通道存在于WinCCV5.0及更高的版本中。
步骤:
将“SystemInfo.chn”加入到WinCC变量管理器中。
通过一个32位的浮点数变量创建一个新的连接。
对于地址参数,规定“剩余驱动器空间”函数。
格式根据要求指定为“MB”或“%”。
现在可得到该变量的值,即:
通过一个I/O域显示在画面中的磁盘剩余空间。
利用“系统信息
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- wincc 函数 实例 DOC