Board logo

标题: [工作文档] WinCC6.0中加声音报警 [打印本页]

作者: shillan    时间: 2008-4-19 14:18     标题: WinCC6.0中加声音报警


//在菜单栏的触发器里选择周期触发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的聲音報警部件的開發西閠子又白干了。

作者: qaws4215    时间: 2008-4-20 20:05

很好谢谢 不过我一般直接接个喇叭省心




欢迎光临 逐梦论坛 (http://temp2023.zhumeng.org/) Powered by Discuz! 7.2