1 General Functions
GetServiceSignal
函数
读取服务信号(Service Signal)的值。
语法
capl
double GetServiceSignal(serviceSignalNumber qualifier); // 形式1
long GetServiceSignal(char qualifier [], double& value); // 形式2
参数
qualifier:服务信号的限定符。value:用于存储服务信号值的变量。
返回值
- 形式1:始终返回信号值。
- 形式2 :
0:无错误,函数执行成功。-1:未找到服务信号,没有与限定符匹配的服务信号。-2:服务信号类型错误,该函数仅用于数值类型的服务信号。-3:缓冲区无效。-4:指定的服务信号无发送方。-5:服务信号尚未被观测到。-255:发生一般错误。
可用性
- 版本:9.0 SP4
- 限制:仅适用于仿真/测试设置
相关函数
GetServiceSignalData | GetServiceSignalString | SetServiceSignal
GetServiceSignalData
函数
读取服务信号(Service Signal)的数据。
语法
capl
long GetServiceSignalData(serviceSignal qualifier, byte buffer [], dword bufferLength); // 形式1
long GetServiceSignalData(char qualifier [], byte buffer [], dword bufferLength); // 形式2
参数
qualifier:服务信号的限定符。buffer[]:用于存储服务信号值的数据缓冲区。bufferLength:数据缓冲区的长度。
返回值
>=0:从服务信号中获取的字节数。-1:未找到服务信号,没有与限定符匹配的服务信号。-3:缓冲区或缓冲区长度无效,缓冲区长度必须大于0。-5:服务信号尚未被观测到。-255:发生一般错误。
可用性
- 形式1:版本8.5
- 形式2:版本9.0 SP4
- 限制:仅适用于仿真/测试设置
示例
以下示例访问DemoDatabase数据库中PACKAGE1::PACKAGE2包下Service1服务(主版本1,实例ID 2)的Event1事件中的StringValue参数:
capl
on key 'r'
{
byte buffer[255];
GetServiceSignalData(DemoDatabase::PACKAGE1::PACKAGE2::Service1::1::2::Event1::StringValue, buffer, elcount(buffer));
}
注意
服务限定符无需以$符号开头。
相关函数
GetServiceSignal | GetServiceSignalString | SetServiceSignalData
GetServiceSignalString
函数
读取服务信号(Service Signal)的字符串值。
语法
capl
long GetServiceSignalString(serviceSignalString qualifier, char buffer [], dword bufferLength); // 形式1
long GetServiceSignalString(char qualifier [], char buffer [], dword bufferLength); // 形式2
参数
qualifier:服务信号的限定符。buffer[]:用于存储服务信号值的数据缓冲区。bufferLength:数据缓冲区的长度。
返回值
>=0:从服务信号中获取的字符串长度。-1:未找到服务信号,没有与限定符匹配的服务信号。-2:服务信号类型错误,该函数仅用于字符串类型的服务信号。-3:缓冲区或缓冲区长度无效,缓冲区长度必须大于0。-5:服务信号尚未被观测到。-255:发生一般错误。
可用性
- 形式1:版本9.0 SP2
- 形式2:版本9.0 SP4
- 限制:仅适用于仿真/测试设置
示例
以下示例访问DemoDatabase数据库中PACKAGE1::PACKAGE2包下Service1服务(主版本1,实例ID 2)的Event1事件中的StringValue参数:
capl
on key 'r'
{
char buffer[255];
GetServiceSignalString(DemoDatabase::PACKAGE1::PACKAGE2::Service1::1::2::Event1::StringValue, buffer, elcount(buffer));
write("服务信号StringValue的实际值: %s", buffer);
}
注意
服务限定符无需以$符号开头。
相关函数
GetServiceSignal | GetServiceSignalData | SetServiceSignalString
SetServiceSignal
函数
设置服务信号(Service Signal)的值。
语法
capl
double SetServiceSignal(serviceSignalNumber qualifier, double value); // 形式1
double SetServiceSignal(char qualifier [], double value); // 形式2
参数
qualifier:服务信号的限定符。value:要设置给服务信号的值。
返回值
0:无错误,函数执行成功。-1:未找到服务信号,没有与限定符匹配的服务信号。-2:服务信号类型错误,该函数仅用于数值类型的服务信号。-4:无发送方发送信号,若未找到提供待发送信号的交互层(Interaction Layer),可能会出现此错误。-255:发生一般错误。
可用性
- 版本:9.0 SP4
- 限制:仅适用于仿真/测试设置
相关函数
SetServiceSignalData | SetServiceSignalString | GetServiceSignal
SetServiceSignalData
函数
设置服务信号(Service Signal)的数据。
语法
capl
long SetServiceSignalData(serviceSignal qualifier, byte buffer [], dword bufferLength); // 形式1
long SetServiceSignalData(char qualifier [], byte buffer [], dword bufferLength); // 形式2
参数
qualifier:服务信号的限定符。buffer[]:用于存储服务信号值的数据缓冲区。bufferLength:数据缓冲区的长度。
返回值
0:无错误,函数执行成功。-1:未找到服务信号,没有与限定符匹配的服务信号。-3:缓冲区或缓冲区长度无效,缓冲区长度必须大于0。-4:无发送方发送信号,若未找到提供待发送信号的交互层(Interaction Layer),可能会出现此错误。-255:发生一般错误。
可用性
- 形式1:版本9.0 SP2
- 形式2:版本9.0 SP4
- 限制:仅适用于仿真/测试设置
示例
以下示例访问DemoDatabase数据库中PACKAGE1::PACKAGE2包下Service1服务(主版本1,实例ID 2)的Event1事件中的StringValue参数:
capl
on key 's'
{
byte buffer[1] = {0x12};
SetServiceSignalData(DemoDatabase::PACKAGE1::PACKAGE2::Service1::1::2::Event1::StringValue, buffer, elcount(buffer));
}
注意
服务限定符无需以$符号开头。
相关函数
SetServiceSignal | SetServiceSignalString | GetServiceSignalData
SetServiceSignalString
函数
设置服务信号(Service Signal)的字符串值。该函数会根据数据类型(UTF8或UTF16)自动附加相应的字节顺序标记(BOM)。
语法
capl
long SetServiceSignalString(serviceSignalString qualifier, char buffer []); // 形式1
long SetServiceSignalString(char qualifier [], char buffer []); // 形式2
参数
qualifier:服务信号的限定符。buffer[]:用于存储服务信号值的数据缓冲区。
返回值
0:无错误,函数执行成功。-1:未找到服务信号,没有与限定符匹配的服务信号。-2:服务信号类型错误,该函数仅用于字符串类型的服务信号。-3:缓冲区无效。-4:无发送方发送信号,若未找到提供待发送信号的交互层(Interaction Layer),可能会出现此错误。-255:发生一般错误。
可用性
- 形式1:版本9.0 SP2
- 形式2:版本9.0 SP4
- 限制:仅适用于仿真/测试设置
示例
以下示例访问DemoDatabase数据库中PACKAGE1::PACKAGE2包下Service1服务(主版本1,实例ID 2)的Event1事件中的StringValue参数:
capl
on key 's'
{
SetServiceSignalString(DemoDatabase::PACKAGE1::PACKAGE2::Service1::1::2::Event1::StringValue, "Hello World");
}
注意
服务限定符无需以$符号开头。
相关函数
SetServiceSignal | SetServiceSignalData | GetServiceSignalString
ethClearMacAddressTable
函数
清除以太网网络接口的MAC地址表。
语法
capl
long ethClearMacAddressTable(long channel);
参数
channel:以太网通道号,取值范围:1...32。
返回值
0:成功。1:网络接口不支持。2:失败,请检查网络接口设置。3:在基于通道的仿真模式下不支持。
可用性
- 版本:9.0 SP3
- 限制:仅适用于仿真/测试设置
示例
capl
on key '1'
{
EthClearMacAddressTable(1); // 清除以太网1的MAC地址表
}
ethGetLinkStatus
函数
返回通道的链路状态。
语法
capl
long ethGetLinkStatus(long channel); // 形式1
long ethGetLinkStatus(long channel, long hwChannel); // 形式2
long ethGetLinkStatus(ethernetPort port); // 形式3
参数
channel:以太网通道号,取值范围:1...32。hwChannel:硬件通道号,取值范围:1...16(仅当Vector网络接口支持多个硬件通道时可用)。port:以太网端口,由网络名称和端口名称描述。
返回值
0:链路断开(Link down)。1:链路连接(Link up)。-1:读取链路状态失败。
可用性
- 形式1:版本8.2
- 形式2:版本9.0 SP3
- 形式3:版本12.0
- 限制:仅适用于仿真/测试设置
示例
capl
// 示例1
on key 'i'
{
write("链路状态值: %d", ethGetLinkStatus(1));
}
// 示例2
on key 'i'
{
write("链路状态值: %d", ethGetLinkStatus(ethernetPort::MyNetworkName::MyPortName));
}
版本信息 :14 SP2
版权所有:© Vector Informatik GmbH
ethSetLinkStatus
CAPL 函数 >> 以太网 >> 函数概述 >> ethSetLinkStatus
函数
配置 Vector 硬件的通道以建立或终止链路。
语法
cpp
long ethSetLinkStatus(long channel, long status); // 形式 1
long ethSetLinkStatus(long channel, long hwChannel, long status); // 形式 2
long ethSetLinkStatus(ethernetPort port, long status); // 形式 3
参数
- channel:以太网通道号。取值范围:1...32
- status:链路状态。0 = 链路断开;1 = 链路连接
- hwChannel:硬件通道号。需 Vector 网络接口支持多硬件通道。取值范围:1...16
- port:以太网端口,由网络名称和端口名称描述。仅支持基于网络的配置和物理测量端口
返回值
- 0:成功
- 1:无效通道
- 2:读取配置失败
- 3:链路断开失败
- 4:链路连接失败
- 5:恢复旁路失败
- 6:无效链路状态
可用性
| 版本 | 形式 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|---|
| 8.2 | 1 | 以太网 | --- | • |
| 9.0 SP3 | 2 | 以太网 | --- | • |
| 12.0 | 3 | 以太网 | --- | • |
示例
cpp
// 链路连接
on key 'u' { ethSetLinkStatus(1, 1); }
// 链路断开
on key 'd' { ethSetLinkStatus(1, 0); }
// 通过端口设置链路状态
on key 'u' { ethSetLinkStatus(ethernetPort::MyNetworkName::MyPortName, 1); }
ethGetMacAddressAsNumber
CAPL 函数 >> 以太网 >> 函数概述 >> ethGetMacAddressAsNumber
函数
将 MAC 地址字符串(如 "02:00:00:00:00:01")转换为 qword 数值,可用于 ethernetPacket.source 和 ethernetPacket.destination。
语法
cpp
qword ethGetMacAddressAsNumber(char macAddrStr[]);
参数
- macAddrStr:MAC 地址字符串(如 "02:00:00:00:00:01")
返回值
MAC 地址的 qword 数值;失败时返回 0
可用性
| 版本 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 8.5 | 以太网 | • | • |
示例
cpp
on key '1' {
ethernetPacket txPacket;
txPacket.msgChannel = 1;
txPacket.source = ethGetMacAddressAsNumber("20:00:00:00:00:01");
txPacket.destination = ethGetMacAddressAsNumber("FF:FF:FF:FF:FF:FF");
txPacket.Length = 100;
txPacket.type = 0xF123;
output(txPacket);
}
ethGetMacAddressAsString
CAPL 函数 >> 以太网 >> 函数概述 >> ethGetMacAddressAsString
函数
将 qword 类型的 MAC 地址转换为字符串,适用于 ethernetPacket.source 和 ethernetPacket.destination。
语法
cpp
long ethGetMacAddressAsString(qword macAddr, char buffer[], dword bufferLength);
参数
- macAddr :qword 类型的 MAC 地址(如
ethernetPacket.source) - buffer:存储 MAC 地址字符串的缓冲区
- bufferLength:缓冲区长度
返回值
- 0:成功
- 8:缓冲区长度不足
可用性
| 版本 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 8.5 | 以太网 | • | • |
示例
cpp
on ethernetPacket * {
char macAddrStr[18];
if (ethGetMacAddressAsString(this.source, macAddrStr, elcount(macAddrStr)) == 0) {
write("Received Ethernet packet from %s", macAddrStr);
}
}
ethGetPhyState
CAPL 函数 >> 以太网 >> 函数概述 >> ethGetPhyState
注意
硬件依赖功能:
- VT6303 支持基于通道和网络的访问
- VN 系列(如 VN5640)仅支持基于网络的访问
函数
获取 PHY 状态。仅支持 TJA-1101 等具备该功能的 PHY 类型。
语法
cpp
long ethGetPhyState(long channel); // 形式 1
long ethGetPhyState(long channel, long hwChannel); // 形式 2
long ethGetPhyState(ethernetPort port); // 形式 3
参数
- channel:以太网通道号。取值范围:1...32
- hwChannel:硬件通道号。需 Vector 网络接口支持多硬件通道。取值范围:1...16
- port:以太网端口。仅支持基于网络的配置和物理测量端口
返回值
- 1:ePhyNormalState(正常状态)
- 2:ePhySleepState(睡眠状态)
- 3:ePhyPowerOffState(断电状态)
- 4:ePhySleepRequestState(睡眠请求状态)
- 0:发生错误
可用性
| 版本 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 12.0 SP3 | 以太网 | --- | • |
示例
cpp
/* 通过轮询端口 PHY 状态实现 TC10 测试 */
on timer myTimer {
if (ethGetPhyState(ethernetPort::MyNetworkName::MyPortName) == 1) { // ePhyNormalState
write("ethernetPort::MyNetworkName::MyPortName's PHY is operational");
}
if (ethGetPhyState(ethernetPort::MyNetworkName::MyPortName) == 2) { // ePhySleepState
write("ethernetPort::MyNetworkName::MyPortName's PHY is sleeping");
}
if (ethGetPhyState(ethernetPort::MyNetworkName::MyPortName) == 3) { // ePhyPowerOffState
write("ethernetPort::MyNetworkName::MyPortName's PHY is powered down");
}
}
ethSetPhyState
CAPL 函数 >> 以太网 >> 函数概述 >> ethSetPhyState
注意
硬件依赖功能:
- VT6303 支持基于通道和网络的访问
- VN 系列(如 VN5640)仅支持基于网络的访问
函数
设置 PHY 状态。仅支持 TJA-1101 等具备该功能的 PHY 类型。
语法
cpp
long ethSetPhyState(long channel, long phyState); // 形式 1
long ethSetPhyState(long channel, long hwChannel, long phyState); // 形式 2
long ethSetPhyState(ethernetPort port, long phyState); // 形式 3
参数
- channel:以太网通道号。取值范围:1...32
- phyState:PHY 状态。1 = ePhyNormalState(正常);2 = ePhySleepState(睡眠);3 = ePhyPowerOffState(断电)
- hwChannel:硬件通道号。需 Vector 网络接口支持多硬件通道。取值范围:1...16
- port:以太网端口。仅支持基于网络的配置和物理测量端口
返回值
- 0:成功
- 1:无效通道或端口
- 2:失败
可用性
| 版本 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 12.0 SP3 | 以太网 | --- | • |
示例
cpp
// 设置 PHY 为睡眠状态
on key 's' {
ethSetPhyState(ethernetPort::MyNetworkName::MyPortName, 2); // ePhySleepState
}
// 设置 PHY 为正常状态
on key 'n' {
ethSetPhyState(ethernetPort::MyNetworkName::MyPortName, 1); // ePhyNormalState
}
ethResetStatistics
CAPL 函数 >> 以太网 >> 函数概述 >> ethResetStatistics
函数
重置以太网通道统计信息。统计信息由 Eth<channel> 对象提供。
语法
cpp
void ethResetStatistics(long channel);
参数
- channel:以太网通道号。取值范围:1...32
可用性
| 版本 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 11.0 | 以太网 | --- | • |
示例
cpp
on key 'i' {
ethResetStatistics(1); // 重置 Eth 1 的统计信息
}
output (Ethernet)
CAPL 函数 >> 以太网 >> 函数概述 >> output (Ethernet)
函数
从程序块中输出以太网数据包。形式 2 可用于输出带无效帧校验和(FCS)的数据包。
语法
cpp
void output(ethernetPacket packet); // 形式 1
void output(ethernetPacket packet, dword fcs); // 形式 2
void output(ethernetErrorPacket packet); // 形式 3
参数
- packet :
ethernetPacket类型(形式 1/2)或ethernetErrorPacket类型(形式 3)的变量 - fcs:以太网帧校验和
可用性
| 版本 | 限制 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 所有版本 | 以太网 | • | • |
示例
cpp
ethernetPacket txPacket;
txPacket.msgChannel = 1;
txPacket.source = EthGetMacAddressAsNumber("20:00:00:00:00:01");
txPacket.destination = EthGetMacAddressAsNumber("FF:FF:FF:FF:FF:FF");
txPacket.Length = 100;
txPacket.type = 0xF123;
output(txPacket, 0x1234); // 输出带自定义 FCS 的数据包
2 基于网络架构的函数
1. ethGetEthernetPort
函数
获取当前仿真节点的以太网端口。需指定通道,网关节点可通过通道区分不同网络上的端口。
语法
capl
ethernetPort ethGetEthernetPort(long Channel);
参数
Channel:应用通道,例如 Eth 1。
返回值
以太网端口。
可用性
- 版本:12.0 SP4
- 限制:以太网
- 测量设置:支持
- 仿真/测试设置:支持
示例
capl
on start
{
ethernetport ownPort;
ownPort = ethGetEthernetPort(1);
// ... 对 ownPort 执行操作
}
相关函数
ethernetPort | lookupEthernetPort
2. ethGetEthernetPortInfos
函数
检索所有已连接的基于网络的以太网设备的端口相关信息。需提供足够大小的 ethernetPortInfo 数组以容纳所有可用硬件端口。
语法
capl
long ethGetEthernetPortInfos (ethernetportinfo portInfos[]);
参数
portInfos:ethernetPortInfo类型数组,存储检索到的硬件信息,结构体成员如下:char PortName[32]:端口名称char NetworkName[32]:网络名称char SegmentName[32]:网段名称uint32_t IsPhysical:是否为物理端口
返回值
有效 ethernetPortInfo 元素的数量(出错时返回 0)。
可用性
- 版本:12.0 SP4
- 限制:以太网
- 测量设置:不支持
- 仿真/测试设置:支持
示例
capl
on key 'C' // 检索完整硬件信息
{
ethernetportinfo allPorts[128];
long numPorts, j;
numPorts = ethGetEthernetPortInfos(allPorts);
write("找到 %d 个端口的硬件信息", numPorts);
for (j=0; j < numPorts; j++)
{
write("#%d %s::%s::%s 物理端口:%d", j,
allPorts[j].NetworkName,
allPorts[j].SegmentName,
allPorts[j].PortName,
allPorts[j].IsPhysical);
}
}
3. ethInjectPacket
函数
通过 packet 中定义的特定以太网端口传输以太网报文。支持在仿真端口或物理端口输出帧(例如用于错误注入)。
语法
capl
long ethInjectPacket (ethernetPacket packet, byte direction);
参数
packet:ethernetPacket类型变量。direction:从连接网段视角的传输方向:- 实时模式:
<rx>或<0>:从仿真端口发送(进入连接网段)<tx>或<1>:从物理测量端口发送(离开连接网段)
- 仿真模式:
<tx>/<rx>(或<0>/<1>):从仿真端口发送(进入/离开连接网段)
- 实时模式:
返回值
- 0:成功
- 1:无效以太网端口
- 2:报文失败
- 3:输出不允许
可用性
- 版本:12.0 SP5
- 限制:以太网
- 测量设置:不支持
- 仿真/测试设置:支持
示例
capl
ethernetPacket txPacket;
txPacket.hwPort = lookupEthernetPort("Ethernet1::Port1");
txPacket.source = EthGetMacAddressAsNumber("20:00:00:00:00:01");
txPacket.destination = EthGetMacAddressAsNumber("FF:FF:FF:FF:FF:FF");
txPacket.Length = 100;
txPacket.type = 0xF123;
ethInjectPacket(txPacket, tx); // 通过网络 <Ethernet1> 的物理端口 <Port1> 发送
4. lookupEthernetPort
函数
通过端口限定字符串获取以太网端口。
语法
capl
ethernetPort lookupEthernetPort(char[] ethernetPortName);
参数
ethernetPortName:端口限定字符串,格式为<NetworkName>::<PortName>。
返回值
以太网端口。
可用性
- 版本:12.0 SP4
- 限制:以太网
- 测量设置:支持
- 仿真/测试设置:支持
示例
capl
on ethernetPacket *
{
if (this.hwPort == lookupEthernetPort("Ethernet1::ChatClient1"))
{
write("在 %s 上接收报文", "Ethernet1::ChatClient1");
}
}
相关函数
ethernetPort |