RPC如何在远程过程中调用?

描述

RPC(Remote Procedure Call Protocol)即远程过程调用,也就是调用的函数是在其它的控制板上运行的,不需要理会底层的通讯协议。现在大型设备通常有超过5块控制板,这些控制板通过485/CAN/以太网组成一个局域网。通讯协议可以使用Modbus或者自定义。。。

多模块组网,实现模块化,减少电气布线便于维护:

函数

远程调用数据流:

函数

这些控制板的硬件基本都一样(电机,传感器。。),底层驱动程序也一样,只是上层的业务逻辑的差别,在驱动层封装一层rpc,能进一步简化业务逻辑开发,使得控制从机的电机 动作和本机的函数接口一样.

动作 传感器映射

映射是把本地动作编号 传感器编号映射到从机模块的动作编号和传感器编号,这个是在上电初始化时完成.

enum
{
  HOST=0,//本机编号
  SLAVE1,
  SLAVE2,
};


l->MapRemoteAction(201,SLAVE1,1);  //动作201映射到从机1的1号动作
l->MapRemoteAction(301,SLAVE2,1);  //动作301映射到从机2的1号动作


l->MapRemoteSensor(X201,SLAVE1,X01);//把传感器X201映射到从机的X01

SLAVE1,SLAVE2是从机模块编号,通常是威廉希尔官方网站 板上的拨码开关决定的.RPC组包时会把这些模块编号放在头部.

业务代码:

start(App):
l->WaitAction(201,STEP2,STEP_ERROR);  //执行从机1动作201,动作正确完成就跳到step2,错误step_error
step2:
if(l->IsSenorOn(X201))  //从机1号传感器感应
{
  l->WaitAction(301,STEP_OK,STEP_ERROR);  //执行从机2的动作
}
else
{
  l->SetActionOk();
}
step_ok:
l->SetActionOk();
step_error:
l->SetSubError();
end

上面的业务代码是没有任何通讯相关的流程,只是一些简单的函数调用和本地函数调用一模样

RPC层

RPC层主要完成数据组包,实时数据通讯,从机的动作 电机运动都是耗时过程,需要一定的时间才能完成,那么主机端的rpc层就需要不断查询从机的状态.App调用从机的动作时就同步等待从机的状态变化后继续向下执行.软件实现上需要单独一个线程或者类似于switch-case实时处理rpc的工作流程.

函数

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分