首页 / 专利库 / 电脑零配件 / 计算机系统 / 软件 / 系统软件 / 具有调试能力的可编程序控制器

具有调试能的可编程序控制器

阅读:978发布:2022-12-08

专利汇可以提供具有调试能的可编程序控制器专利检索,专利查询,专利分析的服务。并且一种程序 控制器 通过模拟状态图并执行一个应用程序来控制一个机器或工业生产过程,该应用程序具有多个语句字组,每一个字组对应于在该机器或工业生产过程的操作中的一个步骤,每一个状态图由一个程序循环来代表。每一个循环在任何一个时刻只有一个状态是活动的并且具有诸如象指示字这样的一些变量,在每一个变量中存放有一个活动字组的地址,在一个字组中的一种状态的转变条件满足时,就达到了一个决定点,这个状态被失活而另一个状态则以一种具有跟着会发生要求的机器或工业生产过程的操作的所希望的序列被激活。,下面是具有调试能的可编程序控制器专利的具体信息内容。

1、一种用于模拟一个或多个状态图并且用于控制至少一个机器或者工业生产过程的操作状态的程序控制器,包括:
a.用于执行一种应用程序的器件,该应用程序包括多个语句字组,每一个所说的语句字组(字)对应于所说的机器或者工业生产过程的一种操作状态,并且至少某些所说的语句字组包括一个或多个复合语句,它确定要执行的下一个所说的字组,以及在相对应的操作状态期间该机器或工业生产过程要采取的一种操作动作,至少某些所说的字组确定一种与其它字组要采取的不相同的操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的字组;
b.用于允许至少一个所说的程序循环对执行过程成为活动循环的允许器件,以及用于只允许所说的字组中的一个字组在所说的至少一个活动程序循环中的任何一个时刻对执行过程成为活动字组的器件;以及
c.该执行器件包括用于执行所说的在每一个所说活动程序循环内的每一个所说活动字组中的复合语句的器件,用于控制所说字组的执行顺序并用于控制所说的该机器或工业生产过程的操作动作。
2、按照权利要求1所述的控制器,其中该允许器件包括一个与所说的至少一个活动程序循环有关的用于存贮一个该活动字组开始的地址的变量,所说的变量具有一个指示包括该活动字组的活动程序循环的标识符。
3、按照权利要求1所述的控制器,其中该允许器件包括一个与所说的至少一个该活动程序有关的用于存贮一个该活动字组的标识符的变量,所说的变量具有一个指示包括该活动字组的活动程序循环的标识符。
4、按照权利要求2或3所述的控制器,其进一步包括用于存贮与所说的至少一个活动程序循环有关的每一个所说的变量的器件,该器件是用于便利多个所说的至少一个活动程序循环完成多任务并且用于控制所说的至少一个活动程序循环的执行顺序。
5、按照权利要求1所述的控制器,其进一步包括用于记录指示出所说的活动语句字组和所说的至少一个程序循环的执行顺序的信息的器件。
6、按照权利要求5所述的控制器,其中该控制器包括用于指示一个对选择下一个要执行的字组起作用的条件的器件,并且其中所说的记录信息的器件包括用于存贮一个或多个所说的条件以及在该相对应的操作状态期间所说的要采取的操作的器件。
7、按照权利要求5或6所述的控制器,其进一步包括用于显示被记录的关于所说的活动字组和所说的至少一个活动程序循环的信息的器件。
8、一种用于模拟一个或多个状态图并且用于控制至少一个机器或者工业生产过程的操作状态的程序控制器的使用方法,该方法包括下述步骤:
a  执行一种包括多个语句字组的应用程序的步骤,每一个所说的语句字组(或多个字组)对应于所说的机器或者工业生产过程的一种操作状态,并且至少某些所说的字组包括一个或多个复合语句,它确定要执行的下一个所说字组,以及在相对应的操作状态期间该机器或工业生产过程要采取的一种操作动作,至少某些所说的字组确定一个与其它字组要采取的不相同的操作动作,该应用程序由包括至少一个所说的字组的一个程序循环来代表每一个所说的一个或多个状态图;
b.允许至少一个所说的程序循环对执行过程成为活动的循环,并且只允许所说的字组中的一个字组在所说的至少一个活动程序循环中的任何一个时刻对执行过程成为活动字组的步骤;以及
c.该执行步骤用于执行每一个在每一个所说的活动程序循环内的所说活动字组,用于控制所说字组的执行顺序并由此而控制所说的该机器或工业生产过程的操作动作。
9、按照权利要求8所述的方法,其中该允许步骤包括把所说活动字组的标识符存入一个与所说的至少一个活动程序循环有关的变量中以及存贮包括该活动字组的所说的至少一个活动程序循环的标识符的步骤。
10、按照权利要求8所述的方法,其中该允许步骤包括把所说活动字组开始的地址存入一个与所说的至少一个活动程序循环有关的变量中以及存贮所说的包括该活动字组的至少一个活动程序循环的标识符的步骤。
11、按照权利要求9或10所述的方法,其进一步包括存贮与所说的至少一个活动程序循环有关的每一个所说的变量的步骤,以便利多个所说的至少一个活动程序循环完成多任务并且控制所说的至少一个活动程序循环的执行顺序。
12、按照权利要求8所述的方法,其进一步包括记录指示所说的活动字组和所说的至少一个活动程序循环执行顺序的信息的步骤。
13、按照权利要求12所述的方法,其中该方法包括指示一个对选择下一个要执行的字组起作用的条件的步骤,并且其中所说的记录信息的步骤包括记录一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的步骤。
14、按照权利要求12或13所述的方法,其进一步包括显示被记录的有关所说的字组和所说的至少一个活动程序循环的信息的步骤。
15、一种用于模仿一个或多个状态图并且用于控制至少一个机器或工业生产过程的操作状态的程序控制器,包括:
a.用于执行一种包括多个语句字组的应用程序的器件,每一个所说的语句字组(字块)对应于所说的机器或工业生产过程的一种操作状态,并且至少某些所说的语句字组包括一个或多个复合语句,它确定要执行的下一个所说的字组,以及在相对应的操作状态期间该机器或工业生产过程要采取的一种操作动作,至少某些字组确定一种与其它字组要采取的不相同的操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的语句字组;
b.用于允许至少一个所说的程序循环对执行过程成为活动循环的器件,以及用于只允许所说的语句字组中的一个字组在所说的活动程序循环中的任何一个时刻对执行过程成为活动字组的器件;
c.该允许器件包括用于指示所说的至少一个活动程序循环的器件,所说的指示器件包括用于存贮该活动字组的标识符的器件以及用于存贮一个指示包括该活动字组的程序循环的标识符的器件;
d.用于存贮每一个所说的指示器件的器件,用于便利多个所说的至少一个程序循环执行多任务并且用于控制所说的至少一个有效程序循环的执行顺序列;
e.该执行器件包括用于执行所说的复合语句的器件,该复合语句是在每一个所说的活动程序循环里的每一个所说的活动字组中,该执行器件是用来控制所说字组的执行顺序列并用于按照该机器或工业生产过程的操作状态来控制所说的操作动作。
16、按照权利要求15所述的控制器,其中所说的与所说至少一个活动程序循环有关的指示器件包括用于存贮一个该活动字组起始地址的器件以及用于存贮一个指示包括该活动程序状态的至少一个活动程序循环的标识符的器件。
17、按照权利要求15所述的控制器进一步包括用于记录指示出所说活动字组和所说至少一个活动程序循环的执行顺序的信息的器件。
18、按照权利要求17所述的控制器,其中该控制器包括用于指示一个对选择下一个要执行的字组有决定作用的条件的器件,并且其中所说的记录信息的器件包括用于存贮一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的器件。
19、按照权利要求5或6所述的控制器进一步包括用于显示被记录的有关所说的活动字组和所说的至少一个活动程序循环的信息的器件。
20、按照权利要求16所述的控制器进一步包括用于记录指示出所说活动语句字组和所说至少一个程序循环的执行顺序的信息的器件。
21、按照权利要求20所述的控制器,其中该控制器包括用于指示一个对选择下一个要执行的字组起决定作用的条件的器件,并且其中所说的记录信息的器件包括用于存贮一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的器件。
22、按照权利要求20或21所述的控制器进一步包括用于显示被记录的有关所说的活动字组和所说的至少一个活动程序循环的信息的器件
23、一种用于模拟一个或多个状态图并且用于控制至少一个机器或工业生产过程的操作状态的程序控制器的使用方法,该方法包括下述步骤:
a.执行一种包括多个语句字组的应用程序,每一个所说的语句字组(或多个字组)对应于所说的机器或者工业生产过程的一种操作状态,并且至少某些所说的字组包括一个或多个复合语句,它确定要执行的下一个所说的字组以及在该相对应的操作状态期间该机器或工业生产过程要采取的一种操作动作,至少某些所说的字组确定一个与其它字组要采取的不相同的操作动作,该应用程序由包括至少一个所说字组的一个程序循环来代表每一个所说的一个或多个状态图;
b.允许至少一个所说的程序循环对执行过程成为活动循环,并且只允许所说的字组中的一个字组,在所说的至少一个活动程序循环中的任何一个时刻对执行过程成为活动字组;
c.该允许步骤包括把该活动字组的标识符存入一个变量中的步骤,以及把一个指示包括该活动字组的该至少一个活动程序循环的标识符存入所说的变量中的步骤;
d.存贮与所说的至少一个活动程序循环有关的每一个所说的变量,以方便多个所说的至少一个活动程序循环执行多任务并且控制所说的至少一个活动程序循环的执行顺序;
e.执行所说的在每一个所说活动程序循环里的每一个所说活动字组中的复合语句,以便控制所说字组的执行顺序并控制所说的机器或工业生产过程中的操作动作。
24、按照权利要求23所述的方法,其中把信息存入一个变量中的步骤包括存贮一个该活动字组的起始地址以及存贮一个指示包括该活动字组的至少一个活动程序循环的标识符。
25、按照权利要求23所述方法进一步包括记录指示所说活动语句字组和所说至少一个活动程序循环的执行顺序的信息的步骤。
26、按照权利要求25所述的方法,其中该方法包括指示一个对选择下一个要执行的字组起决定作用的条件的步骤,并且其中所说记录信息步骤包括记录一个或多个所说的条件以及所说的在该相应的操作状态期间要采取的操作动作的步骤。
27、按照权利要求25或26所述的方法进一步包括显示被记录的有关所说字组和所说至少一个活动程序循环的信息的步骤。
28、按照权利要求24所述方法进一步包括记录指示所说的活动语句字组和所说至少一个活动程序循环的执行顺序的信息的步骤。
29、按照权利要求28所述的方法,其中该方法包括指示一个决定着下一个要执行的字组的选择条件的步骤,并且其中所说记录信息的步骤包括记录一个或多个所说条件以及所说的在该相对应的操作状态期间要采取的操作动作的步骤。
30、按照权利要求28或29所述的方法进一步包括显示被记录的有关在所说字组和所说至少一个活动程序循环的信息的步骤。
31、一种模拟一个或多个状态图并且用于控制至少一个机器或工业生产过程的操作状态的程序控制器,包括用于执行一种应用程序的器件,该应用程序包括多个语句字组(多个字块),每一个所说的字组对应于一种所说的操作状态,至少某些所说的字组包括一个或多个复合语句,它确定要执行的下一个字组、以及在该相对应的操作状态期间该机器或工业生产过程要采取的一种操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的字组,并且该程序控制器包括有操作系统软件,该软件包括:
a.用于允许所说程序循环中的至少一个程序循环对执行过程成为活动循环的器件,以及用于只允许所说语句字组中的一个字组在所说活动程序循环中的任何一个时刻对执行过程成为活动字组的器件;
b  该允许器件包括用于指向所说的至少一个活动程序循环的器件,所说的指向器件包括用于存贮该活动字组标识符的器件以及用于存贮指示包括该活动字组的程序循环标识符的器件;
c  用于存贮每一个所说的指向器件的器件,它用于方便多个所说的至少一个程序循环执行多任务并控制所说的至少一个活动程序循环的执行顺序;
d.用于执行所说的在每一个所说活动程序循环里的每一个所说活动字组中的复合语句的器件,它用于控制所说字组的执行顺序并按照该机器或工业生产过程的操作状态来控制所说的操作动作。
32、按照权利要求31所述的控制器,其中所说的与所说至少一个活动程序循环相联系的指向器件包括用于存贮该活动字组起始地址的器件以及用于存贮指示包括该活动字组的至少一个活动程序循环的标识符的器件。
33、按照权利要求31或32所述的控制器进一步包括用于记录指示所说活动字组和所说至少一个活动程序循环的执行顺序的信息的器件。
34、按照权利要求33所述的控制器件进一步包括用于显示被记录的有关所说的活动字组和所说至少一个活动程序循环的信息的器件。
35、用于模拟一个或多个状态图并且用于控制至少一个机器或工业生产过程的操作状态的一种程序控制器的操作系统软件,包括用于执行一种应用程序的器件,该应用程序包括多个语句字组(字块)每一个所说的字组对应于一种所说的操作状态,并且至少某些所说的字组包括一个或多个复合语句,它确定要执行的下一个字组,以及在该相对应的操作状态期间该机器或工业生产过程要采取的一种操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的字组,并且该操作系统包括:
a.用于允许所说程序循环中的至少一个程序循环对执行过程成为活动循环的器件,以及用于只允许所说语句字组中的一个字组在所说活动程序循环中的任何一个时刻对执行过程成为活动字组的器件;
b.该允许器件包括用于指向所说的至少一个活动程序循环的器件,该指向器件包括用于存贮该活动字组标识符的器件以及用于存贮指示包括该活动字组的程序循环的标识符的器件;
c.用于存贮每一个所说的指向所说的至少一个程序循环的器件的器件,它是用于方便多个所说的至少一个程序循环执行多任务并用于控制所说的至少一个活动程序循环的执行顺序;
d.用于执行所说的在每一个所说活动程序循环里的每一个所说活动字组中的复合语句的器件,它是用来控制所说字组的执行顺序并按照该机器或工业生产过程的操作状态来控制所说的操作动作。
36、按照权利要求35所述的控制器件,其中所说的与所说至少一个活动程序循环有关的指向器件包括用于存贮该活动字组起始地址的器件以及用于存贮指示包括该活动程序状态的至少一个活动程序循环的标识符的器件。
37、按照权利要求35或36所述的控制器进一步包括用于记录指示所说活动字组和所说至少一个活动程序循环的执行顺序的信息的器件。
38、按照权利要求37所述的控制器进一步包括用于显示被记录的有关所说的字组和所说至少一个活动程序循环的信息的器件。
39、建立一种用于模拟一个或多个状态图并用于控制该至少一个机器或工业生产过程的操作状态的操作系统的方法,包括执行一种应用程序的步骤,该应用程序包括多个语句字组,每一个所说的字组对应于一种所说的操作状态,并且至少某些所说的字组包括一个或多个复合语句,它确定要执行的下一个所说的字组以及在该相对应的操作状态期间要采取的一种操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的字组,并且该方法包括下述步骤:
a.允许至少一个所说的程序循环对执行过程成为活动的,并且只允许所说字组中的一个字组在所说的至少一个活动程序循环中的任何一个时刻对执行过程成为活动的;
b.该允许步骤包括把该活动字组的标识符存入一个变量中的步骤骤以及存贮一个指示包括该活动字组的至少一个活动程序循环的标识符的步骤;
c.执行所说的在每一个所说活动程序循环里的每一个所说活动字组中的复合语句,以便控制所说字组的执行顺序并控制所说的该机器或工业生产过程的操作动作;
d.把每一个所说的与所说至少一个活动程序循环有关的变量存入一个存贮器,以方便多个所说至少一个活动程序循环执行多任务并控制所说至少一个活动程序循环的执行顺序。
40、按照权利要求39所述的方法,其中把信息存入一个变量中的步骤包括存贮该活动字组起始地址以及存贮指示包括该活动字组的至少一个活动程序循环的标识符
41、按照权利要求39或40所述的方法进一步包括记录指示所说活动语句字组和所说至少一个活动程序循环的执行顺序的信息的步骤。
42、按照权利要求40或41所述的方法进一步包括显示被记录的有关所说字组和所说至少一个活动程序循环的信息的步骤。
43、一种用于模拟一个或多个状态图并用于控制至少一个机器或工业生产过程的操作状态的程序控制器,包括:
a.用于执行一种应用程序的器件,该应用程序包括多个语句字组,每一个所说的语句字组(或多个字块)在执行时产生一种程序状态,而每一个所说的程序状态对应于所说的机器或工业生产过程的一种操作状态,并且至少某些字组包括一个或多个复合语句,它确定要执行的下一个所说的字组、以及在该相对应的操作状态期间该机器要采取的一种操作动作,至少某些所说的程序状态确定一种要采取的不同的操作动作;
b.用于允许至少一个所说的程序循环成为活动循环并且只允许所说字组中的一个字组在任何一个时刻在所说的活动程序循环中成为活动字组的器件;
c.该允许器件包括用于指向所说至少一个活动程序循环的器件,所说的指向器件包括用于存贮该活动字组的一个标识符的器件,并且每一个所说的指向器件具有一个指示包括该活动字组的该程序循环的标识符;以及
d.用于执行在每一个所说的活动程序循环里的每一个所说活动字组中的所说的复合语句的器件,它是用来控制所说字组的执行顺序并且用于按照该机器或工业生产过程的操作状态来控制所说的操作动作的。
44、按照权利要求43所述的控制器,其中所说的用于指向所说至少一个活动程序循环的器件包括用于存贮该活动字组起地址的器件以及用于存贮指示包括该活动字组的该程序循环的标识符的器件。
45、按照权利要求43或44所述的控制器进一步包括把每一个所说的用于指向所说至少一个活动程序循环的器件存入一个存贮器件的器件,以方便多个所说至少一个活动程序循环执行多任务并控制所说至少一个活动程序循环的执行顺序。
46、按照权利要求44或45所述的控制器进一步包括用于记录指示关于所说活动程序状态以及所说至少一个活动程序循环的执行顺序的信息的器件。
47、按照权利要求46所述的控制器,其中该控制器包括用于指示一个决定下一个要执行的程序状态的选择的条件的器件,并且其中所说的记录信息的器件包括用于存贮一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的器件。
48、按照权利要求46或47所述的控制器件进一步包括用于显示被记录的有关所说的活动程序状态以及所说至少一个活动程序循环的信息的器件。
49、一种模拟一个或多个状态图并用于控制至少一个机器或工业生产过程的操作状态的程序控制器的使用方法,该方法包括下述步骤:
a.执行一种包括多个语句字组的应用程序的步骤,每一个所说的字组在执行时是一个程序状态,而每一个所说的程序状态对应于所说机器或工业生产过程的一种操作状态,并且至少某些所说的字组包括一个或多个复合语句,它确定要执行的下一个所说的字组,以及在该相对应的操作状态期间该机器要采取的一种操作动作,至少某些所说的字组确定一种与其它字组要采取的不相同的操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少某些所说的字组;
b.允许至少一个所说程序循环成为活动的并且只允许所说字组中的一个字组在任何一个时刻在所说的至少一个活动程序循环中成为活动的步骤;
c.该允许的步骤包括把所说的活动字组的起始地址存入一个指示字以及用所说的指示字来存贮所说至少一个程序循环的标识符的步骤;
d.存贮每一个所说的与所说至少一个活动程序循环有关的指示字,以方便多个所说的至少一个活动程序循环执行多任务并控制所说的至少一个活动程序循环的执行顺序。
50、按照权利要求49所述的方法,其中把信息存入一个指示字中的步骤包括存贮一个该活动字组的起始地址以及存贮一个指示包括该活动字组的活动程序循环的标识符。
51、按照权利要求49或50所说的方法进一步包括把与所说的至少一个活动程序循环有关的该指示字存入一个存储器中的步骤,以方便多个所说至少一个活动程序循环执行多任务并控制所说的至少一个活动程序循环的执行顺序。
52、按照权利49或50所述的方法进一步包括记录指示所说活动字组和所说至少一个活动程序循环的执行顺序的信息的步骤。
53、按照权利要求52所述的方法,其中该控制器包括用于指示一个决定下一个要执行的字组的选择的条件的器件,其中所说的记录信息的步骤包括记录一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的步骤。
54、按照权利要求52或53所说的方法进一步包括显示被记录的有关所说的活动字组和所说至少一个活动程序循环的信息的步骤。
55、一种用于模拟一个或多个状态图并用于控制至少一个机器或工业生产过程的操作状态的程序控制器包括用于执行一种应用程序的器件,该应用程序包括多个语句字组(字块),每一个所说的字组在执行时是一种程序状态,而每一种所说的程序状态对应于一种所说的操作状态,并且至少某些字组包括一个或多个复合语句,它确定要执行的下一个所说的字组,以及在该相对应的操作状态期间该机器要采取的一种操作动作,至少某些所说的字组确定一种与其它字组要采取的不相同的操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的字组:
a.至少一个所说的程序循环是活动的并且在任何一个时刻在所说活动程序循环中只有唯一一个所说的程序状态是活动的;
b.一个与所说至少一个活动程序循环有关的用于存贮该活动程序状态起始地址的指示字,并且每一个所说的指示字具有一个指示包括该活动程序状态的至少一个所说活动程序循环的标识符;
c.用于执行在每一个所说的活动程序循环里的每一个所说活动字组中的所说的复合语句的器件,它是用来控制所说字组的执行顺序并用于控制所说的该机器或工业生产过程的操作动作。
56、按照权利要求54或55所述的控制器进一步包括用于把每一个所说的与所说至少一个活动程序循环有关的指示字存入一个存贮器的器件,以方便多个所说至少一个活动程序循环执行多任务并控制所说的至少一个活动程序循环的执行顺序。
57、按照权利要求55所述的控制器进一步包括用于记录指示出所说活动程序状态和所说至少一个活动程序循环的执行顺序的信息的器件。
58、按照权利要求57所述的器件,其中该控制器包括用于指示一个决定着下一个要执行的程序状态的选择的条件的器件,并且其中所说的记录信息的器件包括用于存贮一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的器件。
59、按照权利要求58所述的控制器进一步包括用于显示被记录的有关所说程序状态和所说至少一个活动程序循环的信息的器件。
60、一种用于模拟一个或多个状态图并用于控制至少一个机器或工业生产过程的操作状态的操作系统的使用方法包括执行一种应用程序的步骤,该应用程序包括多个语句字组(字块),每一个所说的字组在执行时是一个程序状态,而每一种所说的程序状态对应于一种所说的操作状态,并且至少某些字组包括一个或多个复合语句,它确定要执行的下一个所说的字组,以及在该相对应的操作状态期间该机器要采取的一种操作动作,至少某些所说的程序状态确定一种与其它程序状态要采取的不相同的操作动作,该应用程序包括与该一个或多个状态图中的每一个状态图相对应的一个或多个程序循环,每一个所说的程序循环包括至少一个所说的字组,该方法包括下述步骤:
a.允许至少一个所说的程序循环成为活动的并且在任何一个时刻只允许所说活动程序循环中的一个所说字组成为活动的步骤;
b.该允许的步骤包括把一个所说活动字组的标识符存入一个变量中的步骤以及用所说的指示字来存贮一个所说至少一个程序循环的标识符的步骤;
c.把每一个所说的与所说至少一个活动程序循环有关的变量存入存贮器中,以方便多个所说至少一个活动程序循环执行多任务并控制所说至少一个活动程序循环的执行顺序。
61、按照权利要求60所述的方法,其中把信息存入所说变量中的步骤包括存贮一个该活动程序状态的初始地址以及存贮一个指示包括该活动程序状态的该活动程序循环的标识符。
62、按照权利要求60或61所述的方法进一步包括把与所说至少一个活动程序循环有关的变量存入一个存贮器中的步骤,以方便多个所说至少一个活动程序循环执行多任务并控制所说的至少一个活动程序循环的执行顺序。
63、按照权利要求60或61所述的方法进一步包括记录指示出所说程序状态和所说程序循环活动的执行序列的信息的步骤。
64、按照权利要求63所述的方法,其中该控制器包括用于指示一个决定下一个要执行的程序状态的选择的条件的器件,其中所说的记录信息的步骤包括记录一个或多个所说的条件以及所说的在该相对应的操作状态期间要采取的操作动作的步骤。
65、一种便于调试关于一种程序控制器的一种有限状态应用程序的方法,所说的有限状态应用程序包括一个或多个语句字组,每一个所说的语句字组在由该计算机执行时是一个程序状态,而每一种所说的程序状态仅在一个或多个条件引起所说程序状态发生时才发生,该方法包括下述步骤:
a.记录每一个所说程序状态的每一个所说的发生;
b.记录所说的一个或多个引起所说程序状态发生的条件;
c.显示所说的一个或多个程序状态发生的次序和/或所说的一个或多个决定每一个所说程序状态发生的条件的发生次序,从而方便该有限状态应用程序的调试。
66、一种方便调试一种有限状态应用程序的程序计算机,所说的有限状态应用程序包括一个或多个语句字组,每一个语句字组在由该计算机执行时是一个程序状态,而每一个所说的程序状态仅在一个或多个条件引起所说程序状态发生时才发生,该计算机包括:
a.用于记录每一个所说的程序状态每一个所说的发生的器件。
b.用于记录所说的一个或多个引起所说程序状态发生的条件的器件;
c.用于显示所说的一个或多个程序状态发生的次序,和/或所说的一个或多个决定每一个所说程序状态发生的条件的发生次序的器件,从而方便了该有限应用程序的调试。
67、一种控制至少一个机器或工业生产过程的操作的可编程序控制器包括:
a.利用了状态变量概念的一种应用程序规定。
b.能够参考状态变量的操作系统软件,包括程序语言,和对所说功能提供必要支援的管理程序设备,它们带被提供作为一种系统服务的所说的调试支援器件;
c.记录以后利用信息的记录器件,该信息包括以前对于该系统中哪一个状态是活动的而发生的转变以及该转变发生的次序或者先前的状态活动。
68、按照权利要求67所述的一种可编程序控制器进一步包括用于检索出并把信息提供给用户的器件。
69、按照权利要求67或68所述的一种可编程序控制器,其中所说的系统软件设备具有记录信息的器件,所记录的信息指示了在该程序的执行过程中是哪一个逻辑评价或哪几个逻辑评价引起该相对应的所说一次状态转变或多次状态转变的发生。
70、按照权利要求67至69中的任何一个权利要求所述的一种可编程序控制器具有:
一个或多个程序循环,每一个程序循环对应于一种状态图,并且
至少有一个所说的程序循环是活动的,并且所说的系统软件设备具有记录信息的器件,所记录的信息指示哪一个程序循环包含被执行并从而引起该相对应的状态转变发生的语句。
71、按照权利要求70所述的一种可编程序控制器,其中:
每一个程序循环具有与该状态图状态相对应的程序状态,并且
在一个时刻在每一个所说活动程序循环中只有一个所说的程序状态是活动的。
72、按照权利要求71所述的一种可编程序控制器,其中每一个程序循环具有一个标识符,其中发生逻辑评价的循环的程序循环标识符被记录在所说的信息中。
73、按照权利要求67至72中的任何一个权利要求所述的一种可编程序控制器,其中该程序进一步包括由一个条件部分和一个动作部分组成的复合语句,该条件部分包括一个或多个简单条件评价语句,每一个评价某个系统条件是真还是假,并且其中的条件部分确定是否要执行包含在该动作部分中的动作,并且其中被记录的信息包括了该简单条件评价语句在该程序中作出该复合语句的条件部分成立的决定的位置
74、按照权利要求73所述的一种可编程序控制器,其中在所说的语句程序中提供有语法规则,以便当被记录的信息包括了该程序中的作出状态活动改变复合语句的一个条件部分成立的决定的位置时,则这样的信息确定了这样一个必要的信息,那就是在读出该程序的上下文时,该信息唯一确定了在哪一个状态中的哪一个语句的哪一个条件部分中的哪一项引起哪一个状态活动的转变。
75、按照权利要求67至74中的任何一个权利要求所述的一种可编程序控制器,其中所记录的信息包括状态活动的转变发生的时间。
76、一种控制至少一个机器或工业生产过程的操作的可编程序控制器包括:
a.利用了状态变量概念的一种应用程序装备;
b.能够参考状态变量的操作系统软件,包括程序语言和对所说功能提供必要支援的管理程序设备,它带有被提供作为一种系统服务的所说的调试支援器件;
c.在该程序语言范围内提供的用于调试一种应用程序里的功能的器件;
d.用于加上电源后自动地操纵该程序的器件。
77、按照权利要求67至76中的任何一个权利要求所述的一种可编程序控制器,其中所说的控制器具有把一种状态转变成为一个断开状态的装置,当这个断开状态成为活动时,就使得一个预定的调试功能发生,它导致该应用程序停住,从而使控制可以返回到该操作系统的该管理程序部分,以便进行调试和探查。
78′.按照上述权利要求中的任何一个权利要求所述的一种可编程序控制器,其中所说的控制器具有把一种状态转变成为一种暂停状态的装置,当这个暂停状态成为活动时,就使得一种预定的调试功能发生,它导致其中出现该状态的该程序循环执行的停住,但是不影响其它程序循环的执行。
78、按照权利要求67至77中的任何一个权利要求所述的一种可编程序控制器,其中所说的控制器具有把一种状态转变成为一种停止状态的装置,当该停止状态成为活动时,就使得一种预定的调试功能发生,它在由一个停止语句所指出的一个时刻上导致在该程序状态的整个执行过程期间的一个停止作用,该停止语句可以是选择为有条件的,但是不影响其它程序循环的执行过程。
79、按照权利要求67至78中的任何一个权利要求所述的一种可编程序控制器,其中每一个状态都是一个程序状态,该程序状态在该程序中由一个与一个语句字组有关的状态标识符来代表,并且该程序状态确定了模拟一个状态或一个状态图所要求的过程。
80、按照权利要求79所述的一种可编程序控制器,其中在一个时刻在一个状态图中只有一个状态可以是活动的,并且该活动状态是由指示出该活动状态字组的在一个变量中存贮的一个数值来指示,该变量被指定用于指示状态活动的。
81、按照权利要求80所述的一种可编程序控制器,其中该活动状态由存贮的一个指向该状态字组成该状态字组的标识符的指示字来指示。
82、按照权利要求80或81所述的一种可编程序控制器,其中以“断开”或“暂停”或其它调试功能所选择的不同的特性是通过被编码成为一个也起状态定界语句作用的语句与一个状态有关的。
83、一种通过模拟一个或多个状态图来控制至少一个机器或工业生产过程的操作的可编程序控制器,所说的控制器包括:
a.确定该一个或多个状态图的一种应用程序规定;
b.所说的应用程序包括至少多个语句字组,每一个所说的字组是一个程序状态,该程序状态对应于在该状态图中的一个状态,并且至少某些字组包含一个或多个语句,该语句确定在该字组的扫描期间要采取的至少一种控制动作,
c.所说    序具有一个或多个对应于状态图的程序循环,每一个所说的程序循环包括至少一个所说的字组;
d.至少一个所说的程序循环是活动的,并且在任何一个时刻在每一个所说的活动程序循环中只有一个所说的程序状态是活动的;
e.允许该控制器在每一个活动程序循环中的每一个活动程序状态中处理该程序语句的器件,由此控制该机器或工业生产过程的状态的操作和顺序。
84、按照权利要求83所述的一种可编程序控制器具有程序结构器件,该器件是为了作出状态从属决定或执行状态从属活动等目的而去排除需要评价是否任何一个特定的状态是活动的,这些状态从属活动取决于其中出现状态从属语句的该程序循环中的一个状态的活动。
85、按照权利要求84所述的一种可编程序控制器,其中所说的程序结构器件包括一些规则,借此,包含有状态从属评价或取决于一种特定状态的动作的所有语句都被集中在该特别状态的该字组中,以及
还包括只执行那样出现在该系统中是活动的那些状态的状态字组中的语句。
从而排除了需要评价一个特定的状态是不是活动的,因为在执行该语句时该状态是活动的,所以隐含了该活动状态所加的活动限制,只要该状态是不活动的就隐含了不活动的限定,因而产生该动作失活作用。
86、按照权利要求83至85中的任何一个权利要求所述的一种可编程序控制器具有一个与每一个活动程序循环有关的变量,该变量是用于存贮表示在该循环中是活动的那个程序状态的起始的一个值。
87、按照权利要求86所述的一种可编程序控制器,其中所说的变量包括一个含有一个状态字组起始地址的指示字。
88、按照权利要求86或87所述的一种可编程序控制器,其中提供有发展该程序的操作系统软件工具。
该程序的发展是通过如下手段进行的:从所说变量中第一个被初始化的变量中取出该变量中的指示要被处理的第一个程序状态字组的起始点的值,处理该第一个状态字组,如果所说第一状态字组的处理指示了修改,则修改存贮在这一个或另一个变量中的所说值,保存任何所要求的现行状态字组活动的记录,并且其中该程序的处理包括按照所要求的次序以同样的方式重复地处理每一个活动状态字组。
89、按照权利要求87或88所述的一种可编程序控制器,其中每一个所说的指示字具有一个标识符,为了使一个特定的程序循环活动,该标识符允许对指向一个特定状态字组的一个特定的指示字初始化,以便按照与其它程序循环有关的已知次序接续地进行处理并供调试时使用。
90、按照权利要求83至89中的任何一个权利要求所述的一种可编程序控制器具有用于给该状态字组定界的定界器件,所说的定界器件包括把一个状态标识符和该状态字组联系起来的状态语句。
91、按照权利要求90所述的一种可编程序控制器具有编制器件,该编制器件用于把所说的指示字编入一个任务表中,以方便按照所说的已知次序控制所说的处理过程。
92、按照权利要求67至69中的任何一个权利要求所述的一种可编程序控制器,其中该应用程序以P代码的形式被存储,由一种P代码翻译程序来执行。
93、在结构安排及操作时基本上如同参照附图于此所描述的以及如同由附图所说明的一种可编程序控制器。
94、一种控制至少一个机器或工业生产过程系统的方法,该机器或工作生产过程是由一个可编程序控制器通过模拟一个或多个状态图来控制,用以控制至少一个机器或工业生产过程的操作状态,所说的控制器使用操作系统软件和一种应用程序,该应用程序又利用了状态变量的概念,该方法包括下述的步骤:
a.提供用于调试所说的控制器的调试支援设备,该控制器的调试是通过如下手段进行的:对于状态变量活动具体的转变或者对具体状态的激活作安排,以便使该控制器在没有用户干预的情况下和不要求用户用一般用途的语句写代码就起动一个或多个预定的调试功能;以及
b.利用所说的包括程序语言和管理程序设备(能够引用状态变量)的操作系统软件,对所说的功能提供了必要的支援,所说的调试支援设备被提供作为一种系统服务。
95、按照权利要求94所述的一种方法进一步包括用所说的系统软件记录以后要使用的信息的步骤,该信息包括对于在该系统中是活动的状态而发生的转变以及该转变发生的次序。
96、按照权利要求95所述的一种方法进一步包括以后检索以及把该信息提供给用户的步骤。
97、按照权利要求95或96所述的一种方法进一步包括用所说的系统软件记录信息,以便指示在该程序的处理中是哪一个逻辑评价或哪几个逻辑评价导致状态相应的所说一个转变或多个转变发生。
98、按照权利要求95到97中的任何一个权利要求所述的一种方法进一步包括提供一个或多个程序循环的步骤,每一个所说的程序循环都对应于一种状态图,至少一个所说的程序循环是活动的,以及包括用所说的系统软件记录信息的步骤,该信息指示哪一个程序循环包含有被执行的并因此导致该相对应的转变状态发生的语句。
99、按照权利要求98所述的一种方法进一步包括在每一个程序循环中提供与该状态图状态相对应的程序状态的步骤,以及在一个时刻在每一个所说的活动程序循环中只提供一个所说程序状态的步骤。
100、按照权利要求99所述的一种方法进一步包括在每一个程序循环中提供一个标识符的步骤,以及对发生逻辑评价的循环在所说的信息中记录该程序循环标识符的步骤。
101、按照权利要求100所述的一种方法进一步包括在所说的信息中记录作出该程序中该状态活动改变复合语句的条件部分成立的决定的位置。
102、按照权利要求101所述的一种方法进一步包括在所说的程序中提供用于语句的语法规则的步骤,使得当所记录的信息包括该程序中作出该状态活动改变复合语句的条件部分成立的决定的位置时,则这样的信息确定了在读出该程序的上下文时,可唯一确定在哪一个状态中的哪一个语句的哪一个条件部分中的哪一项导致了哪一个状态活动转变所必需的信息。
103、按照权利要求95到102中的任何一个权利要求所述的一种方法进一步包括在所说的信息中记录状态活动发生转变的时间的步骤。
104、按照权利要求98至103中的任何一个权利要求所述的一种可编程序控制器中所述的一种方法进一步包括调整所说的控制器去把一种状态转变成为一个断开状态的步骤,在该断开状态成为活动时,就引起一个预定的调试功能发生,它导致该应用程序停住,从而可使控制回到该操作系统的该管理程序部分,以便进行调试和调查。
105、按照权利要求94至104中的任何一个权利要求所述的一种方法进一步包括调整所说的控制器去把一种状态转变成为一种暂停状态的步骤,在该暂停状态成为活动时,就引起一个预定的调试功能发生,它导致发生该状态的程序循环的处理过程中的一个停住,但是不影响其它程序循环的处理。
106、按照权利要求94至105中的任何一个权利要求所述的一种方法进一步包括调整所说的控制器去把一种状态转变成为一种停止状态的步骤,在该停止状态成为活动时,就引起一种预定的调试功能发生,它导致在由一个可以选择为有条件的停止语句所指示的一个时刻上在贯穿该程序状态的处理过程中一种停止作用,但是不影响其它程序循环的处理。
107、按照权利要求94至106中的任何一个权利要求所述的一种方法,把每一种状态提供作为一个程序状态,该程序状态在该程序中由一个与一个语句字组有关的状态标识符来代表,该方法确定了模拟状态图中一种状态的过程。
108、按照权利要求107所述的一种方法进一步包括提供一种与每一个活动程序循环有关的变量,用于存贮表示每一个活动状态字组的一个值,该变量是被指定去指示状态活动。
109、按照权利要求107或108所述的一种方法进一步包括存贮表示该活动状态的一个值的步骤,所说的值包括一个指向该状态字组或该状态字组标识符的指示字。
110、按照权利要求108或109所述的一种方法进一步包括提供“断开”、“暂停”或其它调试功能不同特性的步骤,所说的“断开”、“暂停”或其它调试功能通过被编码到一个也作为一个状态定界语句的语句中与一个状态有关。
111、一种控制至少一个机器或工业生产过程的操作的方法,该机器或工业生产过程是由一个可编程序控制器通过模拟一个或多个状态图来控制时,所说的控制器利用了一种确定一个或多个状态图的应用程序,所说的方法包括下述步骤:
a.提供以至少有多个语句字组形式的所说的应用程序,每一个所说的字组是一个对应于该状态图中一种状态的程序状态,并且至少某些字组包含一个或多个语句,该语句确定在该字组的扫描期间要采取的至少一个控制动作;
b.在所说的程序中提供一个或多个对应于该状态图的程序循环,每一个所说的程序循环包括至少一个所说的字组;
c.至少有一个所说的程序循环是活动的,并且在任何一个时刻在每一个所说的活动程序循环中只有一个所说的程序状态是活动的;
d.处理在每一个活动程序循环中的每一个活动程序状态中的该程序语句,由此控制器或工业生产过程的状态的操作和顺序。
112、按照权利要求111所述的一种方法进一步包括安排所说程序的步骤,该程序的安排排除了为了作状态从属的决定或执行状态从属的活动等目的而去评价是否任何特定的状态是活动的这种需要,所说的状态从属活动取决于其中出现该状态从属语句的该程序循环中的一个状态的活动。
113、按照权利要求112所述的一种方法进一步包括把含有状态从属评价或取决于一种特定状态的动作的所有语句集中在对于该特定状态的状态字组中的步骤,该方法还包括只执行那些在该系统中是活动的状态的状态字组中出现的那些语句,从而排除了需要评价状态变量,因为该活动的状态隐含了活动的限定,在执行该语句时因为该状态是活动的而只要该状态是不活动的,就隐含了不活动的限定,因而即暗示了该动作的失活作用。
114、按照权利要求111至113中任何一个权利要求所述的一种可编程序控制器进一步包括让一个变量与每一个活动程序循环有关的步骤,该变量是用于存贮表示在该程序循环中活动的那个程序状态开始的一个值。
115、按照权利要求113所述的一种可编程序控制器,其中所说的变量包括一个含有一个状态字组起始地址的指示字。
116、按照权利要求115所述的一种方法使用操作系统软件工具,所说的方法进一步包括使用所说的操作系统软件去发展该程序的步骤,该程序的发展是通过如下手段进行的:从所说变量中第一个被初始化的变量中取出该变量中的表示要处理的该第一个程序状态字组开始的一个值,处理该第一状态字组,如果所说第一状态字组的处理指示了修改,则修改存贮在这一个或另一个变量中的该值,保存任何所要求的现行状态字组活动的记录,并且通过按照所要求的次序以同样的方式重复地处理每一个活动状态字组来处理该程序。
117、按照权利要求115或116所述的一种方法进一步包括给每一个所说的指示字提供一个标识符的步骤,该标识符允许使指向一个特定的状态字组的一个特定的指示字初始化以便使一个特定的程序循环活动,用于按照与其它程序循环有关的已知次序接续地进行处理并供调试时使用。
118、按照权利要求111至117中的任何一个权利要求所述的一种方法进一步包括利用把一个状态标识符和该状态字组联系起来的状态语句来给该状态字组定界的步骤。
119、按照权利要求118所述的一种方法进一步包括把所说的指示字编入一个任务表中的步骤,以方便按照所说的已知次序控制所说的处理。
120、按照权利要求83至119中的任何一个权利要求所述的一种方法,包括以P代码形式存储该应用程序的步骤,所说的P代码是由一种P代码翻译程序来执行的。
121、基本上如这里参照附图所描述的以及如由附图所说明的那样实现的一种控制一个机器或工业生产过程的方法。

说明书全文

发明涉及一个可编程序控制器,用于处理控制机器和/或工业过程的有限状态应用程序。本发明也涉及调试机器和/或方法,这种调试易于诊断该有限状态应用程序。

在六十年代,研制出可编程序控制器来取代使用电磁继电器控制工业机器和过程的继电器控制系统。将这些可编程序控制器设计成就象它们包含一些继电器电路一样地工作(尽管这样一些电路实际上是计算机的程序)。用这些可编程序控制器模拟的继电器电路设计图由于它们总的外形象梯子而被称为梯形图。梯形图非常适宜于解决输出或动作直接取决于输入的状态或条件的组合逻辑控制问题。但是,对于控制动作依赖于时间的顺序控制问题,用梯形图来处理就很麻烦,难于设计,难以找到故障。Lloyd的“为可编程序控制器编程的功能图”,控制工程,1985年10月。

为了模拟梯形图,程序员要将软件指令形式的布尔方程或按文本形式或按图示形式编排在一起成为冗长的表格。每一条指令控制一个内部的或外部的信号。在这样一个系统中调试或寻找故障通常包括,观测一个意外的状况、然后直觉地往回查寻可能引起该意外状况的某些或全部可能的因素的组合。因为每一次扫描循环都要扫描所有的梯形图,所以不可能排除任何肯定不包含该问题的部份。

梯形图控制器的另一个缺点是,为了确定意外状况产生的原因,只期望记载与该问题原因有关的信息。但是,梯形图系统不具有任何能区分系统变量和条件的相关变化和不相关变化的机构,其结果必然是需要储存非常大量的难以分析和分类的数据。

此外,梯形图控制器编程很麻烦,正是由于梯形图本身的性质,梯形图难于理解。并且梯形图没有清晰地显示出设计它们来提供的更概括的宏观的功能性,尤其是顺序功能。事实上它们能够表示的是一个能提供那样功能性的一个电路。许多年来,不熟悉梯形图的机器设计和制造工程师们,要为他们自己的机器或过程去发展控制系统可能是很不容易的。他们是依靠专业的控制工程师来为他们的控制系统编程的。

在简化可编程序控制器的努中,研制出一些能使工程师们用高级语言来模拟“状态图”的系统。一个状态图就是在一个机器或过程中的操作状态以及改变这些操作状态的状况的条件的图解表示法。一个状态图在图解形式中就是一系列带有相互连接弧的节点。每一个节点代表一个特定的操作状态,每一个相互连接弧代表一个引起该状态的状况改变的转变功能。状态图易于为各种类型的工程师理解和设计。但是,当前的模拟状态图的系统的编程和调试都是很困难的。

在授与Drummond的美国专利4,562,529中公开了这样一个系统的实例。Drummond讨论了一种用于通过使用“状态逻辑变量”来控制一个机器或过程的操作状态的方法和设备。一个“状态逻辑变量”唯一地代表了机器或过程的每一个操作状态。“状态逻辑变量”只能取两个值中的一个,或为“真”,或为“假”。“真”表示该状态是活动的,“假”表示该状态不活动的。通过使用所公开的这种方法使Drummond系统的工作方式和梯形图控制器非常相似。在Drummond的方法和设备中还存在有几个问题。

首先,为了使Drummond系统能正确地处理“状态逻辑变量”必须周期性地扫描整个有限状态应用程序。为了给状态变量赋值(若 改变状态,必须这样做)或者为了完成依赖于状态的动作,Drummond必须对许多包含状态变量的表达式求值。在他的公开说明书中讨论了这样做的简化方法,但是这一过程的效率仍然很低,并且可将该过程全部舍去。

其次,对模拟状态图的Drummond控制器编程是一个很麻烦的过程。在Drummond说明书中公开的语言无助于将状态图轻易地转换成程序代码。其原因在于,不可能把影响“状态逻辑变量”的条件语句归并到程序代码的特殊区域,并且上述条件语句还要求在左手侧明显地包括状态变量项。此外,为了决定是否要对一个状态进行赋值,或者是否应完成一个动作,在程序代码中的每一个语句需要有一个待评算的“状态逻辑变量”。因此,要完成一些简单的功能就必须设计出许多额外的代码。

最后,由于为了评价状态逻辑变量的状况,每次扫描都必须扫描有限状态应用程序中的每一语句,所以这种系统工作起来效率很低。这一缺点严重限制了信息的吞吐量并且限制了用于调试目的的系统活动信息的记录。还有,Drummond没有公开用于追踪要同时控制的多个操作任务的适当策略或结构。

还应该注意依据法国标准NFC    03-190的在市场上可买到的GRAFCET系统。GRAFCET没有将一个状态图限制在每次仅有一个有效状态,所以了解到识别出一个GRAFCET状态图中的一个有效状态并没有完全确定这时与该状态图有关的条件和操作。这在程序调试期间有很大的缺点。

所以PLC一直用称之为梯形图的方法或者用一个等价的方法来编程。由于对这种语言已经增加了越来越多功能特性(取可利用的梯 形图符号和结构的形式),很明显,对梯形图存在一些只有在改变编程基本方法才会涉及到的限制。特别是在用PLC控制灵活的自动化方案中的机器时,尤其明显。这样一些方案的功能特性主要依赖于根据要完成的动作和按此顺序要执行的功能以及根据PLC同时控制许多基本上无关的顺序过程的能力、以复杂而灵活的方式编排机器动作程序的能力。用梯形图的PLC能够做这样一些事情。但是这些程序要求有一个翻译过程以便由可以取书写规范形式或流程图形式的顺序规定产生一个梯形图。在检查梯形图时,要执行的功能不明显,调试该程序的过程也很麻烦。在将功能要求转换成完成这些要求的继电器电路的翻译过程中,书写规范或流程图中固有的信息失掉了或者变得模糊不清。

最近几年一直在致力于改善这种情况。已经研制出旨在改善这样一些程序的产生,调试和理解的排序方法。法国的GRAFCET的成果是值得注意的,并且作为一个有用的技术在国际上被承认。存在着相关的法国和西德标准。在市场上有几种PLC,它是使用用标准化流程图来描述程序的GRAFCET方法。但是还存在着进一步要解决的问题以便能使编程的控制系统达到最佳的形式,这些问题在任何现有的系统中都未涉及到。

需要解决的问题要求在下述各方面进行改进:

-程序结构形式

-集中在相关性上

-简化对复杂系统的理解

-适合于高级别的功能特性

-将转换减至最小

-避免付作用

-硬件的化费

-对最广泛范围的人员和用户是能够很好地自身说明问题的

-最少的训练

-对调试有最大程度的邦助

本发明寻求提供一种能减少或消除上述缺点的控制方法和设备,而且该方法和设备能较容易和自由地为控制,制造和设计工程师所使用。

下面对一些术语作初步的解释,它们将能邦助读者更全面地理解在本说明书中所描述的发明的本质。

1.“操作状态”意指在一个机器或过程里在一个有限的时间间隔上存在的操作和条件的特定的组合;仅仅该机器或过程的信号或数值的一个子集合才有特定的确定数值。一个机器或过程的“操作状态”可被认为是该机器或过程当前执行的一个特殊的任务或一些任务的子集合。

2.“控制器”意指用于对一个过程或机器或活动实行控制的一个设备,它包括用于辨别“操作状态”的装置。为此,必须使控制器不断地知道该机器或过程的状况和数值的变化。

3.“程序状态”意指对于一个“操作状态”进行求值、保持和控制的程序代码特定的一个或多个语句字组。

4.术语“机器”或“过程”是一些从一个特殊的操作状态实时进行到下一个操作状态的系统。该控制器从该机器或过程读出信号,监测机器或过程的操作,借助于它自身的非正规的状态跟踪必需的操作状态,并且根据该应用程序中包含的算法提供必需的输出信号使机 器进入必须的操作状态。

5.术语“多重任务”意指仅通过一个控制器异步地操纵一些独立的程序或操纵包含在同一程序内的一些独立的任务的方法,结果使得所有这些程序或任务看起来彼此象是同时被执行一样。

正是由于“状态”这个概念,才能允许人们说,一个机器或一个机器的一部份处于一个特定的状态,才允许构成这样一个程序,使得一个状态仅在具有某种形式的状态定界语句或方法的程序中的一个邻接的字组中被限定,由此才能说,当存在一个特定状态时,与那一循环有关的程序中唯一可能的相关部份就是限定该状态的字组。作为该语言的一部分,提供了一类输出,如果一个系统不存在这一型式的输出的话。这类输出不同于每个循环中活动的状态所确定的那些输出。一般这种类型的输出都被用于驱动电机。在一个状态存在时该状态就可能产生真正的大量的输出,在这个意义上,因此也可以说该状态存在,而这些输出仅仅是该状态的一些作用,也就是说,只有该状态存在为条件才能激活这些输出。

根据系统内存在的其他条件来限定这些输出可能是有益的,但是这会使系统不必要地扩大。

应当注意的是,还提供一种能在一种状态中被激活而在另一种状态被失活的输出可能是有益的,这种输出例如可用于驱动显示器或寄存器。

正是还有显式状态类型的语句的存在,才能允许提供诸如“中断状态”和“暂停状态”这样的子类来控制程序的流动。

因此,对控制活动的理解和调试可以以如下的一个“状态结构”为基础

-对于存在的状态和这些状态提供什么样的主要控制功能的识别。例如,当一个状态可以激活几个输出,进行某种定时,询问输入、打印、和最后作出变到另一种状态的决定时,则也可以说执行了某种宏功能;例如,对于一个升降机的控制器可能有一个执行“升高一层楼”的宏功能,它由类似于上述那些动作组成。因此,也可以将“升高一层楼(GO    UP    One    Floor)称为我们系统中的一个单字符号名称,这就给出了该程序的结构和广义的理解,不需要考虑为实现该宏功能而必须的较低级别的操作。

-审查通过先前存在的、及最终导致机器整个现行状态的各种状态的控制流程,(即跟踪)。

-允许控制运行直到达到一特定状态时为止,即用一个中断状态俘获,随后对这个阶段的活动进行诊断,或用一个暂停状态使一个特殊的循环暂停。

由此可见最为有益的是,一个循环、程序、组程序或者不管称其为什么,能够被说成是处于某种状态,并且该状态能够明确地被确定,以及该状态是一个可被说成存在或不存在的函数,可以被检测和/或记录。

为使跟踪有效,必须有两个概念:状态和循环。

简言之,本发明的最佳实施例包括一个可编程序控制器,用于模拟一个或多个状态图,并且用于控制至少一个机器或过程的操作状态。该控制器执行一个应用型的程序,该程序包括多个语句字组。每一个这种语句字组在被执行时都是一个确定一个内部控制或状态的程序状态,而一个内部控制或状态又与一个机器或过程的操作状态相对应。每一个语句字组限定了下边一些语句字组,如果规定的转换条件被满 足,并在相应的操作状态期间,机器或过程采取了动作,则下边语句中的一个语句块就会作为活动的语句字组代替了现行语句字组。

将程序状态编排成一个或多个程序循环,这些程序循环代表了整个机器或过程,或者机器或过程的一个组成部分的一些独立的顺序控制,每一个程序循环基本上模拟了一个状态图。

控制器能够同时激活一个或多个程序循环,但每一个程序循环只允许该程序循环中的一个程序状态成为活动。为了跟踪活动的程序循环和相应的活动程序状态,每一个活动程序循环与一个变量相连系。该变量包含有一个该活动程序状态的标识符或者该活动程序状态的起始地址。该变量还要有一个能指示出该特定程序状态存在在哪一个活动程序循环里的标识符。该控制器还有一个贮存活动程序循环的变量的任务表。该任务表使该控制器能异步地执行几个活动程序循环,并决定了活动程序循环的执行顺序。任务表密切监测哪一些程序循环和哪些程序状态是活动的以及要处理的每一个程序状态的级别和顺序。

还提供一种方便“调试”有限状态应用程序的方法和设备。提供了能记录有关每一个活动程序状态活动的信息的装置。具体地说,该控制器跟踪每一个程序状态以及造成每一个程序状态发生的条件的次序和发生的历史。还提供了显示装置以便使程序员能评价被记录到信息。

最重要的是本发明允许一个控制工程师、制造工作师或机器设计工程师更自由地理解甚至于设计出代表状态图的高级应用程序。本发明特殊的设计优点在于,程序员能够将所有与一个特定操作状态有关的程序语句都编排到一个由程序代码或语句块组成的邻接的程序段中,而且这些语句和任何其它的操作状态都不相关。这样一来,程序员就 能够将和每一个操作状态有关的各种条件区分开来而不必过多地考虑任何其他操作状态。这种做法就摆脱了“状态逻辑变量”,并且便于按照被编排和建立好的格式进行编程时使用的技巧。再者,通过用包含在程序状态块中的“条件转移语句”(“Conditional    GOTO语句”)等简单地把被分隔开的代码连在一起,就很容易地将代表整个状态图结构的程序循环设计成代码。

由于每当需要控制一个特定的操作状态时不必扫描应用程序中所有的语句,所以本发明比现有技术的效率更高。而仅仅与活动的特定操作状态有关的特定程序状态中的那些语句才要被扫描。这一技术能使控制器极其迅速地进行处理,并且能使本发明更有效地同时处理多个任务。本发明的最佳实施例也有一个任务表,用于监视要同时执行的任务的各种顺序,和/或决定将被执行的任务的每一个序列的次序。

最后,由于这种应用程序是用程序状态设计的,它极大地方便了明确指明发生意外事件的原因,提供了用于记录每一个活动程序状态在它们产生时的发生的序列次序以及造成出现从每一个程序状态到下一个程序状态转变的或者引起程序状态最初起动的一个或多个条件的装置。通过分析每一个程序状态发生的显示并且通过分析引起发生这种转变的条件语句,分析人员就能迅速决定在该程序中意外事件的位置和原因。

图1a是可应用本发明的简单的设备及控制的示意图;

图1b是用于图1的设备和控制的已有技术控制器的一个状态的梯形图;

图1表示的是按照本发明用于控制一个机器或过程的操作的可编程序控制器;

图2a是一个升降机的各种操作状态的状态图以及在状态之间引起转变的条件;

图2b是一个与图2a中状态图的操作状态相对应的语句字组图;

图2c是一个突出该程序代码结构的示意图;

图2d是一个更复杂的状态图;

图3a是程序循环指示字(Pointer)图;

图3b是任务表的图;

图3c是任务表指示字的图;

图4是跟踪表的逻辑表示法,以无限循环方式示出;

图5是称之为“START    PROGRAM”的子程序的示意框图;

图6是子程序“FIRST    OPERATOR”的示意框图;

图7是子程序“ADVANCE    P-CODE    POINTER”的示意方块图;

图8是子程序“ADVANCE    TASK    TABLE    REGI    STER”的示意框图;

图9是子程序“NEXT    OPERATOR”的示意框图;

图10是子程序“GO    TO”的示意框图;

图11是子程序“START”的示意框图;

图12是子程序“GO    SUBROUTINE”的示意框图;

图13是子程序“RETURN”的示意框图;

图14是一个称之为“STORE    HISTORY”的子程序示意框图;

图15是一个称之为“DISPLAY    HISTORY”的调试程序的示意框图;

图16是一个称之为“DISPIAY    LINE”的调试程序的示意框图;

图17是一个称之为“DLSPLAY    PROGRAMSTATE”的调试程序的示意框图;

图18是一个称之为“DLSPLAY    LOOP”的调试程序的示意框图;

图19是一个调试程序“FOUND    LOOP”的示意框图。

在考虑语言解释软件的说明和实现之前,我们首先描述这种语言所依据的原则并且给出如何根据本发明构造程序的实例。

循环-状态结构是这种能在复杂的系统中对复杂而又不断变化的控制要求进行简单管理的语言系统的一个最重要的特性。

下面介绍一些简单的概念。考虑一个升降机,它可以在一个建筑工地上被用来提升/降低一个平台。它在顶部和地面都有一个“向上”按钮和一个“向下”按钮。可以说该升降机处于“停止”、“上去”和“下去”的状态,但是在任一时间点上它只能处在这些状态中的一个状态上。可以借助于图1a中的状态图来描述它的操作。

应该注意以下各点:

-带有编号和名称的状态被包括在各个园圈中,

-转变条件用文字表示,并且示于由于该条件而转变成的那个状态的弧形线的旁边。

-使状态图的描述是最少并确定什么是相关的那种方式。例如,在“向上”的状态中“向下”的按钮1或2所发生什么变化是完全不相关的。

-类似地,表示所有相关活动和与之相关的状态相联系的方式。例如,在“向下”的状态中“电机向下供电”

-简易性,由此简易性能够很好理解升降机的操作。例如,如 果升降机停止并且按“向上”的按钮1,则升降机上升,但是如果升降机正在向下并且按“向上”的按钮1,则升降机不予理睬。

使用我们的这种在功能上和上述状态图等价的语言的程序是:

停止

刹车

如果“向上”按钮1接通或“向上”按钮2接通,则转向“向上”

如果“向下”按钮1接通或“向下”按钮2接通,则转向“向下”。

向上

向上达接通

如果向上按钮1断开并且向上按钮2断开,则转向“停止”。

向下

向下马达接通

如果向下按钮1断开并且向下按钮2断开,则转向“停止”

在这个程序中,唯一略去的部份就是一些给特殊的变量规定一些特殊名称的下定义语句,即例如说给连接到输入端2.1的向上按钮1下定义的语句。

其等价的梯形被画出在图1b中。

在此梯形图中

-〕〔是常开接点;

-〕/〔是常闭接点;

-()是继电器线圈。

要注意的是,虽然电路的工作相对说来容易领会,但在功能方面实际要做的事情却是难以推断出来。在任何时间点上结构都不能表明什么是相关的。

用具有100个状态代替3个状态的状态图仍旧具有和3个状态一样简单的状态,而每一个状态一个个都可以被理解。一个具有100个梯级的梯形图是难以想象的。

我们的循环-状态结构的原理是:

-将程序编排成(一个或)多于一个的独立的循环,这些循环代表用于对该机器各部分进行独立的顺序控制的方案。一个循环可以与该程序的其余部分无关地被处理,或者经过标记等将一个循环与其它的一些循环进行交换或同步。

-这些循环由一些状态的序列组成。即这些循环实际上是代表了一些状态机的状态图,这些状态机具有对输入等可以是有条件的或无条件的输出,

-每一个状态机,即一个循环,在该循环活动时间内的任何一点上有,且只有一个活动的状态。如果该循环不活动,那么在该循环中就不存在任何活动状态。因此可以说,活动的循环具有一个状态变量,状态变量的值是在该时间点上活动的状态的编号/名称。这个值可被存取并且可被用于交换、诊断等等。这也是将观察者的注意力集中于和特定目的相关的特定程序部份,并排除了其他部分可能是相关的机理。由于它能指出“注意这里”和“不要注意别处”,所以这种排除是极其重要的。

作为该语言的一部分,给出了一类输出,如果一个系统不存在这一型式的输出。这类输出不同于由每个循环中活动的状态确定的那些输出。这种类型的输出一般都被用于驱动电机或阀。因此,一个状态在当它存在时能够产生真正的输出的意义上也可以说,它存在,而这些输出只是该状态的一些作用,也就是说,只有该状态存在为条件才能激活这些输 出。因此在代码语言中的输出建立语句实际上说“当处于这个状态时,这个输出出现,并且这个输出将要消失,因为这个状态变成失活”,而不是说“设置该输出出现”以及它不需任何附加的语句再次取消这个输出。

-转变条件是状态的一个功能,转换条件使该状态被失活。这些转换条件说“将这个活动状态变到另一个活动状态”,其中另一个活动状态是作为“转向语句”的一个参量被给出的。因此,转变条件是在状态字组中出现的,转变条件是该状态字组的一部份。

-状态字组是邻接的一些程序段,它自一个状态语句开始,在下一个状态语句处结束。这些状态字组包含所有与那个状态有关的代码,不包含任何一个与其他状态有关的代码。

因此我们能够看出,

-对于一个机器的一部分,仅有一个循环是相关的;

-对于该机器的这个部分,在该部份进行程序的一个特定时间点上,在这个循环中仅有一个状态是相关的。

因此我们就把对这个程序中的注意力减少到代表一个状态的一个程序段,例如可能是2000行中的10行,而且我们可以确信这一程序段才是唯一的相关部份。

为此,我们仅需要确定机器与感兴趣的这个问题或其他事件有关联的那部分(这种关联仅仅是确实存在的关联),以及决定该程序中产生这个问题的那一点。如果这一时间点从该程序来看是不明显的话,那么俘获和跟踪就提供了确定在此顺序中的这一时间点的手段。在我们的另一份专利中简要地描述了俘获和跟踪的细节。

用程序与图解形式不同的文本形式能使文件的编制很容易进行。

图1描绘了一个用于模拟状态图的可编程序控制器和形成该可编程序控制器10的一个计算机程序,将有限状态应用程序存储在可编程序控制器10的存储器部份10A的14处。中央处理器(“CPU”)70对有限状态应用程序(简称“应用程序”)执行数学和逻辑功能。任务表或指示字集合68跟上活动的程序循环的发展。跟踪表72包含该应用程序活动短暂的历史。可编程序控制器配备有一个调试管理程序74,可使用户易于明确找出应用程序中的错误。跟踪表72、任务表68和调试管理程序74全都存储在存储器10A内。在76中还存储着用于控制可编程序控制器其他一些特性的其它操作系统软件,提供终端80能使控制器的用户为应用程序编程并可在终端80上调试该系统。

图1示出了一个可编程序控制器10,它被连到诸如升降机12这样的一个机器或过程。可编程序控制器10模拟在14处的应用程序,用于控制升降机12的操作。有限状态应用程序是反映状态图特性的高级程序(见图2a)。状态图是被控制的特定机器或过程的操作状态的形象表示法。程序员控制由状态图代表的机器或过程的方式是,首先设计一个有限状态应用程序,然后依靠这种模拟该状态图的控制来执行该程序,并控制每一个要被该机器或过程执行的任务或操作的发生顺序和级别。

可编程序控制器10一个简化的应用是对升降机12操作的监测、评价和控制。升降机12由一个可逆电机16,皮带轮20和升降机室18组成。升降机的基本原理是任何时间点上只有一个升降机的操作状态起作用。升降机的操作状态是“停止”、“向上”或“向下”。

在升降机室18内的按钮22使升降机从一个操作状态变到另一 个操作状态。例如,当“向上”按钮闭合并且“向下”按钮打开时,升降机室18向上运动。当“向下”按钮闭合,并且“向上”按钮打开时,升降机室18向下运动。当在向下时,“向上”按钮被压下或在“向上”时按下“向下”按钮,则升降机室18停止。图2a是这些操作状态以及实现从一个状态变到另一个状态的条件的状态图或叫图解表示法。更具体地说,一个状态图就是一系列带有相互连接弧30、32、34和36的节点24、26和28。每一个节点代表一个特殊的操作状态,并且每一个连接弧代表引起一个特殊状态的状况改变的一个条件或转换作用。

具体地说,在图2a中的状态图有节点24,26和28,这些节点分别代表“向上”、“停止”和“向下”这些操作状态。影响这些状态的状况的条件是在这些节点之间的弧形连接线30、32、34和36。每一个弧都编定了它自己的转换条件集合,起始目标状态。弧32有开关条件和动作42:

“如果“向上”按钮接通并且“向下”按钮断开,则升降机18的状态变成“向上”。”

弧30有开关条件和动作38:

“如果“向上”按钮断开,或者“向下”按钮接通,则升降机室18的状态变成“停止”。

其余的条件和动作也可以从图2a中被看出。

代表图2a中状态图的应用程序是:

“向上”

“向上”电机接通

如果“向上”按钮断开或“向下”按钮接通,则转向“停止”。

“停止”

刹车

如果“向上”按钮接通并且“向下”按钮断开,则转向“向上”

如果“向上”按钮断开并且“向下”按钮接通,则转向“向下”

“向下”

“向下”电机接通

如果“向下”按钮断开,或者“向上”按钮接通,则转向“停止”

以上三个语句字组被称之为程序状态,每一个语句字组既对应于升降机12的一个特定的操作状态又对应于状态图(图2a)中的一个特定的节点。每一个程序状态包括一个状态定界语句,即“向上”、“停止”或“向下”,这对控制器结束一个程序状态和开始一个新的程序状态有很大作用。在状态定界语句之后有一系列语句,包括没有、有一个或多个能引起动作或引起自一个现行处理的或活动的程序状态转换到另一个程序状态的复合语句。一个复合语句由一个条件部份机一个动作部份组成。如果条件部份被满足,则执行该动作部份。如果该动作部份包含转向、转子程序或返回语句,则发生转换到一个新的程序状态。如果该动作部份包括一个“开始”语句,则用一个附加的新的活动状态启动一个新的程序循环。换一种说法,复合语句决定了该程序状态改变了什么或者发生的将是什么,并且还决定了在现行的活动操作状态期间机器或过程所要采取的动作的类型。以上所有这三个程序状态都有包括“转向”语句在内的复合语句,使该程序状态转移到同一个状态图内的另一个程序状态去进行处理。

通过把所有的与一个特定操作状态有关的语句都集中到唯一的一个邻接代码段中的办法,该系统就能只扫描这些语句以启动机器或过 程的操作状态所要求的动作并且决定是否已经满足了一个特定的条件集合,以启动一个新的操作状态。而Drummond系统要评价应用程序中的每一个语句才能决定是否要改变状态活动或执行一个动作,并且在这一过程中还必须评价许多状态变量。该程序中的结构差别使本发明能以高得多的效率工作,因为它勿需评价许多状态变量。

图2b和2c是该程序状态的图。在两个图中的语句字组48都指的是程序状态“向上”的代码序列。语句字组50代表程序状态“停止”的代码序列。语句字组52代表程序状态“向下”的代码序列。弧54、56、58和60(图2b和2c)对应于状态图(图2a)的弧30、32、34和36。弧54、56、58和60表明了复合语句是如何影响该应用程序中的活动流程的。

图2b中的弧58表示了当复合语句的条件部份:

如果“向上”按钮断开或“向下”按钮接通时则转向“停止”成立时,发生自程序状态“向上”至程序状态“停止”的转换。类似地,弧60表示了当“复合”语句的条件部份:

如果“向上”按钮断开并且如果“向下”按钮接通则转向“向下”成立时,则发生自程序状态“停止”至程序状态“向下”的转换。

程序状态“向上”、“停止”和“向下”之间的逻辑连接确立了一个程序循环46。该程序循环46控制了要由升降机12执行的操作顺序。在最佳实施例中,在任何一个时间上,程序循环只有一个活动的程序状态。按这种方式,该控制器就可以跟上任务的各个安排的顺序处理过程的发展。在图2b中的程序循环46显示了在任何一个时间上,仅有一个活动状态的特性,这样就能使在程序执行过程中涉及的算法以及调试更加有效,并且能减少该系统中的歧义性。

在更复杂的机器中,单个程序循环仅代表对该机器或过程中的一个特定的独立的分部的控制。通常要求有多个程序循环来独立地控制一个复杂机器或过程的几个分部。图2d示出了一个由多个状态图62、64和66代表的更复杂的机器。每个状态图代表了一个描述该机器或过程的一个部份的顺序控制方案的程序循环。本发明通过异步执行控制一个机器三个假想的分部来模拟这些状态图(也称多任务处理)。一个特定的程序循环可独立于其余的程序循环被执行,或者使用某些诸如标记的惯用机制或者使用“如果循环N在状态M中,则循环N检查在一个不同循环中的这一活动状态的值”这种类型的语句将该特定程序循环与其他的程序循环交换和同步。这种控制器的这种执行多任务的能力对程序员来说是很显然的,而且这种操作系统和语言提供了实现这种能力的简单办法。

为便于执行一个程序循环中的程序状态,最佳实施例为每一个活动的程序循环都提供了一个程序循环记录。参照图3a,程序循环记录90具有容纳简单变量的区域92和94。第一个简单变量92是该程序循环的一个标识符。第二个简单变量94是该活动程序状态的一个标识符,或者是存储器中启动该活动程序状态的一个地址。该程序状态的地址或标识符都能很容易地相互转换。在指示字90、96处的其余部分包含该程序循环的其他的不太重要的状况信息。设置程序循环记录90的真正目的是要跟踪在任何时间点上一个特定程序循环中的哪一个程序状态是活动的。

当一个特定的程序循环成为活动时,程序循环记录90就与该循环相关连。由于在该程序循环中,各种程序状态都要变成活动的状态,所以简单变量94要随新的程序状态地址或标识符不断改写。程序循 环记录90能使一个程序循环通过询问第二个程序循环进行交换以确定第二个程序循环中哪一个状态是活动的。再有,还可以通过终端80来访问程序循环记录90,从而程序员可以显示或修改活动的程序状态。

在最佳实施例中,程序循环记录全都存储在一个任务表图36中,该任务表存储在存储器10A(图1)内。任务表的主要作用是使几个程序循环全都能同时处理。程序循环记录被放进任务表内,使得所有的非空记录在该任务表的起始部份,并且按照它们各自的程序循环标识符(图3a的92)的数字次序进行编排。参照图3b,在该任务表中第一个程序循环记录100具有最低的循环标识符(例如,1),因此,它在程序扫描期间第一个被扫描,因为扫描是按程序循环的数字次序进行的,仅扫描和处理每一个程序循环中活动状态,而在每一个活动状态内扫描和处理每一个语句是按照每一个语句在该状态块出现的次序进行的。循环记录102在任务表中具有第二最低的标识符(例如,2),因此第二个将处理循环记录102。循环记录104具有与其相关的第三最低循环标识符(例如,3),因此第三个将处理循环记录104。循环记录106具有下一个最低标识符(例如,34),因此第四次要处理循环记录106。

任务表寄存器112(图3c)也与该任务表相联系,该寄存器112指向现行正在控制执行一个活动程序循环的程序循环记录。为了扫描和处理在该任务表内的程序循环,该控制器要将活动程序循环记录90的地址写入任务表寄存器112。

当控制器执行了与循环记录100有关的程序循环时,只有与程序循环记录100有关的程序状态中的一个语句块被执行或起作用。 然后,该控制器将处理下一个程序循环(例如,2),并且将只处理与其相关的一个程序状态。控制器对每一个活动程序循环重复这一步骤。当任务表寄存器指向其相关的循环标识符为0的程序循环记录108(图4D)时,则向控制器发出警告:它已到达一个空程序循环的记录。在发生这种情况时,控制器的操作系统将任务表寄存器指示回到该任务表的顶部并且该执行任务表中该第一程序循环的下一个程序状态。除非发生了终端中断等,这一步骤是一个循环的过程。

由于对每一个程序状态而言仅处理几行程序代码,所以控制器可以非常迅速地从一个程序循环跳到下一个程序循环。按这种方式,该控制器似乎正在同时处理所有的多个程序循环或任务。

为了表示一个程序循环已被激活,该控制器将一个程序循环记录分配给该被激活的程序循环并且将该新的程序循环记录(图3a,90)插入到程序表里。该系统评价该新的程序循环标识符(图3a,92)的数值,并且将该程序循环指示字装入任务表中与该数值相对应的数字顺序位置中。例如,如果数值大于34,则新的指示字将代替该任务表(图3b)中的循环记录108。但是,如果新的程序循环标识符在3和34之间时,则该程序循环指示字将与循环记录106中的指示字交换,并且新的程序循环指示字将被插入106中。因为任务表现在的实施例最多能有31个程序循环指示字放在任务表中,所以必须评价任务表的内容以保证新指示字有可利用的空间,当任务表已经达到它的容量或者当任务表中发生了溢出情况时,该控制器就要向程序员发出警告。

参照图4,它是存储在控制器的存储器部分10A(图1)中的一个跟踪表82的逻辑表示形式。该跟踪表是存储器中的一个长条形 的表。使它起一个卷成圈的“环形带”存储缓冲器的作用。跟踪表82的工作方式十分类似于一个飞机的飞行记录器。飞行记录器有“重演”就在飞机“坠毁”前飞机发生了什么事情的功能。类似地,跟踪表记录了就在需要调查的一个事件之前机器或过程的状态发生了什么变化。换言之,用重演能用于确切找出就在那个时间之前控制器作过什么样的决定。

跟踪表寄存器84存储了跟踪表84中最后一个被记录的位置的地址。图4表示了寄存器84指向记录79,这是作为跟踪表82中要被填充的最后一个位置。当跟踪表在86处被填满时,该系统将继续存储新数据并且改写老数据。

下面对处理有限状态应用程序以及便于诊断在有限状态应用程序中意外情况的最佳实施例进行详细的描述。

图5、6、7、8、9、10、11、12和13是一些表示例行程序的流程图,这些程序同可编程序控制器一起控制了一个应用程序的处理过程。具体地说,在图5中,例行程序START    PROGRAM起动了可编程序控制器的各种指示字和表格。在图6中,例行程序FIRST    OPERATOR评价程序状态中的第一个语句。在图7中,例行程序ADVANCE    P-CODE    POINTER控制一个标准应用程序的指示字(P码指示字)。这个指示字指出了由该控制器执行的现行语句在存储器中的地址。图8中的例行程序ADVANCE    TASK    TABLE    REGISTER能指示出任务表寄存器指向哪一个循环记录。在图9中,例行程序NEXT    OPERATOR评价除该程序状态的不同于第一语句的所有语句。

图10中的GO    TO改变了哪一个状态在其出现它的程序循环中 是活动的,图11中的START启动状态的改变或者在启动语句规定的循环中建立一个活动状态。图12中的GOSUB和在图13中的RETURN提供了一种在该状态平下起作用的子程序调用和返回的工具。

参照图5,其中给出了例行程序START    PROGRAM的流程框图。这个程序起动该程序控制器。具体地说,在框122,控制器使任务表(图4b)、任务表寄存器(循环指示字)(图4c)和P码指示字初始化。用在存储器中指向第一个活动程序循环的程序循环记录来使任务表初始化。还有,该程序循环记录要被初始化至该程序循环中的第一个程序状态。用第一个活动程序状态即第一个语句的起始地址去初始化P码指示字。现在,该系统已经准备好去处理第一活动循环。在框124中,该系统调用子程序FIRST    OPERATOR以评价由该P码指示字指向的第一个语句。

图6中的流程框图描述了例行程序FIRST    OPERATOR。在框128处,控制器分析由P码指示字指向的语句的类型。碰到的第一个语句只能是一个状态型语句,或者是一个“状态”语句、一个“暂停”语句,或者一个“中断状态”语句。状态型语句是一个程序状态定界符,它代表一个程序状态的开始、暂停语句也能使其本身的程序循环暂停,但是允许处理其他活动的程序循环。中断状态语句也能使整个系统停止运行并且返回到管理程序以便向程序员发出警告:控制器已经中断了处理过程。如果在框130处碰到一个状态语句,通过进入在框132处的例行程序ADVANCE    P-CODE    POINTOR,该控制器使P码指示字前进至下一个语句的地址。如果在框134处该程序状态中碰到的语句是暂停状态语句,则该系统进入在框136 处的例行程序ADNCE    TASK    TABLE    REGISTER以使处理过程前进至下一个活动程序循环。如果碰到的语句是一个中断状态型语句,则进入在框138处的例行程序“GO    TO    MONITOR”

程序GO    TO    MONITOR在终端上给出一个信息以便向可编程序控制器的用户发生警告:已经达到一个中断状态并且已经停止了程序代码的执行。

参照图7,其中示出了例行程序ADVANCE    P-CODE    POINTER的详细框图。在框142处,P码指示字增加一个增量至该活动程序状态中的下一个语句处。通过进入在框144处的例行程序NEXT    OPERATOR,该控制器处理下一个语句。

当例行程序FIRST    OPERATOR(图6)碰到了暂停状态语句时,则进入例行程序ADVANCE    TASK    TABLE    REGISTER。这个程序的目的是忽略现行循环并转换至下一个程序循环的处理。图8示出了这个程序的详细框图。在框148处,任务表寄存器前进至该任务表内下一个程序循环指示字的地址。在框150处,进入例行程序FIRST    OPERATOR以处理该任务表内下一个程序循环的活动程序状态。当在框128处(图6)碰到一个状态型语句时,则控制器进到例行程序ADVANCE    P-CODE    POINTER    142(图8)。如上所述,这一程序使P码指示字前进至该程序状态中的下一个语句并且随后在框144处进入程序NEXT    OPERATOR。一个程序状态的第一个语句总是被FIRST    OPERATE评价。

图9是例行程序NEXT    OPERATOR的示意框图。这个程序的目的是评价一个程序状态中与该第一语句不同的任何类型的简单语句。在框154,控制器读出被P码指示字指向的下一个指令指示字。如 果下一个碰到的语句是一个状态语句,暂停状态语句或者是中断状态语句,则因为已经达到该状态字组的未端,控制器将在框158(图9)进入例行程序ADVANCE    TASK    TABLE    REGISTES。如果碰到的语句不是上述三个语句中的一个,则控制器在框160处要判断该语句是否是一个转向语句。如果该语句是一个转向语句,则在框162处进入程序GOTO。将在下面更详细地讨论这一例行程序。

如果该语句不是转向语句,则控制器将前进到框164并且确定是否该语句是一个开始语句。如果该语句是一个开始语句,则控制器将在框166处进入程序START。我们将会简短地讨论这一例行程序。

如果该语句不是一个开始语句,则控制器将前进至框168并且确定是否该语句是一个转子程序(Gosub)语句。如果它是一个转子程序语句,则控制器在框170处进入程序GOSUB。假若该语句不是一个转子程序语句,则控制器要在框172处决定该语句是否是一个返回语句。如果它是一个返回语句,则控制器将在框174进入程序RETURN。

如果该语句不是转向、开始、转子(程序)或返回型语句,则控制器前进至框174,并且控制器将该语句作为一个普通的控制语句来评价。普通的控制语句不影响程序状态的状况,或者换句话说,在现行的或者不同的程序循环中的活动状态改变时该程序状态还要继续进行处理。而转向、开始、转子程序和返回这种类型语句全都可能影响程序状态的状况和对应的活动程序循环。正如早些时候讨论过的,如果满足一组条件,则这些类型语句都要影响一个特定程序状态的状况。一旦控制器在框176处(图9)对普通的控制语句作出了评价, 则该控制器即进入例行程序ADVANCE    P-CODE    POINTER以评价该活动程序状态中的下一个语句。

图10是一个称之为GO    TO例行程序的框图。GOTO程序决定是否满足一组特定条件,并且如果满足,则使现行处理的循环中的活动状态变成由该转向语句指定的新值,然后向前去处理任务表中的下一个程序循环。GOTO程序提供基本的状态变化功能,由此活动状态的转换条件成立时就能使一个新的特定的状态变成活动状态以取代现行活动状态。一旦GOTO语句在一个状态中起作用,在该状态中就不处理任何一个其他的语句。

在图10的框182处,控制器评价根据对复合GOTO语句的条件部分的评价而得到的条件标记的状况。如果不满足复合GOTO语句中的这组条件,则控制器在框184处进入例行程序ADVANCE    P-CODE    POINTER。如果满足该条件,控制器将在186处调用子程序STORE    HISTORY。语句“STOREHISTORY”将一个“决定点”的地址和该程序循环的标识符保存到正被处理的现行循环的跟踪表(图3)内。决定点是该程序中该简单语句的地址23-23,在这一点上,控制器发现了含有该GOTO(转向)的复合语句的条件部分成立。在框188处,任务表内现行程序循环的记录被更新,所以简单变量94(图3a)指向一个新的程序状态的地址。然后在框190处调用程序ADVANCE    TASK    TABLE    REGISTER以更新任务表寄存器使其指向该任务表中的下一个程序循环指示字。

图11是一个称之为START的子程序框图。子程序START的目的是以开始语句中指定的一个状态启动其他任何程序循环的处理。相比之下,GOTO子程序仅能前进到对现行程序循环中存储的下一个 状态进行处理。

在图11的框194处,评价由对复合开始语句的条件部分的评价得到的条件标记的状况。如果该条件标志为假,则控制器在196处进入例行程序ADVANCE    P-CODE    POINTER。如果该条件标志为真,则控制器前进至框198,并且处理子程序STORE    HISTORY。子程序STORE    HISTORY保存决定点地址和现行循环的程序循环标识符。在框200,控制器决定该特定的程序循环现在是否活动以及是否被存储到任务表里。如果该程序循环已是活动的,则在框202处,控制器用要被激活的新的程序状态的地址改写当前存储在该程序循环指示字的简单变量94(图3a)中的地址。但是如果该程序循环现在不是活动的,则该系统将在框204把一个新的程序循环记录插入到该任务表里。该新程序循环记录通过其循环程序标识符的数值以数字次序被置于该任务表中。在框206处,该新程序状态的地址被写入该程序循环记录中。在框208处,控制器进入例行程序ADVANCE    P-CODE    POINTER,这样就继续进行下一个语句。

图12是程序GOSUB的框图。程序GOSUB影响活动程序循环的处理。这一程序使一个新的状态在现行程序循环中被激活并且使状况信息被保存。这样,一个相应的RETURN语句就在该GOSUB程序语句之后的下一个语句处将控制返回到包含该转向语句的状态。这就提供了一个状态水平上的子程序调用和返回功能。

参照图12的框210,评价复合GOSUB子程序语句的条件部分(由评价该条件部分得到的条件标记状况)。如果还不满足该条件,则控制器在框214进入例行程序ADVANCE    P-CODE     POINTER。但是,如果满足了该条件语句,则控制器将在框216调用子程序STORE    HISTORY。该子程序将把决定点和程序循环标识符都保存在跟踪表内。在框218,控制器将存储在P码指示字中的现行地址,现行活动的程序状态的地址以及其它的为相应的返回语句所用的必要状况信息都暂时保存在存储器内。在框220处,将该新的程序状态地址写入该程序循环记录90的简单变量94(图3a)中。通过在框222处进入例行程序FIRST    OPERATOR,控制器在新的程序状态中开始活动。

图13是例行程序RETURN详细的示意框图。返回语句的目的是使控制器返回到包含GOSUB语句的程序状态。换言之,一旦完成了执行由GOSUBROTINE(图12)调用的特定程序状态或状态图,该控制器将控制返回到在执行程序GOSUB时是活动的那个老的程序状态。这就要求恢复被GOSUBROTINE存储的各个状况值。

参照图13,在框224处,控制器评价由评价复合返回语句的条件部分得到的条件标记的状况。如果不满足该条件,则控制器在框226处进入例行程序ADVANCE    P-CODE    POINTER。但是,如果条件满足,则控制器在框228处调用STORE    HISTORY。该程序保存决定点地址和产生该地址的循环标识符。在框230,控制器恢复在框218程序GOSUB(见图12)保存的数值。然后进入在框232处的程序ADVANCE    P-CODE    POINTER以便继续在该老程序状态中进行处理。

图14、15、16和18是便利于应用程序调试的程序框图。具体地说,图14是子程序STORE    HISTORY的框图,它是一个用信息来更新跟踪表(图4)的子程序,并由程序GOTO、START、 GOSUB和RETURN调用。其余这几个图基本上是子程序的应用图,它们能使程序员按其自己的指令来观察存储在跟踪表、任务表或程序状态本身中的信息。具体地说,图15是一个称之为DISPLAY    HISTORY的子程序框图,它在终端80显示存储在跟踪表内的信息。图16和17分别是子程序DISPLAY    LINE和DISPLAY    PROGRAM    STATE。这两个程序负责显示特定程序状态的语句并且图示出在该程序状态中的什么地方是控制器决定要执行引起状态改变的转向、转子程序或返回语句的决定点。图18和19分别是DISPLAY    LOOP或FOUND    LOOP,它们显示活动的程序状态和被存储在任务表中相关的活动的程序循环。

只要一个程序状态的状况发生变化就要调用STORE    HISTORY。在子程序GOTO(图10的框186)、GOSUB(图12的框216)、START(图11的框198)和RETURN(图13的框228)中都要调用STORE    HISTORY。如前边讨论过的,STORE    HISTORY主要是将活动程序状态中的决定点地址和正被处理的程序循环的循环标识符保存在跟踪表内。

在图14的框236,评价存储在跟踪表指示字84(图3)中的地址。如果被跟踪表指示字指向的地址在跟踪表的末端,该跟踪表指示字将在框240被自动置到该跟踪表的始端。这一步骤使跟踪表似乎就象是一个无限的循环一样(见图4)。不管该指示字是否是在跟踪表的末端,总是将决点点的地址写入被该跟踪表指示字指向的记录中。此外,在框244,控制器还要将正在处理的循环的程序循环标识符保存到该循环记录中。在框248,控制器将返回到调用程序。

子程序DISPLAY    HISTORY使程序员能评价在处理一个应用 程序的过程中发生的程序状态的历史。在程序员想要看一看跟踪表存储的内容的显示时他就要启动这一程序。这个子程序以双轴表的形式显示跟踪表的内容。水平轴代表程序循环标识符以及与导致进入该跟踪表的转向、转子程序、返回或启动语句相对应的程序状态。垂直轴代表程序状态和程序循环顺序的次序,最新的状态在其顶部。DISPLAY    HISTORY是一个由用户在终端80(图1)直接启动的子程序。DISPLAY    HISTORY的典型打印输出可能是

活动    活动

程序    程序循环

状态    1    5    10    15    20

;显示该历史表的

;程序状态和程序标识符

0    2    2    ;行0表示状态2退出

(循环2)

1    3    1    ;行1表示状态3退出

(循环1)

2    2    1    ;行2表示状态2退出

3    3    1    ;行3表示状态3退出

4    2    1    ;行4表示状态2退出

5    200    2    ;行5表示状态200退出

(循环2)

6    1    1    ;行6表示状态1退出

7    1    1    ;行7表示循环2开始

8    end    ;在跟踪表中再无记录项目

要注意,在屏幕上首先显示出指令DISPLAY    HISTORY。然后横穿过屏幕顶部的是字“active    Program    States”和“active    Program    Loops”(“活动程序状态”和“活动程序循环”)。在这些说明的下方有两列分别指出活动程序状态和活动程序循环。在这个说明中的右手边提供有一个简短的注解,用于对每一行作出解释。在行0表示了最近一次引起状态变化的程序状态。在程序循环2中的程序状态2是产生变化的最后一个状态,在行7表示了引起变化的第一个程序状态和该状态所在的那个程序循环。行8表示了跟踪表的末端。

如果发生了意外条件从而在该应用程序内改变了活动状态预期的流动,则程序员可能很容易地通过观察在处理过程中所发生的程序状态的次序,将意外条件发生在哪个程序状态中的范围缩小。例如,假定在应用程序内在循环1中程序状态3不应该发生而发生了(该表中的行3)。则意外条件必定已经在程序状态2中发生,它是引起程序状态2变成状态3的循环1中前一个状态。程序员就要通过调用DISPLAY    LINF(图16)着重分析程序状态2以及使程序状态2变成程序状态3的条件。对这一程序下面将进行简短的讨论。

参照图15中的DISPLAY    HISTORY,在框252,控制器打印如上所述出现在屏幕顶部的标题。接着,在框254,将一份跟踪表和一份跟踪表指示字存储到一个缓冲器内。通过把跟踪表和跟踪表指示字置于一个缓冲器内,就能在要求“DISPLAY    HISTORY”时抽点打印存储在跟踪表内的内容,并且在允许继续更新主跟踪表时,在所需的时间长度内保持其不变。采取这一步骤的理由是,跟踪表是一种动态变化的表,它正不断地被更新,为了分析的目的,仅仅在发 出请求时该表的状况才被需要。在框256,该系统将得到存储在被存储的最后一个记录的跟踪表指示字中的地址。在框258,控制器将评价这一地址以确定该缓冲器是否是空的。如果该缓冲器是空的,则打印终止语句,并在框260控制器返回到它原始的处理过程。如果缓冲器不空,则在框262评价跟踪表以决定它是否指向缓冲器的末端。如果指示字是在缓冲器的末端,则在框264将跟踪表指示字置成缓冲器的首端。控制器用这种方式处理跟踪表中的内容就好象跟踪表是一个无限循环一样。不管跟踪表指示字是否在缓冲器的末端,总是在框266从该缓冲器获得循环标识符和状态地址。该决定点地址将在确定以前存储在该程序状态的状态定界语句中的程序状态编号时被用作一个起始点。在框268,程序状态编号和程序循环标识符将被打印在如上面画出的它们各自的列内。在框270,跟踪表指示字增加一个增量至缓冲器中的下一个记录,该程序将在框258继续被处理。该程序将重复循环271直到存储在跟踪表内的所有的程序状态和相应的程序循环全部被打印完为止。

在我们的上边的例子中,程序员知道:程序状态3不应发生而发生了。他也知道,意外条件必定发生在DISPLAY    HISTORY的行4的程序状态2期间。程序员可以通过调用子程序DISPLAY    LINE,更仔细地分析在程序状态2中发生的情况,并且能准确决定该程序状态变成程序状态3的原因所在。DISPLAY    LINE列出了该程序状态的语句,并且指出了在该程序状态中的哪一个状态上作出过使该程序状态的状况发生改变的决定。

现在参照图16,其中显示了子程序DISPLAY    LINE的详细框图。这一程序由程序员经终端80(图1)的调用而被直接启动。 在框274,程序员将指定他希望展开的是DISPLAY    HISTORY的打印输出中的哪一行。例如,因为他感兴趣的是从行4至行3所发生的情况,所以程序员要通过DISPLAY    LINE来展开行4,在框274,将所希望的DISPLAY    HISTORY的行数置成和变量“行计数”相等。在框276,控制器决定所选的行数是否落在了行数的有效范围内。如果没有,则控制器在框278返回到其正常的处理过程。假定行数在有效范围内,则在框280,跟踪表指示字将指向包含了行7数据的跟踪表内的最后的数据项目。下一步,在框290跟踪表指示字增加一个增量。在框292,控制器将决定跟踪表指示字是否指向该跟踪表缓冲器的末端。如果是,则在框296将跟踪表指示字置到跟踪表的始端。不管跟踪表指示字是否指向跟踪表的末端,控制器在框294都要评价“行计数”以确定“行计数”是否是0。如果行计数等于零,则不包括期望的程序状态,并且在框298进入DISPLAY    PROGRAM    STATE。如果“行计数”不等于0,则在框300“行计数”减1而跟踪表指示字加1。循环301重复发生直至在框296处“行计数”等于零,从而找到了所指的行。

图17显示了程序DISPLAY    PROGRAM    STATE的详细框图。在框304,控制器将决定被该跟踪表指示字指向的循环记录是否是空,如果该记录空,则该系统在框306将在终端80上打印一个语句:所请求的这一行无效,并且返回到其正常的处理过程。假定该记录不是空,则控制器在框308从该跟踪表抽出该决定点的地址并且确定具有该决定点的程序状态的起始地址。在框310,控制器将打印该程序状态的一个简单语句的文本。在框312,控制器将要进行检查,通过比较被打印的语句地址与存储在该跟踪表内的决定点地址 看它是否达到了该决定点。如果达到了该决定点,则在框314打印出状态“**DECISION    POINT**”。然后该控制器在框316进入该程序状态中的下一个语句。在框318,控制器将决定下一个语句是否是一个状态定界语句,状态语句、暂停状态语句或者中断状态语句。如果碰到这三个语句中的任何一个语句,则因为已经达到该状态字组的末端而使控制器在框320返回到其正常的处理过程。如果碰到的不是这三个语句中的任何一个,则处理过程经循环322继续到打印出所有的程序状态语句时为止。

图18是DISPLAY    LOOP的框图。DISPLAY    LOOP是一个显示任务表内容的子程序。参照以下一个典型的屏幕显示,在水平轴上展示的是循环标识符,在每一个程序循环中的活动程序状态被垂直地显示在每个程序循环标识符的下方。下面给出一个DISPLAY    LOOP输出的典型屏幕显示:

程序循环标识符    12345-30    31

程序状态标识符201    19    1。

在图18的框324,命令控制器打印如上所示的显示在屏幕第一行的循环标识符。框326将任务表寄存器置到该任务表中的第一个程序循环指示字。在框328将一个称之为“循环计数”的变量设置成等于0。在框330处,“循环计数”加1。然后控制器在框332判断“循环计数”是否等于能够存储在该任务表中的程序循环的最大数加1。如果这个条件成立,则控制器在框334返回到其原来的处理过程。如果循环计数不等于程序循环的最大数加1,则控制器在框336从相关的任务表得到该循环标识符。在框338检查该循环标识符以判断它是否等于0。如果该程序循环标识符为0,则该系统在框340返回到其正常的处理过程。如果该程序循环标识符不 等于0,则控制器在框342要判断该循环标识符是否等于“循环计数”。如果二者相等,则在框344处调用子程序FOUND    LOOP。如果二者不相等,则控制器在框348处使空格迅速横穿过屏幕列下一个循环位置。在框350,“循环计数”加1,并且重复框328后边的那些程序框直到该任务表中不再有活动程序循环时为止。

图19是子程序FOUND    LOOP的详细框图。在框354,访问存储在程序指示字中的活动程序状态的起始地址。从预先存储在该程序状态的状态定界语句中的数值选出该程序状态编号。在框356,将任务表指示字加到下一个程序循环指示字上,并且控制器在图19的框364返回程序DISPLAY    LOOP。

已经用举例和最佳实施例的方式描述了本发明,但本发明并不局限于此。本专业的技术人员应该认识到在没有离开本发明的基本构思和范围的情况下对本发明可以做出许多附加的修改和改进。例如一系列不同的软件技术和任何不同的软件语言都可能适合于实施所公开的发明。

但是作为说明,本发明的实际应用可能有助于实施本发明,其中利用了将要被描述的翻译程序来执行一个中间码或“伪码”(P码)该翻译程序能够基本上以一个或多个状态图的形式来写一个应用程序,每一个状态图都确定一个机器或过程的一部分操作。由此,任何一个单独的状态都在一个有限的时间区间里确定了被发送到该机器或过程的输出信号和其它数据。

下述的翻译程序使用了一个RCA    1802微处理机,并用一个交叉汇编程序形式250A.P.Inc来汇编。

该翻译程序用于执行其中具有下述内容的应用程序:

1)一个任务表,即一个指示在每一个循环中活动的状态的表, 并包含了循环变量;

2)一个跟踪表,在显示时能使程序循环中的状态变化被跟踪。

该翻译程序的细节如下

PEGISTER    ASSIGNMENT    FOR    COSINT

;R0    不用

;R1    中断

;R2    D堆栈指示字

;R3    程序计数器

;R4    调用指令指示字

;R5    返回指令指示字

;R6    调用连接

;R7    上托(POP)指令指示字

;R8    Macr调用指示字

;R9    返回地址堆栈指示字

;RF    指向P码

;RE    指向任务表

;RD    指向数据页

;RC    决定点地址

;RB    指向跟踪表

;RA    能指向数据页

;X    正常置成RF

;OF    用作条件标记

;X,PF    必须加以保护的保存正常值

;如果受到除上述规定外的其他动作的影响

RAMSIZE    EQU    2000H

NOTRACEMSK    EQU    80H

OPMAPSZ    EQU    32

IPMAPSZ    EQU    32

NUMOFL    EQU    21    循环数

;每一个循环在任务表中数据的次序是:

TTLOOP    EQU    0

TTSTATE    EQU    TTLOOP+1

TTONCE    EQU    TTSTATE+2

TTACCUM    EQU    TTONCE+1

TTEXTEM    EQU    TTACCUM+1

TTSTATESTR    EQU    TTEXTEN+1

TTONCESTR    EQU    TTSTATESTR+2

TTRTNAD    EQU    TTONCESTR+1

TTLENGTH    EQU    TTRTNAND+2

;macros

CALL    MACRO    ADDRESS

MACLIST    ON

SEP    R4

DW    ADDRESS

MACLIST    OFF

ENDM

RTN    MACRO

MACLIST    ON

SEP    R5

MACLIST    OFF

ENDM

LXI    MACRO    REG,ADDRESS

MACLIST    ON

LDI    >ADDRESS

PHI    REG

LDI    <ADDRESS

PLO    REG

MACLIST    OFF

ENDM

PAGE    MACRO    NUMFROMEND

IFMA    1

DS <(100H-<NUMFROMENO-< )

ELSE

DS<(100H-< )

ENDIF

ENOM

;ROUT    INES    NOT    LISTED

;CALL    是被修改的RCA标准调用程序,用于保

存寄存器

;RTN    是被修改的RCA标准调用程序,作为

CALL用

;CALL    PRINT    和硬件相关-在终端打印被下边的两个字节

指向的正文

;    字符串

;CALL    TYPE2D    和硬件相关-打印累加器D的十进位值

;CALL    TYPE4I    和硬件相关-打印被寄存器RF指向的2个字

;    节的十进位值

;CALL    COMPRT    和硬件相关-打印出被RD指向的指令

;    RD返回,指向下一个P码指令

;    RB被讹误

;下述是被宏MACR    调用的程序

;MACR    BMINA    做16位减法RB=RB-RA

;MACR    IFBISO    如果寄存器RB=0返回DF置位

;MACR    TEPON    通过RD指向一个P码指令

;    (A)被加入并且返回下面:

;    RD指向下一个P码指令(B)

;    RB指向(A)的P码记号

;    如果P码指令(A)要求编译

;    DF置位

D包含指令(A)的长度RC指向包含描述

指令类型标记的两个字节

;MACR    SDIR    是一个存储器指向的程序

;POSH    POPR    将一个寄存器压入堆栈并且将其上托

;INCT    PROCESS    STATE

;多循环的辅助操作

INCT:

GLO    RE

ADI    TTLENGTH-TTONCE+TTSTATE

PLO    RE

GET    STP:

LDA    RE

BNZ    MORE;循环数大于0

GET    SPTI:

;完成了所有活动循环,故检查运行是否

;在监测器控制下

LXI    RA    MONFLAG

LDN    RA

LBN2    MONITORI    ;转向监督程序

ST    ART    INTER:;只有翻译程序运行

CALL    IOSCAN;更新所有的IO

BDF    OFFLINEX    1

;PUT    FIXED    VALUES    BACK    IN    RD

LDI    >OPMAP

PHI    RO

LXI    RC,INPOUT;对终端中断做检查

LDA    RC

STR    R2

LDN    RC;得到输入缓冲器的指示字

XOR    ;并且比较它们(=设备空)

BZ    CSRENT

OFFLINEX:

LOI    3    ;终端中断

OFFLINEX1:

MACK    SDIR

DW    MONFLAG

LBR    MONITORI

CSRENT:

;建立    RB

LXI    RB,TRCTAB

;指向第一循环

LXI    RE,(TT+TTSTATE)

SEX    RF

LDA    RE

;SET    UP    P    COOE    POINTER    FROM    TASK    TABLE    MORE:

PHI    RF

PHI    RC

LDA    RE

PLO    RF

PLO    RC

INC    RC    ;建立跟踪起始决定

;点

;THE    FIRST    OPERATOR    MUST    BE    STATE,PAUSE    STATE

;OR    BREAK    STATE    AND    THESE    REQUIRE    SPECIAL

TREATMENT

SMI    00    ;第一次置DF

LXI    RA,ONCEMASK

LDI    1

STR    RA;对一次掩码初始化

LDA    RF

;ONLY    3    OPERATORS    ARE    LEGAL    HERE.

PLO    RA

XRI    <STATE

LBZ    STATEII

GLO    RA

XRI    <PSST

LBZ    INCT;PAUSE    STATE    TUST    OMITS

;PROCESSING    THIS    LOOP.

;PROCESS    A    BREAKSTATE    INSTRUCTION

TRPST:

LXI    RA,STATESTORE

LOA    RF;PUT    STATE    NUMBER    IN

STATESTORE

STR    RA

INC    RA

LDN    RF

STR    RA

DEC    RF

DEC    RF;DECR    TO    BREAK    STATE    OPERATOR

LXI    RA,MONFLAG

LDI    2

STR    RA;MONFLAG

LBR    MONITOR    1;GO    TO    MONITOR

;自每一功能的出口程序

I3:INC    RF

STATEII:

I2:INC    RF

I1:INC    RF

NXTOPR:LDA    RF;从P码得到下一个记号

LBR    VBR    1

PAGE

VBR1:PLO    R3;转移到翻译程序的

;服务例行程序

;INTERPRETER    TABLE

ITEPTTBL:

AIFO:LBR    AIFOI;ANO    IP/FLAG    ON

OIFO:LBR    OIFOI;OR    IP/FLAG    ON

IIFO:LBR    IIFOI;IF    IP/FLAG    ON(1)

SOF:LBR    SOFI;SET    OP/FLAG

GOTO:LBR    GOTOI;GO    TO

STATE:LBR    STATEI;STATE

PSST:LBR    PSSTI;PAUSE    STATE

BRST:LBR    BRSTI;BREAK    STATE

REM:LBR    REMI;REMARK

HALT:LBR    HALTI;HALT    INSTRUCTION

START:LBR    STARTI;START    INSTRUCTION

PAGE

;SKIP    TABLE

;(这必须和翻译程序表在

;同一级别)

SKIP:DB    0

BR    SKIP    2;AND    IP/FLAG    ON(3个字

;节的指令)

;(跳过下边两个字节)

NOP

BR    SKIP    2;OR    IP/FLAG    ON

NOP

LBR    VBR1;IF    IP/FLAG    ON

LBR    VBR1;SET    OP/FLAG

LBR    VBR1;GO    TO

LBR    VBR1;STATE

LBR    VBR1;PAUSE    STATE

LBR    VBR1;BREAK    STATE

LBR    VBR1;REMARK

LBR    VBR1;HALT

LBR    VBR1;START

SKIP    2:INC    RF

SKIP    1:INC    RF

SKIPO:LDA    RF

PLO    R3

;-SET    OUTPUT,FLAG-

SOFI:BWF    I2

LDA    RF

PLO    RD

LDN    RD

OR

STR    RD

BR    I1

;AND,OR,IF-IP-,-FLAG-“ON”

AIFOI:BDF    IIFOC;‘AND’ENTRY

BR    I2;其他出口

OIFOI:LBDF    SKIP    2;“OR”ENTRY:

IIFOI:SMI    OO;“IF”ENTRY:置条件

;标记

IIFOC:GHI    RF;存储决定点

PHI    RC

GLO    RF

PLO    RC

LDA    RF    ;建立输入地址

PLO    RD

LDN    RD

AND;进行检查

BNZ    I1    ;退出,如果输入等接通

;(标志=1)

ADI    OO;否则设置标志-0

BR    I1    ;然后退出

HALTI:

LBNF    NXTOPR;如果条件为真

;舍弃以下代码

;THIS    IS    THE    END    OF    THE    STATE,DO    THE    NEXT    LOOP

;-    STATE-

STATEI:

;-    PAUSE    STATE    -

PSSTI:

;-    BREAK    STATE    -

BRSTI:

LBR    INCT

;-    GO    TO    COMMAND-

GOTOI:LBNF    I2

CALL    STOREHIST

DEC    RE

DEC    RE    ;指向P码地址

LDA    RF

STR    RE    ;变到新状态

INC    RE

LDA    RF

STR    RE

INC    RE

LDI    O

STR    RE;清除ONCE标记

LBR    INCT

STOREHIST:

DEC    RE

DEC    RE

DEC    RE

LDA    RE    ;循环号数

INC    RE

INC    RE

STR    R2;保存循环号数

ANI    NOTRACEMSK;被启动没有?

NBZ    STOREHISTX;没有

SEX    RB

LDN    RB    ;跟踪表指示字

BNZ    RSTTPT6;在表的末端处重置

LDI    <(TRCTAB+OFFE);在跟踪表中绕回

RSTTPT6:

PLO    RB

;FIRST    SAVE    P    CODE    POINTER

;THEN    LOOP    NUMBER    INFO    进入以前的跟踪表

GLO    RC    ;决定点

STXD

GHI    RC

STXD

LDN    R2

STXD

GLO    RB

STR    R2

LDI    <TRCTAB

PLO    RB

LDN    R2

STR    RB    ;保存现行的跟踪表

;指示字

STOREHISTX:

SEX    RF

RTN

;……    REMARK    COMMAND    ……

REMI:LDA    RF

STR    R2

LDA    RF

PLO    RF

LDN    R2

PHI    RF

LBR    NXTOPR;JUMP    OVER    PRINT    DATA

;BY    READING    ADDRESS    OF

;NEXT    OPR    STORED    IN    P-CODE

;START    COMMAND    IS:-

;START,LOOP    NUMBER,NEW    START    ADDR,NEXTOPR

STARTI:

STTS:

CALL    ONCETEST

LBZ    I3

CALL    STOREHIST

;必要时安排RE

DEC    RE

DEC    RE

DEC    RE

LDA    RE    ;取得循环号数

INC    RE

INC    RE

ANT    .NOT.NOTRACEMSK

SD    ;与正被启动的循环比较

BDF    STARTOK

GLO    RE;安排RE

ADI    LTTLENGTH

PLO    RE

STARTOK:

CALL    SEARCHTT

LDI    >OPMAP

PHI    RD

SMI    O

SEX    RF

LBR    NXTOPR;FINISH    THIS    STEP

SEARCHTT:;通过任务表搜索循环号数,

;并用RA,RB,RD和RF,SexRF

;设置新的循环

SEX    RF

LDI    NUMOFL+1

PLO    RB

LDI    >TT

PHI    RA

PHI    RD

LDT    <TT

PLO    RA

LDI    <TTEND

PLO    RD

LPFD:DEC    RB

GLO    RB

LBZ    NOVAD

LDN    RA

BZ    LEQZ

ANI    .NOT.NOTRACEMSK

SD;将这一循环号数与〔RF〕

;比较

BZ    LEQZ

BNF    SHLP

GLO    RA

ADI    <TTLENGTH

PLO    RA

BR    LPFD

SHLP:SEX    RD

GLO    RD

SMI    <(TTLENGTH-1)

PLO    RA

GLO    RB

STR    R2;存贮计数

SLPA:LDN    R2

SMI    1

BZ    LEQZ

STR    R2

LDI    TTLENGTH

PLO    RB

SLPA2:

DEC    RA

LDN    RA

STXD

DEC    RB

GLO    RB

BNZ    SLPA2

BR    SLPA

LEQZ:LDA    RF

STR    RA

INC    RA

LDA    RF

STR    RA

INC    RA

LDA    RF

STR    RA

GLO    RA

ADI    <(TTLENGTH-TTONCE)

PLO    RA

LDI    0

SEX    RA

STXD

STXD

STXD

STXD

STXD

STXD

NOVAD:

LPI    0

PLO    RB

RTN

ONCETEST:

;本程序由在条件为真后要发生一次的程序调用

;若程序要运行,用非零退出

;一个ONCE    MASK指向循环中的现行比特位

;ONCE    FLAG用于调用这个程序的特定程序,

;每当这个程序被调用时,这个掩码被向左移一位:因此,由于这里

;所描述的形式的实际原因,在任何一个STATE中允许使用这一功

;能的程序最大为8个

;逻辑:

;SET    ZERO:=0

;ONCEBIT:=ONCEMASK.AND.ONCEFLAG

;IF(ONCEBIT=0    AND    DF=1)

;THEN

;ONCEBIT:=1

;ZERO:=1

;IF(ONCEBIT=1    AND    DF=0)

;THEN

;ONCEBIT:=0

;ONCEMASK:=ONCEMASK.SHIFTED    LEFT.

LXT    RA,ONCEMASK;指向一次掩码

SEX    RA

LDN    RE;取得一次标记

AND;试验

BNZ    ONCE1

BNF    ONCE2

;做它的唯一时间

LDN    RE;once=1

OR

STR    RE    ;置换一次字节

LDI    1

BR    ONCE    3    ;清除零标记

ONCE1:

BDF    ONCE    2

;把一次标记重置成零

LDN    RE

XOR    ;once=0

STR    RE

ONCE    2:

LDI    0

ONCE    3:

SHLC    ;保存零和DF

PLO    RD

LDN    RA

SHL    ;再一次移动掩码

STR    RA

GLO    RD

SHR    ;恢复零和DF

SEX    RF

RTN

ISOCAN:;本程序依赖于微处理机的硬件结构,因此留给读者去实现

;该程序把OPMAP的内容转化成实际的大量输出,并把实

;际的大量输出转化成IPMAP

;OPMAP和IPMAP是在一个256个字节的页面上按以下

;方式构造的两个邻接的32个字节的字组:

;输入位0是TPMAP的最低有效字节中的最低有效位(代

;表1Hex)

;输入位1是IPMAP最低有效字节中的次低有效位(代

;表2Hex)

;并依次类推,直到输入位255是IPMAP的第32个字

;节中的最高有效位(代表80Hex)

;对输出位有类似结构

RTN

MONITOR1

;一个既能操纵翻译程序又能调用以下任一程序的系统监督程序:

;DISPHIST;按照它们发生的次序显示每个循环中状态变化的表格

;DISPLINE;通过打印有关的程序状态并指出转换方程成立的位置

;显示被扩展的上述表格中的一行

;DISPLOOP;显示每个循环中的现行状态

DISPHIST:

;PRINT    THE    CHANGES    THAT    HAVE    BEEN    STORED    IN

THE    TRCTAB    CALL    PRNTHEAD;NOW    PRINT

HEADINGS

;NExT    THE    CHANGES    AS    STORED    IN    THE    TRACE    TABLE.

LXI    RD,TRCTAB-

LDN    RD

PLO    RD

LDI    O

PLO    RC    ;行数计数器

DISPHIST1:

CALL    BREAK    ;检查由终端来的中断

BNZ    DISPHISTR    ;退出

GLO    RC

SMI    (256/3)    ;跟踪表中的步数

BDF    DISPHISTX;PRINT    LINE    NUMBER

GLO    RC

CALL    TYPE    2D

CALL    PRINT

DW    SPACEMSG

INC    RD

GLO    RD

BNZ    DISPHIST2

DEC    RD    ;绕回之后重置指示字

LDI    1

PLO    RD

DISPHIST2:

LDN    RD

XRI    OFFH    ;是否空?

BZ    DISPHISTX-

LDA    RD;GET    LOOP    NUMBER    FROM

;TRACE    TABLE

PSH    ;保存

;TYPE    STATE    NUMBER.

DISPHIST4:

GLO    RC

PSH

CALL    STPADR

POP

PLO    RC

CALL    TYPE41    ;打印状态号数

;对和循环号数相同的列号数,横穿页面每5列打印一个点

POP;取得循环号数

PSH

ADI    1    ;额外的空格

PLO    RA    ;循环计数器

LDI    6

DISPHIST5:

PLO    RB    ;点计数器

DISPHIST6:

DEC    RA

GLO    RA

BZ    DISPHIST8;找出正确的循环

DEC    RB

GLO    RB

BZ    DISPHIST7

CALL    PRINT

DW    SPACEMSG

BR    DISPHIST6

DISPHIST7:

CALL    PRINT

DW    DOTMSG

LDI    5

BR    DISPHIST5

DISPHIST8:

POP

CALL    TYPE2D    ;现在打印循环号数

CALL    PRINT

DW    CRMSG

INC    RC

BR    DISPHIST1

DISPHISTX:

CALL    PRINT

DW    ENDMSG

DISPHISTR:    ;EXIT    FROM    THE    PRINT    TRACE    ROUTINE    RTN

PRNTHEAD:

CALL    PRINT;打印其指示字是以下的字符串

DW    CRMSG;指向CR,0

CALL    PRINT

DW    SPACE7MSG;7个空格

CALL    PRINT

DW    ONEMSG    ;1

LDI    5    ;LOAD    FIRST    LOOP    NUMBER

;FOR    HEADING

PLO    RD

PRNTHEAD1:

GLO    RD

CALL    TYPE2D;CONVERT    TO    DECIMAL    AND

;TYPE    OUT

CALL    PRINT

DW    SPACE    2MSG    ;2个空格

GLO    RD

ADI    5

PLO    RD

SMI    NUMOFL    ;循环的最大号数

BNF    PRNTHEAD1

PRNTHEADX:

CALL    PRINT

PW    CRMSG

RTN

;STPADR    IS    A    CALLABLE    ROUTINE    TO    EXTRACT    THE    NUMBER    OF

;THE    STATE    WHICH    APPLIES    TO    ANY    BUFFER    POINT    VALUE.

;ENTRY    WHERE    SEARCH    ADDR    IS    OBTAINED    FROM(RD)。

;EXIT    IS    WITH    RF    POINTING    TO    THE    STATE    NUMBER

STPADR:

LDA    RD

PHI    RA

LDN    RD

PLO    RA

DEC    RA

PUSH    RD

LXI    RD,PGMSTT

STPADR3:

MACR    STEPON;TEST    FOR    STATE,

BREAKSTATE

;OR    PAUSESTATE

BNF    STPADR4;非编译型

INC    RC

LDN    RC

ANI    <STATEMASK

BZ    STPADR4;不是一个状态型

;NEXT    SAVE    THE    ADDR    OF    STATE    FOUND

GLO    BR

PLO    RF

GHI    RB

PHI    RF

STPADR4:

MACR    BMINA    ;比较地址

;RB=RB-RA

BNF    STPADR3    ;没有通过目标地址

INC    RF

POPR    RD

RTN

;PRINT    THE    REASON    WHY    A    CHANCE    OF    STATE    OCCURED    DISPLINE:

CALL    GETPARM1;在RA中取得需要的行号数

GLO    RA

SMI    84

LBDF    DISPLINER;IF    MORE    THAN    LINE    84

;ASKED    FOR    PRINT    QUERY

LXI    RD,TRCTAB

LDN    RD

PLO    RD

;RD    IS    NOW    POINTER    TO    TRACE    TABLE

DISPLINE1:

INC    RD

GLO    RD

BNZ    DISPLINE2;@END    OF    TRACE    TABLE?

DEC    RD

LDI    1

PLO    RD

DISPLINE2:

GLO    RA

BZ    DISPLINE3

DEC    RA

INC    RD

INC    RD

BR    DISPLINE    1    -

;HAVE    GOT    TO    THE    LINE    REQUESTED    IN    THE    TRACE    TABLE

;NEXT    CHECK    IF    IT    CONTAINS    AN    FFN    EMPTY    INDICATOR。

;IF    IT    DOES    PRINT    QUERY

;IF    NOT    THEN    CAN    PRINT    STATE    CONTENTS

DISPLINE3:

LDA    RD    ;表格入口空否?

XRI    OFFH

LBZ    DISPLINER

CALL    STPADR    ;TRACED    VALUE    OF    P    CODE

;IS    IN    RA,STATE    NUMBER

;IS    POINTED    TO    BY    RF

GLO    RF

PLO    RF

PLO    RB

GHI    RF

PHI    RD

PHI    RB

DEC    RB

DEC    RD

DISPLINE4:

CALL    BREAK

LBNZ    DISPLINEX

PUSH    RA

PUSH    RB

CALL    COMPRT    ;打印出指令

POPR    RB

POPR    RA

MACR    BMINA    ;我们已通过了决定点吗?

MACR    IFBISO    ;测试RB=0

BDF    DISPLINE5    ;不

CALL    PRINT    ;是    所以如此打印出来

DW    DECISMSG

DISPLINE5:

PUSH    RD

MACR    STEPON

POPR    RD

INC    RC    ;我们是处在一个状态的结束处吗?

LDN    RC

ANI    <STATEMSK

BNZ    DISPLINEX;是,所以结束

DISPLINE6:

LBR    DISPLINE4

DISPLINER:    ;PRINT    QUERY

CALL    PRINT

DW    NVALIDMSG

DISPLINEX:    ;EXIT    FROM    TRACE    LINE    ROUTINE    RTN

DISPLINX1:

CALL    PRINT

DW    HISTMSG

RTN

DISPLOOP:    ;DISPLAY    LOOP    ROUTINE

;PRINT    EXISTING    STATE    NUMBERS

CALL    PRINT

DW    SPACE    3MSG

LXI    RD,TT

LDI    O

PLO    RB

GETNT:INC    RB

GLO    RB

SMI    NUMOFL-1

BZ    PRSEX

LDN    RD    ;从任务表中取得循环号数

BZ    PRSEX

NEXE:

SEX    RD

GLO    RB

XOR    ;把现行的循环同要求的比较

BZ    FDOK

CALL    PRINT

DW    SPACE4MSG

INC    RB

BR    NEXE    ;TRY    NEXT    ONE

FDOK:INC    RD    ;发现了所以打印循环号数

LDA    RD

PHI    RF

LDA    RD

PLO    RF

INC    RF

;取得最前的2位数字

CALL    TYPE4I

GLO    RD

ADI    <(TTLENGTH-3);已经增加三次

PLO    RD    ;移至表中的下一个任务

BR    GETNT    ;寻找下一个

PRSEX:SEX    R2

CALL    PRINT

DW    CRMSG

RTN

;正文

DOTMSG    DB    ‘”’,0

SPACE9MSG    DB    ‘’

SPACE8MSG    DB    ‘’

SPACE7MSG    DB    ‘’

SPACE6MSG    DB    ‘’

SPACE5MSG    DB    ‘’

SPACE4MSG    DB    ‘’

SPACE3MSG    DB    ‘’

SPACE2MSG    DB    ‘’

SPACE    MSG    DB    ‘’,0

NTRACEMSG    DB    ‘NO    TRACE',ODH

DECISMG    DB    ‘**DECISION    POINT**',8DH,ODH

ENDMSG    DB    ‘END'

CRMSG    DB    ODH

DATA

;任务表

TT:DS    TTLENGTH    NUMOFL-1;THE    FIRST

PART    OF

THE    TASK

TTEND:DS    1;THE    LAST    TASK    TABLE    ENTRY

;THE    ORDER    OF    THE    DATA    IN    THE    TASK    TABLE    FOR

EACH    LOOP    IS

;TTLOOP    DS    0

;TTSTATE    DB    O,O

;TTONCE    DB    O

;TTACCUM    DB    O

;TTSTATESTR    DB    O,O

;TTONCESTR    DB    O

;TTRTNAD    DB    O,O

;ONCEMASK    DB    O    ;用于一次操作

PAGE

;THE    TRACE    TABLE

TRCTAB    ;第一个字节是指向该表中当前

;位置的指示字的低字节,表格

;正在进行存贮以前的数据

;表格的格式是:

;每个登记项目是三个字节长

;表格从顶部(TRCTABF)向下朝底部(TRCTAB+1)填满。当

;其到达底部后,再次绕回到顶部。

;三个字节按以下次序贮存:

;决定点的低字节

;决定点的高字节

;循环号数

;NOTE    THAT    THE    TRACE    TABLE    IS    255    BYTES    LONG

PLUS    IT′S    POINTER

PAGE.1

IRCTABF:

PAGE

;THE    FOLLOWING    AREA    IS    USED    BY    THE    MORNITOR

MONFLAG:    DS    1;0=运行翻译程序

;1=在监督程序中或由功率上升运行

;2=由中断状态操纵

;3=由一个终端停止操纵

STATESTORE:DS2;来自断开状态的状态号数

;输入缓冲器和来自终端的指示字

INPOUT    DB    O

INPOUT    DB    O

ECHOOUT    DB    O

INPBUF    DS    INPBUFSZ

INPBUFND    DB    O

RATOP: DS OAFH-<

RASTK:DS    1    ;RETURN    ADDRESS    STACK-SUBS

CAN    BE    40    DEEP

S2TOP:DS    1    ;-80字节

PAGE1

STK2:DS    1;THE    NORMAL    STACK    WITH

;REG    2    AS    POINTER

PAGE。

;THE    OUTPUT    MAP    STARTS    ON    A    PAGE    BOUNDARY

;OUTPUT    MAP

OPMAP:    DS    OPMAPSZ-1    ;输出0是这里的比特位0

OPMAPN:DS    1    ;输出255是这里的比特位7

;INPUT    MAP

IPMAP:DS    IPMAPSZ-1

IPMAPN:DS    1

FGMAP:DS    IPMAPSZ-1

FGMAPN:DS    1

;THE    P    CODE    AREA,THE    INTERPRETER    PROGRAM

MEMORYSTT:

PROGEND:DS    2    ;存贮该程序的末端

;(长度信息)

CHKSM:    DS    2    ;存贮该程序

PROCNUM:DS    1;PROCESSOR/PROGRAM    NUMBER.

COMFLAG:DS    1    ;FLAGS    P-CODEIS    IN    THE

;COMPILEDOR    UNCOMPILED    STATE

;0=编译控制

;1=非编译控制

PGMSTT:;P码由此开始

BUFTOP:

INTPGM:DS RAMSIZE- -1

BUFBOT:DS    1

END

利用上面的翻译程序码,使一个应用程序码得以被执行。

本发明使以下能够实现:

1.由于能够在该程序中设置“俘获”或“断开点”或“暂停”或“停顿”并由于能由监督程序使该程序运行、暂停或停止:

一个以有限状态型式的语言写成的控制程序能由监督程序使之运行或停止。该控制程序或其部分也能被控制程序自身的指令暂停、停顿或停止。在下面的例子中起这些功能的指令是:

PAUSESTATE    当控制被传送到那个特定状态时它使那个特定循环

暂停或停顿。

BREAKSTATE    当控制被传送到一个具体状态时使该整个程序停止

运行并以“联机”或“脱机”方式返回监督程序。

HALT    它是一个条件指令,它使所有在它之后的指令在它的状态中被忽略。

2.能有选择地或用别的方式记录程序状态变化的历史并能显示这些变化:

该程序是以这样的步骤来存贮历史的:

在执行能够影响改变状态的决定的每个指令期间,(转换功能的 任何部分),它在程序中的位置被暂时记录下来。在转换功能变真的以及控制被送到另一个状态的时候,该瞬时的信息和识别该特定循环的信息被转移到历史变化表(TT跟踪表)。在翻译程序码中在MORE,IIFOC和STOREHIST内就表示了这样的一个例子。

3.显示历史变化和引起变化的操作:

这只要求把跟踪表或任务表的内容以一种方便的形式打印出来或显示出来。下面例子表示了三种这样的方法。

第一种方法,借助从任务表中得到要求的信息,显示在所有活动循环中的现行活动状态的识别符。

第二种方法是显示作为两轴表的跟踪表内容。水平轴代表发生了变化的循环,而竖直轴代表变化的时间顺序。

第三种方法借助列出程序有关部分和指出表中最后作出改变状态决定的点,来显示按第二种方法得到的表中任何选定的一行中出现的变化及引起该变化的事件或事件组。

例1:

然而,应该清楚地理解,下面的表仅是为了说明,不应被认为是规定发明的界限。

STATE    1    程序开始

SAMPLE    PROGRAM    TO    ILLUSTRATE

DEBUGGING    USING

HISTORICAL    RECORDING

START    LOOP    2    WITH    200    在状态200启动第二

个循环

GO    TO    2    无条件的状态变化

STATE    2    程序结构

SET    OP    2    控制输出(OP表示输出)

IF    IP    3    OW    转换方程(IP表示输入)

OR    IP    7    ON

GO    TO    3    目标

STATE    3    下一个有限状态

SET    OP    3

IF    IP    5    ON    第二个转换方程。

GO    TO    2

IF    IP    4    ON    第三个转换方程

GO    TO    2    第三个目标

STATE    200    循环2

GO    TO    201    无条件的转换

STATE    201

IF    IP    6ON

GO    TO    202

BREAKSTATE    202    程序中的中断点或俘获

END

DISPLAY    OF    THE    HISTORICAL    TRACE    FOR    THE    ABOVE

PROGRAM(是监督程序的提示)

GO;开始操作该程序

Psc    Monitor-BREAK    AT    STATE    202

;程序在中断点已被停止

DI    LOOP;监督程序命令请求显示每个

循环中的现行状态

2    202;这是响应,显示了现在在

状态2中的循环1和在状

态202中的循环2

DI    HI;显示历史表

LI    STATE    15    10    15    20;循环号数(最新的在顶端)

0    201    2;行0表示状态201退出

(循环2)

1    3    1;行1表示状态3退出

2    2    1;行2表示状态2退出

3    3    1;行3表示状态3退出

4    2    1;行4表示状态2退出

5    200    2;行5表示状态200退出

(循环2)

6    1    1;行6表示状态1退出

7    1    1;行7表示循环2被启动

(最旧的)

8    ENO    ;表中不再有项目

STATE    1

**DECISION POINT**;无条件决定

;“SAMPLE    PROGRAM    TO    ILLUSTRATE”

;“DEBUGGING    USING”

;“HISTORICAL    RECORDING”

START    LOOP    2    WITH    200

GO    TO    2

DI    LI6;显示扩展后的行6

STATE    1

**DECISION POINT**;无条件决定

;“SAMPLE    PROGRAM    TO    ILLSTRATE”

;“DEBUGGING    USING”

;“HISTORICAL    RECORDING”

START    LOOP    2    WITH    200

GO    TO    2

DI    LI    5;显示扩展后的行5

STATE    200

**DECISION POINT**;无条件决定

GO    TO    201;无条件转移

DI    LI    4;显示扩展后的行4

STATE2

IE    IP    3    ON

OR    IR    7    ON

**DECISION POINT**;输入7的出现引起该程序

GO    TO    3;改变到状态3

DI    LI    3;显示扩展后的行3

IF    IP    5    ON

**DECISION POINT**;输入5的出现引起该程序

GO    TO    2;改变到状态2

IF    IP    4    ON;这个转换方程被舍弃

GO    TO    2

DI    LI2;显示历史表被扩展的行2

STATE2

SET    OP2

IF    IP    3    ON

**DECISION POINT**;输入3的出现引起该程序

OR,IP    7    ON;改变到状态3

GO    TO    3

DI    LI1    ;显示被扩展的行1

STATE3

SET    OP    3

IF    IP    5    ON;这个转换方程不成立

GO    TO    2

IF    IP    4    ON

**DECISION POINT**;输入4的出现引起该程序

GO    TO    2;改变到状态2

DI    LI    O;显示被扩展的行0

STATE    201

IF    IP    6    ON

**DECISION POINT**;输入6的出现引起该程序

GO    TO    202;转换

CODE    GENERATED    FROM    THE    ABOVE    PROGRAM    THAT    IS

INTERPRETED    BY    THE    MULTI-TASKING    CONTROL

PROGRAM    INTERPRETER    UNDER    SUPERVISION    OF    THE

MONITOR

左边的列表示存贮器地址,右边的数据被存贮在控制器存贮器中的该地址。我们将把下面的码叫作P-码(程序码)。

(为了更加清楚,该程序以靠近相应的数据处的评语被重复)。

XOOO    100001;STATE1

XOO3    19    XO    1F    5341D504C;;“SAMPLE    PROGRAM    TO

ILLUSTRATE”

4520505241

4D20544F20

494C4C5553

5452415445

XO1F    19    XO    31    4445425547;;“DEBUGGING    USING”

47494E4720

5553494E47

XO31    19    XO    48    484953544F;;“HISTORICAL

RECORDING”

524943414C

205245434F

2544494E47

XO48    IF    02    XO    70;START    LOOP    2    WITH

200

XO4C    OD    XO    4F;GO    TO    2

XO4F    10    00    02;STATE    2

XO52    OA    00    08;SET    OP    2

XO55    07    20    08;IF    IP    3    ON

XO58    04    00    80;OR    IP    7    ON

XO5B    OD    XO    5E;GOTO    3

XO5E    10    00    03;STATE    3

XO61    OA    00    08;SET    OP    3

XO64    07    20    20;IF    IP    5    ON

XO67    OD    XO    4F;GOTO    2

XO6A    07    20    10;IF    IP    4    ON

XO60    OD    XO    4F;GOTO    2

XO70    10    00    CB;STATE    200

XO70    OD    XO    76;GOTO    201

XO76    10    00    C9;STATE    201

XO79    07    20    40;IF    IP    6    ON

XO7C    OD    XO    7F;GOTO    202

XO7F    16    00    CA;BREAK    STATE    202

XO82    16    00    00;PROGRAMEND(BREAK    STATE    O)

以下部分说明我们如何构造一个用我们的语言写的程序。

该程序的功能结构可以如下规定:

-一个程序由一个或更多个程序(逻辑)循环组成,

-一个循环由一个或更多个状态组成,一个时间上,它们之中只有一个状态是活动的。组成一个循环的状态被该循环中的“start”,“restart”等循环初始化语句和在这些状态中的“goto”,“gosub”这些状态变化语句所隐含。

-一个状态由跟有语句表的一个状态定界语句组成,

-一个语句表由0,1或更多的复合语句组成,

-一个复合语句由一个可选择的条件部分和一个操作部分组成。没有条件部分隐含着一个成立的条件,所以操作部分将无条件执行。

-一个条件部分定由初始化部分、一个项(或用“或”操作连接的多个项)组成的布尔表达式,并在其后的操作部分处终止。

-初始化部分提供了与阶梯图中与功率总线的连接在功能上的等价,而在我们的语句中是一个“if”语句。

-一个项由一个条件语句(或用“和”操作连接的更多条件语句)组成,

-一个操作部分由一句或更多句操作语句组成。

下面的图表示了一个复合语句的结构。图中的语句的意思是:

“若输入10接通,或输入11断开并且计时器3已计时大于或等于23个时间单位时,则输出14接通,并且输出17接通。”

评价条件部分和执行操作部分的方法如下:

-以和语句读出时的相同次序评价该语句,

-“if”,设置一布尔条件标记为1,这个标记在执行时用作评价的运行记录,并当全部执行完毕时用作结果的记录。

-条件语句被评价,若为0,则该标记设置为0。

-一个“AND”操作符对下一个条件语句的下一个评价进行处理。

-一个“OR”操作符注视着条件标记

-若该标记为1,全部条件部分必定为真所以其余部分的评价被跳过

-若该标志为0,前面各项必定都不真,所以该标记被设置到1,继续下一项的评价。

-当读出该操作语句时,若该条件标记为真,则操作语句执行并完成其功能。

本方法在条件部分不允许有括号,条件部分等价于阶梯图上的多个梯级,每一个级由任何数目和系列的有关联的输入变量组成,所有的级都并联在级与激励器连接的点上,但在任何其它点上不并联连接。这使任何必要的条件都能被评价,虽然这种平行连接可能会使输入变量的评价(比这样)更少,然而,本方法提供了一种非常简单的记录哪一个输入引起过一个成立的评价并且导致了执行该操作表决定的实现方法。

这是通过保持一个指向代表正被执行程序的P码的指示字来实现的,而且无论如何这是必要的。任何检测到条件标记为1的“o”操作符,在修改指示字值并跳到操作部分之前,先保存该指示字的值。因为我们在条件部分没有数者择一的或不确定的通路而只有完整的梯级,被保存的指示字值必须指向到发现评价成立的第一个梯级的末端。 这被称作“决定点”,并被用在调试过程中。若判断进行到最后一项的末端,并且通过了这最后一个“or”操作符,那么只要这最后项产生一个真的条件,这个位置便成为决定点,或者该操作语句的位置在这种情况能起同样的作用。

广义地讲,一个复合语句等价于阶梯图中评价一个条件的一个梯级,若该条件被发现为真,则执行某个操作。上面规定的结构的这一部分的细节主要从跟踪任一个特定状态的变化中易于记录和打印出决定点的度来看具有重要意义。这种程序-循环-状态的结构是特别重要的事情,因为正是这一结构在易于设计无误差的程序和易于理解这些程序方面得到最大的好处。

从另一观点看,一个程序是由以状态1为活动状态自动开始的一个活动状态图(逻辑循环)同一个或更多个可能活动的状态图组成的,从第一个状态图起,它们可能被激活。但接着任何一个状态图都能激活或失活其他的任何一个状态图。描述所有的可能活动的状态图的代码始终存在于该程序体内,但是一个状态图在通过将它的状态中的一个分配给一个循环变量而将它激活以前不会被执行,因而在功能上是不活动的,激活的循环变量此后将在任一时间点上始终监视着在状态图中是活动的状态。系统软件包括代码和变量,能使它决定分配是否被作出或循环是否已被失活。

下面示出一个使用数字(而不是符号)变量名称的程序的例子。这个程序仅用来说明结构。

表1

程序    注释

状态1    ;第一个状态定界语句。

;唯一的强制性状态语句

;循环1自动开始。

op    20    on    ;第一个语句表开始。

;当处在状态1下输出20出现。

;无条件操作语句。

;也可以认为是一个没有条件部

;分并在操作部分有3个操作语

;句的复合语句。

启动计时器3    ;无条件操作语句。

;启动计时器从零开始向上计时

用状态200启

动循环2    ;规定状态200为循环2的开始

;(或重新开始)状态。

;无条件操作语句

若ip2出现    ;启动第一个复合语句

;预置部分(“if”),在第一项

中第一个和唯一的条件语句

;ip意即输入

或ip3出现    ;第二项开始

并且ip5结束

并使计时器3    ge    34;在第二项和条件部分中的最

;后一个语句。

goto    2;依据评价前面的条件部分的结果

;为条件的操作语句。

;若操作,使循环1的活动状态

;由1变化到2,开始下一个评价

若ip6出现    ;开始下一个评价

go    to    20    ;若真,将活动状态变到状态20

;否则保存为状态1

;第一状态和第一语句表的结束

状态2    ;第二个状态定界语句

.    ;程序中的第二个状态开始

.    ;由扫描次序和gotos    gosubs

.    等而不是由表中的顺序来控制执

.    行顺序

.    ;状态2的结束

状态3    ;状态3开始

.

.

.

状态4

.

.

.

.

状态20

打印出“Hold    state    entered    at”

gosub    30    ;打印出时间

.

.

;更多的状态

.

.

.

状态30    ;单个状态(但是可能多于一个

;状态)的子程序开始

读时钟    ;把时钟上显示的时,分等读入

;到称作时,分的变量中。

得到时

打印“@Hrs”    ;“@”是别处讨论的隐变量用的一

;个特殊符号。即小时“进入”到何时

得到分

打印“@mins.\”    ;\是“新行”用的一特殊符号。

返回    ;无条件返回调用状态

状态200    ;循环2开始的状态

.

.

;更多的状态

.

.

(最后语句)    ;程序的结束。

在上面这个程序里,有一个令人感兴趣的显示由此方法产生的系统的时间排序能力的例子。在一个状态中的所有语句都是在一个相邻的字组里依次被执行。一部分信息在状态20中被打印,余下的在状态30里被打印。当不存在由不是这一循环的其他循环造成的随机打印时,这是一项合适的技术。然而,若其他循环具有可能在“Hold     state    entereol    at”和“@Hrs.”之间要打印的状态,这项技术会引起问题。绕过这问题的办法是简单的,只要将所有有关的打印语句都放在单独一个状态里,并让操作系统的翻评程序保证一起执行,当打印机准备好后,系统通过中断程序将字符放入打印缓冲寄存器,每次向打印机输入一个,这样避免了控制功能的阻塞。

这里应注意,这种功能结构与从程序表中看到的结构是不同的。程序表不直接表现出循环的存在,它仅由一个或更多个状态表,包括复合语句…操作语句更细细节组成。循环信息当然是在那里面的,并能在‘stavt’语句和‘goto’、‘gosub’等语句里面找到。

举例的程序中的第三个语句“用状态200启动循环2”规定了在执行过启动语句后,在对循环2的下一次扫描时,该状态成为循环2中的活动状态。其他“start”语句通常用于对该程序中使用的所有其他循环规定初始状态。

这里应注意,在我们的系统中循环一词有两种不同含义,它可以表示为“逻辑循环”和“实际循环”。广义地讲,这种差别是同例如在MSDOS(微型软件技术手册)中的“逻辑器件”和“物理器件”的差别一样的。即,一个程序可以不需要提到行式打印机在哪里而讲到在一个“理论上”的行式打印机上打印,但是在某个阶段,总软件必须把这种理论上的行式打印机和实际情况联系起来,这种实际情况就是这样一个设备确实存在于使这个程序运行的系统的硬件的某些特定的地址或位置上。同样,我们的程序是以实际上是状态图的(逻辑)循环来设计的,被称作循环是因为在大多数实际的系统中,在状态图中首先活动的状态在每当机器或过程循环时将再次活动,因此,过程 活动典型地是经一系列状态进行循环返回到它起始的地点,经过了一个“环”。

为了使处理器以令人满意的方式操纵程序,我们必须对一个实际循环指定一个逻辑循环。这包括采用一个启动语句,“用状态m启动n组成,该语句将状态m与循环变量n联系起来,要么直接地把m存贮到循环变量n中,要么存贮一个其他非简接参考的指示字。在执行了一个或多个启动语句后,我们就有了一个或多个用参照状态预置的实际循环变量,这时系统软件能够依次读出它们,处理这些状态。响应goto,gosub语句等改变参照状态,并执行必要的动作去控制机器或过程。正如在别处指出的那样,程序中的哪个状态形成哪个逻辑循环的一部分,是由“start”、“goto”、“gosub”语句等决定的,而不是由任何诸如把状态字组和较大的子程序字组相联系的方式决定的。

用起始状态规定“循环块”和使用诸如“启动循环字组3”这样的语句当然也是可能的。现在这个方法被认为具有灵活性好,容易使用。

我们还应注意到,在执行不同的可供选择的控制任何时,常常希望有不同与同一实际循环相关连的逻辑循环。(每次一个)。

通常,循环一词的确切含意可由上下文明确,所以这个词通常不用“逻辑的”或“物理的”来限制。

哪些状态形成哪些循环的一部分的细节,以及一个循环中不同状态之间的相互连系可以通过借助于这些状态中的状态改变指令,即goto′s或gosub/returns跟踪该网络容易地被确定。

在我们的例子中我们可以看到,在状态1启动的循环1还包含状 态2和20,因为状态1包括了goto2和goto    20的语句,我们可以借助于他们的goto语句等,去跟随状态2和20并找到这个完整的网络。通常程序员在决定状态细节以前会先规定该网络的结构,所以这总是事先规定的。如果需要的话,通常会利用一个实用程序来编排任意循环的网络结构而不是用人工检查。

从上面可以看到循环的这种功能结构被构造到一个程序中,但它没有任何定界语句去规定一个与任一循环相关连的邻接码块。然而,一般总把利用邻接的状态字组来编码循环,即也许从数字范围200-299的状态用于循环2,300-399用于循环3,400-499用于循环4等等,被认为是好的程序编制实践。

还应注意到,这种做法提供了一种机制,借此一个循环在一个过程可以用一个状态网络代表的意义上可以在不同的时间点上控制不同的过程。这只有当机器的一个部分能使许多不同部分中的一个依赖于要求时,才可能发生。当一个特定的部分被需要时,一个特定的循环就以控制那部分工作的状态网络的初始状态被启动。这个网络就控制了那部分的工作。若要求一个不同的部分时,同一循环就能控制那不同部分工作的不同状态网络的起始状态被启动。用这种方法,可以构造一个程序,使得不同的状态网络控制不同的动作子集合,这样使程序模块化并使在任何具体场合下有关的程序码的内容减到最小,并且简化了对机器操作的理解。这阐明了这样的原则,输入变量和系统中存在的状态的所有组合中,仅仅很少的被简化的组合对机器的实际操作是重要的,而在任一时间点上,只有这些少数组合中的几个是重要的。

还有关系的是须注意,通常用这种语言进行编程序,特别是安排 操作的顺序,常常导致所有的操作语句(而不是状态变化语句,诸如goto,gosub等)是无条件的,这样系统中作出的决定主要是同状态改变有关。缺乏诸如接通输出等条件限制的动作,导致了当系统在一个特定状态时,有什么或将要发生什么方面的高度的确定性,系统因此是可预测的。若输出由值未知的、瞬态的并且以后也不可测量的输入决定,那末用户不必要对所发生的事惊讶。

还须指出,任何一个状态都能被认为代表了一个阶梯图,因为该状态内容是复合语句的一个表,其中每一复合语句都由一条件部分和一操作部分组成。由这一点推得,状态变化实际上表现为阶梯图的失活等价于状态的失活,阶梯图的激活等价于状态被激活。然而,应注意这是在使用诸如状态和条件转向语句这样的抽象概念以高级别的方式来完成的,而不涉及对任何额外元件的操纵,诸如启动或控制继电器的触点或从这样一些触点到该相关梯形各种梯级的连接。此外,一个状态被goto语句激活就在系统的层次上排除了包含goto语句的该状态仍是活动状态的可能性,因为这个动作包括重写保持在那个循环的循环变量中的值。

由此还可推出,一个仅包括状态1(因此不包括任何状态变化操作语句)以及状态1包括一个复合语句表的程序,事实上是与普通的阶梯图型式的PLC一起使用的阶梯图程序在功能上是等价的。虽然这种编程序的方法,在可以利用更有效的状态循环结构时通常不会被采用,但注意到这种等价性是有用的,因为它指出了阶梯图和那种使其输入由系统输入决定的状态机之间的关系。

阶梯图的函数性是状态图的一个子函数,而状态图自身又是由多个状态图组成的程序的一个子函数,在我们的情况下,这些状态图依 据他们是否已被一种“用状态-启动循环-”型式的语句启动,而可能是活动的或不活动的。(在我们的系统中,它们也可能被弃置,暂停、停止等)。值得注意的是,循环也可以用不是程序本身中的语句的方式启动,而从系统的监督器上通过预分配循环启动状态号数或一个表格驱动系统等方式启动。

还可推出的是,实际的循环并不直接与具体的状态图等价的。它们是系统的变量,是保持活动状态值的表格的成员,并且借助于由该程序模拟的各种状态图的结构确定哪一个状态图通过那个循环正被控制。哪一个具体的状态图通过一个取决于启动它的启动语句(或随后的gosub语句,该语句换入不同的“子状态图”直到碰到一“返回”语句)的具体的循环正在被控制。循环变量可以被静态的分配,或动态地分配到存贮器中。

在上面的情况下,“循环2”是指实际的循环2或存贮在循环变量2中的活动状态的值。在我们语言中的“get    loop2”意思是用循环变量2得到正被实际循环2控制的状态图中的活动状态的号数。循环一词也已被不精确地用来指状态图,即,逻辑循环,并且我们刚在已看到任一实际的循环能被用来在不同时间点上控制不同的状态图的仿真。其精确的含义应有上下文来决定。同一个术语被用于两个不同的但有关的概念,其理由是这有助于对程序的函数性的直观理解。

正如我们所看到的,每一次扫描,处理每个活动状态,诸如:“启动计时器”这样一些语句不需要处理每一次扫描,取决于这种编程序的方法,

-或者在使该状态激活后的第一次扫描中,

-或者在每当(程序)包含的复合语句的条件部分为真后的第一

次扫描中,包括通过是真的状态的第一次扫描。

必须处理上述这样一些语句。上述的处理同等价的梯形处理加上附加的状态限制相似,并且避免了计时器每次扫描中被反复起动,这样就保持在0,同时也避免了每次扫描中被打印信息频繁的反复。大多数操作语句要求作这种型式的处理,但诸如“op    22    on”这样的语句例外,“op    22    on”意思指“在这个状态中输出22接通”这需要在每次扫描中重复插入一个被预置零的输出组,以便当该状态被失活时,输出将自动失活。

符号变量

一个利用符号变量,其它方面与表1相同的程序被表示在表2中。

注意现在状态1有一张对循环、状态等的定义语句表。这些可以在程序进入期间通过人工插入或当遇到具体类型的新变量名称时借助操作系统自动地插入,并自动地给这具体类型变量分配下一个空的编号的地址。这些定义语句可以在或不在状态1中(他们可以在一个单独的字组中),可以是隐的或显的(如表所示的那样)。

应注意的要点是,这种程序现在具有大量用户的友谊,并很大程度上是自说明的和自注释的,只要读者对机器或工业过程本身有所理解。

本文中的空格缩进应予注意,这给出指出“if”、“or”、“and”操作符,复合语句、条件部分、操作语句等的位置的信息,并将程序分成功能上相关的语句组,再次为理解任务提供方便。

表2

程序    解释

预置:    ;预先定义状态1

定义循环2=切削刀具-操作

定义状态2=横切-运行(Infeed-active)

3=横切-计数(Infeed-Counting)

4=横切-减慢(Infeed-Slowd    own)

.

.

.

20=横切-保持(Infeed-hold)

.

.

.

200=切削刀具-等待(Cutter-wait)

201=切削刀具-下降(Cutter-down)

定义ip    2=横切-启动-按钮(Infeed-start-button)

3=自动-开关(Auto-switch)

5=暂停-开关(Pause-switch)

6=保持-按钮(Hold-button)

定义op    20=预置-指示器(Initialise-indicator)

预置-指示器运行

启动计时器3

以切削刀具-等待启动切削刀具-操作

若横切-启动-按钮接通

或自动-开关接通

和暂停-开关断开

和计时器3已开始计时34个时间单位

goto横行-运行(Infeed-active)

若保持-按钮接通

goto保持-横切(Hold-infeed)

横切-运行:

.

.

横切-计数:

.

.

横切-减速:

.

.

保持-横切:

打印“Hold    state    entered    at”

gosub打印-时间

.

.

打印-时间:

读出时钟

得到小时

打印“@    Hrs”

得到分

打印“@    mins.”

返回

.

.

切削刀具-等待:(Cutter-wait)

.

.

切削刀具-下降:(Cutter-down)

.

.

(最后语句)

程序扫描

从对相关的语句、判断和操作反复扫描的意义上说,处理器是以与标准PLC相似的方式处理我们的程序的。但在细节上是不同的。这种扫描仅涉及包括在活动状态中的语句。这些状态是那一些是通过查看循环变量被确定。处理器读入表中的第一个循环变量,由此决定该程序的何处是该循环的活动状态的开始。处理器转到那个状态并执行该状态中的语句直至达到下一个状态的定界语句为止。这是程序表中的下一个状态的开始,并标志着正被处理的现行状态的结束。处理器然后依次转到下一个循环变量并重复这个过程,并对具有活动状态的循环变量的整个表重复进行。这个活动同各种上述的与PLC共同的活动一起组成一次扫描。这扫描不断地重复进行。

goto,restart,return和gosub语句被处理时改变循环变量的值,当这种语句出现时,则对那个状态中的语句的处理立即停止,处理器转移去处理表中的下一个状态。即在那个状态中的过了goto语句之后的语句在那个扫描中不再被执行。当然,在下一个扫描中处理器要处理已被换来的新的状态中的语句,而被改写的旧状态不再活动或被处理。处理任何状态中的语句的次序同程序表中的次序是一样的,而循环是从1起向上按数字顺序被扫描。

用作实时软件基础的多任务操作系统(MTOS)是众所周知的。他们以一种同我们的系统相似的方式起作用,因为他们围绕要求注意的不同的任务分享处理器的时间,而我们用在不同循环中的不同的活动状态做同样的事情。然而,MOTS不必对他们的任务施加严格的处理顺序,而这种严格的顺序在进行到下一循环之前被我们的扫描循环的顺序所施加,彻底地处理每一个活动状态。MTOS通常能够以任务暂停、就绪任务优先、中断等为基础将处理器从一项任务换至另一 项。这意味着虽然有允许程序员在认为必要时能控制程序或硬件系统的敏感部分的机构,但写应用程序的程序员不必知道处理任务和甚至语句的实际次序。

在机器控制或过程控制的场合下,知道确切的处理顺序或能预测或确保处理器对系统输入的响应时间将是足够的是非常有益的。机器,尤其要求快速响应。在PLC的情况下,通常要规定对程序进行一次完全扫描的时间,这可能是1-20毫秒的数量级。我们的系统提供了保证总能足够快地执行所有必要活动的一种手段。

我们的语言结构于是建立起一次扫描将花费对所有活动状态(但不是任何非活动状态)处理一次所需的时间加上上述的一些可预测的附加开销。这就提供了可预测的扫描时间并因不处理不活动的状态所以扫描时间短,或反过来看,与诸如在每次扫描中对所有语句都要扫描的梯形逻辑系统相比,利用我们的系统,只要用一个功率较低、价格更便宜的处理机就能获得一个特定的扫描时间。

应注意,对标准PLG系统有一些避免在每次扫描中对所有阶梯图的语句都扫描的方法,但是这些都不如我们系统提供的方法简单方便。

活动状态和循环结构一起换入和换出,为程序员提供了类似MTOS的便利,但这是完全可以预测的。通过保证对状态进行编码使得任何状态无需花费太长的处理时间,程序员可以控制响应时间,或者通过采用循环变量检查其他循环来保证当一个灵敏状态活动时在一个循环中不出现长时间緾绕的处理。系统以一种非常简单的形式提供了所需要的方便。

此外,当每个活动状态中的语句表按表上语句的顺序被执行,并 且在到达下一个循环以前处理所有的语句时,程序员有一个非常简单的方法来保证一旦灵敏操作表被启动,所有必须的操作被执行,以及不会将任何与其他状态相关联的操作插入。使用全程变量或向一个终端写入字组正文或在涉及符号交换操作的时候,这一点可能是重要的。虽然,这也可以利用其他技术诸如利用一个MOTS来实现,不过我们的全部构建成高水平语言的结构为实现这一点提供了特别简单的方式。除了从程序员的观点来看是简单的外,从系统软件和硬件的观点来看也是简单的,这样就表现为更经济的控制机器或过程的手段。

应用程序以中间码或‘P-代码’的形式被存贮。一个翻译程序是系统软件的一部分,它读出这种P码并翻译它,进行必要的评价,操作和附加活动。这样一些软件的细节是众所周知的并且到处使用了这些标准技术。

应用程序的这种方便使它能访问循环变量并且因此能决定和使用在任何一个循环中哪一个状态是活动的信息。诸如上面示出的“get    loop”的语句是一个典型的代表。

对各种类型语句的讨论

用于所有语句的P码是由两种通用类型的码组成的。

-首先,一个或更多个构造一个操作符的字节,它确定了语句的类型并且被翻译程序用来选择要利用的服务例行程序。

-其次,需要时可有数据。

有意义的一些语句的类型(用例2表示)是,

-循环预置语句

-“用状态200启动循环3”

启动循环用的P码由操作符,循环参考和状态参考组成,循

环参数较为方便地可以是任务表中循环数据开始的地址。状态参考方便地可以是在程序P码中该状态的地址。

服务例行程序包括

-一次试验(见先前应用中的ONCETEST程序)和必要时跳过其余部分。

-将状态地址转化成任务表上正确的循环位置上的循环变量。

-依要求设置一次试验标记等。

-保存决定点数据。

-退出以便处理下一个操作符

-“重新启动3000”

-同上面相似,但在状态3000启动循环1

-合适的活,将标记、寄存器等置零

-保存决定点数据

-退出以启动扫描

-状态改变语句

-“goto    201”

-将新的状态地址转化成任务表中的现正被处理的循环的循环变量

-清除以前的标记

-保存决定点数据

-退出以处理下一个循环

-“gosub    5000”

-一次试验,然后除了将下一操作符的地址和要返回的状态地址保存在任务表的保存区供返回语句使用外,与goto一样

-保存一次试验(oncetest)标记和掩码

-保存决定点数据

-退出到下一循环

-“返回”

-从保存表获得保存地址,以能处理调用状态的余下部分

-重新恢复一次试验的(oncetest)标记和掩码

-保存决定点数据

-设置条件标记

-退出以处理调用状态的其余部分

上述语句中的两个是仅一次语句,即启动循环和gosub。所有其他3个依据它们做什么、即在出现它们的循环中改变活动状态的这种性质也仅起一次作用,因为它们这样做,所以它们在通过该循环的下一个扫描中不被执行。这样,它们不需要引用一个一次试验例行程序,并且不应被分类为仅一次语句。而gosub语句有这种需要的理由是虽然从其子程序返回后,它改变了它自己的循环,但是调用状态将在许多次扫描中再度成为活动状态,并且每次扫描调用子程序是不合适的。但在从子程序返回不被认为是状态激活的情况下,在“每个状态激活一次”的基础上或在边沿激活基础上调用它是合乎逻辑的。

-仅一次语句,绝大多数语句是仅一次语句。下面的语句是一些其他例子,它们根据要求可以作为边沿激活型,也可以作为每个状态激活一次型被执行。

-“启动计时器5”

-“增量寄存器17”

-为什么每个状态激活或当条件为真时只启动计时器或对寄存器增加一个量一次是令人希望的,这一点是很清楚的。例如,当处在那个状态时,每次扫描启动计时器仅控制它重置而不是以运行代替将其重置到0,并然后使它计算过去的时间

-执行这些语句包括的操作一点不比把0写入合适的计时器多,然后它借助中断程序对每个时间段进行一次升数计数,直到最终固定在计时器的溢出端(对8比特为255)或到存贮在合适的寄存器中的数加1为止

-仅一次操作

-在源码公开内容中的ONCETEST程序说明如何执行例行程序,该程序在每当它们的功能(它们状态是活动的,并且条件部分是真)成真时执行其功能。有一种提供仅一次操作的简化的方法    这涉及使每个循环有单独一个布尔标记。这标记是由任何一个改变那个循环中的活动状态的例行程序来设置的。它是正好在前进到去处理下一个循环以前在贯穿那个循环的第一次扫描结束被重新设置的,并且为方便起见也可以选择为在贯穿循环的每一个扫描的结束时重新设置    因此,它仅在第一次贯穿一个新的活动状态的扫描期间是真的。它被服务例行程序用于任何仅一次语句,而且仅当标记为真时,这些程序才执行它们的功能。这一技术的最终价值取决于一个简化的翻译程序和使语言有更大的灵活性之间的折中。

-在某些情况下,能够具有一个仅一次程序在每次扫描中重复执行其功能可能是有益的。例如,保持一个计时器重置直到 状态变成失活,然后自动撤消控制。为此目的,可以提供一“重复”语句,它在被翻译程序执行时使下一个或其后的直到一个“结束重复”语句的那些语句执行每个可由翻译程序为这些重复语句选择那些可供选择的到服务程序的入口点而做到的扫描,这些入口点不考虑ONCETEST和第一次扫描标记。

-每次扫描语句。这种语句基本的例子是输出语句。

-“op    45    on”

这一语句实际是说“当出现此语句的状态是活动的并受到任何施加于它的条件支配时,输出45接通”,当该状态失活时该输出自动断开。它不是说“接通输出45”,并需要以后用另一个语句使它断开。这是通过把输出图中的所有比特位在每次扫描开始时都设置为零实现的,并通过在每次该状态是活动的和条件部分是真的扫描中为该语句提供一个设置该图中合适比特位的服务程序。

-各种各样语句

-定义

一类定义语句是为变量或常数设的。这些语句可以人为地插入程序或被改变,或在一个新名称被识别出时被自动地插入。它们具有“定义状态5=这个状态”这种形式并基本上将名称同变量/常数的数值联系起来,并相当于一个被贮存的符号表,作为该程序一部分。在程序执行期间它们不作什么,只被跳过,所以不会明显减慢翻译程序,它们只在程序列表期间被打印程序利用。

-可以供给测试一个特定状态在某个被定义的循环中是否活动的语句。这包括转到有关循环的循环变量,抽取循环参考,循环参考可以是该活动状态的p码的地址,而若是这样,转到状态p码并抽取可以是作为p码的第二和第三字节的状态号数,然后进行比较。这些语句从变量类型的观点看,必须是兼容的,并可以具有下面形式:

-Get    loop    3

if    equal    315

GO    to    350

或-if    state    315    in    loop    3

GO    to    350

为了清楚起见,作为附加说明,下面的流图很详细的表示了已描述过的程序,并还表示了一些其他的使这样的一个控制器成为一种实际的工具是必需的支援程序

为同样目的也作为附加说明,公开了在一台具体的微处理机上执行关键程序的源码

下面这些流图若不是一点不错的话,是非常接近来用公开了的源码,并利用与源码中的标记有相似地被命名的入口点和出口点来邦助理解码和交叉参考。

被简化的流图

下面的流程图表示实施我们已公开的新的扫描方法用的主要的控制流程。

STARTPROG

只将任务表预置到循环1,

状态1,循环指示字

指向循环1,而P码指示字

指向状态1。必要时预置其

数据结构

上面的流程图依赖于下面的数据结构和假设。

1.一个程序最好以P-码方式贮存,但也可用一些其它形式存贮,它由至少一张包括一个或更多个状态字组的表组成。

2.每一个状态字组由一个确定字组开始的状态语句或类似的定界语句,没有、一个或更多个确定要执行的控制动作、包括控制活动状态和循环的语句,以及在下一个状态字组开始处或某个其他合宜的定界符处的结束语句组成。

3.至少一些可利用的语句,与要执行的程序性的任务表不同,能够规定在该状态活动时占优势的静态条件。例如:“OP    10    on”意思是“输出10正在进行”而不是“启动输出10”,(后者要通过某个其他的语言停止)。注意当该状态成为不活动时,输出10会自动消失。注意到重复扫描和其他特殊操作系统的支援同这种语言相结合才提供了这一特点。

4.当状态被激活后,至少一些语句只能作用一次,并能在该状态处在活动时跳过执行其后的贯穿该状态的扫描。

5.一张可以是活动的或不活动的循环变量表,若活动的,那么它将循环的号数同一个活动状态相联系,而且其中所述循环号数的数字次序控制了所述活动状态的扫描次序。

6    GOTO语句,能依据必要的评价来工作以改变出现该语句的循环中的活动状态,而不必评价哪个状态在那个循环中是活动的,并且有一个允许这一点发生的程序结构。

7.start语句,使得一个循环变量活动,并把一个指向该活动状态字组的指示字加入到该循环变量中。

8.GOSUB/return语句,如描述的那样AT    THE    STATE    LEVEL起作用。

所有Drummond以下的基本要求都适用:

1.在一个集合每一次只有一个状态活动。

2.一个成为活动的状态使集合中的其余状态成为不活动的等。

注意除我们能使循环成为活动的和不活动的之外,在后面一个情况下,我们能使活动的状态成为不活动的,而不必使同一集合中的任何其他的活动状态依次成为活动的。

说明翻译程序的子例行程序

的详细流程图

标号和变量名称用大写表示

程序以STARTINTER开始

流程图详述了算法中的基本要素,他们不必描述包含在程序列表中诸如保持寄存器这样的内务处理,因为这些活动因具体的实施而异

借助转移表转移到程序中的语句服务程序,

该程序由正被处理的特定的操作符表征

PARTICULAR    SERVICE    ROUTINE    TO    SERVICE    PARTICULAR    OPERATOR(对特定操作符的特定的服务子例程序)。

跳越功能

一旦作出了要求去执行一个动作的条件是真的一个决定时,则不必再继续评价该条件语句中的剩余项了,因为它们总的说来对该语句的最终结果没有影响。该情况在遇到一个“或”型语句以及在读该语句时其条件标记为真时出现。作为一个例子,在下面这个语句中:‘if    ip    5    on,and    ip    6    on,or    ip    7    on,set    op    66    on’(‘如果输入5接通,与输入6接通,或输入7接通,设置输出66接通’)

如果两个输入5和6都接通,则执行‘设置输出66接通’语句而与输入7的状态无关,从而可跳越对输入7的评价(以及任何其它接着的条件评价语句)。为此,提供了一种特殊的算法如下:

-如果该转移是到下一个‘if’或动作操作符的入口,则进一步转移到标号VBRI

-如果该转移是到下一个‘or’或一个‘and’操作符的入口,则转回到SKIP    2

这种算法取决于给这些操作符编码,以使它们的二进制值与保存它们各项目的转移表中的地址的低字节相同,或者该值可以等于用于计算进入该表中转移地址的一个偏差值。

服务程序实例

执行‘setop’(设置输出)或‘set    flag’

语句的例行程序

把语句以P-代码形式存贮在存贮器中,并且这些语句可以方便地以3个接续的字节形式被存贮-

字节1-指示语句类型的操作符,这里指‘set    op’(设置输出)或‘set    flag’(设置标记)

字节2-内部输出或标记变换在包含这个输出/标记的字节的存贮器中的地址

字节3-选择实际的输出/标记的掩码,注意到这同一个例行程序既可以用于标记又可用于输出,并且字节1是相同的,只有该地址规定了该变量是一个输出还是标记。

SOFI

用于‘and    ip’(‘与输入’)(ip表示输入)

‘or    ip’(‘或输入’)

‘if    ip’(‘如果输入’)

‘and    flag’(‘与标记’)

‘or    flag’(‘或标记’)

‘if    flag’(‘如果标记’)

的服务程序。

P-代码如上所述是-操作符、地址、掩码。

AIFOI

‘Halt’是一个条件操作,如果它被激活,使处理转移到下一个循环

‘state’,‘pausestate’、‘breakstate’

(‘状态’,‘暂停状态’,‘断开状态’)

注意在任何一个状态的处理期间,两种状态型的操作符被读入和处理。一个在该状态字组的开始,另一个则在其末尾。如何处理它们是不同的,在该状态字组的起始部分的状态型操作符按照上面流程图所示来处理。(参见TRPST之前及之后的大约15行),在字组结尾部分的操作符被如下处理,它们只是指出这个状态处理的结束,并把处理转移到下一个循环中是活动的状态上。在字组末尾的操作符实际上就是该程序列表中一行里的下一个状态字组中的第一个操作符。

状态操作符包括状态、暂停状态和断开状态。

状态

暂停状态

子程序‘StoreHistory’

将存贮器中一个线性表格的跟踪表用作一个绕回式‘循环带’缓冲寄存器。一个指向该最后利用的/下一个要利用的位置的指示字被 保存起来,作为一个单独的指示字变量。一旦该表被填满,则旧数据就被新数据改写。

注释:在我们的实施中,因为我们执行不多于7FH的被编码成8位的循环,一个跟踪允许标记被编码成为循环号数的最高位被存贮。一个独立的变量可以被利用。这一变量被用作‘这个循环的跟踪被禁止吗?’的决定。

‘Remark’(‘评语’)

用于‘remark’的P-代码是一操作符、程序中下一个操作符 的地址,注释字符串,(下一个操作符)

‘start    instruction’(启动指令)

通过了解下述内容可以更容易地理解这个指令。

该任务表是一个记录的数组,它的一些包含有数据并代表已经被启动的活动循环,而某些是空的并且代表还没有被启动的循环。从把所有的非空记录压缩到该表的起始部分并按照这些记录中循环变量的值的数字次序来排序的意义上来说,该数组是动态的。把一个新的循环记录插入该数组中包括按照数字次序把它插入该被压缩的数组中,并且如果必要的话,把更高次序的一些循环从数组上移下来以允许做到这一点。

每个记录都是一个循环的记录并具有包含下述简单变量的字段:

TTLOOP-该记录代表的循环号数还确定了活动状态被描述的次序。循环号数是互斥的。在我们的表示法中,有效循环号数都小于127。我们用一个8位变量中的7位来存贮该循环号数,而把这第8位用作一个‘LOOP    tracing    disable    flag’(‘循环跟踪禁止标记’),参见STOREHIST。该循环号数和该标记都被存贮在TTLOOP中。

TTSTATE-该循环的活动状态的地址,即确定该活动状态的程序状态字组启动的状态操作符在程序P-代码存贮器中的地址。

TTONCE-这是由ONCETEST使用的一次标记变量。

TTACCUM-一个直接结果和用于这个循环的数据转移寄存器,它由操纵数据的语句使用。

TTEXTEN-TTACCUM的一个扩充

TTSTATESTR

TTONCESTR

TTRTNAD-供‘gosub’和‘return’语句使用的分别保存来自TTSTATE、TTONCE以及该P-代码指示字的三个变量。

用于‘start’的P-代码是操作符、循环号数、新的状态地址。

的所有记录的字组朝表的末端向下移一个记录,以便留出空间供插入新循环用。最后的循环被重写但必须是空的,因为对循环号数的程序范围检验排除了启动过多的循环。

通过调用SETSNAP把跟踪表复制到缓冲寄存器。(该跟踪表总是在改变,一个程序在运行并引起状态的改变。该管理程序同样可以在运行并打印过去的历史。从而对于该例行程序来说可以得到稳定的数据。该实际的表被复制到一个缓冲寄存器中,并且该打印把该缓冲寄存器用作为数据。该缓冲器还有一个该跟踪表指示字的复制品)

PRSEX    打印-返回到调用程序

高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈