?? ican.c
字號:
ican_cet=0;
ican_del_cnnet_sla_respond(SrcMACID);
}
else
{
ican_respond_err(SrcMACID,SourceID,cnet_unexist);
}
}
else
{
ican_respond_err(SrcMACID,SourceID,funcID_parameter_unsupport);
}
break;
case reset_sla://復位從站
if(ican_cet==1)
{
ican_respond_err(SrcMACID,SourceID,cmd_unsupport);
}
else
{
ican_respond_err(SrcMACID,SourceID,cnet_unexist);
}
break;
case check_ID://檢測ID
ican_check_slaID_respond(SrcMACID);
break;
// case err_cnet://錯誤連接
// break;
default:if(ACK==0)//當請求回應,但沒有此功能碼時
{
ican_respond_err(SrcMACID,SourceID,1); //返回無此功能碼ErrID:0x01
}
}
else
if (ACK==1)//響應幀
{
switch(FunCID)
{
case write_port:
OSFlagPost(ican_pevent,ican_write_OK,OS_FLAG_SET,&err);
break;
case read_port:
if(SourceID<=0x1f)
{
if(SourceID+d_long-1<=iCANdeviceList[SrcMACID].DILen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_DILen[SourceID],d_long);
}
}
else
if(SourceID<=0x3f)
{
if(SourceID+d_long-1-0x20<=iCANdeviceList[SrcMACID].DOLen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_DOLen[SourceID-0x20],d_long);
}
}
else
if(SourceID<=0x5f)
{
if(SourceID+d_long-1-0x40<=iCANdeviceList[SrcMACID].AILen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_AILen[SourceID-0x40],d_long);
}
}
else
if(SourceID<=0x7f)
{
if(SourceID+d_long-1-0x60<=iCANdeviceList[SrcMACID].AOLen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_AOLen[SourceID-0x60],d_long);
}
}
OSFlagPost(ican_pevent,ican_read_OK,OS_FLAG_SET,&err);//發送信號量
break;
case slv_to_mas_trigger :
if(SourceID<=0x1f)
{
if(SourceID+d_long-1<=iCANdeviceList[SrcMACID].DILen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_DILen[SourceID],d_long);
}
}
else
if(SourceID<=0x3f)
{
if(SourceID+d_long-1-0x20<=iCANdeviceList[SrcMACID].DOLen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_DOLen[SourceID-0x20],d_long);
}
}
else
if(SourceID<=0x5f)
{
if(SourceID+d_long-1-0x40<=iCANdeviceList[SrcMACID].AILen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_AILen[SourceID-0x40],d_long);
}
}
else
if(SourceID<=0x7f)
{
if(SourceID+d_long-1-0x60<=iCANdeviceList[SrcMACID].AOLen)//數據長度沒有超出
{
array_copy(p,&iCANdeviceList[SrcMACID].P_AOLen[SourceID-0x60],d_long);
}
}
break;
case creat_cnet:
/*****************釋放空間內存(為了安全)**************/
if(iCANdeviceList[SrcMACID].sla_status==0)//當前為第一次連接
{
#if ican_DRAM_Enalbe
ican_free (iCANdeviceList[SrcMACID].P_DILen);
ican_free (iCANdeviceList[SrcMACID].P_DOLen);
ican_free (iCANdeviceList[SrcMACID].P_AILen);
ican_free (iCANdeviceList[SrcMACID].P_AOLen);
iCANdeviceList[SrcMACID].DILen=*p;
p++;
iCANdeviceList[SrcMACID].DOLen=*p;
p++;
iCANdeviceList[SrcMACID].AILen=*p;
p++;
iCANdeviceList[SrcMACID].AOLen=*p;
/********************重新申請內存空間*****************/
iCANdeviceList[SrcMACID].P_DILen=ican_malloc(iCANdeviceList[SrcMACID].DILen);
iCANdeviceList[SrcMACID].P_DOLen=ican_malloc(iCANdeviceList[SrcMACID].DOLen);
iCANdeviceList[SrcMACID].P_AILen=ican_malloc(iCANdeviceList[SrcMACID].AILen);
iCANdeviceList[SrcMACID].P_AOLen=ican_malloc(iCANdeviceList[SrcMACID].AOLen);
#endif
iCANdeviceList[SrcMACID].sla_status=1;
}
OSFlagPost(ican_pevent,ican_crt_cnet_ok,OS_FLAG_SET,&err);//發送信號量
break;
case del_cnet:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
iCANdeviceList[SrcMACID].sla_status=0;
#if ican_DRAM_Enalbe
ican_free (iCANdeviceList[SrcMACID].P_DILen);
ican_free (iCANdeviceList[SrcMACID].P_DOLen);
ican_free (iCANdeviceList[SrcMACID].P_AILen);
ican_free (iCANdeviceList[SrcMACID].P_AOLen);
iCANdeviceList[SrcMACID].DILen=0;
iCANdeviceList[SrcMACID].DOLen=0;
iCANdeviceList[SrcMACID].AILen=0;
iCANdeviceList[SrcMACID].AOLen=0;
#endif
OSFlagPost(ican_pevent,ican_del_cnet_ok,OS_FLAG_SET,&err);//發送信號量
break;
//case reset_sla:
//break;
case check_ID:
ican_cet=2;//標志id以存在 不能正常工作
OSFlagPost(ican_pevent,ican_id_exiet,OS_FLAG_SET,&err);//發送信號量
break;
case err_cnet:
switch(*p)
{
case funcID_unexist:
OSFlagPost(ican_pevent,ican_err_funID_unfound,OS_FLAG_SET,&err);//發送信號量
break;
case res_unfound:
OSFlagPost(ican_pevent,ican_err_sourID_unfound,OS_FLAG_SET,&err);//發送信號量
break;
case cmd_unsupport:
OSFlagPost(ican_pevent,ican_err_cmd_unsupply,OS_FLAG_SET,&err);//發送信號量
break;
case funcID_parameter_unsupport:
OSFlagPost(ican_pevent,ican_err_funID_err,OS_FLAG_SET,&err);//發送信號量
break;
case cnet_unexist:
ican_create_cnnet_sla (SrcMACID);//重新建立連接
OSFlagPost(ican_pevent,ican_err_cent_unfound,OS_FLAG_SET,&err);//發送信號量,通知等待建立連接,重發數據
break;
case operate_impact:
OSFlagPost(ican_pevent,ican_err_operate_impact,OS_FLAG_SET,&err);//發送信號量
break;
case flag_err:
OSFlagPost(ican_pevent,ican_err_flag_err,OS_FLAG_SET,&err);//發送信號量
break;
}
break;
}
}
}
#define wait_time 5
/***********************************主站輪訓函數*******************************
本函數為主站功能函數
作者:張森
日期:2008年4月9日
********************************************************************************/
void master_wheel_cnet()
{INT8U i,err,cnt_f=0;
ALL_OVER=1;
for(i=0;i<ICAN_SLV_NUM;i++)
{
if(iCANdeviceList[i].sla_status!=3)//是否忽略此站
{//cnt_f=1;
if(iCANdeviceList[i].sla_status==0)//這個站是首次連接,需要建立連接獲取數據長度,申請數據空間
{
goto_create_cnet:
OSFlagAccept(ican_pevent,ican_crt_cnet_ok|ican_err_cmd_unsupply|ican_err_funID_err,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);//清除標識,保證安全,保證當前使用標識為空
ican_create_cnnet_sla(i) ;//發送建立連接命令。
OSFlagPend(ican_pevent,ican_crt_cnet_ok|ican_err_cmd_unsupply|ican_err_funID_err,OS_FLAG_WAIT_SET_ANY,wait_time,&err);//等待命令成功或從站已經連接或參數錯誤,不復位標志符
if(err==OS_NO_ERR)//有響應
{
OSFlagAccept(ican_pevent,ican_crt_cnet_ok,OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME,&err);//查看是否連接成功,并復位標志符
if(err==OS_NO_ERR)//成功建立連接
{
}
else
{
OSFlagAccept(ican_pevent,ican_err_cmd_unsupply,OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME,&err);
if(err==OS_NO_ERR)//從站已經建立了連接
{
ican_del_cnnet_sla(i);//刪除連接
OSFlagPend(ican_pevent,ican_del_cnet_ok|ican_err_cent_unfound|ican_err_funID_err,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,wait_time,&err);//等待刪除成功命令
if(err==OS_NO_ERR)
{ ALL_OVER&=0;
if(iCANdeviceList[i].sla_timeover_cont>0)//成功發送一次
{
iCANdeviceList[i].sla_timeover_cont=0; //超時--
}
goto goto_create_cnet;
}
else
if(err==OS_TIMEOUT)//超時一次
{ ALL_OVER&=1;
if(iCANdeviceList[i].sla_timeover_cont<255)
{
iCANdeviceList[i].sla_timeover_cont++; //超時++
}
}
}
else
{
OSFlagAccept(ican_pevent,ican_err_funID_err,OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME,&err); //得到格式不對的回應,清楚標志位,(為了安全沒有別的作用)
}
}
ALL_OVER&=0;
if(iCANdeviceList[i].sla_timeover_cont>0)//成功發送一次,超時計數器不為0
{
iCANdeviceList[i].sla_timeover_cont=0; //超時--
}
}
else
if(err==OS_TIMEOUT)//從站超時
{ALL_OVER&=1;
if(iCANdeviceList[i].sla_timeover_cont<255)//沒有超出上限
{
iCANdeviceList[i].sla_timeover_cont++;//超時++
}
}
}
if(iCANdeviceList[i].sla_status==1)//此戰為正常連接^_^,開始交換數據信息
{ if(iCANdeviceList[i].DOLen>0)
{
/****************************寫ok***********沒有建立連接********功能參數非法*********資源不存在**************命令不支持*************操作無影響*********/
OSFlagAccept(ican_pevent,ican_write_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound|ican_err_cmd_unsupply|ican_err_operate_impact,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);//清除標識,保證安全,保證當前使用標識為空
ican_write_sla(i,0x20,iCANdeviceList[i].P_DOLen,iCANdeviceList[i].DOLen);
OSFlagPend(ican_pevent,ican_write_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound|ican_err_cmd_unsupply|ican_err_operate_impact,OS_FLAG_WAIT_SET_ANY,wait_time,&err);
if(err==OS_NO_ERR)//成功寫入數據
{ ALL_OVER&=0;if(iCANdeviceList[i].sla_timeover_cont>0)//成功發送一次
{
iCANdeviceList[i].sla_timeover_cont=0; //超時--
}
OSFlagAccept(ican_pevent,ican_err_cent_unfound,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);
if(err==OS_NO_ERR)
{
goto goto_create_cnet;
}
}
else
if(err==OS_TIMEOUT)//從站超時
{ALL_OVER&=1;
if(iCANdeviceList[i].sla_timeover_cont<255)//沒有超出上限
{
iCANdeviceList[i].sla_timeover_cont++;//超時++
}
}
}
if(iCANdeviceList[i].AOLen>0)
{
/****************************寫ok***********沒有建立連接********功能參數非法*********資源不存在**************命令不支持*************操作無影響*********/
OSFlagAccept(ican_pevent,ican_write_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound|ican_err_cmd_unsupply|ican_err_operate_impact,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);//清除標識,保證安全,保證當前使用標識為空
ican_write_sla(i,0x60,iCANdeviceList[i].P_AOLen,iCANdeviceList[i].AOLen);
OSFlagPend(ican_pevent,ican_write_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound|ican_err_cmd_unsupply|ican_err_operate_impact,OS_FLAG_WAIT_SET_ANY,wait_time,&err);
if(err==OS_NO_ERR)//成功寫入數據
{ if(iCANdeviceList[i].sla_timeover_cont>0)//成功發送一次
{
iCANdeviceList[i].sla_timeover_cont=0; //超時--
} ALL_OVER&=0;
OSFlagAccept(ican_pevent,ican_err_cent_unfound,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);
if(err==OS_NO_ERR)
{
goto goto_create_cnet;
}
}
else
if(err==OS_TIMEOUT)//從站超時
{ALL_OVER&=1;
if(iCANdeviceList[i].sla_timeover_cont<255)//沒有超出上限
{
iCANdeviceList[i].sla_timeover_cont++;//超時++
}
}
}
if(iCANdeviceList[i].DILen>0)
{
/**************************** 讀ok***********沒有建立連接********功能參數非法*********資源不存在**************命令不支持*************操作無影響*********/
OSFlagAccept(ican_pevent,ican_read_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);//清除標識,保證安全,保證當前使用標識為空
ican_read_sla(i,0x00,0,iCANdeviceList[i].DILen);
OSFlagPend(ican_pevent,ican_read_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound,OS_FLAG_WAIT_SET_ANY,wait_time,&err);
if(err==OS_NO_ERR)//有響應
{ ALL_OVER&=0;if(iCANdeviceList[i].sla_timeover_cont>0)//成功發送一次
{
iCANdeviceList[i].sla_timeover_cont=0; //超時--
}
OSFlagAccept(ican_pevent,ican_err_cent_unfound,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);
if(err==OS_NO_ERR)
{
goto goto_create_cnet;
}
}
else
if(err==OS_TIMEOUT)//從站超時
{ALL_OVER&=1;
if(iCANdeviceList[i].sla_timeover_cont<255)//沒有超出上限
{
iCANdeviceList[i].sla_timeover_cont++;//超時++
}
}
}
if(iCANdeviceList[i].AILen>0)
{
/**************************** 讀ok***********沒有建立連接********功能參數非法*********資源不存在**************命令不支持*************操作無影響*********/
OSFlagAccept(ican_pevent,ican_read_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);//清除標識,保證安全,保證當前使用標識為空
ican_read_sla(i,0x40,0,iCANdeviceList[i].AILen);
OSFlagPend(ican_pevent,ican_read_OK|ican_err_cent_unfound|ican_err_funID_err|ican_err_sourID_unfound,OS_FLAG_WAIT_SET_ANY,wait_time,&err);
if(err==OS_NO_ERR)//有響應
{ALL_OVER&=0;
if(iCANdeviceList[i].sla_timeover_cont>0)//成功發送一次
{
iCANdeviceList[i].sla_timeover_cont=0; //超時--
}
OSFlagAccept(ican_pevent,ican_err_cent_unfound,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,&err);
if(err==OS_NO_ERR)
{
goto goto_create_cnet;
}
}
else
if(err==OS_TIMEOUT)//從站超時
{ALL_OVER&=1;
if(iCANdeviceList[i].sla_timeover_cont<255)//沒有超出上限
{
iCANdeviceList[i].sla_timeover_cont++;//超時++
}
}
}
}
}
OSTimeDly(1);
}
if(ALL_OVER)
{
M(30,0)=1;
}
else
{
M(30,0)=0;
}
for(i=1;i<ICAN_SLV_NUM;i++)
{
VB(79+i)=0;
if(iCANdeviceList[i].sla_status!=3)//是否忽略此站
{
if(iCANdeviceList[i].sla_timeover_cont>200)
{
VB(79+i)=1;
}
else
{
VB(79+i)=0;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -