RPC(Remote Procedure Call Protocol)即遠(yuǎn)程過(guò)程調(diào)用,也就是調(diào)用的函數(shù)是在其它的控制板上運(yùn)行的,不需要理會(huì)底層的通訊協(xié)議。現(xiàn)在大型設(shè)備通常有超過(guò)5塊控制板,這些控制板通過(guò)485/CAN/以太網(wǎng)組成一個(gè)局域網(wǎng)。通訊協(xié)議可以使用Modbus或者自定義。。。
多模塊組網(wǎng),實(shí)現(xiàn)模塊化,減少電氣布線便于維護(hù):
遠(yuǎn)程調(diào)用數(shù)據(jù)流:
這些控制板的硬件基本都一樣(電機(jī),傳感器。。),底層驅(qū)動(dòng)程序也一樣,只是上層的業(yè)務(wù)邏輯的差別,在驅(qū)動(dòng)層封裝一層rpc,能進(jìn)一步簡(jiǎn)化業(yè)務(wù)邏輯開(kāi)發(fā),使得控制從機(jī)的電機(jī) 動(dòng)作和本機(jī)的函數(shù)接口一樣.
動(dòng)作 傳感器映射
映射是把本地動(dòng)作編號(hào) 傳感器編號(hào)映射到從機(jī)模塊的動(dòng)作編號(hào)和傳感器編號(hào),這個(gè)是在上電初始化時(shí)完成.
enum
{
HOST=0,//本機(jī)編號(hào)
SLAVE1,
SLAVE2,
};
l->MapRemoteAction(201,SLAVE1,1); //動(dòng)作201映射到從機(jī)1的1號(hào)動(dòng)作
l->MapRemoteAction(301,SLAVE2,1); //動(dòng)作301映射到從機(jī)2的1號(hào)動(dòng)作
l->MapRemoteSensor(X201,SLAVE1,X01);//把傳感器X201映射到從機(jī)的X01
SLAVE1,SLAVE2是從機(jī)模塊編號(hào),通常是電路板上的撥碼開(kāi)關(guān)決定的.RPC組包時(shí)會(huì)把這些模塊編號(hào)放在頭部.
業(yè)務(wù)代碼:
start(App):
l->WaitAction(201,STEP2,STEP_ERROR); //執(zhí)行從機(jī)1動(dòng)作201,動(dòng)作正確完成就跳到step2,錯(cuò)誤step_error
step2:
if(l->IsSenorOn(X201)) //從機(jī)1號(hào)傳感器感應(yīng)
{
l->WaitAction(301,STEP_OK,STEP_ERROR); //執(zhí)行從機(jī)2的動(dòng)作
}
else
{
l->SetActionOk();
}
step_ok:
l->SetActionOk();
step_error:
l->SetSubError();
end
上面的業(yè)務(wù)代碼是沒(méi)有任何通訊相關(guān)的流程,只是一些簡(jiǎn)單的函數(shù)調(diào)用和本地函數(shù)調(diào)用一模樣
RPC層
RPC層主要完成數(shù)據(jù)組包,實(shí)時(shí)數(shù)據(jù)通訊,從機(jī)的動(dòng)作 電機(jī)運(yùn)動(dòng)都是耗時(shí)過(guò)程,需要一定的時(shí)間才能完成,那么主機(jī)端的rpc層就需要不斷查詢從機(jī)的狀態(tài).App調(diào)用從機(jī)的動(dòng)作時(shí)就同步等待從機(jī)的狀態(tài)變化后繼續(xù)向下執(zhí)行.軟件實(shí)現(xiàn)上需要單獨(dú)一個(gè)線程或者類(lèi)似于switch-case實(shí)時(shí)處理rpc的工作流程.
-
RPC
+關(guān)注
關(guān)注
0文章
111瀏覽量
11534 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62609 -
通訊協(xié)議
+關(guān)注
關(guān)注
10文章
274瀏覽量
20354
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論