【问题标题】:Accessing PCI-7250 NuDAQ in .NET在 .NET 中访问 PCI-7250 NuDAQ
【发布时间】:2025-12-20 14:00:17
【问题描述】:

我想使用 .NET 的 PCI-7250 NuDAQ 卡打开继电器。

我知道VB中要开启的代码是:

card = Register_Card(PCI_7250, 0)

v = DO_WritePort(card, 0, &O17)

然后关闭:

v = DO_WritePort(card, 0, &O0)

我需要将此迁移到 C# 代码。谁能帮我解决这个问题?

【问题讨论】:

    标签: c# .net pci pci-bus


    【解决方案1】:

    如果你想走读/写 I/O 端口的路,你需要能够写它们。 .net 框架(至少是 windows 上的微软)不直接支持这一点。 对于并行端口的读/写,我在 InOut32 库 (link) 方面取得了巨大成功。这意味着您必须使用 PInvoke 才能使其工作。对我来说,这段代码有效:

        [DllImport("inpoutx64.dll", EntryPoint = "Out32")]
        private static extern void OutputImpl(int adress, int value);
    
        [DllImport("inpoutx64.dll", EntryPoint = "Inp32")]
        private static extern int InputImpl(int adress);
    
        public static void Output(int adress, int value)
        {
            // I use this wrapper to set debug breakpoints so I can see what's going on
            OutputImpl(adress, value);
        }
    
        public static int Input(int adress)
        {
            int ret = InputImpl(adress);
            return ret;
        }
    

    请注意,如果您运行的是 32 位应用程序,则需要引用“InOut32.dll”库。我不确定您需要使用的特定端口,但我想您可以在互联网上找到它们,或者从您的 PCI 卡配置的 IO 地址范围中尝试一些(请参阅设备管理器中的设备属性)。

    【讨论】:

    • 谢谢!这很有帮助。我想知道您能否告诉我使用命令 v = DO_WritePort(card, 0, &O17) 会打开哪些引脚。命令 v = DO_WritePort(card, 0, &O0) 会发生什么。我现在正在开发的程序采用整数输入。示例:如果我输入 15,则引脚 1-4 将打开。我似乎无法破译这 2 个命令会影响哪些引脚。谢谢!
    • 请注意十进制 15 == 0x0f(C 十六进制表示法)== &H0f(vb 十六进制表示法)== &O17(vb 八进制表示法)。所以我想写 &O17 会打开最低的 4 个数据引脚。我查看了制造商网站,他们似乎没有提供低级规范,但我无法想象它会比写入 IO 端口来打开或关闭继电器更复杂。你只需要确保在你写的寄存器中设置正确的位。
    • 我在 google 上多看了一眼。有一本手册 (web-tronics.com/pdf/LPCIe-7250_manual.pdf) 详细说明了操作。查看第 30 页(pdf 中的第 38 页),它详细说明了 IO 范围的操作(实际上每个继电器只是翻转了一点),如果您安装了更多选件板,也是如此。它还详细说明了您可以读回哪些数据,以及不同位的含义。
    • 真的很棒。我没有费心搜索 *,因为我认为我的 PCI-7520 硬件太晦涩难懂。相反,我辞职去寻找 C# 中的通用输入/输出支持。然后不知何故我到了这里;不仅这里提到的 InOut32 库可以立即轻松地工作,而且 OP 实际上也有我同样不起眼的中继卡。
    • @GlennSlayden:兄弟,你能分享一下你是如何做到的吗?我在同一条船上,想学习如何通过 C# 实现这一目标