PLC单参数模糊控制(含代码)
一、 说明
通过西门子 1200 控制器,使用博途 V13SP1 的 scl 编程语言实现模糊控制算法,反模糊计算复杂,为了简化算法,将输出功能函数简化为矩形,隶属度只取矩形的中点。
二、 实验测试
通过 matlab7.0 测试模糊控制结果,如下
1、 测试 1,输入 0.5,输出
2、 测试 2,输入 0.85,输出
3、 测试 3,输入 1.1
4、 测试 4,输入‐0.44,输出
5、 测试 5,输入‐1.2
程序代码
Fis
名称 数据类型偏移量默认值可从 HMI 访问
在 HMI 中可见
设置值注释
Input
in Real 0.0 0.0 True True False
insh Real 4.0 0.0 True True False
insl Real 8.0 0.0 True True False
outsh Real 12.0 0.0 True True False
outsl Real 16.0 0.0 True True False
Output
out Real 20.0 0.0 True True False
InOut
Static
then Bool 24.0 false True True False
clause_type Bool 24.1 false True True False
clause_val Byte 25.0 16#0 True True False
c lause_val_boll Array[0..7] of
Bool
25.0 False False False
clause_val_boll[0] Bool 0.0 False False False
clause_val_boll[1] Bool 0.1 False False False
clause_val_boll[2] Bool 0.2 False False False
clause_val_boll[3] Bool 0.3 False False False
clause_val_boll[4] Bool 0.4 False False False
clause_val_boll[5] Bool 0.5 False False False
clause_val_boll[6] Bool 0.6 False False False
clause_val_boll[7] Bool 0.7 False False False
if_val Byte 26.0 16#0 True True False
mu Byte 27.0 16#0 True True False
temp Int 28.0 0 True True False
label Int 30.0 0 True True False
input Byte 32.0 16#0 True True False
fuzzy_out Byte 33.0 16#0 True True False
clause Int 34.0 0 True True False
numerator DInt 36.0 0 True True False
denominator DInt 40.0 0 True True False
j Int 44.0 0 True True False
outputs Array[0..4] of
Byte
46.0 True True False
outputs[0] Byte 0.0 16#0 True True False
outputs[1] Byte 1.0 16#0 True True False
outputs[2] Byte 2.0 16#0 True True False
outputs[3] Byte 3.0 16#0 True True False
outputs[4] Byte 4.0 16#0 True True False
output_memf Array[0..4] of
Byte
52.0 True True False
output_memf[0] Byte 0.0 0 True True False
output_memf[1] Byte 1.0 64 True True False
output_memf[2] Byte 2.0 128 True True False
output_memf[3] Byte 3.0 191 True True False
output_memf[4] Byte 4.0 255 True True False
input_memf Array[0..4, 0..3]
of Byte
58.0 True True False
input_memf[0,0] Byte 0.0 16#00 True True False
input_memf[0,1] Byte 1.0 16#00 True True False
input_memf[0,2] Byte 2.0 16#0D True True False
input_memf[0,3] Byte 3.0 16#07 True True False
input_memf[1,0] Byte 4.0 16#1A True True False
input_memf[1,1] Byte 5.0 16#0A True True False
input_memf[1,2] Byte 6.0 16#5E True True False
input_memf[1,3] Byte 7.0 16#0F True True False
input_memf[2,0] Byte 8.0 16#48 True True False
input_memf[2,1] Byte 9.0 16#08 True True False
input_memf[2,2] Byte 10.0 16#95 True True False
input_memf[2,3] Byte 11.0 16#08 True True False
input_memf[3,0] Byte 12.0 16#95 True True False
input_memf[3,1] Byte 13.0 16#14 True True False
input_memf[3,2] Byte 14.0 16#BF True True False
input_memf[3,3] Byte 15.0 16#06 True True False
input_memf[4,0] Byte 16.0 16#BF True True False
input_memf[4,1] Byte 17.0 16#06 True True False
input_memf[4,2] Byte 18.0 16#FF True True False
FIS / FIS1 [CPU 1214C AC/DC/Rly] / 程序块
Fis [FB1]
Fis 属性
常规
名称 Fis 编号 1 类型 FB 语言 SCL
编号 自动
信息
标题 作者 注释 系列
版本 0.1 用户自定义 ID
名称数据类型偏移量默认值可从 HMI 访问
在 HMI 中可见
设置值注释
input_memf[4,3] Byte 19.0 16#00 True True False
rules Array[0..9] of
Byte
78.0 True True False
rules[0] Byte 0.0 #GAP_ZERO True True False
rules[1] Byte 1.0 #TURN_ZERO True True False
rules[2] Byte 2.0 #GAP_VSMALL True True False
rules[3] Byte 3.0 #TURN_VSMALL True True False
rules[4] Byte 4.0 #GAP_SMALL True True False
rules[5] Byte 5.0 #TURN_SMALL True True False
rules[6] Byte 6.0 #GAP_MEDIUM True True False
rules[7] Byte 7.0 #TURN_MEDIUM True True False
rules[8] Byte 8.0 #GAP_BIG True True False
rules[9] Byte 9.0 #TURN_BIG True True False
Temp
Constant
GAP_ZERO Byte 16#00
GAP_VSMALL Byte 16#01
GAP_SMALL Byte 16#02
GAP_MEDIUM Byte 16#03
GAP_BIG Byte 16#04
TURN_ZERO Byte 16#80
TURN_VSMALL Byte 16#81
TURN_SMALL Byte 16#82
TURN_MEDIUM Byte 16#83
TURN_BIG Byte 16#84
MU_MAX Byte 16#FF
IO_NUM Byte 16#07
LABEL_NUM Byte 16#70
DEFAULT_VALUE Byte 16#00
Totally Integrated
Automation Portal
0001 //------------------------------初始化--------------------------------------------------
0002 #label:=0;
0003 #then:=0;
0004 #if_val:=#MU_MAX;
0005
0006 //------------------------------输入值归一化--------------------------------------------
0007 //#input:=INT_TO_BYTE(REAL_TO_INT((#in-#insl)/(#insh-#insl)*255.0));
0008 #input := DINT_TO_BYTE(TRUNC((#in - #insl) / (#insh - #insl) * 255.0));
0009 //#input := 16#c5;
0010 //----------------------------模糊控制算法----------------------------------------------
0011 FOR #clause := 0 TO 9 DO
0012 #clause_val := #rules[#clause];//存储当前规则
0013 #clause_type := #clause_val_boll[7];//条件分支 0;结果分支 1
0014 IF NOT #clause_type THEN //当前为调节分支
0015 IF #then THEN //是否分析结果
0016 #then := 0; //
0017 #if_val := #MU_MAX; //复位 mu
0018 END_IF;
0019 IF BYTE_TO_INT(#input) < BYTE_TO_INT(#input_memf[#label,0]) THEN //如果输入在点 1 左边
0020 #mu:=0; //隶属度为 0
0021 ELSE //输入在点 1 右边
0022 IF BYTE_TO_INT(#input) < BYTE_TO_INT(#input_memf[#label,2]) THEN //输入在点 1,3 之间
0023 #temp:=#input; //用斜率 1 计算隶属度
0024 #temp:=#temp-BYTE_TO_INT(#input_memf[#label,0]);
0025 IF #input_memf[#label,1]=0 THEN //斜率 1 为 0
0026 #temp:=#MU_MAX; //隶属度为最大值
0027 ELSE
0028 //斜率 1 不为 0
0029 #temp:=#temp*BYTE_TO_INT(#input_memf[#label,1]); //根据斜率 1 计算隶属度
0030 END_IF;
0031 IF #temp < 16#100 THEN //隶属度未超限
0032 #mu:=INT_TO_BYTE(#temp);
0033 ELSE
0034 //隶属度超限
0035 #mu := #MU_MAX;
0036 END_IF;
0037 ELSE //输入在点 3 右边,即第二天斜线上
0038 #temp:=#input;
0039 #temp:=#temp-BYTE_TO_INT(#input_memf[#label,2]);
0040 #temp:=#temp*BYTE_TO_INT(#input_memf[#label,3]);
0041 #temp:=BYTE_TO_INT(#MU_MAX)-#temp;
0042 IF #temp < 0 THEN //隶属度小于 0
0043 #mu:=0;
0044 ELSE
0045 // 隶属度不小于 0
0046 #mu := INT_TO_BYTE(#temp);
0047 END_IF;
0048 END_IF;
0049 END_IF;
0050 #if_val:=#mu;
0051 #label:=#label+1;
0052
0053 ELSE //当前为结果分支
0054 #then := 1; //开始计算结果
0055 IF BYTE_TO_INT(#outputs[BYTE_TO_INT(#clause_valIO_NUM)]) < BYTE_TO_INT(#if_val) THEN
0056 #outputs[BYTE_TO_INT(#clause_valIO_NUM)] := #if_val;
符号地址 类型注释
#clause Int
#clause_type Bool
#clause_val Byte
#clause_val_boll A rray
#DEFAULT_VALUE 16#00 Byte
#denominator DInt
#fuzzy_out Byte
#if_val Byte
#in Real
#input Byte
#input_memf A rray
#insh Real
#insl Real
#IO_NUM 16#07 Byte
#j Int
#label Int
#mu Byte
#MU_MAX 16#FF Byte
#numerator DInt
#out Real
#output_memf A rray
#outputs A rray
#outsh Real
#outsl Real
#rules A rray
#temp Int
#then Bool
模糊控制在S7-300PLC中的实现
随着工业结构的变化和自动控制技术的发展,PLC(可编程序控制器)因其功能齐全,抗千扰能力强,稳定可靠,编程简单,恶劣环境条件下能正常工作等特点,广泛应用于工业控制中。模糊控制是日前十分成熟的一种智能控制方法,在工业生产中得到了普遍的应用。利用PLC实现模糊控制,结合二者各白的长处,将显著的提高企业生产效率。
西门子S7-300PLC是在我国的大中型企业中,应用相当普遍的一款PLC。S7-300PLC提供了专门的模糊控制软件包与功能模块,可以实现期望的模糊控制功能,但其价格相当昂贵。若能白己开发模糊控制程序,必将降低企业生产成本,提高企业经济效益。
本文介绍了模糊控制采用离线计算与在线查表的方式卜,利用57-300PLC的step7软件编写模糊控制器程序的方法,其有较好的现实意义。
1模糊控制的实现
1.1模糊控制原理
模糊控制的基本原理如图1所示。
图1模糊控制原理图
通过采样获取被控量的精确值,然后将此量与给定值比较得到误差信兮,把误差信号的精确量模糊化变成模糊量。再由模糊控制规则(模糊关系),根据推理合成规则进行决策,得到模糊控制量。为了对被控对象施加精确的控制,还需将模糊量转化为精确的数字量,经D/A转换,送给执行机构,从而对被控对象实施控制。
1. 2模糊控制的实现
本文中提及的模糊控制方法是经典的二维模糊控制,首先通过离线计算获得模糊控制表,而后实际应用时通过查表的方法获得系统的控制输出。设模糊变量为:误差e和误差的变化率De,控制量u。误差e和误差的变化率De以及控制量u的论域都取为【-6,-5,-4,-3,-2,-1. 0, 1. 2, 3. 4, 5, 6].其模糊集合都为:[ NB, NM, NS, ZE, PS, PM, PB],隶属度函数取铃型函数exp(-(x-c}2)/ )。有关离线计算的内容本文中省略,只给出计算后得到的模糊控制表,如表1所示.
表1模糊控制表
2模糊控制算法的steP7实现
Step7软件是西门为S7-300f'LC提供的一套功能的强大的组态编程软件,其有丰富的功能块,为模糊控制算法的实现提供了方便。考虑到从事PLC控制人员的实际情况,编程语言采用梯形图(LAD).OB35是S7-300PLC提供的循环中断组织块,其循环时间即为系统的采样周期,模糊控制程序语句就在该组织块中实现。
2. 1模糊控制表在step7中的实现
模糊控制表是模糊控制的核心,通常都是表1所示的二维表。 Step7中提供了一种Array变量类型,可以力便的在数据块(DB)中定义二维数组。
在本项目中定义了一个共享数据块DB2,命名为fuzzy,包括了模糊控制表变量FUZZY,为一13X 13的如二维数组,图2所示。
定义变量后将控制表中的数据赋位给变量FUZZY,通过自定义功能FC2实现。利用MOVE指令将数据传送到FUZZY中相应的位置,PLC的Cf'U启动时FC2实现控制表的初始化工作。FC2中的斌值语句如图3所示。
2. 2尺度变换与量化功能的实现
在用查表法实现的模糊控制中 ,首先要将输入的精确量转换到模糊量各自的论域之中,而后为了实现查表功能,还需要将经过尺度变换得到的值经过四舍五入变为整数量,这就是量化功能。
在本项目中,定义了四个比例因子,如图2所示,分别为误差变换因子K_1,误差变化率变换因子K_2,输出量变换因子K_3。为了实现查表,需要将论域中的!-6,… , 6]变为【1,… , 13], K_4为此变换因子,在这里.取值l。
尺度变换与量化在OB35中编程实现,以误差为例,程序如图4所示。
图4尺度变换与量化功能实现
Round指令是step7提供的取整指令,可以方便的实现四舍五入运算。RX足为实现查表运算而定义的变量。
2.3查询控制表功能的实现
以上做的全部工作均足为了实现模糊控制表的查询,通过查表,.可以得到合适的控制量输出。
为了实现控制表的查询,编写自定义功能FC3,只有两个输入一个输出。输入分别为RX和RY,为误差和误差变化率量化后的整数值,输出即为控制量输出。利用RX与RY通过FC3查表的梯形图语句如图5所示。
图5控制农查询语句
F'C3是专为实现查表而准备的自定义功能,共有169条语句,对应控制表中的169个输出值,下面简要说明一下如何实现控制表查询。当e=6,△e=-6时,RX=1, RY=1.通过FC3中的169条语句中的第一条语句,获得一个输出u=-5.2434. 当误差e和误差的变化率△e取其他植时,控制量u总能获得一个输出。图6为FC3中第一条语句,其余168条语句与其类似。
I}16 I'C3}/,梯形图语下:]
至此,利用step7编写模糊控制程序工作全部结束,在s7-soo实现了模糊控制算法。
3结论
木文在探讨了如何在PLC中实现模糊控制的基础上,给出了在S7-300f'I.C上利川step7编写模糊控制程序的具体方法,是对如何将高级控制算法应用于PLC中的有益尝试,对于此类应用具有较好的指导意义。
相关问答
plc倒立摆控制算法?
PLC倒立摆控制算法是一种用于控制倒立摆系统的算法。它基于传感器测量的数据,通过计算和比较实际角度和目标角度之间的差异,来调整电机的输出,以实现倒立摆的...
学习pLC有前途吗?
您好,小吴帮您回答。PLC的学习不能说有没有前途,应该说PLC这个行业,或者说自动化这个行业有没有发展,有没有前途,我个人就是自动化专业,觉得还是很好的一...许...
关于PLC的职业规划和前景?
由于PLC应用向智能化和网络化方向发展(智能化是指PLC应用除具有传统的顺序控制功能外,还增加了用于过程控制和位置控制的各种专用接口及智能控制算法;而...对于...
初学者想系统的学习PLC,请问应该怎么学?有没有好的学习方法或学习步骤?
大家好,我是王俊杰,做项目的,从2010年接触电气自动化编程到现在已经有11年时间了。还记得第一次做工程的情景,那是一个夏天,天气炎热,我负责做公司PLC编程...现...
plc编程里面有接线端子怎么外部还要接外端继电端子台如何接线?
科技引领生活,爱科技的小青年带你在科技的海洋里无限遨游……PLC的应用已经很广泛了,多用于工业生产控制,很多初学者,看到老前辈配出来的柜子都会问一个问题...
《大染坊》卢家驹为什么有那么多的情人?他有什么特别之处吗?
家驹有那么多情人,当然是因为他本性风流,而且他还有风流的资本。第一,卢家驹非常帅气,有气质卢家驹的扮演者是罗刚,也是曾经多部正剧的男一号,他高大帅气...在...
现在我有两台PLC需要实现以太网通信如何设置?-166****0190...
在硬件组态中设好IP,把他们都接交换机上,在程序中用库里面的AGSEND和AGRECEIVE写收发程序,两边都写好就可以了设置以太网模块IP增加交换机IP设置好...
威纶通屏肿么跟PLC通讯的?-ZOL问答
1、首先打开“编辑”-“系统参数设置”,在“设备列表”里看是否新增了PLC,如果没有则点击“新增”,选择“PLC”、“PLC类型”、“接口类型”、“COM设置”等;2...
如何用西门子plc和变频器控制电机正反转,加减速和启停?
这个问题就相当于要问我如何实现升降机的控制或者说卷扬机的控制!这个说句实话,一两句说不清楚,涉及到图纸,接线,plc程序,开关位置的设定,变频器的参数设...
开关量都接常开点,plc怎么做到的的?
开关量接常开点还是常闭点需要根据实际的需求来判断接常开点还是接常闭点,比如你想要电机的运行信号,通常接常开点,常开点接通,plc得到信号,plc内部直接用常...