什么是时序图?
一种时序图是一种专门的动态行为UML 图,用于可视化状态的精确持续时间以及这些状态在时间轴上发生变化的精确条件。作为统一建模语言(UML)规范的重要组成部分,这种特定的UML 图类型非常注重硬性时间约束、时钟周期和波形信号。它通过追踪波形或阶梯线,精确展示对象在特定状态下持续的时间,直到外部触发器改变其状态。
时序图被嵌入式系统工程师、网络协议开发者和硬件架构师广泛用于建模竞争条件、跟踪线程生命周期变化或映射硬件寄存器的转换。使用VPasCode,您无需手动计算像素宽度或映射时间轴坐标。我们的渲染引擎会根据您的纯文本脚本自动处理整个时间网格。
核心语法指南:元素与结构
要在 PlantUML 中设计出准确且符合标准的 UML 时序图,您需要掌握参与者类型、状态定义、时间间隔和同步约束。
1. 声明参与者(稳健型与简洁型)
您可以根据系统所需细节程度,使用两种不同的视觉风格来建模时间轴。您必须使用明确的关键字进行声明:
- 稳健型时间轴:将状态显示为独立且堆叠的行。适用于高层级软件流程。
robust "应用线程" as Thread - 简洁型时间轴:将状态沿单一水平线显示,使用交叉阴影块表示状态变化。非常适合紧凑的硬件信号图。
concise "CPU 寄存器" as Reg
2. 定义状态转换与时间步长
与其他图表不同,您通过使用@符号,引用您的参与者,并使用is关键字来改变状态。包含空格或特殊字符的状态名称必须用引号括起来:
@0
Thread is Idle
@10
Thread is "处理数据"
3. 生成时钟信号
要模拟二进制硬件时钟,请使用clock关键字。您必须指定一个周期、一个可选的占空比以及一个内部名称:
clock "系统时钟" as CLK with period 2
4. 添加精确约束和时间计划
为了记录严格的执行截止时间(例如确保系统转换在指定时间段内完成),请使用<->语法,通过一个描述性标签连接两个时间坐标:
@10 <-> @40 : {小于30毫秒}
清晰时序布局的最佳实践
- 保持时间单位一致:PlantUML将时间轴整数视为通用的顺序步骤。为您的项目选择一个统一的时间单位(例如,时钟周期、微秒或秒),并始终保持一致。
- 为复杂转换使用标签:您可以在状态变更后立即添加冒号,直接附加文本消息(例如,
@10nReg is Reading : "触发中断"). - 有策略地排列声明:PlantUML按照脚本中声明的精确顺序将生命线垂直堆叠。始终将主时钟放在最顶部,以便于对齐。
现实世界中的PlantUML时序图示例
示例1:微控制器缓存与寄存器状态(简洁且带时钟波形)
此可运行的蓝图展示了经典的嵌入式硬件工程时间线,同时运行标准系统时钟和一个简洁的数据存储寄存器,用于跟踪硬件状态。
@startuml
clock "系统时钟 (CLK)" as clk with period 2
concise "数据总线寄存器" as Reg
@0
Reg is Empty
@2
Reg is Reading : "获取"
@6
Reg is Writing
@10
Reg is Locked
@14
Reg is Empty
@enduml 
语法解析: 该clock指令会自动生成有节奏的高低电平方波。该Reg 行在绝对时间轴网格上按顺序处理多个状态分配。以冒号结尾的文本字符串(如: "获取") 会以整齐的注释形式直接显示在转换边界线上。
示例 2:异步 Web 消费者令牌刷新(健壮的多线程约束)
这个先进的、完全功能的软件架构蓝图利用健壮的布局格式,追踪多线程 Web 应用程序的工作流程,精确映射 Web 客户端与授权工作线程之间的定时截止时间。
@startuml
robust "Web 浏览器客户端" as Web
robust "认证令牌工作线程" as Auth
@0
Web 处于空闲状态
Auth 处于睡眠状态
@5
Web 等待令牌
Auth 正在验证
@15
Auth 正在生成
@15 <-> @25 : {生成窗口}
@25
Auth 处于睡眠状态
Web 正在渲染页面
@40
Web 处于空闲状态
@enduml 
语法分解: 通过使用 robust 声明,状态在每个独立的生命线行的 Y 轴上清晰列出。时间评估约束(@15 <-> @25 : {生成窗口}) 在时间轴网格顶部绘制一条标准的双向尺寸箭头,表示严格的运行限制。