c++ fanuc cnc数据采集踩过坑

       最近开始搞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

{

关机或断网状态

}

 

这些坑踩完了,基本的参数也都能采集到了。

接下来继续搞三菱和华中、西门子数据采集了。

  • 13
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
多线程数据采集是指利用多个线程同时进行数据采集的技术。在进行数据采集时,由于网络延迟、IO等原因,单线程采集数据效率较低。而多线程数据采集可以同时启动多个线程,并行处理不同的任务,从而提高数据采集的效率和速度。 多线程数据采集的好处是可以同时处理多个任务,缩短采集数据的时间。例如,可以将需要采集的数据分成多个任务,每个任务由一个线程负责处理,当一个线程在等待网络响应时,其他线程仍然可以继续运行,从而可以最大程度地利用系统资源,提高数据采集的效率。 在多线程数据采集中,需要注意线程同步和数据一致性的问题。由于多个线程同时进行数据采集,可能会导致数据读写的竞争和冲突。因此,在设计多线程数据采集程序时,需要使用锁、信号量、互斥量等同步机制来保证数据的一致性和正确性。 此外,多线程数据采集还需要合理管理线程资源,避免线程过多导致系统负载过重的问题。可以通过线程池等方式来管理和控制线程的数量,避免过多线程的创建和销毁带来的开销,提高系统的稳定性和性能。 总之,多线程数据采集是一种提高数据采集效率的技术手段,可以同时进行多个任务的处理,减少采集时间,提高数据采集的效率和速度。但在实际应用中,需要注意线程同步和资源管理等问题。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值