精华内容
下载资源
问答
  • CANoe中用CAPL脚本按特定格式发送报文需求实验环境功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居...

    CANoe中用CAPL脚本按特定格式发送报文


    最近学习用CANoe软件测试CAN总线,纯新手,把最近的学习心得分享一下,欢迎大佬指正。

    需求

    1)仿真开始报文默认以100ms的周期不间断发送
    1)报文周期和发送次数可控
    2)报文发送可随时暂停,暂停时间可控
    

    实验设备

    好吧!首先你得有个实验环境,我用的CANoe软件版本是:CANoe 12.0 SP5,Vector的CAN盒子量力而行~~

    实验环境

    1)DBC定义。我这里随便写了一个报文,里面包含三条信号
    在这里插入图片描述
    2)仿真环境
    说明一下,这里的环境仅仅是把仿真跑起来,大家不要纠结为什么那么多结点。
    在这里插入图片描述
    3)CAPL脚本
    带Button版本(各人比较倾向):

    /*@!Encoding:1252*/
    variables
    {
      int CycleTime = 100;        //发送周期初始值
      int NumTime = 100;         //发送次数
      int NumTime1 = 1;           //发送次数计数器
      int PauTime = 0;              //暂停时间,初始值0
      int CounterNum = 1;         //暂停时间计数器,初始值1
      int Mode = 0;                   //模式
    
      msTimer time_ms;
      
      message VCU_HMI_01 msg;
    }
    
    on start
    {
      setTimer(time_ms, 100);
    
    }
    
    on timer time_ms
    {
      if(CounterNum >  PauTime)
      {
        VCU_Control(CycleTime, NumTime);
      }
      else
      {
        CounterNum++;
        setTimer(time_ms, 1);
      }
    }
    
    on sysvar VCU::Button_1   //控制报文发送格式
    {
      if(@this == 1)
      {
          CycleTime = @VCU::TimeSel;
          NumTime = @VCU::NumSel;
          //write("The Current condition is ... %d", @this);
          write("The Current NumSel is ... %d", @VCU::NumSel);
          write("The Current TimeSel is ... %d", @VCU::TimeSel);
          Mode = 1;
        }
    }
    
      on sysvar VCU::Button_2    //控制发送暂停时间
    {
      if(@this == 1)
      {
          PauTime = @VCU::PauseTime;
          write("The Current PauseTime is ... %d", @VCU::PauseTime);
          CounterNum = 1;
      }
    }
    
    on sysvar VCU::Button_3    //初始化
    {
      if(@this == 1)
      {
        Mode = 0;
        CounterNum = 1;
        NumTime1 =1;
        @VCU::NumSel = 0;
        @VCU::TimeSel =100;
        @VCU::PauseTime = 0;
        write("The Current Condition is ... initialization");
      }
    }
    void VCU_Control(int CycleTimeTep, int NumTimeTep)
    {
      if(Mode == 1)
      {
        if(NumTimeTep == 0)
        {
          output(msg);
          setTimer(time_ms, CycleTimeTep);
        }
        if(NumTimeTep != 0)
        {
             if(NumTime1<=NumTimeTep)
                  {
                    output(msg);
                    write("The Send Num is ... %d", NumTime1);
                    NumTime1++;
                    setTimer(time_ms, CycleTimeTep);
                  }
              if(NumTime1>NumTimeTep)
                  {
                    Mode = 0;
                    NumTime1 = 1;
                  }
            }
      }
      if(Mode == 0)
      {
        output(msg);
        setTimer(time_ms, 100);
      }
    }
    

    效果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • CAPL】周期发送单条报文

    千次阅读 2020-01-18 16:58:22
    export testfunction SendSingleMsg(long MsgID, long CycleTime, long Special_posi, long Data) { message * Msg; long res; Msg.id=MsgID; Msg.dlc=8; Msg.byte(Special_posi)=Data;... output(...
    export testfunction SendSingleMsg(long MsgID, long CycleTime, long Special_posi, long Data)
    {
      message * Msg;
      long res;
      
      Msg.id=MsgID;
      Msg.dlc=8;
      Msg.byte(Special_posi)=Data;
        
      output(Msg);
      res=testWaitForMessage(MsgID);
      testStep(0,"res = %d",res);
      
      while(res==1)
    	  {
    	    testWaitForTimeout(CycleTime);
    	    output(Msg);
    	  }
    }
    
    展开全文
  • CANOE CAPL 实现以太网报文发送和接收

    千次阅读 2020-12-10 13:22:16
    CANOE CAPL 实现以太网报文发送和接收 一、上一片主要讲解以太网的发送,以及如何以HEX形式发送 这一篇主要讲解如何实现多端口发送,多端口接收报文,以及处理报文。 你好! 这是你第一次使用 Markdown编辑器 所展示...

    CANOE CAPL 实现以太网报文发送和接收

    概述
    上一片主要讲解以太网的发送,以及如何以HEX形式发送
    这一篇主要讲解如何实现多端口发送,多端口接收报文,以及处理报文。
    一、
    variables
    {
    UdpSocket gSocket1;//交流17681826077
    UdpSocket gSocket2;//55001 端口
    UdpSocket gSocket3;//30001端口
    }
    宗旨:一个工程里可以创建多个Socket,然后用端口绑定
    on start
    {
    gSocket1= UdpSocket::Open( IP_Endpoint(0.0.0.0:30490) );
    gSocket2 = UdpSocket::Open( IP_Endpoint(0.0.0.0:55000) );
    gSocket3 = UdpSocket::Open( IP_Endpoint(0.0.0.0:30001) );

    if (IpGetLastError() != 0)
    {
    write( “<%BASE_FILE_NAME%> UdpSocket::Open failed with result %d”, IpGetLastError() );
    }
    gSocket2.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) ); //对端口55000接收的数据做处理,为后面接收函数做准备
    }
    on preStop
    {
    // Close socket on measurement stop
    gSocket.Close();
    }

    以下这个函数是ASCLL转16进制关键函数
    byte GBF_ConvertHexStrToByteArray(char hexRawData[], byte outByteArr[])// ASCLL转16进制关键函数
    {
    word i;
    word offset;
    word hexLength;
    byte tmpVal;
    byte retVal;
    char tmpErrStr[200];
    byte outdword;
    const byte dataType = 2;
    byte gcNok = 0;
    byte gcOk = 1;
    // Init to failed
    retVal = gcNok;

    offset = 0;
    // Reset output
    outdword = 0;
    // get the hex length
    hexLength = strlen(hexRawData);
    //remove possible “0x” at the beginning
    if( hexRawData[0] == ‘0’ && hexRawData[1] == ‘x’ )
    offset = 2;

    /*(/check that the a dword (4 bytes) can hold the hex string
    if ( dataType < (hexLength - offset)/2 )
    {
    snprintf(tmpErrStr, elcount (tmpErrStr), “GBF_ConvertHexStrToInt: ERROR: Hex Data is %d which is more than a dword can hold!”, hexLength);
    write (“Error in GBF_ConvertHexStrToInt: string is: %s”,hexRawData);
    write(tmpErrStr);
    }
    else
    { */
    retVal = gcOk;
    //All checks went fine, convert data
    for (i = offset; i < hexLength; i++)
    {
    outdword = outdword << 4; //shift the result
    // convert the Hex data and validity check it
    tmpVal = (byte)hexRawData[i];
    if (tmpVal >= 0x30 && tmpVal <= 0x39) //0-9
    tmpVal = tmpVal - 0x30;
    else if(tmpVal >= ‘A’ && tmpVal <= ‘F’) //A-F
    tmpVal = tmpVal - 0x37;
    else if (tmpVal >= ‘a’ && tmpVal <= ‘f’) //a-f
    tmpVal = tmpVal - 0x57;
    else
    {
    snprintf(tmpErrStr, elcount (tmpErrStr), “GBF_ConvertHexStrToInt: ERROR: Invalid Hex data found in Hex string at position %d”, i);
    // write(tmpErrStr);
    retVal = gcNok;
    break;
    }
    outdword = outdword | tmpVal; //one nibble at a time…
    if(i%dataType == dataType-1)
    outByteArr[i/dataType] = outdword;
    }

    return retVal;
    }//ASCLL转16进制关键函数

    这个函数参见:https://blog.csdn.net/qq_34414530/article/details/107916856

    void OnUdpReceiveFrom( dword socket, long result, ip_Endpoint remoteEndpoint, byte buffer[], dword size)//最为关键的接收函数,此为回调函数
    {
    if (result == 0)
    {
    char endpointString[30];

    remoteEndpoint.PrintEndpointToString( endpointString );
    

    }

    if(buffer[0]==0x2&buffer[1]==0x1&buffer[2]==0x80&buffer[3]==0x1)//对接收的数据做判断,
    {

    sysSetVariableInt( sysvar::huts::a,buffer[32] );//对接收的数据做处理
    sysSetVariableInt( sysvar::huts::b,buffer[33] );//对接收的数据做处理
    

    }

    gSocket2.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) );
    }

    展开全文
  • 功能设计思路如下:  1:整车环境模型搭建  2:实时监控XXX节点的发送帧  3:模拟节点发送CAN帧,观测xxx节点能否正常接收  4:实时监控总线负载率  5:界面化编程 【非纯代码,设计思路及部分代码】
  • CAPL学习002-Message的发送 使用关键字message来声明一个报文变量,当使用message声明报文变量时,默认变量为CAN报文变量。当有数据库支撑的时候,一个完整的声明应该包括message ID或者 message name。 1 . 报文...

    【CAPL学习】Message的发送

    使用关键字message来声明一个报文变量,当使用message声明报文变量时,默认变量为CAN报文变量。当有数据库支撑的时候,一个完整的声明应该包括message ID或者 message name。


    1 . 报文声明的3种方式:

    message OxA ml;               // ID OxA (hex)
    message 100 m2;               // ID 100 (dec)
    message EngineData m3;       // 使用DBC中定义的EngineData名称
    

    以标识符x结尾的ID表示这是一个扩展帧ID,例如,100x。 而* 则表明这条报文在声明时还不含有CAN ID。例如:

    on message CAN1.*              // event机制:监控CAN1上所有的报文
    {
      message *msg;                       // 使用 * 声明报文
      if(this.dir!=rx)                    // 判断报文是否为RX报文
        return;
      msg = this;                        // 将RX报文报文下来
    }
    

    注意:以这种方式声明报文,后期只有指定ID后,才能将msg发出去。


    2 . 选择器Selector的使用

    CAPL提供了一系列的选择器供用户按自己的意图去修改CAN Message属性。

    关键字描述数据类型访问权限
    ANCAN报文传输的逻辑通道,有效值范围:1~32word
    MsgChannelCAN报文传输的逻辑通道,有效值范围:1~32word
    IDCAN报文标识符dword
    name报文在dbc文件中的名称char[]readonly
    DIR报文的传输方向: tx或rxbyte
    RTR远程帧的标志位
    DLC报文的数据长度,有效值范围:0~15byte
    Byte数据字节位有效值范围:0~63(8~63字节适用于CAN-FD)byte

    如果需要在CAN1网络上发送一条指定的报文,报文名:magicMsg,报文id: 0x250, 包含8个字节0x00 01 02 03 04 05 06 07;可以定义如下:

    variables
    {
      message *magicMsg;
    }
    // CANoe点击start选项时执行
    on start{
      magicMsg.CAN = 1;
      magicMsg.id = 0x250;
      magicMsg.dlc = 8;
      magicMsg.byte(0) = 0x00;
      magicMsg.byte(1) = 0x01;
      magicMsg.byte(2) = 0x02;
      magicMsg.byte(3) = 0x03;
      magicMsg.byte(4) = 0x04;
      magicMsg.byte(5) = 0x05;
      magicMsg.byte(6) = 0x06;
      magicMsg.byte(7) = 0x07;
      output(magicMsg);
    }
    

    执行上述工程后,可在CANoe Trace窗口看到如下报文信息。
    在这里插入图片描述

    展开全文
  • dword socket, long result, dword address, dword port, char buffer[], dword size) {} //udp报文监测函数,将接收到的数据存在char buffer[]中 具体实现: /*@!Encoding:1252*/ variables { UdpSocket gSocket; ...
  • CAPL脚本 对CAN 报文的事件响应

    千次阅读 2020-06-10 16:55:27
    message在 CAPL中是一种数据类型,所以他有自己的属性和方法。可以通过 this.xxx来访问message的属性: 下面通过代码随便选取获取message的属性 on message 0x189 { write("this.id = %x",this.id);//获取报文...
  • **最近一段时间有几个同行小伙伴问我如何利用CAPL语言开发出ECU与ECU之间的交互通信?** 汽车行业的小伙伴都知道,ECU与ECU之间是通过CAN/LIN线信号交互的,从一个ECU端到另一个ECU之间是经过网关转发,基本链路...
  • 文章目录周期检测APICAN 报文的周期测试caseflexray 报文周期检测case 周期检测API vector 的capl 提供了测试周期的API接口,帮助文档中有很多重载的函数,我选了两个说明: dword ChkStart_...
  • CANoe发送LIN报文

    千次阅读 2020-10-28 11:37:55
    3、CANoe发送LIN报文,遵循LIN报文结构,分为报头和应答。 ISC窗口中激活的报文,将由CANoe模拟主节点,依据调度表,自动发送报头。对于车窗天窗模块(从节点),接受到报头后即作出应答,反馈自身当前状态;对于主...
  • 步骤一:当一个函数存在多次调用时,其内部的局部变量却有着标准C静态变量的特性。声明如下四个函数TestFunc_1~4()进行说明:void TestFunc_1(void){byte a = 1, b = 2;write("a == %d ; b == %d", a, b);...
  • 在汽车电子系统测试中,离不开对报文周期的测试,如果系统比较复杂,要处理成千上万个报文,如果纯手动测试,会耗费人力,在CAPL脚本的基础上,通过python 解析 arxml 文件中的Flxeray 和 dbc 文件中的 CAN报文。...
  • 我们在ADAS应用开发测试过程中,会遇到如下问题: ...以上的问题是比较常见的问题,这就需要写CAPL脚本来实现互转,以下是通道1跟通道2的数据修改互转。 on message CAN2.* { message CAN1.* msg; if (this.d
  • CAPL是一种类C语言,CAPL数据类型的定义很多C语言类似,但也有很多独特的地方。 CAPL数据类型包括基本类型、结构体、枚举、关联类型和对象类型。变量的数据类型决定了变量存储占用的空间。基本类型枚举枚举变量的...
  • CANoe之CAPL编程(CANoe系列其三)

    千次阅读 2020-12-29 22:18:55
    CANoe之CAPL编程(CANoe系列其三)1、CAPL概述1.1、CAPL语言特性1.2、CAPL的程序结构1.3、CAPL的数据类型1.4、CAPL事件类型概述2、CAPL事件类型2.1、系统事件2.2、CAN控制器事件2.3、CAN消息事件2.4、键盘事件2.5、...
  • CAPL诊断函数解释

    千次阅读 2021-02-19 14:40:58
    CAPL诊断函数解释 诊断函数的解释 CDD(CANdelia Diagnostic Description)CDD文件用于诊断的数据库文件。CDD文件由CANdeliaStudio创建,可以集成到CANoe中,用于诊断服务和数据解析。 DLL 算法文件 diagRequest ,...
  • CAPL 脚本模拟整车环境实现CAN收发监控

    万次阅读 多人点赞 2019-03-17 00:56:41
    在嵌入式行业中,基本都会使用CANOE工具去收发报文,那么如何基于CANOE工具实现自动化功能呢? 如你所料可以基于 -CAPL- 脚本实现CANOE的自动化。 在我基于CAPL脚本实现某一功能的过程中,较大一部分时间花在CAPL...
  • CANoe工程通过控件改变报文信号值的两种方法

    千次阅读 热门讨论 2019-08-02 19:30:03
    CANoe工程通过控件改变报文信号值的两种方法1、目的2、操作方法2.1、直接将面板控件关联上DBC中的报文信号2.2、利用环境变量和CAPL编程完成3、总结 ...该报文是ABS这个网络节点的发送报文,报文中的信号定义如下...
  • 官方的文档里关于时间的有一个timeDiff()函数,但是不太会用,小白一个有人能给解答下吗,我现在想检查下特定的ID是否符合发送的要求,找到同一个报文发送的时间间隔,并返回最大值,写一个例子。
  • CAPL>代码片段

    2021-01-08 17:30:50
    节点上下线操作 节点时在dbc文件中定义的节点,如VCU,BMS,MCU等,有时需要将它们离线,离线后不再向总线上发送报文,在线时,可以向总线上发送报文。 //节点上线 void testSetEcuOnline(dbNode aNode); void ...
  • CAPL学习之路-关键字

    2021-06-18 10:05:05
    capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword ...
  • CAPL中如何实现UDP通信

    2020-12-24 13:50:35
    通常在使用canoe实现以太网通讯的时候,使用canoe5610来进行通信,但是5610的价格昂贵,其实使用普通的canoe、canalyzer也可以实现udp通信,capl里边自带了以太网通信接口,可以使用本地的以太网interface来跟外界...
  • Step by Step学习CANoe CAPL诊断API和诊断自动化测试

    千次阅读 多人点赞 2019-07-23 01:20:52
    之前给大家分享过了《深入理解统一诊断服务(Unified Diagnostic Services,UDS)ISO14229-1》、《深入理解CANoe/CANalyzer的诊断功能以及CAPL诊断编程实现》、《深入理解CANoe中的CAPL回调接口(CAPL Callback ...
  • 报文的测试文件.7z

    2019-07-12 15:35:47
    使用Verilog写的报文激励仿真代码,使用了for循环,随机函数写上下限等。经仿真,代码无误。 1、报文长度在1~128字节随机。 2、报文间隔0~3随机 。3、报文发送1。 4、sop与eop有1/8概率丢失,din... 5、发送100个报文
  • 闲暇之际,听到不知名网友呼我关于OSEK的建环机制用CAPL怎么做? 我会的有以下三种: 利用.dll调用,这得看函数解析,对新手不太友好。 建立network node仿真节点,每个仿真节点都有一个完整的OSEK机制,即相互...
  • CANoe的CAPL编程基础(2)

    万次阅读 多人点赞 2017-10-17 21:45:49
    CANoe的CAPL编程 检查错误帧 回调函数 等待Text事件
  • CANoe教程:CAPL编程

    千次阅读 多人点赞 2020-12-27 16:39:34
    CANoe教程 | CAPL编程 - 数据类型 CAPL是一种类C语言,CAPL数据类型的定义很多C语言类似,但也有很多独特的地方。 CAPL数据类型包括基本类型、结构体、枚举、关联类型和对象类型。变量的数据类型决定了变量存储占用...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 205
精华内容 82
关键字:

capl发送报文