using System; using System.Runtime.InteropServices; namespace CommonLib.DAQ { using U16 = System.UInt16; using I16 = System.Int16; using U32 = System.UInt32; using F64 = System.Double; [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi , Pack = 1)] public struct MCMDAQ_DEVICE { /// short [MarshalAs(UnmanagedType.U2)] public short moduleType; /// short [MarshalAs(UnmanagedType.U2)] public short deviceID; /// short [MarshalAs(UnmanagedType.U2)] public short cardID; /// char[32] [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 32)] public string IP; /// char[32] [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 32)] public string MAC; /// char[32] [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 32)] public string HostName; public MCMDAQ_DEVICE(I16 i) { moduleType = 0; deviceID = i; cardID = i; IP = new string('\0',32); MAC = new string('\0', 32); ; HostName = new string('\0', 32); } } public class CardADLINK_Wrapper { public const string MCMDASK_DLL = "MDASK_Lib.dll"; /* Internal */ public enum MCMDAQ_TYPE { MCM_204 = 204 } public enum DAQ_STATUS { DATA_READY = 1, DATA_LOSE }; // 定义常量 public const int MAX_CH_NUM = 4; // 通道数 //采集卡 public const int DATA_COUNT_PERCH = 32768; // 每通道采样点数 public const int SAMPLING_RATE = 32000; // 每通道采样率为128KS/s //Virtual card // public const int SAMPLING_RATE = 10000; // 每通道采样率为10KS/s // public const int DATA_COUNT_PERCH = 10000; // 每通道采样点数 public const int MAXMCM_DEVICE = 250; public const int MAX_READ_COUNT = 1024000; public enum CARDADLINK_ERROR { NoError = 0, ErrorUnknownHostName = -1, ErrorTooManyCardRegistered = -3, ErrorCardNotRegistered = -4, ErrorInvalidAdRange = -7, ErrorTransferCountTooLarge = -15, ErrorBadCardType = -22, ErrorAccessViolationDataCopy = -301, ErrorNoModuleFound = -302, ErrorConflictWithSyncMode = -310, ErrorChanGainQueueTooLarge = -328, ErrorNullPoint = -398, ErrorInvalidTransferCount = -410, ErrorUndefinedKernelError = -420, ErrorStatusTypeNotDefine = -11001, ErrorCardIsNotDefine = -11002, ErrorIsNotSupport = -11003, ErrorAIChannelIdxOutofRange = -11004, ErrorAOChannelIdxOutofRange = -11005, ErrorDILineIdxOutofRange = -11006, ErrorDOLineIdxOutofRange = -11007, ErrorGPTCPortIdxOutofRange = -11008, ErrorOutOfDeviceMemory = -11009, ErrorOutOfAIMaxFrequency = -11010, ErrorRedundantRegister = -11011, ErrorCardIsNotRegistered = -11012, ErrorLoadingCustomLibrary = -11013, ErrorLoadingCustomFunction = -11014, ErrorBadConfigParameter = -11015, ErrorUndefinedJsonFormat = -11016, ErrorLoadingAdMsgCps = -11017, ErrorJsonArray = -11018, ErrorCardWithoutConfig = -11019, ErrorCardIsBusy = -11020, ErrorNetRequestNotFound = -11404, ErrorNetRequestTimeout = -11408 }; public const int MCM_AI_CONVSRC_INT = 0x00; /* * AD Range */ //public const int AD_B_10_V = 1; //public const int AD_B_1_25_V = 4; public enum VRange : U16 { AD_B_10_V = 1, AD_B_1_25_V = 4 }; public const int MCM_AI_PseudoDifferential = 0x000; public const int MCM_AI_Coupling_AC = 0x010; public const int MCM_AI_Coupling_DC = 0x000; public const int MCM_AI_EnableIEPE = 0x100; public const int MCM_AI_DisableIEPE = 0x000; public enum MCM_Trig_Type : U16 { MCM_AI_TRGSRC_SOFT = 0x000, MCM_AI_TRGSRC_AI0 = 0x001, MCM_AI_TRGSRC_AI1 = 0x002, MCM_AI_TRGSRC_AI2 = 0x003, MCM_AI_TRGSRC_AI3 = 0x004, MCM_AI_TRGSRC_DIO0 = 0x005, MCM_AI_TRGSRC_DIO1 = 0x006, MCM_AI_TRGSRC_DIO2 = 0x007, MCM_AI_TRGSRC_DIO3 = 0x008, }; public const int MCM_AI_TrgPositive = 0x000; public const int MCM_AI_TrgNegative = 0x010; public enum AI_CHANNEL : U16 { AI_CH_0 = 0x00, AI_CH_1 = 0x01, AI_CH_2 = 0x02, AI_CH_3 = 0x03, }; public enum DIO_CHANNEL { DIO_CH_0 = 0x00, DIO_CH_1 = 0x01, DIO_CH_2 = 0x02, DIO_CH_3 = 0x03, }; public const int MCM_AI_TRGMOD_POST = 0x00; public enum SyncMode : U16 { ASYNCH_OP = 0, SYNCH_OP = 1 } public enum V_LEVEL { LOW = 0, HIGH = 1 }; public enum BOOL : byte { DISABLE = 0, ENABLE = 1 }; #region exportfunction /*----------------------------------------------------------------------------*/ /* MCM-DASK Function prototype */ /*----------------------------------------------------------------------------*/ /* Basic Function */ //I16 __stdcall MCM_Device_Scan(U16* pModuleNum, MCMDAQ_DEVICE AvailModules[]); /// Return Type: short ///pModuleNum: unsigned short*// /// //[DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_Device_Scan")] //public static extern short MCM_Device_Scan(ref ushort pModuleNum ,MCMDAQ_DEVICE[] AvailModules); //后面的参数只能单向传递 //private static extern short MCM_Device_Scan(ref ushort pModuleNum, IntPtr AvailModules); /* [DllImportAttribute(MCMDASK_DLL, EntryPoint = "MCM_Device_Scan", CallingConvention = CallingConvention.StdCall)] public static extern short MCM_Device_Scan(ref ushort pModuleNum, [MarshalAsAttribute(UnmanagedType.LPArray)][In, Out] MCMDAQ_DEVICE[] AvailModules); */ [DllImport(MCMDASK_DLL)] public static extern short MCM_Device_Scan(out ushort pModuleNum, out MCMDAQ_DEVICE AvailModules); [DllImport(MCMDASK_DLL)] public static extern short MCM_Device_Scan(out ushort pModuleNum, [MarshalAsAttribute(UnmanagedType.LPArray)][In, Out] MCMDAQ_DEVICE[] AvailModules); public static short MCM_Register_Card(string hostName) { IntPtr ptr = Marshal.StringToHGlobalAnsi(hostName); short result = MCM_Register_Card(ptr); Marshal.FreeHGlobal(ptr); return result; } [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_Register_Card")] //public static extern short MCM_Register_Card(string hostName); public static extern short MCM_Register_Card(IntPtr hostName); /// Return Type: short ///CardNumber: unsigned short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_Release_Card")] public static extern short MCM_Release_Card(ushort CardNumber); /// Return Type: short ///CardNumber: unsigned short ///Stopped: BOOLEAN* ///AccessCnt: unsigned int* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_AsyncCheck")] public static extern short MCM_AI_AsyncCheck(ushort CardNumber, ref byte Stopped, ref uint AccessCnt); /// Return Type: short ///CardNumber: unsigned short ///AccessCnt: unsigned int* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_AsyncClear")] public static extern short MCM_AI_AsyncClear(ushort CardNumber, ref uint AccessCnt); /// Return Type: short ///CardNumber: unsigned short ///HalfReady: BOOLEAN* ///StopFlag: BOOLEAN* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_AsyncDblBufferHalfReady")] public static extern short MCM_AI_AsyncDblBufferHalfReady(ushort CardNumber, out byte HalfReady, out byte StopFlag); /// Return Type: short ///CardNumber: unsigned short ///Enable: BOOLEAN->BYTE->unsigned char [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_AsyncDblBufferMode")] public static extern short MCM_AI_AsyncDblBufferMode(ushort CardNumber, bool Enable); /// Return Type: short ///CardNumber: unsigned short ///pwBuffer: void* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_AsyncDblBufferTransfer")] public static extern short MCM_AI_AsyncDblBufferTransfer(ushort CardNumber, System.IntPtr pwBuffer); /// Return Type: short ///CardNumber: unsigned short ///op: unsigned short ///overrunFlag: unsigned short* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_AsyncDblBufferOverrun")] public static extern short MCM_AI_AsyncDblBufferOverrun(ushort CardNumber, ushort op, out ushort overrunFlag); /// Return Type: short ///CardNumber: unsigned short ///Channel: unsigned short ///AdRange: unsigned short ///Buffer: void* ///ReadCount: unsigned int ///SampleRate: double ///SyncMode: unsigned short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_ContReadChannel")] public static extern short MCM_AI_ContReadChannel(ushort CardNumber, ushort Channel, ushort AdRange, System.IntPtr Buffer, uint ReadCount, double SampleRate, ushort SyncMode); /// Return Type: short ///CardNumber: unsigned short ///NumChans: unsigned short ///Chans: unsigned short* ///AdRanges: unsigned short* ///Buffer: void* ///longReadCount: unsigned int ///SampleRate: double ///SyncMode: unsigned short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_ContReadMultiChannels" )] public static extern short MCM_AI_ContReadMultiChannels( ushort CardNumber, ushort NumChans, ushort[] Chans, ushort[] AdRanges, IntPtr Buffer, uint ReadCount, double SampleRate, ushort SyncMode); /// Return Type: short ///CardNumber: unsigned short ///mode: short ///EventType: short ///callback: unsigned int ///CallBackArg: void* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_EventCallBack")] public static extern short MCM_AI_EventCallBack(ushort CardNumber, short mode, short EventType, uint callback, System.IntPtr CallBackArg); /// Return Type: short ///CardNumber: unsigned short ///mode: short ///EventType: short ///callback: ULONG_PTR->unsigned int ///CallBackArg: void* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_EventCallBack_x64")] public static extern short MCM_AI_EventCallBack_x64(ushort CardNumber, short mode, short EventType, uint callback, System.IntPtr CallBackArg); /// Return Type: short ///CardNumber: unsigned short ///wChanCfg1: unsigned short ///wChanCfg2: unsigned short ///wChanCfg3: unsigned short ///wChanCfg4: unsigned short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_204_Chan_Config")] public static extern short MCM_AI_204_Chan_Config(ushort CardNumber, ushort wChanCfg1, ushort wChanCfg2, ushort wChanCfg3, ushort wChanCfg4); /// Return Type: short ///CardNumber: unsigned short ///wConvSrc: unsigned short ///wTrigMode: unsigned short ///wTrigCtrl: unsigned short ///wReTrigCnt: unsigned int ///dwDLY1Cnt: unsigned int ///dwDLY2Cnt: unsigned int ///dwTrgLevel: double [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_Trig_Config")] public static extern short MCM_AI_Trig_Config(ushort CardNumber, ushort wConvSrc, ushort wTrigMode, ushort wTrigCtrl, uint wReTrigCnt, uint dwDLY1Cnt, uint dwDLY2Cnt, double dwTrgLevel); /// Return Type: short ///CardNumber: unsigned short ///Channel: unsigned short ///temperature: double* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_Temperature_TReadChannel")] public static extern short MCM_Temperature_TReadChannel(ushort CardNumber, ushort Channel, ref double temperature); /// Return Type: short ///CardNumber: unsigned short ///adRange: unsigned short ///readingArray: void* ///voltageArray: double* ///count: unsigned int [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_ContVScale")] public static extern short MCM_AI_ContVScale(ushort CardNumber, CardADLINK_Wrapper.VRange adRange, System.IntPtr readingArray, double[] voltageArray, uint count); /// Return Type: short ///CardNumber: unsigned short ///readingArray: void* ///period: double* ///count: unsigned int [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_ContTachometerScale")] public static extern short MCM_AI_ContTachometerScale(ushort CardNumber, System.IntPtr readingArray, ref double period, uint count); /// Return Type: short ///CardNumber: unsigned short ///mode: short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_AI_204_Tachometer")] public static extern short MCM_AI_204_Tachometer(ushort CardNumber, short mode); /// Return Type: short ///CardNumber: unsigned short ///Port: unsigned short ///Line: unsigned short ///State: unsigned short* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_DI_ReadLine")] public static extern short MCM_DI_ReadLine(ushort CardNumber, ushort Port, ushort Line, ref ushort State); /// Return Type: short ///CardNumber: unsigned short ///Port: unsigned short ///Value: unsigned int* [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_DI_ReadPort")] public static extern short MCM_DI_ReadPort(ushort CardNumber, ushort Port, ref uint Value); /// Return Type: short ///CardNumber: unsigned short ///Port: unsigned short ///Line: unsigned short ///Value: unsigned short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_DO_WriteLine")] public static extern short MCM_DO_WriteLine(ushort CardNumber, ushort Port, ushort Line, ushort Value); /// Return Type: short ///CardNumber: unsigned short ///Port: unsigned short ///Value: unsigned int [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_DO_WritePort")] public static extern short MCM_DO_WritePort(ushort CardNumber, ushort Port, uint Value); /// Return Type: short ///wCardNumber: unsigned short [DllImportAttribute(MCMDASK_DLL, CallingConvention = CallingConvention.StdCall, EntryPoint = "MCM_204_Calibration")] public static extern short MCM_204_Calibration(ushort wCardNumber); #endregion } }