时间Petri网结构的转换与实现
1. 引言
在实时系统(RTS)的建模和实现中,时间Petri网(Time Petri Nets,TPN)和Ada 95语言的结合是一种有效的方法。虽然已有许多作者处理过相关主题,但本文旨在展示如何将基于时间Petri网的RTS模型在Ada 95中实现,并证明生成的代码与模型具有相同的语义。
2. 时间Petri网的基本概念
时间Petri网是一个元组$(P; T; F; B; M_0; SIM)$,其中$(P; T; F; B; M_0)$定义了一个标记的经典Petri网,$SIM$是一个称为静态区间的映射,它将每个转换$T$与一个正有理数区间相关联。TPN可以看作是带有标签的Petri网,每个转换都有两个时间值$(\sigma_i; \pi_i)$,分别表示转换从启用开始到可以触发的最小时间和最大时间。
在我们的模型中,根据转换的不同功能,将其分为以下三种类型:
-
CODE转换
:与输入位置一起表示与活动相关的代码。当转换启用(即输入位置被标记)时,代码开始执行,时间值$(\sigma; \pi)$表示活动的执行时间。
-
TIME转换
:与时间事件(如超时)相关,其时间信息用区间$(\sigma; \sigma)$表示,触发表示事件的发生。
-
SYCO转换
:用于执行同步和控制任务,没有时间意义,触发会导致简单的状态变化。
以下是一个TPN建模周期性过程的示例:
loop
CODE; -- B
select
Proc_B.entry_A;
or
-- c
delay 1.0;
end select;
delay until Next; -- A
Next := Next + 10.0;
end loop;
该代码展示了一个周期性执行的过程,包括代码执行、同步和延迟操作。
3. 将Petri网分解为进程
时间Petri网可以描述RTS的行为,通常可以识别出多个并发活动或进程。实现基于TPN的RTS的第一步是隔离这些进程及其相互连接。基本方法是将相互排斥的转换集合并为一个进程,通过计算单标记p - 不变量来确定转换之间的相互排斥关系。
最终,一些不属于任何进程的位置用于建模进程之间的异步通信,而共享转换表示同步通信。
4. 示例
考虑一个由周期性活动和另一个活动组成的RTS模型,通过计算单标记p - 不变量,可以识别出三个进程:
-
Proc 1
:表示活动1的周期性激活器。
-
Proc 2
:是活动1的主体。
-
Proc 3
:对应活动2。
以下是为这些进程和共享位置提出的Ada 95代码:
task body S1 is
begin
accept Mark;
Proc_A1.Demark_S1;
end S1;
-- The same structure for
-- the place PA
task body Proc_A1 is
LLE: Time; -- Last_Event
begin
LLE := CLOCK;
loop
select
accept Demark_S1;
LLE := CLOCK;
exit;
or
delay until LLE + PERIOD_ACT;
LLE := LLE + PERIOD_ACT;
PA.Mark;
end select;
end loop;
end Proc_A1;
task body Proc_A3 is
begin
loop
select
S3.Demark;
exit;
then abort
CODE_3;
end select;
Proc_A2.Rendezvous;
CODE_4;
end loop;
end Proc_A3;
task body Proc_A2 is
LLE: Time; -- Last_Event
begin
LLE := CLOCK;
loop
accept Demark_PA;
LLE := CLOCK;
select
delay until LLE + TIME_OUT_1;
LLE := LLE + TIME_OUT_1;
S1.Mark; S3.Mark; exit;
then abort
CODE_1;
LLE := CLOCK;
end select;
select
accept Rendezvous do
CODE_2;
end Rendezvous;
LLE := CLOCK;
or
delay until LLE + TIME_OUT_2;
LLE := LLE + TIME_OUT_2;
end select;
end loop;
end Proc_A2;
protected body S3 is
entry Demark when Marks > 1 is
begin
Marks := Marks - 1;
end Demark;
procedure Mark is
begin
Marks := Marks + 1;
end Mark;
end S3;
5. 软件实现
每个进程可以在具有循环结构的Ada任务中实现,通过标记在p - 不变量中的流动揭示转换的执行顺序。
- SYCO转换 :表示进程内部的决策或进程之间的同步通信。
- CODE转换 :涉及执行其关联的代码。
-
TIME转换
:表示进程执行中的延迟,通常用延迟语句实现。为避免累积漂移,每个包含TIME转换的进程关联一个时间变量
Last Event
,记录最后一次标记更新的时间。
当出现冲突(即一个位置有多个输出转换)时,需要使用更复杂的Ada语句。通过对每个Ada语句的语义进行建模,并使用约简规则将模型约简为原始网的结构,可以证明提出的代码与模型具有相同的语义。
6. 建模带延迟分支的select语句
提出一个网来建模具有多个
accept
和一个延迟分支的
select
语句。服务器在等待客户端调用其入口时,直到一个输出SYCO转换被启用,然后触发该转换,开始执行相应的代码。如果在指定时间内没有客户端调用,TIME转换触发,放弃进行任何同步的可能性。
以下是相关的网模型和代码示例:
select
accept entry_1 do
CODE1;
end;
Code_Branch_1;
or
accept entry_i do
...
or
delay D;
Code_Branch_delay;
end select;
通过以上内容,我们展示了如何将时间Petri网结构转换为Ada 95代码,并确保代码的语义与模型一致。
时间Petri网结构的转换与实现
7. 代码实现的详细分析
在将时间Petri网转换为Ada 95代码的过程中,我们需要对不同类型的转换进行详细的实现分析。下面通过表格的形式,对三种转换类型的实现进行总结:
| 转换类型 | 实现方式 | 注意事项 |
| ---- | ---- | ---- |
| CODE转换 | 当输入位置被标记时,执行与之关联的代码,时间值$(\sigma; \pi)$决定代码执行的时间范围 | 确保代码的执行时间在规定的范围内,避免出现超时或提前完成的情况 |
| TIME转换 | 使用延迟语句实现,为避免累积漂移,关联时间变量
Last Event
记录最后标记更新时间 | 准确计算延迟时间,根据
Last Event
和预设的时间间隔进行延迟操作 |
| SYCO转换 | 用于同步和控制任务,触发时进行简单的状态变化 | 保证同步和控制的准确性,避免出现状态不一致的问题 |
下面是一个mermaid格式的流程图,展示了一个简单的TPN转换为Ada代码的流程:
graph TD;
A[时间Petri网] --> B[识别转换类型];
B --> C{转换类型};
C -->|CODE转换| D[执行关联代码];
C -->|TIME转换| E[使用延迟语句并更新时间变量];
C -->|SYCO转换| F[进行同步和控制操作];
D --> G[完成代码执行];
E --> G;
F --> G;
G --> H[检查是否有冲突];
H -->|有冲突| I[使用复杂Ada语句];
H -->|无冲突| J[继续执行];
I --> J;
J --> K[结束流程];
8. 冲突处理与代码正确性证明
当一个位置有多个输出转换时,就会出现冲突。在这种情况下,我们需要使用更复杂的Ada语句来处理。为了证明提出的代码与模型具有相同的语义,我们采用以下步骤:
1.
建模语义
:对实现代码中使用的每个Ada语句的语义进行建模。
2.
约简模型
:使用约简规则将模型约简为原始网的结构。在约简过程中,需要保留所有的CODE和TIME转换,并将一系列SYCO转换的触发合并为一个具有相同行为的转换,确保原始模型和约简后的模型等价。
以下是一个处理冲突的示例代码:
select
-- 分支1
accept entry_1 do
CODE1;
end;
Code_Branch_1;
or
-- 分支2
accept entry_2 do
CODE2;
end;
Code_Branch_2;
or
-- 延迟分支
delay D;
Code_Branch_delay;
end select;
在这个示例中,当出现冲突时,程序会根据不同的条件选择不同的分支执行。
9. 实际应用中的考虑因素
在实际应用中,将时间Petri网转换为Ada 95代码还需要考虑以下因素:
-
性能优化
:合理安排转换的执行顺序,减少不必要的延迟和同步操作,提高系统的性能。
-
错误处理
:在代码中添加适当的错误处理机制,以应对可能出现的异常情况,如超时、同步失败等。
-
可维护性
:编写清晰、易读的代码,添加必要的注释,方便后续的维护和扩展。
10. 总结
通过将时间Petri网转换为Ada 95代码,我们可以有效地实现实时系统的建模和分析。在转换过程中,我们需要对不同类型的转换进行准确的实现,处理好冲突情况,并证明代码的语义与模型一致。同时,在实际应用中,还需要考虑性能优化、错误处理和可维护性等因素。
通过本文的介绍,我们希望读者能够掌握将时间Petri网结构转换为Ada 95代码的方法,为实时系统的开发提供有力的支持。在未来的研究中,我们可以进一步探索如何更好地将时间信息融入到Petri网的建模和分析中,提高系统的准确性和可靠性。