今天为大家分享一下基于 PCI-9014 运动控制卡的应用开发。我们从板卡硬件架构讲起再了解 SDK 函数库结构最后通过位置比较器实战例程来让大家熟悉项目开发流程。PCI-9014 是一款 4 轴脉冲型运动控制卡采用 PCI 总线接口核心逻辑由 FPGA 实现支持 T 型/S 型速度曲线、点位运动、回零、位置比较器输出、编码器位置锁存等功能。适用于点胶、锁螺丝、上下料、视觉飞拍等点位控制和触发场景。01 板卡硬件架构PCI-9014 的硬件拓扑如下┌─────────────────────────────────────────────────────┐ │ PCI 总线接口 │ │ (32-bit, 33MHz, 5V/3.3V) │ └────────────────────────┬────────────────────────────┘ │ ┌────────────────────────▼────────────────────────────┐ │ Lattice XP2-17 / ProASIC3 │ │ ┌────────────┬────────────┬────────────┬────────┐ │ │ │ Pulse Gen │ Encoder │ Position │ GPIO │ │ │ │ × 4 路 │ Counter×4 │ Compare/ │ 32 位 │ │ │ │ (PUL/DIR) │ │ Latch FIFO │ │ │ │ └─────┬──────┴─────┬──────┴──────┬─────┴────┬───┘ │ └────────┼────────────┼─────────────┼──────────┼──────┘ 差分/TTL 转换 光耦隔离 DO[4] 通用 IO CN1 PUL/DIR/EA/EB EL/ORG/ALM 比较器触发 DB37/DB25关键硬件要点主控 FPGALattice XP2 系列所有运动算法在 FPGA 内部硬实时执行上位机仅负责指令下发和状态查询。对外接口CN1DB37 公头为主信号口含 4 路 PUL/PUL-/DIR/DIR- 差分脉冲输出、4 路 EA/EB 编码器输入、限位/原点/报警信号CN2DB25 母头为扩展 IO 口。板载拨码开关4 位 Board ID多卡同机时用于区分卡号0~15。DO[4] 特殊用途位置比较器使能时DO[4] 作为比较器触发脉冲输出集电极开路禁止比较器后可作普通 DO 使用。02 SDK 函数库结构SDK 目录结构如下PCI-9014/ ├── driver/ # 内核驱动KMDF 1.9 │ ├── x86/ # 32 位 .sys .inf .cat │ └── x64/ # 64 位 .sys .inf .cat ├── Library/ # 动态库 多语言绑定 │ ├── Pci9014.dll # 主库32 位 │ ├── Pci9014.h # C 接口头文件 │ ├── Pci9014.lib # MSVC 静态链接库 │ ├── pci9014.bas # VB6 函数声明 │ ├── pci9014.cs # C# 包装类 │ ├── Pci9014.vb # VB.NET 模块 │ └── x64/ # 64 位 dll/lib ├── examples/ # 范例源码 │ ├── VC6/ # VC6 MFC 对话框 命令行 demo │ ├── C#_2005/ # .NET Framework 2.0 demo │ ├── VB.NET_2005/ # VB.NET demo │ ├── VB6/ # VB6 demo │ ├── BCB6/ # Borland C Builder 6 demo │ └── Labview8.5/ # LabVIEW 8.5 VIs ├── MotionPanel/ # 出厂调试工具32/64 位 └── manual/ # 用户手册 编程手册PDF驱动基于 KMDF 1.9 框架开发支持 Windows XP/Vista/Win7/Win832 位和 64 位。64 位系统下需要驱动数字签名SDK 已提供带时间戳的签名认证。应用层通过Pci9014.dll动态库访问硬件所有范例不论使用何种语言最终均调用p9014_xxx系列函数。03 API 函数分类说明Pci9014.h共导出 30 余个函数按功能分类如下3.1 板卡管理int p9014_initial(int* pCard_count, int* pBoard_id); int p9014_close(); int p9014_get_version(int card_no, uint* pApi_ver, uint* pDriver_ver, uint* pLogic_ver); int p9014_get_revision(int card_no, uint* pLogic_revision);p9014_initial在所有操作之前调用一次返回发现的卡数和每张卡的 Board ID。p9014_get_version返回 API 版本、驱动版本和逻辑版本p9014_get_revision返回逻辑修改号。3.2 脉冲模式配置int p9014_set_pls_outmode(int axis, int pls_outmode); int p9014_set_pls_iptmode(int axis, int pls_iptmode);pls_outmode设置脉冲输出方式PUL/DIR 正逻辑0、PUL/DIR 反逻辑1、CW/CCW 双脉冲2、正交 AB 相3。pls_iptmode设置编码器输入计数模式支持 1×/2×/4× 倍频。3.3 速度曲线配置int p9014_set_t_profile(int axis, double start_vel, // 启动速度 (PPS) double max_vel, // 最大速度 (PPS) double acc, // 加速度 (PPS/S) double dec); // 减速度 (PPS/S) int p9014_set_s_profile(int axis, double start_vel, double max_vel, double acc, double dec, double jerk_percent); // S 曲线加加速度比例 0~100T 型曲线为梯形加减速适用于大多数点位场景S 型曲线在加减速段引入加加速度约束运动更平滑对机械冲击更小。加速度上限为 30,000,000 PPS/S。3.4 运动指令int p9014_pmove(int axis, int dist, int dist_mode, // 0 增量, 1 绝对 int vel_mode); // 0 低速无加减速, 1 高速无加减速, 2 高速有加减速 int p9014_vmove(int axis, int plus_dir, // 0 负向, 1 正向 int vel_mode); int p9014_stop(int axis, int emg_stop); // 0 减速停止, 1 急停vel_mode一般使用 2高速有加减速mode 0 和 1 适用于特殊调试场景。3.5 回零int p9014_home_config(int axis, int mode, int org_level, int ez_level); int p9014_home_move(int axis, int plus_dir);mode0 为仅找 ORG 信号2 为 ORG EZ编码器 Z 相。org_level和ez_level分别配置 ORG 和 EZ 的有效电平0 低电平有效1 高电平有效。回零策略先以回零速度查找 ORG 信号找到后反向查找第一个 Z 相信号mode2或直接停在 ORG 位置mode0。3.6 位置计数器int p9014_set_pos(int axis, int cntr_no, int pos); int p9014_get_pos(int axis, int cntr_no, int* pPos);cntr_no0 为命令位置寄存器1 为编码器反馈位置寄存器。位置值为有符号 32 位整数内部计数器实际为 28 位。3.7 通用 IOint p9014_set_do(int card_no, uint data); int p9014_set_do_bit(int card_no, uint bit_no, uint data); int p9014_get_do(int card_no, uint* pData); int p9014_get_di(int card_no, uint* pData); int p9014_get_di_bit(int card_no, uint bit_no, uint* pData);16 路数字输出16 路数字输入支持整体读写和位操作。3.8 状态查询int p9014_get_io_status(int axis, uint* pStatus); int p9014_get_motion_status(int axis, uint* pStatus); int p9014_get_current_speed(int axis, double* pSpeed);io_status返回限位/ORG/ALM 信号状态的位掩码motion_status返回运动状态标志。一般以 10ms 周期轮询motion_status检测到停止标志后执行下一步逻辑。3.9 错误码定义#define RC_SUCCESS 0 #define RC_INVALID_PARAM 1 #define RC_DEVICE_DETACH 5 #define RC_DEVICE_ALREADY_OPEN 12 #define RC_AXIS_BUSY 202 #define RC_FAIL_SEARCH_HOME 204 #define RC_EL_ACTIVE 205返回码 0 为成功1~12 为一般错误参数/资源类200 以上为运动控制相关错误。04 位置比较器功能详解位置比较器是 PCI-9014 的核心特色功能之一。其原理是FPGA 内部将当前命令位置或编码器反馈位置与用户预存的一组参考位置值进行硬件比较当条件满足时输出一个触发脉冲。整个过程由硬件完成无需 CPU 参与触发抖动可控制在 50µs 以内。4.1 典型应用场景视觉飞拍轴运动到指定位置时触发相机拍照激光飞行打标在运动过程中按位置触发激光器出光喷胶/点胶在轨迹关键点精确开闭胶阀印刷在指定位置精确喷墨4.2 API 函数int p9014_comp_enable(int card_no, int enable, // 1 使能, 0 禁止 int active_level, // 输出脉冲有效电平 int ref_source, // 0 命令位置, 1 编码器反馈位置 int length); // 输出脉冲宽度 int p9014_comp_get_fifoStatus(int card_no, uint* stat); int p9014_comp_add_ref(int card_no, int PosRef); int p9014_comp_get_curRef(int card_no, int* PosRef); int p9014_comp_clr_fifo(int card_no); int p9014_comp_get_matchCount(int card_no, uint* Count); int p9014_comp_clr_matchCount(int card_no);4.3 使用注意事项FIFO 深度硬件 FIFO 深度 1024位置比较器使用其中 512 个参考点。参考位置必须单调正向运动时参考位置递增写入负向运动时递减写入。比较器顺序比较方向不匹配时 FIFO 不会命中。位置范围计数器为 28 位有符号参考位置范围 -134,217,728 ~ 134,217,727。仅 X 轴支持位置比较器功能仅在 0 轴X 轴可用。DO[4] 占用比较器使能时 DO[4] 作为触发脉冲输出禁止后恢复普通 DO 功能。硬件版本要求逻辑版本 ≥ 0x0113 且 Revision ≥ 0x10老版本硬件返回 RC_FEATURE_NOT_SUPPORTED (500)。4.4 FIFO 状态查询p9014_comp_get_fifoStatus返回的stat位定义位定义bit 0emptyFIFO 数据为 0 时置 1bit 1almost emptyFIFO 数据 128 时置 1bit 2almost fullFIFO 数据 896 时置 1bit 3fullFIFO 数据 1024 时置 1bit[31:16]FIFO 中剩余数据个数4.5 完整例程以下为位置比较器最小调用框架完整源码参见 SDKexamples/VC6/PosComp/目录#include pci9014.h #include pos_latch.h int main() { int count, board_id[16], card_no, axis 0; int rc; unsigned int ver[4], rev; uint fifo_sts, match_count; // 1. 初始化板卡 rc p9014_initial(count, board_id); if (rc || count 1) return -1; card_no board_id[0]; // 2. 版本检查 p9014_get_version(card_no, ver, ver1, ver2); p9014_get_revision(card_no, rev); if (ver[1] 0x0113 || rev 0x10) { printf(硬件版本不支持位置比较器\n); return -1; } // 3. 配置运动参数 p9014_set_t_profile(axis, 1000, 1e5, 1e6, 1e6); p9014_set_pls_iptmode(axis, 0); // 4. 清空 FIFO使能比较器 p9014_comp_clr_fifo(card_no); p9014_comp_clr_matchCount(card_no); p9014_comp_enable(card_no, 1, 0, 0, 100000); // 5. 写入参考位置必须单调递增 int ref_pos[10] {1000, 5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000}; for (int i 0; i 10; i) { p9014_comp_add_ref(card_no, ref_pos[i]); } // 6. 启动运动 p9014_pmove(axis, 50000, 0, 2); // 7. 等待运动完成 uint status; do { p9014_get_motion_status(axis, status); Sleep(10); } while (status); // 8. 检查触发次数 p9014_comp_get_matchCount(card_no, match_count); printf(成功触发 %u 次\n, match_count); // 9. 关闭比较器释放资源 p9014_comp_enable(card_no, 0, 0, 0, 0); p9014_comp_clr_fifo(card_no); p9014_close(); return 0; }05 Y 轴编码器位置锁存在 Revision ≥ 0x11 的硬件上PCI-9014 还支持X 轴位置比较器触发时锁存 Y 轴编码器位置的功能。典型应用为X 轴运动到拍照点 → 比较器触发相机 → 触发瞬间 Y 轴编码器位置被锁存到硬件 FIFO供上位机读取。API 定义在pos_latch.h中int lt_init(int card_no, int enable); int lt_clr_fifo(int card_no); int lt_get_fifo_status(int card_no, unsigned int* pFifo_status); int lt_get_latch_count(int card_no, unsigned int* pCount); int lt_get_data(int card_no, int* pData);锁存 FIFO 深度 512lt_init内部会检查 Revision 版本号不满足时返回 RC_FEATURE_NOT_SUPPORTED (500)。06 多卡同机使用API 版本 0x01152015-11-10起单系统最多支持 16 张 PCI-9014。使用时需保证API 版本 ≥ 0x0115每张卡的 Board ID 拨码互不相同0~15驱动版本与 API 版本匹配int count, board_id[16]; p9014_initial(count, board_id); printf(扫描到 %d 张卡ID 分别是, count); for (int i 0; i count; i) printf(%d , board_id[i]);轴号计算方式axis card_no * 4 本卡内轴号(0~3)。07 多语言开发支持SDK 提供 6 种开发环境的范例程序范例路径适用场景VC6 MFCexamples/VC6/GuiDemo1/32 位桌面 GUI 应用VC6 控制台examples/VC6/PosComp/后台服务、算法验证VC6 64 位examples/VC6/MotionPanel-X64(VS2008)/64 位 Win7/8 桌面C# 2005examples/C#_2005/McDemo10/.NET Framework 2.0 应用VB.NET 2005examples/VB.NET_2005/快速上位机开发LabVIEW 8.5examples/Labview8.5/测试测量、产线应用C# 开发时直接使用 SDK 提供的pci9014.cs包装类所有 API 已通过 P/Invoke 封装using Pci9014; int count, board_id 0; int[] ids new int[16]; int rc CPci9014.p9014_initial(ref count, ids); if (rc 0 count 0) { board_id ids[0]; CPci9014.p9014_set_t_profile(0, 1000, 100000, 1e6, 1e6); CPci9014.p9014_pmove(0, 50000, 0, 2); }08 开发注意事项驱动安装Win7 64-bit 及以上系统需要驱动数字签名。右键.inf文件选择安装在数字签名警告中选择始终信任。SDK 驱动已包含带时间戳的数字签名证书不会因过期导致无法安装。限位电平配置p9014_set_el_level函数用于设置限位开关有效电平需逻辑版本 ≥ 0x0110。低版本硬件上调用此函数不会报错但配置不生效。报警输入p9014_set_alarm配置驱动器报警输入伺服驱动器报警信号通常为常闭类型无报警时导通active_level应设为 0。p9014_set_error_stop_mode可设置报警触发时的停止方式减速停止或急停。位置比较器触发信号接线DO[4] 为集电极开路输出驱动能力约 20mA。若相机触发信号需要 24V 电平需串联 4.7kΩ 以上上拉电阻到 24V 电源若仅需 5V 电平可使用几百 kΩ 上拉电阻。详见 SDKexamples/VC6/PosComp/注意.txt。编码器供电CN1 接口提供编码器供电引脚。若驱动器编码器输出为集电极开路类型必须通过 CN1 的 VCC 引脚单独供电5V 或 24V差分输出类型无需额外供电。64 位系统调试工具32 位 MotionPanel 可在 64 位系统上运行但底层需使用 64 位 dll。SDK 提供MotionPanel/x64/MotionPanel64.exe供 64 位系统使用。09 选型参考应用需求推荐型号1~4 轴点位控制 视觉触发PCI-9014连续轨迹插补直线/圆弧/样条支持插补的高端控制卡系列多卡同机 16 轴EtherCAT 总线方案纯步进、低成本E 系列如 E450关于升立德升立德科技专注于运动控制技术研究和通用运动控制软硬件产品的研发主要产品包括 PCI/PCIe 系列运动控制卡、独立式运动控制器、EtherCAT 总线运动控制方案等广泛应用于点胶、激光加工、数控机床、包装机械、检测设备等工业自动化领域。相关资料SDK 开发包、用户手册、编程手册可通过官网技术支持页面获取。