Wincc语音报警及C#实现文字转语音.docx
《Wincc语音报警及C#实现文字转语音.docx》由会员分享,可在线阅读,更多相关《Wincc语音报警及C#实现文字转语音.docx(9页珍藏版)》请在冰豆网上搜索。
Wincc语音报警及C#实现文字转语音
Wincc语音报警及C#实现文字转语音
Wincc语音报警
Wincc本身可以利用C脚本,VBS及HORN来做语音报警,但是上述本质上是调用的已存在的音频文件,想实现播放实时更新的信息是不行的,本文主要介绍通过C脚本,VBS及HORN来实现语音报警,并最后介绍一种文字转语音---TTS的实现方法。
1.C脚本实现语音报警
利用C脚本实现语音报警,只能是播放WAV文件。
在C脚本中添加如下代码:
#include"apdefap.h"
long_main(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
voidWINAPIPlaySoundA(char*pszSound,char*hmode,DWORDdwflay);
#pragmacode()
if(GetTagBit("testsound")==1)
{
PlaySoundA("c:
\\wav\\1.wav",NULL,1);}
return0;
}
另外需设置触发器,如下:
2.VBS实现语音报警
利用VBS,实际是在调用媒体播放器,可以播放视频,代码如下:
FunctionBackColor_Trigger(ByValItem)
Dimsound
DimobjWshShell
sound="c:
\wav\1.avi"
SetobjWshShell=CreateObject("Wscript.Shell")
objWshShell.Run"mplay32.exe/play/close"&sound,0
EndFunction
3.利用HORN实现语音报警
a.首先打开报警器
b.变量设置,此处和报警记录的设置一样,如下
报警记录中设置:
当testbool为1时,报警控件显示如下:
4.以上可以看出,不管哪一种方式,本质上都是在播放已经存在的文件,那比如像钢卷号什么的每次都不一样,想要实现语音播放就不可能。
那么我们可以利用TTS来实现,就是翻译词典的语音功能一样。
a.首先把需要语音播放的文件存在txt文檔中,以CAL上下线带钢准备焊接为例,代码如下:
#include"apdefap.h"
long_main(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
//---------------------上线-----------------------------------------------//
if(GetTagBit("OBI_Welder_Ready")&&GetTagBit("B_UpPL_NextSelect"))
{
FILE*fp=fopen("D:
\\test\\test.txt","w+");//打开文档,按以下格式写入
fprintf(fp,"%s,%.f,%.3f",GetTagChar("IL_PL1_ID"),GetTagFloat("IR_PL1_Width"),GetTagFloat("IR_PL1_Thick"));//txt文档写入内容格式:
钢卷号,宽度保留0位小数,厚度保留3位小数
fclose(fp);//关闭文档
}
//----------------------下线-----------------------------------------------//
elseif(GetTagBit("OBI_Welder_Ready")&&GetTagBit("B_LwPL_NextSelect"))
{
FILE*fp=fopen("D:
\\test\\test.txt","w+");
fprintf(fp,"%s,%.f,%.3f",GetTagChar("IL_PL2_ID"),GetTagFloat("IR_PL2_Width"),GetTagFloat("IR_PL2_Thick"));
fclose(fp);
}
Return0;
}
同样的,如第一节所讲,另外需设置触发器,设置完后当事件触发时txt会
生成如下内容:
b.由于Wincc本身不支持TTS功能,但是计算机本身是带有TTS引擎的,因此我们可以利用微软的TTS语音引擎来实现,把txt文文件里的文字通过语音读出来,以C#实现为例,原理是通过检测txt文档的变化,当文档内容发生变化时,比如钢卷号改变就播放txt文档里面的内容,代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
usingSystem.IO;
usingSystem.Speech.Synthesis;
usingSystem.Speech;
namespaceYPC_TTS
{
publicpartialclassYPC_TTS:
Form
{
publicYPC_TTS()
{
InitializeComponent();
WatcherStrat();
}
string[]splite1;
strings1,s2,s3;
char[]c1;
char[]c2;
strings_all1;
strings_all2;
strings_all;
Threadth;//定义线程
FileSystemWatcherwatcher=newFileSystemWatcher();//文本监视
voidWatcherStrat()
{
watcher.Path=@"D:
\test";
watcher.Filter="*.txt";
watcher.IncludeSubdirectories=true;//允许侦测此目录下的子目录
watcher.NotifyFilter=NotifyFilters.LastWrite;
watcher.Changed+=newFileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents=true;//开启提交事件
}
voidOnChanged(objectsource,FileSystemEventArgse)
{
Thread.Sleep(330);
watcher.EnableRaisingEvents=false;
th=newThread(calculate);
th.IsBackground=true;
th.Start();
Control.CheckForIllegalCrossThreadCalls=false;
watcher.EnableRaisingEvents=true;
}
privatevoidcalculate()
{
StreamReaderobjReader=newStreamReader(@"D:
\test\test.txt");
SpeechSynthesizersynth=newSpeechSynthesizer();
stringstrLine=objReader.ReadLine();
if(strLine!
="")
{
splite1=strLine.Split(',');
s1=splite1[0];
s2=splite1[1];
s3="钢卷厚度¨¨"+splite1[2];
c1=s1.ToCharArray();//转成字符数组
if(c1.Length!
=9)
{
s_all="入口准备焊接;
}
else
{
s_all1="钢卷号"+c1[0]+"`"+c1[1]+"`"+c1[2]+"`"+c1[3]+"`"+c1[4]+"`"+c1[5]+"`"+c1[6]+"`"+c1[7]+"`"+c1[8]+",";
c2=s2.ToCharArray();
if(c2.Length==3)
{
s_all2="钢卷宽度"+c2[0]+"`"+c2[1]+"`"+c2[2]+",";
}
else
{
s_all2="钢卷宽度"+c2[0]+"`"+c2[1]+"`"+c2[2]+"`"+c2[3]+",";
}
s_all="入口准备焊接"+","+s_all1+s_all2+s3;
}
objReader.Close();
objReader.Dispose();
GC.Collect();
synth.Speak(s_all);
synth.Dispose();
Thread.Sleep(1100);
}
}
}
}
以上完成后,就会把txt里面的内容读出来,暂时微软默认的语音引擎说中文有点难听,可以自己安装语音库,此处安装的是nerospeech,安装完后可以在以下路径选择语音: