文章目录
- 实验目的
- 温度控制器需求文档及测试要求
- 环境搭建
- 实验内容
- 温度采集处理功能测试
- 加热棒输出电压测试
- 散热风扇
- 温度传感器输入接口(Senser_JK)
- 控制加热棒输出接口(Heater_JK)
- 控制散热风扇输出接口(Fan_JK)
- 温控稳定时间性能需求(Control_XN)
- 最终测试结果
实验目的
本次测试对象是温度控制器。
温度控制器需求文档及测试要求
环境搭建
解压 vspd.rar 文件,打开 vspdxp_install 进行安装
实验内容
点击“打开项目”,打开esi文件
打开 vspdconfig
根据需求文档,使用vspd绑定对应的串口
创建3对串口,5和6一对,7和8一对,9和 10一对
打开待测件
然后点确定
打开ETest,点环境设置然后点确定(环境设置时直接确定,不需要手动更改)
成功后如图
温度采集处理功能测试
温度采集处理的示例代码已经给出了,点击ETest右侧的“项目->测试目录->功能测试->温度采集处理”进入代码
# coding:utf-8
def Test(arg,exp):
CH_232_温度传感器.Clear()
Protocol_温度传感器.温度值.Value = arg[1]
bool=Protocol_温度传感器.Write()
print '第%d次期望显示温度值%d'%(arg[0], exp[0])
API.Common.Timer.Normal.Sleep(1000)
Standard_Test(Test)
先点击运行
再点击开始
可以看到数据了
下面给出具体的测试方法
- 首先看功能需求
- 点击ETest右侧的“项目->测试目录->功能测试->温度采集处理”,再点击“测试数据”,向里面输入自己的测试数据
- 点击“测试任务”,编写自己的测试脚本
# coding:utf-8
############标准测试模板#######################
## Test:测试数据执行函数体,【测试数据】每一行数据调用一次Test
## arg:输入参数
## exp:预期输出
import Manu
def Test(arg,exp):
# 给字段复制
Protocol_温度传感器.温度值.Value = arg[1]
# 协议写
bool=Protocol_温度传感器.Write()
show = []
str0 = "序号: " + str(arg[0])
str1 = "设定温度:" + str(arg[1])
str2 = "预期温度:" + str(exp[0])
# str0, str1, str2分别会被显示在菜单的第一、二、三行
show.append(str0)
show.append(str1)
show.append(str2)
# 弹出对话框
# 点击确定,返回值为true
# 点击否定,返回值为false
Manu.Check(show)
### 入口
Standard_Test(Test)
- 打开测试文件中提供的SensorControl.exe
直接点击“确定”,然后点“开始”
- 回到ETest,点击上方的“运行”(如果运行是灰色的,就需要先点击旁边的“环境设置”,等待一会,然后就能点运行了)
这时候弹出了对话框,就可以将对话框中的“设定温度”、“预期温度”和温度控制器的“采集温度”进行对比,从而得到测试结果,找到问题
加热棒输出电压测试
- 首先看功能需求
- 右键“功能测试”,点击“新建测试用例->TCPython”,输入测试名称“加热棒”,然后写好测试代码,下面的代码是不读取“测试数据”的写法
# coding:utf-8
import math
import Manu
def Volt(j, arr):
Dp = 0.05
Di = 0.1
Dd = 0.1
Td = 20 # 设定温度
ek = Td - arr[j]
if j == 0:
ek1 = Td - 15
ek2 = Td - 15
elif j == 1:
ek1 = Td - arr[j - 1]
ek2 = Td - 15
else:
ek1 = Td - arr[j - 1]
ek2 = Td - arr[j - 2]
print "ek = %d, ek1 = %d , ek2 = %d" % (ek, ek1, ek2)
# 电压变化量
result = Dp * (ek - ek1) + Di * ek + Dd * (ek - 2 * ek1 + ek2)
print "result = %f" % result
return result
def init():
# 初始化待测件加热棒输出为已知状态
Protocol_温度传感器.温度值.Value = 15
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(200)
Protocol_温度传感器.温度值.Value = 15
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(1000)
def Test():
print 'Test start'
# 初始化电压输出为已知状态
init()
# 清理通道
seekresult=CH_232_加热棒.Clear()
# 等待新的数据包
Protocol_加热棒.BlockRead()
# 获取当前的电压
v = Protocol_加热棒.加热棒输出电压.Value
# 设定温度
Td = 20
# 预期采集电压列表
T = [15, 15, 15 , 15, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23]
for i in range(len(T)):
print "------------------------------"
print "第%d次,当前采集温度值: %f" % (i, T[i])
# 写入新一次的温感数据
Protocol_温度传感器.温度值.Value = T[i]
bool=Protocol_温度传感器.Write()
# 清理加热棒输出通道
seekresult=CH_232_加热棒.Clear()
Protocol_加热棒.BlockRead()
v = v + Volt(i, T)
# 负值截断处理
if v < 0:
v = 0
print "第%d次期望输出电压值为: %f, 实际输出电压值为: %f, 误差为: %.3f" % (i + 1, v, Protocol_加热棒.加热棒输出电压.Value, v - Protocol_加热棒.加热棒输出电压.Value)
print "------------------------------"
API.Common.Timer.Normal.Sleep(2000)
Test()
如果是读取测试数据,那么代码如下
import math
import Manu
def VK(t, td, e1, e2):
# t -> 当前温度
# td -> 设定温度
Dp = 0.05
Di = 0.1
Dd = 0.1
e = td - t
result = Dp * (e - e1) + Di * e + Dd * (e - 2e1 + e2)
return result
def Test(arg,exp):
global e1 # 上一次的温差, 设定温度-当前温度
global e2 # 上上次的温差,
global V1 # 当前时刻的输出电压值
# 通道清理,防止上一次的运行结果在通道中阻塞,影响本次效果
seekresult=CH_232_加热棒.Clear()
seekresult=CH_232_温度传感器.Clear()
# 给温度采集器赋值,当前温度
Protocol_温度传感器.温度值.Value = arg[2]
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(1000)
# arg[0] -->序号
# arg[1] -->设定温度
# arg[2] -->当前温度
# 第一次改变温度
if arg[0] == 1:
e1 = arg[1] - arg[2]
# 第二次改变温度
if arg[0] == 2:
e2 = arg[1] - arg[2]
Protocol_加热棒.BlockRead()
V1 = Protocol_加热棒.加热棒输出电压.Value
# 三次以上
if arg[0] > 2:
V = VK(arg[2], arg[1], e1, e2) + V1
print V
show = []
str = "设定温度为:%d, 室温为:%f" % (arg[1], arg[2])
show.append(str)
str = "预期电压为: %f" % (V)
show.append(str)
show.append("界面电压显示是否正确?")
passed = Manu.Check(show)
e2 = e1
e1 = arg[1] - arg[2]
# 协议读,读取输出给加热棒的数据包
Protocol_加热棒.BlockRead()
# 获取字段,当前电压,作为下一次的V(k-1)
V1 = Protocol_加热棒.加热棒输出电压.Value
Standard_Test(Test)
- 如果是读取“测试数据”的写法,那么就需要添加数据。点击“测试数据”,在“输入参数”下方的空白行处右键,点击“添加输入参数”
比如要新建名称为“序号”的一列,那么就这样填
同样的方法,在输入参数处添加“设定温度”、“采集温度”,然后点击“添加行”,就可以添加数据了
散热风扇
- 首先看功能需求
- 新建项目,写测试代码
# coding:utf-8
############标准测试模板#######################
## Test:测试数据执行函数体,【测试数据】每一行数据调用一次Test
## arg:输入参数
## exp:预期输出
import Manu
def Test(arg,exp):
# 写入数据前,先清理通道
seekresult=CH_232_温度传感器.Clear()
seekresult=CH_232_散热风扇.Clear()
# 写入第一次温度
Protocol_温度传感器.温度值.Value = arg[1]
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(500)
# 写入第二次温度
Protocol_温度传感器.温度值.Value = arg[2]
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(500)
CH_232_散热风扇.Clear()
# 写入第三次温度
Protocol_温度传感器.温度值.Value = arg[3]
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(500)
# 确保控制散热风扇的指令能够正常发出去
Protocol_散热风扇.BlockRead()
show = []
str = '第%d次期望散热风扇输出值:%s,实际输出值:%d' % (arg[0], exp[0], Protocol_散热风扇.操作指令.Value)
show.append(str)
Manu.Check(show)
## Standard_Test:标准测试的方法入口,使用【测试数据】表循环调用Test方法
Standard_Test(Test)
- 构建测试数据
- 先启动SensorControl.exe,再运行测试程序
对比两个程序的输出即可
温度传感器输入接口(Senser_JK)
- 首先看接口需求
- 构建测试数据
- 代码
# coding:utf-8
import Manu
def Test(arg,exp):
# 先清理温感通道
seekresult=CH_232_温度传感器.Clear()
# 分割字符串为列表,按照空格
str = arg[0].split(' ')
data = []
for i in str:
# 将16进制整型的字符串转化为整型表示
# 将16进制字符串转化为10进制整型表示
data.append(int(i, 16))
# 通道写入数据包
bool=CH_232_温度传感器.Write(data)
show = []
show.append(exp[0])
Manu.Check(show)
## Standard_Test:标准测试的方法入口,使用【测试数据】表循环调用Test方法
Standard_Test(Test)
控制加热棒输出接口(Heater_JK)
- 首先看接口需求
- 测试代码
#设定温度10℃
def Main():
print 'Hello world'
seekresult=CH_232_加热棒.Clear()
seekresult=CH_232_温度传感器.Clear()
Protocol_温度传感器.温度值.Value = 20 #不加热
bool=Protocol_温度传感器.Write()
Protocol_加热棒.BlockRead()
if Protocol_加热棒.包头.Value != 0xFFFA:
print '包头错误,错误的包头为%x'%Protocol_加热棒.包头.Value
if Protocol_加热棒.数据类型1.Value != 0x02:
print '执行数据错误,错误的数据类型1为%d'%Protocol_加热棒.数据类型1.Value
if Protocol_加热棒.数据类型2.Value != 0x11:
print '工作电机组错误,错误的数据类型2数据为%x'%Protocol_加热棒.数据类型2.Value
if Protocol_加热棒.数据长度.Value != 4:
print '数据长度错误,错误的长度值为%d'%Protocol_加热棒.数据长度.Value
if Protocol_加热棒.检验.Checked != True:
print '检验值错误,错误的校验值为%x'%Protocol_加热棒.检验.Value
if Protocol_加热棒.包尾.Value !=0x0F:
print '包尾错误,错误的包尾为%x'%Protocol_加热棒.包尾.Value
Protocol_温度传感器.温度值.Value = 5 #加热
bool=Protocol_温度传感器.Write()
Protocol_加热棒.BlockRead()
if Protocol_加热棒.包头.Value != 0xFFFA:
print '包头错误,错误的包头为%x'%Protocol_加热棒.包头.Value
if Protocol_加热棒.数据类型1.Value != 0x02:
print '执行数据错误,错误的数据类型1为%d'%Protocol_加热棒.数据类型1.Value
if Protocol_加热棒.数据类型2.Value != 0x11:
print '工作电机组错误,错误的数据类型2数据为%x'%Protocol_加热棒.数据类型2.Value
if Protocol_加热棒.数据长度.Value != 4:
print '数据长度错误,错误的长度值为%d'%Protocol_加热棒.数据长度.Value
if Protocol_加热棒.检验.Checked != True:
print '检验值错误,错误的校验值为%x'%Protocol_加热棒.检验.Value
if Protocol_加热棒.包尾.Value !=0x0F:
print '包尾错误,错误的包尾为%x'%Protocol_加热棒.包尾.Value
Main()
控制散热风扇输出接口(Fan_JK)
- 首先看接口需求
- 测试代码
# 设定温度为10
def Main():
seekresult=CH_232_温度传感器.Clear()
seekresult=CH_232_散热风扇.Clear()
# 写入初始状态,保证风扇不转动
for i in [8, 8, 8]:
Protocol_温度传感器.温度值.Value = i
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(100)
# 散热风扇阻塞获取数据包
Protocol_散热风扇.BlockRead()
if Protocol_散热风扇.包头.Value != 0xFFFA:
print "包头错误,错误的包头为: %x" % Protocol_温度传感器.包头.Value
if Protocol_散热风扇.数据类型1.Value != 0x02:
print "数据类型1错误,错误的数据类型为: %x" % Protocol_散热风扇.数据类型1.Value
if Protocol_散热风扇.数据类型2.Value != 0x22:
print "数据类型2错误,错误的数据类型为: %x" % Protocol_散热风扇.数据类型2.Value
if Protocol_散热风扇.数据长度.Value != 1:
print "数据长度错误,错误的数据长度为: %d" % Protocol_散热风扇.数据长度.Value
if Protocol_散热风扇.检验.Checked != True:
print "检验和错误,错误的检验值为: %x" % Protocol_散热风扇.检验.Value
if Protocol_温度传感器.包尾.Value != 0x0F:
print "包尾错误,错误的包尾为: %x" % Protocol_散热风扇.包尾.Value
print "---------------------------------------------------------------------------------"
# 写入初始状态,保证散热风扇工作,来判断数据包是否正确
seekresult=CH_232_散热风扇.Clear()
for i in [15, 15, 15]:
Protocol_温度传感器.温度值.Value = i
bool=Protocol_温度传感器.Write()
API.Common.Timer.Normal.Sleep(100)
Protocol_散热风扇.BlockRead()
if Protocol_散热风扇.包头.Value != 0xFFFA:
print "包头错误,错误的包头为: %x" % Protocol_温度传感器.包头.Value
if Protocol_散热风扇.数据类型1.Value != 0x02:
print "数据类型1错误,错误的数据类型为: %x" % Protocol_散热风扇.数据类型1.Value
if Protocol_散热风扇.数据类型2.Value != 0x22:
print "数据类型2错误,错误的数据类型为: %x" % Protocol_散热风扇.数据类型2.Value
if Protocol_散热风扇.数据长度.Value != 1:
print "数据长度错误,错误的数据长度为: %d" % Protocol_散热风扇.数据长度.Value
if Protocol_散热风扇.检验.Checked != True:
print "检验和错误,错误的检验值为: %x" % Protocol_散热风扇.检验.Value
if Protocol_温度传感器.包尾.Value != 0x0F:
print "包尾错误,错误的包尾为: %x" % Protocol_散热风扇.包尾.Value
Main()
温控稳定时间性能需求(Control_XN)
- 首先看性能需求
- 测试代码
# coding:utf-8
#设定温度为10℃,初始恒温箱外部温度值为3℃
def Main():
print 'Hello world'
import time
Tc = 10 #设定温度
T0 = 0 #初始恒温箱外部温度值
T = T0
n = 0
Fs = 0
Va = 0 #上一次的输出电压
time0 = time.time()
while 1:
seekresult=CH_232_温度传感器.Clear()
seekresult=CH_232_加热棒.Clear()
seekresult=CH_232_散热风扇.Clear()
Protocol_温度传感器.温度值.Value = T
bool=Protocol_温度传感器.Write()
Protocol_加热棒.BlockRead()
Protocol_散热风扇.BlockRead()
V = Protocol_加热棒.加热棒输出电压.Value
if V<0:
V=0
# 计算加热棒的加热量
Qi = V*V *0.2
if Protocol_散热风扇.操作指令.Value == 1: #风扇打开
Fs =2
elif Protocol_散热风扇.操作指令.Value == 0: #风扇关闭
Fs = 0
# 计算散热风扇的散热量
Qo = 0.1*(T - T0) + Fs
#Qo = Fs
# 温度的变化量
T = T+(Qi-Qo) #下次输出温度值
if abs(T - Tc) < 0.5:
n=n+1
else:
n=0
# 当超过10次时
if n >=10:
time1 = time.time()
print '稳定时间为%d'%(time1-time0)
if time1-time0 <=60:
print '温控稳定时间性能测试合格'
break
# 当始终不能达到十次
time2 = time.time()
# 超时
if time2-time0>60:
print '温控稳定时间性能测试不合格'
break
API.Common.Timer.Normal.Sleep(1000)
Main()