计算机控制技术实验报告DOC_第1页
计算机控制技术实验报告DOC_第2页
计算机控制技术实验报告DOC_第3页
计算机控制技术实验报告DOC_第4页
计算机控制技术实验报告DOC_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机控制技术实验报告 实验一 信号的采样与保持一、实验目的1熟悉信号的采样和保持过程。2学习和掌握香农(采样)定理。3学习用直线插值法和二次曲线插值法还原信号。二、实验设备PC 机一台,TD-ACS实验系统一套,i386EX 系统板一块。三、实验原理香农(采样)定理:若对于一个具有有限频谱()的连续信号进行采样,当采样频率满足时,则采样函数能无失真地恢复到原来的连续信号。为信号的最高频率,为采样频率。四实验内容 1采样与保持编写程序,实现信号通过 A/D 转换器转换成数字量送到控制计算机,计算机再把数字量送到 D/A 转换器输出。实验线路图如图2-1所示,图中画“”的线需用户在实验中自行接好

2、,其它线系统已连好。图2-1 采样保持线路图控制计算机的“OUT1”表示386EX内部1#定时器的输出端,定时器输出的方波周期定时器时常,“IRQ7”表示386EX内部主片8259的“7”号中断,用作采样中断。正弦波单元的“OUT”端输出周期性的正弦波信号,通过模数转换单元的“IN7”端输入,系统用定时器作为基准时钟(初始化为10ms),定时采集“IN7”端的信号,转换结束产生采样中断,在中断服务程序中读入转换完的数字量,送到数模转换单元,在“OUT1”端输出相应的模拟信号。由于数模转换器有输出锁存能力,所以它具有零阶保持器的作用。采样周期T= TK10ms,TK的范围为01 FFH,通过修改

3、TK就可以灵活地改变采样周期,后面实验的采样周期设置也是如此。零阶采样保持程序流程图如图2-2所示。图2-2 零阶采样保持程序流程图实验步骤:(1)参考流程图2-2编写零阶保持程序,编译、链接。(2)按照实验线路图2-1接线,检查无误后开启设备电源。(3)用示波器的表笔测量正弦波单元的“OUT”端,调节正弦波单元的调幅、调频电位器及拨动开关,使得“OUT”端输出幅值为3V,周期1S的正弦波。(4)加载程序到控制机中,将采样周期变量“Tk”加入到变量监视中,运行程序,用示波器的另一路表笔观察数模转换单元的输出端“OUT1”。(5)增大采样周期,当采样周期0.5S时,即Tk32H时,运行程序并观测

4、数模转换单元的输出波形应该失真,记录此时的采样周期,验证香农定理。2信号的还原编写程序,分别用直线插值法和二次曲线插值法还原信号。从香农定理可知,对于信号的采集,只要选择恰当的采样周期,就不会失去信号的主要特征。在实际应用中,一般总是取实际采样频率比大,如:。但是如果采用插值法恢复信号,就可以降低对采样频率的要求,香农定理给出了采样频率的下限,但是用不同的插值方法恢复信号需要的采样频率也不相同。(1)直线插值法(取)利用式1.2 -1在点(X0,Y0)和(X1,Y1)之间插入点(X,Y)。其中:X1X0为采样间隔,Y1Y0分别为X1和X0采样时刻的AD采样值。(2)二次曲线插值法(取):其中,

5、直线插值与二次曲线插值程序流程图如图2-3所示。图2-3 直线插值与二次曲线插值程序流程图实验步骤:(1)参考流程图2-3分别编写直线插值和二次曲线插值程序,并编译、链接。(2)按照线路图2-1接线,检查无误后,开启设备电源。调节正弦波单元的调幅、调频电位器,使正弦波单元输出幅值为3V,周期1S的正弦波。(3)分别装载并运行程序,运行程序前将采样周期变量Tk加入到变量监视中,方便实验中观察和修改。用示波器观察数模转换单元的输出,和零阶保持程序的运行效果进行比较。由上述结果可以看出:在采样频率Ws =10Wmax时,用三种方法还原信号,直线插值要好于零阶保持,二次曲线插值好于直线插值。采用合理的

6、插值算法可以降低信号的失真度,在允许的范围内可以有效地降低对采样频率的要求。(4)(3)中是在同一采样频率下,比较三种方法还原信号的效果,实验中也可比较一种还原方法在不同采样频率下的效果。对于零阶保持来说:当采样频率信号频率的10倍时,即信号的还原效果较好。对于直线插值来说:当采样频率信号频率的5倍时,即信号的还原效果较好。对于二次曲线插值来说:当采样频率信号频率的3倍时。信号的还原效果较好。五实验结果 采样周期Tk=05H时的输出波形:采样周期Tk=33H时的输出波形为:由得到的实验结果可以看出:采样周期 Tk=05H时,输出波形与原来基本相同;Tk32H时输出波形产生失真。信号还原实验结果

7、:Tk=0AH时,三种方法还原得到的结果:直线差值的输出波形:二次曲线插值的输出波形:零阶保持输出波形:实验二 数字滤波一、实验目的1学习和掌握一阶惯性滤波。2学习和掌握四点加权滤波。二、实验设备PC 机一台,TD-ACS实验系统一套,i386EX 系统板一块。三、实验原理一般现场环境比较恶劣,干扰源比较多,消除和抑制干扰的方法主要有模拟滤波和数字滤波两种,由于数字滤波方法成本低、可靠性高、无阻抗匹配、灵活方便等特点被广泛应用。图3-1数字滤波方框图(1)一阶惯性滤波:相当于传函的数字滤波器,由一阶差分法可得近似式: 其中,为当前采样时刻的输入,为当前采样时刻的输出,为前一采样时刻的输出,为采

8、样周期,。(2)四点加权滤波:四点加权滤波算法公式:其中,为当前采样时刻的输入,为前一采样时刻的输入,为前一采样时刻的输出。数字滤波程序流程图如图3-2所示。图3-2 数字滤波程序流程图实验中的参数:1a、a、A1、A2、A3、A4为十进制2位小数(BCD码),取值范围:0.00 0.99,只须对应存入0099。程序中将其转换成二进制小数,再按算式进行定点小数运算。四实验内容分别编写一阶惯性滤波程序和四点加权滤波程序,将混合干扰信号的正弦波送到数字滤波器,并用示波器观察经过滤波后的信号。实验线路图如图3-3所示,图中画“”的线需用户在实验中自行接好,运放单元需用户自行搭接。图3-3 数字滤波实

9、验线路图控制计算机的“OUT1”表示386EX内部1定时器的输出端,定时器输出的方波周期定时器时常,“IRQ7”表示386EX 内部主片8259的7号中断,用作采样中断。电路中用RC电路将S端方波微分,再和正弦波单元产生的正弦波叠加。注意R点波形不要超过5V,以免数字化溢出。计算机对有干扰的正弦信号R通过模数转换器采样输入,然后进行数字滤波处理,去除干扰,最后送至数模转换器变成模拟量C输出。五、实验步骤1. 参照流程图3-2分别编写一阶惯性和四点加权程序,检查无误后编译、链接。2. 按实验线路图3-3接线,检查无误后开启设备电源。调节正弦波使其周期约为2S,调信号源单元使其产生周期为100ms

10、的干扰信号(从“NC”端引出),调节接线图中的两个47K电位器使正弦波幅值为3V,干扰波的幅值为0.5V。3. 分别装载并运行程序,运行前可将“TK”加入到变量监视中,方便实验中观察和修改。用示波器观察R点和C点,比较滤波前和滤波后的波形。4. 如果滤波效果不满意,修改参数,再运行程序,观察实验效果。六实验结果一阶惯性滤波输出波形:四点加权滤波输出波形:由实验结果可以得到此实验一阶惯性滤波的效果更好,其更有效的滤去了噪声干扰信号。实验四 积分分离法PID控制一、实验目的1了解PID参数对系统性能的影响2学习凑试法整定PID参数3掌握积分分离法PID控制规律二、实验设备PC 机一台,TD-ACS

11、实验系统一套,i386EX 系统板一块三、 实验原理根据系统偏差的比例(P)、积分(I)和微分(D)进行控制的调节器简称为PID调节器(也称为PID控制器),是连续系统中技术成熟、应用最为广泛的一种调节器,其控制规律为:在计算机控制系统中,PID控制规律的实现必须用数值逼近的方法。当采样周期相当短时,用求和代替积分、用后向差分代替微分,使模拟PID离散化变为差分方程。数字 PID 控制算法可以表示为位置式 PID和增量式 PID两种。(1)位置式 PID 控制算法为:(2)增量式 PID 控制算式为:其中,为采样周期,为采样序号,为第次采样调节器输出,为第次采样误差值,为第次采样误差值。增量式

12、与位置式相比具有以下优点:1增量式算法与最近几次采样值有关,不需要进行累加,因此,不易产生累积误差,控制效果较好。2增量式中,计算机只输出增量,误动作(计算机故障或干扰)影响小。3在位置式中,由手动到自动切换时,必须使输出值等于执行机构的初始值,而增量式只与本次的误差值有关,更易于实现手动到自动的无扰动切换。4增量式控制算法因其特有的优点在控制系统中应用比位置式更加广泛。为了便于实验参数的调整,下面讨论PID参数对系统性能的影响:(1)增大比例系数KP一般将加快系统的响应,在有静差的情况下有利于减小静差。但过大的比例系数会使系统有较大的超调,并产生振荡,使系统稳定性变坏。(2)增大积分时间参数

13、TI有利于消除静差、减小超调、减小振荡,使系统更加稳定,但系统静差的消除将随之减慢。(3)增大微分时间参数TD有利于加快系统响应,使超调量减小,系统稳定性增加,但系统对扰动的抑制能力减弱,对扰动有较敏感的响应。在调整参数时,采用凑试法。参考以上参数对控制过程的影响趋势,对参数实行“先比例,后积分,再微分”的步骤。(1)首先整定比例部分。将比例系数KP由小变大,并观察相应的系统响应,直到响应曲线超调小、反应快。如果系统没有静差,或者静差小到允许的范围内,那么只需比例调节器即可。(2)如果在比例调节的基础上系统的静差不能满足要求,则须加入积分作用。整定时首先置积分时间TI为一较大值,并将第1步整定

14、得到的比例系数KP缩小(80),然后减小积分时间,使静差得到消除。如果动态性能(过渡时间短)也满意,则需PI调节器即可。(3)若动态性能不好,则需加入微分作用。整定时,使微分时间TD从0变大,并相应的改变比例系数和积分时间,逐步凑试,直到满意结果。由于PID三个参数有互补作用,减小一个往往可由几个增大来补偿,因此参数的整定值不唯一,不同的参数组合完全有可能得到同样的效果。四实验内容本实验中,采用位置式PID。在一般的PID控制中,当有较大的扰动或大幅度改变给定值时,会有较大的偏差,以及系统有惯性和滞后,因此在积分项的作用下,往往会使系统超调变大和长时间的波动,过渡时间变长。特别对于温度、成份等

15、变化缓慢的过程,这一现象更为严重。为此,可采用积分分离PID控制算法,即:当偏差e(k)较大时,取消积分作用;当误差e(k)较小时才加入积分作用。系统方块图如图4-1所示, 是一个典型的 PID 闭环控制系统方块图,其硬件电路原理及接线图如图4-2所示,图中画“”的线需用户在实验中自行接好,对象需用户在运放单元搭接。图4-1 PID控制系统方块图图4-2 积分分离法PID控制实验线路图控制计算机的“OUT1”表示386EX内部1定时器的输出端,定时器输出的方波周期定时器时常,“IRQ7”表示386EX内部主片8259的7号中断,用作采样中断,“DIN0”表示386EX的I/O管脚P1.0,在这

16、里作为输入管脚用来检测信号是否同步。这里,系统偏差信号E通过模数转换单元“IN7”端输入,控制机的定时器作为基准时钟(初始化为10ms),定时中断采集“IN7”端的信号E,并进行PID计算,得到相应的控制量,再把控制量送到数模转换单元,由“OUT1”端输出相应的模拟信号,来控制对象系统。图4-3是积分分离法 PID控制程序流程图。图4-3 积分分离法PID控制程序流程图五、实验步骤1根据参考流程图4-3编写实验程序,检查无误后编译、链接。2按照实验线路图4-2接线,检查无误后开启设备电源。3调节信号源中的电位器及拨动开关,使信号源输出幅值为2V、周期6S的方波。确定系统的采样周期以及积分分离值

17、。4装载程序,将全局变量TK(采样周期)、EI(积分分离值)、KP(比例系数)、TI (积分系数)和TD(微分系数)加入变量监视,以便实验过程中观察和修改。5运行程序,将积分分离值设为最大值7FH(相当于没有引入积分分离),用示波器分别观测输入端R和输出端C。6如果系统性能不满意,用凑试法修改PID参数,直到响应曲线满意,并记录响应曲线的超调量和过渡时间。7修改积分分离值为20H,记录此时响应曲线的超调量和过渡时间,并和未引入积分分离值时的响应曲线进行比较。8将第6和第7步骤中较满意的响应曲线记录下来。六实验结果采样周期TK =05H;比例系数KP=6100H;积分系数TI=0018H;微分系

18、数TD=000BH。未引入积分分离值的响应曲线(即EI(积分分离值)=7FH时):积分分离值为20H时的响应曲线:由得到的实验结果可以看到,引入积分分离法后,降低了系统输出的超调量,并缩短了调节时间。积分分离值为10H时的响应曲线:实验五 直流电机闭环调速控制系统设计和实现一、实验目的1了解闭环调速控制系统的构成。2熟悉PID控制规律与算法实现。二、实验设备PC 机一台,TD-ACC+实验系统一套,i386EX 系统板一块。三、实验内容典型的直流电机调速实验的系统方框图如图11-1所示:图11-1 典型的直流电机调速实验的系统方框图根据系统方框图,直流电机闭环调速控制系统实验线路图设计如图11

19、-2所示,实验中将图中画“”的线接好。控制机算机的“DOUT0”表示386EX的I/O管脚P2.0,输出PWM脉冲经驱动后控制直流电机,“IRQ7”表示386EX内部主片8259的7号中断,用作测速中断。图11-2 直流电机闭环调速控制系统实验线路图实验中,用系统的数字量输出端口“DOUT0”来模拟产生PMW脉宽调制信号,构成系统的控制量,经驱动电路驱动后控制电机运转。霍尔测速元件输出的脉冲信号记录电机转速构成反馈量。在参数给定情况下,经PID运算,电机可在控制量作用下,按给定转速闭环运转。系统定时器定时1ms,作为系统采样基准时钟;测速中断用于测量电机转速。图11-3直流电机闭环调速控制系统

20、程序流程图四、实验步骤1参照图11-3的程序流程图,其中的PID子程序采用积分分离法PID,编写实验程序,编译、链接。2按图11-2接线,检查无误后开启设备电源,将编译链接好的程序装载到控制机中。3打开专用图形界面,运行程序,观察电机转速,分析其响应特性。4若不满意,改变参数:积分分离值Iband、比例系数KPP、积分系数KII、微分系数 KDD的值后再观察其响应特性,选择一组较好的控制参数并记录下来。表11-1 控制参数表项目 参数IBANDKPPKIIKDD超调稳定2%时间1例程中参数响应特性0060H1060H0010H0020H15%48秒2去掉IBAND0000H1060H0010H

21、0020H20%5.2秒3自测一组较好参数0010H6100H0018H000BH8%2.5秒5注意:在程序调试过程中,有可能随时停止程序运行,此时DOUT0的状态应保持上次的状态。当DOUT0为1时,直流电机将停止转动;当DOUT0为0时,直流电机将全速转动,如果长时间让直流电机全速转动,可能会导致电机单元出现故障,所以在停止程序运行时,最好将连接DOUT0的排线拔掉或按系统复位键。五、实验结果电机响应曲线:实验总结及建议: 此实验是我们的课程实验,实验的内容是我们课堂上学习的相关知识的应用,对我们来说这些知识是我们应该好好掌握的。运用书本所学,好好分析得到结论,有利于我们对知识的理解。由于

22、实验的时间有限,我们无法对所有的内容有很好的理解,我希望老师可以在试验前给我们以很好的引导,不要把时间浪费在不必要的事情上,而要有所着重点,在有限的时间里使我们尽可能学习更多的知识。在此,要谢谢老师在我们出现问题时的耐心解答。附录资料:不需要的可以自行删除 perl函数应用一、进程处理函数1、进程启动函数函数名eval调用语法eval(string)解说将string看作Perl语句执行。正确执行后,系统变量$为空串,如果有错误,$中为错误信息。例子$print = print (hello,worldn);eval ($print);结果输出hello, world函数名system调用语法

23、system(list)解说list中第一个元素为程序名,其余为参数。system启动一个进程运行程序并等待其结束,程序结束后错误代码左移八位成为返回值。例子proglist = (echo, hello,world!);system(proglist);结果输出hello, world!函数名fork调用语法procid = fork();解说创建程序的两个拷贝-父进程和子进程-同时运行。子进程返回零,父进程返回非零值,此值为子程序的进程ID号。例子$retval = fork();if ($retval = 0) # this is the child process exit; # th

24、is terminates the child process else # this is the parent process结果输出无函数名pipe调用语法pipe (infile, outfile);解说与fork合用,给父进程和子进程提供通信的方式。送到outfile文件变量的信息可以通过infile文件变量读取。步骤:1、调用pipe2、用fork将程序分成父进程和子进程3、一个进程关掉infile,另一个关掉outfile例子pipe (INPUT, OUTPUT);$retval = fork();if ($retval != 0) # this is the parent p

25、rocess close (INPUT); print (Enter a line of input:n); $line = ; print OUTPUT ($line); else # this is the child process close (OUTPUT); $line = ; print ($line); exit (0);结果输出$programEnter a line of input:Here is a test lineHere is a test line$函数名exec调用语法exec (list);解说与system类似,区别是启动新进程前结束当前程序。常与fork

26、合用,当fork分成两个进程后,子进程用exec启动另一个程序。例子 结果输出函数名syscall调用语法syscall (list);解说调用系统函数,list第一个元素是系统调用名,其余为参数。如果参数是数字,就转化成C的整型数(type int)。否则传递字符串的指针。详见UNIX的帮助或Perl文档。使用syscall必须包含文件syscall.pl,即:require (syscall.ph); 例子结果输出2、进程终止函数函数名Die调用语法die (message);解说终止程序并向STDERR输出错误信息。message可以为字符串或列表。如果最后一个参数不包含换行符,则程序文

27、件名和行号也被输出。例子die (Cannot open input file);结果输出Cannot open input file at myprog line 6.函数名warn调用语法warn (message);解说与die类似,区别是不终止程序。例子warn(Danger! Danger!n);结果输出Danger! Danger!函数名exit调用语法exit (retcode);解说终止程序并指定返回值。例子exit(2);结果输出无函数名kill调用语法kill (signal, proclist);解说给一组进程发送信号。signal是发送的数字信号,9为杀掉进程。proc

28、list是进程ID列表。详见kill的UNIX帮助。例子结果输出3、进程控制函数函数名sleep调用语法sleep (time);解说将程序暂停一段时间。time是停止的秒数。返回值为实际停止的秒数。例子sleep (5);结果输出无函数名wait调用语法procid = wait();解说暂停程序执行,等待子进程终止。不需要参数,返回值为子进程ID,如果没有子进程,返回-1。例子结果输出函数名waitpid调用语法waitpid (procid, waitflag);解说暂停程序执行,等待特定的子进程终止。procid为等待的进程ID例子$procid = fork();if ($proci

29、d = 0) # this is the child process print (this line is printed firstn); exit(0); else # this is the parent process waitpid ($procid, 0); print (this line is printed lastn);结果输出$ programthis line is printed firstthis line is printed last$4、其它控制函数函数名caller调用语法subinfo = caller();解说返回调用者的程序名和行号,用于Perl D

30、ebugger。返回值为三元素的列表:1、调用处的包名2、调用者文件名3、调用处的行号例子结果输出函数名chroot调用语法chroot (dir);解说改变程序的根目录,详见chroot帮助。例子结果输出函数名local调用语法local($variable);解说在语句块(由大括号包围的语句集合)中定义局域变量,仅在此语句块中起作用,对其的改变不对块外同名变量造成影响。千万不要在循环中使用,否则每次循环都定义一个新的局域变量!例子结果输出函数名times调用语法timelist = times解说返回该程序及所有子进程消耗的工作时间。返回值为四个浮点数的列表:1、程序耗用的用户时间2、程序

31、耗用的系统时间3、子进程耗用的用户时间4、子进程耗用的系统时间例子结果输出二、数学函数函数名sin调用语法retval = sin (value);解说参数为弧度值。函数名cos调用语法retval = cos (value);解说参数为弧度值。函数名atan2调用语法retval = atan2 (value1, value2);解说运算并返回value1除以value2结果的arctan值,单位为弧度,范围在-PIPI。应用例:角度转化成弧度子程序。sub degrees_to_radians local ($degrees) = _; local ($radians);11: $radi

32、ans = atan2(1,1) * $degrees / 45;函数名sqrt调用语法retval = sqrt (value);解说平方根函数。value为非负数。函数名exp调用语法retval = exp (value);解说返回e的value次方。函数名log调用语法retval = log (value);解说以e为底的自然对数。函数名abs调用语法retval = abs (value);解说绝对值函数。(Perl 4中没有)函数名rand调用语法retval = rand (num);解说随机数函数,返回0和整数num之间的一个浮点数。函数名srand调用语法srand (va

33、lue);解说初始化随机数生成器。保证每次调用rand真正随机。三、字符串处理函数函数名index调用语法position = index (string, substring, position);解说返回子串substring在字符串string中的位置,如果不存在则返回-1。参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配。函数名rindex调用语法position = rindex (string, substring, position);解说与index类似,区别是从右端匹配。函数名length调用语法num = length (string);解说返

34、回字符串长度,或者说含有字符的数目。函数名pos调用语法offset = pos(string);解说返回最后一次模式匹配的位置。函数名substr调用语法substr (expr, skipchars, length)解说抽取字符串(或表达式生成的字符串)expr中的子串,跳过skipchars个字符,或者说从位置skipchars开始抽取子串(第一个字符位置为0),子串长度为length,此参数可忽略,意味着取剩下的全部字符。当此函数出现在等式左边时,expr必须为变量或数组元素,此时其中部分子串被等式右边的值替换。函数名study调用语法study (scalar);解说用一种内部格式提

35、高变量的访问速度,同一时刻只对一个变量起作用。函数名lcuc调用语法retval = lc(string);retval = uc(string);解说将字符串全部转换成小/大写字母。函数名lcfirstucfirst调用语法retval = lcfirst(string);retval = ucfirst(string);解说将第一个字母转换成小/大写。函数名quotameta调用语法newstring = quotemeta(oldstring);解说将非单词的字母前面加上反斜线()。语句 : $string = quotemeta($string);等效于:$string = s/(W)

36、/$1/g;常用于模式匹配操作中,确保字符串中没有字符被看作匹配操作符。函数名join调用语法join (joinstr, list);解说把字符串列表(数组)组合成一个长的字符串,在每两个列表元素间插入串joinstr。函数名sprintf调用语法sprintf (string, fields);解说与printf类似,区别是结果不输出到文件,而作为返回值赋给变量。例子$num = 26;$outstr = sprintf(%d = %x hexadecimal or %o octaln,$num, $num, $num);print ($outstr);结果输出26 = 1a hexade

37、cimal or 32 octal四、标量转换函数函数名chop调用语法$lastchar = chop (var);解说var可为变量或数组,当var为变量时,最后一个字符被删除并赋给$lastchar,当var为数组/列表时,所有元素的最后一个字符被删除,最后一个元素的最后一个字母赋给$lastchar。函数名chomp调用语法result = chomp(var);解说检查字符串或字符串列表中元素的最后一个字符是否为由系统变量$/定义的行分隔符,如果是就删除。返回值为实际删除的字符个数。函数名crypt调用语法result = crypt (original, salt);解说用DES算

38、法加密字符串,original是将要加密的字符串,salt是两个字符的字符串,定义如何改变DES算法,以使更难解码。返回值为加密后的串。函数名hex调用语法decnum = hex (hexnum);解说将十六进制数(字符串形式)转化为十进制数。函数名int调用语法intnum = int (floatnum);解说将浮点数舍去小数部分转化为整型数。函数名oct调用语法decnum = oct (octnum);解说将八进制数(字符串形式)或十六进制数(0 x.形式)转化为十进制数。函数名ord调用语法asciival = ord (char);解说返回单个字符的ASCII值,与PASCAL中

39、同名函数类似。函数名chr调用语法$char = chr (asciival);解说返回ASCII值的相应字符,与PASCAL中同名函数类似。函数名pack调用语法formatstr = pack(packformat, list);解说把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。除了格式a、A和外,重复使用一种格式多次可在其后加个整数,如: $twoints = pack (i2, 103, 241);把同一格式应用于所

40、有的元素则加个*号,如: $manyints = pack (i*, 14, 26, 11, 83);对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下: $strings = pack (a6 x 2, test1, test2);格式的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如: $output = pack (a 6 a, test, test2);pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创建这样的数据可以这样做: $Cstring = pack (ax, $

41、mystring);下表是一些格式字符与C中数据类型的等价关系:字符 等价C数据类型CcharddoubleffloatiintIunsigned int (or unsigned)llongLunsigned longsshortSunsigned short完整的格式字符见下表。 格式字符 描述a用空字符(null)补足的字符串A用空格补足的字符串b位串,低位在前B位串,高位在前c带符号字符(通常-128127)C无符号字符(通常8位)d双精度浮点数f单精度浮点数h十六进制数串,低位在前H十六进制数串,高位在前i带符号整数I无符号整数l带符号长整数L无符号长整数n网络序短整数N网络序长整数

42、p字符串指针s带符号短整数S无符号短整数u转化成uuencode格式vVAX序短整数VVAX序长整数x一个空字节X回退一个字节以空字节(null)填充函数名unpack调用语法list = unpack (packformat, formatstr);解说unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;x为跳过一个字节;为跳过一些字节到指定的位置,如4为跳过4个字节。下面看一个和X合同的例子: $longrightint = unpack (*

43、X4 L, $packstring);此语句将最后四个字节看作无符号长整数进行转化。下面看一个对uuencode文件解码的例子:1 : #!/usr/local/bin/perl2 : 3 : open (CODEDFILE, /u/janedoe/codefile) |4 : die (Cant open input file);5 : open (OUTFILE, outfile) |6 : die (Cant open output file);7 : while ($line = ) 8 : $decoded = unpack(u, $line);9 : print OUTFILE (

44、$decoded);10: 11: close (OUTFILE);12: close (CODEDFILE); 当将pack和unpack用于uuencode时,要记住,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出(详见UNIX中uuencode帮助)。函数名vec调用语法retval = vec (vector, index, bits);解说顾名思义,vec即矢量(vector)函数,它把简单变量vector的值看作多块(维)数据,每块含一定数目的位,合起来

45、即一个矢量数据。每次的调用访问其中一块数据,可以读取,也可以写入。参数index就象数组下标一样,提出访问哪一块,0为第一块,依次类推,要注意的是访问次序是从右到左的,即第一块在最右边。参数bits指定每块中的位数,可以为1,2,4,8,16或32。例子1 : #!/usr/local/bin/perl2 : 3 : $vector = pack (B*, 11010011);4 : $val1 = vec ($vector, 0, 4);5 : $val2 = vec ($vector, 1, 4);6 : print (high-to-low order values: $val1 and

46、 $val2n);7 : $vector = pack (b*, 11010011);8 : $val1 = vec ($vector, 0, 4);9 : $val2 = vec ($vector, 1, 4);10: print (low-to-high order values: $val1 and $val2n); 结果high-to-low order values: 3 and 13low-to-high order values: 11 and 12函数名defined调用语法retval = defined (expr);解说判断一个变量、数组或数组的一个元素是否已经被赋值。e

47、xpr为变量名、数组名或一个数组元素。如果已定义,返回真,否则返回假。函数名undef调用语法retval = undef (expr);解说取消变量、数组或数组元素甚至子程序的定义,回收其空间。返回值始终为未定义值,此值与空串等效。五、数组和列表函数函数名grep调用语法foundlist = grep (pattern, searchlist);解说与同名的UNIX查找工具类似,grep函数在列表中抽取与指定模式匹配的元素,参数pattern为欲查找的模式,返回值是匹配元素的列表。例子list = (This, is, a, test);foundlist = grep(/tT/, lis

48、t);结果foundlist = (This, test);函数名splice调用语法retval = splice (array, slipelements, length, newlist);解说拼接函数可以向列表(数组)中间插入元素、删除子列表或替换子列表。参数skipelements是拼接前跳过的元素数目,length是被替换的元素数,newlist是将要拼接进来的列表。当newlist的长度大于length时,后面的元素自动后移,反之则向前缩进。因此,当length=0时,就相当于向列表中插入元素,而形如语句splice (array, -1, 0, Hello);则向数组末尾添加元素。而当newlist为空时就相当于删除子列表,这时,如果length为空,就从第skipelements个元素后全部删除,而删除最后一个元素则为:splice (array, -1);这种情况下,返回值为被删去的元素列表。函数名shift调用语法element = shift (arrayvar);解说删去数组第一个元素

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论