From 7bfe8945efa721b66b4914be58a07421495f3f14 Mon Sep 17 00:00:00 2001 From: liuyu65 Date: Tue, 27 Oct 2026 11:56:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E8=AE=BE=E5=A4=874?= =?UTF-8?q?=3D=E5=88=B6=E4=B8=B81=E3=80=81=E8=AE=BE=E5=A4=875=3D=E4=B8=8A?= =?UTF-8?q?=E6=96=99=E6=B8=85=E6=B4=97=EF=BC=88EB=20=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=AE=9E=E6=B5=8B=EF=BC=89=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20net-apply=20=E7=BB=93=E8=AE=BA=E4=B8=8E=20201=20?= =?UTF-8?q?=E5=88=A4=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 地址表 5.8/5.9:设备 4/5 归属互换,补实测 IP 192.168.189.22 / 192.168.189.2,协议 S7CommPlus 符号寻址 - 宏指令 net-apply:确认代码正确、仅注释写反(上料 IP→设备5、制丸 IP→设备4) - 开发主文件 9.x/10.1:设备引用同步互换;新增「符号名 + 设备绑定」判据;删除不适用的「取消优化块访问」 - 新增 tools/scan-plc.ps1:在不受沙箱限制的 PowerShell 里扫 102 端口并做 COTP 握手 --- tools/scan-plc.ps1 | 127 +++++++++++++++++++++++++++++++++++++++++ 设计文档/地址表.md | 52 +++++++++-------- 设计文档/宏指令.md | 33 ++++++----- 设计文档/开发主文件.md | 27 +++++---- 4 files changed, 191 insertions(+), 48 deletions(-) create mode 100644 tools/scan-plc.ps1 diff --git a/tools/scan-plc.ps1 b/tools/scan-plc.ps1 new file mode 100644 index 0000000..11e63fe --- /dev/null +++ b/tools/scan-plc.ps1 @@ -0,0 +1,127 @@ +# 扫描 PLC 网络:找 S7 设备(端口 102),并做 COTP 握手确认是不是西门子 PLC +# +# 用法(在【不受 DSH 沙箱限制】的普通 PowerShell 里运行): +# powershell -ExecutionPolicy Bypass -File tools\scan-plc.ps1 +# powershell -ExecutionPolicy Bypass -File tools\scan-plc.ps1 -Subnet 192.168.0.0/16 +# powershell -ExecutionPolicy Bypass -File tools\scan-plc.ps1 -Subnet 192.168.189.0/24 -TimeoutMs 400 +# +# 输出:IP / MAC / 是否 S7(COTP 握手 D0)/ 响应耗时 + +param( + [string]$Subnet, # 形如 192.168.189.0/24;省略则自动取有线网卡所在网段 + [int]$TimeoutMs = 600, + [int]$Threads = 128 +) + +$ErrorActionPreference = 'Stop' + +# ---------- 1. 自动取网段 ---------- +if (-not $Subnet) { + $cand = Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | + Where-Object { $_.IPAddress -notlike '127.*' -and $_.IPAddress -notlike '169.254.*' -and $_.InterfaceAlias -notlike '*VMware*' } + if (-not $cand) { + Write-Host '找不到可用网卡,请手动指定 -Subnet,例如 -Subnet 192.168.0.0/24' -ForegroundColor Red + exit 1 + } + $pick = $cand | Select-Object -First 1 + $ip = $pick.IPAddress; $plen = $pick.PrefixLength + $Subnet = "$ip/$plen" + Write-Host ("使用网卡 {0} 的地址 {1}" -f $pick.InterfaceAlias, $Subnet) -ForegroundColor Cyan +} + +$parts = $Subnet.Split('/') +$baseIp = $parts[0] +$prefix = [int]$parts[1] + +Write-Host ("扫描 {0} 的 TCP 102(S7),超时 {1}ms,并发 {2} ..." -f $Subnet, $TimeoutMs, $Threads) -ForegroundColor Cyan + +# ---------- 2. 并发扫描 + COTP 握手(C# 实现,PS 5.1 也能跑) ---------- +$src = @' +using System; +using System.Net.Sockets; +using System.Collections.Concurrent; +using System.Threading.Tasks; + +public class PlcScan +{ + static readonly byte[] COTP_CR = new byte[] { + 0x03,0x00,0x00,0x16, 0x11,0xE0,0x00,0x00, 0x00,0x01,0x00, 0xC1,0x02,0x01,0x00, + 0xC2,0x02,0x01,0x02, 0xC0,0x01,0x0A + }; + + public static string[] Scan(string cidrIp, int prefix, int port, int timeoutMs, int threads) + { + var p = cidrIp.Split('.'); + uint ip = ((uint)int.Parse(p[0]) << 24) | ((uint)int.Parse(p[1]) << 16) | ((uint)int.Parse(p[2]) << 8) | (uint)int.Parse(p[3]); + uint mask = prefix == 0 ? 0u : (0xFFFFFFFFu << (32 - prefix)); + uint net = ip & mask, bcast = net | ~mask; + var bag = new ConcurrentBag(); + Parallel.For((long)net + 1, (long)bcast, new ParallelOptions { MaxDegreeOfParallelism = threads }, i => + { + string s = string.Format("{0}.{1}.{2}.{3}", (i >> 24) & 255, (i >> 16) & 255, (i >> 8) & 255, i & 255); + try { using (var c = new TcpClient()) { var ar = c.BeginConnect(s, port, null, null); if (ar.AsyncWaitHandle.WaitOne(timeoutMs) && c.Connected) bag.Add(s); } } catch { } + }); + var arr = bag.ToArray(); Array.Sort(arr); return arr; + } + + public static bool IsS7(string ip, int timeoutMs) + { + try + { + using (var c = new TcpClient()) + { + var ar = c.BeginConnect(ip, 102, null, null); + if (!ar.AsyncWaitHandle.WaitOne(timeoutMs) || !c.Connected) return false; + c.EndConnect(ar); + c.ReceiveTimeout = timeoutMs; + var st = c.GetStream(); + st.Write(COTP_CR, 0, COTP_CR.Length); + st.Flush(); + var buf = new byte[64]; + var r = st.BeginRead(buf, 0, buf.Length, null, null); + if (!r.AsyncWaitHandle.WaitOne(timeoutMs)) return false; + int n = st.EndRead(r); + // COTP Connection Confirm: 0x03 0x00 ... 0x11 0xD0 + return n >= 6 && buf[0] == 0x03 && buf[5] == 0xD0; + } + } + catch { return false; } + } +} +'@ +Add-Type -TypeDefinition $src -Language CSharp + +$sw = [Diagnostics.Stopwatch]::StartNew() +$hosts = [PlcScan]::Scan($baseIp, $prefix, 102, $TimeoutMs, $Threads) +$sw.Stop() +Write-Host ("端口 102 开放的主机:{0} 台(扫描耗时 {1:N1}s)" -f $hosts.Count, $sw.Elapsed.TotalSeconds) -ForegroundColor Green + +if ($hosts.Count -eq 0) { + Write-Host '没发现开着 102 的主机。检查:① 网线是否插在同一交换机;② 本机 IP 是否与 PLC 同网段;③ PLC 是否启用;④ 防火墙。' -ForegroundColor Yellow + exit 0 +} + +# ---------- 3. 取 MAC 并确认 S7 ---------- +$arp = @{} +(arp -a) | ForEach-Object { + if ($_ -match '^\s*(\d+\.\d+\.\d+\.\d+)\s+([0-9a-fA-F-]{17})\s+') { $arp[$matches[1]] = $matches[2].ToUpper() } +} + +$rows = foreach ($h in $hosts) { + $t0 = [Diagnostics.Stopwatch]::StartNew() + $isS7 = [PlcScan]::IsS7($h, [Math]::Max($TimeoutMs, 1000)) + $t0.Stop() + [pscustomobject]@{ + IP = $h + MAC = if ($arp.ContainsKey($h)) { $arp[$h] } else { '(未知)' } + S7握手 = if ($isS7) { '是' } else { '否' } + 耗时ms = [int]$t0.Elapsed.TotalMilliseconds + } +} + +$rows | Sort-Object IP | Format-Table -AutoSize + +$out = Join-Path $PSScriptRoot 'scan-plc-result.csv' +$rows | Export-Csv -Path $out -NoTypeInformation -Encoding UTF8 +Write-Host ("结果已保存:{0}" -f $out) -ForegroundColor Cyan +Write-Host '把这张表贴给开发,即可继续判断设备 4 / 设备 5 是哪个 IP。' -ForegroundColor Cyan diff --git a/设计文档/地址表.md b/设计文档/地址表.md index fabb3b9..4eb79f7 100644 --- a/设计文档/地址表.md +++ b/设计文档/地址表.md @@ -108,15 +108,18 @@ > 一套工程,上料屏 / 制丸A屏 / 制丸B屏通用;换屏、换 PLC 只在 **13 号窗**改配置,现场不需要 EasyBuilder。 -**工程里的设备划分(两个以太网设备槽)** +**工程里的设备划分(两个以太网设备槽)— 10-27 按 EB 设备列表核对** -| 设备 | 绑定内容 | 上料屏 | 制丸A屏 | 制丸B屏 | -| --- | --- | --- | --- | --- | -| `设备4`:上料 PLC | X1/X2 画面、C 组数据 | 上料 PLC 的 IP | 上料 PLC 的 IP | 上料 PLC 的 IP | -| `设备5`:制丸 PLC | X3/X4 画面、D 组数据 | A 或 B(D 登录后切) | A 的 IP | B 的 IP | +> **注意:设备 4 是制丸、设备 5 是上料,和旧文档正好相反。** -- 制丸A屏、制丸B屏各自只连「自己的 PLC + 上料 PLC」,**互相看不见**; -- 上料屏 D 登录:用「A/B 切换」按钮在 `设备5` 的 IP 间切(同一时间看一条线);**默认 A,只有人工切换才到 B,重启回 A**;按钮暂放 13 号窗(能开 13 号窗的是工程师 A / admin),后续再移到制丸页给 D 用; +| 设备 | 实际名称 | 当前 IP | 绑定内容 | +| --- | --- | --- | --- | +| `设备4`:**制丸 PLC** | `制丸1` | `192.168.189.22:102` | X3/X4 画面、D 组数据 | +| `设备5`:**上料 PLC** | `上料清洗` | `192.168.189.2:102` | X1/X2 画面、C 组数据 | + +- 两台都是 `Siemens S7-1200/S7-1500 (S7CommPlus, Symbolic Addressing)`,**符号寻址**——元件绑的是 DB 名.变量名,不是绝对地址; +- 制丸A屏、制丸B屏各自只连「自己的制丸 PLC(设备4)+ 上料 PLC(设备5)」,**互相看不见**; +- 上料屏 D 登录:用「A/B 切换」按钮在**设备4**(制丸)的 IP 间切(同一时间看一条线);**默认 A,只有人工切换才到 B,重启回 A**; - 换屏 / 换 PLC:备件装同程序 → 13 号窗填 IP/角色 → 点「应用」即可。 **13 号窗字段(全部存 `RW`,掉电保持)** @@ -124,21 +127,22 @@ | 字段 | 地址 | 写入的系统寄存器 | | --- | --- | --- | | HMI IP / 掩码 / 网关 | `RW-20`~`31` | `LW-9129`~`9132` / `LW-10750`~`10753` / `LW-9125`~`9128` + `LB-12094`(备屏/换屏用;HMI 固定 IP 必填) | -| 上料 PLC IP | `RW-40`~`43` | `LW-9600`~`9603`(设备4) + `LB-10070` | -| 制丸A PLC IP | `RW-44`~`47` | 选 A 时 → `LW-9605`~`9608`(设备5) + `LB-10071` | -| 制丸B PLC IP | `RW-48`~`51` | 选 B 时 → `LW-9605`~`9608`(设备5) + `LB-10071` | +| 上料 PLC IP | `RW-40`~`43` | `LW-9605`~`9608`(**设备5**) + `LB-10071` | +| 制丸A PLC IP | `RW-44`~`47` | 选 A 时 → `LW-9600`~`9603`(**设备4**) + `LB-10070` | +| 制丸B PLC IP | `RW-48`~`51` | 选 B 时 → `LW-9600`~`9603`(**设备4**) + `LB-10070` | | 本机角色 | `RW-60`:1=上料屏 / 2=制丸A屏 / 3=制丸B屏 | 角色 2/3 自动锁线别;**角色=0 不连制丸设备(防误连)** | | 制丸线选择 | `RW-61`:1=A 线 / 2=B 线 | 上料屏手动选;制丸屏由角色决定 | -> 设备槽号按你工程实际(以太网设备从 4 号起):设备5 → `LW-9605`/`LB-10071`,设备6 → `LW-9610`/`LB-10072`。设备号查看:EB Pro 设备列表,或显示 `LW-9300`~`9306`(0=该槽无设备)。 +> 设备槽号按工程实际(以太网设备从 4 号起):`设备4` → `LW-9600`/`LB-10070`,`设备5` → `LW-9605`/`LB-10071`,`设备6` → `LW-9610`/`LB-10072`。设备号查看:EB Pro 设备列表,或显示 `LW-9300`~`9306`(0=该槽无设备)。 +> **`net-apply` 里的写法与上表一致(代码正确),但脚本注释把「设备4/设备5」写反了**,改注释即可,**不要改数字**。 **切换互锁(防旧数据/防误操作)** | 用途 | 地址 | 说明 | | --- | --- | --- | -| 设备4 通讯状态 | `LB-10100` | 上料 PLC:ON=已连接;写 ON 可重连一次 | -| 设备5 通讯状态 | `LB-10400` | 制丸 PLC:ON=已连接;写 ON 可重连一次 | -| 错误码 | `LW-9403` / `LW-9404` | 设备4 / 设备5 | +| 设备4 通讯状态 | `LB-10100` | **制丸 PLC**:ON=已连接;写 ON 可重连一次 | +| 设备5 通讯状态 | `LB-10400` | **上料 PLC**:ON=已连接;写 ON 可重连一次 | +| 错误码 | `LW-9403` / `LW-9404` | 设备4(制丸)/ 设备5(上料) | | 禁止系统弹窗 | `LB-11963` / `LB-11964` | 置 ON:不弹设备4/5 的 “Device No Response” | - 制丸页放「通讯正常」指示灯 = `LB-10400`;A/B 切换后(或刚上电)**等它变 ON 再操作**,避免按到旧画面数据; @@ -152,27 +156,27 @@ ```mermaid graph LR - P1["S7-1500
上料/配料 PLC"] - PA["S7-1500
制丸A PLC"] + P1["S7-1500
上料 PLC
192.168.189.2"] + PA["S7-1500
制丸A PLC
192.168.189.22"] PB["S7-1500
制丸B PLC"] H1["HMI 上料屏
role=1"] H2["HMI 制丸A屏
role=2"] H3["HMI 制丸B屏
role=3"] - H1 -- "设备4" --> P1 - H1 -. "设备5(A/B 可切)" .-> PA + H1 -- "设备5" --> P1 + H1 -. "设备4(A/B 可切)" .-> PA H1 -.-> PB - H2 -- "设备4" --> P1 - H2 -- "设备5" --> PA - H3 -- "设备4" --> P1 - H3 -- "设备5" --> PB + H2 -- "设备5" --> P1 + H2 -- "设备4" --> PA + H3 -- "设备5" --> P1 + H3 -- "设备4" --> PB ``` **说明** - 一套工程烧 3 台屏;装机时在 13 号窗设:本机角色 `RW-60`、线别 `RW-61`、上料 IP `RW-40~43`、制丸A IP `RW-44~47`、制丸B IP `RW-48~51` → 点「应用」; -- 用户组:C(上料)→ X1/X2(绑 `设备4`);D(制丸)→ X3/X4(绑 `设备5`);`admin` 全开; +- 用户组:C(上料)→ X1/X2(绑 `设备5` 上料);D(制丸)→ X3/X4(绑 `设备4` 制丸);`admin` 全开; - 制丸A屏只连「A 的 PLC + 上料 PLC」;制丸B屏只连「B 的 PLC + 上料 PLC」;**A/B 互不可见**; -- 上料屏 D 登录后可用「A/B 切换」按钮切换 `设备5` 指向(仅 role=1 生效);按钮暂放 13 号窗,后续再移到制丸页。 +- 上料屏 D 登录后可用「A/B 切换」按钮切换 `设备4` 指向(仅 role=1 生效);按钮暂放 13 号窗,后续再移到制丸页。 ### 5.10 双电控电磁阀(建议,待 PLC 确认) diff --git a/设计文档/宏指令.md b/设计文档/宏指令.md index 769d260..d649bc3 100644 --- a/设计文档/宏指令.md +++ b/设计文档/宏指令.md @@ -1081,13 +1081,13 @@ end macro_command // 宏结束 > **IP 为 0 不覆盖(10-27 修订)**:`RW-40~51` 首段为 0(新屏未填、PC 模拟器空值)时跳过写入与重连。否则开机/在线模拟会把设备 IP 刷成 `0.0.0.0` 并主动重连 → 通讯必失败,绑 PLC 地址的元件整片不显示(详见 `开发主文件.md` 10.1)。 -#### ⚠ 工程实际版(10-27 摘录)与上文的差异 —— 设备 4/5 疑似写反 +#### ✅ 工程实际版(10-27 摘录)—— 已确认:**代码是对的,注释写反了** -工程里 `net-apply` 的实际代码是: +工程里 `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)」 +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` 的系统定义: @@ -1096,20 +1096,25 @@ GetData(v[0], RW, 44/48, 4)→ SetData(v[0], LW, 9600, 4) + SetData(on, LB, 1007 | --- | --- | | `LW-9600`~`9603` | **设备 4** 的 IP0~IP3 | | `LW-9605`~`9608` | **设备 5** 的 IP0~IP3 | -| `LB-10070` | 在线改 IP 后**重连设备 4** | -| `LB-10071` | 在线改 IP 后**重连设备 5** | -| `LB-10100` / `LB-10400` | 与**设备 4** / **设备 5** 的通讯状态 | +| `LB-10070` / `LB-10071` | 在线改 IP 后**重连设备 4 / 设备 5** | +| `LB-10100` / `LB-10400` | 与**设备 4 / 设备 5** 的通讯状态 | -即:**上料 IP 被写进了设备 5,制丸 IP 被写进了设备 4**,与注释和本文件 5.8 的规划正好相反。 +**EB 设备列表实测(10-27)**: -两种可能,必须按现场确认(30 秒即可): +| 设备 | 名称 | IP | 协议 | +| --- | --- | --- | --- | +| 设备 4 | `制丸1` | `192.168.189.22:102` | S7CommPlus / Symbolic Addressing | +| 设备 5 | `上料清洗` | `192.168.189.2:102` | S7CommPlus / Symbolic Addressing | -| 可能 | 判断方法 | 结论 | -| --- | --- | --- | -| **A. 代码写反了** | EB「系统参数 → 设备列表」里设备 4 = 上料 PLC、设备 5 = 制丸 PLC(与文档一致) | 每次开机把两台 PLC 的 IP **互换**并重连;S7 能连上但读到的是**另一台 PLC 的 DB**,读到不存在的块就整片不显示 —— 与 201 的症状高度吻合 | -| **B. 设备分配写反了** | 设备列表里设备 4 实际是制丸、设备 5 是上料 | 宏是对的;要改的是 `地址表.md` 5.8、`开发主文件.md` 9.x 装机流程和 100 号窗 `LB-10100`/`LB-10400` 的标签 | +于是:**上料 IP → 设备 5、制丸 IP → 设备 4,与设备列表完全一致,代码正确**。写反的是脚本注释(和改版前的文档): -**另两处与上文不同**:① 没有 `v[0]==0` 的 IP 保护(新屏/模拟会把 IP 写成 `0.0.0.0`);② 末尾 `DELAY(1000)` 会让开机界面卡 1 秒。 +- `// 写上料 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 秒。 **`line-ab-switch`**(13 号窗「A/B 切换」按钮;仅本机角色=1 生效) ``` diff --git a/设计文档/开发主文件.md b/设计文档/开发主文件.md index 6c70fa0..932b379 100644 --- a/设计文档/开发主文件.md +++ b/设计文档/开发主文件.md @@ -143,7 +143,7 @@ XD 画板:`A_start`、`B_PID`、`C_运行1~3`、`D_点动1/2`、`E_配方1~3` - HMI IP / 掩码 / 网关 → `RW-20`~`31`(备屏/换屏用;HMI 固定 IP 必填); - 上料 PLC IP → `RW-40`~`43`;制丸A PLC IP → `RW-44`~`47`;制丸B PLC IP → `RW-48`~`51`; - 「应用」→ `net-apply`;窗口开启时执行 `net-read`(进窗自动带出当前值,不需要单独做「读取当前」按钮)。 -- 上料屏在 13 号窗设置区放「A/B 切换」按钮 → `line-ab-switch`(只切 `设备5` 的 IP 并重连;**仅本机角色=1 生效**,A/B 屏误点无效);旁边放当前线别显示(读 `RW-61`)。 +- 上料屏在 13 号窗设置区放「A/B 切换」按钮 → `line-ab-switch`(只切 `设备4` 的 IP 并重连;**仅本机角色=1 生效**,A/B 屏误点无效);旁边放当前线别显示(读 `RW-61`)。 - **现场无需 EB**:换屏/换 PLC 只填这一页,点「应用」即可。 ### 7.6 修改时间(12 号窗) @@ -362,16 +362,16 @@ XD 画板:`A_start`、`B_PID`、`C_运行1~3`、`D_点动1/2`、`E_配方1~3` | 屏幕 | 角色 `RW-60` | 连哪两台 PLC | 能看到 | | --- | --- | --- | --- | -| 上料屏 | 1 | 上料(设备4)+ 制丸 A 或 B(设备5,可切) | 上料段 + 当前选的制丸线 | -| 制丸A屏 | 2 | 上料(设备4)+ 制丸A(设备5) | 上料段 + A 线 | -| 制丸B屏 | 3 | 上料(设备4)+ 制丸B(设备5) | 上料段 + B 线 | +| 上料屏 | 1 | 上料(**设备5**)+ 制丸 A 或 B(**设备4**,可切) | 上料段 + 当前选的制丸线 | +| 制丸A屏 | 2 | 上料(**设备5**)+ 制丸A(**设备4**) | 上料段 + A 线 | +| 制丸B屏 | 3 | 上料(**设备5**)+ 制丸B(**设备4**) | 上料段 + B 线 | -- 用户组:C → X1/X2(绑设备4);D → X3/X4(绑设备5);`admin` 全开; +- 用户组:C → X1/X2(绑**设备5** 上料);D → X3/X4(绑**设备4** 制丸);`admin` 全开; - 制丸A/B 互不可见:各屏只连自己那条线 + 上料;唯一例外是上料屏(D 登录可切 A/B)。 ### 9.2 EB Pro 一次性改造 -1. **设备列表**:确认以太网 PLC 占设备4/设备5;X1/X2 与 C 组数据绑设备4,X3/X4 与 D 组数据绑设备5。 +1. **设备列表**(10-27 实测):`设备4 = 制丸1(192.168.189.22)`、`设备5 = 上料清洗(192.168.189.2)`;X1/X2 与 C 组数据绑**设备5**,X3/X4 与 D 组数据绑**设备4**。 2. **13 号窗设置区**(`RW` 全部掉电保持): - 本机角色 `RW-60`(1 上料 / 2 制丸A / 3 制丸B)、线别 `RW-61`(1=A / 2=B); - HMI IP/掩码/网关 `RW-20~31`(备屏/换屏用;HMI 固定 IP 必填); @@ -457,15 +457,21 @@ XD 画板:`A_start`、`B_PID`、`C_运行1~3`、`D_点动1/2`、`E_配方1~3` **S7-1500 三查** 1. CPU 属性 → 防护与安全 → 连接机制 → 勾选 **「允许来自远程伙伴的 PUT/GET 通信访问」**; -2. 用到的 DB 取消 **「优化的块访问」**; +2. 本工程是 **S7CommPlus + 符号寻址**,所以**不需要**取消「优化的块访问」;要查的是**符号名(DB 名 / 变量名)与 PLC 里是否一致**、以及**元件绑对了设备没有**; 3. PC 与 PLC 同网段,Windows 防火墙放行 EasyBuilder。 > **红色地址注释不是"地址写错"的证据**:编辑区里元件上压着的那行红色小字(物件名 + 完整地址 + 删除线)是 EB Pro 的地址注释。本次 201 这批元件的地址能正常编译、下载(校验和正常),所以不要只凭红字判断地址无效——按上面的 LB 替换法分叉判断。 > > 现场真屏断通讯时这些元件同样不显示,属正常行为——先查通讯,不要改画面。但**必须补一条显式提示**(见下),否则操作员看到整片空白会误以为程序坏了或按钮丢了。 -**新增线索(10-27)**:工程里 `net-apply` 的实际代码把**上料 IP 写进 `LW-9605`(设备5)**、**制丸 IP 写进 `LW-9600`(设备4)**,与注释和 5.8 的规划相反(系统定义见 `lwaddr.csv`:`LW-9600`=设备4、`LW-9605`=设备5、`LB-10070`/`LB-10071` 分别重连设备4/5)。 -若设备列表里设备4确实是上料 PLC,则两台设备会**连到对方的 PLC**——S7 能连上,但读到对方不存在的 DB 时,元件同样**整片不显示**,与 201 的现象吻合。判断方法与两种修法见 `宏指令.md` 的 `net-apply` 段。 +**已确认(10-27,EB 设备列表)**:`设备4 = 制丸1(192.168.189.22)`、`设备5 = 上料清洗(192.168.189.2)`,两台都是 **S7CommPlus + Symbolic Addressing(符号寻址)**。 +所以 `net-apply` 里「上料 IP → `LW-9605`/`LB-10071`(设备5)、制丸 IP → `LW-9600`/`LB-10070`(设备4)」**是对的**;写反的只是**脚本注释**(详见 `宏指令.md` 的 `net-apply` 段,只改注释、别改数字)。 + +**对 201 的意义(重点)**:既然用符号寻址,元件绑的是「DB 名.变量名」而不是绝对地址。 + +- **201 =「上料-输送2」,其元件必须绑 `设备5`(上料清洗)**;若误绑成 `设备4`(制丸1),就会去制丸 PLC 上找上料的符号 → **找不到 → 该元件整片不画**,而其它上料页正常 —— 与现象完全吻合; +- 同理,**块名 / 变量名与 PLC 不一致**(改名、加前缀、DB 号变化)也会得到同样结果; +- 所以「符号名 + 设备绑定」这两项,比查网络更值得先看。 **通讯中断时的界面提示(待做)** @@ -523,4 +529,5 @@ XD 画板:`A_start`、`B_PID`、`C_运行1~3`、`D_点动1/2`、`E_配方1~3` | 10-27 | **10.1 修正**:现场实测在线模拟、离线模拟、真屏**三处都不显示**,原「离线模拟正常」不成立;改为「A 地址/通讯 vs B 元件属性」两分支 + LB 替换一步判定法;明确红色地址注释不能当作地址错误的判据;新增「通讯中断界面提示」待办 | | 10-27 | `.gitignore` 改为通配:`unitouch*.cxob` / `unitouch*.debug` / `unitouch*.cmtp.bak*` | | 10-27 | **窗口表按工程实际重建**(3.1/3.2):系统窗实为 3~9;`30~32` = x2y2-focus-area1~3,确认 `LW-50`=`30/31/32`(旧记 141~144 作废);新增 **130~282 约 90 个窗口**(清洗参数/制丸/IO/上料/清洗/各类弹窗);**201=上料-输送2** | -| 10-27 | 宏清单按工程实际核对(见 `宏指令.md` 6.0):50 条、缺 ID 031;区域宏实名 `x2y2-focus-area*`;48 号 `屏蔽通讯异常提示` 是**周期执行**并屏蔽 `LB-11960~11967` 八台设备;新增 7 条未入档宏 | \ No newline at end of file +| 10-27 | 宏清单按工程实际核对(见 `宏指令.md` 6.0):50 条、缺 ID 031;区域宏实名 `x2y2-focus-area*`;48 号 `屏蔽通讯异常提示` 是**周期执行**并屏蔽 `LB-11960~11967` 八台设备;新增 7 条未入档宏 | +| 10-27 | **设备 4/5 定性**:EB 设备列表实测 `设备4=制丸1(192.168.189.22)`、`设备5=上料清洗(192.168.189.2)`,均为 S7CommPlus 符号寻址;`net-apply` 代码正确、仅注释写反(见 `宏指令.md`);10.1 增补「符号名 + 设备绑定」判据,删掉不适用的「取消优化块访问」 | \ No newline at end of file