新的多线程测试模块
📅 2026/7/9 8:16:44
👁️ 阅读次数
📝 编程学习
新项目框架搭建总结
一、已创建完整文件结构
QSFP_AutoTester/ ├── Drivers/ ← 驱动层(从旧项目搬过来 + 你新写的) │ ├── OTP12Driver.cs ← ✅ 你写的,直接复用 │ ├── SFP_EVB_Heater.cs ← ✅ 你写的,直接复用 │ ├── I2C_Heater.cs ← ✅ 你写的,直接复用 │ └── Keysight86120C.cs ← ✅ 波长计驱动(OTP没有波长计,需要保留) │ ├── Models/ ← 数据模型 │ ├── HardwareConfig.cs ← 🆕 核心!OTP各槽位板卡映射(OPM/VOA/ERM/SWITCH/BERT) │ └── GlobalConfig.cs ← 🆕 精简自旧 Common.cs,去掉串口/GPIB/并口 │ ├── Module/ ← 模块驱动 │ └── QsfpModule.cs ← 📋 从旧 TestQSFP.cs 搬来(需修改命名空间) │ ├── Services/ ← 业务逻辑层 │ ├── HardwareService.cs ← 🆕 统一封装所有硬件操作(每个模块线程持有一个实例) │ └── AttenuatorHelper.cs ← 🆕 衰减器校准点管理 │ ├── Workers/ ← 多线程工作单元 │ └── ModuleTestWorker.cs ← 🆕 一个线程测一个模块(含测试流程骨架) │ ├── Utils/ ← 工具类 │ ├── BitHelper.cs ← ✅ 从旧 Bit.cs 搬来 │ └── SimpleLogger.cs ← ✅ 从旧 SimpleLogger.cs 搬来(bug已修) │ └── TestEngine.cs ← 🆕 管理4个Worker并发运行二、新架构核心设计思路
1. HardwareConfig.cs — 整个项目最重要文件
该文件是项目硬件资源映射字典,你现场实测的硬件槽位对应关系全部固化在此。
示例硬件映射配置:
// 测试模块1硬件通道分配光开关:SLOT-11,输入1→输出2光功率计:SLOT-05,通道1衰减器Tx:SLOT-07,通道1衰减器Rx:SLOT-09,通道1误码仪:SLOT-01// 测试模块3硬件通道分配光开关:SLOT-12,输入1→输出2光功率计:SLOT-05,通道3衰减器Tx:SLOT-08,通道3衰减器Rx:SLOT-10,通道3误码仪:SLOT-03优势:后续现场硬件接线调整,仅修改此文件映射关系,无需改动业务流程数千行代码。
2. HardwareService.cs — 硬件操作统一入口
每个模块测试线程独立实例化HardwareService(moduleIndex),后续硬件调用极简,无需手动操作槽位:
hw.SwitchToModule();// 自动查表切换对应通道光开关hw.ReadTxPower();// 自动查表定位板卡、通道,读取发射功率hw.SetTxAttenuation(10.0);// 自动查表切换衰减器槽位,设置衰减值对比旧代码:无需重复手写otp12.SetSlot("05")、otp12.SetSlot("11")这类槽位切换代码。
3. 4线程并行测试架构
TestEngine.Start()内部并发逻辑:
for(intslot=1;slot<=4;slot++){varworker=newModuleTestWorker(slot,otp12,heater);tasks[slot-1]=Task.Run(()=>worker.RunAsync(cts.Token));}功能:同时启动4条独立线程,同步测试4个槽位光模块,互不干扰。
4. 硬件资源并发安全性分析
| 硬件资源 | 并发是否安全 | 原因说明 |
|---|---|---|
| 加热台 | ✅ 安全 | 共用一条TCP连接,指令携带槽位参数区分模块 |
| OTP-12综合测试仪 | ✅ 安全 | 共用TCP连接,通过SetSlot指定独立板卡通道 |
| 光开关 SWD2-02 | ✅ 安全 | 4个模块分配独立通道,无抢占冲突 |
| 衰减器 VOA | ✅ 安全 | 共8路独立通道,4模块各占用Tx/Rx两路 |
| 误码仪 BE2-03 | ✅ 安全 | 4块独立硬件板卡,单模块独占一台 |
| 光功率计 OPM-04 | ⚠️ 存在冲突 | 仅单块板卡4通道,同一时间仅支持读取一路功率 |
⚠️ 光功率计并发冲突解决方案
旧代码为串行测试,无并发问题;4线程并行会出现资源抢占,需加线程锁限制访问:
// HardwareService 内部定义静态全局锁privatestaticreadonlyobject_opmLock=newobject();publicfloatReadTxPower(){SwitchToModule();// 切换光开关操作无冲突,无需加锁Thread.Sleep(200);lock(_opmLock)// 锁住光功率计访问,同一时刻仅单线程进入{_otp12.SetSlot("05");varresult=_otp12.OPM_ReadPower(channel);returnfloat.TryParse(result,outvarpwr)?pwr:-100f;}}短板:加锁后读取功率环节退化为串行;
优化思路:错开4线程功率读取时机,模块测功率时其他线程执行消光比、I2C读写、衰减器调节等无冲突步骤。
三、当前待完成任务(按优先级排序)
第一步:适配 QsfpModule.cs 编译环境
旧TestQSFP.cs大量依赖旧全局类GlobalVarFun.XXX,需全部替换为新项目GlobalConfig.XXX。
第二步:迁移旧版调试算法逻辑
ModuleTestWorker.cs内测试函数目前为空壳,逻辑从旧项目Main_Form对应函数复制迁移:
RxApdDebug()— 来源旧AutoTestRxAPD()RxLosDebug()— 来源旧RxLosAutoSet()TxPowerDebug()— 来源旧AutoSetTxPower_MethodB()TxErDebug()— 来源旧AutoSetTxEr_MethodA()
迁移要求:原有算法逻辑完全不变,仅将底层仪器调用替换为_hw.XXX()统一接口。
第三步:开发全新UI界面
新建WinForm窗口,界面布局:4个槽位独立面板,分别展示测试进度条、设备状态、实时运行日志。
四、分阶段工作安排
今日任务
- 打开
HardwareConfig.cs,对照车间实际硬件接线,核对全部槽位映射配置; - 打开
HardwareService.cs,逐行校验每个硬件方法对应的OTP底层SCPI指令是否匹配。
明日任务
- 修改
QsfpModule.cs文件命名空间,替换所有GlobalVarFun引用为新项目GlobalConfig; - 编写简易控制台测试程序,验证
HardwareService能否正常读取光功率数值。
本周整体目标
- 完成
RxApdDebug/RxLosDebug/TxPowerDebug/TxErDebug四大调试算法迁移; - 单线程完整跑通单槽位光模块初测全流程;
- 改造代码实现4槽位多线程并发测试。
编程学习
技术分享
实战经验