基于PLC的交通灯控制电路设_第1页
基于PLC的交通灯控制电路设_第2页
基于PLC的交通灯控制电路设_第3页
基于PLC的交通灯控制电路设_第4页
基于PLC的交通灯控制电路设_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

前言据不完全统计,目前我国城市里的十字路口交通系统大都采用定时来控制(不排除繁忙路段或高峰时段用交警来取代交通灯的情况),这样必然产生如下弊端:当某条路段的车流量很大时却要等待红灯,而此时另一条是空道或车流量相对少得多的道却长时间亮的是绿灯,这种多等少的尴尬现象是未对实际情况进行实时监控所造成的,不仅让司机乘客怨声载道,而且对人力和物力资源也是一种浪费。智能控制交通系统是目前研究的方向,也已经取得不少成果,在少数几个先进国家已采用智能方式来控制交通信号,其中主要运用GPS全球定位系统等。出于便捷和效果的综合考虑,我们可用如下方案来控制交通路况:制作传感器探测车辆数量来控制交通灯的时长。具体如下:在入路口的各个方向附近的地下按要求埋设感应线圈,当汽车经过时就会产生涡流损耗,环状绝缘电线的电感开始减少,即可检测出汽车的通过,并将这一信号转换为标准脉冲信号作为可编程控制器的控制输入,并用PLC计数,按一定控制规律自动调节红绿灯的时长。

比较传统的定时交通灯控制与智能交通灯控制,可知后者的最大优点在于减缓滞流现象,也不会出现空道占时的情形,提高了公路交通通行率,较全球定位系统而言成本更低。1PLC的发展背景及其原理概述1.1PLC概述PLC,(ProgrammableLogicController),乃是一种电子装置,早期称为顺序控制器“SequenceController”,1978NEMA(NationalElectricalManufactureAssociation)美国国家电气协会正式命名为ProgrammableLogicController,PLC),其定义为一种电子装置,主要将外部的输入装置如:按键、感应器、开关及脉冲等的状态读取后,依据这些输入信号的状态或数值并根据内部储存预先编写的程序,以微处理机执行逻辑、顺序、定时、计数及算式运算,产生相对应的输出信号到输出装置如:继电器(Relay)的开关、电磁阀及电机驱动器,控制机械或程序的操作,达到机械控制自动化或加工程序的目的。并藉由其外围的装置(个人计算机/程序书写器)轻易地编辑/修改程序及监控装置状态,进行现场程序的维护及试机调整。而普遍使用于PLC程序设计的语言,即是梯形图(LadderDiagram)程序语言[1]。而随着电子科技的发展及产业应用的需要,PLC的功能也日益强大,例如位置控制及网络功能等,输出/入信号也包含了DI(DigitalInput)、AI(AnalogInput)、PI(PulseInput)及NI(NumericalInput),DO(DigitalOutput)、AO(AnalogOutput)、PO(PulseOutput)及NO(NumericalOutput),因此PLC在未来的工业控制中,仍将扮演举足轻重的角色。1.2梯形图工作原理梯形图为二次世界大战期间所发展出来的自动控制图形语言,是历史最久、使用最广的自动控制语言,最初只有A(常开)接点、B(常闭)接点、输出线圈、定时器、计数器等基本机构装置(今日仍在使用的配电盘即是),直到可控制编程器PLC出现后,梯形图之中可表示的装置,除上述外,另增加了诸如微分接点、保持线圈等装置以及传统配电盘无法达成的应用指令,如加、减、乘及除等数值运算功能。无论传统梯形图或PLC梯形图其工作原理均相同,只是在符号表示上传统梯形图比较接近实体的符号表示,而PLC则采用较简明且易于计算机或报表上表示的符号表示。在梯形图逻辑方面可分为组合逻辑和顺序逻辑两种,分述如下:a.组合逻辑:分别以传统梯形图及PLC梯形图表示组合逻辑的范例图1.1传统梯形图图1.2PLC梯形图行1:使用一常开开关X0(NO:NormallyOpen)亦即一般所谓的〝A〞开关或接点。其特性是在平常(未按下)时,其接点为开路(Off)状态,故Y0不导通,而在开关动作(按下按钮)时,其接点变为导通(On),故Y0导通[2]。行2:使用一常闭开关X1(NC:NormallyClose)亦即一般所称的〝B〞开关或接点,其特性是在平常时,其接点为导通,故Y1导通,而在开关动作时,其接点反而变成开路,故Y1不导通。行3:为一个以上输入装置的组合逻辑输出的应用,其输出Y2只有在X2不动作或X3动作且X4为动作时才会导通。b.顺序逻辑:顺序逻辑为具有反馈结构的回路,亦即将回路输出结果送回当输入条件,如此在相同输入条件下,会因前次状态或动作顺序的不同,而得到不同的输出结果[3]。分别以传统梯形图及PLC梯形图表示顺序逻辑的范例(如下图)图1.3传统梯形图图1.4PLC梯形图在此回路刚接上电源时,虽X6开关为On,但X5开关为Off,故Y3不动作。在启动开关X5按下后,Y3动作,一旦Y3动作后,即使放开启动开关(X5变成Off)Y3因为自身的接点反馈而仍可继续保持动作(此即为自我保持回路),其动作可以下表表示:表1.1回路动作装置状态动工作顺序X5开关X6开关Y3状态1不动作不动作Off2动作不动作On3动作动作On4不动作动作Off5不动作不动作Off由上表可知在不同顺序下,虽然输入状态完全一致,其输出结果也可能不一样,如表中的动作顺序1和3其X5和X6开关均为不动作,在状态1的条件下Y3为Off,但状态3时Y3却为On,此种Y3输出状态送回当输入(即所谓的反馈)而使回路具有顺序控制效果是梯形图回路的主要特性。在本节范例中仅列举A、B接点和输出线圈作说明,其它装置的用法和此相同。1.3梯形图编辑说明梯形图为广泛应用在自动控制的一种图形语言,这是沿用电气控制电路的符号所组合而成的一种图形,透过梯形图编辑器画好梯形图形后,PLC的程序设计也就完成,以图形表示控制的流程较为直观,易为熟悉电气控制电路的技术人员所接受[4]。在梯形图形很多基本符号及动作都是根据在传统自动控制配电盘中常见的机电装置如按钮、开关、继电器(Relay)、定时器(Timer)及计数器(Counter)等等。PLC的内部装置:PLC内部装置的种类及数量随各厂牌产品而不同。内部装置虽然沿用了传统电气控制电路中的继电器、线圈及接点等名称,但PLC内部并不存在这些实际物理装置,它对应的只是PLC内部存储器的一个基本单元(一个位,bit),若该位为1表示该线圈得电,该位为0表示线圈不得电,使用常开接点(NormalOpen,NO或A接点)即直接读取该对应位的值,若使用常闭接点(NormalClose,NC或B接点)则取该对应位值的反相[5]。多个继电器将占有多个位(bit),8个位,组成一个字节(或称为一个字节,byte),二个字节,称为一个字(word),两个字,组合成双字(doubleword)[6]。当多个继电器一并处理时(如加/减法、移位等)则可使用字节、字或双字,且PLC内部的另两种装置:定时器及计数器,不仅有线圈,而且还有计时值及计数值,因此还要进行一些数值的处理,这些数值多属于字节、字或双字的形式。由以上所述,各种内部装置,在PLC内部的数值储存区,各自占有一定数量的储存单元,当使用这些装置,实际上就是对相应的储存内容以位或字节或字的形式进行读取。PLC的基本内部装置介绍如下表1.2功能说明装置种类功能说明输入继电器(InputRelay)输入继电器是PLC与外部输入点(用来与外部输入开关连接并接受外部输入信号的端子)对应的内部存储器储存基本单元。它由外部送来的输入信号驱动,使它为0或1。用程序设计的方法不能改变输入继电器的状态,即不能对输入继电器对应的基本单元改写,亦无法由HPP/WPLSoft作强行On/Off动作(SA/SX/SC/EH/EH2/SV系列主机可仿真输入继电器X作强行On/Off的动作,但此时外部输入点状态更新动作关闭,亦即外部输入信号的状态不会被读入至PLC内部相对的装置内存,只限主机的输入点,扩展的输入点仍依正常模式动作)。它的接点(A、B接点)可无限制地多次使用。无输入信号对应的输入继电器只能空着,不能移作它用[7]。装置表示:X0,X1,…X7,X10,X11,…,装置符号以X表示,顺序以8进制编号。在主机及扩展上均有输入点编号的标示。输出继电器(OutputRelay)输出继电器是PLC与外部输出点(用来与外部负载作连接)对应的内部存储器储存基本单元。它可以由输入继电器接点、内部其它装置的接点以及它自身的接点驱动。它使用一个常开接点接通外部负载,其接点也像输入接点一样可无限制地多次使用。无输出对应的输出继电器,它是空着的,如果需要,它可以当作内部继电器使用[8]。装置表示:Y0,Y1,…Y7,Y10,Y11,…,装置符号以Y表示,顺序以8进制编号。在主机及扩展上均有输出点编号的标示。内部辅助继电器(InternalRelay)内部辅助继电器与外部没有直接联系,它是PLC内部的一种辅助继电器,其功能与电气控制电路中的辅助(中间)继电器一样,每个辅助继电器也对应着内存的一基本单元,它可由输入继电器接点、输出继电器接点以及其它内部装置的接点驱动,它自己的接点也可以无限制地多次使用。内部辅助继电器无对外输出,要输出时请通过输出点[9]。装置表示:M0,M1,…,M4095,装置符号以M表示,顺序以10进制编号。步进点(Step)DVPPLC提供一种属于步进动作的控制程序输入方式,利用指令STL控制步进点S的转移,便可很容易写出控制程序。如果程序中完全没有使用到步进程序时,步进点S亦可被当成内部辅助继电器M来使用,也可当成警报点使用[10]。装置表示:S0,S1,…S1023,装置符号以S表示,顺序以10进制编号。定时器(Timer)定时器用来完成定时的控制。定时器含有线圈、接点及定时值寄存器,当线圈受电,等到达预定时间,它的接点便动作(A接点闭合,B接点开路),定时器的定时值由设定值给定。每种定时器都有规定的时钟周期(定时单位:1ms/10ms/100ms)。一旦线圈断电,则接点不动作(A接点开路,B接点闭合),原定时值归零[11]。装置表示:T0,T1,…,T255,装置符号以T表示,顺序以10进制编号。不同的编号范围,对应不同的时钟周期。计数器(Counter)计数器用来实现计数操作。使用计数器要事先给定计数的设定值(即要计数的脉冲数)。计数器含有线圈、接点及计数储存器,当线圈由OffOn,即视为该计数器有一脉冲输入,其计数值加一,有16位及32位及高速用计数器可供使用者选用[12]。装置表示:C0,C1,…,C255,装置符号以C表示,顺序以10进制编号。数据寄存器(Dataregister)PLC在进行各类顺序控制及定时值及计数值有关控制时,常常要作数据处理和数值运算,而数据寄存器就是专门用于储存数据或各类参数。每个数据寄存器内有16位二进制数值,即存有一个字,处理双字用相邻编号的两个数据寄存器[13]。装置表示:D0,D1,…,D9999,装置符号以D表示,顺序以10进制编号。文件寄存器(Fileregister)PLC数据处理和数值运算所需的数据寄存器不足时,可利用文件寄存器来储存数据或各类参数。每个文件寄存器内为16位,即存有一个字,处理双字用相邻编号的两个文件寄存器。文件寄存器SA/SX/SC系列机种一共有1,600个,EH/EH2/SV系列机种一共有10,000个,文件寄存器并没有实际的装置编号,因此需透过指令API148MEMR、API149MEMW或是透过周边装置HPP02及WPLSoft来执行文件寄存器的读写功能[13]。装置表示:K0~K9,999,无装置符号,顺序以10进制编号。变址寄存器(Indexregister)E、F与一般的数据寄存器一样的都是16位的数据寄存器,它可以自由的被写入及读出,可用于字装置、位装置及常量来作间接寻址功能[14]。装置表示:E0~E7、F0~F7,装置符号以E、F表示,顺序以10进制编号。2用PLC实现智能交通灯控制2.1控制系统的组成车辆的流量记数、交通灯的时长控制可由可编程控制器(PLC)来实现。当然,也可选用其他种类的计算机作为控制器。本例选用PLC作为控制器件是因为可编程控制器核心是一台计算机,它是专为工业环境应用而设计制造的计算机。它具有高可靠性丰富的输入/输出接口,并且具有较强的驱动能力;它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算,顺序控制,定时,计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程;它采用模块化结构,编程简单,安装简单,维修方便。

利用PLC,可使系统中的各传感器以及各道口的信号灯与之直接相连,非常方便可靠,如下图所示图2.1用PLC实现智能交通灯控制原理框图2.2硬件配置PLC选用FX2N-64,其输入端接收来自各个路口的车辆探测器测得的输出标准电脉冲,输出接十字路口的红绿信号交通灯。信号灯的选择:在本例中选用红、黄、绿发光二极管作为信号灯(箭头方向型)。系统的组成框图控制系统结构图如下图所示图2.2交通灯控制系统2.3交通灯的控制过程信号灯受启动及停止按钮的控制,当按下启动按钮时,信号灯系统开始工作,并周而复始地循环工作,当按下停止按钮时,系统将停止在初始状态,所有信号灯都熄灭。控制要求:南北主干道左转绿10S直行绿30S绿闪3S黄2S红45S右行红10S绿78S东西人行道绿27S绿闪3S红60S东西主干道红45S右行红10S绿78S左转绿10S直行绿30S绿闪3S黄2S南北人行道红60S绿27S绿闪3S正常循环控制方式:南北向(列)和东西向(行)主干道均设有左行绿灯10S,直行绿灯30S,绿灯闪亮3S,黄灯2S和红灯45S。当南北主干道红灯点亮时,东西主干道应依次点亮左行绿灯,直行绿灯,绿灯闪亮和黄灯;反之,当东西主干道红灯点亮时,南北主干道依次点亮左行绿灯,直行绿灯,绿灯闪亮和黄灯。南北向和东西向人行道均设有通行绿灯和禁行红灯。南北人行道通行绿灯应在南北向主干道直行绿灯点亮3S后才允许点亮,然后接3S绿闪,其他时间为红灯;同样,东西人行道通行绿灯于东西向主干道直行绿灯点亮3S后才允许点亮,然后接3S绿闪,其它时间为红灯。急车强通控制方式,急车强通信号受急车强通开关控制。无急车时,按正常循环时序控制,有急车来时,将急车强通开关接通,不管原来信号状态如何,一律强制让急车来车方向的绿灯亮,直到急车通过为止,将急车强通开关断开,信号的状态立即转为急车放行方向的绿灯闪亮3次。随后按正常时序控制。急车强通信号只能响应一路方向的来车,若两个方向先后来急车,则响应先来的一方,随后再响应另一方。模拟图如下所示图2.3交通灯示意图2.4PLC的选型根据设计要求,本设计共需要I/O点数为4输入/22输出。具体需要的输入输出点数如表2.1和表2.2所示。表2.1输入点数分配序号输入信号名称电气符号1启动按钮SB12停止按钮SB23急车强通按钮1SB34急车强通按钮2SB4表2.2输出点数分配序号输出信号名称电气符号1南北左转绿HL22南北左转黄HL113南北左转红HL134东西左转绿HL165东西左转黄HL196东西左转红HL67南北直行绿HL98南北直行黄HL149南北直行红HL310东西直行绿HL1811东西直行黄HL2212东西直行红HL713南北右行绿HL1014南北右行黄HL2115南北右行红HL416东西右行绿HL817东西右行黄HL1518东西右行红HL1719南北人行绿HL1220南北人行红HL521东西人行绿HL122东西人行红HL20根据表2.1和表2.2可以确定PLC以及扩展模块的选型。对于这种中小型自动控制中,应用德国西门子公司生产的S7-200系列PLC无疑是十分明智的选择。在主机模块中,常用的主机有CPU222,CPU224,CPU226三种。2.5车流量的计量车流量的计量有多种方式,本文以PLC计量方式统计,每股行车道的车流量通过PLC分别统计。当车辆进入路口经过第一个传感器1时,使统计数加1,经过第二个传感器2出路口时,使统计数减1,其差值为该股车道上车辆的滞留量(动态值),可以与其他道的值进行比较,据此作为调整红绿灯时长的依据。

先统计每股车道上车辆的滞留量,然后按大方向原则累加统计。如,将东西向的左行、直行、右行道上的车辆的滞留量相加,再与其它的3个方向的车流量进行比较,据此作为调整红绿灯时长的依据。统计每股车道上车辆的滞留量后按通行最大化原则(不影响行车安全的多道相向行驶)累加统计。如,东、西相向的2个左行、直行、右行道上的车辆的滞留量全部相加,再与南北向的总车流量进行比较,据此作为调整红绿灯时长的依据(下面的例子就是按此种方式)。以上计算判别全部由PLC完成。可以把以上不同计量判别方式编成不同的子程序,方便调用。2.6流程分析当各路口的车辆正常时(没有堵车),红绿灯切换采用现有的常规定时控制方式,而当各路口滞留量达一定值溢满时(相当于比较严重的堵车),系统将自行调整,比如,当东、西向路口的车辆滞留量比南、北向路口的大时(反之亦然),该方向的通行时间=最小通行定时时间+自适应滞环比较增加的延时时间(是变化的),但不大于允许的最大通行时间。其中最小定时时间是为了避免红绿灯切换过快之弊;最大通行时间是为了保障公平性,不能让其它的车或行人过分久等。进一步的说明在后面的注释中。图2.4自适应调整时间的滞环特性自适应滞环比较(本例的核心控制规律)增加的时间的确定若东、西向车辆滞留量≥南、北向一个偏差量σ(如30辆车或其它值)时,先让东、西向的左转弯车左行15s(定时控制,值可改),再让直行车直行30s(直行时间的最小值,值可改)后再加一段延时保持,直至东、西向的车辆滞留量比南、北向的车辆滞留量还要少一个偏差量σ,才结束该方向的通行,切换到其它路上,否则一直延时继续通行下去,直至到达最大通行时间而强制切换[11]。滞环特性如图6所示。实际应用时σ的值需整定,过小则导致红绿灯切换过频,过大又不能实现适时控制。3模块选择3.1扩展模块的选择S7-200系列CPU提供一定数量的主机数字量I/O点,但在主机I/O点数不够的情况下,就必须使用扩展模块的I/O点。由于本设计的输入点很少,只PLC主机的输入点足以满足要求。需要扩展6点输出,EM222是8DC输出,这样扩展一个EM222就满足系统要求,且比较经济合理,所以,选择EM222作为输出扩展模块。3.2EM222的端子连线图如图3.1所示,L+接24VDC,M接地。上下两部分其他8个端子均为数字量输出端子图3.1EM222数字输出8X24VDC端子连接图3.3扩展模块与主机的连接形式主机和扩展模块上均有一个连接口,用专用的连线将两个接线口连通即可。如图3.2所示。图3.2CPU226与EM222的连接图3.4I/O分配如表3.1、表3.2所示,优先分配主机CPU226的地址,后分配扩展模块EM222(8输出数字量模块)的地址。表3.1输入点分配启动开关0000停止开关 0001东西主干道绿灯1000东西主干道黄灯1001东西主干道红灯1002南北主干道绿灯1003南北主干道黄灯1004南北主干道红灯1005东西行人道绿灯1100东西行人道红灯1101南北行人道绿灯1102南北行人道红灯1103东西向绿灯延迟控制按钮0004南北向绿灯延迟控制按钮0005东西盲人脉冲按钮0003南北盲人脉冲按钮00023.2输出点分配序号输出信号名称按扭电气符号1南北左转绿HL2Q0.12南北左转黄HL11Q1.23南北左转红HL13Q1.44东西左转绿HL16Q1.75东西左转黄HL19Q2.26东西左转红HL6Q0.57南北直行绿HL9Q1.08南北直行黄HL14Q1.59南北直行红HL3Q0.210东西直行绿HL18Q2.111东西直行黄HL22Q2.512东西直行红HL7Q0.613南北右行绿HL10Q1.114南北右行黄HL21Q2.415南北右行红HL4Q0.316东西右行绿HL8Q0.717东西右行黄HL15Q1.618东西右行红HL17Q2.019南北人行绿HL12Q1.3结论通过此次毕业论文的写作过程,我不紧把知识融会贯通。而且丰富了大脑,同时在查找资料的过程中也了解了许多课外知识,开拓了视野,认识了将来电子的发展方向,使自己在专业知识方面和动手能力方面有了质的飞跃。毕业论文是我作为学生即将完成学业的最后一次的作业,它既是对学校所学知识的全面总结和综合运用,又为今后走上社会的实际操作运用铸就了一个良好的开端,毕业论文是我对所学知识理论的检验和总结,能够培养和提高我的独立分析能力和解决问题的能力;是我在校期间向学校所交的最后一封综合性作业,从老师的角度来说,知道做毕业十几是老师对学生所作的最后一次执手训练。其次,毕业论文的指导是老师检验其教学效果,改进学习方法,提高教学质量的绝好机会。在不断的努力下我的毕业设计终于完成了,在没写毕业设计之前我觉得毕业实际只不过是这几年的学习的一个知识的总结。但真的面对毕业设计的时候我发现我的想法是错误的,毕业论文不仅是对知识的一种检验,还是对能力的一种提高自己学习的东西还太多,同过这次的毕业设计我才明白学习是一种长期积累的过程,在以后的工作、生活中都因该不段的学习,努力提高自己的知识和综合素质。这次的毕业论文让我总结出一个结论:知识必须通过应用才能实现其价值,有些东西以为学不会,但真正用到的时候才发现是两回事,所以我认为只有真正会用的时候才是真的学会了。参考文献[1]廖常初.可编程序控制器的编程方法与工程应用[M].重庆:重庆大学出版社,2001

[2]廖常初.PLC梯形图程序的设计方法与技巧[M].重庆:重庆大学出版社,1998[3]邓则名、邝穗芳等.电器与可编程序控制器应用技术[M].北京:机械工业出版社,1997[4]周少武等.大型可编程序控制器系统设计[M].北京:中国电力出版社,2001[5]曹辉.可编程序控制器系统原理及应用[M].北京:电子工业出版社,2003[6]路林吉.江龙康等.可编程序控制器原理及应用[M].北京:清华大学出版社,2002[7]钟秋海,付梦印.现代控制理论与应用[M].北京:机械工业出版社,1996[8]张万忠.可编程控制器应用技术[M].北京:化学工业出版社,2001.[9]王兆义.小型可编程控制器实用技术[M].北京:机械工业出版社,2002[10]张万忠.可编程控制器入门与应用实例[M].北京:中国电力出版社2005[11]殷洪义.PLC原理与实践[M].北京:清华大学出版社,2008[12]JohnR.Hackworth.ProgrammableLogicControllers.[M]PrenticeHallInc.2003[13]ThomasL.Floyd.ProgrammingMethodsandApplications[M]PrenticeHallInc.2005[14]FrankD.Petruzella.PLCtutorial[M]PearsonEducationNorthAsiaLimitedandHigherEducationPress.2007致谢在此论文撰写过程中,要特别感谢史水娥导师的指导与督促,同时感谢她的谅解与包容。没有史老师的帮助也就没有今天的这篇论文。求学历程是艰苦的,但又是快乐的。本论文的顺利完成,同样离不开同学和朋友的关心和帮助,在此表示衷心的感谢。大学四年即将结束,在这四年的学期中结识的各位生活和学习上的挚友让我得到了人生最大的一笔财富。在此,也对他们表示衷心感谢。谢谢我的父母,没有他们辛勤的付出也就没有我的今天,在这一刻,将最崇高的敬意献给你们!本文参考了大量的文献资料,在此,向各学术界的前辈们致敬!田明杰2013年5月于河南师范大学新联学院附录资料:不需要的可以自行删除busybox详解制作根文件系统详解制作根文件系统一、FHS(FilesystemHierarchyStandard)标准介绍当我们在linux下输入ls

/的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。该标准规定了根目录下各个子目录的名称及其存放的内容:目录名存放的内容/bin必备的用户命令,例如ls、cp等/sbin必备的系统管理员命令,例如ifconfig、reboot等/dev设备文件,例如mtdblock0、tty1等/etc系统配置文件,包括启动文件,例如inittab等/lib必要的链接库,例如C链接库、内核模块/home普通用户主目录/rootroot用户主目录/usr/bin非必备的用户程序,例如find、du等/usr/sbin非必备的管理员程序,例如chroot、inetd等/usr/lib库文件/var守护程序和工具程序所存放的可变,例如日志文件/proc用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下的内容/sys用来提供内核与设备信息的虚拟文件系统,由内核自动生成目录下的内容/mnt文件系统挂接点,用于临时安装文件系统/tmp临时性的文件,重启后将自动清除

制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其过程大体包括:编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录利用交叉编译工具链,构建/lib目录手工构建/etc目录手工构建最简化的/dev目录创建其它空目录配置系统自动生成/proc目录利用udev构建完整的/dev目录制作根文件系统的jffs2映像文件下面就来详细介绍这个过程。二、编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录这些目录下存储的主要是常用命令的二进制文件。如果要自己编写这几百个常用命令的源程序,mygod,这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀——busybox,事情就简单很多。1、从/下载busybox-1.7.0.tar.bz22、tarxjvfbusybox-1.7.0.tar.bz2解包3、修改Makefile文件175ARCH

?=arm

176CROSS_COMPILE

?=arm-linux-4、makemenuconfig配置busyboxbusybox配置主要分两部分。第一部分是BusyboxSettings,主要编译和安装busybox的一些选项。这里主要需要配置:1)、BuildOptions--BuildBusyBoxasastaticbinary(nosharedlibs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库。2)、InstallationOptions--Appletslinks(assoft-links)--(X)assoft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。3)、InstallationOptions--(/work/nfs_root/fs_mini3)BusyBoxinstallationprefix,表示busybox的安装位置。我们选择/work/nfs_root/fs_mini34)BusyboxLibraryTuning。保留Commandlineediting以支持命令行编辑;保留Historysize以支持记忆历史命令;选中Tabcompletion和Usernamecompletion以支持命令自动补全第二部分是Applets,他将busybox的支持的几百个命令分门别类。我们只要在各个门类下选择想要的命令即可。这里我们基本保持默认设置。1)选中NetworkingUtilities--httpd下的Enable-u<user>option,以启用http服务器的功能allowstheservertorunasaspecificuser5、编译busyboxmake6、安装busyboxmakeinstall安装完成后,可以看到在/work/nfs_root/fs_mini3目录下生成了binsbinusr/binusr/sbin目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接,而busybox本身的大小不到800K:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ls

bin

linuxrc

sbin

usr

dennis@dennis-desktop:/work/nfs_root/fs_mini3$

ls-lbin

total740

lrwxrwxrwx1dennisdennis

72010-04-0323:57addgroup->busybox

lrwxrwxrwx1dennisdennis

72010-04-0323:57adduser->busybox

lrwxrwxrwx1dennisdennis

72010-04-0323:57ash->busybox

-rwxr-xr-x1dennisdennis7496322010-04-0323:57busybox

lrwxrwxrwx1dennisdennis

72010-04-0323:57cat–>busybox而普通PC机上的ls命令就有差不多80K的大小:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ls-l/bin/ls

-rwxr-xr-x1rootroot780042007-09-2920:51/bin/lsbusybox以它娇小的身躯容纳了数以百计的命令代码,实在是让人佩服不已,其不愧嵌入式系统瑞士军刀之美誉。据说,busybox的作者身患绝症,这更让人钦佩GNU开源软件的作者们。三、利用交叉编译工具链,构建/lib目录光有应用程序(命令)是不够的,因为应用程序本身需要使用C库的库函数,因此还必需制作forARM的C库,并将其放置于/lib目录。mygod,要自己写C库的源代码吗?不用!还记得交叉编译工具链的3个组成部分吗?交叉编译器、forARM的C库和二进制工具。哈哈,forARM的C库是现成的,我们只需要拷贝过来就可以了。遗憾的是:整个C库目录下的文件总大小有26M。而我们根文件系统所在分区不过区区16M而已,根本放不下。怎么办呢?dennis@dennis-desktop:/work/nfs_root/fs_mini3$du-s--si/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib

26M

/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib需要C库目录下所有的文件吗?no,absolutelyno!让我们来分析一下glibc库目录下内容的组成。该目录下的子目录和文件共分8类:目标文件,如crtn.o,用于gcc链接可执行文件libtool库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件gconv目录,里面是各种链接脚本,在编译应用程序时,他们用于指定程序的运行地址,各段的位置等静态库文件(.a),例如libm.a,libc.a动态库文件(.so、.so.[0-9]*)动态链接库加载器ld-2.3.6.so、ld-linux.so.2其它目录及文件很显然,第1、2、3、4、7类文件和目录是不需要拷贝的。由于动态链接的应用程序本身并不含有它所调用的C库函数的代码,因此执行时需要动态链接库加载器来为它加载相应的C库文件,所以第6类文件是需要拷贝的。除此之外,第5类文件当然要拷贝。但第5类文件的大小也相当大。dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$du-c--si*.so*7.2M

total需要全部拷贝吗?非也,非也!其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。如果我们只制作最简单的系统,那么我们只需要运行busybox这一个应用程序即可。通过执行dennis@dennis-desktop:/work/nfs_root/fs_mini3$arm-linux-readelf-abin/busybox|grep'Shared'

0x00000001(NEEDED)

Sharedlibrary:[libcrypt.so.1]

0x00000001(NEEDED)

Sharedlibrary:[libm.so.6]

0x00000001(NEEDED)

Sharedlibrary:[libc.so.6]可知:busybox只用到了3个库:通用C库(libc)、数学库(libm)、加密库(libcrypt),因此我们只需要拷贝这3个库的库文件即可。但是每个库都有4个文件,4个文件都要拷贝吗?当然不是。dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ls-llibcrypt[.-]*

-rwxr-xr-x1dennisdennis307002008-01-2205:32libcrypt-2.3.6.so

-rw-r--r--1dennisdennis231182008-01-2205:32libcrypt.a

lrwxrwxrwx1dennisdennis

132008-12-2215:38libcrypt.so->libcrypt.so.1

lrwxrwxrwx1dennisdennis

172008-12-2215:38libcrypt.so.1->libcrypt-2.3.6.so

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ls-llibm[.-]*

-rwxr-xr-x1dennisdennis

7790962008-01-2205:31libm-2.3.6.so

-rw-r--r--1dennisdennis11342822008-01-2205:32libm.a

lrwxrwxrwx1dennisdennis

92008-12-2215:38libm.so->libm.so.6

lrwxrwxrwx1dennisdennis

132008-12-2215:38libm.so.6->libm-2.3.6.so

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ls-llibc[.-]*

-rwxr-xr-x1dennisdenni01-2205:48libc-2.3.6.so

-rw-r--r--1dennisdennis27682802008-01-2205:31libc.a

-rw-r--r--1dennisdennis

1952008-01-2205:34libc.so

lrwxrwxrwx1dennisdennis

132008-12-2215:38libc.so.6->libc-2.3.6.so4个文件中的.a文件是静态库文件,是不需要拷贝的。另外3个文件是:实际的共享链接库:libLIBRARY_NAME-GLIBC_VERSION.so。当然需要拷贝。主修订版本的符号链接,指向实际的共享链接库:libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦链接了特定的链接库,将会参用该符号链接。程序启动时,加载器在加载程序前,会检索该文件。所以需要拷贝。与版本无关的符号链接,指向主修订版本的符号连接(libc.so是唯一的例外,他是一个链接命令行:libLIBRARY_NAME.so,是为编译程序时提供一个通用条目)。这些文件在程序被编译时会被用到,但在程序运行时不会被用到,所以不必拷贝它。关于共享库的2个符号链接的作用的特别说明:当我们使用gcc

hello.c

-o

hello

-lm编译程序时,gcc会根据-lm的指示,加头(lib)添尾(.so)得到libm.so,从而沿着与版本无关的符号链接(libm.so->libm.so.6)找到libm.so.6并记录在案(hello的ELF头中),表示hello需要使用libm.so.6这个库文件所代表的数学库中的库函数。而当hello被执行的时候,动态链接库加载器会从hello的ELF头中找到libm.so.6这个记录,然后沿着主修订版本的符号链接(libm.so.6->libm-2.3.6.so)找到实际的共享链接库libm-2.3.6.so,从而将其与hello作动态链接。可见,与版本无关的符号链接是供编译器使用的,主修订版本的符号链接是供动态链接库加载器使用的,而实际的共享链接库则是供应用程序使用的。通过以上分析,我们只需要拷贝3个库(每个库各1个主修订版本的符号链接和1个实际的共享链接库)以及动态链接库加载器(1个符号链接和1个实体文件)。步骤如下:dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$mkdir/work/nfs_root/fs_mini3/libdennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp

libcrypt-*/work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-llibcrypt.so.*/work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp

libm-*/work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-llibm.so.*/work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp

libc-*/work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-llibc.so.*/work/nfs_root/fs_mini3/libdennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-lld-*/work/nfs_root/fs_mini3/lib四、手工构建/etc目录/etc目录存放的是系统程序的主配置文件,因此需要哪些配置文件取决于要运行哪些系统程序。即使最小的系统也一定会运行1号用户进程init,所以我们至少要手工编写init的主配置文件inittab。busybox的inittab文件的语法、语义与传统的SYSV的inittab有所不同。inittab文件中每个条目用来定义一个需要init启动的子进程,并确定它的启动方式,格式为<id>:<runlevel>:<action>:<process>。例如:ttySAC0::askfirst:-/bin/sh<id>表示子进程要使用的控制台,若省略则使用与init进程一样的控制台<runlevel>表示运行级别,busyboxinit程序这个字段没有意义<action>表示init进程如何控制这个子进程sysinit:系统启动后最先执行,只执行一次,init进程等待它结束后才继续执行其它动作wait:系统执行完sysinit条目后执行,只执行一次,init进程等待它结束后才继续执行其它动作once:系统执行完wait条目后执行,只执行一次,init进程不等待它结束respawn:启动完once进程后,init进程监测发现子进程退出时,重新启动它askfirst:启动完respawn进程后,与respawn类似,不过init进程先输出”PleasepressEntertoactivatethisconsole“,等用户输入回车后才启动子进程shutdown:当系统关机时restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init进程接收到SIGUP信号时执行,先重新读取、解析/etc/inittab文件,再执行restart程序ctrlaltdel:按下ctrl+alt+del键时执行,不过在串口控制台中无法输入它<process>表示进程对应的二进制文件。如果前面有-号,表示该程序是“可以与用户进行交互的”我们制作最简单的/etc/inittab文件,其内容如下:::sysinit:/etc/init.d/rcS

::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount-a–r制作最简单的脚本程序文件/etc/init.d/rcS,其内容如下:#!/bin/sh

ifconfigeth07修改shell脚本文件/etc/init.d/rcS的权限,以使其可被执行:#chmoda+x/etc/init.d/rcS五、手工构建最简化的/dev目录在linux机器上,执行ls

/dev可看到几百个设备文件,我需要手工创建它们吗?maybe,我只需要手工创建几个设备文件!我怎么知道我应该创建哪几个设备文件呢?管它呢,先看看开发板上可爱的linux的反应再说。启动Linux操作系统,显示:VFS:Mountedroot(nfsfilesystem).

Freeinginitmemory:112K

Warning:unabletoopenaninitialconsole.这说明,内核已经成功挂载根文件系统,但却未能成功启动第1个用户进程init。通过错误消息“unabletoopenaninitialconsole”搜索内核源代码,找到init/main.c文件。748staticintnoinlineinit_post(void)

749{

750

free_initmem();

751

unlock_kernel();

752

mark_rodata_ro();

753

system_state=SYSTEM_RUNNING;

754

numa_default_policy();

755

756

if(sys_open((constchar__user*)"/dev/console",O_RDWR,0)<0)

757

printk(KERN_WARNING"Warning:unabletoopenaninitialconsole.\n");

758

759

(void)sys_dup(0);

760

(void)sys_dup(0);

761

762

if(ramdisk_execute_command){

763

run_init_process(ramdisk_execute_command);

764

printk(KERN_WARNING"Failedtoexecute%s\n",

765

ramdisk_execute_command);

766

}

767

768

/*

769

*Wetryeachoftheseuntilonesucceeds.

770

*

771

*TheBourneshellcanbeusedinsteadofinitifweare

772

*tryingtorecoverareallybrokenmachine.

773

*/

774

if(execute_command){

775

run_init_process(execute_command);

776

printk(KERN_WARNING"Failedtoexecute%s.

Attempting"

777

"defaults...\n",execute_command);

778

}

779

run_init_process("/sbin/init");

780

run_init_process("/etc/init");

781

run_init_process("/bin/init");

782

run_init_process("/bin/sh");

783

784

panic("Noinitfound.

Trypassinginit=optiontokernel.");

785}显然,内核错误是由175行不能打开/dev/console所致。通过查看已经安装好的linux机器的/dev/console设备文件,可知其是字符设备文件,主设备号为5,次设备号为1:dennis@dennis-desktop:/work/nfs_root/fs_mini3/etc$ls-l/dev/console

crw1rootroot5,12010-04-0808:40/dev/console因此,我们使用下面的命令创建它:dennis@dennis-desktop:/work/nfs_root/fs_mini3/dev$sudomknodconsolec51还需要创建其它设备文件吗?只有天知道!再看看linux的反应。VFS:Mountedroot(nfsfilesystem).

Freeinginitmemory:112K

init:can'topen'/dev/null':Nosuchfileordirectory这次我们有经验了,如法炮制,创建/dev/null设备文件:dennis@dennis-desktop:/work/nfs_root/fs_mini3/dev$sudomknodnullc13再次重启开发板上的linux,显示VFS:Mountedroot(nfsfilesystem).

Freeinginitmemory:112K

initstarted:BusyBoxv1.7.0(2010-04-0323:53:55CST)

startingpid229,tty'':'/etc/init.d/rcS'PleasepressEntertoactivatethisconsole.

startingpid231,tty'':'/bin/sh'

#哈哈,我们成功了,终于可以K歌去了。六、创建其它空目录K完歌回来,继续战斗。dennis@dennis-desktop:/work/nfs_root/fs_mini3$mkdirhomerootprocsystmpmntvar再次重启动开发板上的linux。咦,似乎有些问题。VFS:Mountedroot(nfsfilesystem).

Freeinginitmemory:112K

initstarted:BusyBoxv1.7.0(2010-04-0323:53:55CST)

startingpid229,tty'':'/etc/init.d/rcS'PleasepressEntertoactivatethisconsole.

startingpid231,tty'':'/bin/sh'

#ps

PID

Uid

VSZStatCommand

#ps竟然看不到任何进程的存在!让我想想。对了,ps的机制是通过查看/proc中的内容来获得进程信息的。那么,目前/proc里有哪些内容呢?#ls/proc

#竟然空空如野!这可如何是好?七、配置系统自动生成/proc目录其实/proc是用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下的内容。不过需要我们设置一下,将/etc/init.d/rcS修改为:#!/bin/sh

ifconfigeth07

mount-tprocnone/proc对于mount-tprocnone/proc的解释:通常情况下mount命令应该写为mount–text2/dev/hdb1/proc。但由于现在挂载的/proc是虚拟文件系统,它不与任何物理硬盘分区相对应,因此在表示物理硬盘分区的位置用占位符none来表示。重启开发板上的linux,显示成功了:PleasepressEntertoactivatethisconsole.

startingpid232,tty'':'/bin/sh'

#ps

PID

Uid

VSZStatCommand

10

3088S

init

20

SW<[kthreadd]

30

SWN[ksoftirqd/0]

40

SW<[events/0]

50

SW<[khelper]

410

SW<[kblockd/0]

420

SW<[ksuspend_usbd]

450

SW<[khubd]

470

SW<[kseriod]

590

SW

[pdflush]

600

SW

[pdflush]

610

SW<[kswapd0]

620

SW<[aio/0]

1770

SW<[mtdblockd]

2260

SW<[rpciod/0]

2320

3092S

-sh

2330

3092R

ps

#八、利用udev构建完整的/dev目录高兴地插入U盘,内核显示识别到了U盘:#usb1-1:newfullspeedUSBdeviceusings3c2410-ohciandaddress2

usb1-1:notrunningattopspeed;connecttoahighspeedhub

usb1-1:configuration#1cho

温馨提示

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

评论

0/150

提交评论