C 功能块怎么读写 PLC 的内存?本课讲清 W[i] 对应 D[i]、B[i] 对应 M[i] 的映射,让你在 C 里自由操作软元件。
C 功能块眼里只有两块内存:一块放数,叫 W 数组,每个格子 16 位,装一个短整型;一块放开关,叫 B 数组,每个格子 8 位,只当 0 和 1 用。W[0]、W[1] 往下排,B[0]、B[1] 也往下排,就这么简单。
绑到寄存器上:W[0] 就是 HD0,W[1] 就是 HD1,一一对齐,不多不少。所以上一课的 HD1 阈值、HD2 计数值,在 C 里写的就是 W[1]、W[2]。读它就是读寄存器,写它就是写寄存器,实时生效。
位也一样:B[0] 对应 HM0,写 1 就点亮,写 0 就熄灭。注意 B 的每个格子是 8 位宽,但我们只用它当开关,别拿它存大于 1 的数——要存数回 W 区去,这是两块内存的分工。
底层一点:W 区从 0 号字节开始,每个数占 2 个字节,所以 W[3] 在第 6 字节;B 区从 16384 号字节起,每个占 1 字节。这个分界编译器和运行时都认,你只要记住 W 放前头、B 放后头就行。
本仿真器里 C 块统一用 FUNC1 HD0 HM0 挂载:基址平移到 HD 和 HM,W 数组落在 HD 区、B 数组落在 HM 区。为什么不绑 D 和 M?因为工艺场景每帧都要写 D0 到 D2,绑过去就会互相覆盖,这是实打实踩过的坑。
回头再看自由计数器,现在应该一目了然:W[1] 读 HD1 当阈值,W[2] 读 HD2 做自增,B[0] 写 HM0 当完成位。内存模型就这么一层,下一课开始写真正的定时器,把这套路子用起来。