第一种使用微软集成的 Microsoft Speech SDK(TTS),这种开发成本比较高,需要自己对微软语音进行二次开发。
第二种就是直接使用成熟的轮子啦。经过寻找jTTS Desktop 5 (北京捷通)版本完美解决了这个问题。它直接就封装成了OCX控件的形式,在intouch调用即可。
下面简单的介绍一下使用过程:
1.安装jTTS Desktop5.0版本的软件(或者安装金山词霸2009 牛津版本)。
2.在intouch向导/控件安装查看,选择JTTS ActiveX Control进行安装。
3.在向导选择中进行调用,直接将相应的图标拖入到想要导入的画面中去。
4.编写脚本,对控件进行调用即可。
上述脚本,实现对水泵的三次重复告警,然后,将content内容数据写入数据库中,实现报警记录。
注:此方法有个令人无法解决的bug,因为是使用OCX控件的方式进行语音报警,所以该报警只对该画面有效果。也就是说,实现上述的功能只能当viewer在特定的画面中才能实现。(不完美的方法,需要等抽空使用第一种方法进行开发试试)
补充:在ifix下设置语音报警的基本思路:(完善上面所提bug,使用专门的故障报警弹窗即可)
1.对需要报警的点进行事件调度编写:
编写脚本,对触发事件进行数据库写入,以及弹窗显示:
Dim conODBC As ADODB.Connection
Dim StrD As String
Dim userid As String
Dim username As String
Dim groupname As String
System.FixGetUserInfo userid, username, groupname
StrD = Format(Now, "yyyy-mm-dd hh:mm:ss")
Set conODBC = New ADODB.Connection
conODBC.ConnectionString = "DSN=QPWS;UID=sa;PWD=;"
conODBC.Open "QPWS", "sa", ""
conODBC.Execute "insert into kaitingshijian (DateTimee,mingcheng,neirong,operator) values ('" + StrD + "','二期粗格栅污水泵1', '故障', '" + username + "')"
conODBC.Close
OpenTGDPicture "故障报警.grf", "", "", "", "二期粗格栅1号污水泵.TGD"
2.在故障报警.grf画面中,编写脚本:
Private Sub CFixPicture_Initialize()
playSound ("D:\alarm.wav")
JTTS_ActiveX1.Play (Text2.Caption + Text1.Caption + Text2.Caption + Text1.Caption + Text2.Caption + Text1.Caption)
playSound ("D:\alarm.wav")
End Sub
注:PlaySound()方法,使用的是user下自编写模块实现:
Public Declare Function sndPlaySound Lib "winmm" Alias "sndPlaySoundA" (ByVal IpszSoundName As String, ByVal uFlags As Long) As Long
'flag uitzetten
Public Const SND_SYNC = &H0
Public Const SNC_ASYNC = &H1
Public Const SND_NODEFAULT = &H2
Public Const SND_MEMORY = &H4
Public Const SND_LOOP = &H8
Public Const SND_NOSTOP = &H10
Public Sub PlaySound(strSound As String)
sndPlaySound strSound, SND_ASYNC Or SND_NODEFAULT
End Sub
至此,一个简单的ifix下的语音报警已经实现。
2018.06.06 bug修复:
在ifix中利用上述的脚本实现了工厂的实际运用,然后在运行过程中报警弹窗出现后,一直报的并非@name@替换后的字符,而是@name@本身,经过一天的寻求结果,总算找到了原因和解决方法,现补充如下:
原因:ifix的后台调度程序fixbackgroud.exe和运行画面的workspace.application风别属于不同的进程,当在后台调度workspace中的画面时,其参数并未随之赋值,所以导致了该问题了。也就解释了我在画面上新建按钮调用OpenTGDpicture时能正确朗读。
解决方法:使用全局变量来进行参数传递。
在后台给全局变量赋值的方法:(修改调度脚本如下)
'修改全局变量PicNumber的Description值
Dim workspace As Object
Set workspace = GetObject("", "Workspace.Application")
Dim tagvar As Object
Set tagvar = workspace.Documents("User").Page.FindObject("PicNumBer")
tagvar.Description = "二期粗格栅1号污水泵.TGD"
Dim conODBC As ADODB.Connection
Dim StrD As String
Dim userid As String
Dim username As String
Dim groupname As String
System.FixGetUserInfo userid, username, groupname
StrD = Format(Now, "yyyy-mm-dd hh:mm:ss")
Set conODBC = New ADODB.Connection
conODBC.ConnectionString = "DSN=QPWS;UID=sa;PWD=;"
conODBC.Open "QPWS", "sa", ""
conODBC.Execute "insert into kaitingshijian (DateTimee,mingcheng,neirong,operator) values ('" + StrD + "','测试点', '故障', '" + username + "')"
conODBC.Close
OpenTGDPicture "guzhang.grf", "", "", "", tagvar.Description, , True
在弹窗的脚本修改为:
Private Sub CFixPicture_Initialize()
'接收到相应的taggroupname
故障报警.LoadTagGroupFile User.PicNumBer.Description
playSound ("D:\alarm.wav")
End Sub
使用后,有效果!!!