使用Labwindows/CVI程控万用表时自动切换量程

Labwindows/CVI来控制万用表,怎么利用scpi指令完成量程的自动转换让测得值显示在界面上,也就是当测量值为0.05v时界面显示50mv,测量值为3v时界面显示3v,此外分辨率和量程的关系是怎样的
目前是使用VOLT:DC:RANG:AUTO ON只能让万用表的面板呈现自动切换量程的效果,而在界面上仍然是以v为单位显示着
我希望随着测量值的改变,界面的数值会呈现最精确的效果

下面是我现在的代码
double measuredVoltage;
char range[15]="0";

switch (event)
{
    case EVENT_COMMIT:
          
viPrintf (viDefaultRM, "VOLT:DC:RANG:AUTO ON\n");

// viQueryf (viDefaultRM, "VOLT:DC:RANG?\n", "%s", &range);
// range[14]=0;

viPrintf (viDefaultRM, "MEASure:VOLTage:DC?\n");
viScanf (viDefaultRM, "%lf", &measuredVoltage);
// printf("%s",range);
  
      SetCtrlVal (sinPANEL, sinPANEL_TOGGLEBUTTON, 1);      

   if(measuredVoltage <1)        
   {
       measuredVoltage *= 1000;         
   SetCtrlVal (sinPANEL, sinPANEL_TOGGLEBUTTON, 0);  
   
   } 
 
   SetCtrlVal (sinPANEL, sinPANEL_NUMERIC_2, measuredVoltage);     
    按照一个回答写的,这个range应该是查询万用表现在的量程,然后再跟给定的数值进行比较,但是实际操作过程中我发现在输入电压改变时屏幕上的示值并不能随着大于1和小于1 做v和mv的改变

我现在是用示值直接和1比较,但是感觉应该不是这么简单粗暴地

img


这是我的界面图,最终是想让显示值和单位随着输入电压改变而自动改变,小于1的时候是mv,大于1 的时候是v

可以通過讀取萬用表的SCPI命令和量程標識來實現界面上顯示最精確數值的功能。

1.啟用自動量程功能:設置“VOLT:DC:RANG:AUTO ON”,以便萬用表根據測量值自動選擇適當的量程。
2.讀取當前量程標識:使用“VOLT:DC:RANG?”來獲取當前的量程標識。
3.讀取測量值:使用“MEAS:VOLT:DC?”來獲取當前的測量值。
4.轉換顯示值:根據當前的量程標識和測量值,您可以計算出顯示在界面上的最精確值,並顯示在界面上。

關於分辨率和量程之間的關係,分辨率是指萬用表能夠分辨出的最小量程值,而量程是指萬用表測量的最大范圍。通常,分辨率與量程成正比,萬用表量程越大,分辨率就越低。因此,在選擇合適的量程時,必須考慮到分辨率的限制。

根据您的问题描述,通过labwindows/cvi控制万用表来切换量程,如果想直接通过scpi指令来实现好像没有直接的指令,你可以尝试通过串口函数或者量程切换回调函数SignalCallback中写代码实现。

您可以在Labwindows/CVI代码中通过读取万用表的"Measurement:Value?"命令返回的数据和"Measurement:Unit?"命令返回的单位,计算得到该测量值的精确值。如果要在界面上以不同的单位显示,您可以根据读取的单位和测量值进行单位转换并在界面上显示。
使用SCPI指令读取万用表的测量值并不会自动获取当前量程。因此,您需要使用SCPI指令询问当前量程,然后根据该信息将测量值转换为相应的单位。为了询问当前量程,您可以使用指令"MEASure:VOLTage:DC?"。示例代码如下:

int main (void)
{
    int panelHandle;
    int instrSession;
    int error = 0;
    double measuredVoltage;
    char range[15];
    
    // Open instrument session
    instrSession = viOpen (defaultRM, "GPIB::23", VI_NULL, VI_NULL);
    if (instrSession == VI_NULL)
    {
        printf("Cannot open instrument session.\n");
        return -1;
    }
    
    // Turn on automatic range selection
    viPrintf (instrSession, "VOLT:DC:RANG:AUTO ON\n");
    
    // Read the current voltage range
    viQueryf (instrSession, "VOLT:DC:RANG?\n", "%s", &range);
    
    // Read the voltage measurement
    viPrintf (instrSession, "MEASure:VOLTage:DC?\n");
    viScanf (instrSession, "%lf", &measuredVoltage);
    
    // Convert the measurement to the correct unit
    if (strcmp(range, "50E-3") == 0)
        measuredVoltage *= 1000;
    
    // Display the result on the front panel
    panelHandle = LoadPanel (0, "MyPanel.uir", PANEL);
    DisplayPanel (panelHandle);
    SetCtrlVal (panelHandle, PANEL_VOLTAGE, measuredVoltage);
    
    // Close the instrument session
    viClose (instrSession);
    return 0;
}

分辨率与量程之间的关系取决于万用表的型号和制造商。请参阅万用表的说明书,了解该关系。