施金花,王 斌,张鑫彬,李文顶
(上海航天技术研究院第803研究所,上海 200233)
伺服机构工作需要有一定的供油压力,由于液压泵供油能力有限,采用平常的连续频率扫描测试方法无法保证伺服机构正常工作,现多采用逐个加不同频率的正弦波信号,待一个频率的信号结束后伺服机构回归零位,供油压力恢复正常时再给定下一个频率的正弦波信号。伺服机构存在零偏,功放电流限制等非线性因素,在工程应用中根据各频率点的输入信号和反馈信号计算出幅值和相位。由于对反馈信号采用滤波处理会降低反馈的幅值,所以本文将各频率点的反馈信号直接拟合成一阶正弦函数形式,再根据输入信号计算出幅值和相位以及零偏。在VB.NET 软件测试程序中,编写反馈信号的拟合函数显然费时费力,而MATLAB 具有强大的计算功能,并且具有专门的曲线拟合工具箱。为提高程序的效率和质量,本文将MATLAB拟合函数以COM组件的形式实现供VB.NET调用。
VB与MATLAB混合编程的方法有多种,包括应用ActiveX 技术、应用DDE 技术以及使用MatrixVB 等,但是这些技术都不能脱离MATLAB 运行环境[1]。为了使混合编程方法能够脱离MATLAB运行环境,也能够供其他编程语言调用,本文采用生成COM 组件的方法供VB.NET 调用,从下文可以看出此方法生成过程简单,并且便于模块化。
测试伺服机构幅频特性需要不同频率的正弦信号,模拟幅值为1 V,频率为4 Hz 的三个正弦波输入信号及其得到的反馈信号,如图1所示。
图1 一个频率段内伺服机构输入和反馈信号
从图1 可以看出,伺服机构反馈信号受伺服机构本身非线性特性、采集卡、电气干扰等影响,输出曲线并不是非常光滑,在读取反馈信号幅值以及相位滞后时会有较大偏差,因此需要对反馈信号进行光滑处理。采用滤波的方法可以使反馈信号趋于平滑,但同时会使幅值产生衰减,对结果分析会产生大的偏差。本文将反馈信号拟合成一阶正弦函数的形式得出幅值,再与原信号相比得出相位滞后。
图1所示函数为分段函数,需用VB.NET将中间的反馈信号提取出来进行拟合,提取出的曲线如图2所示,然后与原信号相比得出幅值和相位。
图2 提取的输入和反馈信号
MATLAB 拟合函数非常简单,可以用短短几行语句实现,语句如下:
myfit 函数是将反馈信号拟合成a sin(ωx+φ)+a0的形式。由于MATLAB函数在计算中有虚数的概念,所以需将返回值转换成实数以便VB.NET调用。将图2所示反馈信号曲线拟合后得到的曲线如图3(a)所示,从图3 可以看出,拟合曲线幅值与反馈曲线一致性相对较好,相位相对比实际反馈曲线超前,究其原因是由于反馈信号在第一个波形还未达到稳定时就对其进行了拟合,导致拟合出的相位超前。至此可以改进算法,从第二个波形开始拟合,拟合出的曲线如图3(b)所示,不难看出图3(b)拟合效果要比图3(a)好很多,表1 给出了拟合曲线幅频特性的相位值与精准值的比较。
将上述MATLAB函数保存为myfit.m文件,利用deploytool 命令生成工程名为fupin.prj、类名为Class fupin、函数名为myfit 的通用COM 组件,当函数编译正确后会在相对路径的distrib 文件出现名为fupin_1_0.dll 的文件,至此COM 组件就成功生成。
点击“项目”菜单,选择“添加引用”,通过“浏览”选择生成的fupin.dll。这样COM组件就添加到程序中。
在VB.NET 中如果用一维数组变量存取反馈时间和反馈信号的值,则在MATLAB编写function函数时应注意将输入形参进行转置后进行计算,因为MATLAB 软件在数组存储上是列优先原则,会将VB.NET 的一维向量看成是一维列向量进行处理。
图3 反馈曲线与拟合曲线比较
表1 拟合曲线幅频相位与标准值比较
上述程序是反馈信号从第二个波形开始将一维数组变量array1 存储反馈时间,一维数组变量arrayy 存储反馈信号,应注意array1 向量与arrayy向量的长度相等。输出的幅值、相位及零偏分别存入变量A,fai,a0中。
本程序运行结果如图4 所示,实际的伺服机构测试程序中在不同正弦波输入频率下反复调用COM 组件函数,可以得到在不同频率下的幅频值与相位。可见此拟合函数具有通用性,此外也方便其他程序(如C++、Labview等)调用。
图4 VB.NET运行结果
利用MATLAB 科学计算能力强的特点,可以将一些复杂的科学计算过程用MATLAB 轻松实现,同时将这些过程生成通用COM 组件模块供VB.NET 调用,可以省去VB.NET 编写复杂函数的繁琐过程,令编程效率大幅提高。本文实现了两者混合编程,可以同时发挥MATLAB 计算能力强和VB.NET 编程界面快捷友好的特点,收到了良好的效果。同时生成的COM组件便于模块化,可以为其他程序调用。这对其它科学计算要求高的测试软件提供了实际意义。
[1]冯莉.VB 与Matlab 的混合编程方法[J].兵工自动化,2005,24(5):110-113.
[2]冀刚.MATLAB 7.3 与.NET 新接口技术[J].电脑知识与技术,2008(03):548-550.