(特变电工衡阳变压器有限公司 湖南衡阳 421007)
摘要:Lua是一种简单、可扩展、可移植的高效脚本语言; Creo是目前世界上应用最为广泛的三维设计软件,本文介绍了Lua程序在电力变压器行业Creo二次中的产品参数传递中的相关应用
关键词: Lua;Creo;二次开发;变压器;参数传递
1.引言
Lua是一个小巧而简单的语言,它具有简单高效、可扩展性、可移植性的特点。Lua简单小巧,易于学习,内容少但功能强大,很容易在应用上实现。在扩展方面,Lua的很多功能都是通过外部库来扩展的。Lua很容易与C/C++、java、fortran、Smalltalk、Ada,以及其他语言接口。在可移植性方面,因为Lua本身没有使用条件编译对不同的平台进行特殊处理,仅依赖于ANSI(ISO)C标准进行代码的编写,所以Lua可以在Windows、UNIX、MAC等等几乎所有我们所知的系统上运行。
Creo是美国PTC(Parametric Technology Corporation)的产品,用于产品的三维模型设计、加工、分析及绘图。
主流的电力变压器厂家在产品设计上均采用Creo进行三维设计,同时都有自己的二次开发设计平台。Creo的二次开发工具CreoToolkit以C语言为基础,通过C语言可以方便的建立参数输入、Lua程序参数计算、参数结果传递到Creo的通道。
2.Lua程序的调用
Lua程序与C语言的结合,有两种方式:Lua程序调用C语言和C语言调用Lua程序。
从Lua调用C是对Lua的一种扩展,本质是将新的C函数注册到Lua中,但并不意味着Lua可以调用任何的C函数。C函数必须遵循一个获取参数和返回结果的协议,此外还必须注册C函数,以便用某种适当的方式将函数地址告诉Lua。
而C语言对Lua的调用则相对简单,同时因为CREO与C语言的关联性更强。所以本文采用C语言作为CREO与Lua的连接。
3.Lua程序在Creo二次开发中的关键技术
通过上述内容,我们对Lua的调用有了基本认知,下面介绍Lua调用的关节技术点。
3.1 C语言与Lua对接的关键接口
①LUA的函数和普通变量一样也是First Class Variable类型,可以看作函数指针变量参与栈操作。因此调用过程分为如下几个步骤:
A.请求LUA函数(指针)入(GLOBAL)栈。
B.将函数需要的参数入栈,入栈顺序按照参数被声明的顺序。
B.告知LUA虚拟机入栈参数的个数、函数返回值的个数,并调用此LUA函数。
D.从栈定获得返回值,先返回的先入栈,然后将返回值显式出栈。
C语言上预留唯一一个与Lua的接口,下面是C语言中与Lua接口部分的简短函数流
程
//初始化LUA虚拟机
void InitLuaState(lua_State* L)
{
/* 加载Lua库*/
luaopen_base(L);
luaopen_table(L);
luaL_openlibs(L);
luaopen_string(L);
luaopen_math(L);
}
int call_lua_function(void)
{
lua_State* L = lua_open();
InitLuaState(L);
int iError;
…………………………
/* 加载AILua脚本 */
iError = luaL_loadfile(L, "../ AiLua..lua");
…………………………
/* 运行脚本 */
iError = lua_pcall(L, 0, 0, 0);
…………………………
/* 得到函数地址 */
. lua_getglobal(L, " GetModelCS ");
…………………………
/* GetModelCS函数参数赋值 */
lua_pushstring(L, input);
/* 得到Lua函数返回值 */
iError = lua_pcall( L, output);
…………………………
/* 清理栈 */
lua_pop(L,2);
lua_close(L);
return 0;
}
②Lua的相关脚本文件中唯一一个与C语言对接的脚本文件中应该起到参数传递的关键作用,这个文件既要收到C语言传递过来的参数,同时需要把这些参数对应的传递到具体计算的脚本程序文件中去,这是向底层传递。当脚本程序文件对参数进行计算过后,这个文件又需要把所有的结果收集起来再传回C语言,这是向顶层传递。C语言得到的计算结果,就可以通过CreoToolkit传递到三维模型、三维工程图等等Creo的文件中,达到变压器模型参数驱动的目的。
下面简短列出主脚本文件《AiLua.lua》中调用底层计算脚本的过程
require("xy") -- 加载箱沿模块
require("youx") -- 加载油箱标准计算模块
require("biaozhun") -- 加载标准计算模块
require("qqh") -- 加载取气盒模块
require("jqt") -- 加载加强铁模块
require("sgz") -- 加载升高座模块
require("xg") -- 加载箱盖模块
require("wdjdz") -- 加载温度计底座模块
require("lengque") -- 加载冷却器相关模块
require("chouzhenkong") -- 加载抽真空相关模块
require("sudong") -- 加载速动相关模块
require("cpb") -- 加载磁屏蔽相关模块
require("yafa") -- 加载压力释放阀相关模块
require("guijiao") -- 加载柜脚相关模块
require("zhulianguan") -- 加载主联管相关模块
require("kg") -- 加载开关相关模块
require("lgzj") -- 加载联管支架相关模块
require("zongzhuang") -- 加载总装相关模块
require("dyg") -- 加载导油管相关模块
下面是与三维二次开发程序与主接口Lua文件《AiLua.lua》进行参数传递与获取结果的主交换函数过程
function GetModelCS(funcname,shuru)
if funcname=="xy.js" then
return xy.js(shuru)
end
if funcname=="youx.js" then
return youx.js(shuru)
end
……………………………
end
下面以《xy.lua》文件为例,简单列出关于箱沿计算的过程
function xy.js(SR)
--计算结果初始化
local JSJG={
WZX=1,
TSXX=" "
}
if SR.YX_JG ~=nil then
if string.find(SR.YX_JG,"110kV钟罩式常规") then
…………………………
end
if string.find(SR.YX_JG,"220kV钟罩式常规") then
…………………………
end
if string.find(SR.YX_JG,"220kV桶式常规") then
…………………………
end
…………………………
else
JSJG.WZX=0
JSJG.TSXX="缺少油箱结构(YX_JG)"
end
return JSJG
end
3.2设计标准化文件
Lua脚本的计算过程依赖于产品的设计标准化文件,每一步的计算都必须有标准化文件的支撑。
4.结束语
通过Creo二次开发工具,调用Lua脚本程序,按照产品标准化文件,对变压器的输入参数进行计算,将结果传递到Creo模型当中,驱动模型变化,实现产品自动成型的全过程。
参考文献
[1]《Lua程序设计(第4版)》作者:(巴西) Roberto. Lerusalimschy(罗伯拖.鲁萨利姆斯奇;
译者:梅隆魁;电子工业出版社,2018.07。