一种Lua脚本在SCADA系统中实现动画的方法

文档序号:6348397阅读:469来源:国知局
专利名称:一种Lua脚本在SCADA系统中实现动画的方法
技术领域
本发明涉及SCADA图形系统动画实现技术。
背景技术
SCADA系统应用领域很广,可以应用于电力、冶金、石油、化工、建筑等领域的数据采集与监视控制以及过程控制等诸多领域。静态图形监控已不能直观生动地展现工业各种设备、设施的实际运转状态,图形动画已逐渐成为工业SCADA系统不可或缺的功能,是 SCADA图形系统发展的必然趋势。界面操作动画实现的动画较为单一,简单,逻辑稍微复杂的动画配置过程复杂。脚本语言良好的快速开发,高效率的执行,解释而非编译执行,和其它语言编写的程序组件之间通信功能很强大的优点,成为SCADA图形系统动画技术的首选。有使用IronPython脚本语言的,有自定义类VB脚本和类C脚本。IronPython庞大,处理速度慢;自定义脚本语言需要从零开发,耗费大量的资源,开发成本和维护成本较高。

发明内容
本发明提供一种SCADA图形系统动画的实现方法,Lua小巧强大保证了脚本的执行效率;Lua的开源特性缩短了开发周期,降低了开发成本;脚本的灵活性,能够实现逻辑复杂的动画。本发明的核心思想为在C++编写的SCADA图形系统和Lua引擎之间搭建一个共享库,能够使Lua引擎和C++相互理解对方定义的变量和函数,进而使两者能够进行数据交互;在图形系统开发环境中使用共享库中的变量和动画函数编写符合Lua语法规范的动画脚本,由图形系统开发环境负责对脚本进行解析;图形系统运行环境动态加载脚本,Lua引擎执行脚本。动画的实现则是在SCADA系统中设置定时器,并通过按定时器设定的时间间隔执行Lua脚本,Lua脚本通过调用共享库的图像操作函数实现对SCADA系统画面的操作, 进而使SCADA系统画面按定时器的时间间隔产生连续变化动画效果。具体的过程可以分成四个步骤
步骤10 在SCADA系统和Lua引擎之间构建共享库,所述共享库包括参数、函数,所述函数包括图像操作函数;
步骤11 编写Lua脚本,所述脚本包含步骤10中所述的图像操作函数; 步骤12 =SCADA系统运行时加载Lua引擎和Lua脚本,Lua引擎载入步骤10的共享库和Lua脚本;
步骤13 =Lua引擎按定时装置设定的时间间隔执行Lua脚本。所述的时间间隔是30_67ms,最好为55ms。进一步,所述Lua脚本分画面脚本和图形脚本,每种图形对象对应一个图形脚本, 所述步骤13的执行脚本过程首先执行画面脚本然后执行各个图形脚本。进一步,还包括图形系统开发装置,所述的图形系统开发装置载入Lua引擎、载入所述步骤10的共享库、编写步骤11的Lua脚本,编写后的脚本经图形系统开发装置的解析
3无错误后保存,解析错误的无法保存。进一步,所述的画面脚本保存在画面文件的画面参数中,所述的图形脚本保存在画面文件的图形参数中。所述的画面脚本和图形脚本都保存在画面文件同名的脚本文件中。与现有技术相比,本方法充分利用了 Lua小巧强大的特点,有效提高动画执行效率,以及利用其它脚本语言进行二次开发所带来的成本和维护问题。
具体实施例方式具体的实施可以采用Lua的C++扩展版本LuaPlus,LuaPlus也是开源的脚本语言。所述的SCADA系统是通过C++编写的,由于LuaPlus可以与C++语言无缝集成,LuaPlus 可以很好的集成到C++编写的SCADA系统中。定时器设置的时间间隔只要能保证所产生画面的变化在肉眼看起来连续流畅就可以,可以设定30ms至67ms的时间间隔,最好为55ms, 也就是每秒30帧到每秒15帧。本实施例采用55ms的时间间隔,也就是大约每秒18帧的动画。首先,需要SCADA系统和Lua脚本语言之间创建共享库。共享库包括常量,变量等参数以及函数。变量包括系统变量和用户自定义变量,系统变量如系统时间、登陆用户等;另外用户可以根据现场需求自定义变量。函数主要是是图像处理函数,图像处理函数在 SCADA系统中分成画面处理函数和图形处理函数,画面处理函数的操作对象是画面,如设置画面图层显隐、画面背景变化等函数;图形处理函数的操作对象是图形,如图形旋转、移动、 缩放等函数。这个共享库需要在Lua引擎和C++编写的SCADA系统都能共同访问。在SCADA 系统中,存在两种操作图像的操作对象,一种是SCADA系统的整体画面或者背景画面,一种 SCADA系统上表示的图形或图元对象。这决定了对画面和图形的操作需要单独使用自己的脚本。在SCADA系统的画面和图形对象上编写各自独立脚本,需要在SCADA图形系统开发环境或装置中设定。同时为了能使编写的Lua脚本正确无误,符合Lua语法规范,正确引用共享库的参数和函数,编写Lua脚本可以在图形系统开发环境中实现。在设置画面和图形对象的各自脚本或者在保存时还要对这些脚本进行解析预编译。为了正常的解析和预编译, 共享库的参数和函数同样需要载入到SCADA图形系统的开发环境中。具体的创建共享库需要包括以下步骤
1、在SCADA图形系统中定义公开到Lua引擎中的变量和动画函数;
2、接着在SCADA图形系统中创建Lua引擎;
3、然后将定义的变量和动画函数注册到Lua引擎中,供编写脚本以及执行脚本时Lua 引擎识别并调用。下面是一段示例代码,用来表示这个过程 int grnHour ;
bool Rotate(int nobjID,int ndx, int ndy, float fArg)
{
pObj = GetObjPtrFromID(nobjID);if (pObj == NULL) return false; pObj->SetRotateOrg(ndx, ndy); pObj->SetRotateAngle(fArg); return true;
ι
lua_State *g_Lua = luaL_newstate(); LuaState* castedState = LuaState::CastState(g_Lua); LuaStateOwner g_luaplus(castedState); g_luaplus->GetGlobals(). SetInteger(〃grnHour〃,grnHour);
g_luaplus->GetGlobals(). RegisterDirect("Rotate 〃,Rotate);
上述代码中,grnHour和Rotate分别是公开到Lua引擎中的变量和函数,grnHour是当前系统小时数,Rotate函数实现了编号为nobjID的图形对象pObj围绕点(ndX,ndy) 旋转 fArg 的动画。lua_State *g_Lua = luaL_newstate ()仓ij 建的是 Lua 弓| 擎指 ft", LuaStateOwner g_luaplus (castedState)仓1J 1 LuaPlus 才旨 ff"。 SetInteger 禾口 RegisterDirect分别将变量grnHour和Rotate注册到Lua引擎中。经过这样注册后,Lua 引擎就能识别变量grnHour和Rotate函数,图形开发环境的Lua脚本解析器能够判断变量 grnHour和Rotate函数。Lua引擎执行脚本中的Rotate函数时就会执行共享库中的Rotate 函数,对grnHour变量操作时就会对共享库中的grnHour操作。 下述示例代码给出设置定时器以及按照定时器设定的时间间隔运行脚本的过程
SetTimer (ACTI0N_TIMER, 55, NULL);
Short DoGraphScriptAction()
{
if (TimeCount%(m_nScriptRunMilsec/55) ==0) {
if (g_luaplus->DoString(m—chScript) !=0) return -1;
if (g_luaplus->DoFile ( “画面 1. tsscript,,)!=0) return -1;
ι
While(pObj)
{
if (TimeCount%(pObj->m_nScriptRunMilsec/55)==0) {
if (g_luaplus->DoString(p0bj->m—chScript)!=0)return -1;
}
}
return 1;
ι
SetTimer (ACTI0N_TIMER, 55,NULL)定义一个 55ms 定时器,时间到达时 TimeCount+1。 TimeCount%(m_nScriptRunMilsec/55)用于判断画面脚本执行时间是否到达,如果到达执行画面脚本;接着遍历所有图形对象,判断每个图形对象是否到达运行时间, TimeCount%(pObj->m_nScriptRunMil sec/55)用于判断图形脚本执行是否到达,如果到达执行该图形对象的脚本,m_nScriptRunMilsec为脚本执行周期,取值范围>=55。下述的脚本1和脚本2分别是一段画面脚本和一段图形对象脚本的例子。脚本1 是画面脚本示例,实现了当系统时间为偶数整点小时,图层1图形全部显示,画面背景颜色调整为蓝色;否则显示图层2图形全部显示,画面背景颜色调整为黑色。脚本2展示了一份图形动画脚本实例,实现了当系统时间为偶数小时时,编号为1的图形围绕点(10,10)旋转30度。脚本1:
if(math, mod(grnHour, 2)==0&&grnMin==0&&grnSec==0) then
SetLayerVisible (1, 1); SetPaperColor(O, 0,255); else
SetLayerVisible (2, 1); SetPaperColor(O, 0,0); End
脚本2:
if (math, mod (grnHour, 2) ==0) then Rotated, 10,10,30); end
权利要求
1.一种Lua脚本在SCADA系统中实现动画的方法,其特征在于所述的SCADA系统包含设置了一定时间间隔的定时装置,所述方法包括以下步骤步骤10 在SCADA系统和Lua引擎之间构建共享库,所述共享库包括参数、函数,所述函数包括图像操作函数;步骤11 编写Lua脚本,所述脚本包含步骤10中所述的图像操作函数;步骤12 =SCADA系统运行时加载Lua引擎和Lua脚本,Lua引擎载入步骤10的共享库和Lua脚本;步骤13 =Lua引擎按定时装置设定的时间间隔执行Lua脚本。
2.根据权利要求1所述的Lua脚本在SCADA系统中实现动画的方法,其特征在于所述的时间间隔是30-67ms。
3.根据权利要求1所述的Lua脚本在SCADA系统中实现动画的方法,其特征在于所述的时间间隔是阳!!^。
4.根据权利要求1至3中任一项所述的的Lua脚本在SCADA系统中实现动画的方法, 其特征在于所述Lua脚本分画面脚本和图形脚本,每种图形对象对应一个图形脚本,所述步骤13的执行脚本过程首先执行画面脚本然后执行各个图形脚本。
5.根据权利要求4所述的Lua脚本在SCADA系统中实现动画的方法,其特征在于还包括图形系统开发装置,所述的图形系统开发装置载入Lua引擎、载入所述步骤10的共享库、编写步骤11的Lua脚本,编写后的脚本经图形系统开发装置的解析无错误后保存,解析错误的无法保存。
6.根据权利要求5所述的Lua脚本在SCADA系统中实现动画的方法,其特征在于所述的画面脚本保存在画面文件的画面参数中,所述的图形脚本保存在画面文件的图形参数中。
7.根据权利要求5所述的Lua脚本在SCADA系统中实现动画的方法,其特征在于所述的画面脚本和图形脚本都保存在画面文件同名的脚本文件中。
全文摘要
本发明公开了一种使用Lua脚本实现SCADA系统动画的方法。本发明在SCADA系统和Lua引擎之间构建用于两者之间交互的共享库,共享库包括参数和图像操作函数;在SCADA系统中设置定时器,并通过按定时器设定的时间间隔执行Lua脚本,Lua脚本通过调用共享库的图像操作函数实现对SCADA系统画面的操作,进而使SCADA系统画面按定时器的时间间隔产生连续变化动画效果。本发明充分利用了Lua小巧功能强大和与C++无缝集成的特点,在SCADA系统中产生流畅的动画效果的同时能缩短开发周期,减少开发成本。
文档编号G06F9/44GK102567014SQ201110358150
公开日2012年7月11日 申请日期2011年11月14日 优先权日2011年11月14日
发明者杨毅, 王翠红 申请人:南京天溯自动化控制系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1