CANoe教程 | CAPL编程 - 数据类型

CAPL是一种类C语言,CAPL数据类型的定义很多C语言类似,但也有很多独特的地方。
CAPL数据类型包括基本类型、结构体、枚举、关联类型和对象类型。变量的数据类型决定了变量存储占用的空间。

基本类型

基本类型

枚举

枚举变量的定义和使用同C语言:

enum State { State_Off = -1, State_On = 1 };

如果枚举成员的值未定义,那么第一个成员默认值为1,之后的成员按顺序依次加1.
枚举变量的定义和使用

variables
{
  enum { Apple, Pear, Banana } fruit = Apple;
  enum Colors { Red, Green, Blue };
  enum Colors color;
}

enum Colors NextColor(enum Colors c)
{
  if (c == Blue) return Red;
  else return (enum Colors) (c + 1);
}

关联类型

CAPL支持一种类似Python字典和C++ Map的关联类型(Associative Fields),关联类型的元素是键值对(key value pairs)。
关联类型定义格式如下,左边是value类型,右边[ ]内是key类型:

int m[float];         // maps floats to ints
float x[int64];       // maps int64s to floats
char[30] s[ char[] ]  // maps strings (of unspecified length) to strings of length < 30

example 1:关联浮点型

float m[float];
m[4.1] = 5.5; //key is 4.1 (float)  and value is 5.5 (float)
m[5.3] = 6.6;
write ("4.1 is mapped to %2.2lf", m[4.1]);
write ("5.3 is mapped to %2.2lf", m[5.3]);
for (float mykey : m)
{
  write("%2.2lf is mapped to %2.2lf.", mykey, m[mykey]);
}

example 2:关联字符串

char[30] namen[char []];
strncpy(namen["Max"], "Mustermann", 30); 
strncpy(namen["Vector"], "Informatik", 30);

for (char[] mykey : namen)
{
  write("%s is mapped to %s", mykey, namen[mykey]);
}

结构体

结构的定义和使用同C:

variables
{
  struct Point
  {
    int x;
    int y;
  };
  struct Point myPoint;
  struct Point allPoints[50];
}
on start
{
  myPoint.x = 7;
  myPoint.y = 2;

  allPoints[3].x = 1;
  allPoints[3].y = 5;
}

注意:
CAPL中结构体默认按8字节对齐,可以在结构体定义前加_align来改变结构体对齐方式.
example:

struct Point {   // note: default _align(8)
byte x;          // offset 0, size 1
byte y;          // alignment 1, offset 1, size 1, padding before: 0
};               // size 2, alignment (of the struct) 1

struct LongPoint {   // note: default _align(8)
byte x;              // offset 0, size 1
qword y;             // alignment 8, offset 8, size 8, padding before: 7
};                   // size 16, alignment (of the struct) 8

_align(2) struct Point2 {
byte x;    // offset 0, size 1, (alignment 1)
qword y;   // alignment 2, offset 2, size 8, padding before: 1
};         // size 10, alignment (of the struct) 2

struct Points {   // note: _align(8) per default
struct Point p1;  // offset 0, size 2, (alignment 1)
byte x;           // alignment 1, offset 2, size 1, padding before: 0
struct Point2 p2; // alignment 2, offset 4, size 10, padding before: 1
};                // size 14, alignment (of the struct) 2

可以使用如下函数获取结构体大小(size)、对齐方式(alignment )和偏移量(offset )信息:


图片.png

example:

struct Points {   // note: _align(8) per default
Point p1;         // offset 0, size 2, (alignment 1)
byte x;           // alignment 1, offset 2, size 1, padding before: 0
Point2 p2;        // alignment 2, offset 4, size 10, padding before: 1
};                // size 14, alignment (of the struct) 2

__size_of(struct Points);         // returns 14
__alignment_of(struct Points);    // returns 2
__offset_of(struct Points, p1);   // returns 0
__offset_of(struct Points, x);    // returns 2
__offset_of(struct Points, p2);   // returns 4

对象类型

除了以上介绍的基础数据类型,CAPL还提供了一些CANoe特有的对象类型来帮助用户快速完成仿真测试功能的开发。

CAN messages

CAPL提供了各种网络对应的报文类。本文以CAN message为例进行介绍。
报文变量定义格式:

message + message ID/message name + variable

使用message关键字来声明一个报文变量,message后是message ID或CANoe工程导入DBC后的message name,然后是在CAPL程序中要使用的报文变量名。

message 0xA m1;                                //定义一个ID为0xA的报文变量m1
message 100x m2;                              //定义一个ID为100的扩展帧报文变量m2,ID后的x后缀表示这是一个扩展帧
message EngineData m3;                  //定义一个在DBC中message name为EngineData的报文变量m3
...
output(m1);
output(m2);
output(m3);

CAPL提供了一系列的选择器(Selectors)来设置或读取CAN message的属性,例如:


图片.png

图片.png

example:

message 0x100 msg;                  //定义一个ID为0x100的message变量msg
msg.CAN = 1;                              //将msg的通道设置为1
msg.DLC = 2;                              //将msg的DLC设置为2
msg.BYTE(0) = 0xAA;                 //给msg报文数据段的第一个byte赋值为0xAA;
msg.BYTE(1) = 0xBB;                 //给msg报文数据段的第二个byte赋值为0xBB;                 
output(msg);                                //将定义好的msg发送到总线中

定时器变量

CAPL提供两种定时器变量:
timer:基于秒(s)的定时器
msTimer:基于毫秒(ms)的定时器
example:点击键盘'a'后以20ms为周期发送id为100的报文

msTimer myTimer;                  //定义一个ms定时器myTimer
message 100 msg;
...
on key 'a' {
   setTimer(myTimer,20);       //点击键盘'a'将定时器myTimer设置为20ms,并开始计时
}
...
on timer myTimer {               //响应定时器事件myTimer,将msg发送到总线,
   output(msg);
   setTimer(myTimer,20);      //重新设置定时器myTimer为20ms 
}

未完待续~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352