Pārlūkot izejas kodu

EB 90数据帧配置功能开发

ceac_pqy@163.com 3 gadi atpakaļ
vecāks
revīzija
769ccbe967

+ 12 - 1
exe/apps/DevicesApp/commands/程控命令.xml

@@ -243,6 +243,9 @@
 		<Command Key="NextPeakRight" Value=":CALC:MARK{0}:MAX:RIGHT" Description="标记右峰值,{0}MARK点"/>
 		
         <Command Key="MARK打开" Value=":CALC:MARK{0}:STAT ON" Description="打开MARK,{0}MARK点"/>
+		
+		<Command Key="打开MARK精度" Value=":CALC:MARK{0}:FCO ON" Description="设置MARK显示精度,{0}MARK点"/>
+		<Command Key="读MARK高精度频率" Value=":CALC:MARK{0}:FCO:X?" Description="读MARK频率,{0}MARK点,读MARK高精度频率,仅在MARK显示精度打开模式下"/>
         <Command Key="读MARK功率" Value=":CALC:MARK{0}:Y?" Description="读MARK功率,{0}MARK点"/>
         <Command Key="读MARK频率" Value=":CALC:MARK{0}:X?" Description="读MARK频率,{0}MARK点"/>
 		<Command Key="DELT打开" Value=":CALCulate:MARKer{0}:MODE DELTa" Description="打开DELT,{0}}MARK点"/>
@@ -254,16 +257,22 @@
 		<Command Key="读通道曲线" Value=":READ:CHPower2?" Description="读通道曲线"/>
 		
 		<Command Key="设置通道SPAN" Value=":CHPower:FREQuency:SPAN {0}MHz" Description="设置通道SPAN,仅通道模式,单位MHz"/>
+		<Command Key="设置通道REF" Value="DISP:CHP:VIEW:WIND:TRAC:Y:RLEV {0} dBm" Description="设置通道参考电平,单位dBm"/>
 		<Command Key="设置通道带宽" Value=":CHPower:BANDwidth:INTegration {0}KHz" Description="设置通道带宽,单位KHz,同:CHPower:BWIDth:INTegration命令"/>
 		<Command Key="设置通道功率模式" Value=":CONFigure:CHPower" Description="设置通道功率模式"/>
 		<Command Key="设置频谱测试模式" Value=":CONFigure:SANalyzer" Description="设置频谱测试模式,针对Meas按键"/>
-		<Command Key="读通道功率" Value=":READ:CHPower?" Description="读通道功率,返回通道功率,功率谱密度"/>
+		<Command Key="读通道功率" Value=":READ:CHPower:CHPower?" Description="读通道功率"/>
+		<Command Key="读通道噪声功率谱密度" Value=":READ:CHPower:DENSity?" Description="读通道噪声功率谱密度"/>
 		
 		
+		<Command Key="相位噪声下Mark标记Trace" Value="CALC:LPLot:MARK:TRAC {0}" Description="相位噪声下Mark标记Trace"/>
+		<Command Key="相位噪声下设置Mark" Value="CALC:LPL:MARK{0}:MODE POS" Description="相位噪声下设置Mark"/>
         <Command Key="SetSAMode" Value=":INSTrument SA" Description="SetSAMode"/>
         <Command Key="相位噪声测试模式" Value=":INSTrument PNOISE" Description="相位噪声测试模式"/>
+		<Command Key="相位噪声LogPlot模式" Value=":CONFigure:LPL" Description="配置相位噪声为LogPlot模式"/>
 		<Command Key="相位噪声测试" Value="FREQ:CARR:SEAR" Description="单位A"/>
         <Command Key="相位噪声载波频率设置" Value=":FREQ:CARR {0} MHz" Description="单位A"/>
+		<Command Key="相位噪声模式REF" Value=":DISPlay:LPLot:VIEW:WINDow:TRACe:Y:RLEVel {0}" Description="相位噪声模式参考电平,单位dBc/Hz"/>
         <Command Key="相位噪声关闭平均" Value=":LPL:AVER OFF" Description="单位A"/>
         <Command Key="相位噪声打开MarkTable" Value="CALC:LPL:MARK:TABL 1" Description="单位A"/>
         <Command Key="读Mark相位噪声值" Value=":CALC:LPLot:MARK{0}:Y?" Description="{0}电压值,单位V,CV模式下"/>
@@ -303,6 +312,7 @@
         <Command Key="VBWAUTO" Value=":BWIDth:VID:AUTO 1" Description="设置视频带宽自动"/>
 		<Command Key="设置通道带宽" Value="SENS:POW:ACH:BWID {0}KHz" Description="设置通道带宽,单位MHz"/>
 		<Command Key="设置通道功率模式" Value="CALC:MARK:FUNC:POW:SEL ACP" Description="设置通道功率模式"/>
+		<Command Key="设置频谱测试模式" Value="CALC:MARK:FUNC:POW:SEL OFF" Description="设置频谱测试模式,针对MARK-FUNC按键"/>
 		<Command Key="读通道功率" Value="CALC:MARK:FUNC:POW:RES? CPOWer" Description="读通道功率,单位dBm"/>
 		
 		
@@ -458,6 +468,7 @@
 	<DeviceCommand DeviceType="功率计">
       <Models>
         <string>E4418A</string>
+		<string>EPM-441A</string>
       </Models>
       <Commands>
 		<Command Key="仪器复位" Value="*RST" Description="复位"/>

BIN
exe/apps/Tps_LQ_Transmitter/config/ModulationMode.xlsx


BIN
exe/apps/Tps_LQ_Transmitter/config/串口控制.xlsx


BIN
exe/apps/Tps_LQ_Transmitter/config/测试#常温测试#发射机 -N9030A.xlsx


BIN
tps/TpsLabStudio/.vs/TpsLabStudio/v16/.suo


+ 14 - 6
tps/TpsLabStudio/FrmMain.cs

@@ -275,10 +275,18 @@ namespace Tps_LQ_Transmitter
             dgvTestData.DataSource = null;
             dgvTestData.DataSource = currFileNode.Tps.TestTable;
             // ConfigParameter SetVoltPara = new ConfigParameter();
-            /*
+            
             CommonVisaResource DCPower = new CommonVisaResource();
-         
-            DCPower.Open(currFileNode.Tps.DCPowerAddress);
+            try
+            {
+                DCPower.Open(currFileNode.Tps.DCPowerAddress);
+
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("打开TDK电源失败,请检查电源是否上电!");
+                return;
+            }
             DCPower.Write("INSTrument:NSELect 6\n"); DCPower.Query("*OPC?\n");
             DCPower.Write("VOLTage:PROTection:LEVel 34 V\n"); DCPower.Query("*OPC?\n");//设置过压保护
 
@@ -290,7 +298,7 @@ namespace Tps_LQ_Transmitter
             DCPower.Write($"VOLTage {volt} V\n"); DCPower.Query("*OPC?\n");//设置电压
             DCPower.Write($"CURRent {Current} A\n"); DCPower.Query("*OPC?\n");//设置电流
             DCPower.Write("GLOBal:OUTPut:STATe 1\n"); DCPower.Query("*OPC?\n");
-            */
+            
 
 
             //获取仪器
@@ -308,8 +316,8 @@ namespace Tps_LQ_Transmitter
             task = new Task(new Action(() => {
                 //执行测试过程
                 currFileNode.Tps.Start(isOrderByChannel);
-                
 
+                DCPower.Write("GLOBal:OUTPut:STATe 0\n"); DCPower.Query("*OPC?\n");
                 this.Invoke(new Action(() => {
                     BtnLoadTpsConfig.Enabled = true;
                     BtnStart.Enabled = true;
@@ -342,7 +350,7 @@ namespace Tps_LQ_Transmitter
             BtnStart.Enabled = true;
             BtnLoadTpsConfig.Enabled = true;
             //DC.Write("关闭电源");
-         //   DCPower.Write("GLOBal:OUTPut:STATe 0\n"); DCPower.Query("*OPC?\n");
+            DCPower.Write("GLOBal:OUTPut:STATe 0\n"); DCPower.Query("*OPC?\n");
         }
 
         private void BtnDevice_Click(object sender, EventArgs e)

+ 4 - 3
tps/TpsLabStudio/MainTps.cs

@@ -783,9 +783,9 @@ namespace Tps_LQ_Transmitter
             }
         }
 
-        public AppLibs.Devices.IVISA GetDeviceModel(string ModelName)
+        public AppLibs.Devices.IVISA GetDeviceModel(string DeviceHandle)
         {
-            DeviceNode node = this.Devices.FirstOrDefault(x => x.DeviceModel == ModelName);
+            DeviceNode node = this.Devices.FirstOrDefault(x => x.DeviceHandle == DeviceHandle);
             //不存在或者状态不对,都返回空
             if (node == null && node.State == false)
             {
@@ -799,7 +799,8 @@ namespace Tps_LQ_Transmitter
 
                 DeviceParameter dev = devHost.GetFirstOrDefaultDeviceID(node.DeviceHandle);
                 //要地址,名称,型号一致
-                if (dev == null || !(node.DeviceType == dev.DeviceType && node.DeviceModel == dev.DeviceModel))
+                //if (dev == null || !(node.DeviceType == dev.DeviceType && node.DeviceModel == dev.DeviceModel))
+                if (dev == null || !(node.DeviceType == dev.DeviceType ))
                 {
                     return null;
                 }

+ 3 - 0
tps/TpsLabStudio/TpsLabStudio.csproj

@@ -157,6 +157,9 @@
     <None Include="config\ModulationMode.xlsx">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Include="config\串口控制.xlsx">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Include="config\测试#常温检查#发射机.xlsx">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>

+ 3 - 2
tps/TpsLabStudio/com/SerialPort.cs

@@ -9,8 +9,9 @@ namespace Tps_LQ_Transmitter.com
 {
     class TransmitterSerialPort
     {
-        public void DUT_Transmitter_Ctrol(string PORT, byte FreqSelect)
+        public void DUT_Transmitter_Ctrol(string PORT, byte ModeSelect,byte FreqSelect)
         {
+            
             SerialPort sp = new SerialPort(); //新建一个串口对象
             sp.PortName = PORT;     //端口号设置为com_port的值
             sp.BaudRate = 115200;
@@ -32,8 +33,8 @@ namespace Tps_LQ_Transmitter.com
             int offset = 0;
             JGbuffer[offset++] = 0xEB;
             JGbuffer[offset++] = 0x90;
+            JGbuffer[offset++] = ModeSelect;//切模式
             JGbuffer[offset++] = FreqSelect;//切频点
-            JGbuffer[offset++] = 0x55;
 
             try
             {

BIN
tps/TpsLabStudio/config/ModulationMode.xlsx


BIN
tps/TpsLabStudio/config/串口控制.xlsx


BIN
tps/TpsLabStudio/config/测试#常温测试#发射机 -N9030A.xlsx


+ 14 - 3
tps/TpsLabStudio/models/HarmonicSuppression.cs

@@ -115,6 +115,7 @@ namespace Tps_LQ_Transmitter.models
 
                 double[] HarmonicTimeVal = new double[PowerPara.HarmonicTime.Length];
                 double HarmonicMinTimeVal = 0;
+                HarmonicSuppressionPrint.Lower = PowerPara.HarmonicSuppressionLower;
                 if (true)//需具备仪器
                 {
                     SA.Write("REF", PowerPara.SmallSignalREF); SA.Query("OPC");
@@ -122,11 +123,21 @@ namespace Tps_LQ_Transmitter.models
                     for (harmonic_num = 0; harmonic_num < PowerPara.HarmonicTime.Length; harmonic_num++)
                     {
                         SA.Write("CENTER", (Freq/1000000 * PowerPara.HarmonicTime[harmonic_num]).ToString()); SA.Query("OPC");//N次谐波
-                        SA.Write("SingleOrCont", "0"); SA.Query("OPC");
+                       // SA.Write("SingleOrCont", "0"); SA.Query("OPC");
+                        SA.Write("单次扫描"); SA.Query("OPC");
                         PsaPeakValue_Tracedata(SA, out y_value, out x_value, false);
                         Data.HarmonicSuppression[point, harmonic_num] = Math.Round(Power - y_value, 2);
-
+                        HarmonicSuppressionPrint.Test_name = parameters.Channel + "-"+ PowerPara.HarmonicTime[harmonic_num].ToString()+ "次-谐波抑制测试-" + (Freq / 1000000).ToString() + "MHz";
                         HarmonicTimeVal[harmonic_num] = Data.HarmonicSuppression[point, harmonic_num];
+                        if (HarmonicTimeVal[harmonic_num] >= HarmonicSuppressionPrint.Lower)
+                        {
+                            HarmonicSuppressionPrint.Result = "是";
+                        }
+                        else
+                        {
+                            HarmonicSuppressionPrint.Result = "否";
+                        }
+                        tps.TestTableAddCell(HarmonicSuppressionPrint.Test_name, HarmonicSuppressionPrint.Lower.ToString(), "/", HarmonicTimeVal[harmonic_num].ToString(), HarmonicSuppressionPrint.Result);
                     }
 
                     if (PowerPara.HarmonicTime.Length > 1)//计算几次谐波中的最小值
@@ -141,7 +152,7 @@ namespace Tps_LQ_Transmitter.models
                 }
 
                 HarmonicSuppressionPrint.Test_name = parameters.Channel + "-谐波抑制测试-" + (Freq / 1000000).ToString() + "MHz";
-                HarmonicSuppressionPrint.Lower = PowerPara.HarmonicSuppressionLower;
+               
                 HarmonicSuppressionPrint.TestVal = HarmonicMinTimeVal;
               //  HarmonicSuppressionPrint.TestVal = random.Next(4000, 12000) / 100.0;//随机数
                 if (HarmonicSuppressionPrint.TestVal >= HarmonicSuppressionPrint.Lower)

+ 11 - 1
tps/TpsLabStudio/models/ModulationIndexAndMaxFreqOffset.cs

@@ -44,6 +44,10 @@ namespace Tps_LQ_Transmitter.models
 
             MatchModulaPara CfigModuParas = new MatchModulaPara();
             CfigModuParas = LoadModulationWorkBook();
+            if (CfigModuParas == null)
+            {
+                return false;
+            }
 
             ConfigParameter PowerPara = new ConfigParameter();
             PowerPara.ComPort = parameters.Parameters.GetParameter<string>("串口");
@@ -150,21 +154,27 @@ namespace Tps_LQ_Transmitter.models
                 }
 
                 Data.ModulationIndex[point] = CfigModuParas.GetModulaParameter(RelativeVal);//调制系数
-                // Data.MaxFreqOffset[point] = CfigModuParas.GetFreqOffsetParameter(RelativeVal);//最大频偏
+                Data.MaxFreqOffset[point] = CfigModuParas.GetFreqOffsetParameter(RelativeVal);//最大频偏
 
                 ModulationIndexPrint.Test_name = parameters.Channel + "-调制系数测试-" + CenterFreq.ToString() + "MHz";
+                MaxFreqOffsetPrint.Test_name = parameters.Channel + "-最大频偏(KHz)-" + CenterFreq.ToString() + "MHz";
                 ModulationIndexPrint.Lower = PowerPara.ModulationIndexLower;
                 ModulationIndexPrint.Upper = PowerPara.ModulationIndexUpper;
                 ModulationIndexPrint.TestVal = double.Parse(Data.ModulationIndex[point]);
+                MaxFreqOffsetPrint.TestVal = double.Parse(Data.MaxFreqOffset[point]);
                 if (ModulationIndexPrint.TestVal >= ModulationIndexPrint.Lower && ModulationIndexPrint.TestVal <= ModulationIndexPrint.Upper)
                 {
                     ModulationIndexPrint.Result = "是";
+                    MaxFreqOffsetPrint.Result = "是";
                 }
                 else
                 {
                     ModulationIndexPrint.Result = "否";
+                    MaxFreqOffsetPrint.Result = "否";
                 }
+                tps.TestTableAddCell(MaxFreqOffsetPrint.Test_name, "/","/", MaxFreqOffsetPrint.TestVal.ToString(), MaxFreqOffsetPrint.Result);
                 tps.TestTableAddCell(ModulationIndexPrint.Test_name, ModulationIndexPrint.Lower.ToString(), ModulationIndexPrint.Upper.ToString(), ModulationIndexPrint.TestVal.ToString(), ModulationIndexPrint.Result);
+                
                 if (parameters.Channel == "通道1")
                 {
                     if (point == 0)

+ 53 - 15
tps/TpsLabStudio/models/NoisePowerDensity.cs

@@ -19,7 +19,7 @@ namespace Tps_LQ_Transmitter.models
         /// </summary>
         public override bool Run(TestNode parameters)
         {
-            double y_value, x_value;
+            double ChannelPower, ChannelPowerDensity;
             //获取仪器
             var SA = this.tps.GetDevice("频谱仪");
            
@@ -41,7 +41,8 @@ namespace Tps_LQ_Transmitter.models
             PowerPara.StepFrequency = parameters.Parameters.GetParameter<double>("频率步进");
             PowerPara.FrequencyNumber = parameters.Parameters.GetParameter<int>("频点数量");
             PowerPara.StopFrequency = parameters.Parameters.GetParameter<double>("终止频率");
-            PowerPara.SPAN = parameters.Parameters.GetParameter<string>("扫描带宽(SPAN)");
+           // PowerPara.SPAN = parameters.Parameters.GetParameter<string>("扫描带宽(SPAN)");
+            PowerPara.CHSPAN = parameters.Parameters.GetParameter<string>("通道扫描带宽(SPAN)");
             PowerPara.ACHBand = parameters.Parameters.GetParameter<string>("通道带宽");
             PowerPara.REF = parameters.Parameters.GetParameter<string>("参考电平(REF)");
             PowerPara.RBW = parameters.Parameters.GetParameter<string>("分辨率带宽(RBW)");
@@ -49,7 +50,7 @@ namespace Tps_LQ_Transmitter.models
             PowerPara.ControlDelay = parameters.Parameters.GetParameter<int>("控制延时");
             PowerPara.NoisePowerUpper = parameters.Parameters.GetParameter<double>("噪声功率谱密度上限");
             if ((PowerPara.StartFrequency == 0) || ((PowerPara.StepFrequency == 0) && (PowerPara.FrequencyNumber == 0)) || (PowerPara.StopFrequency == 0)
-                || (PowerPara.SPAN == null) || (PowerPara.REF == null) || (PowerPara.RBW == null) || (PowerPara.VBW == null) || (PowerPara.NoisePowerUpper == 0))
+                || (PowerPara.CHSPAN == null) || (PowerPara.ACHBand == null) || (PowerPara.REF == null) || (PowerPara.RBW == null) || (PowerPara.VBW == null) || (PowerPara.NoisePowerUpper == 0))
             {
                 ShowMessage(MsgType.Error, string.Format("配置文件中频率参数为空,{0}/{1}无法运行", parameters.Channel, parameters.Name));
                 return false;
@@ -59,14 +60,29 @@ namespace Tps_LQ_Transmitter.models
                 PowerPara.ControlDelay = 10;
             }
             SA.Write("仪器复位"); SA.Query("OPC");
-            SA.Write("SPAN", PowerPara.SPAN); SA.Query("OPC");
+           
             SA.Write("RBW", PowerPara.RBW); SA.Query("OPC");
             SA.Write("VBW", PowerPara.VBW); SA.Query("OPC");
-            SA.Write("REF", "-20"); SA.Query("OPC");
+            SA.Write("设置通道功率模式"); SA.Query("OPC");
+            if (SA.Query("IDN").Contains("N9030"))//N9030A型号频谱仪
+            {
+                SA.Write("设置通道REF", "-20"); SA.Query("OPC");
+                SA.Write("ATT", "2"); SA.Query("OPC");
+                SA.Write("设置通道SPAN", PowerPara.CHSPAN); SA.Query("OPC");
+            }
+            else
+            {
+                
+                SA.Write("REF", "-20"); SA.Query("OPC");
+                SA.Write("MARK打开", "1"); SA.Query("OPC");
+                SA.Write("ATT", "5"); SA.Query("OPC");
+                SA.Write("SPAN", PowerPara.CHSPAN); SA.Query("OPC");
+            }
+            
             SA.Write("设置通道带宽", PowerPara.ACHBand); SA.Query("OPC");
-            SA.Write("ATT", "5"); SA.Query("OPC");
+            
 
-            SA.Write("MARK打开", "1"); SA.Query("OPC");
+            
 
             if ((PowerPara.FrequencyNumber != 0) && (PowerPara.FrequencyNumber != 1) && (PowerPara.StepFrequency == 0))
             {
@@ -89,18 +105,28 @@ namespace Tps_LQ_Transmitter.models
                     break;
                 }
                 // 控制
-                SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
+              //  SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
                 Thread.Sleep(PowerPara.ControlDelay);//单位ms            
 
                 SA.Write("CENTER", CenterFreq.ToString()); SA.Query("OPC");
-                SA.Write("设置通道功率模式"); SA.Query("OPC");
-                SA.Write("SingleOrCont", "0"); SA.Query("OPC");
-                y_value = double.Parse(SA.Query("读通道功率"));
 
-      
+                SA.Write("单次扫描"); SA.Query("OPC");
+                if (SA.Query("IDN").Contains("N9030"))//N9030A型号频谱仪
+                {
+                    ChannelPowerDensity = double.Parse(SA.Query("读通道噪声功率谱密度"));
+                    NoisePowerPrint.TestVal = Math.Round(ChannelPowerDensity, 2);
+                }
+                else
+                {
+                    ChannelPower = double.Parse(SA.Query("读通道功率"));
+                    NoisePowerPrint.TestVal = Math.Round(ChannelPower - 10 * Math.Log10(double.Parse(PowerPara.ACHBand) * 1000), 2);
+                }
+
+
+
                 NoisePowerPrint.Test_name = parameters.Channel + "-噪声功率谱密度(dBm/Hz)-" + CenterFreq.ToString() + "MHz";
                 NoisePowerPrint.Upper = PowerPara.NoisePowerUpper;
-                NoisePowerPrint.TestVal = Math.Round(y_value-10*Math.Log10(double.Parse(PowerPara.ACHBand) *1000), 2)  ;
+                
                 if ( NoisePowerPrint.TestVal <= NoisePowerPrint.Upper)
                 {
                     NoisePowerPrint.Result = "是";
@@ -119,8 +145,16 @@ namespace Tps_LQ_Transmitter.models
                 //    //tps.SetTestTableCellValue(point + 15, 9,  NoisePowerPrint.Result ,NoisePowerPrint.TestVal);                  
                 //}
             }
-            SA.Write("设置MARK为常规", "1"); SA.Query("OPC");
-            SA.Write("关闭所有MARK"); SA.Query("OPC");
+            if (SA.Query("IDN").Contains("N9030"))//N9030A型号频谱仪
+            {
+                SA.Write("设置频谱测试模式"); SA.Query("OPC");
+            }
+            else
+            {
+                SA.Write("设置MARK为常规", "1"); SA.Query("OPC");
+                SA.Write("关闭所有MARK"); SA.Query("OPC");
+
+            }           
             return true;
         }
 
@@ -183,6 +217,10 @@ namespace Tps_LQ_Transmitter.models
             /// </summary>
             public string SPAN { set; get; }
             /// <summary>
+            ///设置频谱仪的通道SPAN
+            /// </summary>
+            public string CHSPAN { set; get; }
+            /// <summary>
             /// 通道带宽
             /// </summary>
             public string ACHBand { set; get; }

+ 51 - 24
tps/TpsLabStudio/models/PhaseNoise.cs

@@ -43,6 +43,7 @@ namespace Tps_LQ_Transmitter.models
             PowerPara.PNosieOffsetFreq = parameters.Parameters.GetParameterToArray<double>("相位噪声偏置频率");
             PowerPara.SPAN = parameters.Parameters.GetParameter<string>("扫描带宽(SPAN)");
             PowerPara.REF = parameters.Parameters.GetParameter<string>("参考电平(REF)");
+            PowerPara.PNoiseREF = parameters.Parameters.GetParameter<string>("相位噪声模式参考电平(REF)");
             PowerPara.RBW = parameters.Parameters.GetParameter<string>("分辨率带宽(RBW)");
             PowerPara.VBW = parameters.Parameters.GetParameter<string>("视频带宽(VBW)");
             PowerPara.ControlDelay = parameters.Parameters.GetParameter<int>("控制延时");
@@ -58,20 +59,23 @@ namespace Tps_LQ_Transmitter.models
                 PowerPara.ControlDelay = 10;
             }
             SA.Write("仪器复位"); SA.Query("OPC");
-            SA.Write("REF", PowerPara.REF); SA.Query("OPC");
-            SA.Write("MARK打开", "1"); SA.Query("OPC");
-
-
+            
+    
+            if (SA.Query("IDN").Contains("N9030"))
+            {
+                SA.Write("相位噪声测试模式"); SA.Query("OPC");
+                SA.Write("相位噪声LogPlot模式"); SA.Query("OPC");
+                SA.Write("相位噪声模式REF", PowerPara.PNoiseREF); SA.Query("OPC");
+               
+            }
+            else 
+            {
+                SA.Write("MARK打开", "1"); SA.Query("OPC");
+                SA.Write("REF", PowerPara.REF); SA.Query("OPC");
+            }
 
-            //if (SA.Query("IDN").Contains("N9030"))
-            //{
-            //    SA.Write("MARK打开", "2"); SA.Query("OPC");
-            //    SA.Write("DELT打开", "2"); SA.Query("OPC");
 
-            //}
-            
 
-            
             if ((PowerPara.FrequencyNumber != 0) && (PowerPara.FrequencyNumber != 1) && (PowerPara.StepFrequency == 0))
             {
                 PowerPara.StepFrequency = ((int)(((PowerPara.StopFrequency - PowerPara.StartFrequency) / (PowerPara.FrequencyNumber - 1)) * 100)) / 100;
@@ -98,17 +102,20 @@ namespace Tps_LQ_Transmitter.models
 
                 if (SA.Query("IDN").Contains("N9030"))//N9030A型号频谱仪
                 {
-                    SA.Write("相位噪声测试模式");
-                    SA.Query("OPC");
+                    //SA.Write("相位噪声测试模式");SA.Query("OPC");
+                    //SA.Write("相位噪声LogPlot模式"); SA.Query("OPC");
+                    //SA.Write("相位噪声模式参考电平","-30"); SA.Query("OPC");
                     SA.Write("相位噪声载波频率设置", CenterFreq.ToString()); SA.Query("OPC");
+                    
                     //Psa.Write("相位噪声stopOffset", "200000"); Psa.QueryTimeout("OPC", 3000);
                     //Psa.Write("相位噪声startOffset", "20"); Psa.QueryTimeout("OPC", 3000);
                     SA.Write("相位噪声关闭平均");
                     SA.Query("OPC");
-                    SA.Write("相位噪声打开MarkTable");
-                    SA.Query("OPC");
-                    SA.Write("相位噪声测试");
-                    SA.Query("OPC");
+                    SA.Write("相位噪声测试");  SA.Query("OPC");
+                    Thread.Sleep(5000);
+
+                    SA.Write("相位噪声下设置Mark", "1"); SA.Query("OPC");
+                    SA.Write("相位噪声下Mark标记Trace", "1"); SA.Query("OPC");
                 }
                 else
                 {
@@ -128,12 +135,13 @@ namespace Tps_LQ_Transmitter.models
       
                 double[] PhaseNoiseOffsetVal = new double[PowerPara.PNosieOffsetFreq.Length];
                 double PhaseNoiseMaxOffsetVal = 0;
+                PhaseNoisePrint.Upper = PowerPara.PhaseNoiseUpper;
                 for ( int offset_num = 0; offset_num < PowerPara.PNosieOffsetFreq.Length; offset_num++)
                 {
                     if (SA.Query("IDN").Contains("N9030"))//N9030A型号频谱仪
                     {
-                        SA.Write("设置Mark频率Hz", "1", PowerPara.PNosieOffsetFreq[offset_num].ToString()); SA.Query("OPC");           
-                        double temp = Math.Round(double.Parse(SA.Query("读Mark相位噪声值", "1")), 2); 
+                        SA.Write("设置Mark频率Hz", "1", PowerPara.PNosieOffsetFreq[offset_num].ToString()); SA.Query("OPC");
+                        Data.PhaseNoise[point, offset_num] = Math.Round(double.Parse(SA.Query("读Mark相位噪声值", "1")), 2); 
                     }
                     else
                     {
@@ -146,11 +154,21 @@ namespace Tps_LQ_Transmitter.models
                         SA.Write("相位噪声测试模式", "1"); SA.Query("OPC");
                      
                      
-                        SA.Write("设置DELT频率", "1", PowerPara.PNosieOffsetFreq[offset_num].ToString()); SA.Query("OPC");
+                        SA.Write("设置DELT频率", "1", (PowerPara.PNosieOffsetFreq[offset_num]/1000).ToString()); SA.Query("OPC");
                         Data.PhaseNoise[point, offset_num] = Math.Round(double.Parse(SA.Query("读相位噪声", "1")), 2);
                        
 
-                    }                    
+                    }
+                    PhaseNoisePrint.Test_name = parameters.Channel + "-" + (PowerPara.PNosieOffsetFreq[offset_num]/1000).ToString()+"Khz-相位噪声(dBc/Hz)-" + CenterFreq.ToString() + "MHz";
+                    if (Data.PhaseNoise[point, offset_num] <= PhaseNoisePrint.Upper)
+                    {
+                        PhaseNoisePrint.Result = "是";
+                    }
+                    else
+                    {
+                        PhaseNoisePrint.Result = "否";
+                    }
+                    tps.TestTableAddCell(PhaseNoisePrint.Test_name, "/", PhaseNoisePrint.Upper.ToString(), Data.PhaseNoise[point, offset_num].ToString(), PhaseNoisePrint.Result);
                     PhaseNoiseOffsetVal[offset_num] = Data.PhaseNoise[point, offset_num];
                 }
                 if (PowerPara.PNosieOffsetFreq.Length > 1)//计算相位噪声中的最大值
@@ -162,7 +180,7 @@ namespace Tps_LQ_Transmitter.models
                     PhaseNoiseMaxOffsetVal = PhaseNoiseOffsetVal[0];
                 }
                 PhaseNoisePrint.Test_name = parameters.Channel + "-相位噪声(dBc/Hz)-" + CenterFreq.ToString() + "MHz";
-                PhaseNoisePrint.Upper = PowerPara.PhaseNoiseUpper;
+               
                 PhaseNoisePrint.TestVal = PhaseNoiseMaxOffsetVal;
                 if (PhaseNoisePrint.TestVal <= PhaseNoisePrint.Upper)
                 {
@@ -182,8 +200,12 @@ namespace Tps_LQ_Transmitter.models
                 //    //tps.SetTestTableCellValue(point + 15, 15, PhaseNoisePrint.Result, PhaseNoisePrint.TestVal);
                 //}
             }
-           
-            SA.Write("关闭所有MARK"); SA.Query("OPC");
+            if(SA.Query("IDN").Contains("N9030"))
+            {
+                SA.Write("SetSAMode"); SA.Query("OPC");
+                SA.Write("SingleOrCont", "1"); SA.Query("OPC");
+            }
+            
             return true;
         }
 
@@ -253,6 +275,11 @@ namespace Tps_LQ_Transmitter.models
             /// 设置参考电平
             /// </summary>
             public string REF { set; get; }
+            
+            /// <summary>
+            /// 设置相位噪声模式参考电平
+            /// </summary>
+            public string PNoiseREF { set; get; }
             /// <summary>
             /// 设置RBW
             /// </summary>

+ 41 - 22
tps/TpsLabStudio/models/PowerAndFreqStability.cs

@@ -23,7 +23,7 @@ namespace Tps_LQ_Transmitter.models
         /// </summary>
         public override bool Run(TestNode parameters)
         {
-            double y_value, x_value;
+            double y_value, x_value, TestFreq;
 
             Random random = new Random();
 
@@ -60,6 +60,7 @@ namespace Tps_LQ_Transmitter.models
             PowerPara.FrequencyNumber = parameters.Parameters.GetParameter<int>("频点数量");
             PowerPara.StopFrequency = parameters.Parameters.GetParameter<double>("终止频率");
             PowerPara.SPAN = parameters.Parameters.GetParameter<string>("扫描带宽(SPAN)");
+            PowerPara.CHSPAN = parameters.Parameters.GetParameter<string>("通道扫描带宽(SPAN)");
             PowerPara.ACHBand = parameters.Parameters.GetParameter<string>("通道带宽");
             PowerPara.REF = parameters.Parameters.GetParameter<string>("参考电平(REF)");
             PowerPara.RBW = parameters.Parameters.GetParameter<string>("分辨率带宽(RBW)");
@@ -83,22 +84,8 @@ namespace Tps_LQ_Transmitter.models
             }
             if(true)//需具备仪器
             {
-                SA.Write("仪器复位"); SA.Query("OPC");
-                SA.Write("SPAN", PowerPara.SPAN); SA.Query("OPC");
-                SA.Write("RBW", PowerPara.RBW); SA.Query("OPC");
-                SA.Write("VBW", PowerPara.VBW); SA.Query("OPC");
-                SA.Write("REF", PowerPara.REF); SA.Query("OPC");
-                if (SA.Query("IDN").Contains("N9030"))
-                {
-                    SA.Write("设置通道SPAN", PowerPara.SPAN); SA.Query("OPC");
-                }
-
-                SA.Write("设置通道带宽", PowerPara.ACHBand); SA.Query("OPC");
-
-               
-
+                SA.Write("仪器复位"); SA.Query("OPC");                           
                 
-                SA.Write("SingleOrCont", "0"); SA.Query("OPC");
 
             }
             if ((PowerPara.FrequencyNumber != 0) && (PowerPara.FrequencyNumber != 1) && (PowerPara.StepFrequency == 0))
@@ -139,23 +126,51 @@ namespace Tps_LQ_Transmitter.models
                 if (true)//需具备仪器
                 {
                     //控制
-                  //  SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
+                //    SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
                     Thread.Sleep(PowerPara.ControlDelay);//单位ms
 
-
+                    SA.Write("设置频谱测试模式"); SA.Query("OPC");
+                    
+                    SA.Write("SPAN", PowerPara.SPAN); SA.Query("OPC");
+                    SA.Write("RBW", PowerPara.RBW); SA.Query("OPC");
+                    SA.Write("VBW", PowerPara.VBW); SA.Query("OPC");
+                    SA.Write("REF", PowerPara.REF); SA.Query("OPC");
                     SA.Write("CENTER", CenterFreq.ToString()); SA.Query("OPC");
+                    SA.Write("SingleOrCont", "1"); SA.Query("OPC");
+                    Thread.Sleep(500);
+                    SA.Write("MARK打开", "1"); SA.Query("OPC");
+                    SA.Write("打开MARK精度", "1"); SA.Query("OPC");
+                    SA.Write("PEAK", "1"); SA.Query("OPC");
+                    SA.Write("SingleOrCont", "0"); SA.Query("OPC");
                     SA.Write("单次扫描"); SA.Query("OPC");
-               
+                    string i=SA.Query("读MARK高精度频率", "1");
+                    TestFreq = double.Parse(SA.Query("读MARK高精度频率", "1")); SA.Query("OPC"); ;
                     
+
                     SA.Write("设置通道功率模式"); SA.Query("OPC");
+                    SA.Write("SingleOrCont", "0"); SA.Query("OPC");
+                    if (SA.Query("IDN").Contains("N9030"))
+                    {
+                        SA.Write("设置通道SPAN", PowerPara.CHSPAN); SA.Query("OPC");
+                        SA.Write("设置通道REF", PowerPara.REF); SA.Query("OPC");
+                    }
+                    else 
+                    {
+                        SA.Write("SPAN", PowerPara.CHSPAN); SA.Query("OPC");
+                        SA.Write("REF", PowerPara.REF); SA.Query("OPC");
+
+                    }
+
+                    SA.Write("设置通道带宽", PowerPara.ACHBand); SA.Query("OPC");
+                    SA.Write("单次扫描"); SA.Query("OPC");
                     if (SA.Query("IDN").Contains("N9030"))
                     {
                         PsaPeakValue_CHTracedata(SA, out y_value, out x_value, true);
-                        y_value = double.Parse(SA.Query("读通道功率").Split(',')[0]);
+                        y_value = double.Parse(SA.Query("读通道功率"));
                     }
                     else
                     {
-                        PsaPeakValue_CHTracedata(SA, out y_value, out x_value, true);
+                        PsaPeakValue_Tracedata(SA, out y_value, out x_value, true);
                         y_value = double.Parse(SA.Query("读通道功率"));
 
                     }  
@@ -182,7 +197,7 @@ namespace Tps_LQ_Transmitter.models
                 FreqPrint.Test_name = parameters.Channel + "-频率测试(MHz)-" + CenterFreq.ToString() + "MHz";
                 FreqPrint.Lower =Math.Round(0-((PowerPara.FreqAccuracyUpper * CenterFreq) + CenterFreq),2);
                 FreqPrint.Upper = Math.Round((PowerPara.FreqAccuracyUpper * CenterFreq) + CenterFreq,2);
-                FreqPrint.TestVal = Math.Round(x_value / 1000000, 3);//实测频率
+                FreqPrint.TestVal = Math.Round(TestFreq / 1000000, 3);//实测频率
                 //FreqPrint.TestVal = random.Next(-600, 6000) / 100.0 + CenterFreq;//随机数
                 if ((FreqPrint.TestVal >= FreqPrint.Lower) && (FreqPrint.TestVal <= FreqPrint.Upper))
                 {
@@ -377,6 +392,10 @@ namespace Tps_LQ_Transmitter.models
             /// </summary>
             public string SPAN { set; get; }
             /// <summary>
+            ///设置频谱仪的通道SPAN
+            /// </summary>
+            public string CHSPAN { set; get; }
+            /// <summary>
             /// 通道带宽
             /// </summary>
             public string ACHBand { set; get; }

+ 175 - 13
tps/TpsLabStudio/models/PowerTest-PowerMeter.cs

@@ -1,7 +1,9 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using Tps_LQ_Transmitter.com;
 
@@ -23,15 +25,30 @@ namespace Tps_LQ_Transmitter.models
             //获取仪器
             DataType PowerPrint = new DataType();//功率(w)
      
-            var PowerMeter = this.tps.GetDeviceModel("E4418A");
+            var PowerMeter = this.tps.GetDeviceModel("GPIB0::13::INSTR");
             if (PowerMeter == null)
             {
                 ShowMessage(MsgType.Error, string.Format("仪器不齐全,{0}/{1}无法运行", parameters.Channel, parameters.Name));
                 return false;
             }
+            Thread.Sleep(1000);//让产品稳定
+            TransmitterSerialPort SerialClient = new TransmitterSerialPort();
             ConfigParameter PowerPara = new ConfigParameter();
-            PowerPara.ComPort = parameters.Parameters.GetParameter<string>("串口");
-            PowerPara.OutLoss = parameters.Parameters.GetParameter<double>("输出损耗");
+
+            MatchComPara CfigComParas = new MatchComPara();
+            CfigComParas = LoadModulationWorkBook();
+            if (CfigComParas == null)
+            {
+                return false;
+            }
+
+            byte FourthByte=0x00;
+            string ComPort = CfigComParas.GetComPort("1");
+            string i = CfigComParas.GetThirdByte("1");
+            i = CfigComParas.GetFourthByte("1");
+           
+            byte ThridByte = Convert.ToByte(CfigComParas.GetThirdByte("1"),16);
+            byte ThridByte1 = Convert.ToByte(CfigComParas.GetFourthByte("1"),16);
             PowerPara.StartFrequency = parameters.Parameters.GetParameter<double>("起始频率");
             PowerPara.StepFrequency = parameters.Parameters.GetParameter<double>("频率步进");
             PowerPara.FrequencyNumber = parameters.Parameters.GetParameter<int>("频点数量");
@@ -46,13 +63,13 @@ namespace Tps_LQ_Transmitter.models
             PowerPara.FreqAccuracyUpper = parameters.Parameters.GetParameter<double>("频率稳定度上限");
             PowerPara.PowerSumLower = parameters.Parameters.GetParameter<double>("两路功率总和下限");
             PowerPara.PowerFlatnessUpper = parameters.Parameters.GetParameter<double>("功率不平度上限");
-            if ((PowerPara.StartFrequency == 0) || ((PowerPara.StepFrequency == 0) && (PowerPara.FrequencyNumber == 0)) || (PowerPara.StopFrequency == 0)
-                || (PowerPara.SPAN == null) || (PowerPara.REF == null) || (PowerPara.RBW == null) || (PowerPara.VBW == null) || (PowerPara.PowerLower == 0)
-                || (PowerPara.PowerUpper == 0) || (PowerPara.FreqAccuracyUpper == 0) || (PowerPara.PowerSumLower == 0) || (PowerPara.PowerFlatnessUpper == 0))
-            {
-                ShowMessage(MsgType.Error, string.Format("配置文件中频率参数为空,{0}/{1}无法运行", parameters.Channel, parameters.Name));
-                return false;
-            }
+            //if ((PowerPara.StartFrequency == 0) || ((PowerPara.StepFrequency == 0) && (PowerPara.FrequencyNumber == 0)) || (PowerPara.StopFrequency == 0)
+            //    || (PowerPara.SPAN == null) || (PowerPara.REF == null) || (PowerPara.RBW == null) || (PowerPara.VBW == null) || (PowerPara.PowerLower == 0)
+            //    || (PowerPara.PowerUpper == 0) || (PowerPara.FreqAccuracyUpper == 0) || (PowerPara.PowerSumLower == 0) || (PowerPara.PowerFlatnessUpper == 0))
+            //{
+            //    ShowMessage(MsgType.Error, string.Format("配置文件中频率参数为空,{0}/{1}无法运行", parameters.Channel, parameters.Name));
+            //    return false;
+            //}
             if (PowerPara.ControlDelay == 0)
             {
                 PowerPara.ControlDelay = 10;
@@ -76,6 +93,10 @@ namespace Tps_LQ_Transmitter.models
                 {
                     break;
                 }
+
+                FourthByte = byte.Parse(CfigComParas.GetFourthByte((point+1).ToString()));
+                //SerialClient.DUT_Transmitter_Ctrol(ComPort, ThridByte, FourthByte);
+                Thread.Sleep(PowerPara.ControlDelay);//单位ms
                 string aa = PowerMeter.Query("Fetch测量功率", "1");
                 PowerPrint.Test_name = parameters.Channel + "-功率测试(W)-" + CenterFreq.ToString() + "MHz";
                 PowerPrint.Lower = PowerPara.PowerLower;
@@ -93,12 +114,153 @@ namespace Tps_LQ_Transmitter.models
             }
             return true;
         }
-        public class ConfigParameter
+
+        public MatchComPara LoadModulationWorkBook()
+        {
+            MatchComPara pars = new MatchComPara();
+            string FileName = Path.Combine(Bundle.bundle.BundleDir, "config\\串口控制.xlsx");
+            if (!File.Exists(FileName))
+            {
+                ShowMessage(MsgType.Error, "找不到串口控制.xlsx");
+                return null;
+            }
+
+            Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
+            workbook.LoadFromFile(FileName);
+
+
+            //获取第一个工作表sheet1
+            Spire.Xls.Worksheet sheet = workbook.Worksheets[0];
+            int num = 0;
+            int blankRows = 0;
+
+            while (num++ < 200)
+            {
+                //索引从1开始
+                string col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
+                col1 = col1.Trim();
+                if (string.IsNullOrEmpty(col1))
+                {
+                    blankRows++;
+                    if (blankRows > 5)
+                    {
+                        //连续5个空行以上则退出
+                        break;
+                    }
+                }
+                else
+                {
+                    blankRows = 0;
+                }
+                if (col1.Equals("序号"))
+                {
+                    List<ComMatchParameter> ModulationTable = ReadParameters(sheet, num);
+
+                    foreach (var item in ModulationTable)
+                    {
+                        if (pars.ModulaParameters.ContainsKey(item.SN))
+                        {
+                            ShowMessage(MsgType.Error, string.Format("串口控制:{0} 存在同名参数:{1},无法重复添加参数", sheet.Name, item.SN));
+                            continue;
+                        }
+                        pars.ModulaParameters.Add(item.SN, item);
+                    }
+                }
+            }
+            return pars;
+        }
+        public class MatchComPara
+        {
+            public Dictionary<string, ComMatchParameter> ModulaParameters;
+            public MatchComPara()
+            {
+                ModulaParameters = new Dictionary<string, ComMatchParameter>();
+            }
+            public string GetComPort(string name)
+            {
+                if (string.IsNullOrEmpty(name))
+                    return null;
+
+                if (this.ModulaParameters.ContainsKey(name) == false)
+                    return null;
+
+                string val1 = this.ModulaParameters[name].ComPort.Trim();
+                return val1;
+            }
+            public string GetThirdByte(string name)
+            {             
+               string val1 = this.ModulaParameters[name].ThirdByte.Trim();
+                return val1;
+            }
+            public string GetFourthByte(string name)
+            {
+                string val2 = this.ModulaParameters[name].FourthByte.Trim();
+                return val2;
+            }
+        }
+        List<ComMatchParameter> ReadParameters(Spire.Xls.Worksheet sheet, int rowIndex)
         {
+            List<ComMatchParameter> ModulationTable = new List<ComMatchParameter>();
+            string col1 = sheet.Range[rowIndex, 1].Value2 != null ? sheet.Range[rowIndex, 1].Value2.ToString() : "";
+            string col2 = sheet.Range[rowIndex, 2].Value2 != null ? sheet.Range[rowIndex, 2].Value2.ToString() : "";
+            string col3 = sheet.Range[rowIndex, 3].Value2 != null ? sheet.Range[rowIndex, 3].Value2.ToString() : "";
+            string col4 = sheet.Range[rowIndex, 4].Value2 != null ? sheet.Range[rowIndex, 4].Value2.ToString() : "";
+
+            if (!(col1 == "序号" && col2 == "串口号" && col3 == "第3个字节" && col4 == "第4个字节"))
+            {
+                ShowMessage(MsgType.Error, "'串口控制'行首标题位置和格式不正确");
+                return ModulationTable;
+            }
+
+            int num = rowIndex;
+            //默认最多30行
+            while (num++ < rowIndex + 100)
+            {
+                col1 = sheet.Range[num, 1].Value2 != null ? sheet.Range[num, 1].Value2.ToString() : "";
+                col2 = sheet.Range[num, 2].Value2 != null ? sheet.Range[num, 2].Value2.ToString() : "";
+                col3 = sheet.Range[num, 3].Value2 != null ? sheet.Range[num, 3].Value2.ToString() : "";
+                col4 = sheet.Range[num, 4].Value2 != null ? sheet.Range[num, 4].Value2.ToString() : "";
+                if (string.IsNullOrEmpty(col1) )
+                {
+                    break;
+                }
+                ComMatchParameter ObjModulation = new ComMatchParameter();
+                ObjModulation.SN = col1;
+                ObjModulation.ComPort = col2;
+                ObjModulation.ThirdByte = col3;
+                ObjModulation.FourthByte = col4;
+
+                ModulationTable.Add(ObjModulation);
+            }
+            return ModulationTable;
+        }
+        /// <summary>
+        /// 串口控制4个对应项
+        /// </summary>
+        public class ComMatchParameter
+        {
+
+            /// <summary>
+            /// 序号
+            /// </summary>
+            public string SN { get; set; }
+            /// <summary>
+            /// 调制指数(mf)
+            /// </summary>
+            public string ComPort { get; set; }
+            /// <summary>
+            /// 第3个字节
+            /// </summary>
+            public string ThirdByte { get; set; }
             /// <summary>
-            /// 串口
+            /// 第4个字节
             /// </summary>
-            public string ComPort { set; get; }
+            public string FourthByte { get; set; }
+
+
+        }
+        public class ConfigParameter
+        {
             /// <summary>
             /// 输出损耗
             /// </summary>

+ 1 - 0
tps/TpsLabStudio/models/VoltAndCurrent.cs

@@ -101,6 +101,7 @@ namespace Tps_LQ_Transmitter.models
                 {
                     break;
                 }
+                Thread.Sleep(1000);
                 //控制
          //       SerialClient.DUT_Transmitter_Ctrol(PowerPara.ComPort, Convert.ToByte(point + 1));
                 Thread.Sleep(PowerPara.ControlDelay);//单位ms