我现在将所有的代码都制作好了 但是我刚来公司 对公司很多业务不了解 然后对OTP命令中的我是刚进入这个公司 问这个VP OTP文档中的一些专有名词很多不了解 然后这个OTP有12个槽位号 分别用来测量插入模块发射和接收的一些参数 实际会插入4个SFP模块 通过OTP12个槽位中的单板分别对这四个模块进行相应参数的测量 现在我不知道11和12号槽位是如何对这四个模块进行连接 那怎么办呢 他现在给我了一个总体的之前单线程的项目给我 是单独测量一个模块的 后面会四个模块一起进行测量 然后需要一个端口 多线程进行测量 我现在应该怎么办呢新人分步完整解决方案从名词解释→硬件光路→代码改造→多线程四模块并行测试全程贴合你OTP-12设备一、先把文档设备专有名词一次性讲懂你看不懂的专业词全部通俗化1、机箱/槽位基础OTP-12整机机箱背板最多12个物理插槽SLOT01~SLOT12也就是你代码里SetSlot(01)控制的单板位置SLOT槽位每个槽插一块独立功能单板OPM/VOA/SW/ERM/LAG等一块板只做一件事SLOT01主控BE板整机通信、系统命令必插SLOT05OPM四路光功率计测SFP发射光SLOT06ERM消光比板测SFP ER消光比SLOT07/08发射通路VOA衰减4路SFP分两组1/2号模块用073/4用08SLOT09/10接收通路VOA衰减SLOT11/SLOT12两路2×2光开关SWD2核心你疑问的四路分光靠这两块实现SFP被测模块一共4个待测光模块模块1、2、3、4全部需要同时测发射功率、消光、衰减等指标光开关SWD2SLOT11、122进2出光路切换板SLOT11负责切换SFP1、SFP2两路被测光路把光路切到OPM/ERM测量板SLOT12负责切换SFP3、SFP4两路被测光路BoardPrefix代码里LINS00xx0子架默认0xx当前槽号SetSlot(11)就变成LINS0011控制11槽光开关SCPI仪器远程控制指令你封装的所有XXX_Set/XXX_Get底层都是发送SCPI字符串单线程老项目只能一次只测1个SFP测完再换下一个效率极低多线程新项目4个SFP模块同时并行测量互不阻塞同时采集四路数据2、SLOT11SLOT12光路连接逻辑重点解答你的核心疑问硬件光路布线规则车间标准接线SLOT11 光开关SWD22输入2输出输入IN1 → SFP1发射光纤输入IN2 → SFP2发射光纤输出OUT1 → 分光至SLOT05 OPM功率计 SLOT06 ERM消光比板SLOT12 光开关SWD22输入2输出输入IN1 → SFP3发射光纤输入IN2 → SFP4发射光纤输出OUT1 → 同样分光接入SLOT05 OPM、SLOT06 ERMVOA衰减区分SFP1/2发射光路衰减SLOT07 VOASFP3/4发射光路衰减SLOT08 VOA工作流程举例测模块1driver.SetSlot(11)→SW_SetChannel(1,1)把11槽IN1光路切到测量通路测模块3driver.SetSlot(12)→SW_SetChannel(1,1)把12槽IN1光路切到测量通路两块光开关独立互不干扰这就是四路并行的硬件基础二、你现在的工作分步执行按顺序做不用跳第一步先吃透现有单线程旧项目理解业务流程打开旧项目Program.cs梳理单模块完整测试流程标准单SFP测试步骤旧代码逻辑① 切换对应光开关通道接入当前SFP光路② 切换VOA槽位设置目标衰减值③ 调用OPM读取发射光功率④ 调用ERM读取消光比⑤ 读取VOA当前衰减⑥ 保存数据/打印结果把单模块测试抽离成独立通用方法多线程复用核心函数示例抽离函数模板/// summary单路SFP完整测量流程/summary/// param namedriver独立仪器连接实例多线程关键不能共用全局driver/param/// paramswSlot对应光开关槽11模块1/212模块3/4/param/// paramswInCh光开关输入通道1/2/param/// paramvoaSlot对应VOA槽07/08/param/// returns该模块测量结果实体/returnspublicSfpTestResultSingleSfpTest(OTP12Driverdriver,stringswSlot,intswInCh,stringvoaSlot){SfpTestResultresnewSfpTestResult();//1.切换光开关选中当前SFP光路driver.SetSlot(swSlot);driver.SW_SetChannel(swInCh,1);Thread.Sleep(300);//2.切换VOA设置衰减driver.SetSlot(voaSlot);driver.VOA_SetAttenuation(1,5.0);Thread.Sleep(300);//3.读取OPM功率driver.SetSlot(05);res.Powerdriver.OPM_ReadPower(1);//4.读取ERM消光比driver.SetSlot(06);res.ErDatadriver.ERM_ReadERData(1);//5.读取当前衰减driver.SetSlot(voaSlot);res.Attdriver.VOA_GetAttenuation(1);returnres;}定义结果实体类统一存储四路数据publicclassSfpTestResult{publicintModuleNo{get;set;}//1/2/3/4publicstringPower{get;set;}publicstringEr{get;set;}publicstringAttenuation{get;set;}publicboolTestSuccess{get;set;}}第二步解决多线程核心坑重点仪器TCP不能共享Driver致命问题全局唯一driver不能多线程共用你现在代码里static OTP12Driver driver new OTP12Driver();是单例多线程同时调用会TCP指令错乱、设备busy报错。解决方案每一条测量线程新建独立OTP12Driver对象各自建立TCP连接仪器5024端口支持多路SCPI并发手册有写每条线程执行完自动DisConnect释放连接使用Task/Parallel实现4路并行加集合收集四路结果第三步四路SFP硬件槽位映射表固定直接写代码待测模块对应光开关槽光开关输入通道发射VOA槽SFP1“11”1“07”SFP2“11”2“07”SFP3“12”1“08”SFP4“12”2“08”第四步编写多线程并行测试Program代码可直接复制usingSystem;usingSystem.Collections.Generic;usingSystem.Threading.Tasks;namespaceOTP_AutoRead_Test{classProgram{// 仪器固定参数conststringDeviceIp192.168.1.222;constintDevicePort5024;staticvoidMain(string[]args){Console.WriteLine( 四路SFP并行多线程测量程序 );// 四路模块配置数组对应硬件槽位varmoduleConfignewList(intmodNo,stringswSlot,intswInCh,stringvoaSlot)(){(1,11,1,07),(2,11,2,07),(3,12,1,08),(4,12,2,08)};// 存储四路并行任务ListTaskSfpTesttaskListnewListTaskSfpTest();foreach(varcfginmoduleConfig){// 每路新建独立Driver单独TCP连接TaskSfpTesttaskTask.Run((){OTP12DriversingleDrivernewOTP12Driver();SfpTestresultnewSfpTest(){ModuleNocfg.modNo};try{// 单独建立连接boolconnOksingleDriver.Connect(DeviceIp,DevicePort);if(!connOk){result.TestSuccessfalse;result.Msg$模块{cfg.modNo}设备连接失败;returnresult;}// 执行单模块完整测量resultSingleModuleMeasure(single,cfg.swSlot,cfg.swInCh,cfg.voaSlot,cfg.modNo);}catch(Exceptionex){result.TestSuccessfalse;result.Msg$模块{cfg.modNo}测量异常{ex.Message};}finally{singleDriver.DisConnect();}returnresult;});taskList.Add(task);}// 等待四路全部并行测量完成Task.WaitAll(taskList.ToArray());Console.WriteLine(\n 四路全部测量完成汇总结果 );foreach(vartaskintaskList){vardatatask.Result;Console.WriteLine($【模块{data.ModuleNo}】成功:{data.TestSuccess}功率:{data.Power}ER:{data.Er}衰减:{data.Att}备注:{data.Msg});}Console.ReadKey();}/// summary单路SFP标准测量函数/summarystaticSfpTestSingleModuleMeasure(OTP12Driverdriver,stringswSlot,intswInCh,stringvoaSlot,intmodNo){SfpTestresnewSfpTest();res.ModuleNomod;res.TestSuccesstrue;try{//1 切换对应光开关切到当前SFP光路driver.SetSlot(swSlot);driver.SW_SetChannel(swInCh,1);Thread.Sleep(300);//2 设置发射通路衰减5dB示例driver.SetSlot(voaSlot);driver.VOA_SetAttenuation(1,5.0);Thread.Sleep(200);//3 读取OPM光功率05槽driver.SetSlot(05);res.Powerdriver.OPM_ReadPower(1);//4 读取ERM消光比06槽driver.SetSlot(06);res.Erdriver.ERM_ReadERData(1);//5 读取当前衰减值driver.SetSlot(voaSlot);res.Attdriver.VOA_GetAttenuation(1);}catch(Exceptione){res.TestSuccessfalse;res.Msge.Message;}returnres;}}/// summary四路测试结果实体/summarypublicclassSfpTest{publicintModuleNo{get;set;}publicboolTestSuccess{get;set;}publicstringPower{get;set;}publicstringEr{get;set;}publicstringAtt{get;set;}publicstringMsg{get;set;}}}三、车间硬件插板接线核对步骤你去现场测试必做机箱断电插入所有功能单板01:BE主控 | 05:OPM | 06:ERM | 07/08:VOA | 11/12:SWD2光开关光纤按上文光路表接线SFP1/2进11槽SFP3/4进12槽输入口所有光开关输出光纤统一分光接入OPM、ERM输入上电等待机箱自检3分钟全部单板状态变为READY可调用QueryBoardStatus验证电脑IP改为192.168.x同网段ping通设备IP先跑单线程测试验证4个模块单独测都能读出数据再启用多线程并行四、新人学习排错建议先单线程验证所有读/写接口先用你之前写的4~15模块自检程序确认每块槽位单板通信正常、无ERROR返回再做业务测量。分不清槽位功能时运行QueryAllBoardCatalog()打印整机所有在线槽板核对型号多线程报错Device busy解决方案禁止全局共享driver每条线程独立TCP连接每条SCPI指令后加200~300ms延时你底层SendScpi自带delayMs可调整光路无数据OPM返回-200排查顺序① 光开关通道是否切换正确SW_GetCurrentChannel校验② 光纤是否插紧、有无弯折③ SFP模块是否上电发光业务拓展方向后续需求四路数据导出CSV报表循环批量老化测试增加LAG可调光源/TRIG触发同步测量五、你当下优先级工作清单按顺序做不迷路通读VP OTP-12 V2.0手册标记4/5/6/7/8/11/12章节测量核心槽位命令运行你之前写的模块自检程序确认所有单板读写接口无报错读懂老单线程项目抽离单SFP测量公共方法编写多线程Task并行代码测试四路同步采集车间上机插板、接光纤实测四路并行数据采集封装报表导出、异常重试、日志打印等附加功能