使用tcl实现自动化测试的原理介绍培训目的为什么需要开展这项培训?针对tcl的使用,部门已经组织过多次学习,包括培训、考试等方式,但整体效果不是很理想,只有一小部分人掌握比较好。究其原因,主要可能有:一、暂时用不到,只是被动地进行了一些了解,未主动弄清楚编好一条脚本的来龙去脉;二、简要的语法看起来很简单,也能模仿别人的脚本进行简单编写,但由于整体原理不清楚,无法深入编写脚本。这次又进行tcl的培训,主要是因为我们各个项目(中转台、同播、DS-6801、TD500)的自动化测试是二、三季度重点要加强的工作,tcl脚本编写能力的提高迫在眉睫。与以往的tcl培训不同的是,本次培训主要从我们使用到的tcl自动化测试的控制原理上进行介绍。使用tcl通过GPIB控制仪器1使用tcl通过串口控制对讲机2使用tcl通过USB控制对讲机3目录关于GPIBGPIB(General-PurposeInterfaceBus)通用接口总线,它精确定义了控制器和仪器的通讯方式,可编程仪器的标准命令,采纳了IEEE488.2定义的命令结构,创建了一整套编程命令。使用一台计算机,通过GPIB控制卡可以实现和一台或多台仪器的听、讲、控功能,并组成仪器系统,使我们的测试和测量工作变得快捷、简便、精确和高效。GPIB对应的是一种工程控制用的协议,一般可被任何编程语言如VB、VC、C++实现电脑对仪器的控制,也有仪器制造商开发自己的语言支持GPIB,如NI的Labview。GPIBGPIB简介8921AGPIBProgrammingmanual常用的操作•我们使用的综测仪提供了GPIB编程手册,里面提供的“GPIBCommands”可供我们访问大部分综测仪上的参数,我们可在里面的语法图(表)上查到。•GPIB命令是由语法图(表)中的各个字段组成的字符串,如::DISPTX:AFG1:OUTP:STATON•已有人封装好了GPIB常用操作的tcl库(GPIB-Tcl),我们使用相关函数即可。(可在Script.NET的tcl文档中查到GPIB-Tcl库)gpibopen-address$GpibAdrsgpibwrite-device$dev_adrs-message:MEAS:AFR:FREQ?gpibread-device$dev_adrs-modeascii……综测仪的GPIB手册命令格式gpibwrite-device$dev_adrs-message*RSTafter1000gpibwrite-device$dev_adrs-message:DISPRXsetFreq1410.125setstrFreq[format:RFG:FREQ%sMHz$Freq1]gpibwrite-device$dev_adrs-message$strFreq……gpibwrite-device$dev_adrs-message:DISPTXafter2000gpibwrite-device$dev_adrs-message:MEAS:RFR:FREQ:ABS?setTXFreq[gpibread-device$dev_adrs-modeascii]……操作流程tcl控制GPIB的示例setGpibAdrs1packagerequiregpibsetdev_adrs[gpibopen-address$GpibAdrs]gpibclear-device$dev_adrsgpibclose–device$dev_adrs关闭设备进入相关界面进行设置或读取数据打开设备Drv_8921A.tclsetGpibAdrs1#使用GPIB控制综测仪procctrl_8921A{}{globalGpibAdrsglobaldev_adrspackagerequiregpib;#GPIB控制setdev_adrs[gpibopen-address$GpibAdrs]gpibclear-device$dev_adrs}……Api_8921A.tclsourceDrv_8921A.tcl#------------------------------------------##如下为测试某项功能对应的综测仪界面设置##这里的TX、RX主要指的是综测仪的发射和接收##------------------------------------------##初始化综测仪,所做的工作包括使能GPIB控制综测仪,对综测仪进行复位procinit_8921A{}{ctrl_8921Areset_8921A}……对于综测仪的常用操作,我们已使用tcl封装了一些常用的函数,供我们在编写脚本时方便调用。其中Drv_8921A.tcl里面的函数为直接对综测仪的基本操作,Api_8912A.tcl调用了Drv_8921A.tcl里面的函数,提供一些常用功能的函数。常用综测仪的tcl操作库使用tcl通过GPIB控制仪器1使用tcl通过串口控制对讲机2使用tcl通过USB控制对讲机3目录串口操作在使用串口前先进行参数配置并指定端口号;然后需要按哪个按键,就发对应的按键命令;使用完后,进行关闭串口。通信协议tcl串口以前的模拟对讲机提供了虚拟按键命令,上位机通过串口向对讲机发相关命令,对讲机就会响应对应的按键操作。关键函数所有操作涉及的函数较少,最主要的函数为向串口发送数据,该函数已经封装好,只需要将发送数据填进去。tcl通过串口控制对讲机虚拟按键命令介绍命令格式•波特率设定:38400无校验,数据位8停止位2,多字节的低位在前,高位在后。•上位机-下位机:数据头(0x02)+操作码+虚拟按键标识+按键类型+具体按键+按下类别+数据尾(0x03)•下位机-上位机:数据头(0x02)+返回码+是否成功+操作码+具体按键+数据尾(0x03)SK1Short上位机:Operate+Key('k')+FuncKey(1)+SK1+Short0x020x4F0x6B0x010x000B0x0203下位机:cknowledge+Yes+Operate+Key('k')0x020x410x610x4F0x6B03操作流程使用串口编写脚本setcomRate38400;#comRate波特率setcomParityBitn;#comParityBit校验位setcomDataBit8;#comDataBit数据位setcomStopBit2;#comStopBit停止位setcomPortCOM1:;#comPort串口号setfh[open$comPortRDWR]fconfigure$fh-blocking0-bufferingnone\-mode$comRate,$comParityBit,$comDataBit,$comStopBit\-translationbinary-eofchar{}send_exp_end$fhclose$fh关闭串口向串口发送命令配置通讯通道setSK1_On\x02\x4F\x6B\x01\x0B\x00\x02\x03“setSK1_Resp\x02\x41\x61\x4F\x6B\x03“setwaitSecs1send_expect$fh$SK1_On$SK1_Resp$waitSecsGlobal.tclsend_expect函数•在Global.tcl中,我们将全局变量、各个虚拟按键命令的数据都已定义好,并提供串口操作的函数和一些常用的判断函数,在写具体测试脚本的时候,包含Global.tcl文件,即可方便调用,一定程度上减轻了测试脚本编写的繁琐程度。•最关键的函数send_expect,包含了4个参数,分别为:fh:已打开的串口outstr:要向对讲机发送的虚拟按键指令(对应的字符串)respond:对讲机返回的数据seconds:等待的时间(1对应500ms)已有的封装(或公共处理)一个脚本范例如下示例不断按PTT,看是否会出现长发射#包含文件Global.tcl、Api_8921A.tcl,使脚本能够调用该文件中的接口sourceGlobal.tclsourceApi_8921A.tcl#初始化8921Ainit_8921Aafter500#综测仪进入接收界面set_8921A_forRXafter500#打开串口setfh[open$comPortRDWR]fconfigure$fh-blocking0-bufferingnone\-mode$comRate,$comParityBit,$comDataBit,$comStopBit-translationbinary-eofchar{}after3000setpassNum0setfailNum0setcount0一个脚本范例while{$count10000}{#按PTT发射send_expect$fh$PTTOn$PTTOn_Resp$waitSecsafter2000setbRst1[exist_RX_power]after200#松开PTTsend_expect$fh$PTTOff$PTTOff_Resp$waitSecsafter1500setbRst2[exist_RX_power]if{$bRst1==1&&$bRst2==0}{setpassNum[expr$passNum+1]}else{setfailNum[expr$failNum+1]}incrcountafter1000}#关闭串口send_exp_end$fhclose$fh使用tcl通过GPIB控制仪器1使用tcl通过串口控制对讲机2使用tcl通过USB控制对讲机3目录关于HRCPHRCP(HYTRadioControlProtocol)为HYT配件、PC机或第三方设备与HYT对讲机通信的协议(目前只在DMR机型使用)。HRCP是一个向应用层提供网络通信保障以及控制指令集的应用层协议。针对自动化测试,它提供了虚拟按键、信道/组切换、音量调节、外围现象(LED、LCD对应数据)的返回等协议。HRCP支持的物理链路可以是USB、UART、SOCKET,目前我们自动化测试使用的是USB,当然,这并不关键,因为应用软件组提供了HRCP的函数库,我们可以很方便调用。HRCPHRCP简介HRCPWin32库关键函数•该库为Win32环境下的应用层提供HRCP指令收发数据,通过调用其提供的函数,应用软件或我们的测试脚本可以方便地与DMR对讲机通信,根据收发数据对对讲机进行控制和判断它的一些状态、外围现象。•HRCPWin32库提供了两种方式与对讲机通信非阻塞:voidWriteData(WORDOpcode,WORDDataLen,BYTE*Payload,BOOLbReturn=TRUE);voidSetRecvCallback(void(*CallbackFun)(WORD,WORD,WORD,BYTE*));阻塞:RECV_DATA*WriteDataWithWaitSignal(WORDOpcode,WORDDataLen,BYTE*Payload,BOOLbReturn=TRUE);HRCPWin32组件tcl调用DLL•在VC下,对普通的DLL重新进行封装,按照规定的格式将tcl指令与原DLL的函数绑定,在测试脚本中,只需要load新封装的DLL,就可以自由调用里面的tcl指令。VC下扩展tcl命令•Ffidl是国外高手已编写好的,方便在tcl平台下调用C函数的库,只要load该库和要使用的DLL库,在tcl脚本中,用Ffidl提供的方式将tcl指令与要使用的DLL中的函数绑定,就可以自由调用该tcl指令。使用tcl的Ffidltcl调用DllHRCPWin32库是一个在VC环境下编写的DLL库,我们要在tcl中调用相关的函数,需要命名tcl指令与那些函数绑定起来,才能够在自动测试脚本中调用。Drv_Radio_HS.tclsetfilenameExTCL.dllsetpath[format%s%s$scriptpath$fil