admin 管理员组

文章数量: 1086019


2024年12月31日发(作者:xlm文件)

CAPL语言学习文档

(一)CAPL简介

CAPL全称为Communication Access Programming Language。CAPL语言允许你编写单

独的应用程序。比如说:当你添加新节点的时候,你要测试新添加的节点能否与以前的节点

正常通信。在CAPL的帮助下就能够对系统环境进行仿真,也就是说能够仿真以前节点之

间的数据通信,然后与新节点相连,就可以测试出新节点的功能性和可靠性,这也就是半实

物仿真。

通过CAPL你也能够对你网络上的数据通信进行分析优化,也能做一个网关程序——

连接2种不同的总线,保证不同类型总线之间的数据通信。

CAPL程序与数据库结合起来,通过调用数据库中的信号,消息,环境变量和实际测

试环境联系起来,从而你能够实时监测总线上的数据通信;能够接受总线上的控制信息,使

得模拟面板上的控件进行动作;也能够通过总线发出控制信息,控制外部环境动作,从而支

持开发全仿真,半实物仿真,测试分析全实物系统3个仿真阶段,对节点的仿真很重要的地

方就是准确的描述节点在总线上的动作。

(二)CAPL功能

➢ 编写解决问题的函数

➢ 仿真控制设备

➢ 仿真控制系统的环境

➢ 执行测试和验证

➢ 作为网关

(三)CAPL特征

➢ 基于事件建模的语言

总线事件

属性事件

时间事件

➢ 类似C语言

➢ 友好的开发界面

➢ 可用用户的动态连接库

(四)CAPL编辑器

CAPL程序在一个被划分为4个小窗口的浏览器窗口建立。

左上角的窗格是浏览器树,包括所有CAN事件节点。

右边的两个窗格是程序编辑窗口,其中上面的是全局变量编辑器,下面的是具体程序编

辑窗口。

最底下的窗格是消息窗口。当程序编好后,编译运行的结果会在消息窗口中显示,并指

出该程序的路径,若运行有错,则会在指出哪行程序出错。

(五)数据类型

➢ 整型

有符号:int(16 bit),long(32 bit)

无符号:byte(8 bit),word(16 bit),dword(32 bit)

➢ 浮点数

Float (64 bit)

Double (64 bit)

➢ 单个字符

Char (8 bit)

➢ 定时器(timers)

Timer (s)

Mstimers (ms)

这些数据类型在声明中已被初始化。整数和浮点数的用法跟其他程序设计语言相同。

(六)全局变量的声明与初始化

在浏览器中,全程变量的声明写在全局变量窗口的右上方。数据类型DWORD, LONG,

WORD, INT, BYTE ,CHAR的用法与在C语言中的用法近似。64位浮点数FLOAT 和DOUBLE

遵照IEEE标准。

当编写一个定时器语句时产生一个定时器,当程序跳转到定时器运行语句时,开始执

行定时器。与定时器相关的事件程序被唤醒。定时器的建立和取消通过关键字setTimer

和cancelTimer执行。

通过关键字将数据库中的消息定义成变量。变量在声明中被初始化。单一的符号和大

括号{ }形式都是允许的。除了定时器和省略补充的量,所有变量都被编译器初始化。消息

变量DIR的发送方向通过发送请求(TXREQUEST)来初始化。

CAPL语言允许数组(arrays, vectors, matrices)的声明,包括消息变量。

局部变量在CAPL语言中是静态的(与C语言形成对比),这就是说要在程序开始时

设定初值。假定变量进入程序的值是它们上次跳出程序时的值。

Simple types:

Int j, k = 2; // j = 0

Double f = 17.5;

MsTimer t1; // No initialization

Initialization of message variables:

Message 100 msg = {dlc = 4, word (0) = 0x1234};

Arrays:

Int lookUpTable [3] = {1, 2, 3};

Char text [12] = "Hello world";

Int matrix [2] [2] = {{11,12},{21,22}};

(七)事件程序

➢ 总线事件(on message{})

On message 100{

Write (“Message 100”)

}

➢ 键盘事件(on key{})

On key ‘a’ {

Write (“’a’pressed”);

}

➢ 时间事件(on timer{})

On timer Time_1 {

Write (“time elapsed”);

}

➢ 出错事件(on errorFrome{})

On errorFrame

{

If (ABS_NM_State)

{

Switch (Error_Status)

{

Case 0:

CountTx += 8;

CountRx += 8;

if ((countTx > 127)||(countRx > 127))

{

}

Error_Status = 1; //Error_Pass;

Break;

➢ 环境变量事件(on envVar{})

On envvar Switch {

// declare a CAN message to be transmitteed

Message Controller msg;

// Read out the value of the switch

// Assign to the signal Stop

= getvalue (this);

// Output the message on the bus

output (msg);

}

(八)消息选择器

你可以通过以下选择器控制CAN消息的收发:

➢ ID 消息标识符

On message * {

If ( == 0x600) {

Write ("message 0x600 received; ");

Trigger ();

}

}

➢ CAN 通道编号

Message 0x100 msg = {dlc = 2, word (0) = 0x1234};

On key '1' {

Write ("sende via CAN 1");

= 1;

Output (msg);

}

on key '2' {

write("sende via CAN 2");

= 2;

output(msg);

}

➢ DLC 数据编码长度

on message OneByteMessage {

if ( != 1) {

write("error: OneByteMessage hat DLC != 1");

stop();

}

}

➢ DIR Direction of transmission, event classification; possible values: RX,

TX, TXREQUEST

Selector DIR (direction of transmission)

on message 0x100 {

if ( == RX) {

write("message 0x100 received");

}

if ( == TX) {

write("message 0x100 sent");

}

}

➢ RTR 远距离传输;可能值:0(no RTR),1(RTR)

Selector RTR (remote transmission request)

// send remote frame

message 0x100 rmsg;

= 1;

output(rmsg);

➢ TYPE 与DIR和RTR相互作用产生有效值(TYPE=(RTR<< 8) | DIR)

message 0x100 resp_msg = {dlc = 2, word(0) = 0x1234};

on message 0x100 {

if ( == RXREMOTE) {

// remote frame 0x100 received

output(resp_msg);

}

}

➢ TIME 指明时间,单位;10微秒

Selector TIME (time stamp of message in units of 10 microseconds)

const dword sendDist = 10000; // *10 us = 100ms

on message CP24TX {

int delta;

dword lastTime;

delta = ( - lastTime - sendDist); // in 10 us

lastTime = ;

if (delta != 0) {

write("deviation of send distance: %d us",10*delta);

}

}

➢ MsgFlags 表示接收和发送

0 x 02 表示在传输消息前传输缓冲器是空闲的

0 x 04 表示消息收发器主动接收消息

0 x 08 表示在high voltage模式时消息被发送或接收

0x10 表示远程帧

0x40 表示发送(等同于DIR==TX)

0x80 发送请求(等同于DIR==TXREQUEST)

➢ SIMULATED 表示通过仿真的CAPL节点发送消息;可能值:0 (no), 1 (yes)

Selector SIMULATED (message from simulated node)

On message LightState {

If ( == RX) {

If (! TED) {

Write("message LightState received from real system");

}

Putvalue (Bulb, );

}

Else {

// write ("message LightState received as TX");

}

以下是能完成独立编码的

DIR 和 RTR的表示方法:

➢ DIR:

RX

接收消息(DIR == RX)

TX 发送消息(DIR == TX)

TXREQUEST 发送请求(DIR == TXREQUEST)

➢ TYPE:

RXREMOTE 远程消息接收((DIR == RX) && RTR)

TXREMOTE 远程消息发送((DIR == TX) && RTR)

TXREQUESTREMOTE 发送请求远程消息发送请求((DIR == TXREQUEST) && RTR)

RXDATA 数据消息接收((DIR == RX) && !RTR)

RXDATA 数据消息发送((DIR == TX) && !RTR)

TXREQUESTDATA 数据消息发送请求((DIR == TXREQUEST) && !RTR)


本文标签: 消息 程序 发送