现代交换技术实验报告全.docx

上传人:b****0 文档编号:9337732 上传时间:2023-05-18 格式:DOCX 页数:30 大小:4.08MB
下载 相关 举报
现代交换技术实验报告全.docx_第1页
第1页 / 共30页
现代交换技术实验报告全.docx_第2页
第2页 / 共30页
现代交换技术实验报告全.docx_第3页
第3页 / 共30页
现代交换技术实验报告全.docx_第4页
第4页 / 共30页
现代交换技术实验报告全.docx_第5页
第5页 / 共30页
现代交换技术实验报告全.docx_第6页
第6页 / 共30页
现代交换技术实验报告全.docx_第7页
第7页 / 共30页
现代交换技术实验报告全.docx_第8页
第8页 / 共30页
现代交换技术实验报告全.docx_第9页
第9页 / 共30页
现代交换技术实验报告全.docx_第10页
第10页 / 共30页
现代交换技术实验报告全.docx_第11页
第11页 / 共30页
现代交换技术实验报告全.docx_第12页
第12页 / 共30页
现代交换技术实验报告全.docx_第13页
第13页 / 共30页
现代交换技术实验报告全.docx_第14页
第14页 / 共30页
现代交换技术实验报告全.docx_第15页
第15页 / 共30页
现代交换技术实验报告全.docx_第16页
第16页 / 共30页
现代交换技术实验报告全.docx_第17页
第17页 / 共30页
现代交换技术实验报告全.docx_第18页
第18页 / 共30页
现代交换技术实验报告全.docx_第19页
第19页 / 共30页
现代交换技术实验报告全.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

现代交换技术实验报告全.docx

《现代交换技术实验报告全.docx》由会员分享,可在线阅读,更多相关《现代交换技术实验报告全.docx(30页珍藏版)》请在冰点文库上搜索。

现代交换技术实验报告全.docx

现代交换技术实验报告全

基础实验一时间表调度实验

1.实验容

 :

实验目的

 :

实验原理与设计

 :

实验主要数据结构

 :

实验效果检验

一.实验目的:

  驱动交换网络实验用来考查学生对时间表调度原理的掌握情况。

二.实验原理与设计:

  在程控数字交换的体系结构中,周期级程序(例如摘挂机检测程序、脉冲识别程序、位间隔识别程序)是由时间表调度实现的。

所谓时间表调度,是指每经过交换系统的最短有效时间(这通常是指各周期性程序周期的最大公约数),都会检查调度表的调度要求,如果某个程序在这时需要执行,则调度程序开始执行它。

  在我们设计的时间表调度实验中,这个调度表的调度是静态的。

所谓静态,是指我们的调度表是在系统初始化的时候就建立起来的,在系统运行的情况下不再改动。

实验要求的就是这个调度表的初始化。

这个调度表如下:

时间(10ms) \任务

 0:

摘挂机检测任务

1:

脉冲检测任务

2:

位间隔检测任务

      0

      0/1

      0/1

     0/1

      1

      0/1

      0/1

     0/1

 .....

                                         ....

                                                                         .....

     18

      0/1

      0/1

      0/1

     19

      0/1

      0/1

      0/1

    我们这个交换系统提供了三个周期性调度程度(摘挂机检测程序、脉冲识别程序和位间隔识别程序),它们的调用周期分别为200ms、10ms和100ms,所以我们系统的最小调度时间为10ms。

如图所示,每隔10ms,我们就会检查这个表的一行,如果该行上某一列为1,我们就执列所对应的任务,如果为0,就什么都不做。

每当执行到这个表的最后一行,调度任务会返回第一行循环执行。

而你所要做的就是按照你的理解来填写这个调度表。

三.实验主要数据结构:

  函数功能:

完成调度表的初始化;

  函数原型:

initSchTable(intScheduleTable[SchTabLen][SchTabWdh]);

   其中SchTalLen和SchTabWdh为在bconstant.h中的宏定义:

  #defineSchTabLen20  //代表这个调度表为20行(相邻行之间的时间间隔为10ms);

  #defineSchTabWdh3   //代表三个周期性调度任务——0:

摘挂机检测任务;1:

脉冲检测任务;2:

位间隔检测任务;

四.实验效果检验:

    当调度表初始化正确时,能够进行正常的通话;如果初始化不正确,可能会造成周期性程序的不正常调用,例如位间隔调度的延迟会造成识别位间隔的延误甚至丢失。

  注:

由于为循环程序,所以调度表的初始化方案不唯一。

2.源代码

#include"bconstant.h"

extern"C"_declspec(dllexport)

voidinitSchTable(intScheduleTable[SchTabLen][SchTabWdh])

{

inti;

for(i=0;i<=19;i++)

{

ScheduleTable[i][0]=0;

}

ScheduleTable[0][0]=1;

for(i=0;i<=19;i++)

{

ScheduleTable[i][1]=1;

}

for(i=0;i<=19;i++)

{

ScheduleTable[i][2]=0;

}

ScheduleTable[0][2]=1;

ScheduleTable[10][2]=1;

return;

}

基础实验二  摘挂机检测实验 

1.实验容

 :

实验目的

   :

实验原理与设计

   :

实验主要数据结构

   :

实验主体流程图 

 一.实验目的

   摘挂机检测实验用来考查学生对摘挂机检测原理的掌握情况。

 二.实验原理与设计

  设用户在挂机状态时扫描输出为“0”,用户在摘机状态时扫描输出为“1”,摘挂机扫描程序的执行周期为200ms,那么摘机识别,就是在200ms的周期性扫描中找到从“0”到“1”的变化点,挂机识别就是在200ms的周期性扫描中找到从“1”到“0”的变化点,该原理的示意图如下所示:

   

  在我们的实验中,我们把前200ms的线路状态保存以备这次可以读取,同时读出这次的线路状态,把前200ms的线路状态取反与这次的线路状态相与,如果为1,就说明检测到摘机消息了。

同理,我们把这次的线路状态取反再与前200ms的线路状态相与,如果为1就说明检测到挂机消息了,然后把摘挂机信号作为事件放入摘挂机队列中。

 三.实验主要数据结构

  函数功能为:

检测到摘、挂机事件,并把该事件放入到摘挂机事件队列中。

  函数原型:

voidscanfor200(intlinestate200[LINEMAX],intlinestate[LINEMAX],UpOnnode*head1,UpOnnode*end1);其中LINEMAX为线路总数,是定义在"bconstant.h"中的一个宏,linestate200[LINEMAX]为已保存的200ms前线路状态,linestate[LINEMAX]为当前的线路状态,head1,end1为摘挂机队列的首尾指针,该队列已经在主程序中进行了初始化。

我们所要做的就是把检测到的摘挂机事件以摘挂机队列节点的形式插入到摘挂机事件队列中。

 数据结构说明:

 头文件:

"bconstant.h";(以下的数据结构都已在该文件中定义)

 LINEMAX :

最大线路数;

 intlinestate200[LINEMAX],linestate[LINEMAX]:

线路从0开始编号;状态:

1:

有电流,0无电流;

 enumUporOn{ehandup,ehandon}:

为摘挂机区别符:

ehandup表示摘机,ehandon表示挂机;

 structUpOnnode         //摘挂机队列节点结构

         {

          UporOnphonestate;     //摘挂机区别符;

          intlinenum;           //线路号(从0开始);

          structUpOnnode*next; //指向下一节点的指针;

        };

注意事项:

 1.我们编写的模块是基础实验部分预加载的本局交换系统的一个模块而已,在系统中head1头指针和end1尾指针已经完成初始化。

为方便起见,我们的摘挂机事件队列是一个包含头节点的单向链表,并且头指针指向该头节点,尾指针在初始化时也指向了该节点。

所以在我们的函数编写中应保证头指针始终指向该头节点上、尾指针指向摘挂机事件队列的最末一个节点。

  2.注意把这次扫描的线路状态值保存在前200ms扫描线路状态数组中,以便主程周期调用。

四.实验主体流程图 

       

2.源代码

extern"C"_declspec(dllexport)voidscanfor200(intlinestate200[LINEMAX],intlinestate[LINEMAX],UpOnnode*head1,UpOnnode*end1)

{inti;

UpOnnode*p;

for(i=0;i

if(linestate[i]&~linestate200[i])

{p=newUpOnnode;

p->phonestate=ehandup;

p->linenum=i;

p->next=0;

end1->next=p;

end1=p;}

if(linestate200[i]&~linestate[i])

{p=newUpOnnode;

p->phonestate=ehandon;

p->linenum=i;

p->next=0;

end1->next=p;

end1=p;}}

if(i==LINEMAX)

for(i=0;i

linestate200[i]=linestate[i];

return;}

基础实验三  脉冲计数实验

1.实验容

  :

实验目的

   :

实验原理以与实验设计

   :

实验主要数据结构

   :

实验主体流程图

 

一.实验目的

   脉冲计数实验用来考察查学生对脉冲识别原理的掌握情况。

 

二.实验原理以与实验设计

   拨号盘所发出的拨号脉冲有规定的参数。

我国规定的号盘脉冲的参数有:

   脉冲速度:

即每秒钟送出的脉冲个数,规定的脉冲速度为每秒钟8-16个脉冲;

   脉冲断续比:

即脉冲宽度(断)和间隔宽度(续)之比,规定的脉冲断续比为1:

1-3:

1。

1)脉冲识别程序扫描周期的确定:

为确定脉冲识别扫描的周期,需要计算出最短的变化间隔(脉冲或间隔宽度),这样才能保证每个脉冲都能够识别而不至于丢失脉冲。

由于号盘每秒发出的最快脉冲个数为16个,脉冲周期T=1000/16=62.5ms,在这种情况下断续时间比为3:

1时续的时间最短,为1/4*T,所以最短变化周期为1/4*(1000/16)=15.625ms,脉冲识别扫描程序的周期<15.625ms。

2)拨号脉冲识别原理:

在下图中,采用了10ms的扫描周期,其中的变化识别标志了状态的变化。

对于一个脉冲来说,是前沿和后沿各识别一次,我们可以任取一个来识别脉冲,下图中采用了前沿识别。

从逻辑上讲,也就是说(这⊕前)∧前=!

这∧前相当于前面所说的挂机识别,同样(这⊕前)∧!

前=这∧!

前相当于摘机识别。

在这里采用比较麻烦的逻辑运算的原因是需要“变化识别”这个结果。

这在位间隔识别中要用到,下面是脉冲识别原理原理示意图:

     

   在我们设计的实验中,用一个数组保留各线路10ms前的状态,用另一个数组保留各线路当前的状态,并且提供了保存“变化识别”的数组(以供后面的位间隔识别使用),另外提供给学生使用的是保存已检测的脉冲值的数组,学生编程检测到一个脉冲以后,就将该线路对应的脉冲值加一。

三.实验主要数据结构

  函数功能:

识别出一个脉冲,然后把该线路对应的脉冲数加一。

函数原型:

voidscanpulse(intlinestate[LINEMAX],intlinestate10[LINEMAX],intchange[LINEMAX],intfchange[LINEMAX],intpulsenum[LINEMAX])其中LINEMAX为最大线路数,linestate为当前线路状态,linestate10为10ms前的线路状态,change为状态改变,fchange为首次变化,pulsenum为脉冲计数数组。

主要的数据结构:

头文件:

"bconstant.h";(以下的数据结构都已在该文件中定义)

LINEMAX :

最大线路数;

intlinestate[LINEMAX],linestate10[LINEMAX]:

线路从0开始编号;状态:

1:

有电流,0无电流;

intchange[LINEMAX]:

线路状态变化数组,0表示无变化,1表示有变化;

intfchange[LINEMAX]:

线路首次变化数组,1表示已发生首次变化,0表示没有;

intpulsenum[LINEMAX]:

线路当前的脉冲值;

为方面大家操作,我们提供了两个预定义的函数:

intnor_op(inta,intb);intor_op(inta,intb);分别用于异或操作和或操作。

注意事项:

把这次的线路状态值保存到10ms前的线路状态数组中,以便主程序周期调用。

四.实验主体流程图       

             

2.源代码

voidscanpulse(intlinestate[LINEMAX],intlinestate10[LINEMAX],intchange[LINEMAX],intfchange[LINEMAX],intpulsenum[LINEMAX])

{inti;

for(i=0;i

{change[i]=nor_op(linestate[i],linestate10[i]);

fchange[i]=or_op(fchange[i],change[i]);

if(change[i]&&(!

linestate10[i]))

pulsenum[i]=pulsenum[i]+1;}

for(i=0;i

return;}

基础实验四 位间隔识别实验

1.实验容

实验目的

  :

实验原理与设计

  :

实验主要数据结构

  :

实验主体流程图

一.实验目的

  位间隔识别实验用来考察学生对位间隔识别原理的掌握情况。

二.实验原理与设计

  位间隔识别的目的是要识别两位之间的间隔,从而区分各位。

首先来确定一下位间隔识别的扫描周期,一方面拨号盘的位间隔≥250ms,另一方面需要确定一下最长的脉冲或者间隔为多少毫秒。

由于最慢的脉冲速度为每秒8个脉冲,这就是说脉冲周期T=1000/8=125ms,当断续比为3:

1时,脉冲(断)时间应为125ms*3/4=93.75ms,所以位间隔识别程序要能鉴别93.75ms和250ms间的间隔。

一般采用96ms扫描程序来识别,位间隔识别的原理图:

     

对于位间隔识别的基本原理,在这里要强调两个关键点

  

(1)识别在前96ms周期没有发生过变化。

这就排除了脉冲变化的因素。

因为脉冲最长间隔如前面所计算的那样为93.75ms〈96ms;

  

(2)识别出在此以前的最后一次变化是在96ms以前的那个周期,这一条件可以保证在位间隔开始96ms后的第一个周期就能识别到,而且保证以后各次扫描不识别。

   为此引入了“首次变化”这个变量,它标志首次遇到了“变化”。

平时它为“0”,当在一个扫描周期遇到变化后就变为“1”,在这个周期的后续时间里它都保持“1”不变。

这个条件可由下面的逻辑关系来实现:

首次变化=首次变化∨变化识别。

当首次变化为“0”时,只要8ms脉冲扫描的变化识别为“0”,则首次变化永远为“0”,一旦变化识别为“1”,则首次变化就变为“1”,而且以后无论变化识别如何改变都不能改变首次变化的“1”值。

为确保以上“首次变化”平时为“0”,令每次96ms程序都把它清“0”,这样就写出下面的计算公式:

首次变化=(首次变化∨变化识别)∧/96 

  在每次96ms程序执行期间来检查“首次变化”这个变量,若为“0”,说明在前96周期没有发生过变化;若为“1”,说明已发生变化,但这时还不能确定为何种变化,既可能为脉冲变化,也可能为位间隔变化。

这就需要看下一个96ms周期,若仍有变化,则属于“脉冲变化”;若无变化,即属于“位间隔”变化(>96ms无变化)。

这时在再下一个周期仍能识别出“无变化”,但已经识别出一次了,不能再作重复识别。

  对上面的讨论加以概括,只要识别两个变量就可以了:

(1)上一个96ms周期无变化;

(2)再上一个周期有变化就可确定为“位间隔”了。

在上面的图中的“首次变化”是识别变量

(1)的,首次变化=1是说明上一周期无变化,否则有变化。

上图中前次“首次变化”是识别后一个变量

(2)的,前次“首次变化”是读取“首次变化”的存储容,不过96ms读一次,读的正是再上一个周期的最后结果。

前次“首次变化”=1,说明再上一个周期有过变化,否则无变化。

将“首次变化”取反后与前次“首次变化”相与,结果为“1”,表示有位间隔。

  值得注意的是,仅上面识别出的“位间隔”还是不够的,因为它只能说明前一次变化在96ms以前,那么用户中途挂机也可以达到这个条件,因此必须区别是“位间隔”还是“中途挂机”。

区别这个很容易,只要区别一下现在用户处于挂机还是摘机状态就可以了。

前者是中途挂机,后者是位间隔。

方法可以是查一下当前的用户线状态,如果为“1”,说明用户已经挂机,那么识别的是“中途挂机”,否则为“位间隔”。

  在我们的实验中提供了前100ms的线路状态数组和当前的线路状态数组,以与用来保存“变化识别”、“首次变化”和“前次首次变化”的数组等供学生使用,学生通过编程检测位间隔的位置,当学生检测到位间隔以后,学生把与该线路对应的脉冲值放入到一个接收队列中,并且放在接收队列中的事件需保存着与该对应的线路号,因为几个线路接收到的都是放在同一个队列中的。

(然后,一个外部程序将扫描该接收队列,逐一把各个接收事件发送给交换系统中央控制系统。

学生只要做到将事件按照接收队列节点格式放入队列即可。

三.实验主要数据结构

  函数功能:

识别出一位,将该放入到接收队列中;

  函数原型为:

voidscandigit(intlinestate[LINEMAX],intlinestate100[LINEMAX],intpulsenum[LINEMAX],intfchange[LINEMAX],intlfchange[LINEMAX],Digitnode*head2,Digitnode*end2)。

其中LINEMAX为线路总数,是定义在bconstant.h中的一个宏,linestate[LINEMAX]为当前的线路状态linestate100[LINEMAX]为100ms前的线路状态,pulsenum为当前已经检测到的脉冲计数值,fchange为首次变化,lfchange为前次首次变化,head2,end2为接收队列的首尾指针,该队列已经完成了初始化。

本次实验就是把检测到位间隔的线路的值插入这个队列中。

  数据结构说明:

  头文件:

"bconstant.h";(以下的数据结构都已在该文件中定义)

 LINEMAX :

最大线路数;

 intlinestate[LINEMAX],linestate100[LINEMAX]:

线路从0开始编号;状态:

1:

有电流,0无电流;

 intpulsenum[LINEMAX]:

线路已检测到的脉冲值数;

 intfchange[LINEMAX],lfchange[LINEMAX]:

首次变化数组,前次首次变化数组,有变化为1。

  structDigitnode                //接收队列节点数据结构

            {

              intnum;            //值

               intlinenum;        //线号

               structDigitnode*next;//指向下一节点的指针

             }

  注意事项:

  1.我们编写的模块是基础实验部分预加载的本局交换系统的一个模块而已,在系统中head2头指针和end2尾指针已经完成初始化。

为方便起见,我们的接收队列是一个包含头节点的单向链表,并且头指针指向该头节点,尾指针在初始化时也指向了该节点。

所以在我们的函数编写中应保证头指针始终指向该头节点上、尾指针指向接收队列的最末一个节点。

  2.当某条线路检测到位间隔以后,该线路的脉冲值数应清0;在函数末尾应将当前线路状态保存在100ms前的线路状态中、首次变化保存在前首次变化中、首次变化再清0。

  细心的您可能会问:

“如果线路当前的脉冲数为10,需要把10做为值也插入吗”,的确,我们的值0是产生了10个脉冲,脉冲数组中脉冲数也会出现10,不过在您把脉冲值10插入到接收队列后,我们的后续程序会把它转化为0,传给交换控制系统的。

四.实验主体流程图

1.源代码

Voidscandigit(intlinestate2[LINEMAX],intlinestate100[LINEMAX],intpulsenum[LINEMAX],intfchange[LINEMAX],intlfchange[LINEMAX],Digitnode*head2,Digitnode*end2)

{inti;Digitnode*p;

for(i=0;i

{if((!

fchange[i])&&lfchange[i])

{if(linestate100[i])

{p=newDigitnode;

p->num=pulsenum[i];

p->linenum=i;

p->next=0;

end2->next=p;

end2=p;

pulsenum[i]=0;}}}

for(i=0;i

{lfchange[i]=fchange[i];

fchange[i]=0;

linestate100[i]=linestate2[i];}

return;}

基础实验五  软件送音实验

1.实验容

实验目的

 :

实验原理与设计

 :

实验主要数据结构

 :

实验检验标准

一.实验目的

  软件送音实验用来考查学生对各种信号音发送情况的掌握情况。

二.实验原理与设计

  交换机需要向用户发送各种信号音,如拨号音、忙音和回铃音等,也需要向其他交换机发送和接收各种局间信令,如多频信号。

这些信号都是音频模拟信号,而信号设备是接在数字交换网络上的,它通过数字交换网络所提供的路由来传送。

因此这些模拟信号必须是“数字化了的”,信号音的产生不外乎单频音和双频音两种。

对于单频信号音的产生,是按照一定的时间间隔抽样、量化和编码运算,得到各抽样点的pcm信号,然后保存在ROM中,在需要发送时按序发送。

对于双频信号音的产生,是取得两种信号音周期的最小公倍数,作为pcm的抽样周期,然后保存在ROM中,在需要时按序取出发送。

  由于用软件来模拟信号音的产生比较困难,所以在我们的实验中,我们发送的信号音都是预先准备好的信号音文件,并且伴随有界面的送音显示。

那么如何考查学生对软件送音的理解呢?

我的设计是提供给学生一些需要送音的情况,由学生编程确定该送音的类型,该送音的情况和送音的类别都是在主程序中预先安排好的,学生只需在送音情况和送音类型间“牵线搭桥”。

三.实验主要数据结构

  函数功能:

根据输入的状态决定送音的类型;

  函数原型:

intdecide(Userstatestate);其中state为输入的状态类型,输出为发送的信号音类型;

  头文件:

"bconstant.h"(以下的数据结构均定义在该头文件中)

   enumUserstate{

              caller_ehandup,         //主叫摘机

              caller_calledbusy,      //被叫忙

              theoth

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2