普通程序发出启动请求,安全程序判断是否允许执行,HMI 再显示当前状态。这三件事看起来只要交换几个变量,却同时涉及读写权限、数据来源和取值时机。变量能接进安全块,不代表它已经变成故障安全信号。 [1] [3]

这是「SIMATIC Safety 工程笔记」的数据交换篇,写给已经理解 FB、DB 和 F 运行组、需要审查标准与安全程序接口的读者。沿一条“请求进入、状态返回”的路径,说明交换区怎么分工、预处理解决什么,以及哪些问题仍须由安全逻辑判断。本文不讨论不同 PLC 之间的安全通信协议,也不提供整机可投运程序。

规则基线为 Siemens《SIMATIC Safety – Configuring and Programming》V21(11/2025),以 S7-1200/1500 为主。实际调用图来自 V20 文档集合中的 S7-1200 入门例程,单独标明范围。代码只演示标准侧的一次赋值;接口命名和更新情境是解释用例,未进行 TIA Portal 编译、仿真或实机验证。

修改或测试前:保存工程,确认维护权限、设备状态和危险能量控制。不要通过标准程序反写 F-DB、强制安全输出或自动制造确认来验证接口;改变数据来源、更新时机或使用含义后,应评估受影响的安全功能。 [1] [9]

一、先看一个真实调用:启动请求不是安全条件本身

官方 S7-1200 例程把 Start 与 #EN_Safety 做 AND,再把结果送入 FDBACK.ON。看图 1 时先只追踪左侧两条输入:前者提出接通请求,后者表示例程中已有的安全回路允许。右侧的反馈监控并不把任意请求都直接送往负载。 [11]

官方例程中 Start 与 EN_Safety 经 AND 接入 FDBACK.ON,区分动作请求和安全回路允许
图 1:沿左侧 AND 读出请求与允许的不同职责,不把请求位当成防护状态(图片来源:Siemens,Fail-safe modules Manual Collection V20,12/2024,S7-1200 Functional Safety Manual,Getting started / Step 9,Procedure 原图,资料 [11];图中 CPU 为 1214FC,复用媒体 357)。

这个网络能说明条件怎样组合,但没有展示专用交换 DB 或预处理 FC。下面会把同样的“请求”用途扩展为一个接口设计例子,不能据此声称原图已经包含那些对象。图中的输出地址也不用于本篇接线或移植。

Siemens 的 S015 要求:不得把普通变量直接当作可靠安全来源,必须在安全程序中完成针对过程的合理性检查。比较允许范围、限制普通信号只能撤销而不能建立允许、将启动请求与故障安全条件组合,都是文档给出的思路;并非任意变量都存在足够简单的检查办法。 [3]

以一个布尔请求作推理:检查它是不是 0 或 1,没有增加有效信息;需要分析的是它错误地保持 1、提前出现或不再更新时,会不会引发危险。相似地,数值落在上下限之间,只证明它通过范围条件,不证明它一定反映真实过程。这个区别不能靠把变量改名为 SafetyEnable 解决。

二、读写权限落实到变量,不是整个 DB 都可随意双向使用

下表摘取本篇涉及的操作数范围。这里的“读/写”描述程序访问权限,不是 HMI 权限设置,也不代表物理通道已通过安全设计。标准 I/O 的输入映像在安全程序中只读,输出映像只写;Software Unit/Safety Unit 还须核对对应范围。 [1]

对象 标准程序 安全程序
标准 DB 的某个变量/某个位存储器 可读、可写 对该变量选择读或写,不能任意双向访问。
F-DB 变量 可读,不可写 按安全程序和运行组规则读写;系统成员另有方向限制。
F-I/O 输入过程映像 只读 只读。
F-I/O 输出过程映像 只读 只写,不能拿来作一般读写缓冲。

一个 DB 可以包含不同方向的字段,但同一个标准字段不能既是安全程序的输入,又被当作它的输出暂存区。需要“请求/接受结果”时,分别定义字段,比两边轮流清同一个位更容易查清写入责任。前半句来自操作数限制,分字段是本文的接口组织建议。 [1] [2]

标准 DB 和位存储器用于两类程序交换,不可充当安全程序内部 F-data 的缓冲区;相应标准变量也不能作为 F-FB/F-FC 的 InOut 实参。把安全中间结果先写进普通 M 位,再从那里读回继续作安全判断,会混淆这条边界。 [2]

所以,“标准程序可以读到安全状态”与“标准程序能修改安全控制”必须分开。HMI 需要显示或提出普通请求,并不构成反写 F-DB 或安全输出的许可。具体模块成员方向可查 F-I/O DB 状态与控制接口。

三、专用交换区把依赖隔开,也要说明谁负责更新

手册建议使用专门的 transfer data blocks(交换数据块),避免标准和安全程序直接依赖彼此大量内部变量。这里的“专用”指用途清楚,不是创建一个名字带 Safety 的普通 DB,就获得了数据安全认证。 [1]

以启动请求为主线,下面把原始请求、供本运行组读取的副本、返回显示的状态分开。名称均为本文自拟,类型用于解释字段职责,不是 Siemens 自动生成的接口,也没有把这些 DB 建入任何实际工程。

示例字段 拟定写入方 → 使用方 接口要说明的事
StandardRequest.Start(BOOL) 标准侧请求逻辑 → 预处理 请求来自哪里,操作或通信中断时如何处理。
StdToF.Start(BOOL) 标准预处理 FC → 本 F 运行组 本轮固定读取的请求;其他程序和 HMI 不应同时改写这份副本。
StatusForHMI.Permit(BOOL) 安全程序 → 标准程序/HMI 显示安全逻辑的允许结果,不等于电机已经转动或接触器已经吸合。

这个组织方法没有规定必须恰好使用三个 DB。关键是把每个字段的方向、更新责任和用途写清楚;请求被接收、逻辑允许成立、执行器实际动作,应保留各自含义,不能统称一个“运行正常”位。

接口说明还应约定类型、单位、可接受范围和失效处理。单位从秒改成毫秒,即使仍使用同一个整数类型,使用方的含义也会改变。这是接口语义的例子,不是声称某个项目发生过该故障;只比较 DB 结构无法回答所有使用约定是否相同。

四、预处理先稳定本轮输入,不负责把普通值变成安全值

若普通程序、较高优先级中断或 HMI 可能在 F 运行组执行期间改写来源,应按手册使用中间位存储器或标准 DB;S7-1200/1500 推荐通过标准 FC 预处理组织传入。随后安全逻辑只读取这些规定的中间变量。时钟存储器也可能异步变化;忽略这一条件可能使 F-CPU 进入 STOP。 [3]

下面只演示一次标准侧复制:假定两个示例 DB 都已声明 Start : BOOL,语句位于标准 SCL FC 中。它不是安全程序,也没有包含过程合理性检查、启动保护、通信失效处理或多字段交接协议。未编译、未运行。

// 仅演示标准预处理 FC 中的一次复制
"StdToF".Start := "StandardRequest".Start;

标准 FC 要在 Safety Administration 的 Pre-/post-processing of the F-runtime group 中分配,才构成该运行组的预/后处理;只在项目树里创建同名 FC 不等于建立了这层调用。这里允许标准 FC,块接口仅可包含临时局部数据和常量,前例因此访问已声明的全局 DB。 [4]

设定一个没有其他写入者的逻辑情境:预处理先把请求 1 复制进 StdToF.Start;本轮安全逻辑开始后,HMI 把原始请求改成 0。若本轮只读副本,读到的仍是采样时的 1,下一轮预处理才取到新的 0。这是由赋值和访问安排推导的结果,不是实测时序。

这同时说明稳定取值的代价:它不会立即跟随原始地址的每次变化。普通请求不能借这条路径冒充紧急停止信号;需要快速、可靠响应的安全输入,应按完整安全功能设计处理。若副本还被别处更新,前述“本轮不变”的推理前提也不成立。

多字段来自同一批更新,是另一个问题

再假设接口同时接收配方号和设定值。写入方先更新配方号、后更新设定值,复制刚好发生在两次更新之间,就可能取得“新配方号+旧设定值”。把它们放在一个 DB、甚至在一个 FC 中逐项复制,本身并不能证明它们属于同一次提交。

因此需要区分三项:运行组读取期间是否稳定、多字段是否属于同批有效数据、这些数据是否具有安全可信度。前两项可作为普通接口的交接设计问题分析,例如规定提交时机和接收结果;但本文没有为未知设备给出已验证协议,序号或复制动作也不会自行代替 S015 所要求的安全判断。

前述检查不能只放在普通预处理里。若同一标准来源被两个 F 运行组使用,文档要求每组分别执行过程相关的合理性检查。不同读取时刻还应分别记录,不能把共用来源理解为两组必然使用同一时刻的数据。 [3]

五、安全状态返回标准侧后,仍须保留含义和有效性

标准程序可以按全限定符号读取安全程序的实例 DB、F-DB 及 F-I/O 过程映像;安全程序也可以向允许的标准交换对象写出数据,包括非故障安全的诊断服务信息。向标准侧传递时,不会因此继续检查安全程序及安全相关数据的完整性。这不是一条可代替安全通信协议的通道。 [5]

需要向 HMI 显示前例中的允许状态,可以读取规定的安全对象,或使用约定的输出交换字段。前一种方式依赖内部符号,后一种方式可把显示接口单独维护;无论哪种,都应把“数据已读到”与“设备实际执行”分开。输出过程命令存在,不代表模块未钝化或负载已经动作。 [8]

例如,显示一扇门的状态时,过程值 0 既可能是有效的现场结果,也可能是安全替代值。适用的 Value Status 为 1 表示有效过程值,为 0 表示安全替代值。将过程值和有效性一起解释,才不会把所有 0 都显示成“门确实打开”。 [7]

还要将通道数据有效性与 HMI 通信是否新鲜分开:显示端保存的旧质量位,不能证明当前连接仍在更新。记录接口时应说明断线后的显示和陈旧状态处理;这一显示设计建议不授权安全逻辑继续沿用旧的允许值。数字安全输入仍需遵守 S009,处理系统给出的过程映像值。 [8]

同一次现象的记录应写清观察时刻。手册说明 S7-1200/1500 的 F-I/O 输入过程映像在主安全块处理前更新;原页另有 S7-300/400 的更新差异说明,不能混用为本项目结论。HMI 的刷新画面也不是安全程序每次执行的完整轨迹。 [5]

六、只改标准部分,也要检查接口语义、时间和分配

标准 DB 若被安全程序直接使用,结构变化会使安全程序不一致,需要相应安全项目访问权限。手册还说明,这种变化重新编译后,总体 F 签名可恢复为原值。所以,签名相同不能单独证明标准接口从未变化。 [3]

预/后处理还存在时间影响:它们的耗时计入运行组运行时间,但不会因此改变总体 F 签名。增加复制、循环或标准计算以后,除了检查字段,还需重新观察实际负荷与相关时间要求。签名用于对应数据身份,不负责替接口完成所有实时性检查。 [4]

维护时同时查代码与分配关系。删除已分配 FC 或用复制覆盖它,会复位预/后处理选择;单独从 CPU 上传 FC 也不会自动恢复分配。改变 FC 内容与改变其调用分配的下载条件不同,不能把文档中“内容可在 RUN 修改”的说明推广成所有修改都无需 STOP。 [4]

使用 Safety Unit 的项目还要查交换块放在哪里

已经采用 Safety Unit 的 S7-1500 工程,官方要求把与标准程序交换用的 transfer DB 放在 Safety Unit 内。这是该工程组织方式的特定要求,不是说所有已有项目都应立即迁移。软件单元的可见性与访问关系仍须按实际项目核对;本篇不以修改文件夹位置替代正式组态。 [10]

无论是否采用软件单元,变更都应从依赖分析出发:哪个写入方、单位、刷新条件或结果用途改变了?Siemens 要求检查有意和无意的安全相关改动,再确定复验范围;受影响对象可能没有直接改过安全代码。 [9]

七、用接口清单与安全摘要交叉核对,再安排验证

先为每项数据留下“来源—写入方—读取方—用途—更新时间—异常处理”的对应记录。然后对照安全摘要的 Data from the standard user program 部分:它列出安全程序读取的普通变量,不列出安全程序只写出的普通变量。未出现在这里,不能直接证明交换接口不存在。 [6]

另有一项资料边界:在专有技术保护 F 块中被使用的普通变量不包含在该清单中,相应合理性检查由受保护块创建者实现。遇到这种对象,需要核对其说明和适用条件,不能只凭可见清单宣称所有普通来源已经查完。 [3]

执行验证之前:批准测试环境、允许的输入刺激、能量控制和恢复条件。下表是用于编制验证计划的检查情境,不是在生产设备上强制请求或中断安全信号的操作授权。

检查情境 分别观察什么
正常请求与撤销 原始请求、副本、允许结果和执行器状态,不只观察其中一个位。
来源在运行组处理中变化 本轮读取对象是否固定,下一轮何时采用新值,有没有第二个写入者。
多字段更新中途被读取 是否可能混合新旧数据,规定的提交与接收条件是否真正落实。
输入钝化、显示断线或数据不再更新 区分通道有效性、显示新鲜度与实际安全反应;不得把旧状态当当前事实。
接口结构、语义或预处理修改后 核对编译/分配、时间影响和相关功能复验,不以签名或编译单项代替。

预期结果应在测试前写明,实际结果只记录真正观察到的内容。本文没有填写任何测试通过结论;给定范围、超时或故障响应应来自具体安全功能的依据,而不是从示例字段名推导。

本篇的终点是能够解释:谁提出请求,哪份值供本轮使用,谁判断安全条件,以及显示端的状态能证明什么。运行组归属回看 F-OB、主安全块与 F 运行组;修改后的交付资料见 程序验收、签名与归档。

资料来源

第 1~10 项均为 Siemens《SIMATIC Safety – Configuring and Programming》V21,11/2025;第 11 项为 V20 文档集合内的 S7-1200 官方例程。本文将文档规则、真实例程和自行命名的解释用例分开,后两者不构成本站实测工程。

1. Siemens:Data exchange between standard user program and safety program。读写权限表及专用 transfer data blocks;保留对单个标准变量“读或写”的限定。

2. Siemens:Restrictions in the programming languages FBD/LAD。Supported operand areas;标准 DB/位存储器的方向、InOut 和 F-data 缓冲限制。

3. Siemens:Data Transfer from Standard User Program to Safety Program。S015、运行期间取值变化、时钟存储器、标准 DB 结构变更,以及受保护块的摘要边界。

4. Siemens:Pre-/postprocessing (S7-1200, S7-1500)。标准 FC、临时变量/常量、分配入口、时间与签名影响,以及复制或单独上传后的分配检查。

5. Siemens:Data Transfer from the Safety Program to the Standard User Program。符号读取、向标准侧写出、传递中的完整性边界;不混用 S7-300/400 专属过程映像说明。

6. Siemens:Other characteristics。Plausibility check for data transfer;安全摘要的 Data from the standard user program 查阅范围。

7. Siemens:Value status (S7-1200, S7-1500)。Properties;有效过程值与安全替代值的区别,不移植示例地址。

8. Siemens:Process Data or Fail-Safe Values。数字输入 S009、输出钝化与过程命令的区别;不引用有歧义的过程映像表格条目。

9. Siemens:Acceptance of Changes。Introduction、影响分析与 S072;未执行任何设备验收。

10. Siemens:Safety program in Software Unit (Safety Unit) (S7-1500)。Safety Unit 中存放 transfer DB 的要求;本篇不提供迁移或库发布教程。

11. Siemens:Step 9: Programming the feedback monitoring。Fail-safe modules Manual Collection V20,12/2024,S7-1200 Functional Safety Manual / Getting started;Procedure 原图与 AND 参数表。只取启动请求和安全允许的连接,不移植输出绝对地址。

图片说明:正文调用图取自资料 [11] 的官方原图,未生成或改绘,图中参数与地址属于原例程,不是本文的交换 DB 示例。第三方图片权利归 Siemens,不随本站原创文字的 CC BY-NC-SA 许可重新授权。

修订说明:补足双向数据流、单变量读写限制、预处理副本与多字段交接的区别,以及输出显示和变更复核。正文不设目录。资料复核:2026-09-10;代码与验证情境均未进行编译、仿真或实机测试。