最新新闻
我要投稿
联系电话:027-87592219/20/21转188
投稿邮箱:tb@e-works.net.cn
您所在的位置:首页 > 智库 > 智能生产

基于线程局部存储技术的多通道数控系统仿真

发布时间:2014-07-10 作者:王晓宇 陈吉红 唐小琦  来源:万方数据
在多实例多线程情况下,ActiveX 组件的不同实例共享同一全局数据缓冲区,在改造集成面向过程开发的传统代码时必须修改代码以消除全部全局变量.针对该情况,使用线程局部存储技术实现全局变量的局部化,采用具有大量全局变量的实体仿真代码实现ActiveX封装。该技术已成功应用于基于工业以太网的多通道数控系统中。

3 应用实例

  一种基于Z-Buffer 的铣削实体加工仿真算法,华中数控HNC-32 数控系统HMI 的仿真系统继承自该代码,其主要结构如下:

 代码

  可见,显示缓存等核心数据结构设计为全局变量,但HNC-32 的设计目标是多通道数控系统,每个通道都需要一个实体加工仿真组件的实例,由于全局缓存数据为所有实例共享,因此出现的所有通道显示内容将完全一致,无法实现多通道仿真。为简化改造工作,将原系统中约50 多个全局变量合并为一个结构,并将原全局变量作为其成员,即一个大的结构变量包括了50 个原全局变量。

  按照 TLS 要求该结构变量必须动态创建,如下代码表明了它的声明、创建过程,代码还表明每个ActiveX 组件构造时即调用API 函数TlsAlloc 获得一个线程索引,在局部堆申请到存储空间后用API 函数TlsSetValue 将该存储区地址与线程索引对应。

程序
程序

  在其他函数中,可以通过线程索dwTlsIndex 调用API函数TlsGetValue 引访问到上述大结构变量,进而访问到原全局变量,代码如下:

  //被OpenPatg->hFile 调用读刀位文件并显示刀位轨迹

  int CSimuCtrlBCtrl : ShowPath(FILE *fp){

  GlobalValues *g=(GlobalValues *)TlsGetValue(dwTlsIndex);

  g->CtrlObj->GetClientRect(&rt);...

  应用实例界面如图 2 所示。

应用实例界面

图2 应用实例界面

  在 TLS 改造后,每个ActiveX 实例均有单独的、与线程索引对应的局部堆全局变量,各个通道运行不同的代码程序并在各自通道的实体仿真上显示各自的运行结果,实现了多通道的独立执行。

4 结束语

  基于组件的应用软件结构具有先进性,但在多实例条件下必须实现各实例全局数据的独立性,线程局部存储技术是最佳解决方案。在解决传统非面向对象开发的代码改造问题时,本文提出的改造方式具有对原有代码改动少、逻辑关系清楚等优点。在华中数控基于工业以太网现场总线的新一代多通道HNC-32 数控系统中的成功应用表明了该方法具有实用性。

2
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。