此代码实现以下功能
1:实现固定ID报文如0x100-0x200的报文发送,并可以设置一个期望达到的总线负载率。
2:检测总线负载率的检测,并可以调节总线负载率。
/*@!Encoding:936*/
includes
{
}
variables
{
message 0x601 Msg_0x601= //注意,代码自定义Message可以与NetWork(网络)绑定。 如使用以 // 下格式message CAN1.0x601 Msg_0x601.CAN1就是NetWork(网络)名称
{
FDF=1,
BRS=1,
DLC=8,
Byte(0)=0,
Byte(1)=0,
Byte(2)=0,
Byte(3)=0,
Byte(4)=0,
Byte(5)=0,
Byte(6)=0,
Byte(7)=0
};
msTimer CycleTime_LRSRR_Load; /*定义一个计时器,用来循环发送*/
float CheckBusLoad; //用来获取总线负载率
const float SetBusLoad=60; //预先设定一个总线负载率,如60
const float loadMistake =2; //预先设定一个总线负载率误差,如2
word TimePar_1=60; //定义一个初值,用于计时器的定时初值
int LoopVar_1_0x601=0;
const byte AppChnel=3;
on sysvar LRSRR_SYSVAR::RLSRR_CAN_BusLoad_Begin_Flag //设置一个系统变量用来开启定时器
{
if(@sysvar::LRSRR_SYSVAR::RLSRR_CAN_BusLoad_Begin_Flag) //如果判断条件!=1,则计时器不会开启,计时器不开启,报文就不会循环发送
{
setTimer(CycleTime_LRSRR_Load,TimePar); //初始化,计时器
}
}
on timer CycleTime_LRSRR_Load //计时开始
{
if(@sysvar::LRSRR_SYSVAR::RLSRR_CAN_BusLoad_Begin_Flag)
{
setTimer(CycleTime_LRSRR_Load,TimePar); //重置计时器
while((Msg_0x601.id)<0x632)
{
output(Msg_0x601);
Msg_0x601.id+=1;
output(Msg_0x601);
CheckBusLoad=canGetBusLoad(3); //canGetBusLoad()是检测函数,3代表ApplicationChannel:can3
write("LookLRSRR_BusLoad%f",BusLoad);
if(CheckBusLoad<=(SetBusLoad-loadMistake)) //如果总线负载率小于设置,定时参数减小,增大负载率
TimePar_1-=1;
else if(CheckBusLoad>=(SetBusLoad-loadMistake)) //如果总线负载率大于设置,定时参数增大,减小负载率
TimePar_1+=1;
}
}
//Count_Trans=0;
Msg_0x602.id=0x602;
}
/*整个过程中,实现错误帧检测*/
on errorFrame
{
@sysvar::LRSRR_SYSVAR::ErrFlag=1; //检测周期内,实时检测,当出现错误帧则将系统变量错误标志位置1
write("LRSRR_SYSVAR::ErrFlag Value:%d",@sysvar::LRSRR_SYSVAR::ErrFlag);
}