功能块
功能块(function block)是IEC61499 标准中最重要的概念之一。不过功能块的概念并不是该标准所特有的。在符合IEC61131-3 标准的PLC 中就定义了功能块编程。功能块图(FBD) 本质上是一种图形化程序设计方法。在NI 的Labview,IBM 的NodeRED,MIT 的Scratch 中都采用了类似功能块网络的编程方式。功能块是一段标准的软件,它们的引线是输入数据或者输出数据。网络图的连线表示了个功能块之间数据引用的方式。它们之间的区别是功能块网络的执行方式。大致分为两种:
1 时间触发方式。
周期性地从上之下,从左到右地顺序执行功能块。后面的功能块会直接应用前面功能块产生的输出数据,如果网络图中有反馈或者循环,那么后面功能块反馈到前面功能输入端的数据将在下一个周期被应用。IEC61131 的PLC功能块就是采用的时间触发方式。
2 数据流执行方式
所谓数据流程序设计是指功能块的所有数据到达时,功能块将会被执行。具体实现时,功能块要记录所有引脚的更新状态。当一个功能块的所有数据更新时执行该功能块内部的算法并且更新输出数据。执行程序要不断地扫描所有功能块的输入数据状态,直到网络中没有输入端都发生改变的功能块。也就是说,没有可以进一步执行的功能块,网络中输入输出数据处于暂时“稳定”的状态。直到外部有新的数据输入(比如有按键输入,网络接口收到新的数据),将打破暂时的稳定。开始计算相关的功能块。达到新的稳定状态。这是我们曾经设计的一种数据流计算模型的方法。
不过,实际应用中,情况要复杂的多,有的功能块只要一个输入数据发生变化,就需要执行相应的算法。虽然我们在设计功能块和执行循环时可以处理这样的功能块。但是用户使用这样的功能块时,容易产生歧义而混淆。存在不确定性。特别是涉及到分布式系统中的网络传输时,情况变得更加复杂
3 具有事件输入输出的功能块
这是IEC61499 功能块采取的方式。该标准在功能块中增加了事件输入输出端。事件用来确定功能块的状态变化,只要当输入事件到达时,才会改变功能块的状态,确定如何执行内部的算法。事件能够更明确地描述功能块之间数据和内部算法执行的同步关系。打个比喻,事件就好比数字电路中的时钟信号。集成电路依据时钟输入来同步数据和内部算法。所有的集成电路通过时钟电路实现同步。事实上,在具体实践中,事件是一个0~n 变化的整型数。一个数字对应一个“脉冲“。事件功能块网络比普通数据流网络更加明确和容易理解。
IEC61499 功能块模型
该标准的核心是功能块(function block)模型。它构成了完整的IEC61499 架构。功能块可以描述成为“软件的功能模块“。它具有自己的数据结构,并且由一个或者多个算法来处理它们。功能块类型(function block type)提供了数据结构和算法的形式化描述。功能块可以有多个实例(instance)。从形式上看,功能块和C++中的对象非常类似。在工业实践中,也经常使用功能块的概念,例如在许多PLC 和工业控制器中就有PID 功能块。许多厂商提供一个PID 功能块定义。程序员可以在控制算法中使用多个PID的实例,比如称为“Loop1”和“Loop2”,它们相互之间是独立的。每个PID 实例都有它们自己的参数和内部状态变量。也共享相同的更新算法。
功能块又和面向对象程序设计中的类(class)和对象(object)十分相似。功能块类型就是一个类。它包含了输入输出参数,内部的函数相当于功能块的内部算法,功能块的实例就是对象。
对于硬件工程师而言,功能块比作集成电路,对软件工程师而言,功能块比做类和对象。这样是否要好理解一点。
功能块的一般特性
IEC61499 定义了若干形式的功能块。,我们会来详细地了解它们。IEC61499 功能块的主要特征总结如下:
每个功能块有一个类型名称和一个实例名称。它们在功能块图形化描述时,会显示出来。
每一个功能块都能有事件输入。它们能够接收其它功能块通过事件连接传递的事件。
每个功能块都能有事件输出。它们向其它功能块传递事件。
每个功能块会有数据输入,传递给它其它功能块内部产生的数据。
每个功能块会有数据输出,将该功能块内部产生的数据传递该其它功能块。
事件可以使用”WITH“修饰词与数据关联。在图形表示中,将事件和相关联的数据连接线交叉点画一个小方块。对于输入和输出的含义如下:
-当一个事件发生时,它关联的数据更新。其它输入变量保持它们的值(也就是说,没有变化)
-当输出事件触发时,关联数据输出有效,而其它数据没有发生变化。
IEC61131-3的数据类型用作变量的数据类型(见附录A 可用数据类型)
功能块封装功能,它们具有内部变量。功能的形式和类型由功能块类型决定。
IEC61499不允许由全局变量
从上面的描述我们可用看出,IEC61499 功能块的所有操作都是通过事件来同步的。在事件到来之前,相关连的数据已经出现在它们的输入端。功能块的内部程序分成两个部分,一个是执行控制程序段,它根据输入事件来决定算法的执行,另一部分是算法。算法中会使用到输入数据,并且会产生输出数据 。当内部算法执行完成之后,执行控制程序段将更加内部的状态图确定输出事件。
功能块的行为和集成电路非常相似,比如一个D触发器,数据首先呈现在D 输入端,然后产生时钟的上升沿将数据置入触发器,Q 端输出 D 触发器新的状态值。时钟的上升沿就类似功能块的事件输入。数据输入是于时钟关联的。对比集成电路的时钟电路有助于我们理解IEC61499 功能块的操作方式。
功能块的执行模型
如下图所示,基本功能块的算法是由功能块对象中的执行控制程序段响应输入事件时调用的。一旦算法执行完成,执行控制程序在事件输出端产生事件。
t1-相应的输入数据变量值可用
t2-在事件输入端发生事件
t3-执行控制功能,通知资源调度功能调度一个算法执行。
t4-算法执行开始。
t5 –算法输出值。
t6 资源调度功能通知算法执行结束。
t7-调度功能调用执行控制功能。
t8-执行控制功能在事件输出端输出事件。
一些时间关系
初始化时间 Tsetup=t2-t1
启动时间 Tstart=t4-t2
算法时间Talg=t6-t4
完成时间 Tfinish=t8-t6
功能块类型
IEC61499 标准中,定义了三种功能块:
基本功能块类型(Basic function block)
复合功能块类型(Composite function block)
服务接口功能块类型(Service interface function block types)
功能块库
任何一个基于图形的程序设计方式,能够在实际应用中使用的一个关键因素是它是否具有足够的功能块库,满足设计各种应用程序的需要。IEC61499 标准文档中只是在附录A 中描述了一小部分的事件功能块。而像eclipse 4DIAC 这样的开发项目也只是提供了少量的功能块库,它们包括:
4diac IDE 中提供了下列功能块库
转换(convert)
设备(device)
事件events
IEC61131-3
输入输出io
数学运算(math)
网络net
重配置(reconfiguration)
资源(resource)
实时事件rtevents
分段Segments
辅助(utils)
许多的目录下的功能块数量也很少。依靠这些功能库,编写不出实际的应用程序。要使得IEC61499 标准付诸实际应用,需要开发更多的功能块库,这些功能块库分成两类:
通用的功能块库
开发自动控制应用中常用的功能块库。这方面可以参考NI 的labVIEW ,它是为软件仪器开发的系统,针对各种仪表测量应用,NI 提供大量的功能对象,在LabVIEW 中称为功能调色板(functions palette)。小到加减法,大到数字信号处理对象。通过长期的积累,LabVIEW 的对象库非常丰富,使用这些对象节点,能够编写出各种测量方面应用程序。
通用地,IEC61499 标准要面向实际的应用,也必须开发丰富的功能块图,个人觉得,至少需要增加如下的库
1 通用的数字逻辑库
-AND,OR,INV ,XOR 等基本的逻辑运算
-译码器
-解码器
-各种计数器
-移位寄存器
-数值比较器
可以参照某些74系列集成电路来实现
2 常用的数学运算库
-三角函数 SIN,COS,。.
3 基本的控制算法
-PID 算法
4 数字信号处理库。
-常用的数字滤波算法
-FFT 变换
5 基本的执行部件控制库
-步进电机控制
-直流电机控制
-伺服电机驱动
-硬件接口驱动(GPIO,ADC 采样)
6 与上位机网络通信的库
-数据库读写库
-UI 功能块库
-MQTT 协议库
我个人的看法,IEC61499 功能块库,不适合像LabVIEW 分的那么细,甚至还支持循环,IF-THEN-ELSE 结构化控制功能块。因为那么做的话,功能块网络变成了以图形化编程为目标了。这样会导致功能块网络过于复杂,而且运行效率不高。IEC61499 功能块应该提供完整单一的功能。而不提供程序设计的基本语句控制元素(比如IF-THEN-ELSE,SWITCH)。基本的语句在功能块内部使用动态语句实现,例如java 或者Lua 语言实现。
面向应用的功能块库
开发通用功能块库是非常困难的,毕竟工业控制应用五花八门,种类繁多。即使你准备了足够的通用功能块库,到编写程序时还会发现少了那么几个。针对具体的行业应用开发功能块库是一个好主意。例如:
建筑自动化功能块库
智能电网功能块库
分布式数字控制
建立功能块类型
从上面的描述我们可见,开发功能块库是IEC61499 标准走向实用的关键。各种IEC61499 开发环境都支持功能块库的开发。在算法部分可以使用java,lua 这样的解释性语言,也可以使用C,C++,Structure Text 这样的编译型语言在4DIAC的IDE 中称为建立功能块类型。可以使用C++,ST和Lua 语言开发功能块类型
动态功能块类型
当使用编译型语言时,建立的功能块类型最终要export 出来,和运行时一起编译。这对于应用程序工程师来讲,是比较麻烦的过程。在4DIAC 中具有一种称为“动态类型装入”的特性,使用这种方式,新的功能块不需要编译就可以直接部署和测试。可以下载lua 代码到运行时Forte 中,而Forte 内部含有一个Lua 解释器解释Lua 代码。
小结
功能块是工业控制应用中常用的一种基于图形的编程方法,和其它项目中的功能块不同,IEC61499 功能块之间的执行控制是通过事件和内部的事件状态图同步实现的,它更加地明确。
IEC61499 标准和开发工具提供的功能库是不够的,无法满足实际应用的需要,必须开发丰富的功能库,面向特定的应用领域开发功能块库是一个行之有效的方法。
使用C 和ST 语言编写的功能块库需要和运行时一起重新编译,而4DIAC 同样提供了“动态功能块装入”的性能,用户可以使用Lua 语言编写动态功能块类型的算法,无需编译直接下载到Forte 运行。在Forte内部保留了一个LuaJIT 即时解释器。
功能块
功能块(function block)是IEC61499 标准中最重要的概念之一。不过功能块的概念并不是该标准所特有的。在符合IEC61131-3 标准的PLC 中就定义了功能块编程。功能块图(FBD) 本质上是一种图形化程序设计方法。在NI 的Labview,IBM 的NodeRED,MIT 的Scratch 中都采用了类似功能块网络的编程方式。功能块是一段标准的软件,它们的引线是输入数据或者输出数据。网络图的连线表示了个功能块之间数据引用的方式。它们之间的区别是功能块网络的执行方式。大致分为两种:
1 时间触发方式。
周期性地从上之下,从左到右地顺序执行功能块。后面的功能块会直接应用前面功能块产生的输出数据,如果网络图中有反馈或者循环,那么后面功能块反馈到前面功能输入端的数据将在下一个周期被应用。IEC61131 的PLC功能块就是采用的时间触发方式。
2 数据流执行方式
所谓数据流程序设计是指功能块的所有数据到达时,功能块将会被执行。具体实现时,功能块要记录所有引脚的更新状态。当一个功能块的所有数据更新时执行该功能块内部的算法并且更新输出数据。执行程序要不断地扫描所有功能块的输入数据状态,直到网络中没有输入端都发生改变的功能块。也就是说,没有可以进一步执行的功能块,网络中输入输出数据处于暂时“稳定”的状态。直到外部有新的数据输入(比如有按键输入,网络接口收到新的数据),将打破暂时的稳定。开始计算相关的功能块。达到新的稳定状态。这是我们曾经设计的一种数据流计算模型的方法。
不过,实际应用中,情况要复杂的多,有的功能块只要一个输入数据发生变化,就需要执行相应的算法。虽然我们在设计功能块和执行循环时可以处理这样的功能块。但是用户使用这样的功能块时,容易产生歧义而混淆。存在不确定性。特别是涉及到分布式系统中的网络传输时,情况变得更加复杂
3 具有事件输入输出的功能块
这是IEC61499 功能块采取的方式。该标准在功能块中增加了事件输入输出端。事件用来确定功能块的状态变化,只要当输入事件到达时,才会改变功能块的状态,确定如何执行内部的算法。事件能够更明确地描述功能块之间数据和内部算法执行的同步关系。打个比喻,事件就好比数字电路中的时钟信号。集成电路依据时钟输入来同步数据和内部算法。所有的集成电路通过时钟电路实现同步。事实上,在具体实践中,事件是一个0~n 变化的整型数。一个数字对应一个“脉冲“。事件功能块网络比普通数据流网络更加明确和容易理解。
IEC61499 功能块模型
该标准的核心是功能块(function block)模型。它构成了完整的IEC61499 架构。功能块可以描述成为“软件的功能模块“。它具有自己的数据结构,并且由一个或者多个算法来处理它们。功能块类型(function block type)提供了数据结构和算法的形式化描述。功能块可以有多个实例(instance)。从形式上看,功能块和C++中的对象非常类似。在工业实践中,也经常使用功能块的概念,例如在许多PLC 和工业控制器中就有PID 功能块。许多厂商提供一个PID 功能块定义。程序员可以在控制算法中使用多个PID的实例,比如称为“Loop1”和“Loop2”,它们相互之间是独立的。每个PID 实例都有它们自己的参数和内部状态变量。也共享相同的更新算法。
功能块又和面向对象程序设计中的类(class)和对象(object)十分相似。功能块类型就是一个类。它包含了输入输出参数,内部的函数相当于功能块的内部算法,功能块的实例就是对象。
对于硬件工程师而言,功能块比作集成电路,对软件工程师而言,功能块比做类和对象。这样是否要好理解一点。
功能块的一般特性
IEC61499 定义了若干形式的功能块。,我们会来详细地了解它们。IEC61499 功能块的主要特征总结如下:
每个功能块有一个类型名称和一个实例名称。它们在功能块图形化描述时,会显示出来。
每一个功能块都能有事件输入。它们能够接收其它功能块通过事件连接传递的事件。
每个功能块都能有事件输出。它们向其它功能块传递事件。
每个功能块会有数据输入,传递给它其它功能块内部产生的数据。
每个功能块会有数据输出,将该功能块内部产生的数据传递该其它功能块。
事件可以使用”WITH“修饰词与数据关联。在图形表示中,将事件和相关联的数据连接线交叉点画一个小方块。对于输入和输出的含义如下:
-当一个事件发生时,它关联的数据更新。其它输入变量保持它们的值(也就是说,没有变化)
-当输出事件触发时,关联数据输出有效,而其它数据没有发生变化。
IEC61131-3的数据类型用作变量的数据类型(见附录A 可用数据类型)
功能块封装功能,它们具有内部变量。功能的形式和类型由功能块类型决定。
IEC61499不允许由全局变量
从上面的描述我们可用看出,IEC61499 功能块的所有操作都是通过事件来同步的。在事件到来之前,相关连的数据已经出现在它们的输入端。功能块的内部程序分成两个部分,一个是执行控制程序段,它根据输入事件来决定算法的执行,另一部分是算法。算法中会使用到输入数据,并且会产生输出数据 。当内部算法执行完成之后,执行控制程序段将更加内部的状态图确定输出事件。
功能块的行为和集成电路非常相似,比如一个D触发器,数据首先呈现在D 输入端,然后产生时钟的上升沿将数据置入触发器,Q 端输出 D 触发器新的状态值。时钟的上升沿就类似功能块的事件输入。数据输入是于时钟关联的。对比集成电路的时钟电路有助于我们理解IEC61499 功能块的操作方式。
功能块的执行模型
如下图所示,基本功能块的算法是由功能块对象中的执行控制程序段响应输入事件时调用的。一旦算法执行完成,执行控制程序在事件输出端产生事件。
t1-相应的输入数据变量值可用
t2-在事件输入端发生事件
t3-执行控制功能,通知资源调度功能调度一个算法执行。
t4-算法执行开始。
t5 –算法输出值。
t6 资源调度功能通知算法执行结束。
t7-调度功能调用执行控制功能。
t8-执行控制功能在事件输出端输出事件。
一些时间关系
初始化时间 Tsetup=t2-t1
启动时间 Tstart=t4-t2
算法时间Talg=t6-t4
完成时间 Tfinish=t8-t6
功能块类型
IEC61499 标准中,定义了三种功能块:
基本功能块类型(Basic function block)
复合功能块类型(Composite function block)
服务接口功能块类型(Service interface function block types)
功能块库
任何一个基于图形的程序设计方式,能够在实际应用中使用的一个关键因素是它是否具有足够的功能块库,满足设计各种应用程序的需要。IEC61499 标准文档中只是在附录A 中描述了一小部分的事件功能块。而像eclipse 4DIAC 这样的开发项目也只是提供了少量的功能块库,它们包括:
4diac IDE 中提供了下列功能块库
转换(convert)
设备(device)
事件events
IEC61131-3
输入输出io
数学运算(math)
网络net
重配置(reconfiguration)
资源(resource)
实时事件rtevents
分段Segments
辅助(utils)
许多的目录下的功能块数量也很少。依靠这些功能库,编写不出实际的应用程序。要使得IEC61499 标准付诸实际应用,需要开发更多的功能块库,这些功能块库分成两类:
通用的功能块库
开发自动控制应用中常用的功能块库。这方面可以参考NI 的labVIEW ,它是为软件仪器开发的系统,针对各种仪表测量应用,NI 提供大量的功能对象,在LabVIEW 中称为功能调色板(functions palette)。小到加减法,大到数字信号处理对象。通过长期的积累,LabVIEW 的对象库非常丰富,使用这些对象节点,能够编写出各种测量方面应用程序。
通用地,IEC61499 标准要面向实际的应用,也必须开发丰富的功能块图,个人觉得,至少需要增加如下的库
1 通用的数字逻辑库
-AND,OR,INV ,XOR 等基本的逻辑运算
-译码器
-解码器
-各种计数器
-移位寄存器
-数值比较器
可以参照某些74系列集成电路来实现
2 常用的数学运算库
-三角函数 SIN,COS,。.
3 基本的控制算法
-PID 算法
4 数字信号处理库。
-常用的数字滤波算法
-FFT 变换
5 基本的执行部件控制库
-步进电机控制
-直流电机控制
-伺服电机驱动
-硬件接口驱动(GPIO,ADC 采样)
6 与上位机网络通信的库
-数据库读写库
-UI 功能块库
-MQTT 协议库
我个人的看法,IEC61499 功能块库,不适合像LabVIEW 分的那么细,甚至还支持循环,IF-THEN-ELSE 结构化控制功能块。因为那么做的话,功能块网络变成了以图形化编程为目标了。这样会导致功能块网络过于复杂,而且运行效率不高。IEC61499 功能块应该提供完整单一的功能。而不提供程序设计的基本语句控制元素(比如IF-THEN-ELSE,SWITCH)。基本的语句在功能块内部使用动态语句实现,例如java 或者Lua 语言实现。
面向应用的功能块库
开发通用功能块库是非常困难的,毕竟工业控制应用五花八门,种类繁多。即使你准备了足够的通用功能块库,到编写程序时还会发现少了那么几个。针对具体的行业应用开发功能块库是一个好主意。例如:
建筑自动化功能块库
智能电网功能块库
分布式数字控制
建立功能块类型
从上面的描述我们可见,开发功能块库是IEC61499 标准走向实用的关键。各种IEC61499 开发环境都支持功能块库的开发。在算法部分可以使用java,lua 这样的解释性语言,也可以使用C,C++,Structure Text 这样的编译型语言在4DIAC的IDE 中称为建立功能块类型。可以使用C++,ST和Lua 语言开发功能块类型
动态功能块类型
当使用编译型语言时,建立的功能块类型最终要export 出来,和运行时一起编译。这对于应用程序工程师来讲,是比较麻烦的过程。在4DIAC 中具有一种称为“动态类型装入”的特性,使用这种方式,新的功能块不需要编译就可以直接部署和测试。可以下载lua 代码到运行时Forte 中,而Forte 内部含有一个Lua 解释器解释Lua 代码。
小结
功能块是工业控制应用中常用的一种基于图形的编程方法,和其它项目中的功能块不同,IEC61499 功能块之间的执行控制是通过事件和内部的事件状态图同步实现的,它更加地明确。
IEC61499 标准和开发工具提供的功能库是不够的,无法满足实际应用的需要,必须开发丰富的功能库,面向特定的应用领域开发功能块库是一个行之有效的方法。
使用C 和ST 语言编写的功能块库需要和运行时一起重新编译,而4DIAC 同样提供了“动态功能块装入”的性能,用户可以使用Lua 语言编写动态功能块类型的算法,无需编译直接下载到Forte 运行。在Forte内部保留了一个LuaJIT 即时解释器。
举报