发明内容
有鉴于此,本申请的目的在于提供一种PLC的组态程序的调试方法及调试系统,能够对组态程序进行在线调试,而且测试人员能够监测调试的细节。
为实现上述目的,本申请提供如下技术方案:
一方面,本申请提供一种PLC的组态程序的调试方法,包括:
调试设备对目标代码进行编辑,在所述目标代码的每个代码行添加调试信息,所述调试信息至少包括行号、第一函数的标识和第二函数的标识;
所述调试设备对编辑后的目标代码进行编译,生成所述PLC能够运行的组态程序;
所述调试设备向PLC发送所述组态程序;
在调试模式下,所述PLC运行所述组态程序,并且所述PLC在运行所述组态程序中任意指令行之前,基于所述第一函数的标识调用第一函数,由所述第一函数基于所述调试设备发送的断点信息和/或单步调试信息确定当前的指令行是否为有效停止行,如果当前的指令行是有效停止行,则基于所述第二函数的标识调用第二函数,由所述第二函数控制运行所述组态程序的任务进入睡眠状态,以停止运行所述组态程序,直至接收到继续运行指令,运行当前的指令行,如果当前的指令行不是有效停止行,则运行当前的指令行;
所述调试设备获取所述PLC运行所述组态程序的运行数据,并进行显示;
其中,所述断点信息包含需暂停运行的指令行的行号,所述单步调试信息包含需要单步运行的指令行的行号。
可选的,所述调试设备获取所述PLC运行所述组态程序的运行数据,包括:
所述PLC在确定当前的指令行为有效停止行,且停止运行所述组态程序时,向所述调试设备发送所述当前指令行的行号。
可选的,所述调试设备获取所述PLC运行所述组态程序的运行数据,还包括:
所述调试设备向所述PLC发送全局变量获取请求,所述全局变量获取请求包括目标全局变量的指示信息,其中,所述调试设备在对所述编辑后的目标代码进行编译过程中配置各个全局变量的指示信息,所述全局变量的指示信息包括用于存储所述全局变量的存储区域的标识、所述全局变量在所述存储区域的偏移值、以及所述全局变量的长度;
所述PLC基于所述目标全局变量的指示信息获取所述目标全局变量的值,并向所述调试设备发送所述目标全局变量的值。
可选的,所述调试信息还包括第三函数的标识;
所述调试方法还包括:在调试模式下,所述PLC在运行所述组态程序中函数的第一行时,基于所述第三函数的标识调用第三函数,由所述第三函数获得当前的堆栈地址。
可选的,所述调试设备获取所述PLC运行所述组态程序的运行数据,还包括:
所述调试设备向所述PLC发送局部变量获取请求,所述局部变量获取请求包括目标局部变量的指示信息,其中,所述局部变量的指示信息包括局部变量的偏移值、以及所述局部变量的长度;
所述PLC基于所述堆栈地址、以及目标局部变量的指示信息,获取所述目标局部变量的值,并向所述调试设备发送所述目标局部变量的值。
可选的,所述断点信息包括:
所述调试设备在启动调试前向所述PLC发送的断点信息;
和/或,所述调试设备在调试过程中,响应输入操作,向所述PLC发送的断点信息。
可选的,所述单步调试信息包括:
所述调试设备在启动调试前向所述PLC发送的单步调试信息;
和/或,所述调试设备在调试过程中,响应输入操作,向所述PLC发送的单步调试信息。
另一方面,本申请提供一种PLC的组态程序的调试系统,包括:调试设备和PLC;
所述调试设备用于:对目标代码进行编辑,在所述目标代码的每个代码行添加调试信息,所述调试信息至少包括行号、第一函数的标识和第二函数的标识;对编辑后的目标代码进行编译,生成所述PLC能够运行的组态程序;向PLC发送所述组态程序;获取所述PLC运行所述组态程序的运行数据,并进行显示;
所述PLC用于:在调试模式下,运行所述组态程序,并且所述PLC在运行所述组态程序中任意指令行之前,基于所述第一函数的标识调用第一函数,由所述第一函数基于所述调试设备发送的断点信息和/或单步调试信息确定当前的指令行是否为有效停止行,如果当前的指令行是有效停止行,则基于所述第二函数的标识调用第二函数,由所述第二函数控制运行所述组态程序的任务进入睡眠状态,以停止运行所述组态程序,直至接收到继续运行指令,运行当前的指令行,如果当前的指令行不是有效停止行,则运行当前的指令行;
其中,所述断点信息包含需暂停运行的指令行的行号,所述单步调试信息包含需要单步运行的指令行的行号。
可选的,所述调试信息还包括第三函数的标识;
所述PLC还用于:在运行所述组态程序中函数的第一行时,基于所述第三函数的标识调用第三函数,由所述第三函数获得当前的堆栈地址。
可选的,所述调试设备获取所述PLC运行所述组态程序的运行数据,包括:
所述PLC在确定当前的指令行为有效停止行,且停止运行所述组态程序时,向所述调试设备发送所述当前指令行的行号;
和/或,所述调试设备向所述PLC发送全局变量获取请求,所述全局变量获取请求包括目标全局变量的指示信息,其中,所述调试设备在对所述编辑后的目标代码进行编译过程中配置各个全局变量的指示信息,所述全局变量的指示信息包括用于存储所述全局变量的存储区域的标识、所述全局变量在所述存储区域的偏移值、以及所述全局变量的长度;所述PLC基于所述目标全局变量的指示信息获取所述目标全局变量的值,并向所述调试设备发送所述目标全局变量的值;
和/或,所述调试设备向所述PLC发送局部变量获取请求,所述局部变量获取请求包括目标局部变量的指示信息,其中,所述局部变量的指示信息包括局部变量的偏移值、以及所述局部变量的长度;所述PLC基于所述堆栈地址、以及目标局部变量的指示信息,获取所述目标局部变量的值,并向所述调试设备发送所述目标局部变量的值。
由此可见,本申请的有益效果为:
本申请公开的PLC的组态程序的调试方法,调试设备在对目标代码进行编辑的过程中,针对每个代码行添加调试信息,将编辑后的目标代码编译为PLC能够运行的组态程序,并将该组态程序发送至PLC;在调试模式下,PLC在运行组态程序的每一个指令行之前,基于调试信息调用第一函数,由第一函数基于调试设备发送的断点信息和/或单步调试信息确定当前的指令行是否为有效停止行,如果当前的指令行不是有效停止行,则运行当前的指令行,如果当前的指令行是有效停止行,基于调试信息调用第二函数,由第二函数控制运行组态程序的任务进入睡眠状态,以停止运行组态程序,直至接收到继续运行指令;调试设备获取PLC运行组态程序的运行数据并进行显示。
基于本申请公开的PLC的组态程序的调试方法,能够对PLC的组态程序进行在线调试,PLC在确定当前指令行是有效停止行,且停止运行组态程序后,调试设备可以获取PLC运行组态程序的运行数据,并显示获取到的运行数据,基于此,测试人员通过输入断点信息和/或单步调试信息,就可以获知组态程序调试过程的细节。
具体实施方式
本申请公开一种PLC的组态程序的调试方法及调试系统,能够对组态程序进行在线调试,而且通过设置断点和单步调试,使得测试人员能够监测调试的细节。
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
参见图1,图1为本申请公开的一种PLC的组态程序的调试方法的流程图。该调试方法包括:
步骤S11:调试设备对目标代码进行编辑,在目标代码的每个代码行添加调试信息。其中,调试信息至少包括行号、第一函数的标识和第二函数的标识。
需要说明的是,目标代码是指待调试的组态程序的原始代码。
步骤S12:调试设备对编辑后的目标代码进行编译,生成PLC能够运行的组态程序。
步骤S13:调试设备向PLC发送组态程序。
步骤S14:在调试模式下,PLC运行组态程序,并且PLC在运行组态程序中任意指令行之前,基于第一函数的标识调用第一函数,由第一函数基于调试设备发送的断点信息和/或单步调试信息确定当前的指令行是否为有效停止行;如果当前的指令行是有效停止行,则基于第二函数的标识调用第二函数,由第二函数控制运行组态程序的任务进入睡眠状态,以停止运行组态程序,直至接收到继续运行指令,运行当前的指令行;如果当前的指令行不是有效停止行,则运行当前的指令行。
其中,断点信息包含需暂停运行的指令行的行号,单步调试信息包含需要单步运行的指令行的行号。
可以理解的是,PLC运行至某指令行时,停止运行该指令行,在接收到继续运行指令时,再运行该指令行,就实现单步调试。因此,需要单步运行的指令行也是需要暂停运行的指令行。
在调试模式下,PLC在运行组态程序的每一个指令行之前,都要判断当前的指令行是否是有效停止行。具体的,PLC基于第一函数的标识调用第一函数,第一函数比较当前指令行的行号与断点信息和单步调试信息包含的行号,如果当前指令行的行号与断点信息和单步调试信息包含的任意一个行号相同,那么确定当前指令行为有效停止行,如果当前指令行的行号与断点信息和单步调试信息包含的行号均不同,那么确定当前指令行不是有效停止行,PLC运行当前的指令行。
在确定当前指令行是有效停止行后,PLC基于第二函数的标识调用第二函数,第二函数的作用是控制运行组态程序的任务进入睡眠状态,当运行组态程序的任务进入睡眠状态后,停止运行组态程序,之后当接收到调试设备发送的继续运行指令(GO指令)时,运行组态程序的任务被唤醒,运行当前的指令行。
这里对PLC中的断点信息和单步调试信息进行说明。
PLC存储的断点信息包括:
调试设备在启动调试前向PLC发送的断点信息;和/或,调试设备在调试过程中,响应输入操作,向PLC发送的断点信息。
也就是说,测试人员可以在启动调试前,向调试设备输入断点信息,由调试设备将断点信息向PLC发送,由PLC将断点信息存储至本地的存储区域。在调试过程中,测试人员也可以向调试设备输入断点信息,由调试设备将断点信息向PLC发送,由PLC将断点信息存储至本地的存储区域。
PLC存储的单步调试信息包括:
调试设备在启动调试前向PLC发送的单步调试信息;和/或,调试设备在调试过程中,响应输入操作,向PLC发送的单步调试信息。
也就是说,测试人员可以在启动调试前,向调试设备输入单步调试信息,由调试设备将单步调试信息向PLC发送,由PLC将单步调试信息存储至本地的存储区域。在调试过程中,测试人员也可以向调试设备输入单步调试信息,由调试设备将单步调试信息向PLC发送,由PLC将单步调试信息存储至本地的存储区域。
实施中,调试设备显示人机交互界面,测试人员在人机交互界面执行输入操作,输入断点信息和/或单步调试信息。或者,测试人员通过其他输入设备执行输入操作,输入断点信息和/或单步调试信息。
步骤S15:调试设备获取PLC运行组态程序的运行数据,并进行显示。
需要说明的是,PLC在确定当前指令行为有效停止行,且停止运行组态程序后,调试设备可以获取PLC运行组态程序的运行数据,并显示获取到的运行数据。
可以理解的是,测试人员通过输入断点信息和单步调试信息,就可以获知组态程序调试过程的细节。
本申请公开的PLC的组态程序的调试方法,调试设备在对目标代码进行编辑的过程中,针对每个代码行添加调试信息,将编辑后的目标代码编译为PLC能够运行的组态程序,并将该组态程序发送至PLC;在调试模式下,PLC在运行组态程序的每一个指令行之前,基于调试信息调用第一函数,由第一函数基于调试设备发送的断点信息和/或单步调试信息确定当前的指令行是否为有效停止行,如果当前的指令行不是有效停止行,则运行当前的指令行,如果当前的指令行为有效停止行,基于调试信息调用第二函数,由第二函数控制运行组态程序的任务进入睡眠状态,以停止运行组态程序,直至接收到继续运行指令;调试设备获取PLC运行组态程序的运行数据并进行显示。
基于本申请公开的PLC的组态程序的调试方法,能够对PLC的组态程序进行在线调试,PLC在确定当前指令行为有效停止行,且停止运行组态程序后,调试设备可以获取PLC运行组态程序的运行数据,并显示获取到的运行数据,基于此,测试人员通过输入断点信息和/或单步调试信息,就可以获知组态程序调试过程的细节。
下面对上述实施例中调试设备获取PLC运行组态程序的运行数据的过程进行说明。
在一个实施例中,调试设备获取PLC运行组态程序的运行数据,包括:PLC在确定当前的指令行为有效停止行,且停止运行组态程序时,向调试设备发送当前指令行的行号。
也就是说,PLC在确定当前的指令行为有效停止行,且停止运行组态程序后,向调试设备发送当前指令行的行号,使得测试人员可以获知PLC当前运行到组态程序的哪个指令行。
在另一个实施例中,调试设备获取PLC运行组态程序的运行数据,还包括:
调试设备向PLC发送全局变量获取请求,该全局变量获取请求包括目标全局变量的指示信息;其中,调试设备在对编辑后的目标代码进行编译过程中配置各个全局变量的指示信息,任意一个全局变量的指示信息包括用于存储该全局变量的存储区域的标识、该全局变量在存储区域的偏移值、以及该全局变量的长度;
PLC基于目标全局变量的指示信息获取目标全局变量,并向调试设备发送目标全局变量。
需要说明的是,调试设备在对编辑后的目标代码进行编译的过程中,针对每个全局变量分别配置对应的指示信息,指示信息用于指示全局变量在数据区的具体存储区域。其中,每个全局变量的指示信息包括:用于存储该全局变量的存储区域的标识RefID、该全局变量在存储区域的偏移值Offset、以及该全局变量的长度Size。基于全局变量的指示信息可以确定该全局变量的在数据区的具体存储区域。
图2为全局变量的指示信息的结构。
调试设备向PLC发送的全局变量获取请求包括目标全局变量的指示信息。PLC基于该目标全局变量的指示信息,从本地的数据区读取目标全局变量的值,并向调试设备发送。调试设备显示接收到的目标全局变量的值,使得测试人员获知目标全局变量的值。
在另一个实施例中,调试信息还包括第三函数的标识。
相应的,在图1所示调试方法的基础上还包括:在调试模式下,PLC在运行组态程序中函数的第一行时,基于第三函数的标识调用第三函数,由第三函数获得当前的堆栈地址。也就是说,PLC在进入组态程序中的函数时,调用第三函数,由第三函数获得当前的堆栈地址。
需要说明的是,如果PLC进入的函数的层次为多层时,第三函数需要获取每一层的堆栈地址,并保存。如图3示出了针对多层函数保存的堆栈地址的示意图。
调试设备获取PLC运行组态程序的运行数据,还包括:
调试设备向PLC发送局部变量获取请求,局部变量获取请求包括目标局部变量的指示信息;其中,任意一个局部变量的指示信息包括该局部变量的偏移值、以及该局部变量的长度;
PLC基于堆栈地址、以及目标局部变量的指示信息,获取目标局部变量的值,并向调试设备发送目标局部变量的值。
需要说明的是,PLC在进入组态程序的函数后,会在当前任务栈上扩展栈空间,并在栈上存储局部变量的值,这意味着局部变量的地址是随机动态的。PLC在运行组态程序中函数的第一行时,通过第三函数获取当前的堆栈地址,之后,结合调试设备发送的目标局部变量的偏移值和目标局部变量的长度,就可以获取目标局部变量的值。由调试设备显示目标局部变量的值,使得测试人员获知目标局部变量的值。
在一种可能的实现方式中,局部变量的指示信息采用如图4所示的结构。
RefID指示变量为全局变量或局部变量,变量的类型识别结果用于指示后续的信息解析方法,设计方式为:RefID的高位字节指示变量是全局变量还是局部变量,识别出变量为栈上变量(局部变量)后,此时表明RefID的低两位字节无意义,同时也说明了在RefID之后的内存结构,由此可从RefID之后的内存中解析出TsakIndex和StackLayer,TaskIndex为任务索引,任务为操作系统调度的基本单位,函数的调用最终是以任务为单位组织起来执行,StackeLayer指示栈的层次,通过TaskIndex和StackeLayer查表就能得到每层函数的栈起始空间,结合偏移值Offset和长度Size就能得到栈上局部变量的值。
局部变量分为普通变量和指针变量,如果取栈上指针变量的值,需再嵌套一次结构,先得到栈地址,再从栈上得到局部变量指针的值,结合指针地址、Offset、Size,就能得到栈上指针变量的值。
其它复杂的类型,都可以通过嵌套结构,逐层指示解析,最终得到变量的值。
本申请上文公开了PLC的组态程序的调试方法,相应的,本申请还公开一种PLC的组态程序的调试系统,说明书中关于两者的描述可以相互参考。
请参见图5所示,本申请公开的调试系统包括调试设备100和PLC200。
调试设备100用于:对目标代码进行编辑,在目标代码的每个代码行添加调试信息,调试信息至少包括行号、第一函数的标识和第二函数的标识;对编辑后的目标代码进行编译,生成PLC200能够运行的组态程序;向PLC200发送组态程序;获取PLC200运行组态程序的运行数据,并进行显示。
PLC200用于:在调试模式下,运行调试设备100发送的组态程序,并且PLC200在运行组态程序中任意指令行之前,基于第一函数的标识调用第一函数,由第一函数基于调试设备发送的断点信息和/或单步调试信息确定当前的指令行是否为有效停止行,如果当前的指令行是有效停止行,则基于第二函数的标识调用第二函数,由第二函数控制运行组态程序的任务进入睡眠状态,以停止运行组态程序,直至接收到继续运行指令,运行当前的指令行,如果当前的指令行不是有效停止行,则运行当前的指令行。
其中,断点信息包含需暂停运行的指令行的行号,单步调试信息包含需要单步运行的指令行的行号。
在另一个实施例中,调试信息还包括第三函数的标识。PLC200还用于:在运行组态程序中函数的第一行时,基于第三函数的标识调用第三函数,由第三函数获得当前的堆栈地址。
在另一个实施例中,调试设备100获取PLC200运行组态程序的运行数据,包括:
PLC200在确定当前的指令行为有效停止行,且停止运行组态程序时,向调试设备100发送当前指令行的行号;
和/或,调试设备100向PLC200发送全局变量获取请求,全局变量获取请求包括目标全局变量的指示信息,其中,调试设备100在对编辑后的目标代码进行编译过程中配置各个全局变量的指示信息,全局变量的指示信息包括用于存储全局变量的存储区域的标识、全局变量在存储区域的偏移值、以及全局变量的长度;PLC200基于目标全局变量的指示信息获取目标全局变量的值,并向调试设备100发送目标全局变量的值;
和/或,调试设备100向PLC200发送局部变量获取请求,局部变量获取请求包括目标局部变量的指示信息,其中,局部变量的指示信息包括局部变量的偏移值、以及局部变量的长度;PLC200基于堆栈地址、以及目标局部变量的指示信息,获取目标局部变量的值,并向调试设备100发送目标局部变量的值。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。