在工业自动化与软件工程领域,我们常常需要描述那些由离散事件驱动的系统行为。传统状态机(State Machine)虽然直观,但在处理并发、同步等复杂场景时显得力不从心。这正是Petri网展现其独特价值的地方——它不仅是状态机的扩展,更是一套完整的离散事件系统建模语言。
我第一次接触Petri网是在设计一个包装流水线控制系统时。当时需要协调机械臂、传送带和质检仪三个设备的协同工作,用传统状态机画出的流程图就像一团乱麻。直到同事推荐Petri网,那些复杂的互锁逻辑突然变得清晰可管理。这种"顿悟时刻"让我深刻理解了这种建模方法的威力。
Petri网由四个基本元素构成(如图1所示):
关键理解:令牌在库所中的分布构成系统的"标识(Marking)",其动态变化过程就是系统行为的可视化呈现。
Petri网运行的核心机制是变迁触发(Firing),需满足两个条件:
以电梯控制系统为例(图2):
code复制[电梯停靠] --呼叫按钮--> [等待响应] --开门信号--> [电梯运行]
当电梯处于"停靠"状态(有令牌)且收到呼叫信号(使能变迁),就会触发状态转换。这个简单例子揭示了Petri网描述异步事件的天然优势——事件触发与状态改变被明确分离,这与现实中的工业控制逻辑高度吻合。
让我们剖析原文提到的打印机资源共享场景(图3)。两个进程(测量值采集和错误报告)需要竞争使用同一台打印机,这正是典型的互斥访问问题。
Petri网模型的关键设计在于:
plaintext复制Process A:
[准备打印] --开始打印--> [打印中] --结束打印--> [完成]
↑ ↓
└── [同步库所] ──┘
Process B:
[准备打印] --开始打印--> [打印中] --结束打印--> [完成]
这个模型的美妙之处在于,它不需要任何显式的锁机制代码,仅通过令牌流动就实现了:
在某汽车零部件工厂的MES系统升级中,我们使用Petri网对质检工站建模(图4):
plaintext复制[待检工件] --开始检测--> [尺寸检测]
[外观检测] --全部通过--> [合格品下料]
[功能检测] ↑
↓________|
[任意失败] --> [返工区]
这种建模方式帮助团队发现了原系统中存在的资源竞争风险——当三个检测设备同时就绪时,可能因任务分配不均导致某个设备长期闲置。通过在关键变迁前增加缓冲库所,我们将设备利用率提升了23%。
Petri网的数学本质可以用一个矩阵方程完整描述。对于具有m个库所和n个变迁的网络,其关联矩阵W是m×n矩阵,元素定义如下:
以图5的简单网络为例:
code复制P1 --T1--> P2 --T2--> P3
\ /
\____T3______/
对应的关联矩阵为:
code复制 T1 T2 T3
P1 [-1 0 -1]
P2 [ 1 -1 0]
P3 [ 0 1 1]
系统演化通过标记向量M(各库所令牌数组成的列向量)和激发向量S(记录变迁触发次数的向量)描述,状态转移遵循:
$$ M' = M + W \cdot S $$
假设初始标记$M_0 = [1,0,0]^T$(P1有令牌),依次触发T1和T3:
此时出现负值,表明该触发序列不可行——因为T3需要消耗P1的令牌,但P1在第二步已无令牌可用。这种数学验证在实际工程中极为重要,可以提前发现死锁或资源枯竭风险。
基础Petri网未考虑时间因素,在实际自动化系统中,我们常需要引入:
例如在热处理炉控制中(图6):
code复制[装料完成] --(延迟5min)--> [开始加热] --(持续30min)--> [保温]
通过时间扩展,我们可以精确模拟温度爬升曲线,避免过热风险。
问题1:令牌泛滥
plaintext复制[订单队列] --处理--> [完成]
↑_______________|
[反向抑制弧]
问题2:死锁检测
问题3:非确定性冲突
当多个变迁竞争同一令牌时,可采取:
| 工具名称 | 优势领域 | 代码生成能力 | 仿真支持 | 学习曲线 |
|---|---|---|---|---|
| CPN Tools | 复杂颜色Petri网 | 有限 | 优秀 | 陡峭 |
| PIPE | 教学与快速原型 | 无 | 基础 | 平缓 |
| Snoopy | 分层建模 | 支持C代码 | 强大 | 中等 |
| Yasper | 业务流程建模 | 导出BPEL | 可视化好 | 简单 |
个人推荐从PIPE开始学习基础概念,再过渡到CPN Tools处理工业级项目。在最近的一个AGV调度系统中,我们使用CPN Tools的层次化建模功能,将300多个基础节点组织成清晰的模块结构,大幅提升了团队协作效率。
在智能工厂场景下,Petri网正与新技术深度融合:
某半导体工厂的实践表明,将Petri网模型与实时数据流结合,可以实现:
在开发这些应用时,有几点经验值得分享: