基于单片机的可编程逻辑控制设计.doc_第1页
基于单片机的可编程逻辑控制设计.doc_第2页
基于单片机的可编程逻辑控制设计.doc_第3页
基于单片机的可编程逻辑控制设计.doc_第4页
基于单片机的可编程逻辑控制设计.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、需求分析21.1项目概述21.2本设计的需求与意义31.3本设计的前景和特色42本实训的概要设计52.1硬件电路52.2软件的使用与程序的编写72.2.1上位机对梯形图的录入72.2.2通信模块程序的编写82.2.3下位机梯形图解释器程序的编写122.2.4整体系统框架的搭建,以及LCD显示与按键程序的编写163、详细设计173.1程序完成对uC/OS-II操作系统的移植183.2.1OS_CPU.H的编写193.2.2OS_CPU_C.C的编写193.2.3OS_CPU_A.ASM203.2在系统中创建各模块并在主函数中添加各摸块任务。213.3在系统中编写key.c和display.c文件程序224、调试过程285、实训总结及感想305.1本次实训体会:305.2 实训总结31 2、LCD显示与按键程序的编写为了将单片机的运行状态表示出来,在系统中添加了key.c和display.c文件,通过调试板上的液晶屏及添加相应的驱动程序,当GPIOF的按键被按下时,在屏上对应的显示出相应的状态,分为三种:运行态,停止态和故障态。使设备的运行态一目了然,同时也完善了工程项目的品质。3、详细设计作者在实训中承担完成系统框架的搭建,并移植uC/OS-II操作系统,以及完成对按键和显示两个模块程序的编写。C/OS实时嵌入式操作系统的结构 硬件层硬件驱动BSP实时操作系统内核RTOSFS文件系统、图形界面、系统管 理接口应用层APP应用层各任务调用关系及参数传递3.1程序完成对uC/OS-II操作系统的移植uC/OS-II的代码大概分为3类,这3类分别为与处理器相关代码、uC/OS-II的配置代码和与处理器无关的代码。根据不同的处理器,我们需要修改的代码文件为OS_CPU.H 、OS_CPU_A.ASM 和OS_CPU_C.C,而在应用程序中使用uC/OS-II时,需要用户提供的是应用软件和uC/OS-II的配置部分。3.2.1OS_CPU.H的编写OS_CPU.H包括了用# define 语句定义的、与处理器相关的常数、宏以及类型,栈增长方向定义,关中断和开中断定义,系统软中断的定义等等。系统内核与移植过程是无关的,用户只需要在应用系统开发过程中,通过配置OCS_CFG.H文件来对内核进行裁剪,只使用应用系统需要的功能,使系统最小最优化。例如STM32的堆栈是从上往下递减的,所以要将常数变量OS_STK_GROWTH定义为1,即 #define OS_STK_GROWTH 13.2.2OS_CPU_C.C的编写UC/OS中共定义了6个函数在该文件中.但是最重要的是OSTaskStkInit().其他都是对系统内核的扩展时用的.OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化.使建立好的进入就绪态任务的堆栈与系统发生中断并且将环境变量保存完毕时的栈结构一致.这样就可以用中断返回指令使就绪的任务运行起来.uC/OS-II的移植范例要求用户编写10个简单的C函数:OSTaskStkInit();OSTaskCreateHook();OSTaskDelHook();OSTaskSwHook();OSTaskIdleHook();OSTaskStatHook();OSTaskTickHook();OSInitHookBegin();OSInitHookEnd();OSTCBInitHook();3.2.3OS_CPU_A.ASM这部分需要对处理器的寄存器进行操作。包括四个子函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR().OSStartHighRdy()由多任务系统启动函数OSStart()中调用.完成的功能是:设置系统运行标志位OSRunning=TRUE;将就绪表中最高优先级任务的栈指针Load到SP中,并强制中断返回.使就绪的最高优先级任务调整至运行态一样,使得整个系统得以运转. OSCtxSw()在任务级任务切换函数中调用的.任务级切换是通过SWI或者TRAP人为制造的中断来实现的.ISR的向量地址必须指向OSCtxSw().这一中断完成的功能:保存任务的环境变量(主要是寄存器的值,通过入栈来实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了任务级的切换. OSIntCtxSw()在退出中断服务函数OSIntExit()中调用,实现中断级任务切换.由于是在中断里调用,所以处理器的寄存器入栈工作已经做完,就不用作这部分工作了.具体完成的任务:调整栈指针(因为调用函数会使任务栈结构与系统任务切换时堆栈标准结构不一致),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了中断级任务切换. OSTickISR()系统时钟节拍中断服务函数,这是一个周期性中断,为内核提供时钟节拍.频率越高系统负荷越重.其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务.一般只限于ms级(跟MCU有关),对于要求更加苛刻的任务需要用户自己建立中断来解决.该函数具体内容:保存寄存器(如果硬件自动完成就可以省略),调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回.uC/OS-II的移植实例要求用户编写4个简单的汇编语言函数:OSStartHighRdy();OSCtxSW();OSIntCtxSw();OSTickISR();3.2在系统中创建各模块并在主函数中添加各摸块任务。主函数中依次完成:定义全局变量; 声明个任务内函数.初始化uCOS-II,此函数中建立了空闲任务和统计任务,建立开始TaskStart任务,控制权交给uC/OS-II内核,开始运行多任务。实现对STM32的初始化,并建立多个任务,包括建立各任务的堆栈,以及设置优先级。 创建各功能任务void TaskExplainer(void *pdata) 解释器任务 void TaskCom(void *pdata) 通信任务 void TaskKey (void *pdata) 按键任务 void TaskDisp(void *pdata) 显示任务在系统框架中添加各任务的源文件Display.c 、key.c 、LCD驱动文件lcd24.c程序框架如下图:3.3在系统中编写key.c和display.c文件程序编程思想:在key.c文件中,按键按下时,通过IF语句的判断,实现对状态位state的设定。流程图如下:在display.c文件中,通过IF语句对状态位state的判断,在液晶屏上实现显示的功能,流程图如下:Key.c中按键与状态位的设置程序:void KeyBoardScan(void)if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_0)=0)State.Run=1;if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_2)=0)State.Stop=1;if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_3)=0)State.Wrong=1; 通过状态位state的设定,在显示display中实现显示功能:void DispState(void)if(State.Run=1)LCD_PutString(148, 200, 设备运行, MAGENTA ,GREEN),LCD_PutString(75, 55, PLC设备状态, WHITE,BLUE), LCD_PutString(145,220, , BLUE,BLUE),LCD_PutString(145,240, , BLUE,BLUE), LCD_PutString(114,200,R, MAGENTA,GREEN), LCD_PutString(114,220, , BLUE,BLUE),LCD_PutString(114,240, , BLUE,BLUE);State.Run=0;if(State.Stop=1) LCD_PutString(148,220, 设备停止, WHITE,RED), LCD_PutString(75, 55, PLC设备状态, WHITE,BLUE), LCD_PutString(145,200, , BLUE,BLUE),LCD_PutString(145,240, , BLUE,BLUE), LCD_PutString(114,220,S, WHITE,RED),LCD_PutString(114,200, ,BLUE,BLUE),LCD_PutString(114,240, , BLUE,BLUE); State.Stop=0;if(State.Wrong=1) LCD_PutString(148, 240, 设备故障, WHITE,RED),LCD_PutString(75, 55, PLC设备状态, WHITE,BLUE), LCD_PutString(145,200, , BLUE,BLUE),LCD_PutString(145,220, , BLUE,BLUE), LCD_PutString(114,240,W, WHITE,RED),LCD_PutString(114,220, , BLUE,BLUE),LCD_PutString(114,200, ,BLUE,BLUE); State.Wrong=0;在LCD上显示效果如下截图:运行状态停止状态故障状态4、调试过程虚拟串行驱动程序(VSPD)是一个可在计算机(Windows)下操作的程序,此驱动程序会创造数个“虚拟”的串行埠。 由一般程序看来,这些虚拟的串行端口跟实体的串行端口相同,唯一不同于传统传输的地方是在于程序所送出的信息是透过TCP/IP局域网络送至虚拟串行端口,之后由EM100再将所收到的信息传达至串行设备。 当串行设备要回传信息时,要先将信息传至EM100,而后再藉由局域网络将信息传回至位于计算机端的虚拟串行驱动程序,当虚拟串行驱动程序收到信息后,又会将其传回给程序,就如同传统串行线。Commix为工业控制设计的串口设备调试工具,已被许多同行使用,主要特点: 1)、能根据设备的通讯协议,方便地生成多种冗余校验如Modbus,并加上结束符,适用于大多数串口通讯的工业设备; 2)、能够混合输入16进制数、10进制数、ASCII字符,这种功能通过转义符“”实现; 3)、支持串口1255,支持各种虚拟串口,可以自定义任意通讯参数组合,随时改变参数而不用关闭串口,支持不常用的波特率等; 4)、可以测出设备的响应间隔; 5)、通讯数据可保存到RTF文件,参数设置可保存到注册表reg文件。 6)、可切换中文/英文显示。首先用虚拟串口虚拟出来两个串口COM1和COM2,然后相连:然后用Commix模拟串口2: VSPDXP调试界面Commix调试界面 串口的输出5、实训总结及感想5.1本次实训体会:(1)掌握了STM32常用模块的编程配置,并将相关的软硬件知识应用到实际项目中去,从动手实践中实际知识。(2)通过实训既掌握关于PLC梯形图等知识的应用又学习了STM32在工程上的应用,本次实训完成了从事工程项目工作的锻炼。(3)在学习uCOS的基础上,应用模块化对项目进行编程,以及完成了将uCOS操作系统移植到STM32中去的过程。(4)实训中,我们不仅有对软件编程的学习,也有我们对硬件实用电路的掌握,以及外围电路的搭建。(5)熟悉了将PLC的梯形图编入单片机过程以及在实际调试中实现工程要求,完成实现对对象的控制。(6)本实训重要的是初步参与掌握了完成一个工程项目的具体过程和步骤,以及面对一个项目的问题,如何分析解决困难的能力,对以后参加工作有着莫大的帮助。还掌握了安全用电的知识,学习了安全操作要领,培养了严谨的工作作风,培养了良好的工作习惯,也树立了正确的团队协作意识。5.2 实训总结本次实训,首先要感谢指导老师李琦的精心指导帮助,在本次实训中,李老师针对在项目逐渐深入进行中出现的种种难题都给予了专题讲座,使同学们的困惑迎刃而解,使我们能够按时完成实训,在此让我们向认真负责的老师表示感谢。1、 需求分析1.1项目概述本项目所设计的新型PLC系统由上下位机两部分组成,上位机为PLC编程软件系统,主要负责程序的编辑,编译和监控;下位机为PLC运行系统,主要负责接收上位机编译的程序,在硬件电路中运行。其主要任务是开发出一个符合IEC61131-3国际标准的新型PLC系统,在充分研究国内外知名PLC产品的基础上,对PLC系统进行了设计。整个系统下位机以STM32单片机作为核心控制芯片来开发,上位机以Visual CH 60 MFC为开发工具,实现了一个友好、高效的编程环境。具体任务功能工作如下:1 上位机编程软件系统的设计与实现:整个上位机编程软件可以实现编程语言的编辑、保存、转化、编译,具体可分为以下几个部分:(1) 工程管理:以工程为单位,将梯形图保存在一个文件夹下,对用户程序进行管理,还根据用户的需要可以对工程进行加密管理。(2) 梯形图的编辑:考虑到梯形图的动态编辑特性,实现梯形图图元的插入、删除、复制、剪切、粘贴和属性设置等功能。2 下位机运行系统的设计与实现:下位机以STM32单片机作为系统的核心控制芯片,根据PLC的基本结构设计硬件电路。下位机控制主要实现系统的初始化设置,指令执行,控制电路输出功能。3上下位机之间通讯功能的设计与实现:按照上下位机之间约定的通讯协议,采用串口来实现上位机与下位机之间的通讯。通过串口通讯,上位机可以下载目标代码,监控PLC程序运行,查询IO的状态。1.2本设计的需求与意义 由于基于单片机的PLC成本极低,实际应用时可以带来较好的经济效益,因而具有较强的实用性。当我们设计机电一体化产品或从事自动化装置设计时,有时会碰到这样两种需求和问题:第一种需求,机电一体化产品装置或自动化装置中需要进行较为复杂的梯形图逻辑控制,并且被控对象需要用强电来驱动。这时,我们自然会想到采用PLC作为逻辑控制器。但在某些机电一体化产品或自动化装置的设计中,要求逻辑控制器的成本极低。这时若采用现成的PLC很难实现极低成本要求。当该机电一体化产品或自动化装置需要大大降低成本时,现成的PLC的价格会显得太高。第二种需求,机电一体化产品或自动化装置中需要进行较为复杂的梯形图逻辑控制,但被控对象只需要用弱电来驱动。要求逻辑控制成本极低。这时,该怎样实现极低成本的、在弱电驱动条件下的较为复杂的梯形图逻辑控制的需求呢?上述两种需求的问题焦点都是要求设计出成本极低,同时能完成较为复杂的梯形图逻辑控制的逻辑控制器。我们能不能在机电一体化产品或自动化装置中的硬件设计中直接用价格极低的单片机芯片来充当逻辑控制器,使其具备梯形图逻辑控制功能,并且设计出适合于单片机的电路,形成一个直接用单片机芯片来取代PLC、并能完成较为复杂的梯形图逻辑控制的系统呢?如果能,那么它对降低机电一体化产品或自动化装置的成本是极为有利的。这样的方法也可以应用到自动化控制的生产线上,用来降低自动化控制生产线的设备成本。那么,怎样才能使从市场上选来的新一代的单片机芯片最终具备梯形图逻辑控制功能呢?我们知道要具备梯形图逻辑控制功能就必须能执行PLC指令和程序。但是,单片机芯片只能执行单片机指令和程序,不能直接执行PLC指令和程序。因此,问题的关键就变成要研究和设计出可以将PLC指令源程序翻译成单片机目标程序的翻译程序。基于STM32的PLC设计项目是面向中小型冶金、石油、化工、建材、机械制造、电力、汽车、轻工等企业,目的是降低投入的生产成本,提高生产效率和生产利润。可编程控制器的应用情况往往体现着一个国家的工业自动化水平,我国PLC国内市场虽然庞大,但是95以上的市场份额都被国外品牌占据,其中大中型PLC市场主要被欧美产品占据,小型PLC市场主要被日系品牌占据,其成本也是相当的昂贵,而国内厂商的市场份额几乎可以忽略。因此,大力发展拥有自主知识产权的PLC编程软件,逐步摆脱国内PLC市场被国外厂商和合资企业所垄断的局面,对于推动国内PLC市场的发展具有深远意义。1.3本设计的前景和特色 (1)首先,当从市场上选来新一代的单片机STM32芯片作为执行符合梯形图逻辑控制的逻辑控制器,那么从总体上来看,基于该单片机芯片的PLC编译程序的设计就和其他PLC的编译程序设计不同,没有一个现成的编译程序可以套用,必须做创造性的工作,独立完成基于该单片机的编译程序设计。编写基于该单片机的PLC编译程序,是本课题的主要工作任务之一。 (2)其次,目标程序框架结构也不同。因为单片机芯片不同,内部的硬件资源也就不同,目标指令代码和目标程序框架结构也就不同。因此在编译程序编写前,必须根据单片机芯片编程的特点设定目标程序框架结构。有许多影响目标程序框架结构的因素,诸如CPU初始化、通信程序编译、接口的初始化等。设定目标程序框架结构,是本课题的另一项主要工作任务。总之,基于单片机STM32的PLC编译程序设计研究是一项具有创造性的工作,需要充分吸取前人的经验,开拓创新,建立新的模型、新的结构、新的方法。2本实训的概要设计2.1硬件电路件电路框图设计如下图5所示: 图5 硬件电路框图设计硬件实物图如下所示:按键部分:开发板上有四个普通按键分别连在GPIOF0-3上以及一个复位键,方便使用。2.2软件的使用与程序的编写2.2.1上位机对梯形图的录入 上位机编程软件在PC机上实现,主要实现编程软件选择梯形图和指令表作为编程语言,并将其录入到相应软件中,以便下载到下位机中,对工程项目进行相应的控制。利用MFC创建用户界面,使其具有梯形图的录入和修改,助记符语言的录入和修改,并且能实现他们的互相转化的功能。并且能够实现通过串口向下位机下载。处理流程:用户首先要创建一个新的文件,选择是通过助记符语言或者是梯形图语言。如果是选择梯形图语言,在标题栏下方就会有一些符号的选择。当录入完成之后可以保存,并且能够实现两种语言的转换。流程图如下:创建新文件输入语言选择用户输入下位机PC读取用户输入一级代码二级代码保存到电脑语言转换梯形图录入:在编辑框的左边和右边分别有两个电源线,在两个电源线的中间进行梯形图元件的录入,包括原件的插入、删除、保存等操作。用户户在编辑区对各个梯形图元件进行属性的设置和改变。用户进行梯形图编辑的时候,各个梯形之间空出一行用来隔开。各个梯级主路之间空出一行用来隔开。各个梯级有ID号进行标识,ID号依次递增且唯一。每个梯级包含一个梯级主路,梯级主路带有一个左电源线,常开触点,常开线圈和右电源线,它们之间有很多的水平连线,用户在常开触电与常开线圈之间添加其他元件并联关系构成新的梯级,当然用户也可以将这个常开触点和常开线圈删除继而添加自己需要的元件。元件的编辑属性对话框中包含用户对元件名称,数据类型,变量范围,物理地址等属性的编辑。助记符的录入:可以实现一些助记符的录入,以文本的形式进行录入。指令包括LD,LDI,OR,ORI,OUT等。梯形图转化为一级代码:首先将梯形图界面划分成大小相同的网格,如下图所示,每个网格包含一个梯形图基本元件或者为空,每个网格信息保存在一个结构体对象中,结构体数组就构成了一级代码。一级代码是结构体数组的形式,由于网格中存在大量的“空”元件,这样一级代码中就包含很多零元素,如果以数组的形式保存在计算机中必然浪费很大的空间。同时考虑到串行化问题,先采用双向链表结构,链表中每一个节点是一个类对象,它存储一个梯形图元件的信息,这样节点中就不包含零元素,利用串行化方法将链表信息保存在计算机中,这样计算机可以节约很大的硬盘空间。当用户完成输入后进行下载时,双向链表先转为一级代码,然后经过解算过程,将一级代码转换为二级代码下载到下位机STM32中。解算:一级代码经过解算转化成二级代码才能下载到下位机STM32中,二进制代码指令用四个字节组成,前两个字节代表命令种类,后两个字节代表目标设备。2.2.2通信模块程序的编写上位机与下位机通信程序的编写上位机向下位机的数据发送:代码要向下位机通过串口发送,包括PC机的串口通信和STM32的串口通信部分。首先上位机向下位机发送一个命令ENQ(0x05H),当下位机准备好接受数据后,回复命令ACK。之后PC开始发送数据。在VC中,有以下几种方式可以实现串口的通信:方法一:使用VC+提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project - Add to Project - Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。方法二:在单线程中实现自定义的串口通信类。主要运用ReadFile()与WriteFile()API函数。方法三:多线程下实现串行通信。在很多工业控制系统中,常通过扩展串口连接多个外设,各外设发送数据的重复频率不同,要求后台实时无差错捕捉,采集,处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,以便在指定的事件发生时向相关的窗口发送通知消息。通信协议:通过RS232进行通信,波特率为9600bps。PC机与下位机通信协议如下:通信过程采用问答方式,主机询问,从机应答,一台主机可以同时询问多台从机,主机和从机的通信格式相同,如下表。字节序号说明内容备注1.报文起始位0x55开始标志2.0xAA3.地址Addr0xFF为广播地址4.命令Cmd5.数据长度高位6.低位7.数据区8.N校验位低位奇偶(CRC或和)校验 命令列表:序号命令类型码功能1.0x01读取X,Y,M,S,T,C,D的数据2.0x02向X,Y,M,S,T,C,D写数据3.0x07使能X,Y,M,S,T,C4.0x08失能X,Y,M,S,T,C5.0xEE错误应答0x01命令:读取目标设备内的数据命令请求格式:字节序号说明内容功能1设备代号选取设备X,Y,M,S,T,C,D2操作数高位3低位命令应答格式:字节序号说明内容功能1地址高位读取从这个地址开始的数据2低位3数据长度高位一共读取的字节数4低位5数据区60x02命令:向目标设备内写入数据命令请求格式:字节序号说明内容功能1设备代号选取设备X,Y,M,S,T,C,D2操作数高位向目标设备中写入的数据3低位命令应答格式:正确执行时无返回码,执行错误时返回错误码,详见0xEE错误应答格式。0x07命令:使能目标设备命令请求格式:字节序号说明内容功能1设备代号选取选取设备X,Y,M,S,T,C,D命令应答格式:正确执行时无返回码,执行错误时返回错误码,详见0xEE错误应答格式。0x07命令:失能目标设备命令请求格式:字节序号说明内容功能1设备代号选取选取设备X,Y,M,S,T,C,D命令应答格式:正确执行时无返回码,执行错误时返回错误码,详见0xEE错误应答格式。0xEE命令:失能目标设备字节序号说明内容功能1命令类型出错的命令类型2.2.3下位机梯形图解释器程序的编写用户开发的梯形图程序代码通过串行口被传送入单片机,这些代码对下位机而言只是普通的十六进制数,下位机要想通过这些代码了解用户的意图,并按照用户意图完成对被控制对象的控制,就必须有解释程序对这些程序代码进行解释。通过此程序,将上位机下载下来的梯形图程序转化成单片机识别的机器程序,从而按照控制要求,完成相应的控制动作。解释程序的按以下步骤实现:1定义变量,设置指令代码输入标志位,设置功能行输入标志位。2读第一行程序的行输入标志位,有输入程序则读行中每个字节的指令代码,置位相应代码的标志位,无输入则程序转至步骤5)。3根据指令代码标志位的组合判断本行程序的功能,置位这个功能行输入的标志位;清楚本行指令代码标志位。4根据功能行输入标志位调用实现其功能的子程序模块,实现这行的功能;清除行功能有输入标志位。5读下一行程序的行输入标志位,转入步骤2)循环执行,至所有行结束。梯形图解释按如下原则进行:1、 当PLC解释程序发现LD或者LDI取指令,将该指令之前的电路块解释的结果入栈保存在模拟堆栈中。2、 当发现AND、ANI或者OR、ORI指令,该指令将指令所带的操作元件的状态和当前的结果进行与、与非或者或、或非逻辑运算。3、 PLC解释程序解释完一个分支快后,结果发现指令ANB,说明这个分支块和其他的常开触点、常闭触点或者一个分支块串联,此时堆栈应该出栈,当前分支块的结果和出栈的值作逻辑与运算,将逻辑运算的结果保存堆栈的栈顶。4、 PLC解释程序解释完一个分支块后,如果发现指令ORB,说明这个分支块和其他的常开触点、常闭触点或者一个分支块并联,此时堆栈应该出栈,当前分支块的结果和出栈的值作逻辑或运算,将逻辑运算的结果页保存堆栈的栈顶。另外还可以看出堆栈出栈和入栈的次数相等,在解释到输出指令时,堆栈恢复到原来的位置。/母线逻辑堆栈unsigned short sys_logic_g20;unsigned short sys_logic_g_ptr;/主逻辑堆栈系统unsigned short sys_logic_main20;unsigned short sys_logic_main_ptr;/逻辑行计数器extern unsigned short sys_loc_cout;给FLASH中写入三条指令,进行解释:FLASH_Unlock();FLASH_ErasePage(0x0800C000);FLASH_ProgramWord(0x0800C000,0x00000001); /LD X0.0FLASH_ProgramWord(0x0800C004,0x00005013); /OUT Y0.0FLASH_ProgramWord(0x0800C008,0x0000001f); /END 系统主程序:void plc_main(void) system_setup(); /主无限循环程序 while(1) /输入更新 update_input(); /逻辑堆栈复位 logic_reset(); /用户程序执行 program_excute(); /输出更新 update_output();进行程序执行program_excute(); /输出更新梯形图的PLC指令解释过程如下:(logic_main_主逻辑系统堆栈,loc_cout_逻辑计数堆栈)1堆栈清零,loc_cout、logic_g和logic_main清零,第一条指令为LD,判断前置逻辑(loc_cout)是否完成,若没有完成,则将logic_main值压栈,启用新一行逻辑,给loc_cout置1,将母线逻辑和读取位进行逻辑“与”运算,将X0.0的状态保存在logic_main中,并置logic_main状态为1。2下一条指令,发现指令为OUT,如果logic_mian为ON(1/0来判断),则Y0.0的值为ON,否则为OFF.3最后一条指令为END,程序扫描周期结束,将输出映象区的ON/OFF状态输出,称为实际的输出,然后开始新一轮扫描周期。基本逻辑指令解释方法的实现PLC指令解释主要有指令分析程序和指令解释子程序,指令分析子程序通过对指令的中间代码进行分析,当分析到某种指令的指令代码时,解释程序跳转到对应的解释子程序。解释子程序得到指令的操作数并计算操作数对应元件在系统中的存储地址,完成规定的指令功能后再分析下一条PLC指令,如此周而复始。4AND指令发现指令为AND,将logic_mian堆栈里的值和exe_read_bit(X0.1)进行逻辑与运算,逻辑运算结果保存在logic_main中,并置logic_main为1。5OR指令发现指令为OR,将logic_mian堆栈里的值和exe_read_bit(X0.1)进行逻辑或运算,逻辑运算结果保存在logic_main中,并置logic_main为1。任务堆栈:任务堆栈是任务的重要的组成部分。所谓堆栈,就是在存储器中按数据“先进后出(LIFO)”的原则组织的连续存储空间。为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都应该配有自己的堆栈。所有系统任务的任务控制块中都含有一个指向该任务堆栈的指针。在PLC梯形图中,位元件即继电器对应的物理实体是存储单元中的某一位,称为位功能存储器。如果该位为1则表示对应的继电器线圈通电,其常开触点闭合,常闭触点断开。反之,如果该位为0,则表示对应的继电器线圈失电,将常开触点断开,常闭触点闭合。在解释梯形图指令时,CPU扫描用户程序的中间代码将各个元件的状态进行逻辑与、或、非等运算,运算结果ON或者OFF保存在元件对应的存储单元中。如果必须指出一个位元件所占用的存储单元,在FX2N系列PLC中,元件分为位元件和字元件,字元件用于数据的处理,在系统中占用两个字节的存储单元。模拟继电器的功能的位元件,可以分为以下几类:1、单线圈,单触点和当前值得位元件,如果是定时器和计数器。定时器在线圈通电后延迟一定的时间将触点闭合,因此定时器线圈和触点不能共用一个位存储单元。每一个定时器必须占用两个位和两个字节的存储单元来分别存放线圈、触点的状态和定时器当前值。计数器使用两个位存储单元保存线圈当前状态和上一个扫描周期的状态。计数器当前值需要有两个字节保存。所以每一个计数器也占用两个位和两个字节的存储单元。基本逻辑指令解释方法的实现PLC梯形图在上位机编程软件编制并转换为指令中间代码后,通过串口UART下载到本系统的指令存储区,指令中间代码的存放次序和梯形图指令的顺序保持一致。PLC指令解释主要有指令分析程序和指令解释子程序,指令分析子程序对指令的中间代码进行分析,当分析到某种指令的指令代码时,解释程序跳转到对应的解释子程序。解释子程序得到指令的操作数并计算操作数对应元件在系统中的存储地址,完成规定的指令功能后再分析下一条PLC指令,如此周而复始。2.2.4整体系统框架的搭建,以及LCD显示与按键程序的编写1、在STM32单片机中移植了C/OS-II操作系统。本控制器的软件部分是基于uC/OS-II实时操作系统内核编写的。常规的编程方法程序是顺序执行的方式,而采用了实时操作系统,程序是按任务进行划分的,编程人员可以根据任务重要性的不同,进行优先级高低的划分,提高了应用软件的实时性。而采用了嵌入式操作系统,更加利于程序模块化的编写、移植等等。uC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将uC/OS-II嵌人到开发的产品中。uC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。uC/OS-II 已经移植到了几乎所有知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 C/ OS 是一个完整的、可移植、固化、裁减的占先式实时多任务内核。C/ OS 包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列) 四大部分,没有文件系统、网络接口、输入输出界面。他的移植只与4 个文件相关:汇编文件(OS CPU A. ASM) 、处理器相关C 文件(OS CPU. H ,OS CPU C. C) 和配置文件(OSCFG. H)。有64 个优先级,系统占用8 个,用户可创建56 个任务,不支持时间片轮转。他的基本思路就是“近似地每时每刻总是让优先级最高的就绪任务处于运行状态”。任务的切换是通过模拟一次中断实现的。C/ OS 的工作的核心原理是近似地让最高优先级的就绪任务处于运行状态。所谓移植,就是使一个实时内核能在其他微处理器上运行,为了方便移植,大部分C/ OS 的代码是用C 语言编写的。由于C/ OS 在设计之初就已经充分考虑了可移植性,所以C/ OS 的移植相对来说比较容易。袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈

温馨提示

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

评论

0/150

提交评论