CANoe模拟gptp报文实现时间同步

实现诊断的过程要先实现时间同步,研究了一下,记录一下,方便以后出现问题再用

配置过程,一开始发送了报文,但是就是同步不成功,还以为自己的问题,原来CANoe需要配置

配置过程

这里不能丢弃,丢弃就会出现问题

c 复制代码
/*@!Encoding:65001*/
includes
{

}

variables
{

  word g_sequenceID_sync_followUp=1;//sequenceID供g_syncMessage和g_followUpMssage
  word g_sequenceID_peerDelay=1;//sequenceID供g_peerDelayRespMessage和g_peerDelayFollowUpMssage
  byte g_syncMessage[50];
  byte g_followUpMssage[80];
  byte g_peerDelayRespMessage[58];
  byte g_peerDelayFollowUpMssage[58];
  msTimer syncTimeCycle;

  msTimer syncTimeCycle1;

  ethernetPacket g_syncMessagePacket;
  ethernetPacket g_followUpMssagePacket;
  ethernetPacket g_peerDelayRespMessagePacket;
  ethernetPacket g_peerDelayFollowUpMssagePacket;
  int syncTimeInitSuccess_flag=0;

  byte sourcePortID[8];

  qword g_Tester_MAC=0;//测试仪MAC
  qword g_LLDP_Multicast=0;//时间同步目的地址
}

on timer syncTimeCycle
{
  send_sync_followUpsync_followUp();
  setTimer(syncTimeCycle,125);

}

on timer syncTimeCycle1
{
  int i;
  dword currTime;
  qword num;

  for(i=44;i<44+8;i++)
  {
    g_peerDelayRespMessagePacket.byte(i)=sourcePortID[i-44];
    g_peerDelayFollowUpMssagePacket.byte(i)=sourcePortID[i-44];
    write("哈哈哈啊 %d %02x",i-44,sourcePortID[i-44]);
  }


  g_peerDelayRespMessagePacket.byte(30)=((g_sequenceID_peerDelay>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(31)=((g_sequenceID_peerDelay)&0xff);

  currTime=timeNow();
  num=(qword)(currTime/100000.0);

  g_peerDelayRespMessagePacket.byte(34)=0x00;
  g_peerDelayRespMessagePacket.byte(35)=0x00;
  g_peerDelayRespMessagePacket.byte(36)=0x00;
  g_peerDelayRespMessagePacket.byte(37)=((num>>16)&0xff);
  g_peerDelayRespMessagePacket.byte(38)=((num>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(39)=((num)&0xff);

  num=(qword)(currTime%100000)*10000;
  g_peerDelayRespMessagePacket.byte(40)=((num>>24)&0xff);
  g_peerDelayRespMessagePacket.byte(41)=((num>>16)&0xff);
  g_peerDelayRespMessagePacket.byte(42)=((num>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(43)=((num)&0xff);

  output(g_peerDelayRespMessagePacket);


  g_peerDelayFollowUpMssagePacket.byte(30)=((g_sequenceID_peerDelay>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(31)=((g_sequenceID_peerDelay)&0xff);
  currTime=timeNow();
  num=(qword)(currTime/100000.0);

  g_peerDelayFollowUpMssagePacket.byte(34)=((num>>40)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(35)=((num>>32)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(36)=((num>>24)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(37)=((num>>16)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(38)=((num>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(39)=((num)&0xff);

  num=(qword)(currTime%100000)*10000+1000;
  g_peerDelayFollowUpMssagePacket.byte(40)=((num>>24)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(41)=((num>>16)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(42)=((num>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(43)=((num)&0xff);



  output(g_peerDelayFollowUpMssagePacket);

}


on ethernetPacket *
{
  int i;
  return;
  if(this.type == 0x88f7 && this.byte(0)==0x12 && this.dir == rx && syncTimeInitSuccess_flag==1)
  {
    write("收到时间同步");
    g_sequenceID_peerDelay=this.byte(30)*0x100+this.byte(31);
    for(i=20;i<28;i++)
    {
      sourcePortID[i-20]=this.byte(i);
    }
    send_peerDelay();
  }


}

void timeSyncInit()
{
  int i;
  char syncMessage[200]="1002002c00000208000000000000000000000000009acdfffe0000210001004200fd00000000000000000000";
  char followUpMssage[200]="1802004c00000008000000000000000000000000009acdfffe0000210001004202fd00006a8ced24006ac2780003001c0080c200000100000000000000000000000000000000000000000000";
  char peerDelayRespMessage[200]="1302003600000208000000000000000000000000024700fffe0000280001000e057f00000000001513219c901243abfffef14faf0001";
  char peerDelayFollowUpMssage[200]="1a02003600000008000000000000000000000000024700fffe0000280001000e057f000000000015132440491243abfffef14faf0001";



  g_syncMessagePacket.Length=44;
  for(i=0;i<strlen(syncMessage);i=i+2)
  {
    g_syncMessagePacket.byte(i/2)=charToNum( syncMessage[i])*0x10+charToNum( syncMessage[i+1]);
  }


  g_followUpMssagePacket.Length=76;
  for(i=0;i<strlen(followUpMssage);i=i+2)
  {
    g_followUpMssagePacket.byte(i/2)=charToNum( followUpMssage[i])*0x10+charToNum( followUpMssage[i+1]);
  }

  g_peerDelayRespMessagePacket.Length=54;
  for(i=0;i<strlen(peerDelayRespMessage);i=i+2)
  {
    g_peerDelayRespMessagePacket.byte(i/2)=charToNum( peerDelayRespMessage[i])*0x10+charToNum( peerDelayRespMessage[i+1]);
  }

  g_peerDelayFollowUpMssagePacket.Length=54;
  for(i=0;i<strlen(peerDelayFollowUpMssage);i=i+2)
  {
    g_peerDelayFollowUpMssagePacket.byte(i/2)=charToNum( peerDelayFollowUpMssage[i])*0x10+charToNum( peerDelayFollowUpMssage[i+1]);
  }

  g_Tester_MAC=EthGetMacAddressAsNumber("00:9a:cd:00:00:21");
  g_LLDP_Multicast=EthGetMacAddressAsNumber("01:80:c2:00:00:0e");

  WRITE("地址 %012llX ",g_Tester_MAC);

  g_syncMessagePacket.msgChannel = 1;
  g_syncMessagePacket.source      = g_Tester_MAC;
  g_syncMessagePacket.destination = g_LLDP_Multicast;
  g_syncMessagePacket.type        = 0x88f7;

  g_syncMessagePacket.byte(20)=((g_Tester_MAC)&0xff);
  g_syncMessagePacket.byte(21)=((g_Tester_MAC>>8)&0xff);
  g_syncMessagePacket.byte(22)=((g_Tester_MAC>>16)&0xff);
  g_syncMessagePacket.byte(23)=0xff;
  g_syncMessagePacket.byte(24)=0xfe;
  g_syncMessagePacket.byte(25)=((g_Tester_MAC>>24)&0xff);
  g_syncMessagePacket.byte(26)=((g_Tester_MAC>>32)&0xff);
  g_syncMessagePacket.byte(27)=((g_Tester_MAC>>40)&0xff);

  g_followUpMssagePacket.msgChannel = 1;
  g_followUpMssagePacket.source      = g_Tester_MAC;
  g_followUpMssagePacket.destination = g_LLDP_Multicast;
  g_followUpMssagePacket.type        = 0x88f7;

  g_followUpMssagePacket.byte(20)=((g_Tester_MAC)&0xff);
  g_followUpMssagePacket.byte(21)=((g_Tester_MAC>>8)&0xff);
  g_followUpMssagePacket.byte(22)=((g_Tester_MAC>>16)&0xff);
  g_followUpMssagePacket.byte(23)=0xff;
  g_followUpMssagePacket.byte(24)=0xfe;
  g_followUpMssagePacket.byte(25)=((g_Tester_MAC>>24)&0xff);
  g_followUpMssagePacket.byte(26)=((g_Tester_MAC>>32)&0xff);
  g_followUpMssagePacket.byte(27)=((g_Tester_MAC>>40)&0xff);

  g_peerDelayRespMessagePacket.msgChannel = 1;
  g_peerDelayRespMessagePacket.source      = g_Tester_MAC;
  g_peerDelayRespMessagePacket.destination = g_LLDP_Multicast;
  g_peerDelayRespMessagePacket.type        = 0x88f7;



  g_peerDelayRespMessagePacket.byte(20)=((g_Tester_MAC)&0xff);
  g_peerDelayRespMessagePacket.byte(21)=((g_Tester_MAC>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(22)=((g_Tester_MAC>>16)&0xff);
  g_peerDelayRespMessagePacket.byte(23)=0xff;
  g_peerDelayRespMessagePacket.byte(24)=0xfe;
  g_peerDelayRespMessagePacket.byte(25)=((g_Tester_MAC>>24)&0xff);
  g_peerDelayRespMessagePacket.byte(26)=((g_Tester_MAC>>32)&0xff);
  g_peerDelayRespMessagePacket.byte(27)=((g_Tester_MAC>>40)&0xff);

  g_peerDelayFollowUpMssagePacket.msgChannel = 1;
  g_peerDelayFollowUpMssagePacket.source      = g_Tester_MAC;
  g_peerDelayFollowUpMssagePacket.destination = g_LLDP_Multicast;
  g_peerDelayFollowUpMssagePacket.type        = 0x88f7;

  g_peerDelayFollowUpMssagePacket.byte(20)=((g_Tester_MAC)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(21)=((g_Tester_MAC>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(22)=((g_Tester_MAC>>16)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(23)=0xff;
  g_peerDelayFollowUpMssagePacket.byte(24)=0xfe;
  g_peerDelayFollowUpMssagePacket.byte(25)=((g_Tester_MAC>>24)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(26)=((g_Tester_MAC>>32)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(27)=((g_Tester_MAC>>40)&0xff);



  syncTimeInitSuccess_flag=1;

  setTimer(syncTimeCycle,1);
}


void send_sync_followUpsync_followUp()
{
  dword currTime;
  qword num;




  g_syncMessagePacket.byte(30)=((g_sequenceID_sync_followUp>>8)&0xff);
  g_syncMessagePacket.byte(31)=((g_sequenceID_sync_followUp)&0xff);

  output(g_syncMessagePacket);

  g_followUpMssagePacket.byte(30)=((g_sequenceID_sync_followUp>>8)&0xff);
  g_followUpMssagePacket.byte(31)=((g_sequenceID_sync_followUp)&0xff);



  currTime=timeNow();
  num=(qword)(currTime/100000.0)+1787620644;

  g_followUpMssagePacket.byte(34)=((num>>40)&0xff);;
  g_followUpMssagePacket.byte(35)=((num>>32)&0xff);;
  g_followUpMssagePacket.byte(36)=((num>>24)&0xff);;
  g_followUpMssagePacket.byte(37)=((num>>16)&0xff);
  g_followUpMssagePacket.byte(38)=((num>>8)&0xff);
  g_followUpMssagePacket.byte(39)=((num)&0xff);

  num=(currTime%100000)*10000;
  g_followUpMssagePacket.byte(40)=((num>>24)&0xff);
  g_followUpMssagePacket.byte(41)=((num>>16)&0xff);
  g_followUpMssagePacket.byte(42)=((num>>8)&0xff);
  g_followUpMssagePacket.byte(43)=((num)&0xff);

 write("我看看 %lld",timeNow());
  output(g_followUpMssagePacket);
  g_sequenceID_sync_followUp++;
}

void send_peerDelay()
{
  int i;
  dword currTime;
  qword num;
  setTimer(syncTimeCycle1,5);
  return;

  for(i=44;i<44+8;i++)
  {
    g_peerDelayRespMessagePacket.byte(i)=sourcePortID[i-44];
    g_peerDelayFollowUpMssagePacket.byte(i)=sourcePortID[i-44];
    write("哈哈哈啊 %d %02x",i-44,sourcePortID[i-44]);
  }


  g_peerDelayRespMessagePacket.byte(30)=((g_sequenceID_peerDelay>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(31)=((g_sequenceID_peerDelay)&0xff);

  currTime=timeNow();
  num=(qword)(currTime/100000.0);

  g_peerDelayRespMessagePacket.byte(34)=0x00;
  g_peerDelayRespMessagePacket.byte(35)=0x00;
  g_peerDelayRespMessagePacket.byte(36)=0x00;
  g_peerDelayRespMessagePacket.byte(37)=((num>>16)&0xff);
  g_peerDelayRespMessagePacket.byte(38)=((num>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(39)=((num)&0xff);

  num=(qword)(currTime%100000)*10000;
  g_peerDelayRespMessagePacket.byte(40)=((num>>24)&0xff);
  g_peerDelayRespMessagePacket.byte(41)=((num>>16)&0xff);
  g_peerDelayRespMessagePacket.byte(42)=((num>>8)&0xff);
  g_peerDelayRespMessagePacket.byte(43)=((num)&0xff);

  output(g_peerDelayRespMessagePacket);


  g_peerDelayFollowUpMssagePacket.byte(30)=((g_sequenceID_peerDelay>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(31)=((g_sequenceID_peerDelay)&0xff);
  currTime=timeNow();
  num=(qword)(currTime/100000.0);

  g_peerDelayFollowUpMssagePacket.byte(34)=((num>>40)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(35)=((num>>32)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(36)=((num>>24)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(37)=((num>>16)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(38)=((num>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(39)=((num)&0xff);

  num=(qword)(currTime%100000)*10000+1000;
  g_peerDelayFollowUpMssagePacket.byte(40)=((num>>24)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(41)=((num>>16)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(42)=((num>>8)&0xff);
  g_peerDelayFollowUpMssagePacket.byte(43)=((num)&0xff);



  output(g_peerDelayFollowUpMssagePacket);
  //g_sequenceID_peerDelay++;
}

byte charToNum(char str1)
{
  if(str1>='0' &&  str1<='9')
  {
    return str1-'0';
  }

  if(str1>='a' && str1 <='z')
  {
    return str1-'a'+0xA;
  }

  if(str1>='A' && str1 <='Z')
  {
    return str1-'A'+0xA;
  }

  return 0;
}

on start
{
 timeSyncInit();

}
相关推荐
蚂蚁小兵15 天前
VH1150_VH1160_安装与_CANoe_示例配置
vector·canoe
蚂蚁小兵20 天前
如何使用CANape将标定后的数据刷写到ECU中
vector·canoe
蚂蚁小兵22 天前
CANape_如何解决标定窗口无法标定的问题
vector·capl·canoe
蚂蚁小兵24 天前
Panel控件CAPL_Output_View与HexText_Editor的区别及用法
vector·capl·canoe
蚂蚁小兵25 天前
在_CANoe_中设置_XCP_设备
vector·capl·canoe
蚂蚁小兵1 个月前
如何解决CANoe_CANalyzer中的Stuff_Error问题
vector·capl·canoe
蚂蚁小兵1 个月前
使用_CANape_vSignalyzer_进行数据分析
vector·capl·canoe
蚂蚁小兵1 个月前
在两条 CAN 总线之间设置网关(Setting Up a Gateway between Two CAN Busses)
vector·capl·canoe
無斜5 个月前
【CAPL实用开发】--- CAPL调用 .NET DLL
开发语言·c#·capl·canoe