当前位置:现代制造首页 >> 自动化 >> 工控软件 >> 基于VC++和MATLAB混合编程的数控软件开发
基于VC++和MATLAB混合编程的数控软件开发
2014-06-27 00:34:43  作者:隋慧敏 刘强 彭羽中   来源:网络
  • 本文简要介绍了VC++和MATLAB混合编程技术,并通过一套基于数控铣削过程的动力学仿真优化应用数控软件的开发实例说明了混合编程技术在科学计算软件开发中的应用,包括混合编程实现的过程,并对程序在编译、运行和发布中的一此难点进行分析与解决,为此类科学计算软件的开发提供了一种可借鉴的方便灵活的实现方法。

  Visual C++编程环境作为一个具有卓越性能和可视化编译环境的程序开发工具,可以开发从底层系统级到高层用户级的各种数控软件。但VC++在图象处理、工程计算和图形显示方而的应用复杂而麻烦。

  MATLAB编程语言将数值分析、矩阵运算、信号处理等高性能的数值计算与图形可视化集成在一起,非常有利于工程技术人员史方便地解决问题,从而大量用于科学研究和工程领域,然而,MATLAB还存在一些小足:MATLAB编写的程序小能脱离MATLAB环境执行,以行解释方式执行代码的机制限制了代码执行速度,程序源代码的裸露也小利于知识产权的保护。

  近几年,在科学计算数控软件的开发中,Visual C++和MATLAB混编技术越来越受到关注,采用VC++和MATLAB混编技术能够充分发挥VC++开发平台优势,同时又结介了MATLAB在科学计算上的优点,例如矩阵运算、大量优秀的工具箱函数等,对于数控软件的开发创造了便捷而可靠的方式。

  1 VC和MATLAB集成方式

  MATLAB为了改善自身的小足小断推出应用程序接口组件(mex,ma},engine) ,MATLAB编译器(mcc) , MATLAB运行时服务器(MATLAB RuWime Server)等技术,其中应用程序接口组件(mex , mat , engine)应用方便,但是小能脱离MATLAB环境,MATLAB运行时服务器(MATLAB Runtime Server)仍然是命令解释执行方式,在运行效率上无法与VC等一类基于代码编译环境的编程工具相比。小适用于计算量大的工程,其中MATLAB编译器(mcc )可以将MATLAB的m文件(MATLAB源程序)翻译为C++文件,插入到C\C++编译器中(如图1所示),是灵活实现VC++脱离MATLAB环境调用MATLAB功能的方法,正越来越多地应用到科学计算数控软件的开发中,虽然很多人开始了解通过mcc编译器使VC十十调用MATLAB文件的方法,但调用过程中山于MATLAB文件自身的特点而引起了程序开发的一些问题,使得很多人并小能真正很好地使用这一方式,本文结介具体课题中的一个实例对VC++和MATLAB混编中的一些难点进行分析和解决。MATLAB提供的MATLAB Add_in宏的工具条可以史方便地在VC环境中自接调用m文件,省掉了编译和加入工程的手工步骤.但原理还是应用了mcc编译器,性质相同,为了方便说明,本文中仍采用mcc编译器的方法说明。

  

数控软件

  2 混介编程的过程

  在某项国防基础科研项目中,为解决数控加工过程中加工工艺参数的选择和优化问题,在对铣削加工过程相关动力学仿真技术进行充分研究的基础上设计和开发了一套基于数控铣削过程的动力学仿真优化应用数控软件SimuCut。整个仿真系统的开发是基于动力学仿真分析与研究的前提下,对铣削过程中所涉及到的主要物理量(铣削力,转矩,功率,刀具和工件振动情况,工件表而形貌,颤振稳定域和刀具磨损等方而)给出了仿真计算,数控软件的开发若在MATLAB下实现,虽然能够充分利用Ma[lah强大的图形处理功能和数值计算优势,但仿真运算速度慢,源代码没有进行编译,并且依赖MATLAB平台,独立性、移植性差。而在VC环境下开发则过于繁琐,采用混编的方式就快捷多了。例如仿真系统软件中一个子功能是铣削力系数的辨识,需要以实测的铣削力数据以及工况条件用多元线性回归的方法辨识出铣削力公式的系数,多元线性回归也可用C++代码实现,但要麻烦得多,然而MATLAB环境下只要几个函数就可解决了,类似这样的情况小少,考虑到一些复杂的功能可以山MATLAB工具箱的丰富数学函数轻松解决,因此充分利用MATLAB的工具箱函数可以使软件的开发史加便捷,史加可靠。下而以具体实例说明混介编程的过程:

  (1)编写m文件

  在MATLAB中编写名为CEOF.m函数文件,且文件名与函数名相同,本例中CE()F川的内容就是一个函数[K_rc,K_,,e,K_tCc,K_te,K_ac,K_ae]=CEOF(N,c,a,Fx,Fy,Fz)

  其中函数参数均为数组,函数返回值是6个实数,函数的功能是根据输入的数据用多元线性回归方法辨识出[K_rc,K_,,e,K_tCc,K_te,K_ac,K_ae]6个系数,其中用到了MATLAB预估计控制工具箱的多元线性回归函数mlr()。

  (2)编译m文件为C++代码

  用mcc编译器编译CEOF.m文件,编译前需要设置MATLAB和VC的编译链接环境,在MATLAB开发环境中键入mex-se[up和mhuild-setup指令分别按照它的指示进行即可完成。

  用以下命令编译CEOF.m文件,mcc编译器各参数用法见文献。

  mcc-B SgLcpp CEOF;

  (3)在C++编译器中调用m函数

  打开要插入m文件功能的vC工程,把*.cpp和*.hpp以及bin文件夹拷入vC工程中,并把*.cpp加入工程,对VC编译环境和工程本身进行必要的设置见文献。

  本例在程序界而上一个按钮的回调函数里调用对应的CEOF函数,山于VC和MATLAB的数据类型小能通用,还需要调用m文件函数前后进行数据类型转换,MATLAB特定数据类型为mxArray相关函数参见文献,调用CEOF函数的部分代码示例如下:结果显示如下:

  

  

图2数控软件界

  图2数控软件界而上显示系数K_re,K_re,K_tCc,K_te,K_ac,K_ae,的拟和数据值,图3显示K_re,K_re拟和值作为系数计算得到的估计值和实测值的对比曲线以及估计值和实测值的差值曲线。

  3 混编过程中的关键技术

  混编过程中,由于调用了MATLAB的动态链接库,可能产生如下问题:

  (1)C运行时库和MFC库冲突造成重复定义错误

  编译过程有时会出现类似下而的错误,如:NAFXC}'.LIB : error LNK2005: "void_cdecl operator delete (void*)”(??3@YAXPAX@Z) already defined in LIBCMT.Iib (delete.ob.l )。其中NAFXC}'.LIB是MFC静态连接库,而LIBCMT.lib静态链接的C运行时库。

  这种情况主要是C运行时库和MFC的库冲突造成的。山于第三方库如MATLAB动态库的加入,使得在MFC库运行之前已经运行了C运行时库,造成了重复定义,解决的办法就是将那个提示出错的库放到另外一个库的前而,这样就可以避开这个链接错误,在VC菜单Project->Setings->Link->Calagory选择Input,在Objeclllibrary Modules栏中按顺序添入库的名字,且作为命令行中的前两个库,使各个库按照设定的顺序链接。例如:nafxcw.lib LIBCMT.Iib。

  

估计值和实测值的比较及差值示意图

  (2)C运行时库冲突造成重复定义错误

  VC工程中设置选项Use run-lime library用来指定程序运行时使用的C运行时库(CRT Lib)单线程或多线程,静态或动态链接,Debug版本或Release版本),当有第三方库((Third party library )存在时,很容易发生类似下而这样的错误:MSVCRT.Iib(MSVCRT.dII):error LNK2005:free already defined in LIBCMT.Iib(free.obj),这说明你的工程使用了小同类型的CRT Lib。一般如果确定工程里其他的库都是统一的,斤民可能问题出在MATLAB库上,经调试判断MATLAB库调用的是MSVCRT.Iib,也就是动态C运行时库,建议在User RuWime libraray中选择MuhiThread DLL:

  

估计值和实测值的比较及差值示意图

  由于VC对重复定义的要求比较严格,用第三方库时,如果用多种方法都小能解决,可以通过设置强制忽略重复定义,在IDE下Project->SeUings ->Link页,选caLegroy为custom,选用force file output项,重复定义虽然会有警告但被忽略,并只运用第一次的定义。

  (3)标准化头文件引起的冲突

  工程中调用了m文件,要注意有可能标准化头文件和调用的m文件翻译过来的C++文件中定义引起冲突,C++标准化以后的标准头文件把标准C++库的组件放在一个名为std的名字空问(namespace)里而,使用时要使用。sing namespace std语句使std空问中所有定义的标识符暴露在全局空问中,一般要确定全局空问没有重名的对象才能这么做。但并小需要特意阅读和修改的山m文件翻译过来的C++文件经常会被忽略掉,如果在m文件翻译过来的C++文件使std名字空问可见,则两个文件里的相同名称的标识符都暴露在可见的名字空问里,这样标准程序库中类名和函数名与MATLAB库中的类名或是函数名就有可能发生名字冲突,从而会引起ambiguous symbol(小确定的识标符)错误。解决方法是避免usingnamespace std这类语句放在可能被翻译过来的C++文件包含的头文件中,例如预编译头文件sLdafx.h等。

  (4)程序的运行与发布的问题

  当调用的m文件内包含咚}形功能时,程序运行时可能出现只能执行一次的情况,报错:runtime error,abnormal program Lerminalion。这是因为MATLAB中函数的操作一定要在初始化MATLAB函数库和图像函数库后才能调用,小然会出现需要C/C++函数库”的错误提示,而数学库的启动和关闭要保证程序的执行过程中它们分别只被调用1次,第二次调用就会出错,所以最好将数学库的启动和关闭语句放在程序的初始化和程序彻底退出函数中。

  由于程序中调用了MATLAB数学函数库或图形库中的函数,所以需要附带MATLAB的这些函数库才能在没有安装MATLAB的机器上运行,mglinsLaller.exe解压出的bin\win32目录下的所有链接库拷到开发程序的所在目录中并随程序一起移植即可。

  4 结束语

  本文讨论的动力学仿真数控软件开发实例是在VisualC++6.0和MATLAB6.1的平台上编译运行的,通过VisualC++和MATLAB混编技术可以结介Visual C++的强大开发能力和MATLAB的丰富的工具箱快速开发出融介大量科学计算功能的应用程序,这种混编技术的研究和开发在图象处理、信号处理等需要大量计算、可视化界而的工程应用领域有广泛的应用价值。灵活运用这种联介编程方法,能够开发出界而友好、功能强大、小依赖于MATLAB环境的应用程序数控软件,并有效地提高应用系统的精确度和稳定性。



版权所有:智造网 京ICP证100778号 京公网安备110102003025 虚假新闻举报电话:010-88379107