GVOS 8.2 SP1 (ADL)& CT ADE 结构
(一)
 

 

1. Dialogic CT ADE

  任何CT应用的核心都是语音卡。语音卡就是类似于以太网卡或声卡的一个PC扩展卡,具有语音处理的功能。支持多种PC总线:ISA(16bit,8 Mhz)和PCI(33 MHz)。具有模拟和数字两种网络接口。模拟接口为RJ-11口,数字接口为E-1口(EE.UU. 为T1口)或者为ISDN 端口(PRI或BRI)。
  另一个重要的概念是语音总线,语音总线可以使资源共享。语音卡附带基于C/C++环境的DLL的API。C/C++语言通常是用于复杂的底层应用开发的语言(S.O. , 设备驱动程序等等)。C/C++代码的维护和编写都比较容易。
  Dialogic的 CT ADE 的基本目的是帮助开发者缩短开发流程,它是一种易用、功能齐全、工业级的软件开发环境。

2. 介绍

  CT ADE - 图形化的 VOS 8.2 SP1,是Dialogic 最新版本的电话应用开发工具。这些工具包括信息流图产生器,VOS源码编辑器,VOS源码编译器,VOS 源码单步调试器和信号量(Simaphore):一个可以使用任何windows 声音设备(比如声霸卡)的电话线模拟器。所有的这些工具都集成在一个单一的开发环境中:CT ADE。

 2.1 Dialogic 商标名称

  Since the acquisition of Dialogic over Parity Software,本产品不断更新,请参照下表熟悉新的用语:
Graphical VOS-应用开发语言(ADL)
CallSuite - 应用开发Activex组件(ADX)

3. CTADE,第一步:安装


  首先必须安装 CT ADE,首先把CD(自动运行的CD)放入光驱,屏幕上会弹出下列菜单:我们安装了带有 CTADE 体系结构引擎的VOS。

4. CTADE,图形化的VOS

  安装完图形化的VOS后,可以看到下面的菜单:

  接下来必须设置CTADE_A层,以便可以检测到系统中安装的Dialogic驱动和板卡(R4,S.100, 等等)。CTADE_A可以通过运行TopazProfile.exe检测到Dialogic的设置。
  只要我们做了这样的检测(第一次和每次通话设置改变以后)。就可以使用带有CTADE_A的图形化的VOS了。
  下面讨论Graphical VOS的重要特征以及如何利用此工具得出最佳的结果。

5. VOS语言参考


 5.1 什么是VOS?

  VOS(Voice Operative System) 是包括:
  ·脚本语言
  ·VOS 语言编译器
  ·VOS 代码运行

 5.2 第一个VOS程序 

  我们先看一个VOS的例子程序:
  program
  vid_write("I am a VOS program!");
  vid_write("Type any key to exit...");
  kb_get();
  vid_write("Exiting now.");
  endprogram


  为了证明VOS的多任务运行的能力,下面看一个两程序并行运行的例子。
下面程序在屏幕上显示一个简单的时钟,每秒钟刷新:
  program
   for (;;)
    vid_cur_pos(0, 50);
   vid_print(time() & " " & date());
   sleep(10); # Wait one second
   endfor
  endprogram

  下面在运行这两个程序的同时运行第三个程序:
  program
   spawn("clock");
   spawn("hello");
  endprogram

6. VOS语言

  本章中我们简要的回顾一下VOS语言的重要的概念。
  VOS语言专门用于进行呼叫处理,是一种易学、健壮、运行快速的语言。例如,没有动态内存分配,因此系统不会内存不足。VOS语言比VB简单,更比C/C++简单得多。

 6.1 源代码

  VOS是一种字母大小写敏感得语言,语言的所有组成部分都区分大小写。
  源代码中的注释可以用"#"字符标识(这是一个所谓的"英镑"符号,在英语PC中显示为? 或者非英语PC中显示为其他特殊符号,ASCII码为35,十六进制为23h)。注释一直到此行结束。
  除非作为注释行,否则行结束符没有特殊的语法规定,多条语句可以写在同一行内。但不提倡这样写,因为这样会使源码难以理解。
一个VOS程序的源代码如下所示:

  <variable declarations>
  program
    ...any number of statements...
  endprogram
  <onsignal declaration>
  <function declarations>

  <declarations>部分定义了程序中所用的变量和常量。可以包括多个dec…enddec 块,这些程序块可以在endprogram块的前面或后面,也可在任何endfunc块的前面或后面。
  一个完整的VOS程序如下所示:
  dec
    var line : 2;
    const MSG = "C:\MSG\message.vox";
  enddec

  func Message()
    MediaPlayFile(MSG);
  endfunc

 6.2 数值

  VOS中的所有的数值都以字符串的形式保存。字符串以双引号表示,如下所示:
"This is a string "

  6.2.1. 数字值

  数字由十进制的字符串表示,例如,123由字符串"123"表示。数字字符串在书写时可以省略双引号,所有"123"和123表示相同的数值。

  6.2.2. 逻辑值

  逻辑值"真"和"假"也是由字符串表示,"假"由空字符串表示,记为"","真"由"1"表示。

 6.3 变量

  变量名就是一个字符串,当VOS开始运行或者重启时,所有的变量均置为空字符串。
  变量长度有限制,如果字符串的长度大于最大长度,则按最大长度取值。如果在调试模式下运行VOS,当一个字符串被截短后会弹出一个警告信息。(如果要避免这些告警,赋值时使用substr函数)

  为什么要对变量限定最大长度?为什么VOS不运行动态分配内存?主要是因为呼叫处理系统常常在无人维护的状态下运行数天、数星期或者数个月。设计VOS时避免使用内存动态分配是为了防止内存碎片和内存不足等问题,这也是为VOS设计一种新的语言而不使用现存的语言的原因。
  变量在使用前必须声明(给定变量名和最大长度),变量可以在两个地方声明:主程序运行前或者函数内。一个带有变量声明块的例子程序如下:

  此例中定义了两个变量:一个为x,长度为2个字符,一个为y,长度为3个字符。
  变量名必须以字母开始,可以包括数字(0…9)、下划线(_),变量名长度不限。VOS语言区分大小写,所以X和x代表两个不同的变量。

  必须注意符号表的概念,VOS符号表不分级别,也就是说函数名是全局的,并且变量名在整个任务中均可见:
  dec
   var x : 2;
   var y : 3;
  enddec
  program
   x = 12;
   y = 123;
   y = "Too long"; # y 变成 "Too"
  endprogram

  func suma(a,b)
  dec
   var x:2; <<<< - ----- 编译错误
  enddec
   x = a+b;
   return x;
  endfunc

 6.4. 数组

  数组是以同一名字(标识符)表示的一组字符串。
  一个数组是指一个或多个变量,这些变量长度相同,名字相同。数组中不同的变量靠下脚的标号来标识。比如,有一个名字为a,包括三个变量的数组,如下所示:
  a[1],a[2],a[3]
  这三个变量可以分别赋值,分别使用。例如:
   a[1] = "Hello";
   x = a[3];
   spk_num(a[2]);

  数组和变量在相同的地方定义。
  一个数组定义的例子如下:
   dec
    var Arr[1..10] : 8;
   enddec

  数组的索引可以使用任何表达式。
  一般来说,数组定义方式为:
  <ArrayName> [ <MinIndex> .. <MaxIndex> ] : <MaxLen>
  数组索引必须在0….255.范围内,也就是说<MinIndex>和 <MaxIndex>范围为0…255。
  一个程序中定义的数组个数不能超过255。
  对于更大的数组,强烈建议使用glb_dimx来实现,使用动态内存分配,以后再讨论。

 6.5 常量,介绍


  常量是指VOS使用的固定值,由字符串表示,字符串通常由双引号括起来:
  "This is a string"
  如果字符串中的所有字符都是十进制的数字,则双引号可以省略,"123"和123表示相同的字符串。注意,由于此规则,-123表示一个单一的负号和一个常量字符串"123",而"-123"表示一个长度为4个字符的常量字符串。
  一个字符串中,后半个单引号,',具有特殊的意义。符号,',及其随后的字符的含义如下所示:

 序列 此单个字符在字符串中的意义
 ''  单个后向单引号'
 'q  双引号"
 'r  回车(十六进制 0x0A)
 'n  换行(十六进制 0x0D)
 't  Tab (十六进制 0x09)
 'xx  十六进制字节xx,比如'09与't相同,但'00非法。

  在一个dec…..enddec块中,可以为一个常量取一个名字。Dec … enddec块可以放在主程序的前面,这种情况下,所声明的常量可以在整个程序中使用。如果Dec … enddec块在一个函数前面,则所声明的常量只能在此函数内使用。当VOS开始执行程序时和重启时,所有的变量均设置为空字符串。
  一个典型的声明块如下所示:
  dec
    var <name> : <length>, <name> : <length> ... ;
  …..更多的变量声明….
    const <name> = <value>, <name> = <value> ... ;
  …..更多的常量声明….
  enddec


  比如:
  dec
    const MAX_LINES = 24;
  enddec

  定义一个常量MAX_LINES表示两个字符的字符串"24"。
  此定义之后,当程序中要使用"24"字符串时,就可以用MAX_LINES代替。
  可以用常量表达式为常量名赋值,常量表达式就是由常量字符串、运算符和括号(但不能包括函数调用)组成的表达式。例如:

  可以通过-D命令行传递给Vlc的常量也可以用于常量表达式。
  看另一个常量,
  const LOCAL_AREA_CODE = 415;
  在此定义下,程序中要使用常量415时,就可以用LOCAL_AREA_CODE代替。这种用法有两个好处,首先,当程序需要改变时,比如程序要在纽约运行,即     LOCAL_AREA_CODE要改变,则程序中只需要改动一处:
  const LOCAL_AREA_CODE = 201;

  习惯上常量名一般使用大写字母,但VOS或vlc中可以不遵循此惯例。

 6.6. 算术表达式

  VOS中可以使用以下基本算术表达式:

  运算符有不同的优先级,例如,乘法的优先级比加法高,所以在表达式A+B*C中,先计算乘法B*C,乘法结果再与A相加。可以用园括号(…)改变优先级,比如表达式(A+B)*C中,先计算加法。

  重要提示:

  算术运算由VOS采用32位整数的精度进行运算。如果结果中包括10个或10个以上十进制位,则结果可能是错误的。如果数值的精度超过32位,VOS不会产生警告或错误的信息。
  因为VOS内部采用32位的精度,VOS中数值的范围是-231~231-1,即:
   -2147483648 to 2147483647
  因此可以表示所有9位的十进制数,但是大部分10位的十进制数都不能表示。也就是任何两个9位的十进制数字都可以相加,并且结果正确,所以
   999999999 + 888888888
  可以得到正确的结果,但是:
   (999999999*5)/4
  不能得到正确的结果,因为运算中乘法的结果超过32位的精度。

 6.7.带小数点的算术值

  VOS还没有处理定点或浮点小数的内置函数。可以免费得到支持DOS和Windows的FP RLL,可以提供十进制小数运算函数,如fp_add, fp_sub 等等。

 6.8. 逻辑条件

  VOS提供了逻辑运算符(与,或,非)和关系运算符(大于,小于…),运算结果为逻辑值(true和false),真由"1"表示,假由""表示,两个逻辑值的逻辑运算符如下:

  关系比较运算符:

  例如:
   "001" eq "1" True
   "001" streq "1" False !!!
   "*" eq "#" True !!!

 6.9. 赋值运算


  运算符=(赋值)是一个特殊的运算符。左边必须是变量(或数组元素)。右边可以是任何表达式。下面是正确的赋值运算的例子:
    x = 1;
    Month = 3;
    MonthName = "March";
    TotalSeconds = Hours*3600 + Mins*60 + Secs;

  除此以外还有下列赋值运算符:+=,-=,*=和/=。最常用的运算符是+=,可以解释为相加后赋值,例如:
    n+=1;
  表示n加1。先把右边的表达式计算出结果,此值加左边的变量。同样,-=是相减后赋值。因为加1和减1的运算比较频繁,所以提供了++和-这两个运算符,如下所示:
    x++ x加1,(x++)取x加1前的值。
    ++x x加1,(++x)取x加1后的值。
    x-- x减1,(x--)取x减1前的值。
    --x x减1,(--x)取x减1后的值。

  如果只是对一个变量进行加1或减1的运算,就不需要考虑运算前后的值。比如,下面两个运算式等价:
    x++;
    ++x;

  这两个运算结果相同,如果运算的结果在后续的运算中使用,例如:
    x = 8;
    y = x++; # y=8, x=9
    x = 8;
    y = ++x; # y=9, x=9

  可以看出,计算结果中y的值不同,如果用户感到类似+=、++等运算比较容易混淆,可以不使用它们,使用=运算符也可以达到相同的结果。如果你是C语言程序员,就会发现这些运算符比较方便。

  6.10. 字符串连接

  &运算符将其左右的两个字符串合在一起,连成一个字符串,称为字符串连接。例如,"A" & "B"的结果是"AB"。看另一个例子:
    FirstName = "Joe";
    LastName = "Smith";
    FullName = FirstName & " " & LastName;
    FullName的值为"Joe Smith";

  要点:
  注意字符串连接是优先级比较高的运算,当与算术运算符一起使用时,可能会出现一些微小的错误,看下面的例子:
  表达式:
    x = "Result is " & 2*2;
  的结果为x="0",这是因为&的优先级比*高,所以先进行连接字符串的运算:
    x = "Result is 2"*2
  但字符串"Result is 2"转换为数字时为0(因为第一个字符不是数字)。所以最终结果为0*2=0。如果要先进行乘法运算,可以使用圆括号。
    x = "Result is " & (2*2);

  6.11. 循环

  循环就是重复运行一条或多条语句,VOS语言包括三种循环:for,do…until和while。可根据自己的风格选用,任何循环操作都可以由这三种循环完成。
  用法如下:

    for (initialize ; test ; increment)
      statements
    endfor

    while ( test )
      statements
    endwhile


  程序中斜体字使用相应的代码:
    statements
  循环重复运行一条或多条语句,可能运行0次或多次。
    initialize
  循环开始前运算的表达式。在for循环中,如果不需要可以为空。
    test
  一个逻辑条件,每次循环都检查逻辑结果,决定是否进行后面的循环操作。For和while-loop循环中,每次循环前检查条件,如果结果为真,则继续循环,如果第一次检查结果就为假,则循环的语句永远不会运行。Do…until循环中,循环操作一直运行,直到条件成立。For循环中,此条件可以为空,这种情况下条件永远为真,循环操作永远进行,或者通过goto,jump或return语句退出循环。
    increment
  for循环中,每次循环后计算此表达式,如果第一次test条件为假,则此表达式永远不会执行。For循环中,此处可以为空。
  最常见的循环是变量从1开始,直到上限,即最大值。下面循环使用变量n计算1+2+….+Max的和,

 

  无穷循环(或通过break退出)可以用for循环实现:
    for (;;)
     # ...
    endfor

  或while循环实现:
    while (1)
     # ...
    endwhile

  条件真用"1"表示,所以条件永远为真。

 6.12. 函数调用

  一个函数是指一组语句序列,具有函数名和返回值。一个函数可以有一个或多个参数。参数在函数内可以当作变量一样使用,但不能为其赋值。
  VOS中有三种函数:

  • 内置函数。这些函数是固化到VOS和vlc中的函数,因此程序中总可以使用这种函数。
  • 用户定义函数。用VOS源码编写的程序。
  • RLL程序。这些函数是用C或C++编写的。以二进制文件的格式载入,称为运行连接库(RLL)。DOS中,RLL是驻留内存程序,Windows中,RLL是动态连接库(DLL)。


  这三种函数的调用方式完全一样,调用方式是函数名,后面为括号中的参数,参数由逗号分开。即使函数没有参数,括号也不能省略。下面是一些函数调用的例子:
    vid_write("Hello"); # 内置函数
    MyFunc(); # 用户定义函数
    code = Fquery(queue, index); # RLL函数

  因为用法几乎相同,所以不能从调用方式中区分内置函数、用户自定义函数和RLL函数。
  一个表达式中含有函数名时,先执行函数(调用函数),得到返回值,表达式中使用函数返回值。
  所有的函数都有返回值,如果函数中没有指定返回值,则返回空字符串(不包含字符的字符串"");许多函数都不返回有用的返回值,比如vid_write总是返回空字符串。如果返回值在语句中没有使用。比如:
    vid_write("Hello"); #返回值没有使用
  VOS忽略返回值。如果返回值有用,返回值可以用在表达式中。例如,假设函数MyFunc需要两参数,返回一个数值,则下列语句为正确的:
    MyFunc(1,2);#忽略返回值
    x=MyFunc(1,2);#返回值赋值给x
    y=x*MyFunc(1,2)+z;#表达式中使用函数返回值

  函数的参数可以是常量、变量和表达式,下面语句是正确的:
    MyFunc(1, 2); # 常量
    MyFunc(x, y); # 变量
    MyFunc(z, y+123); # 表达式
  函数参数中的表达式本身可以包含函数调用。类似于VOS语言中的其他特性,VOS允许多重递归调用。

 6.13. 函数和库文件

  VOS中有多种管理用户函数的方法:函数文件和库函数文件。
  函数文件一般都是文本文件,文件名为函数名,扩展名为.FUN。例如:
  文件->add.fun
    func add(arg1,arg2)
      return arg1+arg2;
    endfunc

  库函数文件的扩展名为.vl。这种文件是一组函数(.FUN)的集合。可以使用mkvl命令生成这种库函数文件,并可以加密。
   mkvl <fich. Definition> <file lib>
  定义的库文件为文本文件,含有.FUN文件索引。
    func1.fun
    func2.fun
    \PROJ\FUNCS\LongFunctionName.fun
    E:\SHAREDF\PROJ\OtherLongName.fun

 6.14. 包含文件

  一个源码文件可以使用include语句来包含另一个文件的所有内容。这种方式一般用来包含标准的常量定义。例如:
   dec
     include "project.inc"
     var MyVar : 2;
    enddec

 6.15. 内部函数

  VOS包含了众多的内置函数,这一部分我们对重要的一些函数组进行简要地介绍:

  6.15.1. 数据库函数


  db_函数支持dBase兼容的DBF数据库以及Clipper兼容的NTX索引。程序运行中可以打开和关闭数据库,一个任务可以同时打开多个数据库。支持多用户文件和记录表锁定。可以通过RLL操作其他类型数据库,操作细节随操作系统不同而变化。
  建议使用我们的数据库操作RLL,象可用于任何系统的AdoRll。AdoRll可以通过SQL语句操作数据库服务器(Informix,Oracle,SQLServer等等)。

  6.15.2. 串口通信


  ser_ functions支持通过COM1~COM4的RS-232串行通信。

  6.15.3. 任务管理


  有许多任务管理的内置函数,包括spawn,chain,exec,arg,getpid和kill。

  6.15.4. 任务间通信

  VOS提供了任务间通信的四种方法:全局变量 (glb_functions),信号量 (sem_ functions), 消息 (msg_ functions)和 分组 (grp_functions)。
  在手册中后面介绍这些方法。

  6.15.5. 字符串处理

  有许多种处理字符串的函数,包括length,substr和许多其他的函数,参照字符串函数。

  6.15.6. 屏幕和键盘

  vid_和kb_函数提供了简单的屏幕输出和用户输入的方式。在Windows下,你也许想要制作图形用户界面,可以通过使用NetHub ActiveX组件在Visual Basic,Delphi,Visual C++或其他Windows可视化工具下制作用户界面。

 6.16. 外部函数

  VOS的所以外部函数都是在C/C++下开发的。这些函数是带有特殊入口的DLL。VOS通过入口调用DLL的内部函数。我们常称这些DLL为RLL(运行连接库)。我们提供了C/C++开发包,用户可以使用任何Windows的C/C++编译器(Visual C++,Borland C++,C++ Builder等等)开发自己的RLL。
  下面介绍一些最常用的RLL。

  6.16.1. NetHub Plus RLL


  NetHub Plus是一个企业化的组件,它支持进程中线程间的通信,这些进程包括PC中单个进程或局域网以及广域网上节点中的单个进程。
  NetHub Plus既可以作为ActiveX控件使用,又可以作为VOS RLL使用。
  NetHub Plus的一个例程可以与NetHub Plus的一个或多个其他例程通信,这些例程可以是在同一台PC上或同一网络上。
  VOS RLL为每一个VOS任务载入一个单独的NetHub Plus ActiveX组件例程。

  消息
  NetHub Plus的任何例程之间都可以收发消息。消息是一个字符串,最大长度为127的字符,可以通过MsgGet方法接收,或者通过MessageReceived事件接收。

  信号量(Semaphore)
  可以使用信号量来保护共享资源和代码的关键部分。一个信号量是一种特殊的变量,有两种可能值:设置或清楚。如果一个NetHub Plus例程设置了一个信号量,直到这个例程清除,其他的例程都不能设置。信号量只能由设置它的例程清除。

  共享的网络变量
  共享网络变量包含网络上任何NetHub Plus的例程都可以访问的数据。网络变量由变量名和索引号组成。索引与数组下标相似。共享的网络变量的最大长度为127个字符。
  信号量(Semaphores)和网络变量都由名字区分,名字是一个长度为1到127的字符串。第一个字符必须是字母或下划线,其他的字符可以是字母、下划线或数字。

  6.16.2. Ado RLL

  ADORLL是一种可以通过ADO或者ODBC可以直接访问数据库服务器的RLL。
  强烈建议使用ADO Ole DB提供连接 ,尽量不要使用ODBC提供连接,因为稳定性和性能都不太好。

  6.16.3. Socket RLL

  IP网络上运行的VOS任务可以通过Sockets RLL交换消息,IP网可以是企业内部网、因特网、运行TCP/IP的Novell网或任何支持IP的其他网络。
RLL只是支持Windows NT,不支持Windows 9x。
  缺省Socket RLL使用端口2222(十六进制 0x08AE),可以通过 ws_SetRemotePort函数来改变连接端口号。

  6.16.4. Web RLL

  WebRLL是VOS的一个运行连接库(RLL)。
  WebRLL提供函数,可以使VOS程序:
  ·从一个Web服务器获得文档
  ·从获得的网页中获得数据(例如一个电子商务服务器)
  ·通过FTP协议发送和接收文件



 6.17. 多任务

  VOS可以同时运行多行语句,VOS有自己的多线程引擎来管理每一个任务。一个单通道的VOS应用程序如下:

  上图中是一个简单的单通道VOS任务,如果想用这个程序来管理4个通道,我们只有采用下面方式:

  VOS内部同时运行4个任务。开始只有一个任务,此任务产生了4个任务,各任务间互相传递参数(通道号)。函数arg(1)检索参数个数1,这种情况下,arg()是通道号码。
  可以使用两种方法来产生VOS任务:同步和异步。异步产生任务采用:
   task_nr = spawn(filename[, arg, arg...])
  同步产生任务采用:
   string = exec(program_name[, arg, arg...])

 6.18. 任务管理

  从前面几章可以看出,VOS能够为多通道应用同时管理多个任务或者运行后台任务,任何任务都有自己的一组变量和数组以及自己的执行路径。
  下面介绍管理VOS任务的一些基本概念

  6.18.1. 任务号

  每一个运行的任务都有一个唯一的任务号,任务号也称为进程号(pid),这是从UNIX的术语中得来的,UNIX中任务也称为进程。Getpid函数返回当前任务的任务号,例如:
  my_task_nr=getpid();

  6.18.2任务挂起

  使用函数sleep可以随时挂起当前任务。参数是任务重新运行所需要等待的时间,单位为0.1秒。例如:
  sleep(50); # 等待5秒钟
  挂起时间必须小于12个小时,即小于432000。
  挂起的任务不占用任何处理器资源(VOS v5或更高版本)。这就意味着轮循所产生的性能问题可以通过短时间挂起循环操作来消除。例如,如果一个任务在等待一个全局变量值改变或等待呼入:
    while (glb_get(0) strneq "NEW" and not TrunkGetState() strneq "Idle"))
      sleep(2);
    endwhile

  6.18.3. 终止任务

  可以使用kill函数来终止一个任务,kill函数用任务号作为参数:
   kill(condemned_task_nr);
  执行此函数后任务马上就会终止,除非任务已被挂起,在等待内置函数的结束,例如sleep、sem_set、sc_play等函数。在任务被挂起的情况下,任务会在当前的内置函数结束后终止。
  Kill函数的返回值表示此操作是否成功:
   -1  无效任务号(此任务根本没有激活过)。
   0  任务被挂起,当前的函数结束后任务就终止
   1  无效任务号(任务被激活过,但已经终止了)。
   其他 任务立即终止。


  6.18.4. 信号量、消息和全局变量


  VOS提供的多任务环境中,通常情况下各任务独立地运行。有时,任务之间需要调整它们之间地活动或交换信息。
  VOS提供了三种任务间通信的函数:
  ·信号量(Semaphores)
  ·消息
  ·全局变量
  信号量(Semaphores)通常管理代码的关键部分,所谓关键部分就是指一组语句序列,如果两个任务同时运行这部分代码时,会产生错误。

 例:
   sem_set(1);
     # Update Critial-Zone
   sem_clear(1);

  共有两种信号:编号的信号量和命名的信号量。命名的信号量可以通过信号量的名称来进行操作,下面列出了管理命名信号量的函数:

  VOS任务间使用msg_函数来传送字符串消息。
    code = msg_put(pid, string);
    string = msg_get(seconds);
    pid = msg_pid();
    name = msg_sendername()
    msg_flush()

  全局变量是VOS任务间共享信息的一种非常有用的方式,采用全局变量的函数如下所示:

  全局变量
  glb_get   value = glb_get(num)
  取得给定全局变量号码的当前值。
  glb_set   glb_set(num, string)
  设定全局变量为给定得字符串。

  命名的全局变量
  glb_clrallx  glb_clrallx(Name)
  设置全局变量所有值为空字符串。
  glb_decx    glb_decx(Name[,Index1, ...])
  一个命名的全局变量值减去1。
  glb_dimx    glb_dimx(Name[,Lower1,Upper1, ...] [,MaxLength])
  产生一个新的命名全局变量。
  glb_getsizex  glb_getsizex(Name)
  返回指定的全局变量的最大长度。
  glb_getx    glb_getx(Name[,Index1, ...])
  取得一个命名全局变量的值。
  glb_incx    glb_incx(Name[,Index1, ...])
  命名全局变量的值加1。
  glb_lowerx   glb_lowerx(Name[,DimNr])
  返回变量某一维索引的下限。
  glb_nrdimsx   glb_nrdimsx(Name)
  返回全局变量的维数。标量返回0,矢量返回1,矩阵返回2等等。
  glb_rangex    glb_rangex(Name[,DimNr])
  返回变量某一维索引的范围(若没有给定,则取0)。
  glb_setallx   glb_setallx(Name, Value)
  将某个全局变量的所有字符串设置为给定值。
  glb_setx     glb_setx(Name[,Index1, ...], Value)
  将某全局变量的某字符串设置为给定值。
  glb_upperx    glb_upperx(Name[,DimNr])
  返回变量某维索引的上限。

 6.19. 日期与时间函数

  IVR系统中的任务常常使用日期和时间(比如,呼叫的时间)。VOS的日期和时间函数如下所示:

 6.20. 字符串函数

 6.21. 文件和目录函数(fil_,dir_)

  VOS提供了许多读写、查找文件和目录的内置函数,任何可以通过命令行查看的文件,包括网络服务器文件,都可以通过这些函数来访问。

 6.22 图形化VOS,介绍

  第一次运行图形化的VOS时,会看到如下界面:

  首先介绍一个新的概念――项目(PROJECT),对于使用VOS早期版本的开发者来说,这是一个新的东西,像市场上许多其他的编程工具(Visual Basic,Visual C,Borland C++Builder,等等)一样,一个Project包含应用程序必须的所有文件。一个VOS的Project包括:
  ·VOS源代码(.VS)
  ·信息流表(Flow Charts)(.flw)
  ·与项目相关的RLL
  ·INC,FUN,DEC,VL文件
  VOS源代码文件是使用VOS语言编写的文本文件。VOS源代码文件通过如下格式加入文件夹Application中的项目中:Application+Vos源代码文件名:

  在每一个文件夹中都有包含文件(.inc),函数文件(.fun),declaration文件和函数库文件(.vl)的索引。
  信息流表文件指信息流表格的CTI应用。例如:

  6.23. 图形化VOS,第一步

  下面,创建一个新的VOS项目(Project)来了解一下设置过程,创建一个新的VOS项目后,可以得到一个文件夹名为master。
  非常重要提示!!!永远不要删除程序master的索引,因为这是VOS要求的!
这一步完成后,我们可以使用File菜单中的New函数来添加、删除、编辑信息流表和VOS应用。

  6.24. 图形化VOS,基本配置

  首先配置系统的中继线(菜单 Project->设置中继)。在中继设置主窗口中,有一个TrunkConfiguration 选项卡。本选项卡用来设置每一通道应用及其相关程序类型。共有3种程序:
 1. 固定的:确实的类型的程序。当有站内呼叫通过此通道。VOS执行此程序。
 2. ANI:对于选定的通道,VOS执行"ANI Phone Number"选项中设置的应用
   程序。
 3. DNIS:对于选定的通道,VOS执行"DNIS Phone Number"选项中设置的应
   用程序。
  ANI和DNIS 选项卡用来设置ANI和DNIS控制执行的应用程序,一个典型的例子就是不同DNIS下不同业务的900语言文本系统。

  对于其他的DNIS或ANIS(没有列出),可以关联一个程序或者拒绝呼入。

 

[ 全文英文版 ]

 

 


本文 [ 目录 ] [ 第一页 ] [ 第二页 ] [ 第三页 ]

融合通信专栏>>技术开发>>