首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
语音卡应用编程实例
中华工控网
收藏本文     查看收藏
语音卡应用编程实例</P><P> 通讯地址:辽河油田油建二公司人教科张辉 邮编:124012 <BR> 电子邮件:zhanghui@lh.cnpc.com.cn</P><P> 目前电话语音产品已在各方面得到广泛应用,常用的语音卡具有4线或8线通道,可以同时处理4线或8线电话的请求。以下介绍利用语音卡实现计算机自动应答的医疗及养老帐户金语音查询系统。<BR> 系统功能<BR> 当外线电话打入时,计算机自动检测到振铃信号,并开始播放提示音,同时开始接收用户的电话按键信息。用户通过电话按键选择查询类别、输入身份证号码、查询年度,计算机根据接收的信息从后台ORACLE数据库中取得查询结果数据,并将相应帐户金额数据进行语音合成,再通过语音卡的相应外线电话通道播放查询结果,例如:"姓名张三 年度1999您的医疗帐户金余额是一千二百三十四元五角六分 上年利息一百二十三元 统筹金划入二十三元四角 个人缴纳二十八元五角 帐户内报销八百零八元八角八分"。用户端电话接听所查帐户数据的语音信号。<BR> 编程思路<BR> 系统应划分为6个运行阶段:<BR> 1、 初始化语音卡、连接数据库,等待外线电话打入。检测到振铃后进入下一阶段。<BR> 2、 接收用户选择的查询类别。<BR> 播放提示音:"欢迎使用,查询医疗帐户请拨1,查询养老帐户请拨2,查询离退休金请拨3"。用户选择1-3后进入下一阶段。默认选择为1。<BR> 3、 接收用户输入的身份证号码。<BR> 播放提示音:"请您输入身份证号码"。用户输入后,系统判断数据库中是否存在此身份证号码,如果存在,则进入下一阶段。否则提示重新输入。<BR> 4、 接收用户输入查询年度。<BR> 播放提示音:"请您输入查询年度"。用户输入后,生成查询条件,取得查询数据。进入下一阶段。<BR> 5、 合成及播放姓名语音。<BR> 6、 帐户金数额语音合成及播放。<BR> 具体实现<BR> 由于电话语音卡的编程接口以windows动态链接库(TW8VID32.DLL)方式提供,可以使用目前常用的可视化开发工具,如:delphi ,vb, pb, visual c++等。下面以PB环境举例说明。<BR> 首先建立一个新的application ,一个新的窗口yyk,在application的open事件中,连接后台ORACLE数据库,并对语音卡进行初始化。设置窗口的定时器。也可以在窗口yyk中设置一些代表各个通道当前状态的提示文本,在系统响应用户按键时可以随时更新提示文本,以反映各通道的工作状态。</P><P> 函数声明Global external functions ,以及常量定义<BR> FUNCTION int TV_Installed() library "tw8vid32.dll"<BR> SUBROUTINE TV_Initialize() library "tw8vid32.dll" <BR> SUBROUTINE TV_Disable() library"tw8vid32.dll" <BR> FUNCTION int TV_ChannelType(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_OffHookDetect(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_RingDetect(int chno) library"tw8vid32.dll"<BR> ......................略<BR> 详细的函数声明附录在最后。</P><P> 定义结构ch_stru<BR> { string Fname //通道放音文件名<BR> int wstate //通道状态<BR> int jieduan //运行阶段<BR> int cx_select //查询类型<BR> string sfzhm //身份证号码<BR> string nd //查询年度<BR> string xingmin //姓名<BR> string sentence //通道放音字符 }</P><P> 定义全局变量ch_stru channel[8]<BR> int chnum<BR> 定义application的open事件<BR> integer i<BR> string ls_startupfile <BR> l_startupfile = "yyk.ini"<BR> //设置数据库事务对象参数<BR> sqlca.DBMS = ProfileString (l_startupfile, "database", "dbms", "")<BR> sqlca.database = ProfileString (l_startupfile, "database", "database", "")<BR> sqlca.userid = ProfileString (l_startupfile, "database", "userid", "")<BR> sqlca.dbpass = ProfileString (l_startupfile, "database", "dbpass", "")<BR> sqlca.logid = ProfileString (l_startupfile, "database", "logid", "")<BR> sqlca.logpass = ProfileString (l_startupfile, "database", "LogPassWord", "")<BR> sqlca.servername = ProfileString (l_startupfile, "database", "servername", "")<BR> sqlca.dbparm = ProfileString (l_startupfile, "database", "dbparm", "")<BR> connect; //连接数据库<BR> if sqlca.sqlcode <> 0 then<BR> MessageBox ("不能连通数据库", sqlca.sqlerrtext)<BR> return<BR> end if<BR> open(yyk)<BR> if timer(0.06,yyk)=-1 then<BR> MessageBox ("错误提示","设置定时器失败, 程序不能执行!")<BR> return<BR> end if<BR> chnum=tv_installed()<BR> if chnum<=0 then<BR> MessageBox ("错误提示","未安装语音卡!")<BR> else<BR> tv_initialize() //初始化语音卡<BR> if chnum>8 then<BR> chnum=8<BR> end if<BR> initchannel () //初始化各通道<BR> end if<BR> //application的open事件定义结束</P><P> 定义函数initchannel (),初始化各通道结构channel[i]<BR> for i=1 to 8 <BR> channel[i].FName="welcome.tw"<BR> channel[i].wstate=WS_FREE<BR> channel[i].jieduan=1<BR> channel[i].cx_select=1<BR> channel[i].sfzhm=''<BR> channel[i].nd=''<BR> channel[i].xingmin=''<BR> channel[i].sentence=" "<BR> if i>chnum then<BR> channel[i].chtype = CT_EMPTY<BR> else<BR> channel[i].chtype=tv_channelType(i -1) //判断通道类型,外线或内线或空<BR> end if<BR> next<BR> //退出应用时,使语音卡无效。<BR> if chnum>0 then<BR> tv_disable()<BR> end if<BR> disconnect using sqlca ; //取消连接数据库</P><P> //在窗口yyk的timer事件中处理各通道的请求<BR> int i<BR> for i=1 to chnum<BR> if channel[i].chtype=1 then<BR> //如果是外线通道,处理请求<BR> externalyyk (i) //自定义函数<BR> end if<BR> next</P><P> 自定义函数externalyyk (int chno)定义如下:<BR> // 函数externalyyk ()开始<BR> long retval<BR> integer DtmfVal,temp<BR> unsignedinteger sigtype<BR> double num<BR> string strRet, password,yyk_path,xm_temp<BR> CHOOSE CASE channel[chno].jieduan<BR> case 1 //选择查询类别<BR> <BR> CHOOSE CASE channel[chno].wstate<BR> CASE WS_FREE<BR> if tv_ringdetect(chno -1) > 1 then //检测到振铃<BR> channel[chno].wstate=WS_STARTFILE<BR> tv_offhookctrl(chno -1) //控制摘机<BR> tv_flushdtmf(chno -1) //清空某通道的双音多频码(dtmf)<BR> end if<BR> case WS_STARTFILE<BR> //开始播放提示音,"欢迎使用,查询医疗帐户请拨1,查询养老帐户......" <BR> f_start_file(chno,WS_ONFILE) <BR> //自定义函数f_start_file(int chno ,int next_state) 定义如下:<BR> // long retval<BR> //启动某通道文件放音<BR> // retval=tv_startplayfile(ch_no -1,channel[ch_no].FName,0,300000)<BR> // if retval<=0 then<BR> // tv_hangupctrl(ch_no -1) //如果启动放音失败则挂断<BR> // channel[ch_no].wstate=WS_FREE<BR> // channel[ch_no].jieduan=1<BR> // 设置提示音文件<BR> // channel[ch_no].FName="welcome.tw"<BR> // else<BR> // 否则改变通道状态标志<BR> // channel[ch_no].wstate=next_state<BR> // end if<BR> // <BR> // return 1<BR> case WS_ONFILE<BR> //如果检测到忙音,则停止放提示音,并控制挂断。<BR> if tv_monitorbusy(chno -1,SIG_BUSY1,5)<>0 or tv_monitorbusy(chno -1,SIG_BUSY2,5)<>0 then<BR> tv_stopplayfile(chno -1)<BR> channel[chno].wstate=WS_FREE<BR> tv_hangupctrl(chno -1)<BR> channel[chno].jieduan=1<BR> else<BR> //否则继续播放剩余提示音<BR> retval=tv_playfilerest(chno -1)<BR> if retval<=0 then //如果提示音播放完毕<BR> //设置等待接收双音多频码DTMF的时间为35秒<BR> tv_starttimer(chno -1,35) <BR> //准备转到接收双音多频码DTMF<BR> channel[chno].wstate=WS_WAITDTMF<BR> else<BR> DtmfVal=tv_getdtmfchar(chno -1) //检测用户按键信息<BR> if DtmfVal<>-1 then<BR> tv_stopplayfile(chno -1) //检测到按键,停止播放提示音<BR> channel[chno].wstate=WS_WAITDTMF<BR> if char(DtmfVal)<>'*' and char(DtmfVal)<>'#' then<BR> channel[chno].DtmfStr=""<BR> channel[chno].DtmfStr=channel[chno].dtmfstr+char(dtmfval)<BR> if len(channel[chno].dtmfstr)>=1 then<BR> channel[chno].wstate=WS_STARTFILE<BR> channel[chno].jieduan=2 //准备转到身份证输入部分<BR> channel[chno].FName="srsfzhm.tw" //设置提示音文件,提示输入身份证<BR> if integer(left(channel[chno].dtmfstr,1)) > 3 or integer(left(channel[chno].dtmfstr,1)) < 1 then<BR> channel[chno].cx_select=1 //默认选择为1<BR> else<BR> channel[chno].cx_select=integer(left(channel[chno].dtmfstr,1))<BR> end if<BR> end if<BR> end if<BR> end if<BR> end if<BR> end if<BR> case WS_WAITDTMF<BR> DtmfVal=tv_getdtmfchar(chno -1) //检测用户按键信息<BR> if DtmfVal<>-1 then //检测到按键<BR> channel[chno].wstate=WS_WAITDTMF<BR> if char(DtmfVal)<>'*' and char(DtmfVal)<>'#' then<BR> channel[chno].DtmfStr=""<BR> channel[chno].DtmfStr=channel[chno].dtmfstr+char(dtmfval)<BR> if len(channel[chno].dtmfstr)>=1 then<BR> channel[chno].wstate=WS_STARTFILE<BR> channel[chno].jieduan=2 //准备转到接收身份证号部分<BR> channel[chno].FName="srsfzhm.tw" //设置放音文件名,提示输入身份证号码<BR> if integer(left(channel[chno].dtmfstr,1)) > 3 or integer(left(channel[chno].dtmfstr,1)) < 1 then<BR> channel[chno].cx_select=1 //默认选择为1(查询医疗帐户)<BR> else<BR> channel[chno].cx_select=integer(left(channel[chno].dtmfstr,1))<BR> end if<BR> end if<BR> end if <BR> <BR> else //未检测到用户按键信息<BR> if tv_monitorbusy(chno -1,SIG_BUSY1,5)<>0 or tv_monitorbusy(chno -1,SIG_BUSY2,5)<>0 then<BR> channel[chno].wstate=WS_FREE //检测到忙音,挂机,改变通道状态为空闲<BR> tv_hangupctrl(chno -1)<BR> else<BR> if tv_timerelapsed(chno -1)<0 then<BR> channel[chno].wstate=WS_FREE //等待接收Dtmf数据码超时,挂机<BR> tv_hangupctrl(chno -1)<BR> end if<BR> end if<BR> end if<BR> end choose<BR> case 2 //获取身份证号部分<BR> <BR> CHOOSE CASE channel[chno].wstate<BR> case WS_STARTFILE<BR> f_start_file(chno,WS_ONFILE)<BR> case WS_ONFILE<BR> //........省略,与前面类似<BR> case WS_WAITDTMF<BR> //........省略,与前面类似<BR> case WS_GETDTMF<BR> //..............省略<BR> if len(channel[chno].dtmfstr)=15 then<BR> channel[chno].sfzhm=channel[chno].dtmfstr //得到身份证号码(15位)<BR> //准备转到查询数据库中是否存在此身份证号部分<BR> channel[chno].wstate=WS_looksfzhmfromdb <BR> end if<BR> case WS_looksfzhmfromdb<BR> channel[chno].a1=0<BR> //判断数据库中是否存在所输的身份证号码<BR> choose case channel[chno].cx_select<BR> case 1 //从数据库中医疗帐户表中查找<BR> //a1>=1表示数据库中存在所输的身份证号码<BR> channel[chno].a1=f_count_yiliao(channel[chno].sfzhm)<BR> case 2 //从数据库中养老帐户表中查找<BR> channel[chno].a1=f_count_yanglao(channel[chno].sfzhm)<BR> case 3 //从数据库中离退休表中查找<BR> channel[chno].a1=f_count_lituixiu(channel[chno].sfzhm)<BR> end choose<BR> //如果数据库中存在所输的身份证号码<BR> if channel[chno].a1 >= 1 then<BR> //从数据库中获取姓名<BR> choose case channel[chno].cx_select<BR> case 3<BR> channel[chno].xingmin=f_getxingmin_lituixiu(chno)<BR> case 2<BR> channel[chno].xingmin=f_getxingmin_yanglao(chno)<BR> case 1<BR> channel[chno].xingmin=f_getxingmin_yiliao(chno)<BR> end choose<BR> channel[chno].wstate=WS_STARTFILE<BR> channel[chno].jieduan=4 //准备转到接收查询年度部分<BR> channel[chno].FName="srnd.tw" //设置放音文件名,提示输入查询年度<BR> else<BR> //数据库中不存在所输的身份证号码<BR> channel[chno].wstate=WS_STARTFILE<BR> channel[chno].jieduan=2 //准备转到接收身份证号码部分<BR> //设置放音文件名,身份证号码有误或为找到,请重输<BR> channel[chno].FName="nosfzhm.tw" <BR> end if <BR> end choose<BR> case 4 //获取年度部分<BR> CHOOSE CASE channel[chno].wstate <BR> case WS_STARTFILE<BR> f_start_file(chno,WS_ONFILE)<BR> case WS_ONFILE<BR> //........省略,与前面类似<BR> case WS_WAITDTMF<BR> //........省略,与前面类似<BR> case WS_GETDTMF<BR> //........省略,与前面类似<BR> channel[chno].dtmfstr=channel[chno].dtmfstr+char(DtmfVal)<BR> if len(channel[chno].dtmfstr)=4 then //如果接收到四位代表年度的按键<BR> channel[chno].wstate=WS_retrievedatafromdb //转到检索数据部分<BR> end if<BR> case WS_retrievedatafromdb<BR> channel[chno].nd=channel[chno].dtmfstr //赋值年度<BR> if channel[chno].cx_select=1 then //查询医疗帐户<BR> if integer(left(channel[chno].dtmfstr,4)) < 1996 then<BR> channel[chno].dtmfstr='1996'<BR> channel[chno].nd='1996'<BR> end if<BR> if integer(left(channel[chno].dtmfstr,4)) > year(today()) then<BR> channel[chno].dtmfstr=string(today(),"yyyy")<BR> channel[chno].nd=string(today(),"yyyy")<BR> end if <BR> //检索帐户内数据,例如上年余额,利息,统筹金划入,个人交纳,帐户内报销等<BR> f_getdata_yiliao(chno)<BR> //自定义函数f_getdata_yiliao(int i_chno)定义如下<BR> //real aa1,aa2,aa3,aa4,aa5,aa6<BR> //string sfz,s_nd<BR> //sfz=channel[i_chno].sfzhm<BR> //s_nd=channel[i_chno].nd<BR> // SELECT "QA39"."SNYE", <BR> // "QA39"."SNLX", <BR> // "QA39"."DWHR", <BR> // "QA39"."GRJN", <BR> // "QA39"."ZHNBX" <BR> // INTO :aa2, <BR> // :aa3, <BR> // :aa4, <BR> // :aa5, <BR> // :aa6 <BR> // FROM "QA39" <BR> // WHERE ( "QA39"."SFZHM" = :sfz ) AND <BR> // ( "QA39"."SJ" = :s_nd ) ;<BR> // aa1 = aa2 + aa3 + aa4 + aa5 - aa6 <BR> //channel[i_chno].a1=Round(aa1,2)<BR> //channel[i_chno].a2=Round(aa2,2)<BR> //channel[i_chno].a3=Round(aa3,2)<BR> //channel[i_chno].a4=Round(aa4,2)<BR> //channel[i_chno].a5=Round(aa5,2)<BR> //channel[i_chno].a6=Round(aa6,2)<BR> //return 1<BR> channel[chno].wstate=WS_STARTFILE <BR> channel[chno].jieduan=5 //准备转到播放姓名部分<BR> channel[chno].FName="ndxm.tw" //提示音文件,提示音"您的姓名"<BR> end if<BR> //养老帐户机离退休金省略<BR> ....<BR> END CHOOSE<BR> case 5 //播放姓名语音<BR> CHOOSE CASE channel[chno].wstate<BR> CASE WS_STARTFILE<BR> //播放姓名语音"您的姓名"<BR> f_start_file(chno,WS_ONFILE)<BR> case WS_ONFILE<BR> f_on_file(chno,WS_startoutputxingmin)<BR> //自定义函数f_on_file(int ch_no,int next_state)定义如下:<BR> //long retval<BR> // if tv_monitorbusy(ch_no -1,SIG_BUSY1,5)<>0 or tv_monitorbusy(ch_no -1,SIG_BUSY2,5)<>0 then<BR> // tv_stopplayfile(ch_no -1)<BR> // channel[ch_no].wstate=WS_FREE<BR> // tv_hangupctrl(ch_no -1)<BR> // channel[ch_no].jieduan=1<BR> // channel[ch_no].FName="welcome.tw"<BR> // else<BR> // retval=tv_playfilerest(ch_no -1) //继续播放剩余提示音<BR> // if retval<=0 then<BR> // channel[ch_no].wstate=next_state<BR> // end if<BR> // end if<BR> // return 1<BR> CASE WS_startoutputxingmin<BR> password="12345678" //语音合成库口令<BR> yyk_path="" //语音合成库路径,当前路径<BR> temp=PasswordDetect(password,yyk_path)<BR> if temp < 0 then //如果语音合成库出错,则挂机<BR> tv_hangupctrl(chno -1)<BR> channel[chno].wstate=WS_FREE<BR> channel[chno].jieduan=1<BR> channel[chno].FName="welcome.tw"<BR> else<BR> xm_temp=trim(channel[chno].xingmin)<BR> retval=TV_StartPlayCh(chno -1,xm_temp) //播放姓名语音<BR> if retval < 0 then //如果播放姓名语音出错,挂机<BR> tv_hangupctrl(chno -1)<BR> channel[chno].wstate=WS_FREE<BR> channel[chno].jieduan=1<BR> channel[chno].FName="welcome.tw"<BR> else<BR> channel[chno].wstate=WS_onoutputxingmin<BR> end if<BR> end if<BR> case WS_onoutputxingmin<BR> if tv_monitorbusy(chno -1,SIG_BUSY1,5)<>0 or tv_monitorbusy(chno -1,SIG_BUSY2,5)<>0 then<BR> tv_stopplaych(chno -1)<BR> channel[chno].wstate=WS_FREE<BR> tv_hangupctrl(chno -1)<BR> channel[chno].jieduan=1<BR> channel[chno].FName="welcome.tw"<BR> else<BR> retval=tv_playchrest(chno -1) //继续播放姓名语音剩余部分<BR> if retval<=0 then //播放姓名语音完毕<BR> choose case channel[chno].cx_select<BR> case 1 //yiliao<BR> channel[chno].wstate=WS_yiliao_nd<BR> channel[chno].jieduan=7 //准备转到播放医疗帐户数据部分<BR> channel[chno].FName="nd.tw" //设置放音文件名,提示所查年度<BR> case 2 <BR> .....<BR> case 3 <BR> .....<BR> end choose<BR> end if<BR> end if <BR> end choose<BR> case 6 //播放离退休金数据略</P><P> case 7 //播放医疗帐户数据<BR> CHOOSE CASE channel[chno].wstate<BR> case WS_yiliao_nd<BR> f_start_file(chno,WS_yiliao_on_nd) //播放年度提示语音<BR> case WS_yiliao_on_nd <BR> f_on_file(chno,WS_yiliao_nd_data)<BR> case WS_yiliao_nd_data<BR> f_start_year(chno,channel[chno].nd,WS_yiliao_on_nd_data) //播放年度数据语音<BR> case WS_yiliao_on_nd_data <BR> f_onmoney(chno,WS_yiliao_a1,"ye.tw") <BR> //自定以函数f_onmoney(int ch_no,int next_state,string fname)如下: <BR> //long retval<BR> // if tv_monitorbusy(ch_no -1,SIG_BUSY1,5)<>0 or tv_monitorbusy(ch_no -1, SIG_BUSY2,5)<>0 then<BR> // channel[ch_no].wstate=WS_FREE<BR> // tv_stopplayfile(ch_no -1)<BR> // tv_hangupctrl(ch_no -1)<BR> // channel[ch_no].jieduan=1<BR> // channel[ch_no].FName="welcome.tw"<BR> // else<BR> // retval=tv_playsentencerest(ch_no -1) //继续播放剩余的放音字符<BR> // if retval<=0 then<BR> // channel[ch_no].wstate=next_state<BR> // channel[ch_no].FName=fname<BR> // end if<BR> // end if<BR> // return 1 <BR> case WS_yiliao_a1 <BR> f_start_file(chno,WS_on_yiliao_a1)<BR> case WS_on_yiliao_a1<BR> f_on_file(chno,WS_yiliao_a1_data)<BR> case WS_yiliao_a1_data<BR> f_startmoney(chno,channel[chno].a1,WS_on_yiliao_a1_data)<BR> //自定以函数f_startmoney(int ch_no,real data_a,int next_state)如下:<BR> //long retval<BR> //double num<BR> // num=double(data_a)/1.0<BR> // 赋值生成的放音字符串,makemoney(num)对给定的数生成xx千x百X十X元X角X分放音字符<BR> // channel[ch_no].sentence=makemoney(num)<BR> // 播放帐户金额语音<BR> // retval=tv_playsentence(ch_no -1,channel[ch_no].sentence)<BR> // if retval<=0 then // 播放帐户金额语音失败<BR> // channel[ch_no].wstate=WS_FREE<BR> // tv_hangupctrl(ch_no -1)<BR> // channel[ch_no].jieduan=1<BR> // channel[ch_no].FName="welcome.tw"<BR> // else<BR> // channel[ch_no].wstate=next_state<BR> // end if<BR> // return 1<BR> //自定以函数makemoney(real num)<BR> //string strTmp<BR> //string strRet<BR> //double yuan, jiao, fen<BR> //if money=0 then<BR> // strRet=char(2)<BR> // strRet=strRet+char(19)<BR> // return strRet<BR> //end if<BR> //strRet=""<BR> //strTmp=space(60)<BR> //if money<0 then <BR> // strRet=strRet+char(18)<BR> // money=abs(money)<BR> //end if<BR> //yuan=truncate(money,0)<BR> //money=(money - yuan)*10.0<BR> //jiao=truncate(money,0)<BR> //money=(money - jiao)*10.0<BR> //fen = truncate(money,0)<BR> //if (yuan>0) then<BR> // tv_MakeSentence(yuan,strTmp) //生成多文件放音字符串<BR> // strRet=strRet + strTmp<BR> //// strRet=strRet + strTmp + char(19) //元<BR> //end if<BR> //if jiao=0 then <BR> // if fen>0 then<BR> // strRet=strRet+char(2)+char(fen+2)+char(21)<BR> // end if <BR> //else<BR> // strRet=strRet+char(jiao+2)+char(20) // 角<BR> // if fen>0 then<BR> // strRet=strRet+char(fen+2)+char(21) // 分 <BR> // end if <BR> //end if<BR> //return strRet <BR> case WS_on_yiliao_a1_data<BR> f_onmoney(chno,WS_yiliao_a2,"snye.tw")<BR> //播放"上年余额"数据语音<BR> case WS_yiliao_a2 <BR> f_start_file(chno,WS_on_yiliao_a2)<BR> case WS_on_yiliao_a2<BR> f_on_file(chno,WS_yiliao_a2_data)<BR> case WS_yiliao_a2_data<BR> f_startmoney(chno,channel[chno].a2,WS_on_yiliao_a2_data)<BR> case WS_on_yiliao_a2_data<BR> f_onmoney(chno,WS_yiliao_a3,"snlx.tw")<BR> //播放"上年利息"数据语音等<BR> case WS_yiliao_a3 <BR> ....<BR> case WS_on_yiliao_a3_data<BR> retval=tv_playsentencerest(chno -1)<BR> if retval<=0 then<BR> channel[chno].wstate=WS_STARTFILE<BR> channel[chno].jieduan=1<BR> channel[chno].FName="welcome.tw"<BR> end if<BR> END CHOOSE <BR> case 8 //播放养老帐户数据略<BR> END CHOOSE<BR> // 函数externalyyk ()结束<BR> 应用效果<BR> 本系统已经应用于油田采油厂,方便了人们对帐户金的查询。无论距离多远,仅需使用电话就可以得到所需信息,全天24小时随时提供查询服务。达到了系统设计要求,具有准确性、易于操作的特点。</P><P> 附录<BR> //设置函数声明,设置系统常量<BR> FUNCTION int TV_Installed() library "tw8vid32.dll"<BR> SUBROUTINE TV_Initialize() library "tw8vid32.dll" <BR> SUBROUTINE TV_Disable() library"tw8vid32.dll" <BR> FUNCTION int TV_ChannelType(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_OffHookDetect(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_RingDetect(int chno) library"tw8vid32.dll"<BR> FUNCTION unsignedint TV_StartPlay(int chno,string sp,unsignedint play) library"tw8vid32.dll"<BR> FUNCTION unsignedint TV_StopPlay(int chno) library"tw8vid32.dll"<BR> FUNCTION unsignedint TV_PlayRest(int chno) library"tw8vid32.dll"<BR> FUNCTION long TV_StartPlayFile(int chno,string sp,long long_min,long long_max) library"tw8vid32.dll"<BR> FUNCTION long TV_PlayFileRest(int chno) library"tw8vid32.dll"<BR> FUNCTION long TV_StopPlayFile(int chno) library"tw8vid32.dll"<BR> SUBROUTINE TV_MakeSentence(double double_test, REF string sp) library"tw8vid32.dll"<BR> FUNCTION long TV_PlaySentence(int chno,string sp) library"tw8vid32.dll"<BR> FUNCTION long TV_PlaySentenceRest(int chno) library"tw8vid32.dll"<BR> SUBROUTINE TV_FlushDTMF(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_GetDTMFChar(int chno) library"tw8vid32.dll"<BR> FUNCTiON string TV_GetDTMFStr(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_CheckSignal(int chno,int int1,int int2) library"tw8vid32.dll"<BR> FUNCTION int TV_ListenerOffHook(int chno) library"tw8vid32.dll"<BR> SUBROUTINE TV_StartMonitor(int chno) library"tw8vid32.dll"<BR> FUNCTION int TV_MonitorOffHook(int chno,int tirme) library"tw8vid32.dll"<BR> FUNCTION int TV_MonitorBusy(int chno,int int1,int int2) library"tw8vid32.dll"<BR> SUBROUTINE TV_StartTimer(int chno,long timer) library"tw8vid32.dll"<BR> FUNCTION long TV_TimerElapsed(int chno) library"tw8vid32.dll"<BR> SUBROUTINE TV_SetVoicei(int num,string fn) library"tw8vid32.dll"<BR> FUNCTION int PasswordDetect(string password,string path) library"Playch32.dll"<BR> FUNCTION int TV_StartPlayCh(int chn,string sentence) library"Playch32.dll"<BR> FUNCTION int TV_PlayChRest(int chn) library"Playch32.dll"<BR> FUNCTION int TV_StopPlayCh(int chn) library"Playch32.dll"<BR> CONSTANT Integer WS_NULL=0<BR> CONSTANT Integer WS_FREE=1<BR> CONSTANT Integer WS_STARTFILE=2<BR> CONSTANT Integer WS_ONFILE=3<BR> CONSTANT Integer WS_WAITDTMF=4<BR> CONSTANT Integer WS_GETDTMF=5<BR> CONSTANT Integer WS_STARTSENTENCE=6<BR> CONSTANT Integer WS_ONSENTENCE=7<BR> CONSTANT Integer WS_STARTMONEY=8<BR> CONSTANT Integer WS_ONMONEY=9<BR> CONSTANT Integer WS_WAITEND=10<BR> CONSTANT Integer WS_looksfzhmfromdb=11<BR> CONSTANT Integer WS_retrievedatafromdb=12<BR> CONSTANT Integer WS_startoutputxingmin=13<BR> CONSTANT Integer WS_onoutputxingmin=14<BR> CONSTANT Integer WS_yiliao_nd=16<BR> CONSTANT Integer WS_yiliao_on_nd=18<BR> CONSTANT Integer WS_yiliao_nd_data =100<BR> CONSTANT Integer WS_yiliao_on_nd_data =101<BR> CONSTANT Integer WS_yiliao_a1 =40<BR> CONSTANT Integer WS_on_yiliao_a1 =41 <BR> CONSTANT Integer WS_yiliao_a1_data =42<BR> CONSTANT Integer WS_on_yiliao_a1_data =43<BR> CONSTANT Integer WS_yiliao_a2 =44<BR> CONSTANT Integer WS_on_yiliao_a2 =45 <BR> CONSTANT Integer WS_yiliao_a2_data =46<BR> CONSTANT Integer WS_on_yiliao_a2_data =47<BR> CONSTANT Integer WS_yiliao_a3 =48<BR> CONSTANT Integer WS_on_yiliao_a3 =49 <BR> CONSTANT Integer WS_yiliao_a3_data =50<BR> CONSTANT Integer WS_on_yiliao_a3_data =51<BR>
 

状 态: 离线

公司简介
产品目录

公司名称: 中华工控网
联 系 人: 客服中心
电  话: 0755-26546361
传  真: 0755-26585268
地  址: 深圳市南山区创业路现代城华庭1栋6A
邮  编: 518054
主  页:
 
该厂商相关技术文摘:
智能仪器仪表的发展特点与前景分析
电动机性能虚拟仪器测试系统设计与实现
视频监控护航高铁安全运营
基于PLC,触摸屏及变频器对吹膜机的改造
永宏PLC应用于自助图书借还终端机
基于永宏PLC的GSM通讯原理及其应用
改善汽车生态学、安全性和舒适性,四大测试分析是关键
改善汽车生态学、安全性和舒适性,四大测试分析是关键
数控技术的发展趋势及产业化
数控技术发展战略与发展途径的思考
用Energid 的软件进行机器人的抓取和操作
如何借助RFID技术升级企业信息管理水平
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved