简介:固高GTS800是一款基于PCI总线的多轴运动控制卡,适用于机器人、数控机床与包装机械等对精度和实时性要求较高的工业自动化场合,主要面向设备开发者与调试工程师。光盘内的资料围绕卡片上手使用展开:包括详细的设置手册、完整的驱动与应用程序接口文档、硬件信息文件,以及大量可运行的示例工程,能帮助解决驱动安装、参数配置、二次开发等实际问题。压缩包共包含514个文件,约22.69MB,文件类型覆盖头文件、C/C++源代码、动态链接库、静态库、帮助文档与系统驱动程序等,结构清晰便于按需查找。其中示例工程针对控制卡初始化、电机运动、中断处理等典型任务进行演示,并给出多种编程语言例程;结合手册还能掌握硬件安装步骤和故障排查思路。目前已有579人学习,资料成熟度较好,推荐给需要基于固高GTS800快速搭建运动控制系统的工程技术人员。
1. 固高GTS800 光盘文件:老运动控制卡能不能跑,先过驱动这一关
搞工控的同行应该都遇到过这种场面:手里拿着一块固高 GTS800 运动控制卡,多半是二手或者从退役产线设备上拆下来的,卡是好的,但原装光盘早不知道丢哪了。
GTS800 本身是一块经典的 PCI 总线八轴运动控制卡,硬件不难找,难的是配套那一整套光盘文件:gt800.inf 驱动、gts.dll 动态库、头文件、例程和手册,缺了哪一样都开不了工。
这份资源就是把 GTS800 光盘内容整理打包好的东西,适合手里有卡没软件、或者系统重装后驱动搞不定的人。下面按我实际装卡、调轴的顺序把它讲透。
2. GTS800 光盘文件目录拆解:gt800inf、gts.dll 与例程各自管什么
2.1 gt800.inf:Windows 识别 GTS800 的唯一凭据
先把 INF 这个东西说清楚。INF 是纯文本文件,全称 Setup Information File,Windows 装驱动全靠它,它跟驱动目录里的 .sys 文件配合,告诉系统「这张卡是谁家的、叫什么、驱动文件放哪里、注册表怎么建」。gt800.inf 的骨架大概长这样,具体硬件 ID 我用了占位符:
[Version] Signature = "$WINDOWS NT$" Provider = %Googol% [Manufacturer] %Mfg% = DeviceList [Models] %GTS800% = GTS800Install, PCI\VEN_XXXX&DEV_XXXX [GTS800Install] CopyFiles = GTS800Files核心是 [Models] 段那一行:PCI\VEN_XXXX&DEV_XXXX 对应卡的硬件 ID,冒号后跟的是驱动安装段名。GTS800 插进 PCI 插槽后,系统枚举出这张卡的 Vendor ID 和 Device ID,再去驱动仓库里找匹配的 INF。gt800.inf 能做的就是让系统认出「这是固高的 GTS800」,并把对应的 .sys 驱动装上。
拿到光盘文件先别急着插卡,第一步是打开 gt800.inf 看 [Models] 段的硬件 ID 跟卡上丝印对不对得上。固高早年喜欢用一个 INF 覆盖 GTS 系列好几张卡,所以文件名可能是 gt800.inf,里面同时兼容多个型号;只要硬件 ID 匹配,驱动就能装上。反过来,设备管理器里看到未知设备,八成就是 INF 没配对。
顺便提醒:INF 是纯文本,记事本就能打开。如果打开是乱码,大概率是编码问题或文件传输损坏,趁早换一份,别在这种事上耗时间。
2.2 gts.dll 与 gts.h:二次开发全靠这套接口
驱动装好只是让系统认识了卡,真正干活的是 gts.dll。固高 GTS 系列的上层接口统一以 GT_ 开头,比如 GT_Open、GT_PrfTrap、GT_Update,全部导出在这个动态库里。光盘里的 SDK 目录一般带 gts.h(C/C++ 头文件)、gts.lib(链接库)、gts.dll(运行库),另外还有给 VB、Delphi 用的声明文件。
先看头文件再翻手册,是这系列卡最省时间的学法。gts.h 里每个函数都有注释,参数含义扫一遍,比对着 PDF 手册一页页找快得多。下面列出点位运动最常用的一组接口:
| 函数名 | 作用 | 使用注意 |
|---|---|---|
| GT_Open | 打开控制卡 | 多卡时传 0/1/2 指定卡号 |
| GT_Close | 关闭控制卡 | 程序退出前调用 |
| GT_ClrSts | 清除轴告警和状态 | 上电后一般先清一遍 |
| GT_AxisOn | 轴使能 | 运动前必须调用,否则轴不动 |
| GT_PrfTrap | 梯形加减速规划 | 点位运动最常用 |
| GT_SetVel / GT_SetAcc | 设规划速度 / 加速度 | 单位分别是脉冲/秒、脉冲/秒² |
| GT_SetPos | 设目标位置 | 配合 GT_Update 才生效 |
| GT_Update | 参数生效并启动 | 改完规划参数必须调一次 |
| GT_GetSts | 读轴状态字 | 判断运动完成、有无告警 |
| GT_GetPrfPos | 读规划位置 | 排查时看位置有没有在变 |
这套接口有个容易忽略的设计:规划参数是「改了不生效,调一下才下发」。GT_SetPos 改了目标位置,不调 GT_Update,轴永远不会动。无数新手的第一次翻车都在这,第 5 章还会专门说。还有一个通用规律:GT_ 函数返回 0 表示成功,非 0 是错误码,编程手册里有完整对照表,调试时优先看返回值和状态字,别瞎猜。
2.3 例程、工具与手册:光盘里真正值钱的部分
GTS800 光盘的目录结构大致这样:
GTS800光盘 ├─ Driver │ ├─ gt800.inf │ └─ gts800.sys ├─ SDK │ ├─ Include │ │ └─ gts.h │ ├─ Lib │ │ └─ gts.lib │ ├─ dll │ │ └─ gts.dll │ ├─ Sample │ │ ├─ VC │ │ ├─ CSharp │ │ └─ VB │ └─ Demo ├─ Tools ├─ Doc │ ├─ 用户手册.pdf │ └─ 编程手册.pdf └─ 安装说明.txtSample 目录下的 VC/CSharp/VB 例程覆盖点位运动、直线插补、IO 读写这些最常见场景。我的习惯是先编译通过点位运动那个例程,再改自己的需求——直接上手改例程,很容易分不清哪些是模板代码哪些是业务逻辑。Tools 目录下一般是固高的调试配置工具,打开后能直接看卡型号、各轴状态字、IO 电平和规划位置,排查问题比写代码打印快一个量级,这个工具一定要用熟。
Doc 下两份 PDF 属于必读。编程手册对每个 GT_ 函数的参数、返回值和错误码都有说明,那份错误码表建议直接打印出来贴工位上。安装说明.txt 虽然只有几行字,但里面往往写了驱动安装顺序和系统要求,我见过不少人跳过去,结果卡在签名问题上。
另外说一个通用规律:固高 GTS 系列里 GTS400 和 GTS800 的 SDK 接口基本一致,这份光盘文件对 GTS400 用户也有参考价值,驱动和例程能复用,只是轴数和硬件映射不同,改轴号就行。
3. 把 gt800.inf 装进 Windows:驱动安装、卡识别与验证流程
3.1 装驱动之前的三个确认
安装之前先别急着插卡,三件事确认完,能省掉后面大半的排查时间。
第一,系统位数。GTS800 是那个年代的产品,光盘里的驱动有的只有 32 位版本,在 64 位系统上装会提示签名问题或设备无法启动。如果必须在 Win10 64 位系统上用,先确认手里的 INF 和 sys 是不是配套的 64 位版本,拿不到就老老实实准备 32 位环境或老工控机。
第二,PCI 插槽。卡是标准 PCI 接口,不是 PCIe。现在很多新主板根本没有 PCI 槽,你得找带 PCI 的老工控机,或者用 PCI 转接方案。插卡时注意金手指插到底,挡板螺丝拧紧——我见过好几次「驱动装不上」的案例,最后发现是卡没插好,运输过程中松了。
第三,卡与文件的对应。看卡上丝印型号,比如 GTS800,和光盘文件里的 INF 名称、版本对照。固高早期出过硬件改版,驱动不一定互相兼容,拿 A 版驱动去装 B 版卡,大概率是黄色感叹号。这三件事确认完,再进设备管理器。
3.2 两种装法:pnputil 命令行和图形界面
图形界面是传统操作,步骤固定:设备管理器 → 找到带感叹号的未知设备 → 右键更新驱动 → 手动浏览 → 指向光盘文件的 Driver 目录。这里有个典型失误:有人把路径指到光盘根目录或 SDK 目录,系统找不到 INF 就报错,必须指到实际放着 gt800.inf 的那个文件夹。Windows 7 和 XP 上流程一样,XP 没有「更新驱动」这个叫法,是「更新驱动程序软件」,本质相同。
命令行装法适合批量或远程,Win10/Win11 用 pnputil 一次搞定:
# 以管理员身份打开命令提示符,进入驱动所在目录 cd /d D:\GTS800\Driver # -i 表示安装驱动,-a 表示添加到驱动仓库 pnputil -i -a gt800.inf执行完输出类似「已添加驱动程序包」的信息,说明 INF 被系统接受。Windows 7 上 pnputil 也能用,XP 没有这个命令,老老实实走图形界面。
提示:Win10/Win11 下如果提示驱动签名错误,属于老驱动常见情况。可以重启进入高级启动选项,临时禁用驱动强制签名后再装,装完恢复正常启动即可,不影响系统后续使用。
3.3 装完怎么验证
安装完成,打开设备管理器,正常情况是在某个分支下看到一个不带感叹号的 GTS800 设备,属性页状态显示「这个设备运行正常」。多卡系统会列出多块卡,对应 GT_Open 里的卡号 0、1、2,顺序一般以 PCI 槽位为准。
接着启动光盘 Tools 里的调试工具。工具如果能正常打开,显示卡信息和轴数,说明驱动和硬件链路通了。这时先别接电机,看一眼各轴状态字是不是全 0——不是全 0 说明有告警或者历史报警没清,第 4 章的代码里会用 GT_ClrSts,上电清状态是固定动作。
还有一个验证技巧:装完驱动后把系统重启一次,确认设备状态不丢。有些老驱动存在装完正常、重启后掉驱动的问题,重启能复现就说明驱动加载顺序有问题,回头查是不是和别的板卡抢资源。设备管理器里右键设备 → 属性 → 资源,能直接看到中断号和内存范围,这几项有冲突的话,就算驱动装着也会间歇性抽风。
4. 基于 gts.dll 写第一个点位运动:开卡、设参、让轴走起来
4.1 工程配置:把 include、lib 和 dll 安顿好
不管用 VC 还是 C#,先把 SDK 目录放到固定位置,我习惯放在 D:\GTS800\SDK 下。Visual Studio 里新建一个空控制台工程,然后配三处:
第一,项目属性 → C/C++ → 附加包含目录,填 SDK 的 Include 路径;第二,链接器 → 附加库目录,填 Lib 路径,并在「附加依赖项」里加上 gts.lib;第三,编译完把 gts.dll 复制到生成的 exe 同目录。第三点最容易忘,gts.dll 是运行时加载的,找不到它程序会直接报「无法找到动态链接库」。
C# 工程不需要 lib,直接 DllImport 引用导出函数,比如:
using System.Runtime.InteropServices; [DllImport("gts.dll")] public static extern short GT_Open(int card); [DllImport("gts.dll")] public static extern short GT_PrfTrap(short axis);同样记得把 gts.dll 放到 bin 输出目录。老光盘例程多是 VC6 或 VS2008 时代写的,新版 Visual Studio 打开会提示迁移,能编译就直接用,不能就新建工程把源码复制进去,别在工程格式上耗时间。编译目标这块,建议直接选 x86,理由在第 5 章第 5 条会说清楚。
4.2 最小点位运动代码:让轴 1 走 10000 脉冲
下面是最小可跑的 C 代码,功能是让轴 1 以梯形规划走 10000 个脉冲:
#include "gts.h" #include <stdio.h> int main(void) { short sts = 0; // 打开控制卡,0 表示第一张 GTS800 if (GT_Open(0) != 0) { printf("开卡失败,检查驱动和硬件\n"); return -1; } // 清除轴 1~8 的告警和状态,上电后务必先清一遍 GT_ClrSts(1, 8); // 使能轴 1~8 GT_AxisOn(1, 8); // 轴 1 用梯形加减速规划 GT_PrfTrap(1); // 规划速度 10000 脉冲/秒,加速度 50000 脉冲/秒² GT_SetVel(1, 10000); GT_SetAcc(1, 50000); // 目标位置 10000 个脉冲 GT_SetPos(1, 10000); // 参数下发并启动运动,这一步不能省 GT_Update(1); // 轮询状态字,0x0400 是规划忙标志 do { GT_GetSts(1, &sts); } while (sts & 0x0400); printf("轴1运动完成,实际位置:%ld\n", GT_GetPrfPos(1)); GT_Close(); return 0; }参数逐个说。GT_Open(0) 里的 0 是卡号,多卡系统传 0、1、2;GT_ClrSts(1, 8) 的 1 和 8 是轴号范围,GTS800 一共 8 个轴,只用一个轴就写 GT_ClrSts(1, 1);GT_PrfTrap(1) 把轴 1 切到梯形加减速,这是点位运动最常用的规划模式;GT_SetVel 和 GT_SetAcc 的单位分别是脉冲/秒和脉冲/秒²,不是毫米也不是转每分钟;最后 GT_Update(1) 是启动信号,所有规划参数在这一刻一次性下发。
状态字轮询用 sts & 0x0400 判断规划器忙,实际项目里更多人用中断或定时器读位置,但第一版用轮询最简单直观。注意 GT_GetPrfPos 返回 long,打印用 %ld。参数配比上有个经验值:加速度至少是速度的 3 到 5 倍,比如速度 10000,加速度 50000,这样加减速段占总行程比例小,轨迹更像「走到位」而不是「晃过去」。
4.3 脉冲当量换算:把毫米需求变成脉冲数
刚接触这套卡的人最常问:要走 10 毫米,脉冲数填多少?答案要先算脉冲当量,基本公式:
一圈脉冲数 = 编码器线数 × 4(增量编码器内部四倍频)× 减速比 每毫米脉冲数 = 一圈脉冲数 ÷ 丝杠导程(毫米/转)
举例:伺服电机配 2500 线增量编码器,四倍频就是 10000 脉冲/转;电机到丝杠有 10:1 减速,丝杠导程 5 毫米,则每毫米脉冲数 = 10000 × 10 ÷ 5 = 20000 脉冲/毫米。要走 10 毫米就设 GT_SetPos(1, 200000)。速度同理:想跑 50 毫米/秒,规划速度填 20000 × 50 = 1000000 脉冲/秒,加速度要跟着配够,太小会实际走不动。
如果是直驱、不带减速,公式简化成:每毫米脉冲数 = 编码器四倍频后的每转脉冲数 ÷ 导程。比如 2500 线伺服直连 5 毫米导程丝杠,就是 10000 ÷ 5 = 2000 脉冲/毫米,目标位置数值一下子小一个数量级,写代码时别惯性用原来的量级去套。
GTS800 内部统一用脉冲单位,毫米换算要在应用层自己做。工程上建议封装成函数,比如 SetPosMm(axis, mm),机械结构改了只改系数表,不用翻遍代码改魔法数。这个习惯我一直留着,后面换机型只调参数不调逻辑。
5. GTS800 光盘文件使用避坑:驱动、编译与调轴的五条踩坑记录
5.1 设备管理器里出现未知设备,重装三遍都一样
现象:卡插上系统不认,设备管理器里只有一个带黄色感叹号的未知设备,右键更新驱动怎么指路径都没用。
原因:最常见的是 gt800.inf 里的硬件 ID 与卡的实际 PCI ID 对不上,GTS800 早期硬件改版多;其次是驱动目录指错,没指到包含 INF 的那一层;再就是系统签名策略把老驱动拦了。
解决:先对照设备管理器「详细 → 硬件 ID」和 INF [Models] 段的 ID,逐字符比对,不一致就是文件版本不对,换光盘里其他版本的 INF 或找对应改版驱动。目录指错就重新定位到 Driver 文件夹。签名问题按第 3 章提示临时禁用签名再装,装完恢复。
5.2 驱动看着是好的,GT_Open 却返回非 0
现象:设备管理器里设备状态正常,但例程运行到 GT_Open(0) 返回失败,卡打不开。
原因:设备管理器正常不代表底层资源没冲突。GTS800 是 PCI 卡,可能和别的板卡抢中断或内存地址;也有些主板的 PCI 槽供电不足,或 BIOS 里 PnP 配置有问题。
解决:先换一个 PCI 插槽,这是最快的排除法;再进 BIOS 看 PCI 相关配置,禁用不用的板载设备释放中断资源;最后用调试工具看能不能读到卡,读不到就是底层资源问题,读得到就回头检查代码里卡号是不是 0。正常情况下 GT_Open 几乎不可能失败,一旦失败优先怀疑硬件层。
5.3 例程一编译就报错,gts.h 找不到
现象:打开光盘 Sample 里的 VC 工程,编译出来上百条错误,全是头文件找不到、lib 打不开。
原因:例程工程文件里写的是绝对路径,比如 D:\Googol\GTS\Include 这种,换到你的机器上当然不存在;另外老例程在 VS2015 以上版本打开,工程格式也不兼容,编译时连带出各种莫名其妙的错误。
解决:不要迷信例程工程,自己新建工程,把 .c/.cpp 源码复制过来,手动配第 4.1 节那三处路径。如果例程用了 MFC 或旧控件,把界面部分删掉只留核心调用代码——运动控制逻辑跟界面不绑定,删掉反而清爽。
5.4 轴已使能,改完目标位置却原地不动
现象:GT_PrfTrap、GT_SetPos 都调了,程序不报错,电机一动不动,状态字看着也正常。
原因:八成是漏了 GT_Update——GTS 系列改完规划参数必须调一次 Update 才下发;也可能是驱动告警没清,或者伺服没实际得电,使能信号没接通。
解决:严格按「清状态 → 使能 → 设规划 → 设参数 → Update → 轮询状态」的顺序走。排查时用调试工具看状态字:有告警先 GT_ClrSts;再看 GT_GetPrfPos 规划位置有没有变化,位置在变说明参数已下发,问题在伺服侧;位置不变说明参数根本没接受,回头检查调用顺序。
5.5 64 位系统下 gts.dll 加载失败,程序起不来
现象:程序一运行就报错或直接退出,提示无法加载 gts.dll,或者出现 0xC0000135 这类错误码。
原因:光盘里带的 gts.dll 基本是 32 位版本,你在 x64 系统上编译成 64 位程序,32 位 dll 没法加载。这是位数不匹配,不是文件损坏,别拿 64 位硬刚 32 位 dll,这一步没有后悔药。
解决:方案一,工程编译目标改成 x86,最省事且和光盘 SDK 匹配,GTS800 这类老卡在 x86 下反而稳定;方案二,项目必须 64 位就找固高要新版 SDK;方案三,用 32 位老系统跑上位机。
6. 验证这套光盘文件是否完整:拿到手先做三个动作
光盘文件到手先别急着装,花十分钟做三个验证动作,能避免后面踩一堆「文件缺一个角」的坑。
第一个动作,用记事本打开 gt800.inf,检查三段结构:开头是 [Version] 和 [Manufacturer],中段有 [Models] 这类设备映射段,后段是 [DDInstall] 驱动的安装描述。INF 是纯文本,缺了任何一段,Windows 都会拒绝安装。如果打开是乱码,文件可能损坏或被加密,趁早换资源。
第二个动作,确认 gts.dll 是完整的动态库。在 Visual Studio 命令行环境执行:
dumpbin /exports gts.dll | findstr GT_正常输出是一长串 GT_Open、GT_Close、GT_PrfTrap 这些导出函数名。如果提示不是有效 DLL 或者导出表是空的,说明文件在拷贝或打包时丢了字节。没有 dumpbin 就用 PE 查看工具看导出表,原理一样。
第三个动作,验证通过后做一次低压空跑测试。接一个 24V 低压小电机,按第 4 章代码改一个 10 万脉冲的小行程,速度设低一点,比如 2000 脉冲/秒,加速度 10000,跑一遍看位置是否准确停下、状态字是否清零。这一步同时验证了驱动、dll、例程和硬件四件事,比任何文件检查都实在。
从那以后我每次拿到一套 GTS 卡和光盘文件,第一件事不再急着接电机看转不转,而是把 INF 结构、导出表、低压空跑这三步先走一遍,半小时内判断这套资源到底能不能用。前两步是给后来者避坑的,真正让你放心的是那道低压空跑——数据会说话。希望帮到你。
本文还有配套的精品资源,点击获取