现场最常见的 840D 困惑:”屏幕上跳出一个 700xxx 报警,可我连它在 PLC 里哪个点都不知道。”本文把 840D PLC 用户报警的编号规则、DB2 位地址换算公式、自定义报警文本制作一次性讲透,并附可直接反复查阅的速查表。内容依据西门子官方手册口径与 840D/840D sl 实际项目经验整理。
SINUMERIK 840D 的报警分为两大类:系统报警(西门子出厂内置)和用户报警(机床制造商针对具体机型编写)。用户报警是现场最常用、也最容易被”藏起来”的一类——它不在 NC 报警手册里,全靠机床厂的电工把 PLC 位和文字一一对应。本文聚焦用户报警,尤其是 700000 段。
相关西门子报警排查可对照 828D 报警代码一览表 与 828D 报警排查流程;通用调试软件准备见 数控电气调试软件清单。
一、840D PLC 报警的三段编号范围
840D 的 PLC 报警号(由 DB2 接口位触发)整体分成三段,每段附带的”联动功能”不同:
| 报警号段 | 名称 | 触发接口 | 附带动作(取决于 FC10 参数) |
|---|---|---|---|
| 500000 – 599999 | 通道 PLC 报警 | DB2 通道区 | 可联动读入禁止、进给保持 |
| 600000 – 699999 | 轴 / 主轴 PLC 报警 | DB2 轴区 | 可联动轴使能、进给保持 |
| 700000 – 799999 | 用户区报警 | DB2 用户区(180.0 起) | 纯显示,是否联动 NC 由你编程决定 |
本文的主角是 700000 段:它是留给机床制造商自由定义的一段,每个号对应 DB2 里一个具体的位。系统报警(300000 驱动、400000 等)不在本文范围。
注意:700000 段虽然”自由”,但地址是按固定规则排布的(见下一节),不是随便挑个数就能用。

二、★ 核心换算公式:700xxx → DB2.DBX(n).bit
840D 标准用户报警一共 25 个用户区(组),每组 8 字节、64 个报警位。起始地址 DB2.DBX180.0 对应 700000。报警号写成 700xxyy:
xx= 组号(00–24,由 OB1 中 FB1 的MsgUser参数决定启用几个;默认 10,即组 0–9)yy= 组内序号(00–63,每组只用这 64 个)
换算公式:
字节 = 180 + xx × 8 + yy ÷ 8(取整数部分)
位 = yy mod 8
即:DB2.DBX(180 + xx×8 + ⌊yy/8⌋).(yy mod 8)
算例 1(最经典):700806
- 组号 xx = 08,组内 yy = 06
- 字节 = 180 + 8×8 + 6÷8 = 180 + 64 + 0 = 244
- 位 = 6
- 结果:DB2.DBX244.6 ✓(西门子技术论坛与多篇资料一致确认)
算例 2:701661
- 组号 xx = 16,组内 yy = 61
- 字节 = 180 + 16×8 + 61÷8 = 180 + 128 + 7 = 315
- 位 = 61 mod 8 = 5
- 结果:DB2.DBX315.5
算例 3:700458(官方社区例题)
- 组号 xx = 04,组内 yy = 58
- 字节 = 180 + 4×8 + 58÷8 = 180 + 32 + 7 = 219
- 位 = 58 mod 8 = 2
- 结果:DB2.DBX219.2
重要约定:每组只使用 yy = 00–63 这 64 个号(如 700000–700063)。700064–700099 这类不在标准分区内(按公式会与下一组的 00 号撞位),写程序时一律按
xx00–xx63编。

2.1 用户区 0–9 地址速查表(默认 MsgUser=10)
下表是默认配置(启用组 0–9)下的标准映射。注意组内前 4 字节(yy 00–31)是 EM(错误信息),后 4 字节(yy 32–63)是 OM(操作信息),二者行为不同,详见第四节。
| 用户区 | DB2 地址 | 报警号范围 | 前 4 字节 | 后 4 字节 |
|---|---|---|---|---|
| 0 | DBX180.0–187.7 | 700000–700063 | yy 00–31 EM | yy 32–63 OM |
| 1 | DBX188.0–195.7 | 700100–700163 | yy 00–31 EM | yy 32–63 OM |
| 2 | DBX196.0–203.7 | 700200–700263 | yy 00–31 EM | yy 32–63 OM |
| 3 | DBX204.0–211.7 | 700300–700363 | yy 00–31 EM | yy 32–63 OM |
| 4 | DBX212.0–219.7 | 700400–700463 | yy 00–31 EM | yy 32–63 OM |
| 5 | DBX220.0–227.7 | 700500–700563 | yy 00–31 EM | yy 32–63 OM |
| 6 | DBX228.0–235.7 | 700600–700663 | yy 00–31 EM | yy 32–63 OM |
| 7 | DBX236.0–243.7 | 700700–700763 | yy 00–31 EM | yy 32–63 OM |
| 8 | DBX244.0–251.7 | 700800–700863 | yy 00–31 EM | yy 32–63 OM |
| 9 | DBX252.0–259.7 | 700900–700963 | yy 00–31 EM | yy 32–63 OM |
若把 FB1 的 MsgUser 设到 25,可启用组 0–24,最大到 DB2.DBX372.7(对应 702400–702463)。MsgUser 改动后必须删除 DB2、DB3 重新上电才能再生数据块。
2.2 UDT1002 扩展接口的地址偏移差异
标准接口是 UDT2(FB1 参数 ExtendAlMsg = FALSE)。若启用扩展报警机制(UDT1002,ExtendAlMsg = TRUE),报警位的 DB2 字节偏移会发生变化——扩展接口下报警位不再从 180.0 起,而是按 UDT1002 的符号定义整体偏移。不同 Toolbox 版本偏移不同,实际地址一律以当前项目的符号表(symbol table)为准,不要凭记忆硬编码。UDT1002 的额外好处见第三节。
三、UDT2 vs UDT1002 两种接口怎么选
| 项目 | UDT2(标准) | UDT1002(扩展) |
|---|---|---|
| 激活方式 | FB1 参数 ExtendAlMsg = FALSE(默认) | FB1 参数 ExtendAlMsg = TRUE |
| 报警位地址 | DB2 用户区 180.0 起(上表) | 按 UDT1002 符号偏移(以项目符号表为准) |
| %Z 附加整型值 | 不支持 | 用户区 0 支持 %Z 16 位整型附加值 |
| 通道 / 轴 / 用户区数量 | 受标准接口限制 | 支持 10 通道、31 轴、64 用户区 |
| 适用 | 大多数改造、常规报警 | 需带数值报警、容量更大的项目 |
选型建议:普通”某条件成立→提示一条文字”用 UDT2 足够;需要”报警里顺带显示压力值、计数值”这类带参数数值的,用 UDT1002 并在对应数组(如 AddValUserA0)里写入 16 位整型。
四、FC10(AL_MSG)调用与 ToUserIF 参数含义
报警显示由 FC10(AL_MSG) 在 OB1 中调用实现:它读取 DB2 的位,翻译成 MMC 上的错误 / 操作信息。调用位置很关键——必须紧跟 MCP / 手轮传输块之后,否则会错过 HMI 的轮询窗口,出现”位已置 1 但屏幕不显示”。
4.1 EM 与 OM 的区别(决定了报警怎么消失)
每个用户区的前 4 字节 = EM(错误信息,红色),后 4 字节 = OM(操作信息,黑色):
- EM:触发后一直显示,即使触发条件消失也不自动清除,必须按面板 RESET(Quit) 确认才消失。
- OM:触发条件一消失就自动消失,无需确认。
所以 700000–700031 是 EM,700032–700063 是 OM——编报警时想让”故障必须人工确认”就放 EM 区,想”提示一下、好了就走”就放 OM 区。
4.2 ToUserIF 的 TRUE / FALSE 差别(仅对 500000 / 600000 段有效)
ToUserIF 决定是否把”进给保持 / 读入禁止 / NC 启动禁止 / 进给停止”等组信号送到通道与轴接口:
- ToUserIF = TRUE:DB2 中 500000 / 600000 段的位会经”或”运算送到 DB21(通道)和 DB3x(轴)的接口信号,置位即自动产生进给保持、读入禁止等联动。此时 PLC 里不要再直接操作这些接口信号。
- ToUserIF = FALSE:只产生报警号,不自动联动 NC 动作,是否停进给由你自己在 PLC 里另写逻辑。
用户区(700000 段)本身默认只是显示,是否联动 NC 完全看你有没有额外编程——这也是为什么很多”用户报警亮了但机床照常跑”:它本来就没接停机逻辑。
Quit 参数接确认位(如面板 RESET 键 I3.7,或 DB21.DBX7.7)。EM 靠它清除,OM 不靠它。

五、用 ALARM_S / ALARM_SQ(SFC17 / SFC18)做自定义编号报警
除了”置 DB2 位”这种静态映射,840D(S7-300 PLC)还可用系统功能 SFC17 = ALARM_S、SFC18 = ALARM_SQ 在程序里动态生成报警:
- 通过
ID/EV_ID指定任意报警号,配合SD传数据,不受 700xxx 接口位数量约束,适合需要大量、编号不固定、或要带关联数据的报警。 ALARM_SQ带确认、ALARM_S不带确认。- ⚠️ 注意:ALARM_S / ALARM_SQ(SFC17/SFC18)属于 S7-300 标准指令,在 SINUMERIK ONE(S7-1500 平台)已不被支持,迁移时需改用
Program_Alarm。840D sl 仍可正常使用。
六、报警文本制作与安装路径(840D sl 新 HMI)
840D sl 的 Operate HMI 用 .ts(基于 XML 的 Qt 翻译格式)存放报警文本。制作步骤:
- 从系统目录
/siemens/sinumerik/hmi/template/lng/复制模板oem_alarms_deu.ts; - 改名为
oem_alarms_plc_chs.ts(文件名末三位是语言代码,见 6.1); - 用支持中文的编辑器(如 UltraEdit)打开,保存时务必选 UTF-8 编码 + DOS 换行符(CRLF),否则中文乱码;
- 拷到系统目录
/oem/sinumerik/hmi/lng(或/user/sinumerik/hmi/lng); - 让 HMI 重新上电,系统会自动在同目录生成
oem_alarms_plc_chs.qm。若 .qm 没生成,文本一定显示不出来。
6.1 语言代码 chs / eng / deu 的用法
文件名末三位即语言:
| 代码 | 语言 |
|---|---|
| chs | 中文简体 |
| eng | 英文 |
| deu | 德文 |
系统按当前 HMI 语言自动调用对应文件,因此多语言报警要为每个语言各做一份。
6.2 带参数报警(%Z / %1)的文本格式
.ts 内每条报警按 报警号/PLC/PMC 文本 的格式写。可用占位符代入动态值:
%Z:16 位整型附加值(用户区 0 在 UDT1002 下支持,值写到AddValUserA0数组);%1–%4:通用参数占位符,由 PLC 侧关联数据传入。
示例(来自实际 840D sl 项目):
600409/PLC/PMC 主轴风扇过载,主轴停止
700006/PLC/PMC 机床操作面板%Z急停
720065/PLC/PMC 手轮急停报警
若 .ts 里没给某报警写文本,屏幕上只会显示报警号加四个 O 型字符。

七、报警”复位不掉”的三种典型原因与处理
这是现场最高频的追问。按下面三条排查,基本能覆盖 90% 的情况:
7.1 你用的是 EM,但它本来就要确认
EM(yy 00–31)设计上就是”锁存 + 需 RESET 确认”。如果报警条件早已消失,屏幕上还挂着,这是正常行为——按面板 RESET 或接好的 Quit 位即可清掉。想”条件一消失就自动没”,应改用 OM 区(yy 32–63)。
7.2 Quit 没接好,或 PLC 仍把位顶着
Quit参数没接到确认键 / 确认位,EM 永远等不到确认;- 更隐蔽的是:PLC 程序里那个写 DB2 位的线圈一直被条件置 1(比如自锁没复位、或条件逻辑写反),位始终是 1,自然清不掉。用变量表监控对应
DB2.DBX位,看它在条件解除后是否真回到 0。
7.3 MsgUser 太小 / OB100 / OB121 异常
- 若报警号落在
MsgUser启用范围之外,对应 DB2 位根本没被分配,写进去”无响应”,现象可能千奇百怪; FB1必须在 OB100(冷启动) 中正确初始化,否则 FC10 接口失效;- 若写位触发了 OB121(同步错误) 或 PLC 进了 STOP(见第八节 UFEHL),报警服务本身中断,复位当然无效。
八、UFEHL 是什么?为什么它会让 PLC 停机
UFEHL = User Fault(德语 Benutzerfehler,用户故障),出现在 840D/840Di SL 编程手册第 9 章。它不是一个普通报警,而是 PLC 因检测到用户程序故障而进入 STOP 的停机状态。
屏幕上若显示 UAFEHL 700806 这类,编号规则和用户报警一致(700806 → DB2.DBX244.6),意思是:这个 DB2 位对应的用户报警处理环节出了故障,系统选择停 PLC 而不是冒险继续。
常见根因(按出现频率):
- FB1 未在 OB100 初始化——后续 FC 调用因指针未初始化而失败;
- 缺实例数据块——如 FC10 需要 DB10、FC19 需要 DB19,缺失即报错;
- FC10 调用位置错——不在 MCP 传输块之后,接口时序错乱;
- MCP 的 MPI 地址不匹配——面板与 NCU 建不起通信;
- OB121 同步错误——写位/访问越界触发。
处理顺序:记下停机时显示的 UFEHL 编号 → 在 STEP 7 / TIA 中打开 DB2 看对应位是否为 1 → 查 OB100(FB1 初始化)与 OB121(错误处理)逻辑 → 核对 MCP MPI 地址与实例 DB → 清条件后重新上电。所有改动前请先备份 PLC 程序(参见 828D 参数备份与恢复 的备份思路,PLC 同样要先存再动)。
九、查别人机床的 700000 报警:只需一个 PLC 接口位
给别人修机时,你手里没有对方的报警文本源,但方法很简单——只要找到一个 PLC 接口位:
- 记下报警号,用第二节公式算出
DB2.DBX地址; - 在线监控该位,确认它确实在报警时变 1;
- 在 PLC 程序里反查是哪个网络写这个位:很多机床厂会把报警先编在自定义 DB(如 DB200),再用
SFC20 BLKMOV整块搬进 DB2 用户区——此时真正的触发条件在源 DB,不在 DB2; - 顺藤摸瓜找到那个条件(一个输入点、一个中间继电器、一个比较结果),报警含义就清楚了。
一句话:700000 段报警 = 一个 DB2 接口位 = 机床厂自定义的某个工况。位找到了,原因就找到了。
十、小结与引用说明
- 700000 段用户报警按
700xxyy排布,每组 64 个,DB2.DBX(180 + xx×8 + ⌊yy/8⌋).(yy mod 8); - EM(yy 00–31)需确认、OM(yy 32–63)自动消失;FC10 的
ToUserIF决定 500000/600000 段是否联动 NC; - 带参 / 大容量用 UDT1002 + SFC17/SFC18;
- 文本用
oem_alarms_plc_chs.ts放/oem/sinumerik/hmi/lng,重启生成.qm; - 复位不掉、UFEHL 停机都先回到”位有没有真变 0、FB1/OB100/OB121 正不正常”。
本文依据西门子官方手册口径与公开技术资料整理,不同 NCU 软件版本、Toolbox 版本在字节偏移、块号上可能有差异,现场以你当前项目的符号表和 Toolbox 头文件为准。欢迎引用,引用时请保留来源标注。
























暂无评论内容