|
//在菜单栏的触发器里选择周期触发250ms
#include "apdefap.h"
int gscaction( void )
{
#pragma code("winmm.dll")
bool playsound(lpctstr lpszsound,hmodule hmodule,dword dwsound );//bool aa=false;
#pragma code( )
if(gettagbit("test")==1)
{
playsound("c:\\winnt\\media\\ringout",null,8 );
}
return 0;
}
wincc v6.0可以用horn组态实现声音报警,不用编程。 打开horn,在message assignment选项页选定message class为error,定义一个bool型的tag;在signal assingment选项页选定tag为刚才定义的bool型的tag,在sound中选择要播放的.wav声音文件。运行时,只要error类别的报警触发,则bool型的tag置位,.wav声音循环播放;在报警控件中确认报警,.wav声音中止,也可以将bool型的tag复位,.wav声音中止。horn是基本过程控制(bpc)的组件,标准安装是不会安装的。安装wincc时选择“自定义安装”,已经安装了就选择“安装卸载组件”,组件栏中选择“选项”,右边栏子选项选择“basic process control”安装即可。
上位机通过wincc控件做外部声音报警 在全局脚本里面新建一个循环的东东,可以设置 2s,代码如下
#include "apdefap.h"
int gscaction( void )
{
msg_rtdata_struct mrt;
int i;
char* psztoken;
//now is my code
#pragma code("winmm.dll")
bool winapi sndplaysounda(char* szwave,dword dwflag);
#pragma code()
dword snd_async=0x0001;
dword snd_loop=0x0008;
dword alarmsum,alarmunack;
lpcmn_error errorunack,errorsum;
#pragma code("msrtcli.dll")
#pragma code()
lpdword lpdwserviceid;
msg_service_notify_proc lpfnnotifyproc;
lpmsg_filter_struct lpmsgfilter;
dword dwnotifymask;
lpvoid lpvuser;
lpcmn_error lperror;
bool n1;
n1=msrtgetmsgquit(&alarmunack,errorunack);
settagdword("number",alarmunack);
msrtgetmsgactual(&alarmsum,errorsum);
settagdword("sum",alarmsum);
if (alarmsum==0)
sndplaysounda(null,snd_async);
else
{
if (alarmunack>0)
sndplaysounda("c:\\program files\\windows nt\\pinball\\sound36.wav",snd_async|snd_loop);
else
sndplaysounda(null,snd_async);
//sndplaysounda("c:\\windows\\media\\office97\\laser.wav",snd_async|snd_loop);
}
return 1;
}
#include "apdefap.h"
int gscaction( void )
{
// wincc:tagname_section_start
// syntax: #define tagnameinaction "dmtagname"
// next tagid : 1
// wincc:tagname_section_end
// wincc:picname_section_start
// syntax: #define picnameinaction "picturename"
// next picid : 1
// wincc:picname_section_end
#pragma code("winmm.dll")
bool playsound(lpctstr lpszsound,hmodule hmodule,dword dwsound );
#define snd_filename 0x00020000l
#define snd_async 0x0001
#pragma code( )
bool bret = false;
if(gettagbit("test")==1); //返回类型:bool
bret=playsound("d:\1.wav",null,snd_filename|snd_async );
return 0;
}
我是5.1版本的。这段程序,声音不行啊。请教
以下适用于大批量报警 如100个消息报同一个警
先在alarm logging里把报警分类
打开自定义的报警类属性有3项 "status tag" "lock tag" "acknowledge tag"
后两个没用 在status tag里添加一个byte格式的tag "a"
然后你可以试验一下 有报警了a为0x1f 确认后为0x01
然后c s cript编一下须要编一下了
if(gettagbyte("os1_alarm") &0xf0)
{
cc_playsound("a.wav");
return 1;
}
此外还需要cc_playsound()和getprojectpath()两个函数
我有现成了 把这两个函数复制到\项目\library\里 编译一下脚本就行了
对了 声音文件*.wav放在\项目\sound\下 没有的自己建一个
//project function getprojectpath()
bool getprojectpath(char* lpstrprojectpath)
{
bool bret = false;
char szprojectfile[_max_path+1];
char* psz = null;
cmn_error error;
bret = dmgetruntimeproject(szprojectfile,_max_path+1,&error);
if (bret == false)
{
return false;
}
psz = strrchr(szprojectfile,\'\\');
if (psz ==null)
{
return false;
}
*(psz+1) = 0;
strcpy(lpstrprojectpath, szprojectfile);
return true;
}
//project function cc_playsound()
#include "apdefap.h"
void cc_playsound(char* lpszsoundfile)
{
#pragma code("winmm.dll")
bool playsound(lpctstr lpszsound, hmodule hmodule,dword dwsound);
#define snd_filename 0x00020000l
#define snd_async 0x0001
#define snd_loop 0x0008
#pragma code()
bool bret = false;
char szprojectpath[_max_path];
char szsoundpath[_max_path];
if (lpszsoundfile == null)
{
bret=playsound(null,null,snd_filename|snd_async);
}
else
{
getprojectpath(szprojectpath);
sprintf(szsoundpath,"%ssound\%s", szprojectpath, lpszsoundfile);
bret=playsound(szsoundpath,null,snd_filename|snd_async);
}
if (bret == false)
{messagebeep((word)-1);}
报警可以用以下两种实现方法:
1、建一个全局脚本,时基为2s
#include "apdefap.h"
int gscaction( void )
{
#pragma code("winmm.dll")
void winapi playsounda(char* pszsound,char* hmode,dword dwflag);
#pragma code( )
if (gettagbyte("tag")==1) 或 if (gettagbyte("tag")>500)
{playsounda("d:\ringout.wav",null,1);}
return 0;
}
用以上程序就可以实现单个变量报警,开关量为1或模似量大于500都可以报警,
用户可以根据自己的情况改变以上数值,如果有多个变量可以增加多个if .
2、通过报警记录,先在报警记录中组态好报警记录
建一个全局脚本,时基为2s
#include "apdefap.h"
int gscaction( void )
{
msg_rtdata_struct mrt;
int i;
char* psztoken;
//now is my code
#pragma code("winmm.dll")
bool winapi sndplaysounda(char* szwave,dword dwflag);
#pragma code()
dword snd_async=0x0001;
dword snd_loop=0x0008;
dword alarmsum,alarmunack;
lpcmn_error errorunack,errorsum;
#pragma code("msrtcli.dll")
#pragma code()
lpdword lpdwserviceid;
msg_service_notify_proc lpfnnotifyproc;
lpmsg_filter_struct lpmsgfilter;
dword dwnotifymask;
lpvoid lpvuser;
lpcmn_error lperror;
bool n1;
n1=msrtgetmsgquit(&alarmunack,errorunack);
settagdword("number",alarmunack);
msrtgetmsgactual(&alarmsum,errorsum);
settagdword("sum",alarmsum);
if (alarmsum==0)
sndplaysounda(null,snd_async);
else
{
if (alarmunack>0)
sndplaysounda("c:\program files\windows nt\pinball\sound36.wav",snd_async|snd_loop);
else
sndplaysounda(null,snd_async);
//sndplaysounda("c:\windows\media\office97\laser.wav",snd_async|snd_loop);
}
return 1;
}
这个可以实现报警记录中只要有报警发生,那么就触发声音报警。
以上程序均已在wincc5.1、wincc6下运行通过 1、在wincc资源管理器中变量里定义一个test的变量(当此变量为1时,开始声音报警),,2、在wincc资源管理器菜单栏的编辑器里选择全局脚本,在全局脚本里,全局动作里新建全局动作,将一下脚本copy即可,,,//在菜单栏的触发器里选择周期触发250ms#include "apdefap.h"int gscaction( void ){ #pragma code("winmm.dll")bool playsound(lpctstr lpszsound,hmodule hmodule,dword dwsound );//bool aa=false;#pragma code( )if(gettagbit("test")==1){playsound("c:\\winnt\\media\\ringin.wav",null,8 );}return 0; }刘厚权 2007年06月27日 总结,,已经实验,no problem... qq:117555540 email:liuliu180@163.com 使用api函數playsound來做已經是很原始的辦法,自從wincc6.0開始后就基本已經絕踖了,如果您在wincc6還在使用此方法,那wincc6的聲音報警部件的開發西閠子又白干了。 |
|