4. PCS 7安全程序结构

在PCS 7中,安全程序并不是“把普通程序写得更可靠一点”,而是运行在与标准程序严格隔离的独立执行体系里。理解这套结构,是后续做F-块编程、安全运行组划分和编译下载的前提。本节围绕五个关键对象展开:安全程序与非安全程序的分离边界、F-CALL调用机制、F-块、安全运行组,以及安全程序的编译与下载流程。

一、安全程序与非安全程序的分离

PCS 7的CPU中同时存在两类程序:标准用户程序(Standard User Program)和安全用户程序(Safety Program)。两者在同一个CPU内运行,但被强制隔离,隔离体现在三个层面。

存储与执行隔离:安全程序存放在独立的安全程序容器中,由F-运行时系统(F-Runtime)调度,标准程序由普通运行时调度。安全程序不能直接读写标准程序的DB,标准程序也不能直接调用F-块。

数据交换隔离:两类程序之间只能通过受控接口交换数据。标准程序向安全程序传递数据,必须经过F-块的输入参数或专门的F-共享DB;安全程序向标准程序回传状态,也必须通过F-块输出或F-共享DB。这种“窄接口”设计使安全程序的输入输出可被审查和验证。

访问保护:安全程序带访问保护(Access Protection),需要密码才能打开、修改和下载。任何对F-块的修改都会改变安全程序的签名,必须重新编译并走完整的下载确认流程。

分离的核心目的不是性能,而是可验证性:安全程序的范围越小、接口越清晰,就越容易证明其功能正确、越容易通过安全验收。

二、F-CALL:安全程序的唯一入口

标准程序无法直接调用F-块,必须通过F-CALL。F-CALL是标准程序中一个特殊调用块,它把安全程序的执行“挂”到标准程序的循环中。可以把它理解为安全程序与标准程序之间的执行接口。

F-CALL的关键特性有三点。第一,一个安全程序通常只允许一个F-CALL实例,它负责触发整个安全运行组的执行。第二,F-CALL必须放在会被循环执行的组织块中(通常是OB1或循环中断OB),否则安全程序不会被执行。第三,F-CALL本身不携带安全逻辑,它只是执行入口,真正的安全逻辑在F-块中。

如果F-CALL被误删或未被循环调用,安全程序将停止刷新,F-块输出会进入安全状态(通常为去能量状态),这是设计上的失效安全行为,但也会导致联锁误动作,因此F-CALL的位置和调用条件需要重点检查。

三、F-块:安全逻辑的载体

F-块是安全程序中执行安全功能的块,包括F-FB、F-FC和F-DB。它们与标准块在编程外观上相似,但受F-运行时系统管理,并带有安全属性。常用的F-块类型包括:

  • F-FB/F-FC:编写安全逻辑,如急停处理、联锁判断、许可条件计算。
  • F-DB:存放安全程序的中间状态和输出,只能被安全程序访问。
  • F-I/O访问块:用于读取F-输入模块和写F-输出模块,是安全程序与现场安全信号之间的通道。

F-块编程有两条硬性约束。其一,F-块内只能使用F-库中经过认证的指令和块,不能随意调用标准库块。其二,F-块必须被F-CALL间接调用,不能由标准程序直接调用。F-块的输出在正常运行时按逻辑刷新,在检测到安全程序故障时按配置进入安全状态。

四、安全运行组

安全运行组(Safety Run Group)是安全程序的执行单元。一个安全程序可以包含一个或多个安全运行组,每个运行组有独立的执行周期和独立的F-CALL。运行组的划分依据是安全功能的响应时间要求:响应要求高的功能放在执行周期短的运行组,响应要求低的功能放在执行周期长的运行组。

例如,急停联锁要求响应时间不超过100 ms,可放入10 ms周期的运行组;而某些温度高高联锁允许500 ms响应,可放入100 ms周期的运行组。运行组周期越短,CPU负荷越高,因此划分运行组本质上是在响应时间与CPU负荷之间做平衡。

每个安全运行组在编译后会生成独立的运行组签名。下载时,运行组可以单独下载,但同一运行组内的F-块必须整体一致,不能只下载其中一部分。

PCS 7 安全程序结构:分离、F-CALL、F-块、运行组与下载 标准用户程序 OB1 循环组织块 标准 FB / FC / DB F-CALL(唯一入口) 安全/非安全分离边界 安全用户程序(F-程序) 安全运行组 1(周期 10 ms) F-FB 急停逻辑 F-FB 联锁判断 F-DB 状态存储 F-I/O 访问:F-DI 急停输入 / F-DO 切断输出 安全运行组 2(周期 100 ms) F-FB 温度联锁 F-FB 许可条件 F-DB 输出映像 编译与下载流程 生成签名 → 编译运行组 → 一致性检查 → 下载 → 确认签名 → 进入安全运行 触发

五、安全程序的编译与下载流程

安全程序的编译与下载比标准程序严格得多,核心原因是必须保证“下载到CPU的程序”与“经过验证的程序”完全一致。流程如下。

第一步:生成安全程序签名。编译前,系统会对安全程序的所有F-块、F-DB和运行组配置计算签名(Signature)。签名是内容的数字指纹,任何修改都会导致签名变化。

第二步:编译安全运行组。在CFC/SFC中执行“编译安全程序”,系统按运行组分别编译,检查F-块调用关系、F-库指令使用、运行组周期设置是否正确。编译不通过时,错误会定位到具体F-块和具体网络。

第三步:一致性检查。编译后,系统比较离线项目与在线CPU中的安全程序签名。若不一致,说明CPU中的安全程序与当前项目不同,需要确认是下载新程序还是保留旧程序。

第四步:下载。下载安全程序需要具备安全权限,并输入密码。下载过程中CPU会进入安全停止或保持安全状态,下载完成后安全程序重新启动。

第五步:确认签名。下载后,系统显示新的安全程序签名,操作人员需要确认该签名与预期一致。这一步是安全验收的关键记录,签名应记入安全台账。

安全程序下载后,必须确认F-CALL仍在循环OB中执行、安全运行组周期与设计一致、F-I/O模块通信正常。任何一项不满足,安全程序可能不刷新或进入安全状态,导致联锁误动或拒动。

六、结构关系小结

把上述对象串起来看:标准程序通过F-CALL触发安全程序;安全程序按安全运行组划分执行周期;每个运行组内由F-块实现安全逻辑,通过F-I/O访问现场安全信号;编译时按运行组生成签名,下载时按运行组整体下载并确认签名。这条链路中,分离是前提,F-CALL是入口,F-块是载体,运行组是执行单元,编译下载是交付手段。五者缺一不可,任何一环配置错误都会直接影响安全功能的可用性和可验证性。

实际项目中,建议在CFC中为每个安全运行组建立独立的图表层级,命名中体现运行组编号和周期,例如“SG1_10ms_急停”“SG2_100ms_温度联锁”。这样在编译报错、下载确认和后期变更时,可以快速定位到具体运行组,减少误操作风险。