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根据它的品牌、型号来选择编程软件,比如,西门子:S7-200系列PLC编程软件用STEP7-MicroWINV4.0SP9版本软件;S7-200SMART系列PLC编程软件用STEP7...
求助PLC程序的大小如何计算?-盖德问答-化工人互助问答社区
不过我们这边都用1756的,基本上多大的程序都不成问题在电脑上显示的文件不是全部装入plc的吧,编程的时候存储空间是预留的,在电脑上显示的文件不...
西门子plc控制泵机启停选择控制方案?
西门子PLC控制泵机的启停需要考虑到多方面的因素,包括泵的类型、流量、压力、启停条件等。以下是一些常见的控制方案:1.模糊控制(FuzzyControl):模糊控制是...
电机输出的模拟信号是压力,如何用此模拟信号通过plc反馈来控制电机的运行和停止?
电机输出的模拟信号时压力,如何用此模拟信号通过plc反馈来控制电机的运行和停止,首先你提出的问题有异议有点表达不清楚,压力不是模拟信号,模拟信号一般有电...
现在我有两台PLC需要实现以太网通信如何设置?-166****0190...
在硬件组态中设好IP,把他们都接交换机上,在程序中用库里面的AGSEND和AGRECEIVE写收发程序,两边都写好就可以了设置以太网模块IP增加交换机IP设置好...
PLC未来的发展方向?前景如何?
谢谢邀请,按个人愚见PLC未来发展方向:必定是总体向高度集成化,数字化,和互联化发展。所以与之发生交叉的领域会越来越多。集成化方面可能更趋向与DSC的界线越...
PLC与单片机有什么区别?
PLC(可编程逻辑控制器)是一种专门用于工业自动化控制的设备,具有高性能、高可靠性和多功能性的特点。它采用了多种通信接口,可与各类传感器、执行器、仪表等...
西门子s7-300plc怎样设置IP地址?
你问的问题不清楚PLCNCHIM乃至键盘都有自己固定的地址因系统的型号不同地址不同840D和802D键盘的地址就不一样你要是单问PLC地址怎么设置如果...
深圳启程plc怎么样?-ZOL问答
有用(0)回复zhizhu198706你程序的要求是什么?你想保存数据,就用断电保持寄存器哦有用(0)回复dasdas563深圳的培训机构多如牛毛,没听说过启程培训!有用...
东莞PLC编程培训机构怎么样?求推荐
[回答]东莞PLC编程培训机构怎么样?东莞培训机构有很多啊,其他不清楚年前我报名PLC电工班,是在一个叫三人易行教育报名的,里面老师非常耐心的介绍和讲解,电...