热度 6
2022-6-5 20:14
1420 次阅读|
0 个评论
前言 得益于计算机的发明及高速发展, 21 世纪是充满智能、科技、便捷的世纪。无人驾驶、人工智能、物联网,这些概念已耳熟能详,而它们背后则是利用编 程实现的复杂逻辑。作为新时代的我们,生活已经和“编程“密不可分了,例如常见的C、C++、Python、Java等编程语言。Vector公司与时俱进,在CANape这款强大的测量和标定工具里,采用专门的编程语言——CASL(Calculation and Scripting Language),方便汽车工程师进行数据分析和开发。今天我们就来聊聊这位强大又低调的选手,并和它做个朋友! CASL 的语法与C编程语言非常相似(但也有不同处:CANape不使用指针),允许开发人员集成自己的C代码或Simulink模型。所以说,大家在使用之前基础的C语言编程知识还是要掌握的~为了方便使用,CANape提供了智能感知输入、代码块和各种内置函数组。 图1 智能感知输入 在CASL中,主要运用函数和脚本,来解决各种不同的任务。从简单的计算,例如,添加信号,直至CANape的自动化。 (Tips:CASL与编程语言CAPL可不一样哦,后者是在CANoe和CANalvzer环境中使用的。CAPL是一种面向事件的编程语言,即程序节点用于指定事件,并在何时执行以及反应。而CASL是一种信号导向的语言。) 基本概念 1 )What Are Functions 在测量过程中,函数被同步处理,主要用于实时测量或者对于加载测量文件的各种计算和应用。例如,函数可以是数学公式或程序代码,其中变量代表信号或参数。 通常有 在线和离线 两种使用场景。 ▲Onlineapplications(在实时测量过程中) 》测量虚拟信号计算 》允许对外接设备读写 ▲Offlineapplications(访问现有的测量文件) 》测量文件虚拟信号计算 》执行数据挖掘 图2 虚拟函数使用场景 下面我们来看看函数的语法结构: 图3 函数语法结构 当一个函数被调用时,参数可以被传递给函数。参数通常作为引用传递给函数,因此既可用于输入,也可用于输出。 除了通过参数传递从函数发出结果外,还可以使用返回控制结构(return也是关键字)的路径。默认情况下,返回double类型的值,字段或向量(数组)不允许作为返回值。 CANape对自身预定义和用户定义函数进行了区分,称为库函数和工程函数。 图4 函数分类 2 )What Are Scripts 脚本是程序代码的一部分,可在编辑器窗口中编写,并在调用时顺序处理。脚本用于自动化或控制CANape中的联合活动,例如测量和其他系统相关序列的开始和停止,它独立于测量运行。它们也可以用来调用在Microsoft Visual Studio或MATLAB/Simulink中生成的外部模型。 图5 脚本示例 此外,可以在CANape运行时,使用命令行选项控制脚本行为。 两者区别 : 1. 流程优先级不同。 脚本以较低进程优先级执行,相对于测量是异步运行的。另一方面,函数以高进程优先级执行,并与测量同步执行。与函数相比,脚本具有更广泛的预定义函数组,如附加文件和脚本函数、Flash函数、诊断和数据挖掘函数。 2. 与脚本不同 ,函数不能使用断点进行调试,因为它们具有高优先级。不过我们可以使用以下命令在Write窗口中输出调试信息Write()、Writef()、Print()或Printf()。 3. 脚本不需要函数头和函数体 。程序代码可以简单地直接写入编辑器,然后按编码顺序处理。 4. 函数必须是函数编辑器导出格式(*.cne)或者是ASCII文本格式(*.txt);脚本必须为脚本格式(*.scr or *.cns). 5. 函数可以被保存到工作目录中的CANape.ini配置文件中,但脚本文件被保存为独立文件 。 说了这么多,我们如何编辑呢? 如何编辑 全局变量、函数、脚本均可在CANape的 函数编辑器 中创建、编辑和编译。函数编辑器主要分为树视图、列表视图、编辑器窗口、消息窗口,可以在CANape中直接打开。 图6 函数编辑器 变量类型:变量是特定类型值的占位符。变量可以在脚本和函数中声明和定义,主要分为全局变量和局部变量。 全局变量是CANape配置中的所有函数和脚本都可以使用的特殊数据对象,局部变量仅在各自的函数或脚本中有效。 (Tips:全局变量是静态的。它们在两个测量之间以及加载项目之后保留它们的值。当保存配置或项目时,它们的当前值保存在参数文件中,并在加载项目时重新加载。) 参数总是作为通过引用传递给函数,可以使用具有相同作用var和double前缀来修饰。 图7 相同作用前缀 关于数据类型就不做赘述了,大家自行百度啦。 接下来重点介绍一些实用小技巧: 使用频率较多的简单语句: 测量过程开始/停止: Start(); Stop(); 测量文件信号导入: FILE1 .CCPsim.ampl; 测量和标定:x = CCPsim.ampl; CCPsim.ampl= x; 发送报文:CAN1.SendMessage(0x1a1,0xff,0x7f); 延时(等待)3秒:Sleep(3000); 测量缓存区或文件中对象信号值的数量:sizeof(); 图8 数量获取 所选对象特定的测量值进行读写访问:mbuffer ;(常与sizeof结合使用) 图9 读写特定值 输出:print();write(); 图10 常见输出格式 可以从一个函数中调用另一个函数: 图11 函数调用函数 从一个脚本中调用另一个函数: 图12 脚本调用 函数 从一个脚本中调用另一个脚本: 图13 脚本调用脚本 正确终止函数和脚本: 如果参数达到了某个值,则可以使用控制结构cancel来终止函数或脚本。如果在函数中使用了cancel命令,该函数将在没有返回值的情况下终止。如果在子函数或脚本中使用了cancel命令,则脚本将立即终止。 例如下图,如果在调用的对话框中选择 (返回值为0),脚本将终止。 图14 终止脚本 全局变量初始化: 可以在脚本运行时调用,以每次自动初始化全局变量的值。 图15 初始化脚本 以上可能是一些常见的例子,由于编程语句体量庞大,工程师们需要根据功能需求来选择语句。在CANape中右键可以导入自动的库函数,根据功能分类,对于不熟悉语句,鼠标悬停后按F1,可以弹出help文档,其中会显示使用例子。 图16 库函数 图17 万能help文档 在我们编写程序前,我们需要考虑以下5个步骤: 1. 需要用程序的主要任务2.决定如何以及何时执行程序3.开发合适的代码4.编译5.测试。 编程世界很大,谨此抛砖引玉。小编领进门,修行还是看个人。 古人云,工欲善其事,必先利其器;北汇信息作为Vector中国的合作伙伴,始终专注于汽车电子领域的新技术和新产品,为整车厂和零部件企业提供完整的研发、测试解决方案,为工程师在汽车领域提供“趁手装备“!