# VI-ADAS **Repository Path**: staticsnull/vi-adas ## Basic Information - **Project Name**: VI-ADAS - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-30 - **Last Updated**: 2026-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # VI-ADAS 标定系统 > 北汽国际出口西班牙产线的 **ADAS 标定工位**软件:HUD 功能标定(机械臂 + 相机,抽检)+ 摄像头/角雷达标靶控制。 > 语言:C# / net8.0-windows / WinForms / VS 2022。三语界面(中 / 英 / 西)。 ## 当前状态 **骨架已落地,可编译可运行(0 警告 0 错误)。** 三个子系统均已跑通冒烟: | 子系统 | 流程 | 冒烟 | 说明 | |---|---|---|---| | HUD 光学检测(实验室) | `hud_full.json`(18 步) | 18/18 Pass | 按 GB/T 46926 / T/CAAMTB 301 的台架光学测量 | | HUD 产线标定(抽检) | `hud_calibration.json`(13 步) | 4 路径全通 | 扫码→对中→抽检分支→机械臂→三项标定→小票→保存 | | ADAS 标靶控制(PLC) | `adas_plc.json`(8 步) | 8/8 Pass | 到位→摆正(电流阈值)→移靶(脉冲)→自检→灯 | - 硬件测量方案 **C:双目成像亮度色度计**(`IBinocularImagingPhotometer`) - 设备驱动:**接口已定义,模拟器已落地;真实驱动已实装**(`ViAdas.Drivers`:`sim` / `snap7` / `s7net` + 摆正器 `Modbus RTU`),由 `site.json` 切换 - ADAS 基础层(点位表模型、配置生成脚本、模拟 PLC、业务动作、编辑器)已全部落地 ## 目录 ``` VI-ADAS/ README.md 本文件 docs/ 需求 / 架构 / 接口 / 部署 文档(见 docs/文档索引.md) HUD检测系统需求规格说明书.* HUD 光学检测需求(FR-01~FR-11、标准体系、限值清单) HUD检测系统架构与选型设计.* 架构与选型(8 层、技术/硬件选型、驱动接入指南) HUD任务书分析与程序修改清单.* 包6 任务书 2.3.9 分析 + 程序改造清单(R/D/E/M/U/C) HUD标定流程现状与待补充清单.* 产线标定 13 步流程 + 待补充项(P0/P1/P2) ADAS标靶控制-实现思路与缺失参数.* ADAS PLC 接口全量分析 + 基础层/业务/驱动/编辑器落地 ADAS驱动接入-现场部署清单.* ADAS 真实驱动现场部署照抄本 src/ViAdas.sln 解决方案(7 个项目) ViAdas.Core 模型 + 设备/PLC 接口契约 ViAdas.Engine 流程引擎(JSON 流程 + 状态机 + 业务动作) ViAdas.Rules 限值判定(版本化 LimitProfile/LimitRule) ViAdas.Simulator 设备模拟器 + 模拟 PLC(DB7/DB8 镜像) ViAdas.Drivers 真实驱动:Snap7 / S7Net / Modbus ViAdas.App WinForms 主程序(含 UI 冒烟、点表/自检编辑器) ViAdas.SmokeTest 无 UI 冒烟测试 tools/gen_adas_config.py 从 DF_Adas.xls 生成 ADAS 配置 JSON ``` ## 编译与运行 ```bash cd src dotnet build ViAdas.sln # 必须 0 警告 0 错误(grep "警告|错误" 确认,勿只看 tail) # 无 UI 冒烟(验证各子系统全链路,期望 EXIT=0) dotnet run --project ViAdas.SmokeTest -- hud_full.json yes # HUD 光学 18 步 dotnet run --project ViAdas.SmokeTest -- hud_calibration.json yes # HUD 产线 13 步 dotnet run --project ViAdas.SmokeTest -- --adas # ADAS 基础层 12 项断言 dotnet run --project ViAdas.SmokeTest -- --adasflow # ADAS 全链路 8 步 dotnet run --project ViAdas.SmokeTest -- --modbus # 摆正器 Modbus + snap7 探测 9 项 # 带界面(WinExe 无控制台,结果落盘) ViAdas.App.exe --uismoke # → data/uismoke/uismoke.txt(界面/本地化/编辑器,EXIT=0 正常) ViAdas.App.exe --logincheck # → data/uismoke/logincheck.txt(管理员视图登录门禁:播种/错口令/角色/留痕) ViAdas.App.exe --driverprobe # → data/driverprobe.txt(sim/snap7 缺 dll/非法驱动名 三分支) ``` > ⚠️ `--uismoke` 的 `EXIT=124` 表示挂死被 timeout 收尸,**绝不是正常**;正常必须 `EXIT=0`。 ## 主程序界面(2026-09-30 改版) ``` [工具栏:开始/停止 | 流程▾ 语言▾ 环境▾ | 工具▾ | 视图切换] [车辆信息:VIN · 车型 · 工位 · 抽检 ] ← 全宽 [司机提示(仅操作员,44pt 加粗绿字,每步覆盖) ] ← 全宽 [标定流程 ] [成像预览 / 设备自检 ] ← 左右 [最终结果 ] [(双目成像亮度色度计 · 方案C) ] [运行日志(仅管理员视图) ] ← 全宽 [状态栏] ``` - **操作员视图**(默认):预览折叠 + 运行日志折叠 + 司机提示可见,大字号少信息 - **管理员视图**:**要先登录**(工具栏「视图: 操作员」→ 弹登录框),登录后才显示全功能, 工具栏「工具▾」含 加载流程/限值/点位表/设备自检/故障注入;退回操作员视图即登出 - 账号存在 SQLite `adas_user` 表(结构见 `docs/db/008_users.sql`):口令以 PBKDF2-SHA256 哈希 + 每账号随机盐存库, 从不存明文;连续错 5 次锁 5 分钟,登录成功/失败与来源工位机名都留痕(`last_login_at/last_login_ip`)。 初始账号 `admin` / 临时口令 `viuser`(**库为空**时首次启动自动播种,现场改过口令不会被重置回去) - 分割比例在 `OnLoad` 按真实尺寸算(构造函数里设会被裁到最小);步骤列表末列自动撑满 ## 配置文件 | 文件 | 说明 | |---|---| | `src/ViAdas.App/sequences/hud_full.json` | 实验室光学检测流程(18 步),改测试项不用改代码 | | `src/ViAdas.App/sequences/hud_calibration.json` | 产线标定流程(13 步,AR-HUD 仅调用 MPC 结果不标定) | | `src/ViAdas.App/sequences/adas_plc.json` | ADAS 标靶控制流程(8 步,首步必为 `connect_devices`) | | `src/ViAdas.App/limits/default.json` | 限值方案。**全部 `pendingConfirm: true`,均来自公开解读/占位,必须以标准原文或甲方开发规范替换** | | `src/ViAdas.App/config/{adas_points,adas_cars,adas_objects,site}.json` | ADAS 点位表/车型阈值/标靶坐标/现场配置,由 `tools/gen_adas_config.py` 从 `DF_Adas.xls` 生成(**改表重跑脚本,禁手改**) | | `src/ViAdas.App/lang/*.json` | 三语语言包(zh-CN / en-US / es-ES),现场可改词不改程序 | 新增测试项:在 JSON 流程里加一步,不碰引擎代码。 **限值边界方向**:`Ge`(≥) 填 `lower`,`Le`(≤) 填 `upper`;配反或缺失加载即报错,不静默判错。 ## 应用配置参数详解(config/site.json) > **说明**:仓库没有 `appsettings.json` 这种命名;应用的「现场配置」就是 `src/ViAdas.App/config/site.json`。 > 它由主程序菜单「工具 ▾ → 现场设置」窗体(StationSettingsForm)部分编辑,也可直接手改 JSON。 > **加载与生效**:程序启动时整体加载并校验,**字段填错(含大小写、枚举取值)直接启动失败**,不会静默当成默认值;改动需重启程序生效。 > 其它 `config/*.json`(点位表/车型阈值/标靶坐标/UDS 指令集)由 `tools/gen_adas_config.py` 从 `DF_Adas.xls` 生成,**禁手改**,本文不展开。 ### 根级字段 | 字段 | 类型 / 取值 | 默认 | 功能 | 修改后界面 / 行为变化 | |---|---|---|---|---| | `id` | string | `site-default` | 现场配置标识 | 仅作标识与配置快照记录,不影响界面 | | `name` | string | `默认现场(…)` | 现场名称 | 仅记录 | | `version` | string | `1.0` | 配置版本 | 仅记录 | | `driver` | `sim` / `snap7` | `sim` | 选**内置模拟器**还是**真实 S7 PLC 驱动** | `sim`=离线可跑、不连硬件;`snap7`=连真实 PLC(依赖 `snap7.dll`,缺失启动即报错,**绝不静默回落模拟器**)。影响启动连接与状态栏/日志的设备状态 | ### `plc`(PLC 连接) | 字段 | 类型 | 默认 / 示例 | 功能 | 修改后变化 | |---|---|---|---|---| | `ip` | string | `172.80.20.2` | PLC 的 IP | 连错 IP 启动连接失败,状态栏/日志报红 | | `cpuType` | string | `S71200` | CPU 型号(`S71200` / `S71500`…) | 型号不符 Snap7 握手失败,启动报错 | | `rack` / `slot` | int | `0` / `1` | 机架 / 槽号(S7 寻址) | 填错连不上,启动报错 | | `connectTimeoutMs` / `readTimeoutMs` | int | `3000` / `3000` | 连接 / 读超时 | 网络差可调大;太小会误报超时 | ### `modbus`(摆正器电流表,仅 `driver=snap7` 时启用) | 字段 | 类型 | 默认 / 示例 | 功能 | 修改后变化 | |---|---|---|---|---| | `portName` | string | `COM4` | 电流表串口名 | 错口连不上,启动报错 | | `baudRate` / `parity` / `dataBits` / `stopBits` | int / enum / int / int | `19200` / `None` / `8` / `2` | 串口参数(与硬件一致) | 不符则通信失败,摆正电流判据失效 | | `frontSlaveId` / `rearSlaveId` | int | `1` / `2` | 前 / 后摆正器从站地址 | 读错从站读不到电流 | | `currentRegister` | int | `344` | 电流值寄存器地址 | 地址错读到的不是电流 | | `timeoutMs` / `retries` | int | `500` / `3` | 单次超时 / 重试次数 | 调大可抗抖动 | ### `barcode`(扫码枪,仅 `driver≠sim` 时启用;流程第一步) | 字段 | 类型 / 取值 | 默认 / 示例 | 功能 | 修改后变化 | |---|---|---|---|---| | `kind` | `serial` / `tcp` | `serial` | 连接方式(USB 虚拟串口 / 以太网枪) | `tcp` 时改读 `tcp` 子段;错则启动报错 | | `portName` / `baudRate` / `parity` / `dataBits` / `stopBits` | — | `COM3` / `9600` / `None` / `8` / `1` | 串口参数 | 不符则收不到条码,启动报错 | | `terminator` | string | `\\r`(JSON 中转义=`\r`) | 条码结束符 | 结束符不对会粘包 / 截断 | | `discardOnOpen` | bool | `true` | 开串口先清缓冲 | — | | `readTimeoutMs` | int | `30000` | **已废弃**,字段保留只为兼容老配置,当前不生效 | 无 | | `tcp.host` / `tcp.port` | string / int | `192.168.1.50` / `9000` | 以太网枪地址 | 错则连不上 | | `tcp.mode` | `gun` / `pc` | `gun` | 枪作服务端 / 枪连上位机 | 模式反了建不了链 | | `tcp.trigger` | string | 空 | 留空=枪自吐码;填 `T\r` 之类=上位机发命令叫它读一次 | 与枪协议不符收不到码 | | `tcp.dropDuplicates` | bool | `true` | 自动模式下丢弃重复码(防止后车继承前车 VIN) | 关掉会串 VIN | | `tcp.connectTimeoutMs` | int | `3000` | 以太网连接超时 | 网络差可调大 | ### `obd`(OBD / UDS 通信器,**可选段**:缺段=本工位无通信器,不阻断启动) | 字段 | 类型 / 取值 | 默认 / 示例 | 功能 | 修改后变化 | |---|---|---|---|---| | `portName` / `baudRate` / `parity` / `dataBits` / `stopBits` | — | `COM2` / `38400` / `None` / `8` / `1` | 上位机 ↔ 通信器串口(**不是 CAN 速率**,38400 是盒子出厂值) | 不符则初始化失败 | | `heziKey` | `500K` / `250K` | `500K` | 选用 `adas_hezi` 表里的哪套 AT 序列 | 与车型总线速率不符标定失败 | | `useAutoBaud` | bool | `false` | `true` 时把 `ATSPx` 换成 `ATSCAN` 让盒子自搜速率,**初始化多等约 3.3s** | 真机速率未知时开;已知则关更快 | | `atsp` | string | `7` | 总线/速率档:`6/7`=CAN 500k(11/29 位)、`8/9`=CAN 250k、`A/B`=J1939、`4/5`=K 线 | 随车型变;填错启动校验报错 | | `txAddr` | string | `18DA0BF1` | ECU 目的 ID(填进序列的 `ATSH`) | 3 位=标准帧、8 位=扩展帧;错则通信无响应 | | `rxAddr` | string | `18DAF10B` | 接收过滤 ID(填进 `ATCF`) | 不配对会收到一堆无关帧 | | `terminator` | string | `\\r\\n` | 盒子回显结束符 | 错则指令粘包 | | `readTimeoutMs` / `initTimeoutMs` | int | `3000` / `5000` | 读 / 初始化超时 | 盒子慢可调大 | | `discardOnOpen` | bool | `true` | 开串口清缓冲 | — | ### `station`(工位能力 —— 主程序「设置」窗体编辑,**对界面与流程影响最大的一段**) | 字段 | 类型 / 取值 | 默认 | 功能 | 修改后界面 / 行为变化 | |---|---|---|---|---| | `targetMoveMode` | `auto` / `manual` | `auto` | 标靶由 PLC 自动移靶+归位,还是**人工**提前推到位 | `manual`=程序不发移靶/归位命令,流程里**多弹一步「标靶是否已就位」让操作员确认**;填错启动即报错(否则会把人工线跑成自动移靶,可能撞标靶) | | `calibProcesses` | 数组(多选):`fcs` / `frs` / `hud` / `avm` | `["fcs","frs"]` | **本工位负责标定哪几道工序**:前视摄像头 / 毫米波(角)雷达 / HUD / 360(环视) | 勾了哪道就跑哪道工序(代码沿用流程步骤 id);勾 `avm` =启用 360 标定步骤(地上铺标定布、不动标靶)——**目前 OEM 指令集甲方未给,步骤占位未启用**,勾上也标不了。原来那个 `avmEnabled` 布尔开关就是这个数组的 `avm`,已合并,仅作兼容镜像保留 | | `calibFailContinue` | `false` / `true`(界面上是「否 / 是」单选) | `false` | **工序标定失败后流程是否继续**:本工位负责的每道工序共用这一个口径 | `false`(否)=某道工序失败就停下、整车不放行;`true`(是)=记不合格但继续往下跑。原来只判 360 的 `avmOnFail` 已并入,仅作兼容镜像保留 | | `calibFailRetry` | 整数 `0`~`5` | `0` | 标定失败重试次数 | `0`=不重试(失败即按上一项判);每重试一次要重走"移靶—解算—写 ECU",上限 5 是怕压线体节拍 | | `hudMode` | `none` / `adasBright` / `darkStandalone` | `none` | HUD 归属:`none`=不做 HUD;`adasBright`=强光 HUD 作 ADAS 子程序(同工位);`darkStandalone`=暗室 HUD 独立工位 | 决定 ADAS/HUD 流程编排;与 `ambient` 互相约束,填错启动报错 | | `ambient` | `dark` / `bright` | `dark` | 环境工况:暗室 / 强光 | 决定 `check_env` 的**环境光判据量级**,也决定模拟器环境光读数。**旧版顶栏那个「环境」下拉已废弃(真机上无效),改这个不会动界面控件**,但改错(与 `hudMode` 不配套)启动即报错;默认 `dark` 才与流程里 `maxAmbientLux=50` 暗室判据自洽 | > 校验逻辑集中在 `AdasConfigLoader.ValidateStation` / `ValidateBarcode`:枚举取值、大小写、以及 `hudMode`↔`ambient` 配套关系都会启动期强校验,现场手改 config 填错拼写**不会**被静默当默认值。 ## 关键约定 1. **限值禁止硬编码** —— 全部走 `limits/*.json` + ADAS 配置,版本化管理 2. **业务层不见厂商 SDK** —— 只依赖 `ViAdas.Core.Interfaces`(`IDevice` / `IPlc`) 3. **原始图必归档** —— 与结果/配置/环境原子关联(当前归档元数据 JSON,像素落盘逻辑待补) 4. **模拟器与真实设备同一套接口** —— 换设备只改 `AppHost`/`site.json` 组装,不改业务代码 5. **UI 文本不写死** —— 状态列存枚举、流程名存 i18n 映射,切语言重算 6. **真实驱动绝不静默回落模拟器** —— `site.json` 指定真实驱动而依赖缺失时启动即抛错 ## 下一步 / 最大阻塞 1. **【最大阻塞】取得甲方 HUD 标定「开发规范」** —— 焦距、机械臂行程、验收指标(当前 `CAL.*.OFFSET` 为占位 ±1.5mm) 2. 取得标准原文核对限值:T/CAAMTB 301-2025、GB/T 46926-2025、SJ/T 11834-2022、ISO/TS 21957:2023 3. 节拍约束:HUD/ADAS 抽检嵌入 12 min/台整车节拍 4. 数据链路:SQLite 落库 + 查询服务(VIN/车型/日期/合格与否)+ MES 上传实装 5. 权限分级、参数开放 UI、软件正版清单 + 甲方杀软兼容、急停信号接入 6. L2 标定模块(相机内参/畸变、立体/手眼标定)+ 真实算法替换模拟算法 > 文档详细程度与缺口见 `docs/文档索引.md`。