首先介绍下函数,函数块与数据块这三个概念。
数据块
数据块里可以存储各种类型的参数。有人可能会问,m寄存器不是可以存储布尔值,8位,16位,32位变量吗,为什么要多此一举?因为虽然m寄存器能存储以上变量,但数据块可以更灵活地对变量进行分类,且很多系统自带的函数块,需要背景数据块支持,另外,m寄存器不能存储些特殊的数据类型,如time,string,struct等,而数据块则可以很轻松的定义并使用这些变量。
函数
函数,是可以实现指定功能的模块,但这些模块,没有用来存储数据的背景数据块,所以函数的输入输出都要存储在另外的数据块或者plc寄存器中。
函数块
函数块,相当于带有数据块的函数模块,由于拥有了背景数据块,所以输入输出无需存储在其他数据块中。当使用函数快时,会同时创建一个对应实例的数据块。
打个比喻,例如我们要去自驾游旅行,我们就要带上自己的日常用品,而数据块,就是存储这些日常用品的容器。假设我们是叫的滴滴,那么滴滴就是实现我们从家到目的地的一个函数,但由于车不是我们的,我们需要另外带一个行李箱,这个行李箱,就可以理解为是我们的数据块。但如果我们是开自己的车去自驾,那么我们的行李就可以直接放在车上,而这个车,既能实现运输功能,又能存储我们的日用品,那它就相当于我们的函数块了。
然后,单个实例,多重实例,和参数实例,是针对函数和函数块嵌套的,例如函数里面调用函数块,函数块里面调用函数块等(函数调用函数,由于都没有数据块,所以不存在此问题)。
单个实例
先说说单个实例,假设创建了一个函数块module1,函数块module10和函数块module11,然后在函数块module1里面调用函数块module10和函数块module11时,如果选择单个实例模式,则会在调用module10和module11时,把他们当作一个独立的实例,分别创建各自的背景数据块,而当调用module1时,也会单独创建一个module1的背景数据块。所以当调用一次module1时,会生成三个数据块。
所以这种方式,适用于函数块里嵌套的模块是同一个模块的情况下。例如,一个系统只有一个轴,而我创建了一个函数块,调用轴的函数块,移动到不同的地方,那么每移动到一个地方,就要创建一个函数块,但无论创建多少个函数块,调用的都是同一个轴的动作函数块。
此外,如果是函数模块调用函数块模块,则只能选择单个实例模式,因为函数本来没有背景数据块,所以它调用的函数块,只能使用自身的背景数据块来存储参数。
多重实例
所以,使用多重实例的话,只要调用一次module1,就会有一个module10实例,而module10的参数,可以通过"module1_DB".module10_Instance.start来进行设置。还是用回单个实例的例子,如果一个系统有多个轴,而我们针对每个轴的动作,都打包成一个函数块,就可以使用此方式。
参数实例
如图,当使用参数实例形式后,嵌套的函数块会以参数形式输入给module1的实例,这样和多重实例的区别在于,不需要在创建实例时,就绑定嵌套对象,而可以在后期修改,那前面的比喻,就是每个模块可以随便使用各个不同的轴进行控制,而不需要某个模块对应某个轴。