on signal:信号发生变化是触发代码

on signal_update:信号每一帧都触发代码

一、发送报文

(1)周期发送

  1. includes
  2. {
  3. }
  4. variables
  5. {
  6. message 0x11 msg1;//定义要发送的报文
  7. msTimer timer1;//定义定时器
  8. }
  9. on start{
  10. setTimer(timer1,100);//运行canoe程序,启动定时器
  11. }
  12. on timer timer1{
  13. msg1.dlc = 8;//定义该报文的属性
  14. msg1.byte(0)=0x11;//定义byte(0)字节的数值
  15. output(msg1); //输出该报文到CAN总线
  16. setTimer(timer1,100); //重置定时器
  17. }

(2)按键触发发送

  1. variables
  2. {
  3. message 0x555 msg1 = {dlc=1};
  4. }
  5. on key 'b'
  6. {
  7. msg1.byte(0)=0xAA;
  8. output(msg1);
  9. }

(3)按键触发后周期发送

  1. variables
  2. {
  3. message 0x400 msgA = {dlc=1};
  4. mstimer timerA;
  5. int conditionA = 0; //初始化 conditionA =off
  6. }
  7. on key 'a'
  8. {
  9. conditionA = !conditionA; //toggle conditionA
  10. if(conditionA == 1) //如果条件满足:按下A按键
  11. {
  12. setTimer(timerA,200); //计时器触发启动
  13. }
  14. }
  15. on timer timerA
  16. {
  17. if(conditionA == 1) //if conditionA is still true
  18. {
  19. setTimer(timerA,200); //then continue timer
  20. }
  21. msgA.byte(0)=msgA.byte(0)-1; //change the data
  22. output(msgA); //输出该报文到CAN总线
  23. }

(3)打印并赋值

write输出的内容在CANoe的write界面显示

  1. on message ABSdata, EngineData
  2. {
  3. message WheelInfo wMsg; //定义新的报文
  4. write("Message %LX received on CAN %ld",this.ID,this.CAN); //打印报文
  5. output(wMsg); //发送报文
  6. }

(4)监听报文

  1. variables
  2. {
  3. message 0x11 msg1;//定义要发送的报文
  4. msTimer timer1;//定义定时器
  5. }
  6. on start{
  7. setTimer(timer1,100);//运行canoe程序,启动定时器
  8. }
  9. /*监听总线报文0x11*/
  10. on message 0x11{
  11. msg1.byte(0)=this.byte(0); //将总线上的报文信息赋值到新的报文
  12. }
  13. /*发送报文至总线*/
  14. on timer timer1{
  15. msg1.dlc = 8;//定义该报文的属性
  16. output(msg1); //输出该报文到CAN总线
  17. setTimer(timer1,100); //重置定时器
  18. }

二、报文接收

当从CAN总线接收到消息并为该消息定义了事件过程时,才会发生消息接收过程

  1. on message ABSdata
  2. {
  3. if (this.DIR == RX)
  4. {
  5. write(“Message ID = %d is received from channel %d”, this.ID, this.CAN);
  6. write(“The signal value of car speed is %d”, this.CarSpeed);
  7. }

将从CAN通道1接收到的ABSdata消息发送到CAN通道2

  1. on message CAN1.ABSdata
  2. {
  3. message * gatewayMsg;
  4. gatewayMsg = this;
  5. gatewayMsg.CAN = 2;
  6. output(gatewayMsg);
  7. }
  8. or
  9. on message CAN1.ABSdata
  10. {
  11. message CAN2.* gatewayMsg;
  12. gatewayMsg = this;
  13. output(gatewayMsg);
  14. }

三、周期检测

  1. //周期时间检测结果函数
  2. CheckMsgCyc(float aCycMinCycleTime, float aCycMaxCycleTime)
  3. {
  4. long lQueryResultProbeAvg;//声明平均时间
  5. long lQueryResultProbeMin;//声明最小测量时间
  6. long lQueryResultProbeMax;//声明最大测量时间
  7. char lbuffer[100];
  8. testAddCondition(gCycCheckId);//在该函数中添加事件
  9. testWaitForTimeout(kTIMEOUT);//等待测试时间结束
  10. //统计平均时间
  11. lQueryResultProbeAvg = ChkQuery_StatProbeIntervalAvg(gCycCheckId);
  12. //统计min时间
  13. lQueryResultProbeMin = ChkQuery_StatProbeIntervalMin(gCycCheckId);
  14. //统计max时间
  15. lQueryResultProbeMax = ChkQuery_StatProbeIntervalMax(gCycCheckId);
  16. if(ChkQuery_NumEvents(gCycCheckId)>0)
  17. {
  18. //统计异常次数//打印报告
  19. snprintf(lbuffer,elCount(lbuffer),"Valid values %.0fms - %.0fms",aCycMinCycleTime,aCycMaxCycleTime);
  20. testStepFail("",lbuffer);
  21. snprintf(lbuffer,elCount(lbuffer),"Average cycle time: %dms",lQueryResultProbeAvg);
  22. testStepFail("",lbuffer);
  23. snprintf(lbuffer,elCount(lbuffer),"Min cycle time: %dms",lQueryResultProbeMin);
  24. testStepFail("",lbuffer);
  25. snprintf(lbuffer,elCount(lbuffer),"Average cycle time: %dms",lQueryResultProbeMax);
  26. testStepFail("",lbuffer);
  27. }
  28. else
  29. {
  30. snprintf(lbuffer,elCount(lbuffer),"Valid values %.0fms - %.0fms",aCycMinCycleTime,aCycMaxCycleTime);
  31. testStepPass("",lbuffer);
  32. snprintf(lbuffer,elCount(lbuffer),"Average cycle time: %dms",lQueryResultProbeAvg);
  33. testStepPass("",lbuffer);
  34. snprintf(lbuffer,elCount(lbuffer),"Min cycle time: %dms",lQueryResultProbeMin);
  35. testStepPass("",lbuffer);
  36. snprintf(lbuffer,elCount(lbuffer),"Average cycle time: %dms",lQueryResultProbeMax);
  37. testStepPass("",lbuffer);
  38. }
  39. ChkControl_Destroy(gCycCheckId);//销毁事件
  40. }
  41. //TC1:Check Cycle time of msg EngineData
  42. testcase CheckMsgEngineData()
  43. {
  44. float lCycMinCycleTime;//声明最小周期时间
  45. float lCycMaxCycleTime;//声明最大周期时间
  46. lCycMinCycleTime = kMIN_CYCLE_TIME;//赋值
  47. lCycMaxCycleTime = kMAX_CYCLE_TIME;
  48. //测试报告提示信息
  49. testCaseTitle("TC-1","TC-1:Check cycle time of msg EngineData");
  50. //开始观察待测报文
  51. gCycCheckId = ChkStart_MsgAbsCycleTimeViolation(EngineData,lCycMinCycleTime,lCycMaxCycleTime);
  52. CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);//周期时间检测结果函数
  53. testRemoveCondition(gCycCheckId);//移除测试条件
  54. }

四、报文长度检测

  1. DLC 报文长度测试
  2. testcase CheckDLCLock_Info()
  3. {
  4. dword checkId;
  5. //测试报告提示信息
  6. testCaseTitle("TC-6","TC-6:Check msg DLC of Lock_Info");
  7. //管事观测报文Lock_Info的DLC
  8. checkId = ChkStart_InconsistentDlc(Lock_Info);
  9. testAddCondition(checkId);
  10. //等待测试时间结束
  11. testWaitForTimeout(kTIMEOUT);
  12. testRemoveCondition(checkId);
  13. }

五、自动化测试

  1. includes
  2. {
  3. }
  4. variables
  5. {
  6. message * req,resp;
  7. }
  8. void Maintest()
  9. {
  10. write("运行开始");
  11. testWaitForTimeout(1000);
  12. req.id = 0x720;
  13. req.dlc = 8;
  14. req.byte(0) = 0x02;
  15. req.byte(1) = 0x10;
  16. req.byte(2) = 0x01;
  17. output(req);
  18. write("运行结束");
  19. resp.id = 0x730;
  20. if (testWaitForMessage(resp.id,5100))
  21. {
  22. testGetWaitEventMsgData(resp);
  23. write ("在5.1s内,收到0x730的报文");
  24. write ("报文为:%x %x %x %x %x %x %x %x",resp.byte(0),resp.byte(1),resp.byte(2),resp.byte(3),
  25. resp.byte(4),resp.byte(5),resp.byte(6),resp.byte(7));
  26. }
  27. }

五、循环码(Cycle)和校验码(CRC)校验

(1)循环码模拟发送

  1. on signal_update LightCycle
  2. {
  3. tempCycle++;
  4. tempCycle=tempCycle%16; //循环码:0~15
  5. if(@sysvar::MyNameSpace::CheckCycle==1) //面板触发
  6. {
  7. $MSG::LightCycle=tempCycle;
  8. }
  9. else
  10. {
  11. $MSG::LightCycle=1;
  12. }
  13. }
  14. on errorFrame
  15. {
  16. ErrorCount++;
  17. @MyNameSpace::ErrorCount=ErrorCount;
  18. write("%d is errorcount",ErrorCount);
  19. }

(2)循环码校验

  1. int tempSwitchCycle=5;
  2. on signal_update LightCycle
  3. {
  4. tempSwitchCycle++;
  5. write("cycle is %d",tempSwitchCycle);
  6. tempSwitchCycle=tempSwitchCycle%16;
  7. if($LightCycle==tempSwitchCycle)
  8. {
  9. write("lightcycle is pass");
  10. }
  11. else
  12. {
  13. write("lightcycle is fail");
  14. }
  15. tempSwitchCycle=$MSG::LightCycle; //为保证模拟与真实值同步
  16. }

六、总线负载率

  1. on timer MyTimer
  2. {
  3. setTimer(MyTimer,1000);
  4. write("Busload is %d",@sysvar::_Statistics::CAN1::Busload);
  5. }

七、测量CAN周期

  1. variable
  2. {
  3. message 0x1cd FrameOutput={dlc=4};
  4. msTimer MyTimer;
  5. long tempPeriod1;
  6. long tempPeriod2;
  7. }
  8. on start
  9. {
  10. setTimer(MyTimer,200); //初始值
  11. }
  12. on timer MyTimer
  13. {
  14. setTimer(MyTimer,@sysvar::MyNameSpace::Timer);
  15. FrameOutput.byte(1)=0x1a;
  16. output(FrameOutput);
  17. }
  18. on meaasge 0x1cd
  19. {
  20. foat temp;
  21. tempPeriod2=timenow(); //记录当前时间
  22. @sysvar::MyNameSpace::Period=(tempPeriod2-tempPeriod1)/100.0;//在Panel中显示周期Period
  23. write("time is %f",temp);
  24. tempPeriod1=tempPeriod2;
  25. }

八、CRC校验码(信道中是否存在错误)

  1. CRC校验函数
  2. byte CRC(byte buffer[])
  3. {
  4. int i;
  5. int j;
  6. Byte crc8;
  7. Byte poly;//多项式
  8. crc8=0x00;
  9. poly=0x1d;
  10. for(i=0;1<elcount(buffer);i++)
  11. {
  12. crc8=crc8^buffer[i];
  13. for(j=0;j<8;j++)
  14. {
  15. if(crc8 & 0x80)
  16. {
  17. crc8=crc8<<1;
  18. crc8=crc8^poly;
  19. }
  20. else
  21. {
  22. crc8=crc8<<1;
  23. }
  24. }
  25. }
  26. crc8=crc8^0x00;
  27. return(crc8);
  28. }
  1. 存储一个节点的多条报文
  2. dword appllLTxPending(long aId,dword aDlc,byte data[])
  3. {
  4. int tempcycle=0;
  5. if (aId==0x1ab)
  6. {
  7. tempcycle=tempcycle%15;
  8. data[6]=tempcycle;
  9. tempcycle++;
  10. FrameData[1]=data[0];
  11. FrameData[2]=data[1];
  12. FrameData[3]=data[2];
  13. FrameData[4]=data[3];
  14. FrameData[5]=data[4];
  15. FrameData[6]=data[5];
  16. FrameData[7]=data[6];
  17. data[7]=CRC(FrameData);
  18. }
  19. else
  20. {
  21. write("Error")
  22. }
  23. return 1;
  24. }

九、通过触发发送固定帧数报文(触发发送3帧报文)

  1. on message MSG
  2. {
  3. int i=0; //计数
  4. if (@sysvar::MyNameSpace::trigger==1) //触发按键“开”
  5. {
  6. write("active"); //调试
  7. i++;
  8. if (i<=3)
  9. {
  10. write("less than 3"); //调试
  11. @sysvar::MyNameSpace::trigger=1;
  12. $Light1=1; //MSG.Light1报文信号赋值
  13. }
  14. else
  15. {
  16. @sysvar::MyNameSpace::trigger=0;
  17. }
  18. }
  19. if (@sysvar::MyNameSpace::trigger==0)
  20. {
  21. write("inactive"); //调试
  22. $Light=0;
  23. i=0;
  24. }
  25. }

十、创建自动化脚本

(1)Test Module    →  创建Test Environment    →   右击插入测试节点insert Network Node

→    右击Edit 编辑测试用例(CAPL节点)  →运行(先点击外面的闪电,再右击Execution执行)

十一、创建UDS

添加CDD文件

物理寻址和功能寻址ID设置

UDS——27服务Seed与Key之间的转换 (dll文件)

CDD文件创建

DD文件(定义CAN总线通信方式一种)

CDD Template文件(可定义多种通信方式)

10服务

(1)UDS功能指定模块

  1. on start
  2. {
  3. DiagSetTarget("ABS"); //指定节点
  4. }
  1. on sysvar sysvar::~NameSpace::DefaultSession
  2. {
  3. diagRequest IPC.DefaultSession_Start req;
  4. if(@this==1)
  5. {
  6. SendRequestAndCheckReturnvalue(req); //请求
  7. write("default");
  8. }
  9. }
  1. variables
  2. {
  3. byte P2[2]={0x12,0x34};
  4. }
  5. on diagRequest IPC.DefaultSession_Start
  6. {
  7. diagResponse this resp;
  8. resp.SetParameterRaw("P2",P2,elcount(P2));
  9. resp.SendPositiveResponse();//正反馈
  10. }
  11. on diagRequest IPC.ECU_Manufacturing_Date_Read
  12. {
  13. diagResponse this resp;
  14. resp.SendNegativeResponse(0x7e);//负反馈
  15. write("diagrequest");
  16. }

十二、Log函数

  1. void WriteLOG(char NameSpace[],char Variable[],long value)
  2. {
  3. char TimeStamp[25]; //时间戳 下面定义的时间戳变量
  4. char FinalLOG[200];
  5. strncpy(FinalLOG,"",elCount(FinalLOG)); //字符串取空
  6. GetCurrentTime(TimeStamp); //时间戳函数
  7. strncat(FinalLOG,TimeStamp,25); //输入时间戳参数
  8. write(FinalLOG);
  9. snprintf(LOG,elCount(LOG)," %s::%s==%d",~NameSpace,Variable,value);//系统变量名称
  10. write(LOG);
  11. strncat(FinalLOG,LOG,elCount(LOG));
  12. write(FinalLOG);
  13. putValueToControl("LOG","LOG",FinalLOG)
  14. }

十三、时间戳

  1. void GetCurrentTime(char TimeStamp[]) //TimeStamp:时间戳
  2. {
  3. long time[9];
  4. getLocalTime(time);
  5. snprintf(TimeStamp,elcount(TimeStamp),"\r\n %02d:%02d%:02d",time[2],time[1],time[0]);
  6. // “\r”:换行;“\n”:回车
  7. }

十四、网络路由(网关)创建及测试

十五、输出CAN Statistic中的某个数据(不能直接输出)

(1)创建CPAL节点

  1. on sysvar sysvar::_Statistics::can1::FramesPerBurst
  2. {
  3. @sysvar::~NameSpace::FramePerBurst=@this; //系统变量
  4. }
  5. on message * //trace界面输出所有报文
  6. {
  7. output(this);
  8. }

(2)write窗口输出

  1. on sysvar sysvar::NameSpace::DefaultSession //按下Default按钮进入下面操作
  2. {
  3. write("%d is test",@sysvar::~NameSpace::FramePerBurst);
  4. }

十六、Logging文件大小设置

十七、字符串——ACS码

  1. 打印字符串
  2. on key "a"
  3. {
  4. long time[9];
  5. char target[100];
  6. snprintf(target,elcount(target),"%f action1",timenow()/100000.0);
  7. write(target);
  8. getlocaltime(time);
  9. snprintf(target,elcount(target),"%02d:%02d:%04d action2",time[2],time[1],time[0]);
  10. // 输出字符串:12:10:0005
  11. write(target);
  12. snprintf(target,elcount(target),"channel=%d,value=%d",1,2);
  13. write(target);
  14. strncat(target,"append value",elcount(target)); //字符串拼接
  15. write(target);
  16. }
  17. 提取字符串中的数值
  18. on key "b"
  19. {
  20. char Log[50]="this is channel 5, Value is 3";//字符串内容
  21. char channel[5];//提取字符串
  22. if ( (strstr_regex(Log,"[0-9]") > 0)&&( strstr_regex(Log,"[A-Z]") >0))
  23. //根据字符串特征判定 是否字符串格式
  24. {
  25. substr_cpy(channel,Log,strstr_regex_off(Log,0,"[0-9]"),2,elcount(channel));
  26. //确定字符串位置,并截取字符串 2:“5,”
  27. write(channel);
  28. if(strstr(channel,",")>0) //判断是否为字符串格式 strstr与strstr_regex作用一样
  29. {
  30. write("less than 10");
  31. str_replace(channel,",","");//字符串替换 “5,” 转换为 “5”
  32. write(channel);
  33. }
  34. @sysvar::~NameSpace::Channel=atol(channel); //字符串转数字
  35. }else
  36. {
  37. write("error");
  38. }
  39. }

十八、文件解析

  1. on sysvar sysvar::MyNamespace::File
  2. {
  3. char path[100];//定义数组
  4. char Data[100];//定义数组
  5. byte Address[10];//定义数组
  6. //初始化
  7. long FileRef=0;
  8. long index=0;
  9. long i=0;
  10. long DataLength=0;
  11. dword Log[100];
  12. byte CRC=0;
  13. sysGetVariableString("MyNamespace","Path",path,elcount(path));
  14. // (类,系统变量名称,系统变量,数组长度)字符串path 转换为 数组
  15. //读取文档:
  16. //(1)产生一个引用
  17. //(2)读取或写入
  18. //(3)释放引用
  19. FileRef=openFileRead(patn,0);// 0:读 ACSII码; 1:写 二进制
  20. while(fileGetString(Data,elcount(Data),FileRef)!=0) //对TXT文档进行一行一行读取
  21. {
  22. if(strstr(Data,"S3")!=-1) //根据表头header 判断是否正确 每一行相同的前几位
  23. {
  24. write("%d x",CharToByte(Data[5]));
  25. DataLength=CharToByte(Data[2])*0x10+chartobyte(Data[3]);//十六进制转换为十进制
  26. write("%d datalength",DataLength);
  27. write("%d address[0]",( CharToByte(Data[5]) * 0x10 )+(CharToByte(Data[6])));
  28. i=0;
  29. while(i<4)
  30. {
  31. Address[i]=(CharToByte(Data[2*i+4]))*0x10 +(CharToByte(Data[2*i+5]));
  32. i++;
  33. }i=0;
  34. write("%d A %d B %d C %d",Address[0],Address[1],Address[2],Address[3]);
  35. CRC=CharByte(Data[strlen(Data)-2])*0x10+CharByte(Data[strlen(Data)-1]);
  36. while(i<DataLength)
  37. {
  38. Log[i]=CharToByte(Data[12+1*2])*0x10+CharToByte(Data[13+1*2]);
  39. i++;
  40. }
  41. }
  42. }
  43. }
  44. ACSII码(char)转十六进制(十六进制:0~F 十进制:0~15)
  45. byte CharToByte(chaar ch)
  46. {
  47. byte val=0;
  48. if(ch >'0' && ch <'9')
  49. {
  50. val=ch-'0'; //ACSII码:0 对应十进制:48
  51. }else if(ch >'a' && ch< 'f')
  52. {
  53. val=(ch-'a') + 10; //ACSII码:a 对应十进制:97
  54. }else if(ch >'A' && ch< 'F')
  55. {
  56. val=(ch-'A') + 10; //ACSII码:A 对应十进制:65
  57. }
  58. return val;
  59. }
  1. ACSII码转十进制(十六进制:0~F 十进制:0~15)
  2. byte CharToByte(chaar ch)
  3. {
  4. byte val=0;
  5. if(ch >'0' && ch <'9')
  6. {
  7. val=ch-'0'; //ACSII码:0 对应十进制:48
  8. }else if(ch >'a' && ch< 'f')
  9. {
  10. val=(ch-'a') + 10; //ACSII码:a 对应十进制:97
  11. }else if(ch >'A' && ch< 'F')
  12. {
  13. val=(ch-'A') + 10; //ACSII码:A 对应十进制:65
  14. }
  15. return val;
  16. }

描述CANOE-CAPL脚本编辑相关推荐

  1. CANoe中用CAPL脚本按特定格式发送报文

    CANoe中用CAPL脚本按特定格式发送报文 需求 实验设备 实验环境 最近学习用CANoe软件测试CAN总线,纯新手,把最近的学习心得分享一下,欢迎大佬指正. 需求 1)仿真开始报文默认以100ms ...

  2. CAPL脚本中对Flexray事件的响应

    FlexRay on frFrame * on frFrame * 拓展形式: on frFrame name on frFrame (slot ID, base cycle,cycle repeti ...

  3. capl保存trace_用于诊断服务的CAPL脚本

    我正在编写CAPL脚本以自动化诊断服务 . 我已经阅读了一些大于8字节的DID . 直到8个字节,我可以正确捕获我的CAPL脚本中的数据,但是当数据大小超过8个字节时,我得到剩余字节的一些垃圾值00 ...

  4. 【自动化测试】Selenium IDE脚本编辑与操作(了解)

    之前,我们录制脚本时是录制鼠标和键盘的所有在浏览器的操作,那么脚本会出现多余的步骤,有时候我们需要手动填写脚本或修改脚本,所以我们有必要对selenium IDE脚本编辑与操作有所了解:(采用录制的方 ...

  5. UDS刷写上位机全套CAPL脚本,有简单panel界面

    UDS刷写上位机全套CAPL脚本,有简单panel界面,配合V公司CAN卡和oe软件即可实现刷写流程修改和上位机定制开发,满足各种项目需求. 代码非实物 ID:694800618173155718da ...

  6. VBA-VBS脚本编辑-Visual Studio 调试-WScript

    文章目录 1.编辑脚本 2.脚本调试 2.1.启动调试 2.2.选择调试器 2.3.调试界面 3.总结 4.作者答疑   VBS是基于Visual Basic的脚本语言.VBS的全称是:Microso ...

  7. CANoe的数据回放(Replay Block),还是要结合CAPL脚本才能说的明白

  8. CANoe——CAPL案例

    on signal:信号发生变化是触发代码 on signal_update:信号每一帧都触发代码 一.发送报文 (1)周期发送 includes {} variables {message 0x11 ...

  9. CAPL脚本中的变量陷阱

    局部变量 在CAPL中所有的局部变量都默认时静态局部变量,也就是想相当于C语言中被static 修饰了. 如下面一小段脚本 在一个函数中定义局部变量b ,虽然初始化赋值0了,但是每次调用这个函数不会自 ...

最新文章

  1. USG防火墙telnet实验
  2. vba 数值转文本_数值转文本,TEXT函数神操作
  3. 拦截锚点修改url_前端系列课程(2)-网络基础概念(URL)
  4. SQL中过滤条件放在on和where中的区别
  5. Betsy Ross Problem
  6. redhat solutions
  7. 基于单片机的银行排队叫号系统的设计
  8. oracle的oem登录,如何启动Oracle的OEM管理工具?
  9. Windows 错误报告
  10. 【人工智能行业大师访谈4】吴恩达采访Yoshua Bengio
  11. 如何把计算机桌面图标放到底下,怎么把电脑桌面图标放在任意位置
  12. 公鸡五钱,母鸡三钱,小鸡三只一文钱,求百钱买百鸡
  13. 强大的word查找替换功能
  14. IC验证工具:Ubuntu下Questasim10.7安装(64bit)全攻略
  15. Android中的PID,UID,TID
  16. 计算机应用发sci,计算机算法方面能选择哪些sci期刊
  17. HeadFir st 设计模式学习笔记21-- 解释者(Inter pr eter)模式拾零
  18. error: expected declaration or statement at end of input 解决方法
  19. HarmonyOS系统中内核实现烟雾检测的方法
  20. php做网站购物车 你搞懂了吗?

热门文章

  1. 微信小程序异步转同步的解决方法
  2. 视频监控中NVR录像机NTP校时配置(京准)
  3. linux安装usermod命令,usermod命令
  4. 关于解决你的计算机配置似乎是正确的的问题
  5. 靶场练习之hackinglab(鹰眼)- 上传题
  6. python去掉字符串尾部空格的函数_python清除字符串前后空格函数的方法
  7. php tp框架调用m层,TP学习笔记一(tp的目录结构 , tp的输出方式)
  8. 拨开深度学习部署迷雾,还看 OpenVINO™推理引擎
  9. WPS Office之PPT动画应用技能-陈慧-专题视频课程
  10. 计算机职称考试临时身份证不能用?