前几天实验室做关于电机驱动的实验,用C#写的控制程序
程序如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using Sys; //添加新的命名空间,PCI8620的命名空间 11 namespace WindowsFormsApplication3 12 { 13 public partial class Form1 : Form 14 { 15 IntPtr hDevice; 16 short DA; 17 double a; 18 byte[] ret = new byte[16]; // 19 public Form1() 20 { 21 InitializeComponent(); 22 } 23 24 private void button1_Click(object sender, EventArgs e) 25 { 26 hDevice = PCI8620.PCI8620_CreateDevice(0); 27 button1.Enabled = false; //button1和button2的互锁 28 button2.Enabled = true; //button1和button2的互锁 29 timer1.Enabled = true; 30 } 31 32 private void button2_Click(object sender, EventArgs e) 33 { 34 PCI8620.PCI8620_ReleaseDevice(hDevice); 35 button1.Enabled = true; 36 button2.Enabled = false; 37 } 38 39 private void button3_Click(object sender, EventArgs e) 40 { 41 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0); 42 } 43 44 private void button4_Click(object sender, EventArgs e) 45 { 46 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, 2048, 0); 47 } 48 49 private void textBox1_TextChanged(object sender, EventArgs e) 50 { 51 a = Convert.ToDouble(textBox1.Text); 52 DA = (short)(a / 20.00 * 4096 + 2048.00); 53 } 54 55 private void timer1_Tick(object sender, EventArgs e) 56 { 57 PCI8620.PCI8620_GetDeviceDI(hDevice, ret); 58 if(ret[7]==0) //当电机驱动的直线行程模块到达左端的时候,有传感器把DA采集信号反馈到程序中,程序作出判断变向向右运动 59 { 60 a = Math.Abs(a); 61 DA = (short)(a / 20.00 * 4096 + 2048.00); 62 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0); //0x04在PCI8620中代表-10——10v的电压 63 } 64 if(ret[9]==0) //同上,这是行程模模块到达右端的时候 65 { 66 a = -Math.Abs(a); 67 DA = (short)(a / 20.00 * 4096 + 2048.00); 68 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0); 69 } 70 } 71 } 72 }
把PCI8620.cs添加到程序中
打开PCI8620板卡后程序才会取得对电机的控制指令,关闭后不再控制电机
在这里输入电压应该在-10-10之间,在程序中定义了0x04,,
PCI8620.cs程序如下:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices ; namespace Sys { public partial class PCI8620 { //#################### AD硬件参数PCI8620_PARA_AD定义 ##################### // 用于AD采样的实际硬件参数 public struct PCI8620_PARA_AD { public Int32 ADMode; // AD模式选择(连续/分组方式) public Int32 FirstChannel; // 首通道[0,15] public Int32 LastChannel; // 末通道[0,15],要求末通道必须大于或等于首通道 public Int32 Frequency; // 采集频率,单位为Hz, [31, 250000] public Int32 GroupInterval; // 分组时的组间间隔(单位:微秒)[1, 419430] public Int32 LoopsOfGroup; // 组内循环次数[1, 65535] public Int32 Gains; // 增益设置 public Int32 InputRange; // 模拟量输入量程范围 public Int32 TriggerMode; // 触发模式选择 public Int32 TriggerSource; // 触发源选择 public Int32 TrigLevelVolt; // 触发电平(0~10000mV) public Int32 TriggerType; // 触发类型 public Int32 TriggerDir; // 触发方向选择(正向/负向触发) public Int32 ClockSource; // 时钟源选择(内/外时钟源) public Int32 bClockOutput; // 允许时钟输出 public Int32 GroundingMode; // 接地模式 } //*********************************************************** // AD硬件参数PCI8620_PARA_AD中的ADMode所使用工作模式选项 public const Int32 PCI8620_ADMODE_SEQUENCE = 0x00; // 连续采样 public const Int32 PCI8620_ADMODE_GROUP = 0x01; // 分组采样 //*********************************************************** // AD硬件参数PCI8620_PARA_AD中的InputRange模拟量输入范围所使用的选项 public const Int32 PCI8620_INPUT_N10000_P10000mV= 0x00; // ±10000mV public const Int32 PCI8620_INPUT_N5000_P5000mV = 0x01; // ±5000mV public const Int32 PCI8620_INPUT_N2500_P2500mV = 0x02; // ±2500mV public const Int32 PCI8620_INPUT_0_P10000mV = 0x03; // 0~10000mV //*********************************************************** // AD参数PCI8620_PARA_AD中的Gains使用的硬件增益选项 public const Int32 PCI8620_GAINS_1MULT = 0x00; // 1倍增益 public const Int32 PCI8620_GAINS_2MULT = 0x01; // 2倍增益 public const Int32 PCI8620_GAINS_4MULT = 0x02; // 4倍增益 public const Int32 PCI8620_GAINS_8MULT = 0x03; // 8倍增益 //*********************************************************** // AD硬件参数PCI8620_PARA_AD中的TriggerMode成员变量所使用触发模式选项 public const Int32 PCI8620_TRIGMODE_SOFT = 0x00; // 软件触发(属于内触发) public const Int32 PCI8620_TRIGMODE_POST = 0x01; // 硬件触发(属于外触发) //*********************************************************** // AD硬件参数PCI8620_PARA_AD中的TriggerSource触发源信号所使用的选项 public const Int32 PCI8620_TRIGSRC_ATR = 0x00; // 选择外部ATR作为触发源 public const Int32 PCI8620_TRIGSRC_DTR = 0x01; // 选择外部DTR作为触发源 // AD硬件参数PCI8620_PARA_AD中的TriggerType触发类型所使用的选项 public const Int32 PCI8620_TRIGTYPE_EDGE = 0x00; // 边沿触发 public const Int32 PCI8620_TRIGTYPE_PULSE = 0x01; // 电平触发 //*********************************************************** // AD硬件参数PCI8620_PARA_AD中的TriggerDir触发方向所使用的选项 public const Int32 PCI8620_TRIGDIR_NEGATIVE = 0x00; // 负向触发(低电平/下降沿触发) public const Int32 PCI8620_TRIGDIR_POSITIVE = 0x01; // 正向触发(高电平/上升沿触发) public const Int32 PCI8620_TRIGDIR_POSIT_NEGAT = 0x02; // 正负向触发(高/低电平或上升/下降沿襦发) //*********************************************************** // AD硬件参数PCI8620_PARA_AD中的ClockSource时钟源所使用的选项 public const Int32 PCI8620_CLOCKSRC_IN = 0x00; // 内部时钟 public const Int32 PCI8620_CLOCKSRC_OUT = 0x01; // 外部时钟 // AD硬件参数PCI8620_PARA_AD中的bClockOutput成员变量所使用内部和外部时钟源选项 public const Int32 PCI8620_CLOCKOUT_DISABLE = 0x00; // 禁止本卡上的自带时钟向外输出 public const Int32 PCI8620_CLOCKOUT_ENABLE = 0x01; // 允许本卡上的自带时钟向外输出 //*********************************************************** // AD参数(PCI8620_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项 public const Int32 PCI8620_GNDMODE_SE = 0x00; // 单端方式(SE:Single end) public const Int32 PCI8620_GNDMODE_DI = 0x01; // 双端方式(DI:Differential) //************************************************************************************* // 用于AD采样的实际硬件参数 public struct PCI8620_STATUS_AD { public Int32 bNotEmpty; // 板载FIFO存储器的非空标志,=TRUE非空, = FALSE 空 public Int32 bHalf; // 板载FIFO存储器的半满标志,=TRUE半满以上, = FALSE 半满以下 public Int32 bOverflow; // 板载FIFO存储器的溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出 } public const Int32 PCI8620_MAX_SEGMENT_COUNT = 64; public struct PCI8620_STATUS_DMA { public Int32 iCurSegmentID; // 当前段缓冲ID,表示DMA正在传输的缓冲区段 public Int32 bSegmentSts0; public Int32 bSegmentSts1; public Int32 bSegmentSts2; public Int32 bSegmentSts3; public Int32 bSegmentSts4; public Int32 bSegmentSts5; public Int32 bSegmentSts6; public Int32 bSegmentSts7; public Int32 bSegmentSts8; public Int32 bSegmentSts9; public Int32 bSegmentSts10; public Int32 bSegmentSts11; public Int32 bSegmentSts12; public Int32 bSegmentSts13; public Int32 bSegmentSts14; public Int32 bSegmentSts15; public Int32 bSegmentSts16; public Int32 bSegmentSts17; public Int32 bSegmentSts18; public Int32 bSegmentSts19; public Int32 bSegmentSts20; public Int32 bSegmentSts21; public Int32 bSegmentSts22; public Int32 bSegmentSts23; public Int32 bSegmentSts24; public Int32 bSegmentSts25; public Int32 bSegmentSts26; public Int32 bSegmentSts27; public Int32 bSegmentSts28; public Int32 bSegmentSts29; public Int32 bSegmentSts30; public Int32 bSegmentSts31; public Int32 bSegmentSts32; public Int32 bSegmentSts33; public Int32 bSegmentSts34; public Int32 bSegmentSts35; public Int32 bSegmentSts36; public Int32 bSegmentSts37; public Int32 bSegmentSts38; public Int32 bSegmentSts39; public Int32 bSegmentSts40; public Int32 bSegmentSts41; public Int32 bSegmentSts42; public Int32 bSegmentSts43; public Int32 bSegmentSts44; public Int32 bSegmentSts45; public Int32 bSegmentSts46; public Int32 bSegmentSts47; public Int32 bSegmentSts48; public Int32 bSegmentSts49; public Int32 bSegmentSts50; public Int32 bSegmentSts51; public Int32 bSegmentSts52; public Int32 bSegmentSts53; public Int32 bSegmentSts54; public Int32 bSegmentSts55; public Int32 bSegmentSts56; public Int32 bSegmentSts57; public Int32 bSegmentSts58; public Int32 bSegmentSts59; public Int32 bSegmentSts60; public Int32 bSegmentSts61; public Int32 bSegmentSts62; public Int32 bSegmentSts63; public Int32 bBufferOverflow; // 返回溢出状态 } //*********************************************************** // DA输出函数WriteDeviceDA的模拟量输出范围参数OutputRange所使用的选项 public const Int32 PCI8620_OUTPUT_0_P5000mV = 0x00; // 0~5000mV public const Int32 PCI8620_OUTPUT_0_P10000mV = 0x01; // 0~10000mV public const Int32 PCI8620_OUTPUT_0_P10800mV = 0x02; // 0~10800mV public const Int32 PCI8620_OUTPUT_N5000_P5000mV = 0x03; // ±5000mV public const Int32 PCI8620_OUTPUT_N10000_P10000mV = 0x04; // ±10000mV public const Int32 PCI8620_OUTPUT_N10800_P10800mV = 0x05; // ±10800mV //*********************************************************** // 用于计数器CNT的参数 // 硬件参数ControlMode控制字模式选项 public const Int32 PCI8620_GATEMODE_POSITIVE_0 = 0x00; // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数 // 计数结束产生中断:写入初值开始计数时OUT开始为0,当计数到0时OUT为1 public const Int32 PCI8620_GATEMODE_RISING_1 = 0x01; // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数 // 可编程单拍脉冲:当写入初值时OUT为1,当开始计数时OUT为0,当计数到0时OUT再次为1 public const Int32 PCI8620_GATEMODE_POSITIVE_2 = 0x02; // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数 // 频率发生器:计数期间OUT为1,计数到0后输出一个周期的0,并重新装入计数值计数 public const Int32 PCI8620_GATEMODE_POSITIVE_3 = 0x03; // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数 // 方波发生器:计数期间OUT为1,计数到0后输出一个周期的0,并重新装入计数值计数 public const Int32 PCI8620_GATEMODE_POSITIVE_4 = 0x04; // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数 // 软件触发选通:写入初值OUT为1, 计数结束OUT输出一个周期低电平信号 public const Int32 PCI8620_GATEMODE_RISING_5 = 0x05; // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数 // 硬件触发选通:写入初值OUT为1, 计数结束OUT输出一个周期低电平信号 //*********************************************************** // CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作) public const Int32 PCI8620_modeRead = 0x0000; // 只读文件方式 public const Int32 PCI8620_modeWrite = 0x0001; // 只写文件方式 public const Int32 PCI8620_modeReadWrite = 0x0002; // 既读又写文件方式 public const Int32 PCI8620_modeCreate = 0x1000; // 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0 public const Int32 PCI8620_typeText = 0x4000; // 以文本方式操作文件 //######################## 常规通用函数 ################################# // 适用于本设备的最基本操作 [DllImport("PCI8620_64.DLL")] public static extern IntPtr PCI8620_CreateDevice(Int32 DeviceID ); // 创建设备对象 [DllImport("PCI8620_64.DLL")] public static extern IntPtr PCI8620_CreateDeviceEx(Int32 DevicePhysID ); // 用物理号创建设备对象 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDeviceCount(IntPtr hDevice); // 取得设备总台数 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDeviceCurrentID(IntPtr hDevice, // 取得当前设备相应的ID号 ref Int32 DeviceLgcID, ref Int32 DevicePhysID); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ListDeviceDlg(IntPtr hDevice); // 列表系统当中的所有的该PCI设备 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ReleaseDevice(IntPtr hDevice); // 关闭设备,禁止传输,且释放资源 //####################### AD数据读取函数 ################################# // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备 // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面的初始化设备和读取 // AD数据两个函数便能轻松高效地实现高速、连续的数据采集 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_InitDeviceProAD( // 初始化设备,当返回TRUE后,设备即刻开始传输. IntPtr hDevice, // 设备对象 ref PCI8620_PARA_AD pADPara); // 硬件参数, 它仅在此函数中决定硬件状态 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_StartDeviceProAD( // 在初始化之后,启动设备 IntPtr hDevice); // 设备对象句柄 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ReadDeviceProAD_Npt( // 用非空标志读取设备上的AD数据 IntPtr hDevice, // 设备句柄 UInt32[] ADBuffer, // 将用于接受数据的用户缓冲区 UInt32 nReadSizeWords, // 读入的数据长度 ref Int32 nRetSizeWords); // 是否检测FIFO溢出状态(默认为不检测) [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDevStatusProAD( IntPtr hDevice, // 设备句柄 ref PCI8620_STATUS_AD pADStatus); // AD状态 /////////////////////////////////////////////////////////////////////// [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ReadDeviceProAD_Half( // FIFO半满读AD数据 IntPtr hDevice, // 设备句柄 UInt32[] ADBuffer, // 将用于接受数据的用户缓冲区(该区必须开辟65536个字的空间) Int32 nReadSizeWords, ref Int32 nRetSizeWords); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_StopDeviceProAD( // 在启动设备之后,暂停设备 IntPtr hDevice); // 设备对象句柄 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ReleaseDeviceProAD( // 关闭AD设备,禁止传输,且释放资源 IntPtr hDevice); // 设备句柄 //##################### AD数据读取函数(DMA方式)(上层用户函数) ########################### // AD直接内存(DMA)方式函数 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_InitDeviceDmaAD( // 初始化设备,当返回TRUE后,设备即准备就绪. IntPtr hDevice, // 设备对象,它由CreateDevice函数创建 IntPtr hDmaEvent, // DMA事件句柄,它由CreateSystemEvent创建 UInt32[,] ADBuffer, // 用户缓冲区,最好为两维数组 Int32 nReadSizeWords, // 每次DMA时,用户从指定缓冲应读取的实际长度(要小于或等于nSegmentSizeWords) Int32 nSegmentCount, // 缓冲分段的数量,取值范围为2-64 Int32 nSegmentSizeWords, // 缓冲区分段的段长(必须等于FIFO半满长度) ref PCI8620_PARA_AD pADPara); // 硬件参数, 它仅在此函数中决定硬件状态 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_StartDeviceDmaAD(IntPtr hDevice); // 设备对象句柄,它由CreateDevice函数创建 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDevStatusDmaAD( // 在AD采样过程中取得DMA的有关状态,返回值表示函数是否成功 IntPtr hDevice, // 设备句柄,它由CreateDevice函数创建 ref PCI8620_STATUS_DMA pDMAStatus); // 获得的DMA工作状态 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_SetDevStatusDmaAD( // 在AD采样过程中设置DMA的有关状态,返回值表示函数是否成功 IntPtr hDevice, // 设备句柄,它由CreateDevice函数创建 Int32 iClrBufferID); // 要清除的缓冲区ID,将其置为0 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_StopDeviceDmaAD( // 在启动设备之后,暂停设备 IntPtr hDevice); // 设备对象句柄,它由CreateDevice函数创建 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ReleaseDeviceDmaAD( // 关闭AD设备,禁止传输,且释放资源 IntPtr hDevice); // 设备句柄,它由CreateDevice函数创建 //################# AD的硬件参数操作函数 ######################## [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_SaveParaAD(IntPtr hDevice,ref PCI8620_PARA_AD pADPara); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_LoadParaAD(IntPtr hDevice, ref PCI8620_PARA_AD pADPara); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ResetParaAD(IntPtr hDevice, ref PCI8620_PARA_AD pADPara); //####################### DA数据输出函数 ################################# // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备 // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面一个函数便能轻 // 松实现高速、连续的DA数据输出 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WriteDeviceDA( // 写DA数据 IntPtr hDevice, // 设备对象句柄,它由CreateDevice函数创建 Int32 OutputRange, // 输出量程,具体定义请参考上面的常量定义部分 Int16 nDAData, // 输出的DA原始数据[0, 4095] Int32 nDAChannel); // DA输出通道[0, 3] //####################### 计数器与定时器操作函数 ######################### [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_SetDeviceCNT( // 设置计数器的初值 IntPtr hDevice, // 设备对象句柄,它由CreateDevice函数创建 UInt32 ContrlMode, // 计数器控制模式 UInt32 CNTVal, // 计数初值, COUNTER: 计数初值,TIMER:延时初始脉冲宽度(16位) UInt32 ulChannel); // 宽度初值, COUNTER: 无效, TIMER:输出脉冲宽度(16位) [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDeviceCNT( // 取得各路计数器的当前计数值 IntPtr hDevice, // 设备对象句柄,它由CreateDevice函数创建 ref UInt32 pCNTVal, // 返回计数值 UInt32 ulChannel); // 返回宽度值 //####################### 数字I/O输入输出函数 ################################# // 用户可以使用WriteRegisterULong和ReadRegisterULong等函数直接控制寄存器进行I/O // 输入输出,但使用下面两个函数更省事,它不需要您关心寄存器分配和位操作等,而只 // 需象VB等语言的属性操作那么简单地实现各开关量通道的控制。 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_SetDeviceDO( // 输出开关量状态 IntPtr hDevice, // 设备句柄 Byte[] bDOSts); // 开关状态 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDeviceDI( // 取得开关量状态 IntPtr hDevice, // 设备句柄 Byte[] bDISts); // 开关状态 //################# 内存映射寄存器直接操作及读写函数 ######################## // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的 // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDeviceBar( // 取得指定的指定设备寄存器组BAR地址 IntPtr hDevice, // 设备对象句柄,它由CreateDevice函数创建 UInt32[] pulPCIBar); // 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_GetDevVersion( // 取得指定的指定设备ID号的映射寄存器的线性基地址,返回设备总数 IntPtr hDevice, // 设备对象句柄 ref UInt32 pulFmwVersion, // 固件版本 ref UInt32 pulDriverVersion); // 驱动版本 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WriteRegisterByte( // 往设备的映射寄存器空间指定端口写入单节字数据 IntPtr hDevice, // 设备对象 UInt32 LinearAddr, // 指定映射寄存器的线性基地址 UInt32 OffsetBytes, // 相对于基地址的偏移位置 Byte Value); // 往指定地址写入单字节数据(其地址由线性基地址和偏移位置决定) [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WriteRegisterWord( // 写双字节数据(其余同上) IntPtr hDevice, UInt32 LinearAddr, UInt32 OffsetBytes, UInt16 Value); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WriteRegisterULong( // 写四节字数据(其余同上) IntPtr hDevice, UInt32 LinearAddr, UInt32 OffsetBytes, UInt32 Value); [DllImport("PCI8620_64.DLL")] public static extern Byte PCI8620_ReadRegisterByte( // 读入单字节数据(其余同上) IntPtr hDevice, UInt32 LinearAddr, UInt32 OffsetBytes); [DllImport("PCI8620_64.DLL")] public static extern UInt16 PCI8620_ReadRegisterWord( // 读入双字节数据(其余同上) IntPtr hDevice, UInt32 LinearAddr, UInt32 OffsetBytes); [DllImport("PCI8620_64.DLL")] public static extern UInt32 PCI8620_ReadRegisterULong( // 读入四字节数据(其余同上) IntPtr hDevice, UInt32 LinearAddr, UInt32 OffsetBytes); //################# I/O端口直接操作及读写函数 ######################## // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的 // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。 // 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WritePortByte(IntPtr hDevice, UInt32 nPort, Byte Value); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WritePortWord(IntPtr hDevice, UInt32 nPort, UInt16 Value); [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_WritePortULong(IntPtr hDevice, UInt32 nPort, UInt32 Value); [DllImport("PCI8620_64.DLL")] public static extern Byte PCI8620_ReadPortByte(IntPtr hDevice, UInt32 nPort); [DllImport("PCI8620_64.DLL")] public static extern UInt16 PCI8620_ReadPortWord(IntPtr hDevice, UInt32 nPort); [DllImport("PCI8620_64.DLL")] public static extern UInt32 PCI8620_ReadPortULong(IntPtr hDevice, UInt32 nPort); //############################ 线程操作函数 ################################ [DllImport("PCI8620_64.DLL")] public static extern IntPtr PCI8620_CreateSystemEvent(); // 创建内核系统事件对象 [DllImport("PCI8620_64.DLL")] public static extern Int32 PCI8620_ReleaseSystemEvent(IntPtr hEvent); // 释放内核事件对象 } }
时间: 2024-10-31 18:51:42