⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icanslave.c

📁 ICAN协议例程
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (function==0){
	  ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
	}
	
/*	else if (function>=1){
		function=0;
	}	*/
    else if (pCANFrame->ucDataBuff[1] != ICAN_Source[order].Area[MasterMACID]) {
        //没有建立连接
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
    }
  	else if((pCANFrame->ucDataBuff[0]!=0)){
		//参数非法 
		ICAN_ErrorIDACK(order,ErrID_ParameterError);//错误代码返回报文(参数非法)
	}
    else {

		function=0;
    	ICAN_ObjIDTmp.SourceID = 0xf7; //资源节点编号
    	ICAN_ObjIDTmp.FUNCID = 0x05; //功能码
    	ICAN_ObjIDTmp.ACK = 1; //应答标志
    	ICAN_ObjIDTmp.DestMACID = ICAN_Source[order].Area[MasterMACID]; //目标节点编号
    	ICAN_ObjIDTmp.SrcMACID = ICAN_Source[order].Area[MACID]; //源节点编号

    	ICAN_Source[order].Area[MasterMACID] = NOMASTER; //清除目标主站节点的MACID
    	ICAN_Source[order].Area[CyclicMaster] = 0; //读取目标主站节点定时通信节拍数

    	ICAN_TrBuff[order].ulID = ICAN_ObjIDManage(&ICAN_ObjIDTmp); //生成ICAN报文ID
    	ICAN_TrBuff[order].ucXID = 1; //  0 标准帧;1 扩展帧//  
    	ICAN_TrBuff[order].ucDataLenth = 1; //  数据场长度1字节//
    	ICAN_TrBuff[order].ucDataCtr = 0; //  读数据指针指0字节//
    	ICAN_TrBuff[order].TrBegin = 1; //发送开始标志置位	
	}
}
//****************************************************************************
//函数名称: 
//函数功能: 
//输入参数: 
//          
//          
//输出参数: 
//返 回 值: 
//创建日期: 2008.05.04
//创 建 人: 
//参考文档:
//说    明: 
//修改历史:
//****************************************************************************
void iCAN_ResetACK(uchar order, tCANFrame  *  pCANFrame) {
     ICAN_OBJ xdata ICAN_ObjIDTmp;
   //复位命令
    if (function==0) {
		//没有建立连接前,连接不存在 错误码命令处理
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;		
	}
	if ( ICAN_Source[order].Area[MasterMACID]!= ICANSlav_ObjID[order].SrcMACID) {//连接不存在
		//通过删除连接命令,使连接不存在 错误码命令处理
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
	}
    if ((pCANFrame->ucDataBuff[1] != ICAN_Source[order].Area[MACID])) {//参数非法
        //参数非法 错误码命令处理
 		ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文参数非法
        return;
    }
    if (FlagSystemResetEn) {//不支持复位命令
        //不支持复位命令 错误码命令处理
 		ICAN_ErrorIDACK(order, ErrID_NotCommand) ;//错误代码返回不支持复位命令
        return;
    }
    ICAN_ObjIDTmp.SourceID = 0xf7; //资源节点编号
    ICAN_ObjIDTmp.FUNCID = 0x06; //功能码
    ICAN_ObjIDTmp.ACK = 1; //应答标志
    ICAN_ObjIDTmp.DestMACID = ICAN_Source[order].Area[MasterMACID]; //目标节点编号
    ICAN_ObjIDTmp.SrcMACID = ICAN_Source[order].Area[MACID]; //源节点编号

    ICAN_TrBuff[order].ulID = ICAN_ObjIDManage(&ICAN_ObjIDTmp); //生成ICAN报文ID
    ICAN_TrBuff[order].ucXID = 1; //  0 标准帧;1 扩展帧//  
    ICAN_TrBuff[order].ucDataLenth = 1; //  数据场长度1字节//
    ICAN_TrBuff[order].ucDataCtr = 0; //  读数据指针指0字节//
    ICAN_TrBuff[order].TrBegin = 1; //发送开始标志置位	
	//复位的节点是本节点
	//SystemReset();//系统复位标志
}
//****************************************************************************
//函数名称: 
//函数功能: 
//输入参数: 
//          
//          
//输出参数: 
//返 回 值: 
//创建日期: 2008.05.04
//创 建 人: 
//参考文档:
//说    明: 
//修改历史:
//****************************************************************************
void iCAN_ReadACK(uchar order, uchar sourceID, tCANFrame  *  pCANFrame) {
    //读数据命令命令
    ICAN_OBJ xdata ICAN_ObjIDTmp;
    uchar i, j, k, l;
	if ( ICAN_Source[order].Area[MasterMACID]!= ICANSlav_ObjID[order].SrcMACID) {//连接不存在
		//连接不存在 错误码命令处理
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
	}
	if (function==0){
			//连接不存在 错误码命令处理
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
	} 
		
	if (ICAN_SourceTest(order,sourceID,pCANFrame->ucDataBuff[1],0)){//资源检测
		ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文资源不存在
		return;
	}
	ICAN_ObjIDTmp.SourceID = ICANSlav_ObjID[order].SourceID; //资源节点编号
    ICAN_ObjIDTmp.FUNCID = 0x02; //读功能码
    ICAN_ObjIDTmp.ACK = 1; //应答标志
    ICAN_ObjIDTmp.DestMACID = ICAN_Source[order].Area[MasterMACID]; //目标节点编号
    ICAN_ObjIDTmp.SrcMACID = ICAN_Source[order].Area[MACID]; //源节点编号

    ICAN_TrBuffR[order].ulID = ICAN_ObjIDManage(&ICAN_ObjIDTmp); //生成ICAN报文ID
    ICAN_TrBuffR[order].ucXID = 1; //  0 标准帧;1 扩展帧//  
    i = sourceID; //获取资源节点的地址
    if (i >= 0xf9) {//读取资源字节点地址
		k = pCANFrame->ucDataBuff[1]; //获取资源节点的子地址
		j = pCANFrame->ucDataBuff[2]; //获取要读出的数据长度
	    if ((j >= 32)) {//一次最多能读32单元超过则为无效,
			//参数非法
			ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
			return;
	    }
	    if ((i+j>0xFF)) {//资源节点超过255
			//参数非法
			ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文//参数非法
			return;
	    }
   		if(i==IOParameter){//IO参数
		   	if(j<4){
				for (l = 0; l < j; l++, k++) {
					//将数据送入接收缓冲
					ICAN_TrBuffR[order].ucDataBuff[l] = SourceType[order][k]; //读取指定单元的地址	
				}
			}else{
				//参数非法
				ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文//参数非法
				return;
			}
		}else if(i==IOConfigure){//IO配置
		   	if(j<32){
				for (l = 0; l < j; l++, k++) {
					//将数据送入接收缓冲
					ICAN_TrBuffR[order].ucDataBuff[l] = ICAN_IOconfig[order][k]; //读取指定单元的地址	
				}
			}else{
				//参数非法
				ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文//参数非法
				return;
			}
		}else{


		}
	}  else {
       //读取正常数据
       j = pCANFrame->ucDataBuff[1]; //获取要读出的数据长度
	    if ((j >= 32)) {//一次最多能读32单元超过则为无效,
			//参数非法
			ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
			return;
	    }
	    if ((i+j>0xFF)) {//资源节点超过255
			//参数非法
			ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文//参数非法
			return;
	    }
      for (l = 0; l < j; l++, i++) {
            //将数据送入接收缓冲
            ICAN_TrBuffR[order].ucDataBuff[l] = ICAN_Source[order].Area[i]; //读取指定单元的地址	
        }
    }
    ICAN_TrBuffR[order].ucDataLenth = j + 1; //  数据场长度k字节//
    ICAN_TrBuffR[order].ucDataCtr = 0; //  读数据指针指0字节//
    ICAN_TrBuffR[order].TrBegin = 1; //发送开始标志置位	
}
//****************************************************************************
//函数名称: 
//函数功能: 
//输入参数: 
//          
//          
//输出参数: 
//返 回 值: 
//创建日期: 2008.05.04
//创 建 人: 
//参考文档:
//说    明: 
//修改历史:
//****************************************************************************
void iCAN_WriteACK(uchar order, uchar sourceID, tCANFrame  *  pCANFrame) {
    static uchar WriteTest=0;
    ICAN_OBJ xdata ICAN_ObjIDTmp;
    uchar i, j, l;
	//写数据命令
	if ( ICAN_Source[order].Area[MasterMACID]!= ICANSlav_ObjID[order].SrcMACID) {//连接不存在
		//连接不存在 错误码命令处理
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
	} 
	if (function==0){
			//还没有建立连接, 错误码命令处理
		ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
	}
	i=ICAN_ObjByte0Restore(&ICAN_ReBuff[order].ucDataCtr, pCANFrame->ucDataBuff[0]);//获取分段标识
    if((i==65)||(i==0)){//数据接收完毕或者没有分段报文
        for (l = 1; l < pCANFrame->ucDLC; l++) {
            //将最后一帧或唯一的数据送入接收缓冲
            ICAN_ReBuff[order].ucDataBuff[ICAN_ReBuff[order].ucDataCtr++] =pCANFrame->ucDataBuff[l]; //读取缓冲区中的数据	
        }
	    if (ICAN_ReBuff[order].ucDataCtr>=32) {//一次最多能读32单元超过则为无效,资源节点超过255也是非法
			//参数非法
			ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
			return;
	    }
		if (ICAN_SourceTest(order,ICANSlav_ObjID[order].SourceID,ICAN_ReBuff[order].ucDataCtr,1)){//资源检测
			ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文资源不存在
			return;
		}
        if(ICANSlav_ObjID[order].SourceID >= 0xf9) {//写资源字节点地址
			l =ICAN_ReBuff[order].ucDataBuff[0];//资源地址的子地址
			if(i==IOParameter){//IO参数
			   	if(ICAN_ReBuff[order].ucDataCtr<5){//资源配置数量为4字节
				    for(j=1;j<ICAN_ReBuff[order].ucDataCtr;j++,l++){
						//将接收缓冲数据送入目标资源
						SourceType[order][l] = ICAN_TrBuff[order].ucDataBuff[j]; //读取指定单元的地址	
					}
				}else{
					//参数非法
					ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
					return;
				}
			}else if(i==IOConfigure){//IO配置
			   	if(ICAN_ReBuff[order].ucDataCtr<32){//资源配置数量为4字节
				    for(j=1;j<ICAN_ReBuff[order].ucDataCtr;j++,l++){
						//将接收缓冲数据送入目标资源
						ICAN_IOconfig[order][l] = ICAN_TrBuff[order].ucDataBuff[j]; //读取指定单元的地址	
					}
				}else{
					//参数非法
					ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
					return;
				}
			}else{//其他资源子地址无效
					//参数非法
					ICAN_ErrorIDACK(order, ErrID_NotSourceID) ;//错误代码返回报文//参数非法
					return;
			}
		}else{//写普通资源节点
		    i = sourceID; //获取资源节点的地址
		    if((i<0x20)||((i>=40)&&(i<60))){//只读区进行写
					ICAN_ErrorIDACK(order, ErrID_OprationInvalid) ;//错误代码返回报文//操作无效
					return;
			}
			for(j=0;j<ICAN_ReBuff[order].ucDataCtr;j++,i++){
				ICAN_Source[order].Area[i]=ICAN_ReBuff[order].ucDataBuff[j];//将数据写入对应的资源区
			}
		}
	    ICAN_ObjIDTmp.SourceID = ICANSlav_ObjID[order].SourceID; //资源节点编号
	    ICAN_ObjIDTmp.FUNCID = 0x01; //写功能码
	    ICAN_ObjIDTmp.ACK = 1; //应答标志
	    ICAN_ObjIDTmp.DestMACID = ICAN_Source[order].Area[MasterMACID]; //目标节点编号
	    ICAN_ObjIDTmp.SrcMACID = ICAN_Source[order].Area[MACID]; //源节点编号
	    ICAN_TrBuff[order].ulID = ICAN_ObjIDManage(&ICAN_ObjIDTmp); //生成ICAN报文ID
	    ICAN_TrBuff[order].ucXID = 1; //  0 标准帧;1 扩展帧//  
	    ICAN_TrBuff[order].ucDataLenth = 1; //  数据场长度1字节//
	    ICAN_TrBuff[order].ucDataCtr = 0; //  读数据指针指0字节//
	    ICAN_TrBuff[order].TrBegin = 1; //发送开始标志置位	
		WriteTest=0;//保护标志无效
	}else if(i==1){//接收到第一个段
			if(WriteTest!=0){//接收过程被重刷新
				ICAN_ErrorIDACK(order, ErrID_WriteError) ;//错误代码返回报文//参数非法
				return;
			}
			for (l = 1; l < 8; l++) {
	            //将数据送入接收缓冲
	            ICAN_ReBuff[order].ucDataBuff[ICAN_ReBuff[order].ucDataCtr++] =pCANFrame->ucDataBuff[l]; //读取缓冲区中的数据	
	        }
			WriteTest=2;//下一段为02段
	}else{//数据接收中间段
		if(WriteTest!=i){//接收过程帧格式不正确
			ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
			return;
		}
		WriteTest++;//指向下一个帧
        for (l = 1; l < 8; l++) {
            //将数据送入接收缓冲
            ICAN_ReBuff[order].ucDataBuff[ICAN_ReBuff[order].ucDataCtr++] =pCANFrame->ucDataBuff[l]; //读取缓冲区中的数据	
        }
	    if (ICAN_ReBuff[order].ucDataCtr>=32) {//一次最多能读32单元超过则为无效,资源节点超过255也是非法
			//参数非法
			ICAN_ErrorIDACK(order, ErrID_ParameterError) ;//错误代码返回报文//参数非法
			return;
	    }
	}
}
//****************************************************************************
//函数名称: 
//函数功能: 
//输入参数: 
//          
//          
//输出参数: 
//返 回 值: 
//创建日期: 2008.05.04
//创 建 人: 
//参考文档:
//说    明: 
//修改历史:
//****************************************************************************
void iCAN_CyclicACK(uchar order) {
    ICAN_OBJ xdata ICAN_ObjIDTmp;
    uchar i, j, l;
	//输入端口定时循环或者状态改变传送命令
	if ( ICAN_Source[order].Area[MasterMACID] == NOMASTER ) {//连接不存在

	    ICAN_ErrorIDACK(order, ErrID_NotConnect) ;//错误代码返回报文连接不存在
		return;
	} 
  //  i=0x00;//(DI区)
//	j = SourceType[order][0]; //获取资源节点的地址(DI区)
	i=0x40;//(AI区)
    j = SourceType[order][2]; //获取资源节点的地址(AI区)
	ICAN_ObjIDTmp.SourceID =i; //资源节点编号(AI区)
    ICAN_ObjIDTmp.FUNCID = 0x03; //循环标志功能码
    ICAN_ObjIDTmp.ACK = 1; //应答标志
    ICAN_ObjIDTmp.DestMACID = ICAN_Source[order].Area[MasterMACID]; //目标节点编号
    ICAN_ObjIDTmp.SrcMACID = ICAN_Source[order].Area[MACID]; //源节点编号
    ICAN_TrBuffC[order].ulID = ICAN_ObjIDManage(&ICAN_ObjIDTmp); //生成ICAN报文ID
    ICAN_TrBuffC[order].ucXID = 1; //  0 标准帧;1 扩展帧//  
       
	for (l = 0; l < j; l++, i++) {//读取正常数据//最多读取32字节
	    //将数据送入接收缓冲
	    ICAN_TrBuffC[order].ucDataBuff[l] = ICAN_Source[order].Area[i]; //读取指定单元的地址	
	}
    ICAN_TrBuffC[order].ucDataLenth = j + 1; //  数据场长度k字节//
    ICAN_TrBuffC[order].ucDataCtr = 0; //  读数据指针指0字节//
    ICAN_TrBuffC[order].TrBegin = 1; //发送开始标志置位	
}

//****************************************************************************
//函数名称: 
//函数功能: 
//输入参数: 
//          
//          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -