现代交换原理实验指导书.docx
《现代交换原理实验指导书.docx》由会员分享,可在线阅读,更多相关《现代交换原理实验指导书.docx(35页珍藏版)》请在冰豆网上搜索。
现代交换原理实验指导书
交换仿真实验平台简介
一.实验平台概述:
下图即交换仿真实验系统平台的主界面,因为该实验系统中多数的实验需要编程实现,我们的主界面采用了像VisualStudio、Dephi这样的集成开发环境界面,集成了需编程实验需要的编辑、编译、链接、运行、演示以及帮助等常用的工具。
下面我们对上面的实验环境进行简单的介绍,以帮助大家尽早地熟悉该实验环境。
二.有关实验平台的视图:
本实验系统包括两个视图:
编辑视图和结果视图。
编辑视图:
在主界面上半部分的视图为编辑视图,主要用于编辑源代码使用;
结果视图:
在主界面下半部分的视图为结果视图,主要用于显示源代码编译、链接的结果信息;
两个视图都含有垂直滚动条,并且两个视图的相对大小可以手工调节。
三.有关实验平台的菜单:
在主菜单中包括“选择实验”、“源文件编辑”、“编译运行”、“帮助”几个部分。
1.在“选择实验”菜单下包括基础实验(程控交换实验)、提高实验(分组实验、ATM实验、MPLS实验)的相关实验项,点击相应菜单项后可以进入该实验;我们也可在一个实验下通过“选择实验”菜单切换到其他的实验;退出实验的“退出”选项也在该菜单项(退出该实验环境也可以通过点击标题栏的“关闭”按钮实现);
2.在“源文件编辑”菜单下(在需编程实验中可用)包括了常用的编辑命令:
撤销、剪切、复制以及粘贴等。
因为该菜单主要针对需编程实验,所以保存源代码文件的命令也集成在了该菜单项下。
这里要强调的是当您点击“保存”命令时,我们会把视图内的内容自动保存在您安装目录下的sourcefile目录下。
当下一次您重新开启该实验系统时,该目录下的文件将会重写,所以,如果您需要备份源文件时,我们建议两种办法:
1.在实验过程中,把您需要备份的文件另存于其他目录下;
2.在实验结束后,把您安装程序的“sourcefile”子目录下需要备份的文件另存于他处。
3.在“编译运行”菜单下包含了“编译”、“连接”、“运行”、“演示”四个菜单项,它们的用途如下:
编译菜单项:
编译(Compile)当前视图中的源代码文件,并把编译后的结果显示在结果视图下面。
当源代码文件没有语法错误时,结果视图内会显示产生的对象文件(.obj文件);当源代码文件存在语法错误时,结果视图内会显示出错的行号和出错原因。
该菜单项只在需编程实验中可用。
链接菜单项:
链接(Link)当前目录下的对象文件(.obj文件)成动态链接库文件(.dll文件)供运行时调用。
当链接成功时会显示链接后形成的库文件(.lib文件)和(.exp文件),当链接错误时,结果视图内会显示出错的原因。
该菜单项只在需编程实验中可用。
运行菜单项:
显示运行界面,加载当前目录下的动态链接库文件(.dll文件)显示运行结果。
该运行界面为Flash界面,您可在界面进行相应的操作。
例如运行界面通用的“运行”“停止”“退出”等控制命令,一些涉及具体实验的控制动作,例如基础实验运行界面的点击话机、拨号等动作,具体的实验控制动作请参见相应的实验部分,这里不再赘述。
演示菜单项:
提供正确的实验运行效果,供参考对照。
演示界面和运行界面相同,但内部的控制逻辑均已预先确定,可在任何时候点击观看。
提示说明:
我们的编译命令编译的是当前视图的源文件内容,因此会自动保存当前视图内容;链接命令会链接当前目录下的对象文件;运行命令会运行当前目录下的动态链接库文件,所以如果您对源文件进行了改动,想确定新源文件的逻辑正确性,请您依次进行编译、链接以产生新的dll文件。
4.在“帮助”菜单下包括了“实验手册”和“有关我们”的菜单项。
实验手册:
包括了实验平台的使用说明、实验流程以及各个实验的相关原理、编程实验需要的的数据结构和运行时的情况分析。
有关我们:
有关本实验系统的版本和版权等信息。
四.有关实验平台的工具栏和状态栏:
工具栏:
本实验系统为了便于您操作,提供了一些常用的工具栏,固定安排在编辑视图之上,从左到右的工具按钮为:
保存、撤销、剪切、复制、粘贴;编译、链接、运行、演示和帮助,您把鼠标停放在某工具按钮上,半秒以后会显示该工具按钮的用处。
状态栏:
安排在结果视图以下,当您把鼠标指向某菜单命令上时,状态栏中会显示该菜单命令的描述信息;用于指示键盘“NumLock”、“CapsLock”、“ScrollLock”灯亮灭的指示信息安排在状态栏的右侧。
五.有关实验系统的目录设置:
在您的安装目录下的目录和文件说明如下:
1.SourceFile目录:
保存了需编程实验需要的源代码文件;
2.Scfile_BackUp目录:
保存了需编程实验需要的源代码文件的备份,该目录下的文件请不要改动;
3.Utility目录:
包括了编程实验编译时需要的工具和需要的库文件、头文件等;实验运行演示时需要的音信号和动画文件也存放在这里;该目录下的文件请不要改动,否则可能会给您的实验带来不利影响;
4.BackUp目录:
实验系统的备份文件;
5.现代交换原理仿真实验系统.exe:
本实验系统的应用程序;
6.uninstall.exe:
本实验系统的卸载程序,你也可以通过控制面板的“添加\删除程序”工具进行删除;其它部分为本实验系统安装时的一些说明和安装信息等,为了便于您的使用,我们在你的桌面和开始菜单中也设置了您可能需要的快捷方式。
交换仿真实验流程
交换仿真实验系统中包括两类实验:
需编程实验和非编程实验。
1.点击“现代交换原理仿真实验系统.exe”进入本实验系统,点击主界面“帮助”菜单下的“帮助手册”打开交换仿真实验帮助系统,阅读《交换仿真实验平台简介》部分,熟悉实验环境。
2.点击主界面的“选择实验”菜单下的某个实验,进入该实验部分,将看到界面给你的提示。
2.1对于需编程实验:
2.1.1阅读帮助系统中有关该实验的内容,包括实验原理、实验所编函数的用处和该函数的输入输出参数、实验所编函数的流程图等;
2.1.2在主界面的编辑视图内完成源代码部分的编写工作;
2.1.3 点击“编译”菜单命令或者“编译”工具按钮编译源代码,如果在结果视图中看到形成对象文件的提示(即产生***.obj),表示编译成功,进行2.1.4,否则返回2.1.2,根据结果视图的错误信息修改源程序;
2.1.4 点击“链接”菜单命令或者“链接”工具按钮链接产生的对象文件,如果在结果视图中看到形成目标模块文件(即产生***.lib和***.exp),表示链接成功,进行2.1.5,否则返回2.1.2,修改源代码;
2.1.5 点击“演示”菜单命令或者“演示”工具按钮,进入演示运行界面,进行相应的控制操作,观看正确的运行结果。
2.1.6点击“运行”菜单命令或者“运行”工具按钮,进入演示运行界面,进行相应的控制操作,检验完成的目标模块的逻辑正确性。
如果正确的话,点击“编辑源文件”下的“保存”子菜单项保存该源文件。
否则返回2.1.2修改源代码。
验收标准:
在验收人员的监督下,完成编译、链接工作,进行运行确定代码逻辑的正确性。
注意:
如需完成实验报告,在退出实验系统前点击“编辑源代码”下的“另存为”子菜单”,推荐把源文件保存在其他的目录下。
不要把源文件保留在本实验系统的安装目录以及其子目录下,否则该源文件可能会在下次实验系统启动时被改写。
2.2对于非编程实验:
2.2.1阅读帮助系统中有关该实验的内容,包括实验原理、在实验运行界面的操作以及以及正确时的实验现象。
2.2.2 按照主界面对话框的提示,直接点击“编译运行”菜单下的“运行”子菜单,或者点击工具栏上的“运行”按钮,进行相应实验。
验收标准:
在验收人员的监督下,在运行界面完成所需表格的填写,进行运行确定代码逻辑的正确性。
3.如还需进行其他实验,点击主界面的“选择实验”菜单下的其它实验项,进入相应实验部分。
仿真基础实验
基础实验一 时间表调度实验(必做实验)
一.实验目的:
驱动交换网络实验用来考查学生对时间表调度原理的掌握情况。
二.实验原理及设计:
在程控数字交换的体系结构中,周期级程序(例如摘挂机检测程序、脉冲识别程序、位间隔识别程序)是由时间表调度实现的。
所谓时间表调度,是指每经过交换系统的最短有效时间(这通常是指各周期性程序周期的最大公约数),都会检查调度表的调度要求,如果某个程序在这时需要执行,则调度程序开始执行它。
在我们设计的时间表调度实验中,这个调度表的调度是静态的。
所谓静态,是指我们的调度表是在系统初始化的时候就建立起来的,在系统运行的情况下不再改动。
实验要求的就是这个调度表的初始化。
这个调度表如下:
时间(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:
位间隔检测任务;
四.实验效果检验:
当调度表初始化正确时,能够进行正常的通话;如果初始化不正确,可能会造成周期性程序的不正常调用,例如位间隔调度的延迟会造成识别位间隔的延误甚至丢失。
注:
由于为循环程序,所以调度表的初始化方案不唯一。
基础实验二 摘挂机检测实验(必做实验)
一.实验目的:
摘挂机检测实验用来考查学生对摘挂机检测原理的掌握情况。
二.实验原理及设计:
设用户在挂机状态时扫描输出为“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扫描线路状态数组中,以便主程周期调用。
四.实验主体流程图:
基础实验三 脉冲计数实验(选做实验)
一.实验目的:
脉冲计数实验用来考察查学生对脉冲识别原理的掌握情况。
二.实验原理以及实验设计:
拨号盘所发出的拨号脉冲有规定的参数。
我国规定的号盘脉冲的参数有:
1.脉冲速度:
即每秒钟送出的脉冲个数,规定的脉冲速度为每秒钟8-16个脉冲;
2.脉冲断续比:
即脉冲宽度(断)和间隔宽度(续)之比,规定的脉冲断续比为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前的线路状态数组中,以便主程序周期调用。
四.实验主体流程图:
基础实验四 位间隔识别实验(选做实验)
一.实验目的:
位间隔识别实验用来考察学生对位间隔识别原理的掌握情况。
二.实验原理及设计:
位间隔识别的目的是要识别两位号码之间的间隔,从而区分各位号码。
首先来确定一下位间隔识别的扫描周期,一方面拨号盘的位间隔≥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.我们编写的模块是基础实验部分预加载的本局交换系统的一个模块而已,在