本小节介绍的用PLC程序实现模糊控制算法,实际是上一节模糊控制算法介绍的注解。所用的实例也是洗澡水温度的模糊控制。整个程序由三部分组成:即模糊化程序、模糊推理程序、解模糊程序。
1.模糊化程序
图3-91所示为模糊化子程序。它用于一个“Δ”,或半“Δ”型的模糊子集的隶属度计算。为便于理解,程序所用的数据用符号表示。
图3-91 模糊化子程序
图3-92为调用它的主程序。为便于理解,程序所用的数据也用符号表示。但在每次调用它之前,先对“标志值形参”赋值,即指明该模糊子集隶属度为1时对应的精确量值,如“暖和”隶属度为1时,其值是40℃等;调用后,还得取出返回值,这里即为某输入模糊子集,如暖和等。
图3-92 模糊化子程序调用
对图3-91a程序,先是求出“输入现值”与“标志值形参”(其实际值由计算哪个模糊子集确定)的差(差存于DM72中),并相应判断这两个值,看哪个大(用LR0.00表达,0时前者大,1时后者大)。然后,把这个“差”乘10(积还存于DM72中)。再,此“差”被“上半范围”或“下半范围”(见图3-69)除,其“商”仍存于DM72中。最后,用这个“商”去减10。其结果存于“入模糊集形参”中。这也就是所求的隶属度。只是它不是处于0~1之间的数,而是0~10之间的数。因为这里用的都是整数运算指令,故作了这么处理了。
对图3-91b程序,先是比较“输入现值”与“标值形参”(其实际值由计算哪个模糊子集确定)的大小。如前者大,则SM0.0 ON,否则M0 OFF。如SM0.0 ON则“输入现值”被“标志值形参”减;否则“标值志形参”被“输入现值”减,其差存于VW72中。然后,把这个“差”乘10(积还存于VW72中)。再,此“差”被“上半范围”或“下半范围”除,其“商”仍存于VW 72中。最后,用这个“商”去减10。其结果存于“入模糊集形参”中。这也就是所求的隶属度。只是它不是处于0~1之间的数,而是0~10之间的数。因为这里用的都是整数运算指令,故做了这么处理了。
对图3-91c程序,先是比较“输入现值”与“标值形参”(其实际值由计算哪个模糊子集确定)的大小。如前者大,则M0 ON,否则M0 OFF。如M0 ON则“输入现值”被“标值形参”减;否者则“标值形参”被“输入现值”减,其差存于D72中。然后,把这个“差”乘10(积还存于D72中)。再,此“差”被“上半范围”或“下半范围”除,其“商”仍存于D72中。最后,用这个“商”去减10。其结果存于“入集形参”中。这也就是所求的隶属度。只是,它不是处于0~1之间的数,而是0~10之间的数。因为这里用的都是整数运算指令,故做了这么处理了。
图3-92程序有5次调子程序。因为本例有5个模糊子集。
2.模糊推理程序
图3-93所示为模糊推理子程序(子程序11)及被它调用的下一层的子程序(子程序12)。它用于进行一个行(本例为5行)与一个列(必须与行相等,本例也为5列)的矩阵乘。程序所用的数据用符号表示,较好理解。
图3-93 模糊推理子程序
图3-94所示为模糊推理主程序。程序所用的数据用符号表示。在每次调用它之前,先对“模糊关系指针”及“模糊输出指针”赋值,即指明该模糊关系矩阵列的首地址及模糊输出地址。这种调子程序前赋值给指针,由子程序按指针指向去存储子程序运算结果,可做到一个子程序多用,是较简洁的编程方法。这里调了5次子程序,因为这个矩阵有5列。
图3-94 模糊推理子程序调用
图3-93a子程序12,为先乘运算,后累加。运算后,修改指针。子程序11先是模糊入指针赋值,指出输入矩阵的首地址;后为模糊出指针指向的地址清零,为累加做准备。以下为连续调5次子程序12,以完成一个行与一个列的矩阵乘。显然,执行这主程序及对应的子程序,将完成整个推理过程。之后,可得出模糊输出矩阵。从图3-74a子程序指针赋值知,此矩阵的各项的地址分别为DM70、DM72、DM74、DM76及DM78。不过,这模糊输出子集的隶属度也是在0~10之间取值。这里设模糊关系矩阵参数存于DM10~DM59。
图3-93b子程序SBR-12,为先乘运算,后累加。运算后,修改指针。子程序11先是模糊入指针赋值,指出输入矩阵的首地址;后为模糊出指针指向的地址清零,为累加做准备。以下为连续调5次子程序12,以完成一个行与一个列的矩阵乘。显然,执行这主程序及对应的子程序,将完成整个推理过程。之后,可得出模糊输出矩阵。从图3-93b子程序指针赋值知,此矩阵的各项的地址分别为:VW140、VW142、VW144、VW146及VW148。不过,这模糊输出子集的隶属度也是在0~10之间取值。这里设模糊关系矩阵参数存于VW20~VW106。(www.daowen.com)
图3-93c子程序P12,为先乘运算,后累加。运算后,修改指针。子程序11先是使变址器V0赋值为0,后为D70V0指向的地址,即D(70+V0的内容),清零,为累加做准备。以下为连续调5次子程序12,以完成一个行与一个列的矩阵乘。显然,执行这主程序及对应的子程序,将完成整个推理过程。之后,可得出模糊输出矩阵。从图3-93c子程序指针赋值知,此矩阵的各项的地址分别为:D70、D72、D74、D76及D78。不过,这模糊输出子集的隶属度也是在0~10之间取值。这里设模糊关系矩阵参数存于D10~D59。
3.解模糊程序
上已提及,解模糊程序的任务是根据各输出模糊子集的隶属度,确定相应的控制输出。本例用的为积分输出。解模糊用的是最大隶属度法。图3-95及图3-96所示即为这个程序。该图指令操作数为符号地址。
图3-95 解模糊程序
对图3-95a这里的ZLL对应的地址为DM70(是模糊输出指针的指向,见图3-94a,下同),ZL对应的地址为DM72,ZO对应的地址为DM74,ZR对应的地址为DM76,ZRR对应的地址为DM78。
对图3-95b这里的ZLL对应的地址为VW140(是模糊输出指针的指向,见图3-94b,下同),ZL对应的地址为VW142,ZO对应的地址为VW144,ZR对应的地址为VW146,ZRR对应的地址为VW148。
对图3-95c这里的ZLL对应的地址为D70(是模糊输出指针的指向,见图3-94c,下同),ZL对应的地址为D72,ZO对应的地址为D74,ZR对应的地址为D76,ZRR对应的地址为D78。
图3-95程序用以查找最大隶属度的模糊子集。它用了多个比较指令,目的是把最大隶属度模糊子集的地址保存在相应地址中(图3-95a保存在DM98中、图3-95b保存在VW196中、图3-95c保存在D98中)。同时把这个模糊子集对应的输出值存于相应地址中(图3-96a保存在DM96中、图3-96b保存在VW192中、图3-96c保存在D96中)。为取得相应的控制输出准备数据。
图3-96 解模糊程序续
图3-96程序是用以产生积分输出的。
对图3-96a使控制输出增大还是将减小,取决于LR0.05是ON,还是OFF。而LR0.05的ON、OFF则由哪个模糊子集的隶属度大决定。在查找最大隶属度模糊子集的程序(图3-95)的第一操作就是使LR0.05 OFF,但如出现ZR或ZRR的隶属度最大(要使控制输出增大),则置LR0.05 ON。如未出现ZR或ZRR的隶属度最大(要使控制输出减小),则保持LR0.05 OFF。这正是系统所要求的控制。
对图3-96b积分是使控制输出增大还是减小,取决于M0.5是ON,还是OFF。而M0.5的ON、OFF则由哪个模糊子集的隶属度大决定。在查找最大隶属度模糊子集的程序(图3-95)的第一操作就是使M0.5 OFF,但如出现ZR或ZRR的隶属度最大(要使控制输出增大),则置M0.5 ON。如未出现ZR或ZRR的隶属度最大(要使控制输出减小),则保持M0.5 OFF。这正是系统所要求的控制。
对图3-96c使控制输出增大还是将减小,取决于M5是ON,还是OFF。而M5的ON、OFF则由哪个模糊子集的隶属度大决定。在查找最大隶属度模糊子集的程序(图3-95)的第一操作就是使M5 OFF,但如出现ZR或ZRR的隶属度最大(要使控制输出增大),则置M5 ON。如未出现ZR或ZRR的隶属度最大(要使控制输出减小),则保持M5 OFF。这正是系统所要求的控制。
此外,还有两点要考虑:
1)这个程序应是“微分执行”,其执行的时间间隔由TIM000、T101或T1控制。这个间隔可小些,但模糊子集对应的输出值也要小些。因为每次增减量小,可避免“静态不稳定”。
2)控制输出值要控制,最大不能大过允许的最大值;最小不能小于允许的最小值。这在图3-96的各组程序中已作了处理。
提示:图3-91~图3-96基本上是分别编写的。如合成为一个统一的程序,则所使用的实际地址也应统一分配,应避免重复使用。特别要注意,欧姆龙、三菱PLC的乘、除运算,存储的结果字的字长为参加运算字的字长的2倍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。