📄 icanslave.c
字号:
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 + -