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的工作流程.
全部0条评论
快来发表一下你的评论吧 !