下面是我现在的代码
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比较,但是感觉应该不是这么简单粗暴地
可以通過讀取萬用表的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;
}
分辨率与量程之间的关系取决于万用表的型号和制造商。请参阅万用表的说明书,了解该关系。