发明内容
本发明针对现有技术存在的上述不足,提供了一种基于AMBA总线的PLC程序调度器IP核。本发明通过以下技术方案实现:
一种基于AMBA总线的PLC程序调度器IP核,通过AMBA总线连接控制器、执行器;
基于AMBA总线的PLC程序调度器IP核包括:
AHB接口模块,连接AMBA总线,AHB接口模块包括多个寄存器,控制器通过AMBA总线对寄存器配置任务信息、监控任务状态,任务信息包括程序段段号和数据段段号,基于AMBA总线的PLC程序调度器IP核将程序段段号提供给执行器以执行相应的任务,任务执行状态和新任务触发的剩余周期或时间;
循环任务调度模块,连接AHB接口模块,用以调度循环任务;
定时任务调度模块,连接AHB接口模块以及循环任务调度模块,用以调度定时任务以及挂起循环任务调度模块;
中断任务调度模块,连接AHB接口模块、循环任务调度模块以及定时任务调度模块,用以调度中断任务、挂起循环任务调度模块以及挂起定时任务调度模块。
较佳的,循环任务的任务信息还包括:执行周期、执行状态、剩余空循次数;
执行周期表示在多少次循环内执行一次循环任务,任务状态包括等待、就绪、运行、已运行、停止,剩余空循次数表示还需要多少次空闲循环才会启动一次循环任务。
较佳的,在前一循环任务完成时,循环任务调度模块根据程序段号和剩余空循次数选择下一循环任务并启动执行,直至被定时任务调度模块或中断任务调度模块挂起,并在挂起撤消后继续运行。
较佳的,定时任务的任务信息还包括:定时时间、任务状态、剩余时间;
以一个定时周期的整数倍为定时时间,每过定时时间执行一次定时任务,剩余时间表示定时任务还需要多少个定时周期才会运行,在执行过程中,若有中断任务或者更高优先级的定时任务,则挂起当前定时任务,在执行完中断任务或更高优先级的中断任务后再执行之前挂起的定时任务。
较佳的,在每一定时任务的定时周期到达时,根据定时任务的优先级和剩余时间触发新定时任务的选择和执行。
较佳的,中断任务的任务信息还包括:中断源、执行状态、中断优先级;
根据中断源选择对应的中断任务,在执行过程中,若有更高优先级的中断任务,则挂起当前中断任务,在执行完更高优先级的中断任务后再执行之前挂起的中断任务。
本发明实现PLC任务的自动快速切换调度,从而大幅度提高PLC的处理性能。解放MCU工作负担,避免了依靠MCU处理而带来的性能影响和硬件相关等缺点,接口开放易移植。基于本发明,配合用硬件方式实现的IL语言程序执行模块,可以实现高速任务调度、程序执行、接口开放的SoC芯片,并基于此可以实现高性能的可编程控制器。
具体实施方式
以下将结合本发明的附图,对本发明实施例中的技术方案进行清楚、完整的描述和讨论,显然,这里所描述的仅仅是本发明的一部分实例,并不是全部的实例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明的保护范围。
为了便于对本发明实施例的理解,下面将结合附图以具体实施例为例作进一步的解释说明,且各个实施例不构成对本发明实施例的限定。
如图1所示,本发明提供的一种基于AMBA总线的PLC程序调度器IP核(以下简称IP核),通过AHB接口挂接在AMBA总线系统上,提供控制和状态寄存器作为操作接口。AMBA总线系统上的MCU或其他主设备对该IP核的控制寄存器进行配置;调度器IP在获取到各任务信息和控制信号后自动调度选择正确的任务并启动该任务的执行;每一个任务有对应的程序段和数据段,IP核通过向任务执行器模块提供任务的程序段段号来启动任务的执行。
该IP主要包含以下几个部分模块:
循环任务调度模块。循环任务调度模块用于调度任务(PLC程序)中的循环任务(或称循检任务)。每一个循环任务有独立的执行周期、执行状态、剩余空循次数。在前一循环任务完成时,循环任务调度模块根据任务排序和各任务剩余空循次数选择下一任务并启动执行。循环任务调度模块持续进行以上轮循选择触发,直至被定时任务调度模块或中断任务调度模块打断挂起,在挂起请求撤消后继续运行。
定时任务调度模块。定时任务调度模块用于调度PLC程序中的定时任务(或称定时事件触发任务),每一个定时任务有独立的定时时间、执行状态和剩余时间。在定时器被触发时,定时任务调度模块根据任务排序和定时时间判断选择下一任务并启动执行。定时任务调度模块在每个定时点顺序判断并启动执行定时任务,直至被中断任务调度模块打断挂起,在挂起请求撤消后继续运行。
中断任务调度模块。中断任务调度模块用于调度PLC程序中定义的中断任务(或称中断事件触发任务),每一个任务有独立的中断源、中断优先级、执行状态。在中断源被触发时,中断任务调度模块根据中断源选择对应的中断任务启动执行。
AHB接口模块。AHB接口模块用于提供IP核挂接到AMBA总线的操作接口,包括AHB主接口和AHB从接口。AHB从接口模块用以支持总线上其它主设备(如MCU)对本IP核寄存器的配置和读取,AHB主接口用于操作AMBA总线上的执行器模块(如启动任务的执行)。AHB接口模块中包含多个控制和状态寄存器,同时提供中断信号输入和输出。
如图2所示,循环任务调度模块中包含一个循环任务属性列表,该列表可以以寄存器组的方式或以RAM块的方式提供,为一组同样格式反映任务属性和状态的数据,供循环任务调度使用。
每个循环任务的属性状态至少包含以下内容:该任务的程序段段号、数据段段号、执行周期、任务状态、剩余空循次数。
程序段段号、数据段段号、执行周期:在PLC程序编译下载时,编译器会将任务和功能块等程序模块分为程序段和数据段,并为每一个任务分配唯一的程序段段号和数据段段号;循环任务在组态时也定义了该任务的执行周期,即在多少次循环内执行一次。程序段段号、数据段段号、执行周期在IP核初始化时由MCU填入列表,在列表中是不变的。
任务状态:任务状态包括等待、就绪、运行、已运行、停止等五种状态。等待状态表示该任务还未完成准备;就绪状态表示已完成准备,但是需要其它正在运行的任务完成;运行状态表示本任务正在运行;已运行状态表示在本次循环中,本任务已完成运行;停止状态表示本任务已被停止,在此后循环中都不会再运行。
剩余空循次数:剩余空循次数表示任务还需要多少次空闲循环才会启动一次执行。
循环任务调度模块持续运行,在一个任务执行结束后立刻进行新任务的选择和启动。其具体工作流程如图3所示:
1)初始化:第一个循环开始前,分别将各循环任务的循环周期加载到其剩余空循次数;
2)循环开始,各任务状态为“等待”,任务调度模块将各个任务的剩余空循次数减1,剩余空循次数=0的任务,状态切换为“就绪”,更新到列表中对应位置。
3)循环任务调度模块顺序查找“就绪”任务;
4)若没有查找到“就绪”任务,则从2)开始新的循环;否则,启动该任务的执行(具体启动方式本发明不作规定),任务状态切换为“执行”;
5)等待任务执行结束(接收到任务执行结束中断信号),任务结束后该任务状态切换为“已执行”,并将该任务的循环周期加载到其剩余空循次数;
继续3)~5)步骤。
定时任务调度模块也包含一个定时任务属性列表,该列表中每个定时任务的属性状态至少包含以下内容:该任务的程序段段号、数据段段号、定时时间、任务状态、剩余时间。
程序段段号、数据段段号、定时时间在IP核初始化时由MCU填入列表,在列表中是不变的。在本发明中,定时任务均以一个标准时间(定时周期)的整数倍为任务定时时间,每过定时时间执行一次该任务。因此,定时任务属性中剩余时间表示任务还需要多少个定时周期才会运行。
定时任务调度模块需要一个定时器支持,在每一个定时周期到达时,触发新任务的选择和启动。其具体工作流程如图4所示:
1)初始化:在运行开始前,分别将各定时任务的定时时间(以定时周期的倍数为计数单位)加载到其剩余时间,各任务状态为“等待”;定时器开始工作;
2)当触发一次定时器中断时,各个任务的剩余时间同时减1;剩余时间=0的任务,状态切换为“就绪”;
3)定时任务调度模块顺序查找“就绪”任务;因在定时任务调度模块内所有的就绪任务是顺序执行的,因此在组态的时候可将优先级高的定时任务排在列表的前面。
4)若没有查找到“就绪”任务,则本次定时执行结束;否则,启动该任务的执行,任务状态切换为“执行”;
5)等待任务执行结束,任务结束后该任务状态切换为“已执行”,将该任务的定时时间重新加载到其剩余时间,该任务状态切换为“等待”;
继续3)~5)步骤。
中断任务调度模块也包含一个中断任务属性列表,该列表中每个中断任务的属性状态至少包含以下内容:该任务的程序段段号、数据段段号、中断源、中断优先级。
中断任务调度模块由一组中断信号触发,该组中断信号可表示不同的中断源。触发中断后,从属性列表中选择对应中断源的中断任务,启动该任务的执行。当在执行过程中,如果有新的更高优先级的中断触发,则挂起当前的中断任务,立即执行新的中断任务。直到新的中断任务执行完毕再继续执行原来被挂起的中断任务。
定时任务调度模块可以打断挂起循环任务的执行,中断任务调度模块可以打断定时任务和循环任务的执行,同时定时任务调度模块内高优先级的定时任务也可以打断挂起低优先级定时任务的执行,中断任务调度模块内高优先级的中断任务也可以打断挂起低优先级中断任务的执行。即,循环任务调度模块可以被定时任务调度模块和中断任务调度模块打断挂起,定时任务调度模块可以被中断任务调度模块打断挂起。挂起后原循环任务或定时任务暂停执行,在对应的定时或中断任务结束后恢复原挂起模块的工作,并恢复原任务的执行。
已触发的定时任务调度模块可以被更高优先级的定时任务触发,实现定时任务的嵌套。
已触发的中断任务调度模块可以被更高优先级的中断源触发,实现中断任务的嵌套。
基于本发明的一则实施例,循环任务属性列表以32位寄存器组的方式提供,寄存器组包含的成员个数决定了本实施例支持的循环任务的个数。格式如表1所示:
表1
CTn_CR为循环任务控制寄存器组,包括程序段段号、数据段段号和循环周期,为只写寄存器。在初始化时,由MCU根据组态程序完成填写,填写后数据不变。
CTn_SR为循环任务状态寄存器组,包括任务运行状态和剩余空循次数,为只读寄存器。由IP核内部进行控制,在IP核工作后,随着任务运行寄存器数据不停的变化,可由MCU读取查看。
在本实施例中,定时任务属性列表也以此类型的寄存器组(只写的TTn_CR和只读的TTn_SR)方式提供。中断任务属性列表以只读的寄存器组(ITn_CR)提供,实现中断源和中断程序的关系链接的功能。
上述实施例举例了指令格式和寄存器的定义。在本发明框架下,指令格式和寄存器格式是可以自由调整的,这些调整和细化均应视为本发明的保护范围。
当没有记时器或中断任务即将运行的时候,将执行循环任务。任务属性栏指定的优先级将被解释为循环交替。比如优先权=3时,每3个循环执行一次任务。在多循环任务中,OpenPCS没有定义特殊的执行次序。
在任务属性中指定一个N,定时器任务将每隔N毫秒被执行。
例如表2所示的任务列表,其调度流程如图5所示。
任务 |
时间 |
优先级(循环次数) |
Zyk11 |
执行40ms |
1 |
Zyk12 |
执行20ms |
10 |
Timer1 |
每10ms定时;执行2ms |
1 |
Timer2 |
每50ms;执行2ms |
2 |
表2
本发明中,以硬件方式设计PLC任务调度模块,任务调度模块作为一个主设备挂接在AMBA总线上,MCU或其他控制主模块只需对任务调度模块进行寄存器的配置和触发,该模块就可以在不需要MCU参与的情况下自动分析调度PLC任务以及启动执行。
因此,本发明很大的提高了PLC任务执行和响应的实时性和可靠性,使得PLC任务的执行和响应不受限于MCU。同时也释放了MCU大量的工作,减轻了MCU的负担。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。