ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mian_Form.cs中相关的函数代码

Mian_Form.cs中相关的函数代码 负责人需求解读 PN型号比对BUG分析负责人原话把 GlobalVarFun.moduleType 修改成 result 里面的 pn大白话型号比对逻辑中右侧用于校验的「基准型号」用错变量。应当使用 TestResult 中保存的飞思卓具体型号PNSetup界面下拉框选中的型号不能使用GlobalVarFun.moduleType这个方案大类变量。三个PN/型号核心变量区分变量名赋值位置含义说明示例值GlobalVarFun.moduleTypeLogin_Form.cs:322登录界面下拉选择的模块方案大类QSFP/SFP/XFP/QSFPER1TestResult.fibertop_pnSetup_Form.cs:284设置界面下拉选中的飞思卓完整型号PNAccess查表、SQL查询的主键QFP‑MM85FG‑S1DCTestResult.pnTestQSFP.cs:736从光模块EEPROM/Flash偏移168读取16字节ASCII模块出厂烧录PN界面pn_textBox显示内容模块内部烧录的原始PN字符串关键代码对应位置Main_Form.cs:1492pn_textBox.Text TestResult.pn;界面左侧展示模块自身读出的PNSetup_Form.cs:284TestResult.fibertop_pn moduletype_comboBox.Text;用户手动选择的飞思卓目标型号Common.cs:27public static string moduleType QSFP;模块大类初始值为QSFPBUG根源分析 Main_Form.cs:2500‑2518代码两个分支做对称校验客户定制型号、飞思卓型号。if(cpn_checkBox.Checked)// 客户定制型号{// 模块读出PN VS 用户输入的定制PNif((pn_textBox.Text).Trim()!(cpn_textBox.Text).Trim())...}else// 飞思卓型号校验分支{// BUG位置if((pn_textBox.Text).Trim()!(GlobalVarFun.moduleType).Trim())...}客户定制分支逻辑完全正常模块PN 和 用户输入定制PN做比对飞思卓分支错误拿完整长型号和大类简写QSFP对比永远无法匹配必定进入goto RTN_POS。负责人所说result里面的pn指的是TestResult.fibertop_pn✅修复方案 Main_Form.cs 第2512行原代码if((pn_textBox.Text).Trim()!(GlobalVarFun.moduleType).Trim())修改为if((pn_textBox.Text).Trim()!(TestResult.fibertop_pn).Trim())修改完成后两个分支逻辑完全对称客户定制模块烧录PN vs 用户填写定制PNcpn_textBox.Text飞思卓模式模块烧录PN vs 设置界面下拉选择型号TestResult.fibertop_pn⚠️额外需要注意3个风险点1、EEPROM读取字符串带’\0’结束符TestResult.pn通过GetString(flash_data, 168, 16)读取16字节末尾存在空字符\0、空格。C#默认.Trim()不会清除\0会造成比对失败。建议优化写法.Trim(\0, ,\t,\r,\n)2、moduleOnline状态卡死副作用遗留问题校验失败跳转到goto RTN_POS时不会重置moduleOnline标志位。后续Tick周期还会进入「模块可能插入」异常分支需要手动重新点击开始测试。修复在RTN_POS:标签第一行增加moduleOnlinefalse;3、变量赋值时序确认Read_moduleInfo()2476行执行test.GetFlashInfo()完成TestResult.pn赋值之后才执行2512行PN比对变量数据就绪无问题。TestResult.fibertop_pn在Setup界面切换型号就完成赋值执行比对时一定存在有效值。✅待确认与改动清单⚠️口头跟负责人确认result里面的pn是否指TestResult.fibertop_pn如果指TestResult.pn代表模块PN自己和自己对比校验直接失效不符合业务需求。99%场景是fibertop_pn。需要修改两处Main_Form.cs 2512行GlobalVarFun.moduleType→TestResult.fibertop_pn核心修复负责人要求RTN_POS标签起始位置增加moduleOnline false;修复状态卡死问题确认理解无误后即可执行代码修改。以下是对FirstTestProcess()函数中if (GlobalVarFun.tx_test)发射测试代码块约2860行开始的逐段解释整体功能概述这段代码是QSFP光模块初测FirstTest流程中的发射端(Tx)调试部分负责对模块的发射通道进行波长校准、光功率调试、消光比调试、DDM校准等一系列操作。代码被拆分成两个for循环两个循环都是i 1实际只对通道0执行一次。第一个 for 循环波长/TOSA温度调试for(inti0;i1;i)步骤代码说明1TestSet.ch i;设置当前测试通道号仅通道02btnCHState.Text Tx通道 ...更新界面显示当前测试的Tx通道3光开关切换逻辑多模(MM)模块直接切换光开关到通道i1单模模块如果接了光开关就切光开关否则通过软件SoftTxCHEn(i)使能模块的Tx通道i4test.TxTempLookupTableCtrl(false)关闭发射端自动温度补偿查找表功能防止温补干扰调试过程。如果失败则报错返回5TOSA温度调试波长校准如果启用了GlobalVarFun.TOSATempEN•40G模块(EMLTestType0)调用AutoTestEML(min, max)用二分法调节TOSA温度寄存器值通过波长计86120C读取波长使波长逼近目标值•100G模块(EMLTestType!0)调用AutoTestEML_100GLR()这是一个更复杂的4通道波长校准流程会遍历4个通道分别检查波长然后找所有通道的TOSA温度公共可行区间并取中间值最后微调第二个 for 循环VON、光功率、消光比调试 校准写入for(inti0;i1;i)步骤代码说明1-4通道设置、界面更新、光开关切换、关闭温补与第一个循环重复执行相同的初始化操作通道选择、光开关切换、关闭温度补偿TOSA温度调试已注释掉这部分被注释掉了用//注释说明TOSA温度调试已移到第一个循环中独立完成避免重复执行5AutoSetVON()如果启用了GlobalVarFun.VONEN进行VONEML激光器负压/偏置电压调试通过二分法或取中值设置VON寄存器6TxDebugIsOKCheck()判断该通道是否已经调试过检查当前光功率、偏置电流、消光比、DDM误差、APC/MOD寄存器值是否都在合格范围内。如果界面勾选了强制重新调试(txMustDebug_checkBox)则直接返回false强制重新调试7TxPowerAutoSet()如果未调试过进行发射光功率自动调试根据配置选择不同方法线性计算法/二分法/定值法调节APC自动功率控制寄存器使光功率达到目标值8TxErAutoSet()进行发射消光比(ER)自动调试用二分法微调策略先二分查找大致MOD值再根据光功率和Bias偏大/偏小分多种情况进行微调使ER和功率同时达标9test.WriteTxCalData()写入发射校准参数到模块将调试好的校准系数写入模块Flash/寄存器10test.SaveTxDataAfterDebug()保存Tx调试参数保存APC、MOD、温度等调试结果到模块11Converted_analog_values()读取并更新界面上的DDM监控值温度、电压、偏置、Tx功率、Rx功率12DDM功率精度检查从模块读取DDM上报的Tx功率值test.GetTxPwr()与实际光功率计/眼图仪测量值对比如果偏差绝对值超过txPwrMaxErr默认1dB则判定失败13TxFinalTestCheck()已注释掉这是终测的发射参数最终检查在初测中不需要14进度更新标记需要保存记录到数据库更新进度条关键设计要点为什么拆成两个循环第一个循环专门做波长/温度校准这一步会改变TOSA温度影响所有通道的波长第二个循环在波长稳定后再做功率和消光比调试。代码注释掉了第二个循环中的TOSA温度调试部分正是因为它已在第一个循环完成。为什么循环是i 1而不是i 4这说明当前代码版本只测试通道0可能是单通道模块或者多通道的其他通道调试被暂时禁用/硬编码为单通道测试。从代码中可以看到数组下标都是[i]且buf数组支持4通道框架预留了4通道能力。调试方法可配置光功率调试支持3种方法线性计算/二分法/定值法消光比支持2种方法通过GlobalVarFun全局变量配置。错误处理每一步调试失败都会立即返回false将按钮置红色并提示请插入下一只模块不会继续后续步骤。
返回列表