本科毕业设计太阳能热水器自动控制系统_第1页
本科毕业设计太阳能热水器自动控制系统_第2页
本科毕业设计太阳能热水器自动控制系统_第3页
本科毕业设计太阳能热水器自动控制系统_第4页
本科毕业设计太阳能热水器自动控制系统_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1、、PLC控制电路的设计根据系统的控制要求、系统的总体设计及系统所选的元器件,设计出系统的控制原理图及PLC外部接线图,如图36所示太阳能热水器系统PLC I/O控制原理电路图。隔离变压器隔离变压器图37 太阳能热水器系统PLC I/O控制原理电路图3.2 系统软件设计方案可编程控制器是扫描工作方式,能同时对多个模块进行控制,在整个程序扫描时间里加上不同的输入检测信号,就可使程序按所检测信号判断进入不同的分支程序。主程序包含有多个分支程序,这样既提高了编程的灵活性又减少了不必要的代码重复,同时也方便以后系统扩展对软件的修改,系统主要是接收上位机的控制参数,并完成太阳能热水器温度、液位的测量和控制

2、任务。3.2.1 软件组成软件系统通常分为两大类:一类是系统软件,另一类是应用软件。系统软件指的是操作系统、程序设计系统等与计算机密切相关的程序。系统软件一般由计算机生产商或各种软件公司提供,带有一定的通用性,用不着自己编写。本课题采用日本三菱公司的PLC,所以系统软件是由三菱公司提供的,该软件对系统进行实时监控。应用软件是用户根据要解决的实际问题而编写的各种程序。在计算机控制系统中,每个控制对象或控制任务都要有相应的控制程序,用这些控制程序来完成对象的不同要求,这种程序通常称为应用程序。本课题主要根据太阳能热水器的各种输入输出状态来编制PLC的梯形图程序。3.2.2 系统控制流程图1、建立系

3、统控制流程图根据系统的控制要求及实际的控制需要,绘制系统控制流程图1)主程序控制系统流程图水位子程序水位子程序温度子程序图38 主程序控制系统流程图2)水位子程序流程图图39 水位子程序流程图3)温度子程序流程图图310 温度子程序流程图4) 除尘子程序流程图 图311除尘子程序流程图流程图简介:PLC投入运行,系统处于初始状态,准备好起动。根据太阳能热水器定时器设定的工作的时间段看是否到工作时间。如果没有到则系统停止。如果到工作时间。则调用温度子程序和水位自程序。根据水箱内的水位和水温进行PID调节。如果水箱内的水位低于设定值。则打开进水阀。先供水5分钟。然后停2分钟,实现节水功能。如果水箱

4、内的水温低于设定值。则进行加热。如果水位过高或者水温过高。则系统发出报警信号。当外部环境温度超过4度时。则调用除尘子程序。除尘时。电机先正转20秒。然后电机反转20秒。循环直到除尘达到2分钟时。则返回从开始的全部动作,进行下一次大循环。此外,还可以按手动按钮以实现手动供水、排水和手动加热功能。3.2.3 设计PLC控制原理(梯形图程序)程序设计:用流程图表达出各控制对象的动作顺序,相互间的制约关系。明确寄存器空间的分配,专用寄存器的确定等。控制系统的程序的设计,主程序的编制及各功能子程序的编制以及程序的调试。其他辅助程序的设计,如故障应急程序等。根据控制系统流程图,绘制太阳能热水器系统控制的梯

5、形图和编制程序指令表,其完整梯形图及指令表见附录。第四章 可编程控制器(PLC)的安装、维护和检修4.1 PLC的安装为保证PLC工作的可靠性,提高它的工作效率,延长其使用寿命,对使用场合、环境温度要有一定的要求。在安装PLC时,要满足下列条件:环境温度在050的范围内;环境相对湿度应在35-85范围内;周围无腐蚀和易燃的气体;应避免太阳光的直接照射及液态物质的溅射;应避免铁屑及灰尘;避免频繁或连续的振动及冲击。除满足以上环境条件外,安装时还应该注意以下几点:在安装和拆卸时,PLC的所有单元必须断电;在接触PLC前,必须事先释放人体所带静电;注意PLC周围的通风和散热;严防导线头、铁屑等从通风

6、窗掉入可编程控制器内部,造成印刷电路板短路,使其不能正常工作甚至水久损坏。尽可能远离高压电源线和高压设备,可编程控制器高压设备和电源线之间应留出至少200mm的距离。小型可编程控制器外壳的4个角上,均有安装孔。有两种安装方法,一是底板安装,不同的单元有不同的安装尺寸;另一种是DIN(德国共和标准)轨道固定。DIN轨道配套使用的安装夹板,左右各一对。在轨道上,先装好左右夹板,装上PLC,然后拧紧螺钉20。4.2 PLC系统的电源接线PLC供电电源可采用直流24V、交流1 00V120V或200V240V的工作电源。如果电源发生故障,中断时间少于10ms ,PLC工作不受影响。若电源中断超过10m

7、s或电源下降超过允许值,则PLC停止工作,所有的输出点均同时断开。当电源恢复时,若RUN输入接通,则操作自动进行。对于电源线来的干扰,PLC本身具有足够的抵制能力,也可以安装一个变比为1:1的隔离变压器,以减少设备与地之间的干扰。4.3 接地良好的接地是保证PLC可靠工作的必要条件。在接地时应注意以下几点:PLC的接地线应为直径在2mm以上的专用线;接地电阻应小于100;PLC的地线不能和其它设备共用;PLC的各单元地线应相连在一起。4.4 输入接线PLC一般接受行程开关、限位开关等输入的开关量信号。输入接线端子是PLC与外部传感器负载转换信号的端口。输入接线,一般指外部传感器与输入端口的接线

8、。输入器件可以是任何无源的触点或集电极开路的NPN管。输入器件接通时,输入端接通,输入线路闭合,同时输入指示的发光二极管亮。输入端的一次电路与二次电路之间,采用隔离变压器。二次电路带RC滤波器,以防止由于输入触点抖动或从输入线路串入的电噪声引起PLC误动作。若在输入触点电路串联二极管,在串联二极管上的电压应小于4V。若使用带发光二极管的舌簧开关,串联二极管的数目不能超过两只。另外,输入接线还应特别注意以下几点:输入接线一般不要超过30m,但如果环境干扰较小,电压降不大时,输入接线可适当长些。输入、输出线不能用同一根电缆,输入、输出线要分开。可编程控制器所能接受的脉冲信号的宽度,应大于扫描周期的

9、时间。4.5 输出接线可编程控制器有继电器输出、晶闸管输出、晶体管输出3种形式。输出端接线分为独立输出和公共输出。当PLC的输出继电器或晶闸管动作时,同一号码的两个输出端接通。在不同组中,可采用不同类型和电压等级的输出电压。但在同一组中的输出只能用同一类型、同一电压等级的电源。由于PLC的输出元件被封装在印制电路板上,并且连接至端子板,若将连接输出元件的负载短路,将烧毁印制电路板,因此,应用熔丝保护输出元件。采用继电器输出时,承受的电感性负载大小影响到继电器的工作寿命,因此继电器工作寿命要求长。PLC的输出负载可能产生噪声干扰,因此要采取措施加以控制。此外,对于能使用户造成伤害的危险负载,除了

10、在控制程序中加以考虑之外,还应设计外部紧急停车电路,使得可编程控制器发生故障时,能将引起伤害的负载电源切断。交流输出线和直流输出线不要用同一本电缆,输出线应尽量远离高压线和动力线,避免并行。4.6 PLC的维护和检修虽然PLC的设计,已使维修和运行故障减少到最小程度,但为了保证系统的正常工作,尽量延长系统的使用寿命,应定期进行维护和检修。注意电源电压、环境指标、I/0参数、安装情况及备份电池等情况的检查与维护,确保PLC的正确稳定运行。 第五章 结 论通过本次课程设计,使太阳能热水器达到了系统的各种控制要求,成功完成太阳能热水器的PLC自动控制系统的设计。经过对系统程序的运行调试,实现了太阳能

11、热水器的自动控制,也可实现太阳能热水器手动控制。提高了系统的可靠性,达到了设计目标。设计中还是存在着一些不足,本系统还有待进一步的完善、改进。与国外相比,我国的太阳能热水器的自动控制系统却一直处于研究和开发阶段,尤其是与太阳能热水系统匹配的控制系统。国外已经发展用PLC对太阳能热水器的精细控制,我国对太阳能热水器自动控制系统的研究还有很长一段路要走。参考文献1 袁任光.可编程序控制器技术与实例M.广州:华南理工大学出版社,2003,215-2382 刘敏.可编程控制器技术M. 北京:机械工业出版社.2000,57-863 邱公伟.可编程控制器网络通信及应用 M. 北京:清华大学出版社,2001

12、,112-1354 陈宏.可编程控制器 ( PLC) 的选型J.化工进展,2003,22 (12) :1354-13565 胡学芝.可编程控制器的选择J.机械制造与自动化,2004,33(2):65-676 姚伟.太阳能利用与可持续发展J .中国能源,2005,27(2):46-477 李亭寒,陈小霓,等.太阳能应用技术,中国农业机械出版社,2004,25(2)12-158 赵缓,越慧,等.我国太阳能资源及其开发利用,经济地理,1998,98-1259 刘文强.我国太阳能热水器产业发展现状及展望,2002年第4卷(第104卷),4-10 陆维德.我国太阳热水器产业的发展,太阳能,1999年第4

13、期,23-2511 奚阳.热管太阳能集热器冬季运行性能研究,江西学报,1999年第J期,6-812 冯德纯,贾玉英,等.透明真空平板玻璃,中国玻璃,1998年第2期,4-7 13 贾玉英,冯心,等.真空玻璃的制造,中国玻璃,2000年第6期,2-614 唐健正,贾玉英,等.真空玻璃及发展前景,新材料和应用,2001年第1期 45-4815 戴大祥,高效节能的真空玻璃,上海建材,2003年第2期,20-2I16 冯德纯,贾玉英,等.真空玻璃,中国玻璃,2002年第26卷第1期,14-2017 A.Zoller,Hohle glasscheibe,Deutsches Reich Patentsch

14、rift No.3887618 R.J.Comicini Gaseous heat conduction at low pressures and temperatures, 19-2619 R.E.Collins,L.Poladian,B.A.Pailthorpe,and R.C.Mc Phedran,Heat conduction through support piilars in evacuated windows,Aust.J.Phys.44,73-86(1991)20 D.K.Benson,L.K.Smith,T.Potter,C.Christiansen,and D.E.Soul

15、e,Vacuum window,lazings for energy efficient buildings:Summary report, Internal Report SERI/TP-212-3584, SolarEnergy Research Institute,68-74(1990)致 谢时间如梭,经过两个多月的紧张的忙碌,毕业设计终于接近尾声,给大学的最后一课画上了一个圆满的句号。四年的理论学习,使我掌握了基本的专业知识、学习方法。然而,理论离不开实践,毕业设计正是专业教学的最后一个环节它使我们使所学的知识得到复习、巩固,加强了理论联系实际的能力,真正把所学的知识应用到实践中去,为

16、将来步入社会,走向工作单位打下了坚实的基础。在各位指导教师和同学的热心帮助下,我完成了本次设计。在毕业论文完成之际向培养我的学校及所有关怀和鼓励我的老师表示深深的谢意。这次设计为我今后的工作奠定了良好的基础,同时,使我能够把学到的知识应用到实践当中,也是对我四年来所学专业知识的一次检验。在设计过程中得到了来自方方面面的关怀与指导。尤其是指导教师李胜多老师在学习中给予了很大的帮助,为本次设计的顺利完成耗费了大量的心血。在此我要向尊敬的导师表示深深的谢意!最后,感谢全体电气化与自动化专业的老师及同学给予我的关心和帮助。由于本人能力有限,在设计过程中不妥之处在所难免,望广大指导教师给予批评指正。谢谢

17、!附录 梯形图附录 指令表0LDX0001ORM02ANIX0013OUTM04LDM05MOVK6D2010MOVK0D2115MOVK0D2220MOVK18D3025MOVK0D3130MOVK0D3235TRDD038TZCPD20D30D3M347ANDM448OUTM2149LDM2150CALLP153CALLP256MPS57LDM1658ORY00559ORT260ORX00461ORX00262ANB63ANIT164OUTY565OUTT1K300068MRD69LDT170ORM171ANB71ANB72ANIT273OUTM174OUTT2K120077MRD78LD

18、X00279ORX00580ANB81OUTY00682MRD83ANDX00284ANIT385OUTM286OUTT3120089MPP90CALLP393MPS94ANDM295OUTY01596MRD97ANDMO98OUTY00099MRD100ANDM0101OUTY001102MRD103ANDM2104OUTY002105MRD106LDY010107ORY012108AND109ANIY004110OUTY003111MPP112LDX006113ORY004114ANB115OUTY004116FEND117P1118LDM8000119MOVK180D500124MOVK

19、1800D502129MOVK3000D510134MOVH0030D511139MOVK70D512144MOVK0D515149MOVK2000D532154MOVK0D533159PLSM6161LDM6162SETM7163LDMM8002164T0K0K0H3300K1173LDM8000174FROMK0K0D501K1183LDIM7184RSTD502187LDM7188PIDD500D501D510D502197MOVD511K2M10202MPS203ANDM9204PLFM8206MPP207ANDM8208RSTM7209LDM7210OUTT246K2000213LD

20、T246214ORIM7215RSTT246217LDD501D510244OUTY010245LDM8067246OUTY016247STET248P2249LDM8000250MOVK37D150255MOVK1800D152260MOVK3000D160265MOVH0030D161270MOVK80D162275MOVK0D165280MOVK2000D182285MOVK0D183290PLSM10292LDM10293SETM11294LDM8002295T0K0K0H3300K1304LDM8000305FROMK0K0D151K1314LDIM11315RSTD152318LD

21、M11319PIDD150D151D160D152328MOVD161K2M10333MPS334ANDM13335PLFM12337MPP338ANDM10339RSTM11340LDM11341OUTT247K2000344LDT247345ORIM11346RSTT247348LDD151D200376OUTY012377LDM8067378OUTY017379STET380P3381LDM2382ORM51383ORT5384ANIM41385ANIT3386MPS387ANIT4388OUTM51389MPP390OUTT4K200393LDT4394ORM41395ANIT5396

22、ANIM51397ANIT3398OURM41399OUTT5K200402LDM51403ANIM41404OUTY013405LDM41406ANIM51407OUTY014409SRET410NOP附录资料:不需要的可以自行删除C语言编译器的设计与实现 我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:(1) 词法分析部分(2) 语法分析处理及四元式生成部分 (3) 输出显示部分一词法分析器设计 由于我们规定的程序语句中涉及单词较少,故

23、在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式: (单词种别,单词自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#define e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#d

24、efine EA 12#define EO 13#define plus 14#define times 15#define becomes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函数说明 读取函数 readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” source.dat

25、”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readch( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从 source.dat 中读取下一行至输入缓冲区。扫描函数 scan( ) 扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。变量处理 find( )变量处理中首先把以字母开头的字母数字串存到 spelling 数组中,然后进行识别。识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让

26、它与变量名表中的变量进行匹配( 变量匹配函数 find( ) ),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量( 值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。数字识别 number( ) 数字识别将识别出的数字填入二元式结果缓存数组。显示函数 显示函数的功能在屏幕上输出词法分析的结果( 即二元式序列程序),同时给出二元式个数及源程序行数统计。二语法分析器设计 语法分析器的核心是三张 SLR 分析表以及针对这三张 SLR 分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过 S

27、LR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。在处理 if 和 while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。1. 控制语句的 SLR 分析表1 设计过程如下: 将扩展文法GS S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SL用_CLOSURE方法构造LR(0)项目规范簇为:I0: S SS if e S else SS while e S S L S a ;I1: S SI2: S ife S else SI3: S while e SI4:

28、 S L L S L SL S if e S else SS while e S S L S a ; I5: S a; I6: S if e S else S S if e S else SS while e S S L S a ; I7: S while e S S if e S else SS while e S S L S a ; I8: S L I9: L S L SL L SL L S S if e S else SS while e S S L S a ; I10: S a ; I11: S if e S else SI12: S while e S I13: S L I14: S

29、 SL I15: S if e S else S S if e S else SS while e S S L S a ; I16: S if e S else S 构造文法G中非终结符的FOLLOW集如下:FOLLOW(S) = # S if e S else S得FOLLOW(S) = else S L 得FOLLOW(L) = 3) S S 得FOLLOW(S) = else , # L S 因为FIRST(S) = ,所以FOLLOW(S) = else , #, 在()项目规范簇中,只有9有“移进归约”冲突,L SL SL因为FOLLOW(L) FIRST(L) = 所以可以用方法解

30、决以上冲突,最后我们得到的分析表如下:ACTIONGOTO ifElsewhilea;e#SL0S2S3S4S511ACC2S63S74S2S3S4S5985S106S2S3S4S5117S2S3S4S5128S139S2S3S4R5S591410R4R4R4111512R2R2R213R3R3R314R615S2S3S4S51616R1R1R1static int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */

31、 -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1,/* 3 */ -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -

32、1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9 */ 2, -1, 3, 4,105, 5, -1, -1, -1, 9, 14,/* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1,

33、-1, -1,106, -1, -1, -1, -1, -1, -1,/* 15*/ 2, -1, 3, 4, -1, 5, -1, -1, -1, 16, -1,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列为 action 值,后 2 列为 goto 值;016 表示 17 个移进状态( 即 Si);-1表示出错;ACC 表示分析成功;而 100106 对应 7 个归约产生式:S SS if e S else SS while e SS L S a;L SL SL2. 算术表达式的 LR 分析表 2 设计如下:S EE

34、 E+EE E*EE (E)E i (过程略)ACTIONGOTOI+*()#E0S3S211S4S5ACC2S3S263R4R4R4R44S3S275S3S286S4S5S97R1R5R1R18R2R2R2R29R3R3R3R3static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7

35、,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/* 7 */ -1,101, 5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,103,103, -1;3.布尔表达式的 SLR 分析表3 设计如下:(过程略)S BB iB i rop iB ( B )B ! BA B &B ABO B |B OBACTIONGOTOiRop()!&|#BAO0S1S4S513781S2R1R1R1R12S33R2R2R2R24

36、S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action21611=/* 0 */ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8,/* 1 */ 1, 2, -1,101, -1,101,101,101, -1, -1, -1,/* 2 */ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 3 */ -1, -

37、1, -1,102, -1,102,102,102, -1, -1, -1,/* 4 */ 1, -1, 4, -1, 5, -1, -1, -1, 11, 7, 8,/* 5 */ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8,/* 6 */ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1,/* 7 */ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8,/* 8 */ 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8,/* 9 */ 105, -1,105, -1,105,

38、-1, -1, -1, -1, -1, -1,/*10 */ 107, -1,107, -1,107, -1, -1, -1, -1, -1, -1,/*11 */ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1,/*12 */ -1, -1, -1,103, -1,103,103,103, -1, -1, -1,/*13 */ -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1,/*14 */ -1, -1, -1,106, -1, 9, 10,106, -1, -1, -1,/*15 */ -1, -1, -1,108,

39、-1, 9, 10,108, -1, -1, -1;LR 分析表控制语义加工的实现:当扫描 LR 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。现在对 LR 分析器的分析栈加以扩充,使得每个文法符号之后都跟着它的语义值。为了清晰起见,我们把这个栈的每一项看成由三部分组成:状态 state ,文法符号 syl 和语义值 val。编译程序实现算术表达式、布尔表达式及程序语句的语义加工时,都是按这种状态栈加工方式进行的。例如:( 5 + 3 ) * 6的分析过程序号STATEValsylinput10-#( 5 + 3 ) * 6

40、#202-#(5 + 3 ) * 6 #3023#(5+ 3 ) * 6 #4026-5#(E+ 3 ) * 6 #50264-5-#(E+3 ) * 6 #602643-5-#(E+3 ) * 6 #702647-5-3#(E+E) * 6 #8026-8#(E) * 6 #90269-8-#(E)* 6 #1001-8#E* 6 #11015-8-#E* 6 #120153-8-#E*6#130158-8-6#E*E#1401-48#E#15ACC在分析过程中,第(3)步操作后的状态栈为 023,根据栈顶状态“ 3”和现行输入符号“ +”( input 栏字符串的第一个字符)查分析表 AC

41、TION3,+=R4,即按第(4)个产生式 En 来进行归约;由于产生式右部仅含一项,故去掉状态栈栈顶“3”;此时 2 变为新的栈顶状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第( 4)步的状态。第( 7)步操作后也是如此,当前状态栈为 02647,根据栈顶状态 7 和现行输入符号“ )”查分析表 ACTION7,)=R1,即按第(1)个产生式 EE1+E2进行归约;由于产生式右部有三项,故去掉状态栈栈顶的 647 三项;此时 2 变为新的栈顶状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,

42、最后得到第(8)步的状态。三中间代码生成器设计:布尔表达式 布尔表达式在程序语言中有两个基本作用:一是用作控制语句( 如 if -else 或 while语句)的条件式;二是用于逻辑演算,计算逻辑值。布尔表达式是由布尔算符( &、| 、!)作用于布尔变量( 或常数)或关系表达式而形成的。关系表达式的形式是 E1 rop E2,其中 rop 是关系符( 如或),E1和 E2是算术式。在这里,我们只考虑前面给定文法所产生的布尔表达式:BB &B | B | B | ! B | (B) | i rop i | i遵照我们的约定,布尔算符的优先顺序( 从高到低)为:!、&、|,并假定&和|都服从左结合

43、规则。所有关系符的优先级都是相同的,而且高于任何布尔算符,低于任何算术算符,关系算符不得结合。表达式的真、假出口的确定:考虑表达式 B1 | B2 ,若 B1为真,则立即知道 B 也为真;因此,B1的真出口也就是整个 B 的真出口。若 B1?为假,则 B2必须被计值,B2的第一个四元式就是 B1的假出口。当然,B2的真、假出口也就是整个 B的真、假出口。类似的考虑适用于对 B1 & B2的翻译,我们将 B1 | B2和 B1 & B2 的翻译用下图表示,在自下而上的分析过程中,一个布尔式的真假出口往往不能在产生四元式的同时就填上。我们只好把这种未完成的四元式的地址( 编号)作为 B 的语义值暂

44、存起来,待到整个表达式的四元式产生完毕之后再来回填这个未填入的转移目标。条件语句对条件语句 if e S1 else S2 中的布尔表达式 e,其作用仅在于控制对 S1和 S2的选择。因此,作为转移条件的布尔式e,我们可以赋予它两种“ 出口”:一是“ 真”出T口,出向 S1;一是“ 假”出口,出向 S2。于是,e的代码F条件语句可以翻译成如图的一般形式。非终结符 e 具有两项语义值 e _TC 和e_FC,它们分别指出了尚待回填真、S2的代码假出口的四元式串。e 的“ 真”出口只有在往回扫描到if时才能知道,而它图 3-2 条件语句的代码结构 的“ 假”出口则需到处理过 S1并且到达 else

45、 才能明确。这就是说,必须把 e_FC 的值传下去,以便到达相应的 else时才进行回填。另外,当 S1语句执行完时意味着整个 if-else 语句也已执行完毕;因此,在 S1的编码之后应产生一条无条件转移指令。这条转移指令将导致程序控制离开整个 if-else 语句。但是,在完成 S2的翻译之前,这条无条件转移指令的转移目标是不知道的。甚至,在翻译完 S2之后,这条转移指令的转移目标仍无法确定。这种情形是由于语句的嵌套性所引起的。例如下面的语句:if e1 if e2 S1 else S2 else S3 在 S1的代码之后的那条无条件转移指令不仅应跨越 S2而且应跨越 S3。这也就是说,转

46、移目标的确定和语句所处的环境密切相关。条件循环语句条件循环语句 while e S 通常被翻译成图的代码结构。布尔式 e 的“ 真”出口出向 S 代码段的第一个四元式。紧接 S 代码段之后应产生一条转向测试 e 的无条件转移指令。e 的“ 假”出口将导致程序控制离开整个 while 语句。e 的“ 假”出口目标即使在整个 while 语句翻译完之后也未必明确。例如: if e1 while e2 S1 else S2这种情况仍是由于语句的嵌套性引起的。所以,我们只好把它作为语句的语义值 SCHAIN 暂留下来,以便在处理外层语句时再伺机回填。语法翻译实现方法 将上述语法翻译付诸实现过程中,我们

47、仅保留了算术表达式和布尔表达式翻译的文法和语义动作;面对程序语句的翻译,由于改造后含有较多的非终结符且语义动作又相对简单,故仍恢复为改造之前的程序语句文法。由于总体上构造一个 SLR 分析表来实现语法分析及语义加工将使得所构造的 SLR 分析表过大,所以将其分为下面三部分处理:对算术表达式单独处理,即为算术表达式构造一个 SLR 分析表,并将赋值语句A=E 与算术表达式归为一类处理,处理之后的赋值语句仅看作为程序语句文法中的一个终结符 a。对布尔表达式也单独处理,并为其构造一个 SLR 分析表,经 SLR 分析表处理后的布尔表达式看作为程序语句文法中的一个终结符 e。程序语句文法此时变为:S

48、if e S else S | while e S | L | a;L SL | S此时为程序语句构造相应的 SLR 分析表就简单多了。前面的程序语句文法中所添加的非终结符是为了能及时回填有关四元式转移目标而引入的,在取消了这些非终结符后又如何解决及时回填转移目标的问题呢?我们采取的解决方法是增加两个数组 labelmark 和 labeltemp 来分别记录语句嵌套中每一层布尔表达式( 如果有的话)e 的首地址以及每一层else( 如果有的话)之前的四元式地址( 即无条件转出此层 if 语句的四元式)。也即,对程序语句的翻译来说:在处理完布尔表达式 e 后,回填 if 或 while 语句的真值链;在归约完每一个语句 S 之后检查符号栈,看在 S 之前的文法符号是否 if 或 while,若是则回填假值链( 假值入口为语句 S 所对应的四元式序列之后;对 if 语句,此时已在该序列之后加入了一条无条件转移的四元式);在 if 语句中,else 前面要加入一个无条件转移的四元式转向 if 语句末尾;在 while语句尾要有一个无条件转移四元式转向 while 语句开头。四数据结构说明 编译程序中涉及到的数据结构说明如下:char ch=0; /*从字符缓冲区中读取当前字符*/int count=0; /*词法分析结果缓冲区计数器*/static char spelling10

温馨提示

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

评论

0/150

提交评论