CAPL语言学习文档

lichongyang
lichongyang
lichongyang
110
文章
0
评论
2020年3月31日20:51:04 评论 437 次浏览

(一)CAPL简介

CAPL全称为Communication Access Programming Language。CAPL语言允许你编写单独的应用程序。比如说:当你添加新节点的时候,你要测试新添加的节点能否与以前的节点正常通信。在CAPL的帮助下就能够对系统环境进行仿真,也就是说能够仿真以前节点之间的数据通信,然后与新节点相连,就可以测试出新节点的功能性和可靠性,这也就是半实物仿真。

通过CAPL你也能够对你网络上的数据通信进行分析优化,也能做一个网关程序——连接2种不同的总线,保证不同类型总线之间的数据通信。

 CAPL程序与数据库结合起来,通过调用数据库中的信号,消息,环境变量和实际测试环境联系起来,从而你能够实时监测总线上的数据通信;能够接受总线上的控制信息,使得模拟面板上的控件进行动作;也能够通过总线发出控制信息,控制外部环境动作,从而支持开发全仿真,半实物仿真,测试分析全实物系统3个仿真阶段,对节点的仿真很重要的地方就是准确的描述节点在总线上的动作。

(二)CAPL功能

  • 编写解决问题的函数
  • 仿真控制设备
  • 仿真控制系统的环境
  • 执行测试和验证
  • 作为网关

(三)CAPL特征

  • 基于事件建模的语言
  1. 总线事件
  2. 属性事件
  3. 时间事件
  • 类似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

msg.Stop = getvalue (this);

// Output the message on the bus
output (msg);
}

(八)消息选择器

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

  • ID     消息标识符

On message * {

If (this.ID == 0x600) {

Write ("message 0x600 received; triggering logging...");

Trigger ();

}

}

  • CAN     通道编号

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

On key '1' {

Write ("sende via CAN 1");

msg.CAN = 1;

Output (msg);

}

on key '2' {

write("sende via CAN 2");

msg.CAN = 2;

output(msg);

}

  • DLC     数据编码长度

on message OneByteMessage {

if (this.DLC != 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 (this.DIR == RX) {

write("message 0x100 received");

}

if (this.DIR == TX) {

write("message 0x100 sent");

}

}

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

Selector RTR (remote transmission request)

// send remote frame

message 0x100 rmsg;

rmsg.RTR = 1;

output(rmsg);

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

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

on message 0x100 {

if (this.TYPE == 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 = (this.TIME - lastTime - sendDist); // in 10 us

lastTime = this.TIME;

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 (this.dir == RX) {

If (! this.SIMULATED) {

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

}

Putvalue (Bulb, this.OnOff);

}

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)

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

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

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信小程序
  • 我的微信小程序扫一扫
  • weinxin
lichongyang
  • 本文由 发表于 2020年3月31日20:51:04
  • 转载请务必保留本文链接:https://www.chongyangli.com/archives/capl%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0%e6%96%87%e6%a1%a3/
IAP协议 总线

IAP协议

协议采用Yomdem协议, Ymodem协议主要有3部分组成: 1.文件传输开启 2.数据传输 3.文件传输结束 文件传输过程: (1)开启是由接收方开启传输,它发一个大写字母"C"开启传输。然后进入...
汽车boot loader开发要点 车载知识

汽车boot loader开发要点

1. Bootloader 的功能 Bootloader,顾名思义,就是驻留在 ECU 非易失性存储器中的一段程序加载代码,每次 ECU 复位后,都会运行 Bootloader。它会检查是否有来自通信...
汽车CAN总线资料下载 CANoe

汽车CAN总线资料下载

CAN总线基础 CAN总线技术基础下载 CAN总线详细教程精心编制不可错过下载 CANoe介绍 CANoe培训介绍下载 Part1-CANoe概述下载 Part2-CANoe软件界面介绍下载 Part...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: