工控項目最近更新改造,需要使用Intouch/ifix提供一個語音報警功能。這個不像先前提供的單一的聲音報警,業主方要求能詳細的提供某某水泵或者是某某裝置故障報警,這就要求我們這邊對語音解析或者基礎控件知識有一定的掌握了。在實作上,一般有兩種方法:
第一種使用微軟內建的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
使用後,有效果!!!