连接来自 windows 的自定义 PCI
Interfacing with a custom PCI from windows
我正在尝试编写一个程序,可以从一堆传感器中读取数据,在 windows 计算机上做出决定,然后写入一些执行器(例如阀门)。这一切都已在现有系统和程序上完成,但我们想做一些不同的事情,因此我们从头开始在 windows 计算机上使用一个新程序。
传感器等的读取和写入是通过制造商定制的PCI完成的,基本上我不确定如何读取和写入板上的寄存器。我用 Raspberry Pis 和其他微控制器+PCB 做过项目,但这个有点新。如果有帮助,原始程序是用 c++ 编写的。
任何有关直接与来自 windows 系统的 PCI 接口的一般或特定信息都很好,如果这些信息还不够,请告诉我,我会提供更多信息。谢谢!
您需要通过制造商提供的驱动程序访问硬件。许多制造商没有记录如何通过最终用户代码直接访问他们的驱动程序。相反,他们提供了一个 API 库(在 SDK 中),用户可以调用该库来操作 PCI 设备。
如果您 post 对您正在使用的设备进行 link 会有所帮助 - 这样我们就可以查看与它捆绑的内容并帮助您决定它是否值得努力。如果制造商是non-cooperative,这可能是一件比较难做的事情。如果不使用 PCI 卡,您可能会更幸运,例如获取一些 EtherCAT I/O 模块,使用开源 EtherCAT 主库,并通过简单的网卡将您的应用程序连接到 I/O 模块。这将更易于支持,并且非常耐过时,因为 EtherCAT I/O 不会很快消失,如果您使用 Qt 或 wxWidgets 等便携式应用程序开发框架,您的代码可以完全移植。然后,您可以 运行 在 PC、mac 和 Raspberry PI 上使用它 - 它会做同样的事情并且看起来几乎相同。这不是白日梦——我维护了一些代码,几乎可以做到这一点,这是一种可行的方法。只要您的要求是“软”实时的,它就一定会起作用。如果您需要 hard-realtime,您需要通过实时扩展将自己限制在 Linux,并从实时线程访问网络接口(使用 ECAT 主库)。它仍然比使用支持 EtherCAT Master 的 PLC 更 developer-friendly - 那些通常在幕后使用 CODESYS,这基本上只是在传播痛苦:(
根据我的经验,支持一些自定义 motion-control PCI 卡等最终会变成 semi-rewarding,因为您经常需要进行一些逆向工程,这是一个很好的挑战,但它一个 dead-end 最终。如果该卡没有 API/SDK 可用,那么最好假设制造商正在倾销它,当它失去支持或成为 unobtainium 时,您的所有工作都将白费。最好依赖可行的行业标准,以及拥有多个供应商的接口。 EtherCAT I/O 几乎是一毛钱。你可以使用例如(可免费下载)TwinCAT 探索 I/O 模块的功能和原型内容,然后使用 ECAT 主库在您自己的代码中实现它,可能在需要时借助 WireShark。
我正在尝试编写一个程序,可以从一堆传感器中读取数据,在 windows 计算机上做出决定,然后写入一些执行器(例如阀门)。这一切都已在现有系统和程序上完成,但我们想做一些不同的事情,因此我们从头开始在 windows 计算机上使用一个新程序。
传感器等的读取和写入是通过制造商定制的PCI完成的,基本上我不确定如何读取和写入板上的寄存器。我用 Raspberry Pis 和其他微控制器+PCB 做过项目,但这个有点新。如果有帮助,原始程序是用 c++ 编写的。
任何有关直接与来自 windows 系统的 PCI 接口的一般或特定信息都很好,如果这些信息还不够,请告诉我,我会提供更多信息。谢谢!
您需要通过制造商提供的驱动程序访问硬件。许多制造商没有记录如何通过最终用户代码直接访问他们的驱动程序。相反,他们提供了一个 API 库(在 SDK 中),用户可以调用该库来操作 PCI 设备。
如果您 post 对您正在使用的设备进行 link 会有所帮助 - 这样我们就可以查看与它捆绑的内容并帮助您决定它是否值得努力。如果制造商是non-cooperative,这可能是一件比较难做的事情。如果不使用 PCI 卡,您可能会更幸运,例如获取一些 EtherCAT I/O 模块,使用开源 EtherCAT 主库,并通过简单的网卡将您的应用程序连接到 I/O 模块。这将更易于支持,并且非常耐过时,因为 EtherCAT I/O 不会很快消失,如果您使用 Qt 或 wxWidgets 等便携式应用程序开发框架,您的代码可以完全移植。然后,您可以 运行 在 PC、mac 和 Raspberry PI 上使用它 - 它会做同样的事情并且看起来几乎相同。这不是白日梦——我维护了一些代码,几乎可以做到这一点,这是一种可行的方法。只要您的要求是“软”实时的,它就一定会起作用。如果您需要 hard-realtime,您需要通过实时扩展将自己限制在 Linux,并从实时线程访问网络接口(使用 ECAT 主库)。它仍然比使用支持 EtherCAT Master 的 PLC 更 developer-friendly - 那些通常在幕后使用 CODESYS,这基本上只是在传播痛苦:(
根据我的经验,支持一些自定义 motion-control PCI 卡等最终会变成 semi-rewarding,因为您经常需要进行一些逆向工程,这是一个很好的挑战,但它一个 dead-end 最终。如果该卡没有 API/SDK 可用,那么最好假设制造商正在倾销它,当它失去支持或成为 unobtainium 时,您的所有工作都将白费。最好依赖可行的行业标准,以及拥有多个供应商的接口。 EtherCAT I/O 几乎是一毛钱。你可以使用例如(可免费下载)TwinCAT 探索 I/O 模块的功能和原型内容,然后使用 ECAT 主库在您自己的代码中实现它,可能在需要时借助 WireShark。