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
PLC的3大重点编程算法,电气人都该掌握
PLC编程算法(一)
1、开关量也称逻辑量,指仅有两个取值,0或1、ON或OFF。它是最常用的控制,对它进行控制是PLC的优势,也是PLC最基本的应用。
开关量控制的目的是,根据开关量的当前输入组合与历史的输入顺序,使PLC产生相应的开关量输出,以使系统能按一定的顺序工作。所以,有时也称其为顺序控制。
而顺序控制又分为手动、半自动或自动。而采用的控制原则有分散、集中与混合控制三种。
2、模拟量是指一些连续变化的物理量,如电压、电流、压力、速度、流量等。
PLC是由继电控制引入微处理技术后发展而来的,可方便及可靠地用于开关量控制。由于模拟量可转换成数字量,数字量只是多位的开关量,故经转换后的模拟量,PLC也完全可以可靠的进行处理控制。
由于连续的生产过程常有模拟量,所以模拟量控制有时也称过程控制。
模拟量多是非电量,而PLC只能处理数字量、电量。所有要实现它们之间的转换要有传感器,把模拟量转换成数电量。如果这一电量不是标准的,还要经过变送器,把非标准的电量变成标准的电信号,如4—20mA、1—5V、0—10V等等。
同时还要有模拟量输入单元(A/D),把这些标准的电信号变换成数字信号;模拟量输出单元(D/A),以把PLC处理后的数字量变换成模拟量——标准的电信号。
所以标准电信号、数字量之间的转换就要用到各种运算。这就需要搞清楚模拟量单元的分辨率以及标准的电信号。例如:
PLC模拟单元的分辨率是1/32767,对应的标准电量是0—10V,所要检测的是温度值0—100℃。那么0—32767对应0—100℃的温度值。然后计算出1℃所对应的数字量是327.67。如果想把温度值精确到0.1℃,把327.67/10即可。
模拟量控制包括:反馈控制、前馈控制、比例控制、模糊控制等。这些都是PLC内部数字量的计算过程。
3、脉冲量是其取值总是不断的在0(低电平)和1(高电平)之间交替变化的数字量。每秒钟脉冲交替变化的次数称为频率。
PLC脉冲量的控制目的主要是位置控制、运动控制、轨迹控制等。例如:脉冲数在角度控制中的应用。步进电机驱动器的细分是每圈10000,要求步进电机旋转90度。那么所要动作的脉冲数值=10000/(360/90)=2500。
PLC编程算法(二)——模拟量的计算
1、 -10—10V。-10V—10V的电压时,在6000分辨率时被转换为F448—0BB8Hex(-3000—3000);12000分辨率时被转换为E890—1770Hex(-6000—6000)。
2、 0—10V。0—10V的电压时,在12000分辨率时被转换为0—1770Hex(0—6000);12000分辨率时被转换为0—2EE0Hex(0—12000)。
3、 0—20mA。0—20mA的电流时,在6000分辨率时被转换为0—1770Hex(0—6000);12000分辨率时被转换为0—2EE0Hex(0—12000)。
4、 4—20mA。4—20mA的电流时,在6000分辨率时被转换为0—1770Hex(0—6000);12000分辨率时被转换为0—2EE0Hex(0—12000)。
以上仅做简单的介绍,不同的PLC有不同的分辨率,并且您所测量物理量实现的量程不一样。计算结果可能有一定的差异。
注:模拟输入的配线的要求
1、使用屏蔽双绞线,但不连接屏蔽层。
2、当一个输入不使用的时候,将V IN 和COM端子短接。
3、模拟信号线与电源线隔离 (AC 电源线,高压线等)。
4、当电源线上有干扰时,在输入部分和电源单元之间安装一个虑波器。
5、确认正确的接线后,首先给CPU单元上电,然后再给负载上电。
6、断电时先切断负载的电源,然后再切断CPU的电源。
PLC编程算法(三)——脉冲量的计算
脉冲量的控制多用于步进电机、伺服电机的角度控制、距离控制、位置控制等。以下是以步进电机为例来说明各控制方式。
1、步进电机的角度控制。首先要明确步进电机的细分数,然后确定步进电机转一圈所需要的总脉冲数。计算“角度百分比=设定角度/360°(即一圈)”“角度动作脉冲数=一圈总脉冲数*角度百分比。”
公式为:角度动作脉冲数=一圈总脉冲数*(设定角度/360°)。
2、步进电机的距离控制。首先明确步进电机转一圈所需要的总脉冲数。然后确定步进电机滚轮直径,计算滚轮周长。计算每一脉冲运行距离。最后计算设定距离所要运行的脉冲数。
公式为:设定距离脉冲数=设定距离/[(滚轮直径*3.14)/一圈总脉冲数]
3、步进电机的位置控制就是角度控制与距离控制的综合。
以上只是简单的分析步进电机的控制方式,可能与实际有出入,仅供各位同仁参考。
伺服电机的动作与步进电机的一样,但要考虑伺服电机的内部电子齿轮比与伺服电机的减速比。
PLC中重要的三个点:开关量、模拟量、脉冲量。只在搞清楚三者之间的关系,对于掌握PLC就不会有太大的问题。
相关问答
初学者想系统的学习PLC,请问应该怎么学?有没有好的学习方法或学习步骤?
大家好,我是王俊杰,做项目的,从2010年接触电气自动化编程到现在已经有11年时间了。还记得第一次做工程的情景,那是一个夏天,天气炎热,我负责做公司PLC编程...现...
plc如何处理电流信号的?即如何处理4mA到20mA的电流信号?
4-20ma...不清楚一般音乐喷泉来采集音量信号。一般我们采集噪声音量使用噪声传感器,你要是要求精度不高可以淘宝买个便宜点的(距离远的话传感器信号...
工业自动化控制最主要有DCS和PLC,这两种方式怎么样?
科技引领生活,爱科技的小青年带你在科技的海洋里无限遨游……工业自动化,最常用的产品,DCS,PLC,两者的技术水平已经很高了,我们经常在大型的工厂中见到这两...PL...
西门子plc控制泵机启停选择控制方案?
西门子PLC控制泵机的启停需要考虑到多方面的因素,包括泵的类型、流量、压力、启停条件等。以下是一些常见的控制方案:1.模糊控制(FuzzyControl):模糊控制是...
如何用西门子plc和变频器控制电机正反转,加减速和启停?
这个问题就相当于要问我如何实现升降机的控制或者说卷扬机的控制!这个说句实话,一两句说不清楚,涉及到图纸,接线,plc程序,开关位置的设定,变频器的参数设...
PLC与伺服电机的连接-懂得
一、触摸屏、PLC、伺服控制器、伺服电机之间的连接顺序如下:通过专用的数据线,就可以将他们有机的联系起来,构成一套比较完整的自动化控制系统。二...
倍福嵌入式控制器是用什么语言来编程?
倍福的嵌入式控制器可以用多种语言来编程!打开编程软件一看就知道,网络不好我就不上图了,它支持IL,ST,SFC,FBD,CFC,LD这几种编程语言,应该说很多欧美的...
关于PLC的职业规划和前景?
由于PLC应用向智能化和网络化方向发展(智能化是指PLC应用除具有传统的顺序控制功能外,还增加了用于过程控制和位置控制的各种专用接口及智能控制算法;而...对于...
学习pLC有前途吗?
您好,小吴帮您回答。PLC的学习不能说有没有前途,应该说PLC这个行业,或者说自动化这个行业有没有发展,有没有前途,我个人就是自动化专业,觉得还是很好的一...许...
PLC与DCS的联系与区别?
这么说吧,以前的DCS是电脑的主机卡槽里带I/O卡,信号直接传到电脑里,然后电脑进行逻辑运算。几台电脑之间用局域网通信。FCS,就是PLC组成的控制系统,信号传...