📄 fl45.c
字号:
ViUInt32 oldTimeout; ViBoolean needToRestoreTimeout = VI_FALSE; static IviStringValueTable errorTable = { {0, "Self-test passed." }, {1, "A/D self-test failed." }, {2, "A/D dead." }, {4, "EEPROM instrument configuration bad." }, {8, "EEPROM calibration data bad." }, {16, "Display dead." }, {32, "Display self-test failed." }, {64, "ROM test failed." }, {128, "External RAM test failed." }, {256, "Internal test failed." }, {VI_NULL, VI_NULL} }; checkErr( Ivi_LockSession (vi, VI_NULL)); if (testResult == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 2, "Null address for Test Result"); if (testMessage == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 3, "Null address for Test Message"); if (!Ivi_Simulating(vi)) /* call only when locked */ { ViString testString; io = Ivi_IOSession(vi); /* call only when locked */ checkErr( Ivi_SetNeedToCheckStatus (vi, VI_TRUE)); viCheckErr( viPrintf (io, "*TST?")); viCheckErr( viGetAttribute (io, VI_ATTR_TMO_VALUE, &oldTimeout)); viCheckErr( viSetAttribute (io, VI_ATTR_TMO_VALUE, 60000)); /* 1 minute */ needToRestoreTimeout = VI_TRUE; viCheckErr( viScanf (io, "%hd", testResult)); viCheckErr( Ivi_GetStringFromTable (errorTable, *testResult, &testString)); strcpy (testMessage, testString); } else if (Ivi_UseSpecificSimulation(vi)) /* call only when locked */ { /* Simulate Self Test */ *testResult = 0; strcpy (testMessage, "No error."); } checkErr( FL45_CheckStatus (vi));Error: if (needToRestoreTimeout) { /* Restore the original timeout */ viSetAttribute (io, VI_ATTR_TMO_VALUE, oldTimeout); } Ivi_UnlockSession(vi, VI_NULL); return error;}/***************************************************************************** * Function: FL45_error_query * Purpose: This function queries the instrument error queue and returns * the result. *****************************************************************************/ViStatus _VI_FUNC FL45_error_query (ViSession vi, ViInt32 *errCode, ViChar errMessage[]){ ViStatus error = VI_SUCCESS; checkErr( Ivi_LockSession (vi, VI_NULL)); if (errCode == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 2, "Null address for Error Code"); if (errMessage == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 3, "Null address for Error Message"); if (!Ivi_Simulating(vi)) /* call only when locked */ { ViSession io = Ivi_IOSession(vi); /* call only when locked */ ViInt32 numErrors; checkErr( Ivi_SetNeedToCheckStatus (vi, VI_TRUE)); /* Check the error queue size to see if there is an error. If so get the error. If not, then perform a FL45_CheckStatusCallback to see if there is an error residing in the instrument. */ checkErr( Ivi_InstrSpecificErrorQueueSize (vi, &numErrors)); if (numErrors > 0) checkErr( Ivi_DequeueInstrSpecificError (vi, errCode, errMessage)); else { checkErr( FL45_CheckStatusCallback (vi, io)); checkErr( Ivi_InstrSpecificErrorQueueSize (vi, &numErrors)); if (numErrors > 0) checkErr( Ivi_DequeueInstrSpecificError (vi, errCode, errMessage)); else { *errCode = 0; Fmt (errMessage, "No error."); } } } else if (Ivi_UseSpecificSimulation(vi)) /* call only when locked */ { /* Simulate Error Query */ *errCode = 0; strcpy (errMessage, "No error."); }Error: Ivi_UnlockSession(vi, VI_NULL); return error;}/***************************************************************************** * Function: FL45_error_message * Purpose: This function translates the error codes returned by this * instrument driver into user-readable strings. * * Note: The caller can pass VI_NULL for the vi parameter. This * is usefull if one of the init functions fail. *****************************************************************************/ViStatus _VI_FUNC FL45_error_message (ViSession vi, ViStatus errorCode, ViChar errorMessage[256]){ ViStatus error = VI_SUCCESS; static IviStringValueTable errorTable = { IVIDMM_ERROR_CODES_AND_MSGS, {VI_NULL, VI_NULL} }; if (vi) Ivi_LockSession(vi, VI_NULL); /* all VISA and IVI error codes are handled as well as codes in the table */ if (errorMessage == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 3, "Null address for Error Message"); checkErr( Ivi_GetSpecificDriverStatusDesc (vi, errorCode, errorMessage, errorTable));Error: if (vi) Ivi_UnlockSession(vi, VI_NULL); return error;}/***************************************************************************** * Function: FL45_revision_query * Purpose: This function returns the driver and instrument revisions. *****************************************************************************/ViStatus _VI_FUNC FL45_revision_query (ViSession vi, ViChar driverRev[], ViChar instrRev[]){ ViChar rdBuffer[BUFFER_SIZE]; ViStatus error = VI_SUCCESS; checkErr( Ivi_LockSession (vi, VI_NULL)); if (driverRev == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 2, "Null address for Driver Revision"); if (instrRev == VI_NULL) viCheckParm( IVI_ERROR_INVALID_PARAMETER, 3, "Null address for Instrument Revision"); checkErr( Ivi_GetAttributeViString (vi, VI_NULL, IVI_ATTR_DRIVER_REVISION, 0, -1, driverRev)); if (!Ivi_Simulating(vi)) /* call only when locked */ { ViSession io = Ivi_IOSession(vi); /* call only when locked */ checkErr( Ivi_SetNeedToCheckStatus (vi, VI_TRUE)); viCheckErr( viPrintf (io, "*IDN?")); viCheckErr( viScanf (io, "%*[^,],%*[^,],%*[^,],%256[^\n]", instrRev)); } else if (Ivi_UseSpecificSimulation(vi)) /* call only when locked */ { /* Simulate Instrument Revision Query */ strcpy (instrRev, "No revision information available while simulating."); } checkErr( FL45_CheckStatus (vi));Error: Ivi_UnlockSession(vi, VI_NULL); return error;}/***************************************************************************** * Function: FL45_Configure * Purpose: Configures the common attributes of the DMM. These attributes * are FL45_ATTR_FUNCTION, * FL45_ATTR_RANGE, * FL45_ATTR_RESOLUTION, * FL45_ATTR_AC_MIN_FREQ, and * FL45_ATTR_AC_MAX_FREQ. *****************************************************************************/ViStatus _VI_FUNC FL45_Configure (ViSession vi, ViInt32 measFunction, ViReal64 range, ViReal64 resolution, ViReal64 acMinFreq, ViReal64 acMaxFreq){ ViStatus error = VI_SUCCESS; checkErr( Ivi_LockSession (vi, VI_NULL)); /* Set attributes: */ viCheckParm( Ivi_SetAttributeViInt32 (vi, VI_NULL, FL45_ATTR_FUNCTION, 0, measFunction), 2, "Measurement Function"); /* For the FL45, the resolution needs to be set before the range since the range is dependent on the resolution. */ viCheckParm( Ivi_SetAttributeViReal64 (vi, VI_NULL, FL45_ATTR_RESOLUTION, 0, resolution), 4, "Resolution"); viCheckParm( Ivi_SetAttributeViReal64 (vi, VI_NULL, FL45_ATTR_RANGE, 0, range), 3, "Range"); /* Set the AC min/max frequencies only if configuring an AC measurement */ switch (measFunction) { case FL45_VAL_AC_VOLTS: case FL45_VAL_AC_CURRENT: case FL45_VAL_AC_PLUS_DC_VOLTS: case FL45_VAL_AC_PLUS_DC_CURRENT: viCheckParm( Ivi_SetAttributeViReal64 (vi, VI_NULL, FL45_ATTR_AC_MIN_FREQ, 0, acMinFreq), 5, "AC Min Frequency"); viCheckParm( Ivi_SetAttributeViReal64 (vi, VI_NULL, FL45_ATTR_AC_MAX_FREQ, 0, acMaxFreq), 6, "AC Max Frequency"); break; } checkErr( FL45_CheckStatus (vi)); Error: Ivi_UnlockSession(vi, VI_NULL); return error;}/***************************************************************************** * Function: FL45_ConfigureWithSecondary * Purpose: Configures the common attributes of the DMM. These attributes * are FL45_ATTR_FUNCTION, * FL45_ATTR_RANGE, * FL45_ATTR_SECONDARY_FUNCTION * FL45_ATTR_RESOLUTION, * FL45_ATTR_AC_MIN_FREQ, and * FL45_ATTR_AC_MAX_FREQ. *****************************************************************************/ViStatus _VI_FUNC FL45_ConfigureWithSecondary (ViSession vi, ViInt32 measFunction, ViReal64 range, ViInt32 secondMeasFunction, ViReal64 resolution, ViReal64 acMinFreq, ViReal64 acMaxFreq){ ViStatus error = VI_SUCCESS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -