最近开始搞FANUC CNC数据采集,从领导布置下来这个任务到完成大约花了1个月的时间,每天不是在找API的路上,就是在定位获取不到数据的路上。后来想想主要归纳下主要还是机床不太了解造成的。
1.上来遇到第一坑就是cnc_allclibhndl3句柄连接不上FANUC机床-,找了资料发现是除了fwlib32.dll以外缺少fwlibe1.dll。
2.接着遇到坑就是各种参数找不到:生产总量,加工计件,开机时间,运行时间,进给速度、设定进给速度、主轴倍率。后来发现这些参数不能直接通过具体api来找到,而是需要通过cnc_rdparam、cnc_rdmacro、pmc_rdpmcrng函数根据具体宏值、参数值、地址位来获取的。
例如:
生产总量: cnc_rdparam(hFanuc, 6712, 0, sizeof(iodbpsd), &iodbpsd);
工件计数: cnc_rdmacro(hFanuc, 0xf3d, 0x0a, &m_odbm);
设定工件计数: cnc_rdparam(hFanuc, 6712, 0, sizeof(iodbpsd), &iodbpsd);
主轴倍率: pmc_rdpmcrng(hFanuc, 0, 1, 30, 31, 8 + 1* 2, &pmcData);
指定主轴速度: pmc_rdpmcrng(hFanuc, 1, 2, 22, 25, 8 + 1 * 4, &pmcData);
进给倍率: pmc_rdpmcrng(hFanuc, 0, 1, 12, 13, 8 + 1 * 2, &pmcData);
指定进给速度: pmc_rdpmcrng(hFanuc, 0, 1, 144 + (curIndex * 12), 145 + (curIndex * 12), 8 + 1 * 2, &pmcData);
循环时间: cnc_rdparam(hFanuc, 6757, 0, sizeof(iodbpsd), &iodbpsd1);
开机总时间: cnc_rdparam(hFanuc, 6750, 0, sizeof(iodbpsd), &iodbpsd);
运行总时间: IODBPSD iodbpsd1, iodbpsd2;
int32_t totalTime = 0;
fanret = cnc_rdparam(hFanuc, 6751, 0, sizeof(iodbpsd), &iodbpsd1);
if (EW_OK == fanret)
{
totalTime = iodbpsd1.u.ldata / 1000;//换算成秒
fanret = cnc_rdparam(hFanuc, 6752, 0, sizeof(iodbpsd), &iodbpsd2);
if (EW_OK == fanret)
{
totalTime += iodbpsd2.u.ldata * 60;//换算成秒
pSet->totalMachiningTime = totalTime;
_DEBUG("pSet->totalMachiningTime is %d s\n", pSet->totalMachiningTime);
}
else
{
_ERROR("cnc_rdparam 6752 error %d\n", fanret);
}
}
切削总时间:
fanret = cnc_rdparam(hFanuc, 6753, 0, sizeof(iodbpsd), &iodbpsd1);
if (EW_OK == fanret)
{
totalTime = iodbpsd1.u.ldata / 1000;//换算成秒
fanret = cnc_rdparam(hFanuc, 6754, 0, sizeof(iodbpsd), &iodbpsd2);
if (EW_OK == fanret)
{
totalTime += iodbpsd2.u.ldata * 60;//换算成秒
pSet->totalCuttingTime = totalTime;
_DEBUG("pSet->totalCuttingTime is %d s\n", pSet->totalCuttingTime);
}
else
{
_ERROR("cnc_rdparam 6754 error %d\n", fanret);
}
}
3.第三遇到坑就是刀具相关信息死活取不到,用别人的网关盒子去读也没有读取到,后来找盒子的相关技术人员也没有解决,后来在一篇文章中找到了可能是机床启动刀具寿命管理功能才能获取。需要通过fanuc的操作修改8132参数的TLF值为1就可以了。
4.第四坑就是设备状态-这个参数是cnc_statinfo函数获取各种状态:例如程序状态、报警状态、紧急停止状态等等,但又不能直接对应起来设备状态:需要根据各种状态来判断。最后我们决定用:
紧急停止》报警》程序运行》程序待机》待机这种优先级来判断设备状态
大致逻辑就是:
if(紧急停止状态不为空)
{
紧急停止
}
else if(报警状态》0)
{
报警状态
}
else if(自动模式&程序运行)
{
运行状态
}
else if(程序运行以外)
{
待机状态
}
else
{
关机或断网状态
}
这些坑踩完了,基本的参数也都能采集到了。
接下来继续搞三菱和华中、西门子数据采集了。