黄国强 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)