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)
版权声明:本文标题:(完整word版)CAPL语言学习文档 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735700007a1682880.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论