CAPL的多种数据类型
CAPL(CAN Access Programming Language)提供了多种数据类型,用于处理不同类型的数据(如数值、字符串、时间等),以下是常用的数据类型分类及说明:
一、基本数值类型
| 类型 |
说明(位数/范围) |
用途示例 |
char |
8位有符号整数(-128 ~ 127) |
存储字符或小范围整数 |
byte |
8位无符号整数(0 ~ 255) |
表示消息的字节数据 |
int |
16位有符号整数(-32768 ~ 32767) |
存储中等范围整数 |
word |
16位无符号整数(0 ~ 65535) |
存储无符号中等范围整数 |
long |
32位有符号整数(-2147483648 ~ 2147483647) |
存储大范围整数 |
dword |
32位无符号整数(0 ~ 4294967295) |
存储时间戳(timeNow()返回值)、无符号大整数 |
float |
32位单精度浮点数(约±3.4×10³⁸) |
存储小数(如车速、温度) |
double |
64位双精度浮点数(约±1.8×10³⁰⁸) |
存储高精度小数 |
常用占位符
| 占位符 |
含义 |
对应参数类型 |
| %d |
十进制整数 |
int |
| %u |
无符号十进制整数 |
dword(CAPL 的无符号类型) |
| %x |
十六进制整数(小写) |
int/dword |
| %X |
十六进制整数(大写) |
int/dword |
| %s |
字符串 |
char[] |
| %f |
浮点数 |
float/double |
| %lu |
无符号长整数 |
dword(推荐用于timeNow()) |
- 代码示例:
snprintf(output, 100, "111 %lu 启动了!", t);//dword t=timeNow(); t用%lu占位符
write(output); // write直接输出timeNow()不报错,但有问题,输出空白
二、布尔类型
| 类型 |
说明 |
用途示例 |
boolean |
取值为0(false)或1(true) |
表示开关状态、条件判断结果 |
三、字符串类型
| 类型 |
说明 |
用途示例 |
char[] |
字符数组(字符串) |
存储文本(如char str[20] = "hello";) |
string |
字符串变量(CAPL 6.0+支持) |
更便捷的字符串处理(如string str = "test";) |
四、特殊类型
| 类型 |
说明 |
用途示例 |
timer |
秒级定时器(最小精度1秒) |
长时间定时(如timer t; setTimer(t, 5);) |
msTimer |
毫秒级定时器(最小精度1毫秒) |
短时间高频定时(如msTimer t; setTimer(t, 10);) |
message |
消息对象(表示CAN/LIN总线上的消息) |
处理消息(如message 0x123 msg; msg.dlc = 8;) |
signal |
信号对象(表示数据库中的信号) |
信号操作(较少直接使用,通常用$信号名引用) |
enum |
枚举类型(自定义离散值集合) |
定义状态(如enum {OFF, ON, STANDBY} mode;) |
五、数组类型
CAPL支持一维和多维数组,格式为:
类型 数组名[长度];
示例:
int arr[5]; // 一维整数数组(长度5)
float matrix[3][3]; // 二维浮点数数组(3×3)
byte msgData[8]; // 存储消息的8字节数据
六、类型选择原则
- 时间相关:用
dword 存储 timeNow() 返回的毫秒时间戳(避免溢出)。
- 消息字节:用
byte 表示CAN消息的原始字节数据(0~255范围匹配)。
- 小整数:优先用
int 或 word(节省内存);大整数用 long 或 dword。
- 小数:普通精度用
float,高精度用 double(但CAPL中多数信号用 float 足够)。
- 定时任务:短时间高频用
msTimer,长时间用 timer。
根据变量的实际取值范围和用途选择类型,可避免溢出错误并提高代码效率。
END