zoukankan      html  css  js  c++  java
  • Intouch/ifix关于语音报警的一种设置思路

        工控项目最近升级改造,需要使用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
    使用后,有效果!!!



  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/cache-yuan/p/9146742.html
Copyright © 2011-2022 走看看