Capl编程: CAPL简介:变量数据类型

在官方文档中的位置:

CAPL程序由两部分组成:

以下变量数据类型可用。它们在声明时即可初始化。

整数和浮点数与其他编程语言中的用法相同。它们彼此兼容,对于整数,算术运算以32位精度进行,对于浮点数,则以80位精度进行

1 标量数据类型

  • 整数形式
    • byte (unsigned, 1 Byte)
    • word (unsigned, 2 Byte)
    • dword (unsigned, 4 Byte)
    • int (signed, 2 Byte)
    • long (signed, 4 Byte)
    • int64(signed, 8 Byte)
    • qword(unsigned, 8 Byte)
  • 字符串
    • char (1 Byte)
  • 浮点数
    • float (8 Byte)
    • double (8 Byte)

2 自定义结构

3 枚举类型

查看链接:CAPL简介-基础------ 8 Enumeration Types

  • enum

4 关联域

  • int mfloat

5 Objects

5.1A429

5.1.1 a429word

ARINC字可以通过CAPL程序进行控制。使用关键字a429word创建ARINC单词对象。数据库中定义的ARINC单词也可用于初始化。

为了在编程环境中更方便,提供了CAPL包含文件。该文件为程序员提供了许多符号常量和一些辅助例程,作为对CAPL API的补充。在CAPL代码的include部分使用以下语句:#include"A429/A429utils.cin"。

c 复制代码
示例:创建ARINC单词对象
a429word 0x82 myA429msg1; // (1)

a429word Label_123 myA429msg2; // (2)

a429word * myA429msg3; // (3)

ARINC单词对象的成员通过选择器访问。

c 复制代码
	
示例:根据请求传输ARINC字

a429word * myA429msg4 = {msgChannel = 1, id = 0x82}; // create ARINC word
myA429msg4.dword(0) = 0x1234 << 10; // shift behind SDI
output(myA429msg4); // transmit it

ARINC单词特定事件程序

如果收到有效的ARINC单词事件,则调用事件过程。请注意,ARINC字事件可能由连接的硬件通道触发,甚至在内部由模拟节点或交互式生成器 触发。事件程序on a429Word 和on a429Worderror可用。

注意:

大多数API函数都需要一个ARINC字作为参数。请注意,在这个ARINC单词中,需要为选择器msgchannel分配一个有效的通道。

5.1.1 a429settings

为了通道配置的目的,提供了一个特定的变量类型a429settings。通道配置设置可以通过功能a429GetConfiguration、a429SetConfiguration和a429ResetEx访问。

请注意,配置设置可能会覆盖硬件配置对话框中的设置。

5.2、 AFDX

AFDX消息可以通过CAPL程序进行控制。使用关键字a664Message创建AFDX消息。对于以下情况,您需要一条消息:

  • 创建AFDX流量并控制有效载荷
  • 存储接收到的AFDX消息以供以后评估/比较

    使用符号**数据库(databases)**时,完整的声明包括消息标识符或消息名称。消息标识符以十进制或十六进制表示法输入为数字(整数),以标识消息。""的条目表示该变量起初没有任何消息标识符。如果消息是使用来自数据库的消息名称创建的(示例(1)),则来自数据库属性的相应设置信息(例如VL、IP地址和UDP端口)用于初始化。
    基于数字或"
    "创建的消息对象没有有效的地址信息。如果您想发送消息,您需要以下步骤:

5.2.1 a664Message

5.2.2 a664Frame

5.3 CAN/LIN messages

CAPL程序在总线上传输的CAN消息用message声明。

5 3.1 message

5 3.1.1定义

CAPL程序输出的消息用关键字message声明。使用符号数据库时,完整的声明包括消息标识符或消息名称。例如,在总线上输出标识符为A(十六进制)和100(十进制)的消息以及数据库(database)中定义的消息EngineData。

你可以写:

cpp 复制代码
message 0xA m1;
message 100 m2;
message EngineData m3;
...
output(m1);
output(m2);
output(m3);

消息标识符以十进制或十六进制表示法输入为数字(整数),以标识消息。在扩展标识符(extended identifiers)后附加一个x。*的条目表示该变量起初没有任何消息标识符。然后,在发送对象之前,必须以另一种方式建立标识符。例如,这些对象可以用于过滤任务,以保存所有要原封不动传递的对象。(在这种情况下,会复制接收到的消息,包括其消息标识符。)

通过输入数据类型作为数据选择器和字节值偏移量(从0开始)来访问消息的数据区域。可以使用以下数据选择器:LONG、DWORD、INT、WORD、CHAR和BYTE。

例如,以下操作将导致在总线上传输具有DLC=1和第一个数据字节0xFF的消息100:

cpp 复制代码
message 100 msg;
msg.DLC = 1;
msg.BYTE(0) = 0xff;
output(msg);

对象的组件由选择器访问。如果您希望为特定芯片定义对象(适用于具有多个CAN芯片的CAN卡),您可以在消息前插入特定选择器(CAN1或CAN2)的前缀,后跟小数点(.)。

5.3.1.2 Selectors

您可使用以下选择器访问CAN message对象的控制信息:

5. 3.1.2.1 Identification
关键字 描述 类型 访问限制 板载 CAPL
CAN 接收该帧所通过的传输通道。取值范围:1...32 word ---
MsgChannel 接收该帧所通过的传输通道。取值范围:1...32 word ---
ID 报文标识符 dword ---
name 来自数据库的(未限定)报文符号名称(自7.2版本起) char\[\] 只读 ---
DIR 传输方向,事件分类;可选值:Rx、Tx、TXREQUEST byte ---
RTR 远程帧请求;可选值:0(无RTR)、1(有RTR) byte ---
TYPE 为高效评估而组合的DIR和RTR。(TYPE = (RTR << 8) | DIR) ---
DLC 报文数据场长度通过DLC(数据长度码)进行编码。取值范围:0...15 ► 数据场长度: CAN报文:0...8 CAN FD报文:0...64 ► J1939参数组:0...1785 byte ---
DataLength 数据长度(字节) byte ---
  • Example Selector CAN (controller number):
cpp 复制代码
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);
}
  • Example Selector ID (message identifier):
cpp 复制代码
on message * {
  if (this.ID == 0x600) {
    write("message 0x600 received; triggering logging...");
    trigger();
  }
}
  • Example Selector DIR (direction of transmission):
cpp 复制代码
on message 0x100 {
  if (this.DIR == Rx) {
    write("message 0x100 received");
  }
  if (this.DIR == Tx) {
    write("message 0x100 sent");
  }
}
  • Example Selector RTR (remote transmission request):
cpp 复制代码
// send remote frame
message 0x100 rmsg;
rmsg.RTR = 1;
output(rmsg);
  • Example Selector TYPE:
cpp 复制代码
message 0x100 resp_msg = {dlc = 2, word(0) = 0x1234};

on message 0x100 {
  if (this.TYPE == RXREMOTE) {
    // remote frame 0x100 received
    output(resp_msg);
  }
}
  • Example Selector DLC (data length code):
cpp 复制代码
on message OneByteMessage {
  if (this.DLC != 1) {
    write("error: OneByteMessage has DLC != 1");
    stop();
  }
}

消息的数据字段长度使用DLC(数据长度码)进行编码。

取值范围:0...15

  • 数据字段长度:
    CAN消息:0...8
  • CAN FD消息:0至64
  • J1939参数组:0...1785

数据字段长度:

5. 3.1.2.2 Message Times and Lengths
关键字 描述 类型 访问限制 板载 CAPL
TIME_NS 时间点,单位:纳秒 int64 只读
TIME 时间点,单位:10微秒 dword --- ---
SOF 帧起始时间戳,单位:纳秒 int64 只读 ---
FrameLen 帧持续时间,单位:纳秒 dword 只读 ---
Bitcount CAN/CAN FD 报文的位数(包含 IFS 位) word --- ---
  • Example Selector TIME_NS (time stamp of message in nanoseconds):

类型 int64(有符号64位整数)------仅可读。

cpp 复制代码
On message CAN1.100 {
  Write("CAN -- Frame with time %I64d received", this.time_ns);
  • **Example Selector TIME (time stamp of message in units of 10 microseconds): **

在此示例中,我们检查消息是否总是在相同的发送距离sendDist内被接收。

在测量开始时,lastTime被设置为零。

cpp 复制代码
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);
  } 
}
5. 3.1.2.3 Data Access
关键字 描述 类型 访问限制 板载 CAPL
Byte(x) 报文数据字节(无符号8位);x* 的可选值:0...63 byte ---
Word(x) 报文数据字(无符号16位);x* 的可选值:0...62。索引基于字节寻址;例如,word(1) 引用从字节1开始的数据,包含字节1...2(16位)。 word ---
DWord(x) 报文数据双字(无符号32位);x* 的可选值:0...60。索引基于字节寻址;例如,dword(1) 引用从字节1开始的数据,包含字节1...4(32位)。 dword ---
QWord(x) 报文数据四字(无符号64位);x* 的可选值:0...56 qword ---
char(x) 报文数据字节(有符号8位);x* 的可选值:0...63 char ---
int(x) 报文数据字(有符号16位);x* 的可选值:0...62。索引基于字节寻址;例如,int(1) 引用从字节1开始的数据,包含字节1...2(16位)。 int ---
long(x) 报文数据长字(有符号32位);x* 的可选值:0...60。索引基于字节寻址;例如,long(1) 引用从字节1开始的数据,包含字节1...4(32位)。 long ---
int64(x) 报文数据(有符号64位);x* 的可选值:0...56 int64 ---
float(x) 报文数据解释为IEEE浮点数(32位);x* 的可选值:0...60 float ---
double(x) 报文数据解释为IEEE双精度浮点数(64位);x* 的可选值:0...56 double ---

Example: Data Access:

5. 3.1.2.4 Flags
关键字 描述 类型 访问限制 板载 CAPL
MsgFlags 发送和接收标志。如果设置了多个标志,它们的值将按逻辑或运算组合。 dword 只读
0x02 发送报文前将清空发送缓冲区------报文不会被其他报文阻塞。
0x04 CAN收发器的NERR标志在报文接收时处于活动状态(系统处于单线模式)。
0x08 报文将发送或已在高压模式下接收。
0x10 远程帧。
0x40 发送确认(等同于 DIR==Tx)。
0x80 发送请求(等同于 DIR==TXREQUEST)。
其他所有位 保留。
SIMULATED 报文由模拟的CAPL节点发送;可选值:0(否),1(是)。已针对CANalyzer 1.2版或2.0版的仿真设置进行修改,以区分真实组件和仿真组件。 byte ---
FDF FDF格式指示符。0 = 经典CAN报文,1 = CAN FD报文。 char ---
BRS 比特率切换。仅适用于CAN FD报文。0:数据段使用仲裁比特率,1:数据段使用数据比特率。 char ---
ESI 错误状态指示符。读/写:0 = ESI未设置,1 = ESI已设置。写入:2 = CAN控制器根据控制器状态自动设置ESI。 char ---
SRR_INV 反转的SRR。(该值仅对某些CAN硬件和特定驱动程序可用。)取值范围:0、1。默认值:0。 char ---
R0 总线上R0位的电平。(该值仅对某些CAN硬件和特定驱动程序可用。)取值范围:0、1。 char 只读
R1 总线上R1位的电平。(该值仅对某些CAN硬件和特定驱动程序可用。)取值范围:0、1。 char 只读
TxFailed 发送报文时,可使用TxReqCount设置发送尝试次数(单次发送模式)。如果无法发送报文且发送错误通知处于活动状态,您将在跟踪窗口(trace window)和CAPL中通过TXReq报文和TxFailed报文选择器收到通知。取值范围:0、1。 char 只读 ---
  • Example Selector SIMULATED (message from simulated node):
cpp 复制代码
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");
  }
}
5. 3.1.2.5 PDU Access
关键字 描述 类型 长度 只读 板载 CAPL
GetPDU(n, P) 获取此报文中索引为 n 的 PDU。第一个 PDU 的索引 n = 0,最后一个 PDU 的索引 n = PDUCount() - 1。参数 P 的类型必须为 PDU *。返回值非 0 表示出错。返回值:0:数据访问成功。-1:总线类型错误。-2:该帧不支持访问 PDU。-3:PDU 对象无效。-4:PDU 不是 RX 类型。-5:参数过小(例如数组字节数过少)。-6:报文或 PDU 不再可用。-7:PDU 索引越界。使用选择器 PDUCount() 确定 PDU 数量。 ---
IsContainer() 如果至少有一个 AUTOSAR ContainerIDu 映射到此报文,则返回 1,否则返回 0。负返回值表示出错。可能的错误代码请参见 GetPDU() 选择器。 ---
PDUCount() 返回此报文中所有 PDU 的数量。返回值包括已映射的 PDU(即使更新位未设置)。返回值包括 ContainerIDu 中包含的所有 PDU,但不包括 ContainerIDu 本身。负返回值表示出错。可能的错误代码请参见 GetPDU() 选择器。 ---
PDUOffset(n) 返回此报文中索引为 n 的 PDU 在其报文数据载荷内起始位置的字节偏移量。负返回值表示出错。可能的错误代码请参见 GetPDU() 选择器。 ---
5. 3.1.2.6 Other Properties
其他属性 描述 默认值 只读 板载 CAPL
FrameCRC 报文的校验和。 ---
TxReqCount 报文的发送尝试次数。(该值仅对某些CAN硬件和特定驱动程序可用。)设置为0时,报文将一直重复发送,直到成功发送一次为止。另请参阅发送错误通知。取值范围:0...15。默认值:0。 0 --- ---
TxCountRequired 报文所需的发送尝试次数(仅在 TxReqCount > 0 时有效)。取值范围:0...15。 --- ---
StuffCount 包含 CAN FD ISO 报文的填充计数。对于其他报文格式,该值为0。类型:byte。 --- ---
5. 3.1.3 Symbolic Constants

为了实现独立于DIR和RTR的实际编码,可以使用以下符号常量:

For DIR:

描述
Rx 已接收到报文(DIR == Rx)
Tx 已发送报文(DIR == Tx)
TXREQUEST 已为报文设置发送请求(DIR == TXREQUEST)

For 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)
5.3.1.3.1 multiplexed_message

对于包含多路复用信号的消息,可以使用数据类型multiplexed_message。对于此类消息,每个信号值都会自动生成缓冲区。一旦多路复用器信号发生变化,活动信号的信号值都会被写入消息中。

Example:

消息Msg1携带多路复用器信号m1。如果m1的信号值为0,则它还携带信号s1和s2。如果信号值为1,则它携带较长的信号s3。以下CAPL代码为多路复用器输出两次具有正确信号值的消息。

cpp 复制代码
variables {
  multiplexed_message Msg1 msg;
}
on pre_start {
  msg.s1 = 1;
  msg.s2 = 2;
  msg.s3.phys = 6.5;
}
void sendTheMessage(int multiplexor)
{
  msg.m1 = multiplexor;
  output(msg);
}
on start {
  sendTheMessage(0);
  sendTheMessage(1);
}

与普通消息不同,多路复用消息的数据不能通过byte()、word()或其他选择器访问。还必须将类型为multiplexed_message的变量显式转换为消息,以便调用参数类型为message的自定义函数。

Example:

cpp 复制代码
void f()
{
  multiplexed_message Msg1 msg;
  // msg.byte(2) = 3; // error
  ((message Msg1) msg).byte(2) = 3;   // OK, but questionable
}

必须使用来自数据库的具体消息定义multiplexed_message类型的变量。不允许通过其ID或*进行定义。

您无法在multiplexed_message上生成类型on multiplexed_message。请使用消息上的类型,并在读取信号时注意多路复用器值。

Note: 数据类型multiplexed_message不能与旧版本的CANalyzer一起使用。因此,它只能用于CANalyzer 7.0或更高版本的CAPL程序。

5.3.1.3.2 linFrame

表:LIN 报文属性

关键字 描述 类型 访问限制
Time 与计算机上的全局时间基准(CAN硬件或PC系统时钟)同步的时间戳。单位:10µs dword 只读
Time_ns 与计算机上的全局时间基准(CAN硬件或PC系统时钟)同步的时间戳。单位:纳秒 int64 只读
MsgOrigTime 由LIN硬件生成的时间戳。该时间戳与计算机上的全局时间基准同步,因此仍是原始的。可用于比较两个LIN硬件生成事件的时间。单位:10µs dword 只读
MsgTimeStampStatus MsgOrigTime的状态:位0置位,位1置位,位4:具有总线特定含义;当前不用于LIN。 byte 只读
LIN_HeaderTime 帧头传输时间。单位:位时间 byte 只读
LIN_Fulltime 整个事件传输时间(主节点发送帧头并等待最大帧持续时间)。单位:位时间 byte 只读
ID LIN帧标识符(6位)。取值范围:0...63 byte ---
DLC 帧中包含的数据字节数(数据长度码)。取值范围:0...8 byte ---
MsgChannel 接收该帧所通过的传输通道。 byte ---
DIR 传输方向:Tx:帧已由LIN硬件发送,Rx:已接收到帧。 byte 只读
SIMULATED 此标志指定帧是否被仿真。值:0:未仿真,1:已仿真。 byte 只读
RTR 仅当使用 output() 发送帧时需要此标志。含义:0:将重新配置响应数据,1:帧头被应用到总线上------仅在LIN硬件处于主节点模式时有效。 byte ---
Byte(x) 帧数据字节(8位)。x的可选值:0...7 byte ---
Word(x) 帧数据字(16位)。x的可选值:0...6。索引基于字节寻址。例如,word(1) 引用由字节1-2组成的数据,而不是字节2-3。 byte ---
dword(x) 帧数据双字(32位)。x的可选值:0...4。索引基于字节寻址。例如,dword(1) 引用由字节1-4组成的数据,而不是字节4-7。 dword ---
breakLen 同步间隔段的长度,单位:纳秒 byte ---
delimiterLen 同步分隔符的长度,单位:纳秒 byte ---
EOH 帧头结束时间戳,单位:纳秒 byte ---
EOBi 数据字节 的字节结束时间戳,单位:纳秒 byte ---
SOF 帧起始时间戳,单位:纳秒 byte ---
HeaderBaudrate 此事件LIN帧头测量到的波特率。 double 只读

5. 4 Database definition

定义不是有值的具体对象,而只是描述。要将变量传递给函数,它必须首先引用数据库对象。这可以通过赋值(例如,测试单元参数)或查找函数调用来完成。

Example:

cpp 复制代码
 void function1(dbMsg * msgDef)
{
  ...
}

void function2()
{
  dbMsg * msgDefinition; // variable of database definition type
  msgDefinition = ABSdata; // assign message definition to variable
  function1(msgDefinition); // commit variable to function1

  // lookup function call
  msgDefinition = lookupMessage("EngineData"); // pass message definition to variable
  function1(msgDefinition); // commit variable to function1

5. 4.1 dbMessage

lookupMessage

函数概要:

项目 描述
函数原型 dbMsg * lookupMessage(char message[])
功能说明 在数据库中搜索报文定义。如果未找到报文,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 dbMsg。注意事项:建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。
参数 messageName:报文的限定名称。语法为 [NetworkName::][NodeName::]MessageName,即网络名称和节点名称均为可选。
返回值 找到的唯一报文定义,或一个无效对象。
可用性 起始版本:10.0 限制到:CAN 分析分支:支持 发送分支:支持
示例 请参见"变量的数据类型(Data Types for Variables))"

附加说明:

  • 错误处理差异
    • 测试模块/单元:若报文未找到或名称不唯一,会报告错误
    • 仿真/分析节点:仅向写窗口输出警告 ,并返回无效 dbMsg
  • 实时性提醒:该函数涉及数据库检索,频繁调用可能影响实时性能,请谨慎使用。

5. 4.2 dbNode

函数概要:lookupNode:

项目 描述
函数原型 dbNode * lookupNode(char nodeName[]);
功能说明 在数据库中搜索节点定义。如果未找到节点,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 dbNode
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。
参数 nodeName:节点的限定名称。语法为 [NetworkName::]NodeName,即网络名称是可选的。
返回值 找到的唯一节点定义,或一个无效对象。
起始版本 10.0
限制到 CAN
分析分支支持
发送分支支持
示例 请参见"变量的数据类型"

5. 4.3 dbPdu

函数概要:lookupPDU:

项目 描述
函数原型 dbPDU * lookupPDU(char pduName[]);
功能说明 在数据库中搜索 PDU 定义。如果未找到 PDU,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 dbPDU
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。
参数 pduName:PDU 的限定名称。语法为 [NetworkName::][NodeName::]PDUName,即网络名称和节点名称均为可选。
返回值 找到的唯一 PDU 定义,或一个无效对象。
起始版本 10.0
限制到 CAN
分析分支支持
发送分支支持
示例 请参见"变量的数据类型"

5. 4.4 dbFrFrame

函数概要:lookupFrFrame:

项目 描述
函数原型 dbFrFrame * lookupFrFrame(char frameName[]);
功能说明 在数据库中搜索 FlexRay 帧定义。如果未找到帧,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 dbFrFrame
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。
参数 frameName:帧的限定名称。语法为 [NetworkName::][NodeName::]FrameName,即网络名称和节点名称均为可选。
返回值 找到的唯一帧定义,或一个无效对象。
起始版本 10.0
限制到 FlexRay
分析分支支持
发送分支支持
示例 请参见"变量的数据类型"

5. 4.5 dbFrPdu

函数概要:lookupFrPDU:

项目 描述
函数原型 dbFrPDU * lookupFrPDU(char pduName[]);
功能说明 在数据库中搜索 FlexRay PDU 定义。如果未找到 PDU,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 dbFrPDU
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。
参数 pduName:PDU 的限定名称。语法为 [NetworkName::][NodeName::]PDUName,即网络名称和节点名称均为可选。
返回值 找到的唯一 PDU 定义,或一个无效对象。
起始版本 10.0
限制到 FlexRay
分析分支支持
发送分支支持
示例 请参见"变量的数据类型"

5. 5 Diagnostics messages

5. 5.1 diagRequest

此类表示诊断请求。

以下是图片内容的原文表格,未作翻译,可直接复制到 Markdown 文档中使用:

项目 内容
Note 这些方法与相应CAPL函数的描述相关联。
Function Syntax diagRequest ECUQualifier.serviceIdentifier objectName; // Form 1, Syntax with ECU Qualifier in DiagRequest/Response Objects diagRequest serviceIdentifier objectName; // Form 2, deprecated< Examples: diagRequest Door.defaultSessionStart req; diagRequest this req; diagRequest defaultSessionStart req;
Constructor ---
Destructor ---
Method Syntax CheckValidNegResCode GetComplexParameter GetComplexParameterRaw, SetComplexParameterRaw GetComplexRespParameter GetComplexRespParameterRaw GetIterationCount, GetRespIterationCount GetLastResponse GetLastResponseCode GetObjectName GetObjectPath GetParameter GetParameterName GetParameterPath, GetParameterPath GetParameterRaw, SetParameterRaw GetParameterType, GetRespParameterType GetParameterUnit GetPrimitiveByte GetPrimitiveData, SetPrimitiveData GetPrimitiveSize GetRespParameter GetRespParameterRaw GetRespPrimitiveByte GetRespPrimitiveSize GetSuppressResp, SetSuppressResp IsRaw IsRawResp ResetParameter Resize SendRequest SetComplexParameter SetParameter SetPrimitiveByte SetSuppressResp

5. 5.2 diagResponse

此类表示诊断响应。

以下是图片内容的原文表格,未作翻译,可直接复制到 Markdown 文档中使用:

项目 内容
Note 这些方法与相应CAPL函数的描述相关联。.
Function Syntax diagResponse ECUQualifier.serviceIdentifier objectName; // Form 1, Syntax with ECU Qualifier in DiagRequest/Response Objects diagResponse serviceIdentifier objectName; // Form 2 (deprecated) Examples diagResponse Door.defaultSessionStart resp; diagResponse this resp; diagResponse defaultSessionStart resp;
Constructor ---
Destructor ---
Method Syntax CheckValidNegResCode GetComplexParameter GetComplexParameterRaw, SetComplexParameterRaw GetComplexRespParameterRaw GetIterationCount GetLastResponse GetObjectName GetObjectPath GetParameter GetParameterName GetParameterPath, GetRespParameterPath GetParameterRaw, SetParameterRaw GetParameterType, GetRespParameterType GetParameterUnit GetPrimitiveByte GetPrimitiveData, SetPrimitiveData GetPrimitiveSize GetResponseCode IsNegativeResponse IsPositiveResponse IsRaw ResetParameter Resize SetComplexParameter SetParameter SetPrimitiveByte

Note

编辑包含diagRequest或diagResponse类型变量的CAPL文件时,必须注意以下有关服务限定符的内容:

如果出现CAPL关键字,则必须始终将服务限定符放在引号中:

例如,"START_SESSION::DEFAULT_SESSION::Start"

在CANoe<7.0之前,您必须将长度超过50个字符的服务限定符放在引号中。

自CANoe7.0以来,您必须将长度超过128个字符的服务限定符放在引号中。

5. 6 FlexRay

以下是将多张图片内容合并翻译后的中文表格,便于您复制到 Markdown 文档中使用。

5. 6.1 FRFrame
类别 项目 描述
函数语法(Function Syntax) 语法1 frFrame <frame name> <frame var>; 使用数据库中的符号化帧名称。
语法2 frFrame MsgChannel<num>.<frame name> <frame var>; 使用数据库中的符号化帧名称并指定发送通道/集群。
语法3 frFrame (<slot ID>, <base cycle>, <cycle repetition>) <frame var>; 用于无数据库时定义传输时间。
语法4 frFrame MsgChannel<num>.<slot ID>, <base cycle>, <cycle repetition> <frame var>; 用于无数据库时定义传输时间和通道/集群。
功能说明(Function) 用于创建 FlexRay 发送对象。可通过与该对象关联的选择器操作对象数据。其他对象特性可通过选择器读取。对象随后使用 frSetSendFrame 注册,并使用 frUpdateStatFramefrOutputDynFrame 函数发送。
参数(Parameters) MsgChannel 定义发送通道/集群。<num> 必须是整数(例如 1, 2, 3 等),定义相应 FlexRay 接口的通道号。
frame name 对应数据库中帧名称的字符串。所需参数(<slot ID><base cycle><cycle repetition><channel mask>)取自数据库中相应的帧定义。
frame var 定义对象变量名称的字符串。
slot ID 指定特定时隙的数字。其值必须在 1 到 2047 之间。
base cycle 指定基本周期的数字。该值必须小于重复因子,范围在 0 到 63 之间。该值与重复因子共同决定"周期复用"。
cycle repetition 指定周期重复因子的数字。该值必须在 1 到 64 之间,且为 2 的倍数(例如 1, 2, 4, 8, 16, 32 或 64)。该值与基本周期共同决定"周期复用"。
通用选择器(Selectors) MsgChannel FlexRay 接口确定的应用通道,用于发送帧。
FR_ChannelMask 标识 CC 的 FlexRay 通道。值为 1 时将帧发送到通道 A,2 发送到通道 B,3 发送到通道 A 和 B。
FR_SlotID 帧必须在此时隙中传输。
FR_CycleOffset FlexRay 基本周期的周期号。该值必须小于 FR_CycleRepetition
FR_CycleRepetition 以 FlexRay 周期倍数为单位的传输时间重复因子。该值必须来自集合 {1, 2, 4, 8, 16, 32, 64}。
FR_PayloadLength 要发送的有效载荷长度,单位为 16 位字(数据类型:word)。
byte(index), word(index), dword(index), qword(index), char(index), int(index), long(index), int64(index), 直接访问帧的有效载荷/数据。有效数据字节数由选择器 FR_PayloadLength 指定。索引始终基于字节寻址并从 0 开始计数。因此,dword(1) 返回字节 1...4 的双字,而不是字节 4...7。如果帧对象通过数据库中的符号名称初始化,信号名称也可直接用作选择器以访问数据范围。获取或设置信号的原始值。物理值可通过 <signal name>.Phys 获取或设置。
FR_Payload 此选择器允许访问有效载荷数组(用于在函数中作为字节数组参数使用)。自 CANoe 7.2 起可用。
FR_Flags 位掩码 标志中的相应位设置或激活要发送帧的特殊状态。 注意: 这些位掩码值仅用于设置FlexRay对象frframe中的FR_Flags
Bit Mask Meaning
0x01 在头中设置同步位。只有静态段中的帧可以设置此位。注意: 此位仅在函数 frSetSendFrame 中评估。此标志已弃用(适用于 CANoe ≥ 7.2)!请改用函数 frSetKeySlot
0x02 在头中设置启动位。如果设置了此位,则必须同时设置同步位。注意: 此位仅在函数 frSetSendFrame 中评估。此标志已弃用(适用于 CANoe ≥ 7.2)!请改用函数 frSetKeySlot
0x10 将发送模式设置为事件触发。如果未设置,帧将以时间触发模式传输。
0x20 设置有效载荷前导位。对于静态帧,初始数据字节随后包含本地 NM 向量;对于动态帧,前两个字节随后指定扩展消息 ID。
0x80 Tx OFF。帧不再发送,相应时隙保持为空。此标志仅可与 VN 接口一起使用。
0x200 禁用周期内重复使用。该标志仅对周期内重复帧有效。如果设置了该标志(1),则可以在参数 slotID 给出的时隙中发送帧。如果未设置(0 = 默认),则帧将在由数据库中周期内重复定义给出的任何时隙的下一个时隙中发送。CANalyzer 版本 ≥ 7.1 SP3。
0x400 在头中设置空帧指示符。此标志仅可与 VN 接口一起使用。
0x800 使用 PDU 缓冲区。设置此标志可启用帧缓冲区的创建,同时仍可发送 PDU。此标志保留发送缓冲区配置中的 PDU 缓冲区设置。
标志的其他所有位均保留。 注意!: 如果将FRFrame对象作为frSetSendFrame函数的参数,那么请考虑为此函数定义的标志
FR_Payload 此选择器允许访问有效载荷数组(用作函数中的字节数组参数)。 自CANoe 7.2版本起可用。
PDU 访问
GetPDU(n, P) 获取此 FlexRay 帧中索引为 n 的 PDU。 第一个 PDU 的索引 n = 0,最后一个 PDU 的索引 n = PDUCount() - 1。 参数 P 的类型必须为 PDU*。 返回值非 0 表示出错。 返回值: 0:数据访问成功; -1:总线类型错误; -2:该帧不支持访问 PDU; -3:PDU 对象无效; -4:PDU 不是 RX 类型; -5:参数过小(例如数组字节数过少); -6:报文或 PDU 不再可用; -7:PDU 索引越界。使用选择器 PDUCount() 确定 PDU 数量。自 CANalyzer 10.0 SP4 起可用(启用 FlexRay AUTOSAR PDU 时)。
IsContainer() 如果至少有一个 AUTOSAR ContainerIPdu 映射到此 FlexRay 帧,则返回 1,否则返回 0。负返回值表示出错。可能的错误代码请参见 GetPDU() 选择器。 自 CANalyzer 10.0 SP4 起可用(启用 FlexRay AUTOSAR PDU 时)。
PDUCount() 返回此 FlexRay 帧中所有 PDU 的数量。返回值包括已映射的 PDU(即使更新位未设置)。返回值包括 ContainerIPdu 中包含的所有 PDU,但不包括 ContainerIPdu 本身。负返回值表示出错。可能的错误代码请参见 GetPDU() 选择器。自 CANalyzer 10.0 SP4 起可用(启用 FlexRay AUTOSAR PDU 时)。
PDUOffset() 返回此 FlexRay 帧中索引为 n 的 PDU 在其有效载荷内起始位置的字节偏移量。负返回值表示出错。可能的错误代码请参见 GetPDU() 选择器。自 CANalyzer 10.0 SP4 起可用(启用 FlexRay AUTOSAR PDU 时)。
可用性(Availability) 起始版本 6.1
限制到 FlexRay
分析分支支持
发送分支支持
增强 7.5:增强了在数组中使用和作为函数参数的功能
示例1 示例请参见函数 frUpdateStatFrame
示例2 将有效载荷转发到其他函数的示例。 variables { const dword cFrTTFlag = 0x00; const dword cFrETFlag = 0x10; const dword cFrPPFlag = 0x20; const dword cFrStopFlag = 0x80; // only for VN const dword cFrNullFlag = 0x400; // only for VN } void foo (byte data[], int bytecount) { // evaluate or set the contents of the data array } void example () { ` frFrame (1,0,1) myFrame = { FR_Flags = cFrTTFlag
示例3 将帧对象用作函数参数的示例。 variables { const dword cFrTTFlag = 0x00; const dword cFrETFlag = 0x10; const dword cFrPPFlag = 0x20; const dword cFrStopFlag = 0x80; // only for VN const dword cFrNullFlag = 0x400; // only for VN ` frFrame (1,0,1) myFrame = { FR_Flags = cFrTTFlag
示例4 在数组中使用帧对象的示例。注意: 数组中的所有对象必须使用适当的帧定义进行初始化! variables { frFrame (1,0,1) frml; // All objects are equal: frFrame (2,0,1) frArray1[10]; // All objects may be different: frFrame * frArray2[3] = { (3,0,1), <FrameNameFromDB>, frml }; }

5. 6.2 FRPDU

类别 项目 描述
函数语法 语法1 frPDU <FIBEX PDU name> <PDU var>; 使用数据库中的符号化 PDU 名称创建传输对象。
语法2 frPDU MsgChannel<num>.<FIBEX PDU name> <PDU var>; 使用数据库中的符号化 PDU 名称创建传输对象,并额外指定传输通道/集群。
功能说明 用于创建 FlexRay PDU 对象。可通过对象的选择器操作对象数据。其他对象特性可从选择器中读取。对象随后使用 frSetSendPDU 注册,并使用 frUpdatePDU 函数进行传输。
参数 <FIBEX PDU name> 对应数据库中 PDU 名称的字符串。唯一标识 PDU 所需的参数取自数据库中相应的 PDU 定义。
<PDU var> 指定对象变量名称的字符串。
MsgChannel<num> 指定传输通道/集群。<num> 必须是整数(例如 1, 2, 3 等),指定相应 FlexRay 接口的通道号。
通用选择器 MsgChannel FlexRay 接口确定的应用通道,用于发送 PDU。
Name 返回 PDU 的符号名称(数据类型:char array\[\])。注意: 此选择器不适用于在接口硬件上执行 CAPL 代码(板载 CAPL)。
FR_ChannelMask 写保护! 标识 CC 的 FlexRay 通道。值为 1 时,PDU 在通道 A 上传输;值为 2 时,在通道 B 上传输;值为 3 时,在通道 A 和 B 上传输。
FR_PDULength 写保护! 要发送的 PDU 有效载荷长度,单位为字节(数据类型:word)。
byte(index) , word(index), dword(index), qword(index), char(index), int(index), long(index), int64(index), 直接访问 PDU 的有效载荷/数据。有效数据字节数由选择器 FR_PDULength 指定。索引始终基于字节寻址并从 0 开始计数。因此,dword(1) 返回字节 1...4 的双字,而不是字节 4...7。信号名称也可直接用作选择器以访问数据范围。获取或设置信号的原始值。物理值可通过 <signal name>.Phys 获取或设置。
FR_Payload 此选择器允许访问有效载荷数组(用于在函数中作为字节数组参数使用)。自 CANalyzer 7.2 起可用。
可用性 起始版本 6.0
限制到 FlexRay
分析分支支持 ---
发送分支支持 ---
增强 7.5:增强了在数组中使用和作为函数参数的功能
示例1 示例请参见函数 frUpdatePDU
示例2 描述 将有效载荷转发到其他函数的示例。
代码 void foo (byte[] data, int count) { // evaluate the contents of the data array } void example () { frPDU EngineData myPDU; foo (myPDU.FR_Payload, myPDU.FR_PDULength); }
示例3 描述 将 PDU 对象用作函数参数的示例。
代码 variables { frPDU EngineData myPDU; } void foo (FrPDU * pdu) { // evaluate or set the contents of the PDU object } void example () { foo (myPDU); }
示例4 描述 在数组中使用 PDU 对象的示例。
注意 数组中的所有对象必须使用适当的 PDU 定义进行初始化!
代码 variables { frPDU EngineData pdu1; } // All objects are equal: frPDU EngineData frPDUArray1[10]; // All objects may be different: frPDU * frPDUArray2[2] = { EngineStatus, pdu1 }; frPDU * frPDUArray2[2] = { EngineStatus, pdu2 };

5. 6.3 FRConfiguration

5. 7 MOST messages

5. 7.1 mostMessage

5. 7.2 mostAmsMessage

5. 7.3 mostRawMessage

5. 8 PDUs

PDU 对象创建语法:

语法 描述
PDU short <AUTOSAR short header ID> <PDU var> 使用数据库中的 PDU 短头标识符创建一个带类型的 PDU 对象。
PDU long <AUTOSAR long header ID> <PDU var> 使用数据库中的 PDU 长头标识符创建一个带类型的 PDU 对象。
PDU <AUTOSAR header ID> <PDU var> 使用数据库中的 PDU 头标识符创建一个带类型的 PDU 对象。仅在头标识符唯一时有效。
PDU <AUTOSAR PDU name> <PDU var> 使用数据库中的符号化 PDU 名称创建一个带类型的 PDU 对象。
PDU * <PDU var> 创建一个类型无关的 PDU。类型无关的 PDU 可用作例如通用函数参数。类型无关的 PDU 具有有限的选择器。只有当分配了一个带类型的 PDU 给它时,才能发送类型无关的 PDU。

功能和参数:

项目 描述
功能 用于创建一个 PDU 对象。对象的數據可通过对象的选择器进行操作。其他的对象属性可以从选择器中读取。可以使用 TriggerPDU 函数发送 PDU 对象。
参数 <PDU var>:指定对象变量名称的字符串。

PDU 选择器与属性:

属性/选择器 描述 访问 数据类型/取值
BusType PDU的总线类型(例如 eCAN、eFlexRay、eEthernet 等) 只读 枚举
MsgChannel PDU的通道 只读 -
Time 与计算机全局时间基准(硬件或计算机系统时钟)同步的时间戳 只读 -
Time_ns 与计算机全局时间基准(硬件或计算机系统时钟)同步的时间戳,单位:纳秒 只读 int64
Time_ins 与计算机全局时间基准同步的时间戳 只读 -
Dir PDU的方向(Tx 或 Rx) 只读 -
Simulated 标志,指示此PDU是否为仿真的PDU(即通过仿真节点发送) 只读 -
Name PDU的符号名称 只读 -
ShortHeaderID PDU的短头标识符 只读 -
LongHeaderID PDU的长头标识符 只读 -
PDUSize 接收PDU载荷的缓冲区大小。该大小仅在创建PDU对象时定义 只读 -
PDULength PDU载荷数据的长度 只读 -
byte(index), word(index), dword(index), qword(index), char(index), int(index), long(index), int64(index), 直接访问PDU的载荷/数据。有效数据字节数由选择器 PDULength 指定。索引始终基于字节寻址并从0开始计数。因此,dword(1) 返回字节1...4的双字,而不是字节4...7。信号名称也可直接用作选择器以访问数据范围。获取或设置信号的原始值。物理值可通过 .Phys 获取或设置。信号访问仅适用于带类型的PDU。CAPL AUTOSAR PDU 的最大可访问数据区限制为512字节。 只读 -
UpdateBit 更新位状态。 值含义: -1:不可用(未在数据库中配置); 0:未设置; 1:已设置 - -1 / 0 / 1
Payload 此选择器允许访问载荷数组(用于在函数中作为字节数组参数使用)。自 CANalyzer 9.0 SP4 起可用。 只读 -
ValidationFlags 标志,指示验证过程的结果。数据类型:unsigned int - 见下表
ValidationFlags 取值 0x0:未验证(未知、安全未激活、PDU未经验证); 0x1:验证失败(验证执行 -> 验证失败 -> PDU无效); 0x3:验证成功(验证执行 -> 验证成功 -> PDU有效); 0x8:模块错误(内部模块错误) - 0x0 / 0x1 / 0x3 / 0x8
IsContained 确定PDU是否在容器内传输。数据类型:bool 只读 true/false
AutosarPDUType PDU的AUTOSAR PDU类型。数据类型:enum caplASRPDUType 只读 见下表
AutosarPDUType 取值 0:ePDUTypeUndefined; 1:eSignal_I_PDU; 2:eNM_PDU; 3:eN_PDU; 4:eMultiplexed_I_PDU; 5:eXCP_PDU; 6:eContainer_I_PDU; 7:eDCIM_PDU; 8:eUser_Defined_I_PDU; 9:eGeneral_Purpose_PDU; 10:eGeneral_Purpose_I_PDU - 0...10
IsSecured 枚举,指示数据库中是否有安全信息可用。数据类型:enum caplPduSecuredStateInfo 只读 见下表
IsSecured 取值 0:ePDUNotSecured; 1:ePDUisSecured; 2:ePDUisSecuredContainer - 0 / 1 / 2

PDU 可用性与示例:

项目 描述
起始版本 9.0
限制到 CAN AUTOSAR PDUs
分析分支支持 CAN AUTOSAR PDUs
发送分支支持 CAN (Ethernet)
起始版本 9.0 SP3
限制到 FlexRay AUTOSAR PDUs
分析分支支持 FlexRay AUTOSAR PDUs
发送分支支持 ---

示例:

示例 代码
按键 'a' 示例 PDU short 4 myPDU; myPDU.signal1 = 25; TriggerPDU(myPDU);
函数参数示例 void foo (PDU* parPDU) { // evaluate PDU } void example () { PDU EngineData myPDU; foo (myPDU); }
PDU 事件示例 on PDU CAN_1::SOMEPDU1 { PDU CAN_2::SOMEPDU1 myPDU2; myPDU2.Payload = this.Payload; triggerPDU(myPDU2); }

5. 9 Signals from databases

5. 9.1 Signal *

项目 描述
函数语法 signal * lookupSignal(char signalName[]);
功能说明 在数据库中搜索信号。如果未找到信号,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 signal。
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。
参数 signalName:信号的限定名称。语法为 [Channel::][Database name (alias):][Node::][Message::]Signal;从右向左的对象顺序和完整性很重要。示例请参见 getSignal(char signalName[])
返回值 找到的唯一信号,或一个无效对象。
起始版本 10.0
限制范围 ---
分析分支支持 ---
发送分支支持 ---
示例 ---

5. 10 SOME/IP Service Signals

5. 10.1 serviceSignal *

项目 描述
函数语法 serviceSignal * lookupServiceSignal(char serviceSignalName[]);
功能说明 在数据库中搜索 SOME/IP 服务信号。如果未找到服务信号,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 serviceSignal。
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。lookupServiceSignal 可用于访问在测量期间由字符串指定的服务信号。该函数使得编写涉及服务信号的动态测试成为可能,即服务信号的名称在编译时未知。要访问服务信号的值,需要根据类型使用更具体的 lookupServiceSignal 变体,参见 lookupServiceSignalNumberlookupServiceSignalDatalookupServiceSignalString
参数 serviceSignalName:服务信号的限定名称。
返回值 找到的唯一服务信号,或一个无效对象。
起始版本 10.0

示例:

c 复制代码
// 设置一些服务信号的值
int i;
char serviceSignalNames[3][70] = {
    "sif_2001::TrafficSignDetection::DetectedTrafficSign[0].DistanceToSign",
    "sif_2001::TrafficSignDetection::DetectedTrafficSign[1].Reliability",
    "sif_2001::TrafficSignDetection::DetectedTrafficSign(0).SignType" };
double serviceSignalValues[3] = { 1.0, 2.0, 3.0 };

for(i = 0; i < elcount(serviceSignalNames); i++)
{
    serviceSignalNumber * sig;
    sig = lookupServiceSignalNumber( serviceSignalNames[i] );
    sig = serviceSignalValues[i];
}

5. 10.2 serviceSignalData *

项目 描述
函数语法 serviceSignalData * lookupServiceSignalData(char serviceSignalName[]);
功能说明 在数据库中搜索 SOME/IP 服务信号。如果未找到服务信号,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 serviceSignal。
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。lookupServiceSignalData 可用于访问在测量期间由字符串指定的服务信号。该函数使得编写涉及服务信号的动态测试成为可能,即服务信号的名称在编译时未知。lookupServiceSignalData 适用于可表示为数据(字节数组)的服务信号。对于数值类型和字符串类型,请参见 lookupServiceSignalNumberlookupServiceSignalString
参数 serviceSignalName:服务信号的限定名称。
返回值 找到的唯一服务信号,或一个无效对象。
起始版本 10.0
限制范围 Ethernet
分析分支支持 ---
发送分支支持 ---

示例:

c 复制代码
// 将一些服务信号的数据设置为空数据
int i;
char serviceSignalNames[2][70] = {
    "sif_001::TrafficSignDetection::DetectedTrafficSign.SignData",
    "sif_2001::TrafficSignDetection::DetectedTrafficSign.Image" };
byte emptyData[8] = { 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };

for (i = 0; i < elcount(serviceSignalNames); i++)
{
    serviceSignalData * sig;
    sig = lookupServiceSignalData( serviceSignalNames[i] );
    SetServiceSignalData( sig, emptyData, elcount(emptyData) );
}

5. 10.3 serviceSignalNumber *

项目 描述
函数语法 serviceSignalNumber * lookupServiceSignalNumber(char serviceSignalName[]);
功能说明 在数据库中搜索 SOME/IP 服务信号。如果未找到服务信号,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 serviceSignal。
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。lookupServiceSignalNumber 可用于访问在测量期间由字符串指定的服务信号。该函数使得编写涉及服务信号的动态测试成为可能,即服务信号的名称在编译时未知。lookupServiceSignalNumber 适用于可表示为数值的服务信号。对于数据类型和字符串类型,请参见 lookupServiceSignalDatalookupServiceSignalString
参数 serviceSignalName:服务信号的限定名称。
返回值 找到的唯一服务信号,或一个无效对象。
起始版本 10.0
限制范围 Ethernet
分析分支支持
发送分支支持

示例:

c 复制代码
// 设置一些服务信号的值
int i;
char serviceSignalNames[3][70] = {
    "sif_2001::TrafficSignDetection::DetectedTrafficSign[0].DistanceToSign",
    "sif_2001::TrafficSignDetection::DetectedTrafficSign[1].Reliability",
    "sif_2001::TrafficSignDetection::DetectedTrafficSign[i].SignType"
};
double serviceSignalValues[3] = { 1.0, 2.0, 3.0 };

for (i = 0; i < eCount(serviceSignalNames); i++)
{
    serviceSignalNumber * sig;
    sig = lookupServiceSignalNumber( serviceSignalNames[i] );
    sig = serviceSignalValues[i];
}

5. 10.4 serviceSignalString *

项目 描述
函数语法 serviceSignalString * lookupServiceSignalString(char serviceSignalName[]);
功能说明 在数据库中搜索 SOME/IP 服务信号。如果未找到服务信号,或名称不唯一,测试模块/单元在测试系统中报告错误;而仿真/分析节点在写窗口中输出警告,同时函数返回一个无效的 serviceSignal。
注意事项 建议仅在特殊情况下或测量启动时使用此函数,因为搜索数据库定义可能会影响实时性能。lookupServiceSignalString 可用于访问在测量期间由字符串指定的服务信号。该函数使得编写涉及服务信号的动态测试成为可能,即服务信号的名称在编译时未知。lookupServiceSignalString 适用于可表示为字符串的服务信号。对于数据类型和数值类型,请参见 lookupServiceSignalDatalookupServiceSignalNumber
参数 serviceSignalName:服务信号的限定名称。
返回值 找到的唯一服务信号,或一个无效对象。
起始版本 10.0
限制范围 ---
分析分支支持 ---
发送分支支持 ---

示例:

c 复制代码
// 将一些服务信号的字符串设置为空数据
int i;
char serviceSignalNames[2][70] = {
    "sif_001::TrafficSignDetection::DetectedTrafficSign.Name",
    "sif_2001::TrafficSignDetection::DetectedTrafficSign.Description" };
char emptyString[8] = "";
for (i = 0; i < eCount(serviceSignalNames); i++)
{
    serviceSignalString * sig;
    sig = lookupServiceSignalString( serviceSignalNames[i] );
    SetServiceSignalString( sig, emptyString );
}

5. 11 System Variable Types

以系统变量类型作为数据类型的变量可以引用此类型的任何系统变量。

它们可以移交给职能部门。

System Variable Type Function
sysvar * sysGetVariableTimeNS
sysvarInt * sysGetVariableInt, sysSetVariableInt
sysvarLongLong * sysGetVariableLongLong, sysSetVariableLongLong
sysvarFloat * sysGetVariableFloat, sysSetVariableFloat
sysvarString * sysGetVariableString, sysSetVariableString
sysvarIntArray * sysGetVariableLongArray, sysSetVariableLongArray
sysvarFloatArray * sysGetVariableFloatArray, sysSetVariableFloatArray
sysvarData * sysGetVariableData, sysSetVariableData

5.11.1 测试执行中使用案例的示例

对于CAPL程序,您可以通过CAPL API访问系统变量,对于外部程序,您也可以通过COM API访问系统变量。

示例

以下示例源自Visual

Basic。在这个例子中,在系统中定义了一个名称空间(ns),将一个新的系统变量(var)添加到该名称空间中,并为系统变量设置一个起始值。

cpp 复制代码
value = 10

Set Namespaces = app.System.Namespaces
Set Namespace = Namespaces.Add("ns")
Set Variables = Namespace.Variables
Set Variable = Variables.Add("var", value)

可以使用以下命令更改变量的值:

cpp 复制代码
Variable.Value = 20

在CAPL中,相应的程序代码(无故障排除)如下:

cpp 复制代码
SysDefineNamespace( "ns");
SysDefineVariableInt( "ns", "var", 20);

cpp 复制代码
@sysvar::ns::var = 20;

为了访问(读取)系统变量,Visual Basic中使用了以下命令:

cpp 复制代码
Set Namespace = app.System.Namespaces("ns")
Set Variable = Namespace.Variables("var")
edit.Text = Variable.Value

在CAPL中,它是:

cpp 复制代码
value = @sysvarInt::ns::var;

(语法@只能用于整型或浮点型变量。对于其他数据类型,必须使用相应的函数sysSetVariable...sysGetVariable...。)

示例:

该示例显示了将系统变量类型用作函数的返回值和局部变量。

在该用例中,通过传输相应系统变量的ID,对3个不同的系统变量执行variableTest 测试。在ID和用户定义函数selectVariable(其返回值为系统变量类型Int)的帮助下,确定系统变量。

用户定义函数doVariableTest ()将系统变量类型Int用作局部变量usedVariable

备注:

CAPL代码包含以下Int32类型的系统变量。您必须首先在"系统变量配置"对话框中定义这些变量:

  • SomeNamespace::Variable1
  • SomeNamespace::Variable2
  • SomeNamespace::Variable3
  • TestControl::VariableSelector
cpp 复制代码
variables
{
  int variableIds[3] = { 1, 2, 3 };
}
  // returns the variable which the test shall use,
  // depending on a selector key
  sysvarInt * selectVariable(int variableId)
  {
    switch (variableId)
    {
      case 1:
        return sysvar::SomeNamespace::Variable1;
      case 2:
        return sysvar::SomeNamespace::Variable2;
      case 3:
        return sysvar::SomeNamespace::Variable3;
      default:
        return sysvar::SomeNamespace::Variable3;
    }
  }
  void doVariableTest()
  {
    sysvarInt * usedVariable;
    usedVariable = selectVariable(@TestControl::VariableSelector);

    @usedVariable = 42;
    if (testWaitForSignalMatch(usedVariable, 42, 100) != 1)
      testStepFail("Wait", "Variable %s didn't reach the specified value in time", usedVariable.name);
    else
      testStepPass("Wait", "Variable %s has reached the specified value in time", usedVariable.name);
  }
  testcase variableTest(int variableId)
  {
    char desc[50];
    snprintf(desc, elcount(desc), "Testing Variable%d", variableId);
    testCaseDescription(desc);

    // use the system variable "VariableSelector" just for demonstration
    // purposes (the id could also be given directly to „doVariableTest")
    @TestControl::VariableSelector = variableId;
    testWaitForTimeout(10);

    doVariableTest();
  }

  void MainTest ()
  {
    int i;
    for (i = 0; i < elcount(variableIds); ++i)
    variableTest(variableIds[i]);
  }

5. 12 Timer

Timer或msTimer类型的变量用于创建时间事件。

5. 12.1 timer (s)

您可以在CAPL中定义时间事件。当此事件发生时,即经过一段时间后,会调用相关的定时器程序( on timer )。您可以通过在定时器( on timer )过程中重置相同的时间事件来对循环程序序列进行编程。

在事件过程中,可以使用关键字this访问计时器变量。

您可以使用函数setTimer启动之前定义的计时器。

CAPL中存在以下计时器变量类型:

  • timer -基于秒的计时器
  • msTimer-基于毫秒的计时器

计时器结束后,将调用相关的开启计时器(on timer)过程。定时器类型的变量的最大时间为2147483647秒(=596523.23小时),msTimer类型的变量为2147483647毫秒(=2147483647秒=596,52小时)。使用cancelTimer函数,您可以停止已启动的计时器,从而防止调用相关的启动计时器过程。

备注

如果几个CAPL计时器在同一时间经过:

将执行所有计时器

这些计时器的事件程序将以未定义的顺序运行
示例

按下以下示例中的"a"键后,定时器被设置,20毫秒后,定时器回调被触发:

cpp 复制代码
msTimer myTimer;
message 100 msg;
...
on key 'a' {
   setTimer(myTimer,20);
}
...
on timer myTimer
{
   output(msg);
}
5.12.1.1 版本扩展

版本7.2

从7.2版本开始,您可以使用this.name以字符串常量的形式检索计时器的名称。

版本7.5

从7.5版本开始,您可以将计时器保存在数组中。

cpp 复制代码
Example

variables
{
   mstimer myTimers[10];
}

您必须设置每个单独的计时器,但所有计时器都将调用相同的计时器程序。为此,该过程必须包含一个参数(dword类型),该参数指示刚刚用完的计时器的索引。

cpp 复制代码
Example

on start
{
   dword i;
   for (i = 0; i < elcount(myTimers); ++i)
      myTimers[i].set(100 + 20 * i);
}

on timer myTimers(dword index)
{
   // ...
}

在该过程中,关键字this描述了整个数组。例如,如果你想设置刚刚用完的计时器,你必须为此添加一个索引。

cpp 复制代码
Example

write("Timer %s with index %d fired", this[index].name, index);
setTimer(this[index], 2000);
5.12.1.2 setTimer
5.12.1.2.1 函数语法
c 复制代码
void setTimer(mstimer_t, long duration);           // 形式1
void setTimer(timer_t, long duration);             // 形式2
void setTimer(timer_t, long durationNanoSec);      // 形式3

5.12.1.2.2说明
项目 描述
功能 设置定时器(setTimer 函数)

5.12.1.2.3 注意事项
注意点 描述
定时器精度 CAPL 中定时器的精度取决于所使用的硬件(通常为 1 毫秒)。尽管如此,事件过程(on message、on timer 等)按正确顺序处理,即对于分析目的(如超时监控),可使用事件的时间戳代替硬件生成的时钟信号。
最大值(形式1) 2147483647 ms = 2147483.647 s ≈ 596.52 小时
最大值(形式2) 2147483647 s ≈ 596523.23 小时
最大值(形式3) 2147483647 s + 2147483647 ms ≈ 2147483649 s

5.12.1.2.4 方法语法(动态)
c 复制代码
void setTimer::set(long);

5.12.1.2.5 函数参数
参数 描述
Timer 或 mstimer 变量 定时器变量
duration 指定定时器持续时间的表达式

5.12.1.2.6 返回值


5.12.1.2.7 可用性
起始版本 限制范围 分析分支支持 发送分支支持
所有版本 ---
7.0 SP5(方法) ---

5.12.1.2.8 示例
c 复制代码
variables {
    mstimer_t t1;
    Timer t23;
}

on key F1 {
    setTimer(t1, 200);           // 设置定时器 t1 为 200 ms
}

on key F2 {
    setTimer(t23, 2);            // 设置定时器 t23 为 2 秒
}

on key F3 {
    setTimer(t23, 0, 1250*1000); // 设置定时器 t23 为 1.250 毫秒(即 1250000 纳秒)
}

on timer t1 {
    write("F1 was pressed 200ms ago");
}

on timer t23 {
    write("F2 was pressed 2 sec ago or F3 1250000 nsec ago");
}
5.12.1.2 cancelTimer
5.12.1.2.1 函数:cancelTimer
项目 描述
函数语法 void cancelTimer (msTimer t); void cancelTimer (timer t);
方法语法(动态) void msTimer::cancel();
功能说明 停止一个活动的定时器。
参数 Timer 或 msTimer 变量。
返回值 ---

5.12.1.2.2 可用性
起始版本 限制范围 分析分支支持 发送分支支持
所有版本 --- --- ---
7.0 SP5(方法) --- --- ---

5.12.1.2.3 示例
c 复制代码
variables {
    msTimer takt;
    message 100 data = {dlc = 1, byte(0) = 0xFF, dir = Tx};
}

on Timer takt {
    output(data);
    setTimer(takt, 200);
}

on key F1 {
    cancelTimer(takt); // 取消定时器
    write("canceled");
}

on key F2 {
    setTimer(takt, 200); // 设置定时器为 200ms
    write("start");
}

5. 12.2 msTimer (ms)

同上

6 通信概念的数据类型

  • 通信描述中定义的结构和数组
  • 通信描述中定义的枚举类型
  • callContext
  • 对端点的引用,例如serviceProviderRef、serviceConsumerRef、eventProviderRef、eventConsumerRef(另见通信对象CAPL函数上的对象)
  • 端点之间的连接引用,例如providerServiceRef、consumedServiceRef、providerEventRef、consumptedEventRef、txSignalRef(另见通信对象CAPL函数上的对象)
相关推荐
一世繁华行7 天前
CAPL编程:CAPL简介-使用数据库
capl编程
静听夜半雨2 个月前
万字长文——基于CANoe/CAPL的UDS Bootloader上位机实现(附完整可运行代码及工程文件)
网络·上位机·canoe·can总线·ecu刷写·uds升级·capl编程