// dmm.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "nidmm.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "windows.h"
#include <process.h>
bool StopMeas = false;
typedef void(_stdcall*CallBackFn)(int);
CallBackFn CSharp_INT = NULL;
HANDLE r_thread=NULL;
DWORD exitCode1 = 0;
HWND r_hWnd;
DWORD r_ThreadId = 0;
#define MAXPTSTOREAD 10
/*- Variables definition --------------------------------------------------*/
ViChar resourceName[256] = "PXI1Slot3";
ViSession vi = VI_NULL;
ViBoolean idQuery = VI_TRUE;
ViBoolean reset = VI_TRUE;
ViStatus error = VI_SUCCESS;
ViBoolean isOverRange = VI_FALSE;
ViInt32 measurementType = NIDMM_VAL_DC_VOLTS;
ViReal64 powerlineFreq = NIDMM_VAL_60_HERTZ;
ViReal64 range =10.00;
ViReal64 coercedRange =10.00;
ViReal64 resolution = 5.5;
ViInt32 numOfMeas = 0;
ViReal64 measurements[MAXPTSTOREAD];
ViReal64 average = 0.00;
ViReal64 sum_meas = 0.00;
ViReal64 reading = 0.000;//电阻
ViInt32 numPointsRead;
ViInt32 i = 0;
ViInt32 ptsAvailable = 0;
ViInt16 acqDone = 0;
//bool Read_Resistence(ViInt32 _measurementType,ViReal64 _range,ViReal64 _resolution);
bool CheckErrFunc(ViStatus Func)
{
if(Func<0)
return false;
else
return true;
}
extern "C" _declspec(dllexport) int Init_DMM(CallBackFn cbfn)
{
CSharp_INT=cbfn;
return niDMM_init(resourceName, idQuery, reset, &vi);
}
DWORD WINAPI ThreadFun(PVOID lp)
{
StopMeas = false;
while(!StopMeas)
{
switch((int)measurementType)
{
case IVIDMM_VAL_DC_VOLTS:
ptsAvailable = 0;
if(!CheckErrFunc(niDMM_ReadStatus(vi, &ptsAvailable, &acqDone)))
break;
ptsAvailable = ptsAvailable < MAXPTSTOREAD ? ptsAvailable : MAXPTSTOREAD;
if (ptsAvailable)
{
if(!CheckErrFunc(niDMM_FetchMultiPoint(vi, NIDMM_VAL_TIME_LIMIT_AUTO, ptsAvailable,
measurements, &numPointsRead)))
break;
sum_meas=0;
for (i=0; i<numPointsRead; i++)
sum_meas = sum_meas + measurements[i];
average = sum_meas/numPointsRead;
niDMM_GetAttributeViReal64 (vi, "", NIDMM_ATTR_AUTO_RANGE_VALUE, &coercedRange);
//use the data here!
CSharp_INT(coercedRange);
if(numOfMeas >= 10000*MAXPTSTOREAD)
StopMeas = VI_TRUE;
Sleep(100);
}
break;
case IVIDMM_VAL_AC_VOLTS:
if(!CheckErrFunc(niDMM_Read (vi, NIDMM_VAL_TIME_LIMIT_AUTO, &reading)))
break;
CSharp_INT(reading);
break;
case IVIDMM_VAL_2_WIRE_RES:
case IVIDMM_VAL_4_WIRE_RES:
if(!CheckErrFunc(niDMM_Read(vi,NIDMM_VAL_TIME_LIMIT_AUTO,&reading)))
break;
if(!CheckErrFunc(niDMM_IsOverRange(vi, reading, &isOverRange)))
break;
if(!(reading>0)&&(range<100))
{
range=10*range;
if(!CheckErrFunc(niDMM_ConfigureMeasurementDigits(vi, measurementType,range, resolution)))
return false;
}
else
CSharp_INT(reading);
break;
}
}
return 0;
}
extern "C" _declspec(dllexport) int Read_DC_Volt(ViInt32 _measurementType,ViReal64 _range,ViReal64 _resolution)
{
_measurementType=NIDMM_VAL_DC_VOLTS;
measurementType=NIDMM_VAL_DC_VOLTS;
/*- Configure Measurement -------------------------------------------*/
if(!CheckErrFunc(niDMM_ConfigureMeasurementDigits (vi, _measurementType, _range, _resolution)));
// return 2;
/*- Configure a Multipoint Acquisition ------------------------------*/
if(!CheckErrFunc(niDMM_ConfigureMultiPoint (vi, 1, 0, NIDMM_VAL_IMMEDIATE, 0.0)));
// return 3;
/*- Configure Powerline frequency -----------------------------------*/
if(!CheckErrFunc(niDMM_ConfigurePowerLineFrequency (vi, powerlineFreq)));
// return 4;
/*- Start or Initiate the Acquisition -------------------------------*/
if(!CheckErrFunc(niDMM_Initiate (vi)));
// return 5;
if(r_thread==NULL)
{
r_thread=CreateThread(NULL,0,ThreadFun,(LPVOID)_measurementType,0,NULL);
return true;
}
else
{
}
}
}
extern "C" _declspec(dllexport) int Read_AC_Volt(ViInt32 _measurementType,ViReal64 _range,ViReal64 _resolution)
{
_measurementType = IVIDMM_VAL_AC_VOLTS;
measurementType=IVIDMM_VAL_AC_VOLTS;
if(!CheckErrFunc(niDMM_ConfigureMeasurementDigits(vi, _measurementType, _range, _resolution)));
// return 2;
if(!CheckErrFunc(niDMM_ConfigureACBandwidth (vi, 20, 25000)));
// return 3;
if(r_thread==NULL)
{
r_thread= CreateThread(NULL,0,ThreadFun,(LPVOID)_measurementType,0,NULL);
return true;
}
else
{
}
}
extern "C" _declspec(dllexport) int Read_Resistence(ViInt32 _measurementType,ViReal64 _range,ViReal64 _resolution)
{
if(_measurementType ==5)
_measurementType =IVIDMM_VAL_2_WIRE_RES;
else if (_measurementType ==101)
_measurementType =IVIDMM_VAL_4_WIRE_RES;
if(!CheckErrFunc(niDMM_ConfigurePowerLineFrequency (vi, powerlineFreq)))
return 3;
if(!CheckErrFunc(niDMM_ConfigureMeasurementDigits(vi, _measurementType, _range, _resolution)))
return 4;
if(r_thread==NULL)
{
r_thread=CreateThread(NULL,0,ThreadFun,(LPVOID)_measurementType,0,NULL);
break;
}
else
{
}
}
return 1;
}
extern "C" _declspec(dllexport) int Close_DMM()
{
if(!StopMeas)
StopMeas=true;
if(r_thread!=NULL)
CloseHandle(r_thread);
if(vi)
niDMM_close(vi);
return 1;
}
局外狗
- 粉丝: 26
- 资源: 1万+
会员权益专享
最新资源
- New bing帮数据猿写了一篇Python调用GPT3.5 模型api的文章,我要失业了
- Small Cell Forum 5G NR PHY FAPI Inrtoduction
- 课程设计、毕业设计以及练手的优质python小项目-飞机大战(彩图版).rar
- 前端开发vue框架实现的后台管理系统
- Freemake Video Converter Gold 4.1.13.153
- 自制表单.rar
- PDF Shaper Professional 13.0
- Stellar Toolkit for Data Recovery 11.0.0.0
- 应用了GPT4的New Bing,能力超乎想象
- Master PDF Editor 5.9.40
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


