现代交换技术实验报告全Word文档下载推荐.docx
- 文档编号:20263965
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:24
- 大小:3.16MB
现代交换技术实验报告全Word文档下载推荐.docx
《现代交换技术实验报告全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《现代交换技术实验报告全Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
.....
18
19
我们这个交换系统提供了三个周期性调度程度(摘挂机检测程序、脉冲识别程序和位间隔识别程序),它们的调用周期分别为200ms、10ms和100ms,所以我们系统的最小调度时间为10ms。
如图所示,每隔10ms,我们就会检查这个表的一行,如果该行上某一列为1,我们就执列所对应的任务,如果为0,就什么都不做。
每当执行到这个表的最后一行,调度任务会返回第一行循环执行。
而你所要做的就是按照你的理解来填写这个调度表。
三.实验主要数据结构:
函数功能:
完成调度表的初始化;
函数原型:
initSchTable(intScheduleTable[SchTabLen][SchTabWdh]);
其中SchTalLen和SchTabWdh为在bconstant.h中的宏定义:
#defineSchTabLen20
//代表这个调度表为20行(相邻行之间的时间间隔为10ms);
#defineSchTabWdh3
//代表三个周期性调度任务——0:
摘挂机检测任务;
脉冲检测任务;
位间隔检测任务;
四.实验效果检验:
当调度表初始化正确时,能够进行正常的通话;
如果初始化不正确,可能会造成周期性程序的不正常调用,例如位间隔调度的延迟会造成识别位间隔的延误甚至丢失。
注:
由于为循环程序,所以调度表的初始化方案不唯一。
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;
ScheduleTable[i][1]=1;
ScheduleTable[i][2]=0;
ScheduleTable[0][2]=1;
ScheduleTable[10][2]=1;
return;
}
基础实验二
摘挂机检测实验
实验主体流程图
一.实验目的
摘挂机检测实验用来考查学生对摘挂机检测原理的掌握情况。
二.实验原理及设计
设用户在挂机状态时扫描输出为“0”,用户在摘机状态时扫描输出为“1”,摘挂机扫描程序的执行周期为200ms,那么摘机识别,就是在200ms的周期性扫描中找到从“0”到“1”的变化点,挂机识别就是在200ms的周期性扫描中找到从“1”到“0”的变化点,该原理的示意图如下所示:
在我们的实验中,我们把前200ms的线路状态保存以备这次可以读取,同时读出这次的线路状态,把前200ms的线路状态取反与这次的线路状态相与,如果为1,就说明检测到摘机消息了。
同理,我们把这次的线路状态取反再与前200ms的线路状态相与,如果为1就说明检测到挂机消息了,然后把摘挂机信号作为事件放入摘挂机队列中。
三.实验主要数据结构
函数功能为:
检测到摘、挂机事件,并把该事件放入到摘挂机事件队列中。
voidscanfor200(intlinestate200[LINEMAX],intlinestate[LINEMAX],UpOnnode*head1,UpOnnode*end1);
其中LINEMAX为线路总数,是定义在"
中的一个宏,linestate200[LINEMAX]为已保存的200ms前线路状态,linestate[LINEMAX]为当前的线路状态,head1,end1为摘挂机队列的首尾指针,该队列已经在主程序中进行了初始化。
我们所要做的就是把检测到的摘挂机事件以摘挂机队列节点的形式插入到摘挂机事件队列中。
数据结构说明:
头文件:
"
;
(以下的数据结构都已在该文件中定义)
LINEMAX
:
最大线路数;
intlinestate200[LINEMAX],linestate[LINEMAX]:
线路从0开始编号;
状态:
有电流,0无电流;
enumUporOn{ehandup,ehandon}:
为摘挂机区别符:
ehandup表示摘机,ehandon表示挂机;
structUpOnnode
//摘挂机队列节点结构
UporOnphonestate;
//摘挂机区别符;
intlinenum;
//线路号(从0开始);
structUpOnnode*next;
//指向下一节点的指针;
};
注意事项:
1.我们编写的模块是基础实验部分预加载的本局交换系统的一个模块而已,在系统中head1头指针和end1尾指针已经完成初始化。
为方便起见,我们的摘挂机事件队列是一个包含头节点的单向链表,并且头指针指向该头节点,尾指针在初始化时也指向了该节点。
所以在我们的函数编写中应保证头指针始终指向该头节点上、尾指针指向摘挂机事件队列的最末一个节点。
2.注意把这次扫描的线路状态值保存在前200ms扫描线路状态数组中,以便主程周期调用。
四.实验主体流程图
_declspec(dllexport)
voidscanfor200(intlinestate200[LINEMAX],intlinestate[LINEMAX],UpOnnode*head1,UpOnnode*end1)
{inti;
UpOnnode*p;
LINEMAX;
i++){
if(linestate[i]&
~linestate200[i])
{p=newUpOnnode;
p->
phonestate=ehandup;
linenum=i;
next=0;
end1->
next=p;
end1=p;
if(linestate200[i]&
~linestate[i])
{p=newUpOnnode;
phonestate=ehandon;
}}
if(i==LINEMAX)
for(i=0;
linestate200[i]=linestate[i];
基础实验三
脉冲计数实验
实验原理以及实验设计
实验主体流程图
脉冲计数实验用来考察查学生对脉冲识别原理的掌握情况。
二.实验原理以及实验设计
拨号盘所发出的拨号脉冲有规定的参数。
我国规定的号盘脉冲的参数有:
脉冲速度:
即每秒钟送出的脉冲个数,规定的脉冲速度为每秒钟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为脉冲计数数组。
主要的数据结构:
intlinestate[LINEMAX],linestate10[LINEMAX]:
intchange[LINEMAX]:
线路状态变化数组,0表示无变化,1表示有变化;
intfchange[LINEMAX]:
线路首次变化数组,1表示已发生首次变化,0表示没有;
intpulsenum[LINEMAX]:
线路当前的脉冲值;
为方面大家操作,我们提供了两个预定义的函数:
intnor_op(inta,intb);
intor_op(inta,intb);
分别用于异或操作和或操作。
把这次的线路状态值保存到10ms前的线路状态数组中,以便主程序周期调用。
voidscanpulse(intlinestate[LINEMAX],intlinestate10[LINEMAX],intchange[LINEMAX],intfchange[LINEMAX],intpulsenum[LINEMAX])
{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;
}
i++)linestate10[i]=linestate[i];
基础实验四
位间隔识别实验
链接:
位间隔识别实验用来考察学生对位间隔识别原理的掌握情况。
位间隔识别的目的是要识别两位号码之间的间隔,从而区分各位号码。
首先来确定一下位间隔识别的扫描周期,一方面拨号盘的位间隔≥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为号码接收队列的首尾指针,该队列已经完成了初始化。
本次实验就是把检测到位间隔的线路的号码值插入这个队列中。
数据结构说明:
头文件:
intlinestate[LINEMAX],linestate100[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;
{if((!
fchange[i])&
lfchange[i])
{if(linestate100[i])
{p=newDigitnode;
num=pulsenum[i];
end2->
end2=p;
pulsenum[i]=0;
}}}
{lfchange[i]=fchange[i];
fchange[i]=0;
linestate100[i]=linestate2[i];
}
基础实验五
软件送音实验
实验检验标准
软件送音实验用来考查学生对各种信号音发送情况的掌握情况。
交换机需要向用户发送各种信号音,如拨号音、忙音和回铃音等,也需要向其他交换机发送和接收各种局间信令,如多频信号。
这些信号都是音频模拟信号,而信号设备是接在数字交换网络上的,它通过数字交换网络所提供的路由来传送。
因此这些模拟信号必须是“数字化了的”,信号音的产生不外乎单频音和双频音两种。
对于单频信号音的产生,是按照一定的时间间隔抽样、量化和编码运算,得到各抽样点的pcm信号,然后保存在ROM中,在需要发送时按序发送。
对于双频信号音的产生,是取得两种信号音周期的最小公倍数,作为pcm的抽样周期,然后保存在ROM中,在需要时按序取出发送。
由于用软件来模拟信号音的产生比较困难,所以在我们的实验中,我们发送的信号音都是预先准备好的信号音文件,并且伴随有界面的送音显示。
那么如何考查学生对软件送音的理解呢?
我的设计是提供给学生一些需要送音的情况,由学生编程确定该送音的类型,该送音的情况和送音的类别都是在主程序中预先安排好的,学生只需在送音情况和送音类型间“牵线搭桥”。
根据输入的状态决定送音的类型;
intdecide(Userstatestate);
其中state为输入的状态类型,输出为发送的信号音类型;
(以下的数据结构均定义在该头文件中)
enumUserstate{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 现代 交换 技术 实验 报告