APP下载

CFC功能块开发中指针应用研究

2016-05-05曹忠华刘洋李志锋秦大伟张岩鞍钢集团钢铁研究院辽宁鞍山4009鞍钢建设集团有限公司机电安装工程分公司辽宁鞍山400

鞍钢技术 2016年2期
关键词:指针C语言

曹忠华,刘洋,李志锋,秦大伟,张岩(.鞍钢集团钢铁研究院,辽宁鞍山4009;.鞍钢建设集团有限公司机电安装工程分公司,辽宁鞍山400)



CFC功能块开发中指针应用研究

曹忠华1,刘洋2,李志锋1,秦大伟1,张岩1
(1.鞍钢集团钢铁研究院,辽宁鞍山114009;2.鞍钢建设集团有限公司机电安装工程分公司,辽宁鞍山114010)

摘要:针对西门子控制器在工业控制领域的广泛应用,阐述如何采用C语言的方法编程实现CFC功能块。分析了CFC功能块的基本结构,同时给出了CFC功能块如何基于C语言的代码实现向量数据的指针方式传递,对基于C语言的功能块的生成过程进行了分析。研究表明,灵活运用C语言的指针功能可以开发出满足向量运算所需的CFC功能块。

关键词:C语言;指针;SIMATIC TDC;CFC功能块

曹忠华,信息系统项目管理师,2004年毕业于吉林大学通信工程学院自动化专业。E-mail:bigczh@139.com

西门子公司的SIMATIC TDC是一种多处理器自动化系统,擅长解决处理复杂的控制、通讯和驱动任务,它采用自由组态、模块化的设计思想,通过多处理器并行运行方式可以实现性能的近乎无限扩展。作为西门子公司功能最强大的控制器,TDC采用实时操作系统(固定时隙为25μs),拥有高速的采样频率和强大的数据循环处理能力,近年来在钢铁、航空航天、电力、交通、印刷、有色金属制造、造纸等行业都取得了杰出业绩。鞍钢自2003年冷轧硅钢生产线投产以来,已有多条冷轧生产线使用了TDC系统。目前鞍钢冷轧1号线也正在进行电控系统向TDC系统转化的改造,在改造过程中需要实现TDC自动化系统的自主编程。

本文对CFC编程方式进行了介绍,分析了CFC功能块的结构,就如何利用C语言的指针功能开发满足向量传递和运算的CFC功能块进行了详细的阐述。

1 CFC编程方式介绍

TDC编程使用CFC编程方式。CFC(Continuous Function Chart)是一种开放的编程平台,它将详细的程序算法进行封装,预制成标准功能块(CFC block)。在功能块中只留有少量的输入/输出引脚作为程序间的接口。相同类型的功能块集合为库,用户可以根据编程需要将其导入安装至编程环境,用户程序由这些标准功能块连接组合。系统集成了广泛的预制的功能块库,提供了包括闭环控制、算术运算、数据类型转换、逻辑功能、服务与诊断、通讯功能、顺序控制、特殊功能等类型的约330多个经过验证的标准功能块[1]。

与普通的梯形图或语句表语言编程方式相比,CFC图形化编程和标准程序块库的使用意味着编程人员无需复杂的专业编程知识。同时,CFC提供了功能强大的在线功能,可在线优化、插入、修改和删除功能块,显著缩短调试时间。因此,工艺技术人员可以快速灵活的完成程序的设计、修改和调试。

CFC功能块在程序中可多次自由调用,图形化连接,每个功能块都可赋值5种循环周期中的一种。功能块还可放置在特定的运行时间组中,在指定运行条件下同时运行或停止。另外,CFC还允许用户通过以下3种方式创建完成特定功能的自定义功能块:

(1)Chart in Chart(程序嵌套)功能,使用标准功能块完成特定功能,并将相关的CFC程序封装作为子程序调用。

(2)Compile Chart as Block Type同样使用标准功能块完成特定功能,并将相关的详细算法步骤隐藏封装编译成标准功能块的样式,供程序调用。

(3)使用Function Block generator(下文称为D7-FB-GEN),通过标准ANSI-C语言创建用户专用功能块,以保护用户的专有技术。这种方式可以完成复杂的程序算法,并且可以处理硬件相关的数据和功能。

2 CFC功能块结构

利用FB generator通过C语言创建用户专用功能块时,须严格遵守西门子定义的结构和语法。CFC功能块(FB)从定义文件生成。这些定义文件通过SIMATIC D7功能块生成器转换成目标码和说明。每一个CFC功能块FB都通过下面3个文件定义:

.dat:功能块的I/O输入输出和CFC信息定义模块

.c:功能块运行源码模块(C语言编写)。

.bmp:功能块图形模块。

2.1输入输出和信息定义模块

在CFC编程平台中,功能块显示为一个具有少量输入输出管脚的块状视图,功能块之间的数据交换以管脚间的连线表示。这些管脚都具有自己的数据类型、管脚名称、管脚注释等,功能块本身也具有一定的特殊属性。DAT文件就是功能块结构中用来定义输入输出管脚和功能块自身信息属性的模块。在开发CFC功能块时,需严格按照特定的特殊规则来完成功能块的属相设置和输入输出定义。在DAT文件中可以定义功能块的名称、功能块注释说明、是否可以在线插入、是否可以配置在中断任务中;同时还可以定义输入输出管脚的名称、数据类型、管脚默认初始值、管脚注释说明、管脚是否可以被连接、管脚是否可以被监视和修改等。

2.2源码模块

CFC功能块都是按照功能或者算法定义的,每一个功能块都位于某一个特定的循环周期之中,每个周期功能块实现一些特定的算法或逻辑判断操作。这些算法或逻辑判断运行代码都位于.c文件中,由C语言格式编写而成。这些代码包括由操作系统直接调用的主函数(NRM)、初始化函数(INI)以及由这两个函数直接或间接调用的其他辅助函数。功能块初始化函数(INI)在系统复位后或功能块的第一次加载时执行一次,完成功能块管脚的初始化工作和内部变量的内存分配等工作。功能块的主函数(NRM)每个运行周期执行一次,完成特定的算法和逻辑判断等功能。辅助函数使用时必须在程序开始处声明函数原型及参数,而函数体放在主函数之后。在调用外部函数前,必须使用#include指令,在源码模块中包含有外部函数的原形定义的头文件。辅助函数和外部函数的调用通常在都位于主函数(NRM)中。辅助函数和外部函数的使用有利于系统的维护以及源文件的可重复利用。

2.3图形模块

在CFC编程时,功能块显示为一个具有若干个不同功能管脚的块状视图,但进行功能块编程时无需关注。

3 CFC功能块的实现和指针应用

使用D7-FB-GEN创建CFC功能块时,首先需要建立一个项目,项目名称最长不超过50个字符。每一个项目下可以创建多个库,每个库又可以包含多个功能块。库的名称前3个字符必须为FBA,余下3个字符可自定义;功能块的名称最多由6个字符构成。每个库和项目每次编译前可设置版本号,以便在导入到CFC编程平台时方便地区别新的版本。

在创建CFC功能块时,根据功能设计需求,可以选择使用简单模板或复杂模板,编程环境会自动创建前文所描述的3个文件。相对于简单模板,复杂模板提供了功能块初始化函数(INI),并演示了如何在程序中使用结构变量和指针,并演示了如何在初始化函数中完成内存的分配。通过简单模板和复杂模板,工艺技术人员可以很方便地完成功能块的编制工作。

在现代控制领域中,向量的运算随处可见,比如在板形闭环控制算法和边缘降控制算法中,更是离不开向量计算。而在西门子的模板和帮助文件中并没有明确的展示如何进行向量的数据传递。下面以两个简单的块来说明如何利用指针进行向量的发送和接收。

3.1功能说明和I/O管脚的定义

向量发送功能块(S2V1)将输入的8个float型数据整合成一个向量,并将指向该向量的指针通过输出管脚传送给下一个功能块使用。根据功能需求的信息,设计该功能块具有8个输入管脚(X1~X8:REAL)和2个输出管脚(VY:DWORD、QTS:BOOL),如图1所示。由于发送向量需要在内存中开辟专用的内存空间,因此还定义了一个内部变量(PTR:DINT)用于保存该内存空间的指针。

向量接收功能块(V2S4)根据接收到的向量指针,将该向量复制到自己的内存空间中,并根据另一个输入管脚决定输出该向量中的哪4个元素。根据功能需求的信息,设计该功能块具有2个输入管脚(VX:DWORD、FE:INT)和5个输出管脚(Y01~Y01:REAL、QTS:BOOL),如图2所示。以及用于保存向量数据而开辟的内存空间指针的内部变量(PTR:DINT)。

图1 S2V1功能块

图2 V2S4功能块

3.2功能模块的实现

向量发送和接收功能块有一个共同点,就是都需要开辟内存空间用来存储向量数据,这个动作一般来说都在功能块初始化函数(INI)中实现。在向量发送和接收功能块的初始化函数中,利用malloc函数申请了内存空间,若申请失败则将输出管脚QTS置位报警,若申请成功则将指向该内存空间的指针保存在了内部变量PTR中。

INI()

{float*pointer;

pointer=(float*)malloc(sizeof(float)*8);

if(pointer==NIL)SET_B1_LOG1(QTS);

else{SET_B1_LOG0(QTS);

PTR=(u_int32)pointer;}}在向量发送功能块中,直接将输入管脚X1~ X8的值依次存入PTR指向的内存空间,最后将该内存空间的指针转化为无符号32位整型数据格式赋值给输出管脚VY,完成了向量指针的传递工作。

NRM()

{float*ptr_data;

if(IS_B1_LOG1(QTS));

else{ptr_data=(float*)PTR;

*(ptr_data)=X1;

*(ptr_data+1)=X2;省略若干行

*(ptr_data+7)=X8;

VY=(int32*)ptr_data;}}

在向量接收功能块中,将输入管脚VX强制类型转换为指针,通过C语言中的内存拷贝函数将VX所指向的内存空间复制到PTR指向的内存空间,最后根据输入管脚PE决定将哪4个向量元素赋值给Y01~Y04,从而完成向量元素的分解工作。

NRM()

{float*ptr_data;

if(IS_B1_LOG1(QTS));

else{ptr_data=(float*)PTR;

memcpy(ptr_data,(float*)VX,sizeof(float)*8);

Y01=*(ptr_data+FE);

Y02=*(ptr_data+FE+1);

Y03=*(ptr_data+FE+2);

Y04=*(ptr_data+FE+3);}}

3.3功能块的编译与导入

DAT文件和源码文件编写完成后,功能块并不能被工程项目直接引用。D7-FB-GEN首先必须将相应的文件转换成可编译或可引用的文件。输入输出和信息定义模块与图形模块集合在一起,转换成MASK文件(以msk为后缀名的文件)。每个功能块的源码文件都被编译成一个对象目标文件(以o为后缀名的文件),再将每个库里面的个对象目标文件打包成可以使用的库文件(以a为后缀名的文件)[2]。库文件与MASK文件一起组成了可被引用的模块集合,D7-FB-GEN在编译完成后自动将其复制安装到CFC编程平台下。在CFC编程控制平台下,通过Options-> Block Types命令可以打开库导入对话框,在此可以将编译完成的功能块库导入或更新到项目编程环境中。

向量发送功能块(S2V1)与向量接收功能块(V2S4)仅仅是一个简单的试例程序,完成的功能并不复杂,但成功的实现了向量数据的指针方式传递。这两个功能块在实际编程过程中可以根据实际需要安排在合适的系统循环周期内进行调用,其在实际运行中的状态如图3所示。

图3 运行中的S2V1与V2S4功能块

4 结论

CFC编程平台界面友好、调试方便,与使用CFC标准功能块相比,使用C语言创建自定义功能块的方法可以更加灵活的实现更为复杂的功能,同时灵活使用C语言的指针功能还可以完成硬件地址操作和向量传递运算等诸多高级功能。随着西门子TDC控制器在工业控制领域的使用范围越来越广泛,开发适合项目需求的特定功能块完善程序功能显得越来越重要。

参考文献

[1]鲍伯祥,陆章杰,王世宁.西门子TDC编程及应用指南[M].北京:北京航空航天大学出版社,2007.

[2]郑家玲,周泽雁,徐士浩,等.基于C语言的SIMATIC TDC功能块的研究开发[J].宝钢技术,2009(1):35-38.

(编辑袁晓青)

修回日期:2015-05-07

Research on App lication of Pointers for CFC Function Blocks during Development

Cao Zhonghua1,Liu Yang2,Li Zhifeng1,Qin Dawei1,Zhang Yan1
(1.Iron&Steel Research Institutes of Ansteel Group Corporation,Anshan 114009,Liaoning, China;2.Electromechanical Installation Engineering Branch of Angang Construction Group Co.,Ltd.,Anshan 114010,Liaoning,China)

Abstract:In view of the facts that Siemens controllers are widely used in the industrial control field,itwas discussed how the CFC function blocks can be established by using C language for programming.And the basic structures of the CFC function blocks was analyzed while it was simultaneously explained how the codes based on the C language are transmitted to the pointers with quantity data by application of the CFC function blocks and subsequently the formation process of the function blocks based on C language was analyzed.Analytical results show that the CFC function blocks demanded in vector operations can be developed by the flexible application of the pointing function of C language.

Key words:C language;pointer;SIMATIC TDC;CFC function block

中图分类号:TG232

文献标识码:A

文章编号:1006-4613(2016)02-0045-04

猜你喜欢

指针C语言
垂悬指针检测与防御方法*
基于Visual Studio Code的C语言程序设计实践教学探索
51单片机C语言入门方法
郊游
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
为什么表的指针都按照顺时针方向转动
辨析指针数组与数组指针
浅谈基于C语言的计算机软件程序设计
高职高专院校C语言程序设计教学改革探索