屏幕上跳出一条 7000xx 报警,你打开 PLC 程序想找那个”1″,翻遍 DB2 也找不到——因为你找错了数据块。828D 的用户报警激活位在 DB1600,840D 在 DB2;更要命的是,两家的算法也不是一回事:828D 是顺序排列(248 条挨着排下去),840D 是分组排列(每 8 字节一组 = 64 条)。同一个 700xxx 号段,套错算法算出来的地址差出几十个字节。
这篇把 828D 侧的地址算法、扩展报警段、报警文本文件和”进报警日志”的设置一次讲清,并给一张与 840D 的逐项对照表。所有数据均来自西门子官方调试手册与西门子中国 CNC4YOU 应用文档,手册里没写清楚的(比如 MD14516 的 Bit5)我会把两版口径都摆出来,标明需实机验证,不猜。
相关阅读:840D 侧的 DB2 分组算法见 SINUMERIK 840D PLC 用户报警详解:700000 段报警号 → DB2 位地址换算;828D 报警号整体分段规则见 SINUMERIK 828D 报警号分段速查表。
一、两个系统的算法不同:828D 是顺序排列,840D 是分组排列
这是本文最值钱的一条。两边都是 700000 起头,但“序号 → 地址”的映射规则完全不同,混用必然算错。
表 1 828D 与 840D 用户报警地址算法对照
| 项 | SINUMERIK 828D(顺序排列) | SINUMERIK 840D(分组排列) |
|---|---|---|
| 激活位所在数据块 | DB1600 | DB2 |
| 起点 | 700000 = DB1600.DBX0.0 | 700000 = DB2.DBX180.0 |
| 算法 | 顺序:字节 = 序号 ÷ 8 取整;位 = 序号 ÷ 8 的余数 | 分组:180 +(中间两位 × 8)+(末两位 ÷ 8 的商 . 余数) |
| 算例 700247 | 247 ÷ 8 = 30 余 7 → DB1600.DBX30.7 | 按分组式:180 + 02×8 + 47÷8(商 5 余 7)= DB2.DBX201.7 |
| 算例 700352 | 828D 标准段止于 700247,此号落在扩展段 | 180 + 03×8 + 52÷8(商 6 余 4)= DB2.DBX210.4 |
| 算例 701661 | 828D 侧落在扩展段(701000–701999) | 180 + 16×8 + 61÷8(商 7 余 5)= DB2.DBX315.5 |
| 标准条数 | 248 条(700000–700247) | 分组连续排列 |
828D 的顺序算法写成公式就三行:
序号 N = 报警号 - 700000
字节 = N / 8 (取整)
位 = N % 8 (余数)
地址 = DB1600.DBX<字节>.<位>
拿 700247 试一遍:N = 247 → 247 / 8 = 30,247 % 8 = 7 → DB1600.DBX30.7。和手册表里的最后一行一致。
而 840D 的分组算法要拆成三段算:报警号 700000 的后四位拆成”中间两位”和”末两位”,中间两位乘 8 是组偏移,末两位除以 8 是组内位置。这套拆法在 828D 上没有任何意义——828D 就是一条一条往下排。

二、828D 标准用户报警:248 条 → DB1600.DBX0.0 – DBX30.7
官方原文:SINUMERIK 828D 提供 248 个用户报警(700000 – 700247),对应接口信号为 DB1600.DBX0.0 – DB1600.DBX30.7。每条报警除了激活位,还配一个变量接口(用来往报警文本里填数)和一个报警响应字节。
表 2 828D 标准用户报警地址速查(官方表节选)
| 报警号 | 激活位(PLC 信号) | 变量接口 | 报警响应 |
|---|---|---|---|
| 700000 | DB1600.DBX0.0 | DB1600.DBD1000 | MD14516[0](或 DB4500.DBB3000) |
| 700001 | DB1600.DBX0.1 | DB1600.DBD1004 | MD14516[1](或 DB4500.DBB3001) |
| 700002 | DB1600.DBX0.2 | DB1600.DBD1008 | MD14516[2](或 DB4500.DBB3002) |
| 700003 | DB1600.DBX0.3 | DB1600.DBD1012 | MD14516[3](或 DB4500.DBB3003) |
| 700004 | DB1600.DBX0.4 | DB1600.DBD1016 | MD14516[4](或 DB4500.DBB3004) |
| 700005 | DB1600.DBX0.5 | DB1600.DBD1020 | MD14516[5](或 DB4500.DBB3005) |
| 700006 | DB1600.DBX0.6 | DB1600.DBD1024 | MD14516[6](或 DB4500.DBB3006) |
| 700007 | DB1600.DBX0.7 | DB1600.DBD1028 | MD14516[7](或 DB4500.DBB3007) |
| 700008 | DB1600.DBX1.0 | DB1600.DBD1032 | MD14516[8](或 DB4500.DBB3008) |
| …… | …… | …… | …… |
| 700246 | DB1600.DBX30.6 | DB1600.DBD1984 | MD14516[246](或 DB4500.DBB3246) |
| 700247 | DB1600.DBX30.7 | DB1600.DBD1988 | MD14516[247](或 DB4500.DBB3247) |
变量接口的规律:起始 1000,每条 +4 字节——所以官方手册里有的版本印成 DBD(双字)、有的版本印成 DBW(字)。按”+4 步进”这个事实判断,DBD(4 字节)才是对的,DBW 那版大概率是印刷口径遗留。
报警响应有两种写法:官方调试手册(10/2015 版)写的是 DB4500.DBB3000 – DBB3247,另一版手册与绝大多数中文资料写的是 MD14516 $MN_USER_DATA_PLC_ALARM。两者指同一件事(报警反应/清除条件),你手上这台机器认哪个,以实机为准;下文统一用 MD14516 表述。
三、828D 扩展用户报警:1000 条 → DB1600.DBX4000.0 – DBX4124.7
248 条不够用时,828D 可以激活扩展 PLC 报警:额外 1000 条,编号 701000 – 701999,激活位在 DB1600.DBX4000.0 – DB1600.DBX4124.7(1000 条 = 125 字节)。
表 3 828D 扩展用户报警速查
| 项 | 值 |
|---|---|
| 报警号范围 | 701000 – 701999(1000 条) |
| 激活位 | DB1600.DBX4000.0 – DB1600.DBX4124.7 |
| 变量接口 | DB1600.DBD5000 起,每条 +4 → 701247 = DB1600.DBD5988 |
| 可用数字变量的号段 | 仅 701000 – 701247;701248 – 701999 无对应数字变量 |
| 报警响应 | DB9913.DBB0 – DB9913.DBB999(每个报警号 1 字节) |
| 软件版本要求 | 828D V4.7.4 以上;PLC Programming Tool V3.3 以上 |
| 硬件前提 | PLC 程序里必须额外包含 DB9913(超过 248 条时) |
| 操作权限 | 制造商访问级(Manufacturer) + 对应口令 |
| 显示颜色 | 红色 = 报警(进”报警列表”);黑色 = 消息(进”消息”) |
扩展段的地址算法和标准段一样是顺序的,只是起点换成 4000:
序号 M = 报警号 - 701000
字节 = 4000 + M / 8
位 = M % 8
地址 = DB1600.DBX<字节>.<位>
例:701000 → M = 0 → DB1600.DBX4000.0;701999 → M = 999 → 4000 + 124 = 4124,999 % 8 = 7 → DB1600.DBX4124.7。
701000 – 701247 这一小段是”带变量的扩展报警”:同一个报警号可以靠变量值显示不同文本(比如同一个号显示”轴 3 超程”和”轴 5 超程”)。701248 往后就没有变量了,别在这一段上找 DBD 接口。

四、报警文本文件在哪:oem_alarms_plc_xxx.ts,不是 alpu.txt
中文圈讲”西门子用户报警文本”时经常直接搬 alpu.txt——那是 840D / 810D 的东西。828D 用的是另一套文件和另一套占位符,照搬必然扑空。
表 4 报警文本文件:828D 与 840D 完全不是一套
| 项 | SINUMERIK 828D | SINUMERIK 840D / 810D |
|---|---|---|
| 文件名 | oem_alarms_plc_xxx.ts(xxx = chs / eng / deu 等语种) | alpu.txt(或 alpu_xxx.txt) |
| 存放目录 | CF 卡 oem/sinumerik/hmi/lng | 常用 …\dh\mb.dir\ |
| 文件性质 | 基于 XML 结构的文本源文件 | 纯文本,报警号 + 文本 |
| 文本占位符 | %b %d %f %i %o %u %x | %1 – %4 |
| 生效方式 | 只在系统启动时装载 → 必须重启,改动才生效 | 需重新装载 / 重启 |
| 文件名大小写 | 必须小写,否则系统不识别 | — |
| 同目录姊妹文件 | oem_alarms_cycles(循环报警)、oem_partprogram_messages(加工程序信息) | — |
828D 的占位符含义(官方表):
| 占位符 | 含义 |
|---|---|
| %b | 32 位值的二进制表示 |
| %d | 整数(十进制) |
| %f | 4 字节浮点数 |
| %i | 带符号十进制整数 |
| %o | 八进制整数 |
| %u | 无符号十进制整数 |
| %x | 十六进制整数 |
两个最容易踩的坑:
- 改完不重启。官方原话是”报警文本文件只在启动过程中被转换,必须重启系统才能激活报警”。改完文件不重启,屏幕上永远是旧文本。
- 动了文件结构。官方明确要求”文件结构不得改变”——只改文本内容和报警号,别动标签和层级。第三方资料里常见的
/oem/cfg/oem_alarms_plc_eng.ts写法与官方手册的oem/sinumerik/hmi/lng不一致,以你机器 CF 卡上的实际目录为准。
关于编码:官方手册没有给出 BOM/ANSI 的硬性规定,只要求”不改动结构”。中文环境出现乱码时,先确认编辑器没有改写编码(用与原件一致的编码另存),再重启 HMI 验证;别只改编码不重启——重启才是生效条件。

五、让 PLC 用户报警进报警日志:MD14516[xx] Bit5 = 1
828D 的报警日志默认只记系统报警,不记 PLC 用户报警。想让 7 开头的用户报警也进日志,需要单独设一位——这条官方写得很分散,中文侧几乎没人讲透。
表 5 让 PLC 用户报警进入报警日志的两种做法
| 报警类型 | 做法 | 生效方式 |
|---|---|---|
| 标准用户报警(700000–700247) | 改对应报警的 MD14516[xx] 的 Bit5 = 1 | 重启 HMI |
| 扩展用户报警(701000–701999) | 改 DB9913 中对应报警号的配置数据 Bit5 = 1 | 下载到 PLC → 重启 NCK |
官方应用文档(西门子中国 CNC4YOU,作者 Bi Zhi Chao,2020.7)原文:修改对应用户报警属性参数 14516[xx]_Bit5=1,重启 HMI 后,用户报警会显示到报警日志中。扩展报警同理,但落点在 DB9913,且要下载 PLC + 重启 NCK。
软件版本要求:V4.8 及以上。

六、MD14516 各位含义:报警反应 vs 报警/消息
MD14516($MN_USER_DATA_PLC_ALARM)是一个数组,下标与报警号一一对应:MD14516[0] 对应 700000,MD14516[247] 对应 700247。每一位管一件事。
表 6 MD14516[xx] 位定义(两版口径并列)
| 位 | 英文调试手册口径 | 中文资料 / 简明调试手册口径 |
|---|---|---|
| Bit 0 | NC 启动禁止 | NC 启动禁止 |
| Bit 1 | 读入禁止 | 读入禁止 |
| Bit 2 | 所有轴进给保持 | 进给保持 |
| Bit 3 | 急停 | 急停 |
| Bit 4 | PLC 停止 | PLC 停止 |
| Bit 5 | Reserved(保留) | = 1 让该报警进报警日志 |
| Bit 6 | 报警 / 消息定义:1 = 报警,0 = 消息 | DB1600.DBX3000.0 复位清除 |
| Bit 7 | POWER ON(断电清除) | 断电清除 |
Bit5 与 Bit6 存在两版口径冲突,必须实机确认:英文调试手册把 Bit5 标为 Reserved、Bit6 用作”报警/消息”选择;中文侧(含西门子中国 CNC4YOU 应用文档)写 Bit5 = 1 让报警进日志、Bit6 对应 DB1600.DBX3000.0 复位清除。两者都出自西门子体系,但指向不同——动手前先记录 MD14516 原值,改一条试一条。
“报警”和”消息”的区分很简单,但影响排查路径:
- 报警(Alarm):红色,显示在报警列表里,通常是需要停机/确认的(如”电机过载”);按中文口径,需在 PLC 里编程对 DB1600.DBX3000.0 复位才能清除。
- 消息(Message):黑色,显示在消息下,状态满足后自动消失(如”液压未起动”),不需要操作者确认。
至于”报警显示区只看到最新一条”——这不是故障。官方说明:有一条以上报警时,只有最新出现的一条显示在报警显示区,用向下箭头提示还有更多,需到报警清单里看。想让多条滚动显示,设 MD9056(范围 500 – 10000,单位 ms,小于 500 不滚动),官方应用文档建议 3000;828D 简明调试手册里印的”建议 300″与其自身”小于 500 不滚动”矛盾,以 3000 为准。
七、扩展报警的 DB9913 配置:每个报警号一段数据
扩展报警(701000–701999)的报警响应不走 MD14516,走 DB9913:每个报警号一段配置数据,DB9913.DBB0 对应 701000,DB9913.DBB999 对应 701999。
配置步骤(官方应用文档口径):
- 修改 PLC 类型 → 点 OK → 再点 OK 确认;
- 在程序库中双击 DB9913 并确定 → 每个报警号自动生成一段配置数据;
- 修改 DB9913 中对应报警号的配置数据,Bit5 = 1;
- 下载到 PLC;
- 重启 NCK → 扩展用户报警开始进入报警日志。
另外,DB9913 还有一个用途:多通道机床上,报警归属哪个通道由 DB9913 或 MD14518 $MN_USER_DATA_PLC_ALARM_ASSIGN 决定。单通道机床不用管这条。
前提别忘了:超过 248 条报警才需要 DB9913,且软件要 V4.7.4 以上、PLC Programming Tool V3.3 以上。老版本机器上翻遍程序库也找不到这个块。
八、808D / 828D / 840D 三者的条数差异
同一个号段、三种排法,现场最容易混。
表 7 808D / 828D / 840D 用户报警容量与地址对照
| 系统 | 标准用户报警 | 激活位范围 | 扩展段 |
|---|---|---|---|
| 808D | 128 条(700000 – 700127) | DB1600.DBX0.0 – DB1600.DBX15.7 | — |
| 828D | 248 条(700000 – 700247) | DB1600.DBX0.0 – DB1600.DBX30.7 | 1000 条(701000 – 701999)→ DBX4000.0 – DBX4124.7 |
| 840D | 分组连续排列 | DB2.DBX180.0 起(分组算法) | — |
808D 的 128 条 / DBX15.7 这组数字来自第三方整理的转载资料,未查到西门子官方手册原文,现场用前请按公式反推验证(127 ÷ 8 = 15 余 7,与 DBX15.7 自洽)。828D 与 840D 的数据均出自官方手册与西门子中国 CNC4YOU。
九、常见问题表:触发不显示文本 / 乱码 / 权限被拒
表 8 828D 用户报警故障速查
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| 位已置 1,报警号出来了但没有文本 | 该报警号没配文本;或改完文本没重启 | 官方:未配置文本时”只显示报警号”;改完必须重启系统/HMI |
| 中文乱码 | 编辑器改写了文件编码或结构 | 官方要求”文件结构不得改变”;用与原件一致的编码另存,重启验证 |
| 改文件时提示权限被拒 | 访问级不够;或文件被占用 / 只读 | 需制造商(Manufacturer)访问级口令;通过 Access MyMachine /P2P 或 WinSCP 取文件时注意系统服务占用,改完放回原目录 |
| 报警触发但动作不对(该停不停 / 直接急停) | MD14516[xx] 的 Bit0 – Bit4 设置 | 逐位核对报警反应位;Bit0 启动禁止、Bit3 急停 |
| 报警显示区只看到最新一条 | 多条报警时的默认行为 | 设 MD9056(500 – 10000 ms)滚动显示,建议 3000 |
| 报警不进报警日志 | 默认 PLC 用户报警不记日志 | 标准段 MD14516[xx] Bit5 = 1 + 重启 HMI;扩展段 DB9913 Bit5 = 1 + 下载 PLC + 重启 NCK |
| 算出的地址在 PLC 里根本不存在 | 把 840D 的 DB2 分组算法套到了 828D | 828D 一律用 DB1600 顺序算法;扩展段另起 4000 |
| 扩展报警没有 DB9913 | 软件版本不够 | 需 828D V4.7.4 + PLC Programming Tool V3.3 以上 |
十、和 840D 那篇怎么配合看
两篇是同一个号段的两半,别互相替代:
- 机器是 828D / 808D → 看这篇,激活位一律在 DB1600,顺序算法;扩展段另算;
- 机器是 840D / 840D sl → 看 840D 那篇,激活位在 DB2,分组算法(180 + 中间两位×8 + 末两位÷8);
- 不确定是哪种 → 先看报警号:828D 标准段止于 700247,看到 7003xx 及以上的号,在 828D 上只可能落在扩展段(701000 起);在 840D 上则继续按分组往下排。
相关阅读:840D 侧 DB2 分组算法与自定义报警文本制作见 SINUMERIK 840D PLC 用户报警详解;828D 报警号整体分段与”这条报警该找谁”判定见 SINUMERIK 828D 报警号分段速查表。
常见问题
828D 的用户报警激活位在哪个 DB?和 840D 一样吗?
不一样。828D 在 DB1600,840D 在 DB2,算法也不同。828D 提供 248 条标准用户报警(700000 – 700247),对应 DB1600.DBX0.0 – DB1600.DBX30.7,顺序排列:序号 N = 报警号 − 700000,字节 = N ÷ 8 取整,位 = N ÷ 8 的余数,如 700247 = DB1600.DBX30.7。840D 是分组排列,起点在 DB2.DBX180.0,按”180 + 中间两位×8 + 末两位÷8 的商.余数”计算。两边都是 700000 开头,但绝对不能混用算法。828D 若启用扩展报警(701000 – 701999),激活位另起一段:DB1600.DBX4000.0 – DB1600.DBX4124.7。
828D 怎么让 PLC 用户报警显示在报警日志里?
默认的报警日志只记系统报警,PLC 用户报警不记,需要单独设一位。标准用户报警(700000 – 700247):把对应报警的 MD14516[xx] 的 Bit5 设为 1,然后重启 HMI 生效。扩展用户报警(701000 – 701999):改 DB9913 中对应报警号的配置数据 Bit5 = 1,下载到 PLC 后重启 NCK 生效。软件版本需 V4.8 及以上。注意英文调试手册把 MD14516 的 Bit5 标为 Reserved、Bit6 用于报警/消息选择,与中文侧口径不一致,动手前先记录原值并逐条验证。
报警号 700247 对应哪个接口位?为什么 840D 的算法套到 828D 上会错?
在 828D 上,700247 对应 DB1600.DBX30.7:N = 247,247 ÷ 8 = 30 余 7。之所以 840D 的算法套过来会错,是因为两系统的映射规则根本不同——828D 是顺序排列,248 条报警按序号连续排在 DB1600 的 31 个字节里;840D 是分组排列,每 8 字节一组代表 64 条报警,要把报警号后四位拆成”中间两位”和”末两位”分别计算,起点还在 DB2.DBX180.0。同一条 700247 按 840D 分组式算出来是 DB2.DBX201.7,数据块和字节都变了。所以算之前第一件事是确认你的系统是 828D/808D 还是 840D,再选算法。
最后更新:2026-10-25
延伸阅读:828D 扩展用户报警 701000–701999 怎么加?DB9913 配置数据 + DB1600 高位段实操
面向海外读者的完整英文版,内容与本文对应 — 可直接转给非中文同事或海外客户。

























暂无评论内容