当前位置:   article > 正文

vTESTstudio系列6--vTESTstudio中如何去根据需求编写自己需要的测试函数(一)_capl checksum rollingcounter

capl checksum rollingcounter

在前面三篇文章中(vTESTstudio系列3--vTESTstudio自带测试函数对ECU的测试(一)vTESTstudio系列4--vTESTstudio自带测试函数对ECU的测试(二)vTESTstudio系列5--vTESTstudio自带测试函数对ECU的测试(三))主要介绍了vTESTstudio工程自带的已经封装好的函数的结构以及如何去使用这些函数,这些自带的函数能满足大部分的测试需求,但是对于某些特殊的需求,我们需要根据需求以及vTESTstudio工程自带的一些函数,去实现比较高级的需求,Let's Go!!!

目录

1.对Rolling Counter的check:

1.1 Check RollingCounter的CAPL函数的实现逻辑如下:

1.2 vTESTstudio工程中的脚本如下:

1.3 实际测试报告如下:

2.对CheckSum的check:

2.1 Check CheckSum的CAPL函数的实现逻辑如下:

2.2 vTESTstudio工程中的脚本如下:

2.3 实际测试报告如下:


在CAN报文中,Rolling Counter(滚动计数器)和CheckSum(校验和)是用于数据完整性和可靠性验证的重要字段。

1.对Rolling Counter的check:

Rolling Counter是一个4位的字段,用于跟踪发送的CAN报文数量。每当CAN节点发送一个新的报文时,滚动计数器的值就会增加1。这个计数器的作用是确保接收方可以检测到报文丢失或重复。通过比较接收到的报文中的滚动计数器值与上一次接收到的报文的滚动计数器值,接收方可以确定是否有报文丢失或重复。如果接收到的报文的滚动计数器值小于上一次接收到的报文的滚动计数器值,那么可能发生了报文丢失。如果接收到的报文的滚动计数器值等于上一次接收到的报文的滚动计数器值,那么可能发生了报文重复。

1.1 Check RollingCounter的CAPL函数的实现逻辑如下:

  1. export testfunction TF_CheckRollingCounter(char MessageName[], char SignalName[])
  2. {
  3. dword MessageID;
  4. long result;
  5. long Timeout;
  6. float SignalValue;
  7. float storeValue[45];
  8. int i;
  9. result = 0;
  10. Timeout = 5000;
  11. MessageID = GetMessageID(MessageName);
  12. result = TestWaitForMessage(MessageID, Timeout);
  13. if (result == 1)
  14. {
  15. for (i=0;i<45;i++)
  16. {
  17. result = TestWaitForMessage(MessageID, Timeout);
  18. if(result)
  19. {
  20. SignalValue = getSignal(SignalName);
  21. storeValue[i] = SignalValue;
  22. }
  23. else
  24. TestStepFail("INFO","The message has not arrived");
  25. }
  26. }
  27. else if (result == 0)
  28. {
  29. //Timeout occured!
  30. TestStepFail("INFO","The message has not arrived within timeout!");
  31. }
  32. else if(result == -2)
  33. {
  34. TestStepFail("INFO","Constraint violation!");
  35. }
  36. else
  37. {
  38. TestStepFail("INFO","General error!");
  39. }
  40. for (i=0;i<44;i++)
  41. {
  42. if(storeValue[i] ==(storeValue[i+1]-1))
  43. {
  44. TestStepPass("INFO","AliveCounter value is: %f, AliveCounter increased 1",storeValue[i]);
  45. }
  46. else if(storeValue[i]==14 && storeValue[i+1]==0)
  47. {
  48. TestStepPass("INFO","AliveCounter value is: %f, AliveCounter change from 14 to 0",storeValue[i]);
  49. }
  50. else
  51. {
  52. TestStepFail("INFO","AliveCounter value is: %f,AliveCounter Incorrect!",storeValue[i]);
  53. }
  54. }
  55. }

上述代码中,MessageNameSingalName是需要传入的函数参数,SingalName是需要传入的rollingcounter的信号名,MessageName是被测rollingcounter信号所在的报文名,代码的主要逻辑如下:

1.检测到CAN总线上有传入的MessageName是否在发送

2.for循环中获取45次rollingcounter的信号值,并把这45次的信号值存到一个定义好的数组里

3.对存到数组里面的数值进行比较,检测从1-45的信号值是否按照从0-14这样的循环发送的,如果rollingcounter的值是从0开始每次递增+1,然后到达14后翻转为0的循环,则认为该rollingcounter的发送逻辑符合需求。

1.2 vTESTstudio工程中的脚本如下:

1.3 实际测试报告如下:

可以看到报告中的这个函数获取了45帧报文,并将rolling counter的值存储下来,然后进行校验的。

2.对CheckSum的check:

CheckSum是一个8位的字段,用于验证CAN报文的数据完整性。它基于报文中的数据生成,并附加在报文的末尾。发送方在发送报文之前计算校验和,然后将其添加到报文中。接收方在接收到报文后,使用相同的算法重新计算校验和,并将其与报文中的校验和进行比较。如果两者一致,则说明报文在传输过程中没有发生数据损坏;如果不一致,则说明报文可能存在错误或损坏。

2.1 Check CheckSum的CAPL函数的实现逻辑如下:

  1. export testfunction TF_Checksum(char MessageName[], char SignalName[])
  2. {
  3. //result1 is for wait message
  4. long result1;
  5. //result2 is for wait for message content
  6. long result2;
  7. long Timeout;
  8. dword ActualCRC;
  9. dword CalCRC;
  10. int dataLength=8;
  11. int i;
  12. dword MessageID;
  13. message * MsgData;
  14. Timeout = 500;
  15. result1 = 0;
  16. result2 = 0;
  17. //Recieved Singal Checksum
  18. MessageID = GetMessageID(MessageName);
  19. result1 = TestWaitForMessage(MessageID, Timeout);
  20. if (result1 == 1)
  21. {
  22. //get actual checksum value
  23. ActualCRC = getSignal(SignalName);
  24. }
  25. else if (result1 == 0)
  26. {
  27. // Timeout occured!
  28. TestStepFail("INFO","The message has not arrived within timeout!");
  29. }
  30. else if(result1 == -2)
  31. {
  32. TestStepFail("INFO","Constraint violation!");
  33. }
  34. else
  35. {
  36. TestStepFail("INFO","General error!");
  37. }
  38. result2=TestGetWaitEventMsgData(MsgData);
  39. if(result2 == 0)
  40. {
  41. TestStep("INFO","This message rolling counter is %x",MsgData.byte(6));
  42. CalCRC = CalculateCRC( MsgData, MessageID);
  43. }
  44. else
  45. {
  46. TestStepFail("INFO","Data access could not be executed, the last event was not a message event!");
  47. }
  48. //Verify the Checksum
  49. if (CalCRC == ActualCRC)
  50. {
  51. TestStepPass("1.0", "Calculated checksum = %X, and received checksum = %X", CalCRC, ActualCRC);
  52. }
  53. else
  54. {
  55. TestStepFail("1.0", "Calculated checksum = %X, and received checksum = %X", CalCRC, ActualCRC);
  56. }
  57. }
  58. byte CalculateCRC( message* MsgData, dword MessageID)
  59. {
  60. int i;
  61. crc_temp=0x00;
  62. for (i=0;i<7;i++)
  63. {
  64. crc_temp =crc_temp + MsgData.byte(i);
  65. }
  66. crc_value = crc_temp^0xFF;
  67. return crc_value;
  68. }

上述代码中,MessageNameSingalName是需要传入的函数参数,SingalName是需要传入的checksum的信号名,MessageName是被测checksum信号所在的报文名,代码的主要逻辑如下:

1.检测到CAN总线上有传入的MessageName是否在发送

2.然后通过getsingal来获取当前这一帧报文的checksum的信号值

3.获取该帧报文所有的byte数据值

4.通过CalculateCRC这个函数去计算当前该报文的实际checksum的数值

5.比较通过算法计算的CRC值和实际获取的CheckSum信号的实际值来确定CRC是否正确

2.2 vTESTstudio工程中的脚本如下:

2.3 实际测试报告如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/730357
推荐阅读
相关标签
  

闽ICP备14008679号