diff --git a/设计文档/宏指令.md b/设计文档/宏指令.md index d649bc3..021fd92 100644 --- a/设计文档/宏指令.md +++ b/设计文档/宏指令.md @@ -1013,7 +1013,12 @@ macro_command main() // 宏入口:进 13 end macro_command // 宏结束 ``` -**`net-apply`**(13 号窗「应用」按钮;另勾选宏属性「当 HMI 启动时即执行一次」,开机自动套用) +**`net-apply`**(工程宏 ID 037;13 号窗「应用」按钮 + 宏属性勾「当 HMI 启动时即执行一次」) + +> **设备归属(10-27 按 EB 设备列表实测,数字以此为准)** +> `设备4 = 制丸1(192.168.189.22)`、`设备5 = 上料清洗(192.168.189.2)`,两台都是 S7CommPlus + 符号寻址。 +> 所以:**上料 IP → `LW-9605` / `LB-10071`(设备5)**,**制丸 IP → `LW-9600` / `LB-10070`(设备4)**。 + ``` macro_command main() // 宏入口:点「应用」/ 开机自动套用 short v[4] = {0,0,0,0} // 4 字暂存数组 @@ -1026,7 +1031,7 @@ macro_command main() // 宏入口:点「 GetData(hmi0, "Local HMI", RW, 20, 1) // 读 RW-20(HMI IP 第一段) GetData(role, "Local HMI", RW, 60, 1) // 读 RW-60(本机角色) GetData(line, "Local HMI", RW, 61, 1) // 读 RW-61(线别) - if line == 0 then // 线别未设置/无效? + if line == 0 then // 线别未设置? line = 1 // 默认 A 线 end if // 结束判断 if role == 1 then // 上料屏? @@ -1053,69 +1058,41 @@ macro_command main() // 宏入口:点「 SetData(on, "Local HMI", LB, 12094, 1) // 置 LB-12094 → HMI 网络生效 end if // 结束判断 GetData(v[0], "Local HMI", RW, 40, 4) // RW → 上料 PLC IP - if v[0] == 0 then // 上料 IP 没填(新屏/模拟)? - v[0] = 0 // 不写、不重连,保留工程里的设备 IP - else // 已填 → 套用 - SetData(v[0], "Local HMI", LW, 9600, 4) // 写上料 PLC(设备4) - SetData(on, "Local HMI", LB, 10070, 1) // 重连设备4 - end if // 结束判断(防把设备 IP 刷成 0.0.0.0) + if v[0] == 0 then // 没填(新屏/模拟)→ 不写、不重连 + v[0] = 0 // 保留工程里的设备 IP + else // 已填 → 套用(设备5 = 上料清洗) + SetData(v[0], "Local HMI", LW, 9605, 4) // 写设备5 IP + SetData(on, "Local HMI", LB, 10071, 1) // 重连设备5 + end if // 结束判断 if okp == 1 then // 需要连制丸设备? if line == 1 then // 选 A 线 GetData(v[0], "Local HMI", RW, 44, 4) // RW → 制丸A IP else // 选 B 线 GetData(v[0], "Local HMI", RW, 48, 4) // RW → 制丸B IP end if // 结束判断 - if v[0] == 0 then // 制丸 IP 没填? - v[0] = 0 // 不写、不重连 - else // 已填 → 套用 - SetData(v[0], "Local HMI", LW, 9605, 4) // 写制丸 PLC(设备5) - SetData(on, "Local HMI", LB, 10071, 1) // 重连设备5 + if v[0] == 0 then // 没填 → 不写、不重连 + v[0] = 0 // 保留工程里的设备 IP + else // 已填 → 套用(设备4 = 制丸1) + SetData(v[0], "Local HMI", LW, 9600, 4) // 写设备4 IP + SetData(on, "Local HMI", LB, 10070, 1) // 重连设备4 end if // 结束判断 end if // 结束判断(角色=0:不连制丸设备,防误连) - DELAY(1000) // 等 1 秒 + DELAY(1000) // 等 1 秒(嫌开机慢可改 300) SetData(z, "Local HMI", LB, 12094, 1) // 清 LB-12094 SetData(z, "Local HMI", LB, 10070, 1) // 清 LB-10070 SetData(z, "Local HMI", LB, 10071, 1) // 清 LB-10071 end macro_command // 宏结束 ``` -> **IP 为 0 不覆盖(10-27 修订)**:`RW-40~51` 首段为 0(新屏未填、PC 模拟器空值)时跳过写入与重连。否则开机/在线模拟会把设备 IP 刷成 `0.0.0.0` 并主动重连 → 通讯必失败,绑 PLC 地址的元件整片不显示(详见 `开发主文件.md` 10.1)。 +**与工程现版(10-27 摘录)的三个差别** -#### ✅ 工程实际版(10-27 摘录)—— 已确认:**代码是对的,注释写反了** - -工程里 `net-apply` 的实际代码: - -``` -GetData(v[0], RW, 40, 4) → SetData(v[0], LW, 9605, 4) + SetData(on, LB, 10071, 1) // 注释写「上料 PLC(设备4)」 -GetData(v[0], RW, 44/48, 4) → SetData(v[0], LW, 9600, 4) + SetData(on, LB, 10070, 1) // 注释写「制丸 PLC(设备5)」 -``` - -按 `lwaddr.csv` 的系统定义: - -| 系统寄存器 | 含义 | -| --- | --- | -| `LW-9600`~`9603` | **设备 4** 的 IP0~IP3 | -| `LW-9605`~`9608` | **设备 5** 的 IP0~IP3 | -| `LB-10070` / `LB-10071` | 在线改 IP 后**重连设备 4 / 设备 5** | -| `LB-10100` / `LB-10400` | 与**设备 4 / 设备 5** 的通讯状态 | - -**EB 设备列表实测(10-27)**: - -| 设备 | 名称 | IP | 协议 | -| --- | --- | --- | --- | -| 设备 4 | `制丸1` | `192.168.189.22:102` | S7CommPlus / Symbolic Addressing | -| 设备 5 | `上料清洗` | `192.168.189.2:102` | S7CommPlus / Symbolic Addressing | - -于是:**上料 IP → 设备 5、制丸 IP → 设备 4,与设备列表完全一致,代码正确**。写反的是脚本注释(和改版前的文档): - -- `// 写上料 PLC(设备4)` → 应为 **设备5** -- `// 重连设备4` → 应为 **重连设备5** -- `// 写制丸 PLC(设备5)` / `// 重连设备5` → 应为 **设备4** - -> **只改注释,不要改 9600/9605、10070/10071 的数字。** - -**与上文(理想版)仍有的两处差异**:① 没有 `v[0]==0` 的 IP 保护(新屏/模拟会把 IP 写成 `0.0.0.0`);② 末尾 `DELAY(1000)` 会让开机界面卡 1 秒。 +| # | 现版 | 本节 | +| --- | --- | --- | +| 1 | 注释把设备号写反(`写上料 PLC(设备4)`) | 注释已改正;**数字一个没改** | +| 2 | 无 `v[0]==0` 保护,RW 为空时把 IP 刷成 `0.0.0.0` | 首段为 0 跳过写入与重连 | +| 3 | `DELAY(1000)` | 保留,可改 300 缩短开机等待 | +> `LB-11963`/`LB-11964` 那条屏蔽设备 1~8 通讯弹窗的宏(ID 048 `屏蔽通讯异常提示`,周期执行)与本宏无关,别混。 **`line-ab-switch`**(13 号窗「A/B 切换」按钮;仅本机角色=1 生效) ``` macro_command main() // 宏入口:点 A/B 线切换按钮