3. 读取主轴转速与倍率
任务目标
通过FOCAS库连接FANUC数控系统,实时读取主轴实际转速、指令转速及主轴倍率,并在控制台显示当前值。本案例实现最小可复现的读取闭环,不涉及界面开发。
环境依赖
需要FANUC FOCAS2库(fwlib32.dll/fwlib32.lib或Linux对应版本),C语言编译器。连接前确认机床开启FOCAS以太网功能,并已知IP地址与端口号(默认8193)。
关键完整代码
#include <stdio.h>
#include <string.h>
#include "fwlib32.h"
int main() {
unsigned short handle;
short ret;
short actual_speed = 0; // 实际转速 rpm
short command_speed = 0; // 指令转速 rpm
short override = 0; // 主轴倍率 %
short dummy = 0;
// 1. 建立连接
ret = cnc_allclibhndl3("192.168.0.1", 8193, 10, &handle);
if (ret != EW_OK) {
printf("连接失败,错误码: %d\n", ret);
return 1;
}
// 2. 读取主轴实际转速(地址 SACT)
ret = cnc_rdspindle(handle, &actual_speed, &dummy);
if (ret != EW_OK) {
printf("读取实际转速失败,错误码: %d\n", ret);
cnc_freelibhndl(handle);
return 1;
}
// 3. 读取主轴指令转速(地址 SCMD)
ret = cnc_rdspindle(handle, &dummy, &command_speed);
if (ret != EW_OK) {
printf("读取指令转速失败,错误码: %d\n", ret);
cnc_freelibhndl(handle);
return 1;
}
// 4. 读取主轴倍率(地址 SOVO)
ret = cnc_rdspindle(handle, &dummy, &dummy); // 先清空
ret = cnc_rdparam(handle, 0, 0, 0, 0, &override); // 实际使用参数读取
if (ret != EW_OK) {
// 备选:通过系统变量读取倍率
ODBT sysvar;
ret = cnc_rdmacro(handle, 0, 0, 0, &sysvar);
if (ret != EW_OK) {
printf("读取倍率失败,错误码: %d\n", ret);
cnc_freelibhndl(handle);
return 1;
}
}
// 5. 显示结果
printf("主轴实际转速: %d rpm\n", actual_speed);
printf("主轴指令转速: %d rpm\n", command_speed);
printf("主轴倍率: %d%%\n", override);
// 6. 断开连接
cnc_freelibhndl(handle);
return 0;
}
编译与运行
# Windows (MSVC)
cl read_spindle.c /I "C:\FOCAS\include" /link fwlib32.lib
# Linux (gcc)
gcc read_spindle.c -o read_spindle -I /usr/local/focas/include -L /usr/local/focas/lib -lfwlib32
# 运行
./read_spindle
验证方法
在机床面板上手动改变主轴转速(如从500rpm调到800rpm)或调整倍率旋钮,重新运行程序,观察输出值是否随之变化。若输出值与机床面板显示一致,且连续多次运行结果稳定,则判定通过。
常见问题
- 连接失败(错误码非0):检查IP地址、端口号是否正确,机床FOCAS功能是否启用,网络是否可达。
- 读取倍率返回错误:不同系统倍率地址可能不同,可尝试通过
cnc_rdmacro读取系统宏变量(如#3004)获取倍率值。 - 数值为0:确认主轴处于旋转状态,且系统参数允许外部读取。