tag 标签: CAPL

相关帖子
相关博文
  • 热度 7
    2022-10-9 09:58
    1554 次阅读|
    0 个评论
    CAPL编程的进阶应用——Checksum算法的实现
    CRC 与 Checksum区别: 相信大家在CAN Msg或者ETH PDU中经常会看到Checksum这种信号。提到Checksum,就必须要说明一下CRC校验,很多工程师会概念混淆,认为两者是同一个东西,实则它们有很大的区别。 第一 、 两者 存放位置不同。 CRC校验: 循环冗余检查( CRC )是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 通过 CRC 概念可以得知, CRC 存放在 CRC 场,而 Checksum 存放在数据场之中,一般在数据场的第一个字节或者最后一个字节。 图1 标准数据帧格式 第二 、 两者应用场景 不同。 在CAN报文帧中,CRC校验是发送器根据发送的bit进行多项式计算校验,结果放在15bit长度的CRC位。接收器也是用相同的多项式计算总线上的数据,与接收到的校验值进行比较,相同则表示帧正确接收,并在ACK时隙中发送显性状态,覆盖发送器的隐性位;如果不同接收节点在ACK界定符之后发送错误帧。 图2 CRC校验原理 CRC校验是为了保证数据从一个CAN收发器发送到另外一个收发器的信号完整性,而数据场中Checksum校验算法是为了校验数据被正确的打包与解包,并且Checksum算法是可以自行制定的,计算规则的灵活度高。 Checksum 的应用场景 对于Checksum而言,它的应用场景有以下三点: 1. 确保数据正确打包 有些ECU内部的变量在传递到CAN收发器之前就有可能发生错误,这种类型的错误CAN收发器是无法检测到的。报文中的信号和Checksum校验是在应用层完成的,将报文中的各个字节进行校验,报文和Checksum一起发送,并且在接收节点进行解析,从而确保数据链路完整和数据正确打包。 2 . 实现数据加密 CAN网络是开放性的,CAN节点可以随时加入到总线当中,为了保证通信的安全性,ECU传输的关键控制信号需要进行加密,报文的发送方和接收方使用相同的Checksum算法作为数据加密的密钥。接收方对比秘钥,如果不同,此条报文的数据不被使用,从而避免被其他节点的数据影响。Checksum算法不在DBC等数据库文件中说明,可以单独保密,从而确保了数据的加密。 3 . 提高 数据 的可信度 一帧报文在多个字节中可能出现位错误,一般情况下CRC8校验的错误率为1/256,crc16校验的错误率为1/65536,crc32校验的错误率为1/(65536*65536)。通过Checksum校验可以提高数据的可信度。 由于Checksum的作用,其也常应用在车载以太网当中。 在CAPL中 Checksum信号 实现 通常情况下,Checksum和LiveCounter信号是成对出现的。在CANoe中使用仿真节点与真实控制器交互,需要将LiveCounter和Checksum信号仿真,这样才能成功通信。LiveCounter长度为4bit,它是用于报文发送计数的生命信号,每发送一帧报文后就对该LiveCounter位加1,会在0~15之间循环增加。在报文其他信号没有改变时,LiveCounter实时更新使得Checksum信号跟着更新,提高校验的准确性。那么LiveCounter信号该如何仿真呢? 下面以CAN总线DBC为例,介绍在CAPL中实现LiveCounter和Checksum校验仿真。 CAPL是CANoe和CANalyzer中可用的类C的编程语言。CAPL中程序块的执行由事件控制,在专用的编译器中开发和编译,这样可以访问数据库中的所有对象以及系统变量,被汽车电子工程师们广泛使用。 下图为LiveCounter计算的代码,为了保证数据的准确性,进行一次Checksum计算,这样就可以实现LiveCounter信号的仿真。 图3 LiveCounter计算代码 下图为示例报文中各个信号位置排布关系,在此报文中,Checksum校验方式为前七个字节异或运算,将运算结果存放到最后一个字节。排布图中共有8个信号,它们的格式为Motorola格式,也就是俗称的大端模式。 图4 报文中信号排布 CAPL只能访问到报文中的信号,无法访问到报文中的每个字节,要进行Checksum计算,需要根据信号排布把前七个字节的真实值重新组合存放在一个byte类型的数组当中,然后对这个数组异或运算获取的结果为该报文中Checksum信号值。 对于不同长度的信号,需要声明不同类型的数组来存放不同的信号。byte类型长度为1字节,声明两个byte * 类型的数组(*为省略的数组名称)分别存放长度小于一字节的信号和重组后每个字节的真实值;int类型长度为2字节,声明int * 类型的数组存放长度为1-2字节的信号;long类型长度为4字节,声明long * 类型的数组存放长度为2-4字节的信号。下图为Checksum中信号长度小于1字节的字节重组示例代码。 图5 Checksum字节重组示例代码 另外,参与Checksum计算的是信号的真实值而不是物理值,如果信号中有偏移量和比例因子,在赋值时需要将信号加上偏移量,并除以比例因子以获得真实值。 图6 信号描述 为了保证和真实控制器通信正常,Checksum数据必须准确,Checksum计算步骤一般写成无返回值函数(void),在LiveCounter信号改变或者其他信号改变时调用计算。 正确计算的LiveCounter和Checksum信号曲线如下图所示。 图7 LiveCounter和Checksum信号曲线 总结 本文重点描述了CRC和Checksum信号的区别以及Checksum信号在CAPL中实现的方法。CAPL编程作为CANoe的灵魂,使CANoe满足仿真、分析、测试和诊断的各种复杂的要求,同时使CANoe的功能得以不断扩展。 北汇信息 作为Vector中国的合作伙伴,致力于为中国汽车客户提供优质的工具支持、解决方案以及测试服务。 注:图片来自于Vector。
  • 热度 6
    2022-9-20 10:52
    1702 次阅读|
    0 个评论
    提到CAPL,相信各位一定不陌生,它是由Vector公司开发的类似于C语言的面向过程编程语言,是CANoe和CANalyzer中可用的编程语言。CAPL中程序块的执行由事件控制,在专用的编译器中开发和编译,这样可以访问数据库中的所有对象以及系统变量,作为汽车电子工程师,在工作中会经常用到。 CAPL Browser中打开。 图1 CAPL打开方式 CAPL界面由功能区、程序框架浏览树、输出窗口、编辑区、访问区五部分组成。 图2 CAPL界面 顾名思义,程序编辑区就是编写CAPL脚本的区域;程序架构浏览树起目录的作用,可以把编辑区定位到编写的事件或函数类型的语句;输出窗口可以输出编译过程中的事件和使用搜索时定位到的结果;访问区能够访问到CANoe工程加载的数据库中的信号、创建的系统变量以及CAPL函数库中的语句,直接从右侧访问区拖拽到中间编辑区使用(注意:工程创建路径中不能有中文,否则访问不到数据库文件)。 功能区由五部分构成,首先是File菜单栏,与大多数软件相同,它是文件创建、保存、加载、设置等功能区域。 图3 File菜单栏 Home功能区提供了CAPL编译常用功能,包括代码编译、查找、替换、屏蔽、取消屏蔽等功能。 图4 Home功能区 Filter功能区的作用是管理CAPL的函数库,可以在函数访问区中屏蔽掉不需要的函数。 图5 Filter功能区 Debug功能区是调试的区域,提供了一些基本的调试操作,一般情况下不通过debug模式来调试脚本。基本上编译一次,存在错误可以通过Output输出窗口获得错误类型并进行更改。如果脚本编译成功之后,仍然不能满足测试步骤的输出,一般会使用Write窗口进行调试。 图6 Debug功能区 Layout功能区主要是针对CAPL用户的页面展示。例如进行水平分区、垂直分区等操作方便用户进行脚本编写。 图7 Layout功能区 CAPL应用场景: 节点仿真 关联Simulation Setup中的ECU节点,实现ECU节点仿真和整车网络仿真。 图8 Simulation Setup窗口 测试功能 关联Simulation Setup中的Test Module模块或是Test菜单中的Test Setup,结合TSL(Test Service Library,测试服务库)进行测试功能开发。 图9 Test Setup窗口 分析功能 关联Measurement Setup窗口功能模块中的Program Node,实现总线过滤、分 析功能。 图10 Measurement Setup窗口 CAPL脚本结构: 一个完整的CAPL脚本由三部分组成:变量、各种事件和自定义函数。 图11 CAPL的三部分 CAPL的事件类型包含三种:总线事件、属性事件、时间事件。CAPL常用的事件类型如下图所示。 图12 Measurement Setup窗口 CAPL常用函数: 下面以CANoe中Easy工程的light.can脚本为例介绍CAPL中的常用函数,该脚本与Panel联用实现转向灯仿真。 图13 声明全局变量 上图是CAPL中的全局变量声明,其中 ‘ msTimer ’为声明以ms为单位的计时器;‘ c onst int ’为声明int类型的常值变量,该变量的值无法改变;‘ int ’为声明int类型的变量,该类型变量有符号,长度为2字节。 图14 系统事件 ‘ on start ’是系统事件,测量开始执行会触发该事件,也就是点击Start按钮触发。 图15 CAN消息事件 ‘ on message ’是CAN消息事件,接收到指定消息时执行。‘ on message LightState’是对名字为LightState的报文反应,除直接使用字符串外,还可以使用报文ID指定触发报文。‘ on message 123 ’是对ID为123(dec)的报文反应;‘ on message 0x123’ 是对ID为123(hex)的报文反应;‘ on message *’是对所有的报文反应;‘ on message 100-200’是对ID为100-200间的报文反应。 图15 系统变量事件 ‘ on sysvar sysvar ’是系统变量事件,指定的系统变量值改变时执行。与之相对应另一个系统变量事件是‘ on sysvar_ update sysvar ’,指定的系统变量值更新时执行。 ‘setTimer( msTimer t, long duration)’是设置定时器函数,他有两个输入参数,第一个为声明的定时器变量,第二个是设定的时间。‘cancelTimer( msTimer t)’是取消定时器函数,入参为定时器变量,该函数的作用为取消设定的定时器。 图16 时间事件 ‘ on timer ’为时间事件,定时时间超过时执行,它与设置定时器函数联用。定时器通常应用在实现某个任务循环,在时间事件中写入一个设置定时器函数实现循环。 ‘ on key ’为键盘事件,被指定的键按下时执行。该事件常用于脚本调试。 此外,‘write()’函数在调试脚本中也常使用,该函数基于C语言中的‘printf()’函数,可以将文本消息输出在write窗口中。 北汇信息作为Vector中国的合作伙伴,始终专注于汽车电子领域的新技术和新产品,为整车厂和零部件企业提供完整的研发、测试解决方案,为工程师在汽车领域提供“趁手装备“! 注:图片来自Vector。