今天遇到棘手问题,IAR编译连接报Err[Li006] duplicate definition for“_A_u16size”
Err[Li006] duplicate definition for“_A_u16size”然后在什么文件和什么文件中。
我发现只有包含我写的某个头文件就会报这个错,关键是我根本没有用_A_u16size这个变量,头文件中就没有个定义变量,只是有define和struct,还有函数声明,求解!!
度娘和谷哥都没有找到答案
附上代码,望解救
/*
*filename APP_Protocol.h
*author JYYu
*date 2013/06/21
*/
#ifndef __APP_PROTOCOL_H_
#define __APP_PROTOCOL_H_
#define WILDCARD_FRAME 0xAA
/*协议帧相关*/
#defineSFD_FRAME0x68
#defineEPD_FRAME0x16
#define C_DIRC_DOWN 0
#define C_DIRC_UP1
#define C_ACK_TRUE0
#define C_ACK_ERR1
#define C_FLWF_NO0
#define C_FLWF_HAVE1
#define C_FUN_BODCATIMING 0x08
#define C_FUN_READDAT0x11
#define C_FUN_READFLWF0x12
#define C_FUN_READADDR0x13
#define C_FUN_WRITEDAT0x14
#define C_FUN_WRITEADDR0x15
#defineC_FUN_WRITEBAUD0x17
#define C_FUN_WRITEPW0x18
#define C_FUN_RTUWARN0x19
#define C_FUN_WARNACK0x1A
#define C_FUN_RECORDRESET0x1B
#define C_FUN_RTUCONTL0x1C
#define ERR_DATA_FRAME0x01
#define ERR_NODI_FRAME0x02
#define ERR_PW_FRAME0x04
#define ERR_BAUD_FRAME0x08
#define ERR_CONTL_FRAME0x10
#define MAX_DAT_BUF_SIZE 200
#define MAX_BYTE_TIME_FRAME500
#define MIN_ACK_TIME_FRAME20
#define MAX_ACK_TIME_FRAME500
#define IS_NOR_CONTL_FUN_OK(FUN)(((FUN)==C_FUN_BODCATIMING)||\
((FUN)==C_FUN_READDAT)||\
((FUN)==C_FUN_READFLWF)||\
((FUN)==C_FUN_READADDR)||\
((FUN)==C_FUN_WRITEDAT)||\
((FUN)==C_FUN_WRITEADDR)||\
((FUN)==C_FUN_WRITEBAUD)||\
((FUN)==C_FUN_WRITEPW)||\
((FUN)==C_FUN_RECORDRESET)||\
((FUN)==C_FUN_RTUCONTL))
enum PROTOCOL_STA{
STA_idel=0,
STA_add,
STA_contl,
STA_leng,
STA_data,
STA_cs,
STA_endframe,
STA_ack_pro,
STA_ack_send
};
union CONTROL{
struct{
unsigned char dirc:1;//传输方向0:down,1:up
unsigned char ack:1;//应答标志0:true,1:err
unsigned char flwf:1;//后续帧标志0:no folow,1:have folow frame
unsigned char fun:5;//功能码
}bit;
unsigned char ch;
};
struct PROTOCOL_INF{
enum PROTOCOL_STA Sta;
unsigned char Broadcast_Flag;
unsigned long ulLastByteRecvTim;
int ires;
union CONTROL Contrl;
unsigned char ucLength;
unsigned char* pData_Recv;
unsigned char* pFrameBuf_Send;
unsigned char ucCs;
};
/****** 协议数据项相关 *******/
/***** DEFINE ******/
/*运行状态字1*/
#define R_NORMAL0
#define R_LEAK_ERR2
#define R_QueLing_ERR4
#define R_GuoZai_ERR5
#define R_Duanlu_ERR6
#define R_QueXiang_ERR7
#define R_QianYa_ERR8
#define R_GuoYa_ERR9
#define R_JieDi_ERR10
#define R_TingDian_ERR11
#define R_Dingshi_Cut12
#define R_YuanCheng_Cut13
#define R_AnJian_Cut14
#define R_BiSuo_Cut15
#define R_ShouDong_Cut18
#define R_HuGanQing_ERR16
#define R_HeZha_ERR17
#define R_SheZhiGengGai19
/***** STRUCT ******/
/*
*当前变量
*不存EEPROM
*/
struct RTU_DAT{
unsigned charVol_A[2];
unsigned charVol_B[2];
unsigned charVol_C[2];
unsigned charCur_A[3];
unsigned charCur_B[3];
unsigned charCur_C[3];
unsigned charLeakPhase;
unsigned charLeak[2];
unsigned charRLCutVal[2];//额定剩余电流动作值(ma)
unsigned charRLTim[2];//额定不驱动时间(ms)
};
/*运行状态字1*/
union RUNSTATE_1{
struct{
unsigned char gz:1;//告警状态 0-无告警,1-有告警
unsigned char zz:2;//闸位状态 00-合闸,01-保留,10-重合闸,11-闭锁状态
unsigned char Reason:5;//跳闸告警原因 00000-正常运行,00010-剩余电流,00100-缺零,00101-过载,
//00110-短路,00111-缺相,01000-欠压, 01001-过压,01010-接地,
//01011-停电,01100-定时试验,01101-远程, 01110-模拟按键试验,
//01111-闭锁,10010-手动,10000-互感器故障,10001-合闸失败,10011-设置更改
}bit;
unsigned char ch;
};
/*运行状态字2*/
union RUNSTATE_2{
struct{
unsigned char dangw:1;//当前档位0:1档,1:2档
unsigned char :4;
unsigned char tcz :3;//跳闸次数指针
}bit;
unsigned char ch;
};
/*控制字1*/
union CONTRLWORD_1{
struct{
unsigned char :1;
unsigned char sg:1; //数据告警date warn1-全允许。0-全禁止
unsigned char gd:1; //告警灯光warn light
unsigned char gs:1; //告警声音warn sound
unsigned char ds:1; //定时试跳time cut
unsigned char df:1; //档位返回geat back
unsigned char ch:1; //重合闸 re switch in
unsigned char :1;
}bit;
unsigned char ch;
};
/*控制字2*/
union CONTRLWORD_2{
struct{
unsigned char qysg:1;//欠压数据告警 1-允许,0-禁止
unsigned char qytk:1;//欠压跳闸控制
unsigned char gysg:1;//过压数据告警
unsigned char gytk:1;//过压跳闸控制
unsigned char qxsg:1;//缺相数据告警
unsigned char qxtk:1;//缺相跳闸控制
unsigned char glsg:1;//过流数据告警
unsigned char gltk:1;//过流跳闸控制
}bit;
unsigned char ch;
};
/*控制字3*/
union CONTRLWORD_3{
struct{
unsigned char sty:1;//试跳源 0-内部,1-外部
unsigned char :5;
unsigned char qlsg:1;//缺零保护数据告警
unsigned char qltk:1;//缺零保护跳闸控制
}bit;
unsigned char ch;
};
/*控制字4*/
union CONTRLWORD_4{
struct{
unsigned char esddz:4;//额定剩余电流动作值
unsigned char ejbs:2;//额定极限不动作时间
unsigned char sdgs:2;//剩余电流告警时间
}bit;
unsigned char ch;
};
/*控制字5*/
union CONTRLWORD_5{
unsigned char ch;
};
/*
*累计记录,掉电时存,上电读
*/
struct {
unsigned short int u16size;
//累计记录
unsigned charDateClrTim[3];//数据清零次数,不允许清零
unsigned char TotCutTim[2];//总跳闸次数
unsigned char BSXCutTim[2];//闭锁性跳闸次数
unsigned charLeakProtectCTim[2];//剩余电流保护跳闸次数
unsigned charCurProtectCTim[2];//电流保护跳闸次数
unsigned charVolProtectCTim[2];//电压保护跳闸次数
unsigned charSDBSCutTim[2];//手动闭锁跳闸次数
unsigned charLackNullCutTim[2];//缺零保护跳闸次数
unsigned charTestCutTim[2];//实验跳闸次数(定时,远程,按键)
unsigned charQuitLeakTim[2];//退出剩余电流保护次数
unsigned char DviceRunMin[4];//设备运行时间(min)
};
/*
*Tab A.3.1
*异常告警数据单元格式
*/
struct TAB_A_3_1{
union RUNSTATE_1RunState_1;//运行状态字1
union RUNSTATE_2RunState_2;//运行状态字2
unsigned charPhase;//故障相位
unsigned charPra[3];//参数
union CONTRLWORD_1 CW_1;
union CONTRLWORD_2 CW_2;
union CONTRLWORD_3 CW_3;
union CONTRLWORD_4 CW_4;
union CONTRLWORD_5 CW_5;
};
/*
*Tab A.3.2
*剩余电流日最大、最小值数据单元格式
*/
struct TAB_A_3_2{
unsigned charLeakPhase;//剩余电流最大相
unsigned char Leak;//剩余电流
unsigned charHapTim[6];//发生时刻
};
/*
*Tab A.3.3
*电压日最大、最小值数据单元格式
*/
struct TAB_A_3_3{
unsigned charVol[2];//电压值
unsigned char HapTim[6];//发生时刻
};
/*
*Tab A.3.4
*电流日最大、最小值数据单元格式
*/
struct TAB_A_3_4{
unsigned char Cur[3];//电流值
unsigned charHapTim[6];//发生时刻
};
/*
*Tab A.3.5
*剩余电流超限事件数据单元格式
*/
struct TAB_A_3_5{
unsigned char LeakPhase;//剩余电流最大相
unsigned char Leak[2];//剩余电流
unsigned char StartTim[6];//开始时间
unsigned charEndTim[6];//结束时间
};
/*
*Tab A.3.6
*保护器自检数据单元格式
*/
struct TAB_A_3_6{
unsigned char Result;//自检结果
unsigned char HapTim[6];//自检时间
unsigned charCheak;//自检方式
unsigned char LeakPhase;//自检前剩余电流最大相
unsigned char Leak[2];//自检前剩余电流
unsigned charVol_A[2];//跳闸前A相电压值
unsigned char Vol_B[2];
unsigned char Vol_C[2];
unsigned charCur_A[3];//跳闸前A相电流值
unsigned charCur_B[3];
unsigned char Cur_C[3];
};
/*
*Tab A.3.7
*跳闸事件数据单元格式
*/
struct TAB_A_3_7{
unsigned charReason;//故障原因
unsigned charPhase;//故障相别
unsigned charHapTim[6];//发生时刻
unsigned charLeak[2];//跳闸前剩余电流值
unsigned charVol_A[2];//跳闸前A相电压值
unsigned char Vol_B[2];
unsigned char Vol_C[2];
unsigned charCur_A[3];//跳闸前A相电流值
unsigned charCur_B[3];
unsigned char Cur_C[3];
};
/*
*Tab A.3.8
*剩余电流报警事件数据单元格式
*/
struct TAB_A_3_8{
unsigned charWarnStarTim[6];//报警开始时刻
unsigned charWarnEndTim[6];//报警结束时刻
};
/*
*Tab A.3.9
*剩余电流记录数据单元格式
*/
struct TAB_A_3_9{
unsigned char LeakMaxPhase;//剩余电流最大相
unsigned charLeak[2];//剩余电流
unsigned charHapTim[6];//发生时刻
};
/*
*参数变量
*结构中的参数改变之后存到E2P里
*/
struct RTU_PRA{
unsigned short int u16size;
//参数变量
unsigned char CommAddr[6];//终端地址
unsigned char DviceNumb[6];//设备号
unsigned charAssectsNum[32];//资产管理编号
unsigned charu8Baudrate;//波特率
unsigned charPassWord[3][4];//密码
union CONTRLWORD_1 CW_1;
union CONTRLWORD_2 CW_2;
union CONTRLWORD_3 CW_3;
union CONTRLWORD_4 CW_4;
union CONTRLWORD_5 CW_5;
unsigned char LeakWarnVal[2];//剩余电流超限报警整定值
unsigned charLeakRecordChVal;//剩余电流记录变化差值整定值(10-99)ma
unsigned charLeakRecordTiVal;//剩余电流记录时间间隔整定值(1-99)min
unsigned char TimCutVal[3];//定时试跳整定时间
unsigned char LagVolVal[2];//过电压整定值
unsigned charLesVolVal[2];//欠压整定值
unsigned charQueXiangVol[2];//缺相整定值
unsigned charCurVal[3];//额定电流整定值
unsigned charCurwarnVal;//电流超限报警整定值 (*0.1In额定电流整定值)
};
/*运行状态字总*/
struct RTU_RUNSTATE{
union RUNSTATE_1 sta1;
union RUNSTATE_2 sta2;
};
void Pro_485(void );
void Pro_Protocol_Recv(unsigned char ch, struct PROTOCOL_INF* pro_inf);
int checkaddr(unsigned char ch ,unsigned char ucdx);
void Pro_Protocol_Send(struct PROTOCOL_INF* pro_inf );
void start_send(struct PROTOCOL_INF* pro_inf);
void fill_ERR_frame(struct PROTOCOL_INF* pro_inf,unsigned char err);
void fill_TRUE_frame(struct PROTOCOL_INF* pro_inf);
void add_byte_2frame(unsigned char* ptr, int *pires, unsigned char ch);
void init_frame(unsigned char* ptr, int * pires);
void broadcast_timing(struct PROTOCOL_INF* pro_inf );
void read_dat(struct PROTOCOL_INF* pro_inf );
void read_flwframe(struct PROTOCOL_INF* pro_inf );
void read_addr(struct PROTOCOL_INF* pro_inf );
void write_dat(struct PROTOCOL_INF* pro_inf );
void write_addr(struct PROTOCOL_INF* pro_inf );
void write_BAUD(struct PROTOCOL_INF* pro_inf );
void write_password(struct PROTOCOL_INF* pro_inf );
void record_reset(struct PROTOCOL_INF* pro_inf );
void RTU_control(struct PROTOCOL_INF* pro_inf );
int Check_Password(const unsigned char* p);
#endif