麦芯(MachCore)应用开发教程2 --- 时序

发布时间:2024年01月22日

黄国强 2024/01/22

????????正如计算机的本质是状态机一样,设备也是一个状态机。笔者之前文章“什么是时序”用 switch/case 实现了状态机。在麦芯中,我们用Lambda实现了状态机。相对于switch/case,Lambda更优雅,更符合面向对象。先上代码,这是检测站时序代码。

void InspectDvc::CreateSeqRun()
{
    // 创建一个站位时序,名称是检测
    auto pSeq = _pStation->AddSeq("Inspect");
    // 状态1:等待站位上有待测的物料
    pSeq->AddInstruct(
        [=]() {
            // 站位上无待测物料,直接返回
            if (!_pStation->IsHavWaitingProcItem()) return;
            // 有待测物料,启动拍照时序
            _pSeqGrab->Start(); 
            // 跳到下一个状态
            pSeq->Next();       
        });
    // 状态2:等待拍照时序完成
    pSeq->AddInstruct(
        [=]() {
            // 拍照时序未就绪,直接返回
            if (!_pSeqGrab->IsIdle()) return;
            // 启动计算时序
            _pSeqCalc->Start();
            // 跳到下一个状态
            pSeq->Next();
        });
    // 状态3:等待计算时序完成
    pSeq->AddInstruct(
        [=]() {
            // 计算时序未就绪,直接返回
            if (!_pSeqCalc->IsIdle()) return;
            // 处理完成,将完成状态赋值到物料上
            _pStation->ProcessFini(true);
            // 跳到下一个状态,这是最后一句,所以状态将切换到最上面
            pSeq->Next();
        });
}

????????上面这段代码至少看上去挺简单的。具体每行都有注释。麦芯系统内部有大量概念,如果先介绍这些概念再来编程,这可是要考验读者的耐心。所以这里先介绍一段代码,看看麦芯是如何开发一款真实的设备,以显示其功能强大和便利性。让读者有兴趣进一步了解麦芯。

????????上图“st_inspect.Inspect”时序就是我们示例代码创建的时序。这里的“st_inspect”是站位名,“Inspect ”是时序名。

[参考]
什么是时序?
一文深入了解C++ lambda(C++17)

文章来源:https://blog.csdn.net/acloudhuang/article/details/135745866
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。