西门子模块6ES7231-7PB22-0XA8诚信经营
西门子模块6ES7231-7PB22-0XA8诚信经营
在使用西门子编程的时候我们会经常使用定时器计数器,在调用定时器和计数器的时候,会自动弹出一个调用选项的会话框生成一个对应的db块。但是每一个定时器或者计数器单独生成使用一个db快会占用太多的内存,而且编程上看上起也比较乱,学会使用多从背景数据块db,可以规范管理计数器定时器db块的使用。
首先以tia博途软件为例如下图新建一个全局的db块,此处命名iec定时器,这样项目程序用到的定时器我们都在这一个db块进行定义和管理。
接下来打开刚才新建的全局db块,新定义一个iec_timer的定时器名字可以随意定义此处命名ice_tinm1如下图,在这里我们用多少就可以定义多少。
定义完成后在添加定时器或者计数器的时候会自动弹出一个调用选项的窗口,不要选择确定,选择取消从而不会对此定时器生成对应db块。如下图:
选择取消后程序的定时器就不会有对应的名称,只有问号,我们双击问号然手点击右侧的一个菜单栏图标 的图标就会弹出程序所有定义的db块,然后点击我们定义的全局db块后面的>>就可以进入到该db快的内部
进入db快找到刚才定义的定时器如下图点击
点击后还会在我们定义的定时器的名字后面生成一个.并且有一个对话框,对话框本来是选择该定时器输入或者输出端的,此处选择无即可,如果你要用定时器的输出位,此处会有对应q输出点可以选择使用。
这样我们用多少定时器都可以在一个背景数据块进行定义和使用,当然用博途软件有一个好处就是变量可以随意拖拽,我们可以不用那么麻烦找变量,打开双窗口功能(垂直拆分编辑器功能),将定时器变量直接拖到要用的定时器上方的对应位置就可以,这都是使用小技巧。
很多新手都会问,fc和fb到底什么区别呢?该怎么使用呢?其实很简单啦,仔细阅读下面内容就能理解哦!
fc块讲解
首先,我们从两者的名字就可以进行区分,可以用一个公式即fb=fc+db来表示,fb是具有db背景块的特殊fc,也就是说fb具有fc的功能,同时拥有一个db块。fc全称是function函数。
注:db块 全称datablock 数据存储区域,类似数据库中关系表结构。
那首先什么函数呢?
函数
函数 f(x)就像机器或黑箱,给予输入值x便产生唯一输出值f (x)。x是自变量,f(x)是因变量。举一个我们常见的公式,求圆的面积,s=π*r*r。输入r值,便得到圆的面积s,这就是简单的函数,r是自变量,s是因变量。
图一 变量声明
图2 fc函数内容
bbbbb:输入型参数,提供外部输入接口。类似于函数f(x)中的x,是一个自变量。bbbbb类型参数,是外部变量的拷贝副本,修改其值,外部变量无变化。假设在程序中修改r的值,从图2编译信息发现,传递的并不是实际参数,所以修改外部接口变量无变化。
output:输出型参数,提供外部输出接口。该类型参数由于直接引用外部变量地址,可以修改其值。
inout:输入输出型参数,既做输入又做输出。同output类型一样,可以修改外部接口变量的值。在适当地方,使用inout类型变量,可以减少占用的变量声明空间。
temp:局部变量,在函数内部使用,不提供外部的接口。我们常常把temp变量用于数据转换的中间值,或者用于循环变量,比如用于for 或者while循环。由于temp是局部变量,它的值是随机,使用必须初始化,对其赋值。
constant:常量,在函数内部使用,意思是恒定不变的变量,只能在声明处修改。比如我们这里的π圆周率是固定不变的,可能调用的地方有几十处,若程序中直接引用3.1415,后期修改,需要把每个地方都修改过去,很麻烦。在声明处修改π值,所有函数中的π变量都会修改。假设我们在程序中修改π常量,从图2中编译信息可以发现,常量不能在程序中修改。
return:函数返回值,存储计算结果。默认为无返回值,所以声明为void。在我们的数学知识里面函数应该是要有返回值的,但是在tia portal可以没有返回值,我们把这种无返回类型的函数,称为procedure(过程)。我们这里设置为real类型,返回圆的面积。有读者可能有疑问,return变量和output类型都可以用来存储计算结果,两者的区别是什么呢?其中有一个显著的区别是output类型输出参数可以声明若干个,但是return类型的返回变量,只能声明一个,且变量名字无法修改。其他区别,等讲解scl的时候,再做解答。
在main[ob1]程序块里面拖动fc1函数,得到如下运行结果:
图3 程序运行结果
图4 db块值监控
程序解读:
由于plc程序是从左到右执行,所以"func"函数块的左侧是输入接口,右侧是输出接口。观察函数块的内部变量名字,发现和函数中的声明一一对应,除了;变量。ret_val是return接口;变量的别名,由于每个函数的名字都不一样,所以统一用;作为函数返回值变量的名称。
程序一是对模拟量值进行转换,采样的分辨率下限是0,上限为27648,采样的数字量值15000,通过调用指定函数把转换出来的值放在变量<"data".电压值>;,得到转换值为0.5425347.
把变量<"data".电压值>;放在fc函数的inout接口中,利用plc的扫描周期,通过;db块可以看到终值5.425347。若不放在inout,把其放在bbbbb接口,我们必须在output接口再声明一个变量,用于存储终的转换值。这样声明就可以节省plc的内存空间了,同样使程序看起来更简洁。
fc函数块的代码内容比较简单,请自行阅读理解,若有问题,可以留言。
fb块讲解
要了解fb和fc的区别,让我们剖析一下这两个模块的变量声明结构:
图5 fb块变量声明
图6 fb占用db背景块内部变量
通过fb和fc的变量声明,我们可以看到三个明显的区别:
1、fb块增加了static静态区声明
2、fb增加了保持性和可访问性选择
上述两个区别正好说明了fb=fc+db公式的成立,因为这两个特性是db块才有的特性哦。我们在普通db块里面声明的变量都在static区声明,不信的话,你可以打开来看看。我们可以通过访问fb拥有的背景块来访问fb中变量的值。
当fc调用结束后,各种接口中声明的变量值无法保存,fb调用结束后,仍然可以保留变量的值,你可以通过fb的背景db块进行访问。fb的每次调用都会自动生成一个db块,想想我们编程当中,进行哪类操作也会有类似行为?其实就是我们用的非常频繁的定时器操作,每一次拖动;定时器都会自动建立一个db块。通过<系统资源>;查看定时器拥有的db块,看看和图6是否类似。
图7 定时器db背景块结构
由于定时器拥有背景块,当我们停止计时后,plc无论经过多少个扫描周期,还是可以读取停止计时时刻的值,这就是拥有db背景块的好处,fb块与此类似。
3、fb块没有return接口
由于可以通过output接口存储返回值,所以没有return接口影响不大。
图8 fb程序增加部分
由于程序类似,fb程序只列出增加部分。我们可以看到该程序,每次调用都会把大电压值放在;变量中,同时添加;变量,用于记录改变电压的时间。在程序上面,我们可以很方便读取这两个变量,来实时获取当前的大电压值和修改时间,是不是很方便?
读者可能会有疑问,如果我自己写一个fc函数,然后外部添加一个db块,不是一样可以实现此功能吗?看上去好像讲的很有道理呀,不过这个想法是错误的。
如果你在plc程序中只调用fb块一次,那么可以采用此方法。如果你在plc程序里面,既要比较电压,还要比较如电流、温度和湿度等,如果用同一个fc怎么实现呢?用fb可以很好的解决此问题,不明白的,可要仔细想想!
关于fc和fb的区别已经讲完,如果仔细阅读,应该能搞清楚这两者的区别。若还有问题,欢迎留言,同时欢迎指出本文的错