|
@@ -0,0 +1,75 @@
|
|
|
|
|
+# 双进程部署指南(operate + control)
|
|
|
|
|
+
|
|
|
|
|
+> 本文档:operate/control 双进程拆分后的**装机部署**步骤。装机仍是"一个软件",用户只启 operate,operate 自动拉起 control。
|
|
|
|
|
+> 配套:`服务器测试环境.md`(中间件)/`连接配置清单-换服务器必读.md`(换服务器改 IP)。
|
|
|
|
|
+> 来源:阶段3 收尾;架构见 `需求文档/specs/2026-06-22-operate-control-双进程拆分-design.md`。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 一、部署产物(两个 exe + 一份子目录)
|
|
|
|
|
+
|
|
|
|
|
+| 产物 | 来源(Release 构建) | 部署位置 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| **operate** 主程序(前端) | `ivf_tl_operate_2.0/ivf_tl_Operate/bin/Release/net6.0-windows/` 全目录 | 装机目录,如 `C:/TLData/app/operate/` |
|
|
|
|
|
+| **control** 后台采集进程 | `ivf_tl_operate_2.0/control/ivf_tl_ControlHost/bin/Release/net6.0-windows/` 全目录 | operate 目录下的 **`control/` 子目录**(`.../operate/control/`) |
|
|
|
|
|
+
|
|
|
|
|
+**关键**:control 必须放在 operate 输出目录的 `control\` 子目录(operate `App.config` 的 `controlExePath=control\ivf_tl_ControlHost.exe` 据此相对定位;`ControlProcessLauncher.ResolveExePath` 解析)。换布局则同步改 `controlExePath`。
|
|
|
|
|
+
|
|
|
|
|
+**构建命令**(真机/连内网必须 Release):
|
|
|
|
|
+```bash
|
|
|
|
|
+cd ivf_tl_operate_2.0
|
|
|
|
|
+dotnet build ivf_tl_Operate/ivf_tl_Operate.csproj -c Release
|
|
|
|
|
+dotnet build control/ivf_tl_ControlHost/ivf_tl_ControlHost.csproj -c Release
|
|
|
|
|
+# 部署:
|
|
|
|
|
+# operate/bin/Release/net6.0-windows/ → 装机目录
|
|
|
|
|
+# control/ivf_tl_ControlHost/bin/Release/net6.0-windows/ → 装机目录/control/
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**control 必带(否则起不来,阶段1 真机实锤)**:
|
|
|
|
|
+- `ivf_tl_ControlHost.dll.config`(=自带 App.config,缺它 control AppData 构造读 gbTime/csTime 等键 `.ToString()` NPE);**内容与 operate `App.config` 的 control 业务键 + 连接键保持同步**。
|
|
|
|
|
+- `DependFile/`(ccd 7 个相机 DLL + DB/aivfoTL.db + newccd/),由 `ivf_tl_Control.csproj` 经 `CopyToOutputDirectory=Always` 传递拷贝,核对真落地。
|
|
|
|
|
+
|
|
|
|
|
+## 二、两进程契约(本地 HTTP,仅 127.0.0.1)
|
|
|
|
|
+
|
|
|
|
|
+| 项 | 值 |
|
|
|
|
|
+|------|------|
|
|
|
|
|
+| control 监听 | `http://127.0.0.1:38080`(operate `App.config` `controlPort`=control 命令行 `--port`,须一致) |
|
|
|
|
|
+| operate 拉起 control | 登录后 `ControlProcessLauncher.EnsureRunning`:探 `/ping`→不在则 `Process.Start -Verb RunAs` 传 `--account/--password/--cacheDisk/--port`→轮询就绪 |
|
|
|
|
|
+| operate 关闭 | 只退自己,**不动 control**;control 续命驱动机器 |
|
|
|
|
|
+| 监控页 | 经 `ControlClient` 读 `GET /status`(含各舱活动/阀态/借用让路/链路心跳) |
|
|
|
|
|
+| 受护栏停止 | 监控页"整体停止 control"按钮 → 二次确认 + 工程师口令 → `POST /shutdown` → control `HAL.ShutdownAll`+退出 |
|
|
|
|
|
+| 单实例 | control Mutex `Global\ivf_tl_control_singleton`(永远只有一个驱动机器);operate Mutex `ivf_tl_Operate` |
|
|
|
|
|
+
|
|
|
|
|
+## 三、开机自启(operate)
|
|
|
|
|
+
|
|
|
|
|
+装机让 **operate** 开机自启(operate 起→自动拉起 control→机器自动被驱动,用户无需点击)。control **不单独**设自启(由 operate 拉起)。
|
|
|
|
|
+
|
|
|
|
|
+**方式 A:注册表 Run 键(当前用户登录即启,推荐,免管理员计划任务)**
|
|
|
|
|
+```powershell
|
|
|
|
|
+# 部署时执行一次(把路径换成实际装机路径):
|
|
|
|
|
+$exe = "C:\TLData\app\operate\ivf_tl_Operate.exe"
|
|
|
|
|
+New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" `
|
|
|
|
|
+ -Name "ivf_tl_Operate" -Value "`"$exe`"" -PropertyType String -Force
|
|
|
|
|
+# 校验:
|
|
|
|
|
+Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" | Select-Object ivf_tl_Operate
|
|
|
|
|
+# 取消自启:
|
|
|
|
|
+Remove-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -Name "ivf_tl_Operate"
|
|
|
|
|
+```
|
|
|
|
|
+> operate 是 `requireAdministrator`;在 UAC `ConsentPromptBehaviorAdmin=0`(本机当前配置)下登录自启静默提权,不弹窗。若现场 UAC 会弹窗,改用**任务计划程序**(最高权限、登录触发)。
|
|
|
|
|
+
|
|
|
|
|
+**方式 B:启动文件夹快捷方式**(`shell:startup` 放 operate 快捷方式)——简单但 requireAdministrator 程序可能弹 UAC,不如 A。
|
|
|
|
|
+
|
|
|
|
|
+## 四、装机自检清单
|
|
|
|
|
+
|
|
|
|
|
+1. operate 目录 + `control/` 子目录就位;`control/ivf_tl_ControlHost.dll.config` + `control/DependFile/` 齐。
|
|
|
|
|
+2. operate `App.config`:`controlPort=38080`、`controlExePath=control\ivf_tl_ControlHost.exe`、`urlIp/urlPort` 指向现场网关、`kfkaIP/mqttIp` 指向现场服务器。
|
|
|
|
|
+3. control `ivf_tl_ControlHost.dll.config` 的连接键与 operate 一致。
|
|
|
|
|
+4. 起 operate → 登录 → 观察 `control/` 下 `ivf_tl_ControlHost.exe` 被拉起、`http://127.0.0.1:38080/status` 返回 `started:true`、监控页显示各舱。
|
|
|
|
|
+5. 设开机自启(§三)→ 重启验证开机自动起 operate→拉起 control→机器被驱动。
|
|
|
|
|
+
|
|
|
|
|
+## 五、已知遗留(部署相关)
|
|
|
|
|
+
|
|
|
|
|
+- **调试页借串口**:拆分后调试页驱动 control 持有的串口需"串口/相机命令代理"设计(见 `待验证清单 D2-02`),当前未接通;装机若需现场调试,暂走旧单机调试或待该子任务完成。
|
|
|
|
|
+- **ComBin 两套栈(G1-2)**:operate(`ivf_tl_Entity/ComEntitys/ComBin`)与 control(`ivf_tl_SerialHelper/ComBin`)两套串口栈未去重;control 操作不进 `operation_log`(oplog 埋点在 operate 那套栈,见 `待验证清单 D1-10`)。属阶段3 余留专项。
|
|
|
|
|
+- **D1-09**:control 本地 SQLite `InitTables` AUTOINCREMENT 建表失败(不阻塞运行)。
|
|
|
|
|
+- **M-01~M-07**:合并降级遗留(排气阀/灯光 EEPROM 等),见 `操作端逻辑与配置全景.md §八`。
|