- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📘前言
🍅 在Test Node中节点中,CAPL有很多事件等待的内置函数,这篇文章以CAN总线为例,总结下常用函数
🍅 演示软硬件环境
Windows11 x64
;CANoe 11 SP2 x64
目录
📙 延时等待(TestWaitForTimeout )
1️⃣ CAPL脚本中,实现等待,是通过TestWaitForTimeout 这个函数实现的
- 注意,这个函数无法在simulation node CAPL中使用的
- 注意参数不要等于0,等于0就无限挂起了
2️⃣ 一段行代码,关闭Engine节点
/*@!Encoding:936*/
testcase ContrloNode(char node[])
{
testSetEcuOffline(node);
}
void MainTest ()
{
ContrloNode("Engine");
}
3️⃣ 运行结果,Engine节点的报文都停发了
📙 等待symbols(信号,系统变量,环境变量)
等待symbols值匹配用TestWaitForSignalMatch 函数
这个函数可以适用于信号,系统变量和环境变量
如果信号值和你等待的值一样,那么函数没有等待立刻返回
如果变量是数组的话,不接受int/float类型
🍅 信号示例
- 简化代码如下,项目应用可以再丰富:
testcase TestWaitSymbols_signal (Signal * Name)
{
long result;
result = TestWaitForSignalMatch(Name, 80, 100000);
if(result==1)
testStepPass("", "xxxx passed");
else
TestStepFail("", "xxxx failed");
}
void MainTest ()
{
//TestWaitUser_1();
//TestWaitUser_2();
TestWaitSymbols_signal(EngineSpeed);
}
- 简单测试下结果
🍅 系统变量示例
- 简化代码如下,项目应用可以再丰富:
testcase TestWaitSymbols_sysvar ()
{
long result;
result = TestWaitForSignalMatch(sysvar::Engine::EngineSpeedDspMeter, 80, 100000);
if(result==1)
testStepPass("", "xxxx passed");
else
TestStepFail("", "xxxx failed");
}
void MainTest ()
{
//TestWaitUser_1();
//TestWaitUser_2();
//TestWaitSymbols_signal(EngineSpeed);
TestWaitSymbols_sysvar();
}
- 简单测试下结果
🍅 环境变量示例
- 简化代码如下,项目应用可以再丰富:
testcase TestWaitSymbols_Var ()
{
long result;
//result = TestWaitForSignalMatch(sysvar::Engine::EngineSpeedDspMeter, 80, 100000);
result = TestWaitForSignalMatch(en_bmw_test, 1, 100000);
if(result==1)
testStepPass("", "xxxx passed");
else
TestStepFail("", "xxxx failed");
}
void MainTest ()
{
//TestWaitUser_1();
//TestWaitUser_2();
//TestWaitSymbols_signal(EngineSpeed);
TestWaitSymbols_Var();
}
- 简单测试下结果
📙等待报文(TestWaitForMessage)
- 针对CAN 报文,其它总线,可以查找类似函数
- 可以传参message类型或者Dword类型
- 可以 不传参数报文,收到任何一帧报文就输出
2️⃣ 简单代码
testcase TestWaitMessage (dword can_id)
{
long result;
//result = TestWaitForSignalMatch(sysvar::Engine::EngineSpeedDspMeter, 80, 100000);
result = TestWaitForMessage(can_id, 100000);
if(result==1)
write("received");
else
write("not received");
}
void MainTest ()
{
//TestWaitUser_1();
//TestWaitUser_2();
//TestWaitSymbols_signal(EngineSpeed);
// TestWaitSymbols_Var();
TestWaitMessage(0x123);
}
📙等待文本出现(TestWaitForTextEvent )
- 这个函数非常好用,它可以让我们自定义触发事件,
- 这个函数和 TestSupplyTextEvent 函数配合使用
2️⃣ 简单代码,可以通过案件’a’来实现事件触发
on key 'a'
{
TestSupplyTextEvent("test string");
}
testcase TestWaitTextEvent (char aText[], dword aTimeout)
{
long result;
result = TestWaitForTextEvent(aText, aTimeout);
if(result==1)
write("received");
else
write("not received");
}
void MainTest ()
{
//TestWaitUser_1();
//TestWaitUser_2();
//TestWaitSymbols_signal(EngineSpeed);
// TestWaitSymbols_Var();
// TestWaitMessage(0x123);
TestWaitTextEvent("test string",10000);
}
📙等待诊断响应
- TestWaitForDiagRequestSent:等待诊断发送完毕
- TestWaitForDiagResponse:等待诊断响应完毕
2️⃣ 简单代码,可以通过案件’a’来实现事件触发
- 下面代码是基于simulation 工程,所以没有ECU做出response
- 常规诊断大致就这样发,根据具体情况,再封装成函数就比较通用了
testcase TestWaitDiag ()
{
DiagRequest Door.DefaultSession_Start req;
long result;
req.SendRequest();
// waits until request is completely sent
if (TestWaitForDiagRequestSent(req, 100)== 1)
{
TestStepPass("Request was sent successfully!");
if (TestWaitForDiagResponse(req, 1000)== 1)
TestStepPass("Response was Received successfully!");
else
TestStepFail("Response was not Received");
}
else
TestStepFail("Request could not be sent!");
}
void MainTest ()
{
//TestWaitUser_1();
//TestWaitUser_2();
//TestWaitSymbols_signal(EngineSpeed);
// TestWaitSymbols_Var();
// TestWaitMessage(0x123);
// TestWaitTextEvent("test string",10000);
TestWaitDiag();
}
📙等待用户输入
- TestWaitForStringInput
- TestWaitForValueInput
- TestWaitForTesterConfirmation
- 因为这三个函数会弹出对话框,需要认为干预,自动化程度高的测试平台,我们一般不用
🍅 等待用户输入字符串(TestWaitForStringInput )
- 等待用户输入字符串,并可以用
TestGetStringInput
函数去获取输入的字符串
2️⃣ 这里我们简单选个form 2 来测试下
testcase TestWaitUserDoSomething()
{
char resultStr[100];
if (1== TestWaitForStringInput("Please enter your name", 20000))
{
TestGetStringInput(resultStr, 100);
Write("name = %s", resultStr);
}
}
void MainTest ()
{
TestWaitUserDoSomething();
}
🍅 等待用户输入数字或字符串(TestWaitForValueInput )
- 可以输入十进制或者16进制数字,但只能数数字
- 读取的时候可以用
TestGetValueInput
函数读取,输出用%f;也可以用TestGetStringInput
函数去读取,作为字符串格式
testcase TestWaitUse_2 ()
{
char resultStr[100];
if (1== TestWaitForValueInput ("Please enter your ID", 20000))
{
Write("Test ID = %.f", TestGetValueInput());
TestGetStringInput(resultStr, 100);
Write("Test ID = %s", resultStr);
}
}
void MainTest ()
{
//TestWaitUse_1();
TestWaitUse_2();
}
🌎总结
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。