[西门子] 如何在s7-1200PLC上实现流量累积算法讲解

[复制链接]
查看239 | 回复0 | 2024-4-26 08:48:40 | 显示全部楼层 |阅读模式
在使用s7-1200PLC编写程序的时候,如果项目上需要用到流量累积功能,但是本款PLC并没有自带流量累积功能块。这时,就需要我们组态工程师自己编写一个具有流量累积功能程序,或者将该程序封装为FB块或者FC块。本文以封装FB块为例。


第一步:在程序块目录下单击添加新块,弹出添加新块对话框,选中FB函数块,在名称栏填上需要命名的名字,如:Totalizer,选择编程需要用的编程语言,本文以SCL语言讲解,FB块的编号可以通过手动或自动生成,然后单击确认,如下图所示


第二步:打开新建功能块,并建立临时变量,如下图所示


第三步:程序编写,如下图所示:



程序编写完成后,进行编译,编译没有错误时,在FC(FC2,FLOWACCUM)中调用该FB块,最后在OB30中断块中调用该FB块。


第四步:在FC中调用名字为“Totalizer”的FB块,并对输入输出参数赋值,如下图所示



再在OB30中调用功能块,OB30中断块是循环中断块,循环时间为100ms,如下图所示



双击循环中断OB30中断块,在中断块中调用FC2(FLOWACCUM)功能块,如下图所示

程序解读:


变量定义:
变量名:Reset,数据类型:Bool,作用:累积清零
变量名:Accum,数据类型:Real,作用:存储累积值
变量名:Total,数据类型:Real,作用:存放累计值
变量名:Intervall,数据类型:TIME,作用:流量单位中的时间,如m3/h,则:变量为1h=3600s,变量单位:秒
变量名:Intervall_DInt,数据类型:Dint,作用:存储Intervall转换为Dint数据类型后的值
变量名:Intervall_Real,数据类型:Real,作用:存储Intervall_DInt转换为Real数据类型后的值
变量名:Cycle,数据类型:TIME,作用:存储程序循环时间,单位:秒
变量名:Cycle_DInt,数据类型:Dint,作用:存储Cycle转换为Dint数据类型后的值
变量名:Cycle_Real,数据类型:Real,作用:存储Cycle_DInt转换为Real数据类型后的值


程序代码:
IF #Reset = true THEN //条件为真时
#Accum := 0.000000e000; //累积清零
#Total := 0.000000e000; //累积清零
ELSE
#Intervall_DInt := TIME_TO_DINT(#Intervall);//将时间型变量Intervall转换为双整型数据,并存在变量中
#Intervall_Real := DINT_TO_REAL(#Intervall_DInt);//将双整型数据转换为实型数据,并存在变量中
#Cycle_DInt := TIME_TO_DINT(#Cycle);//将时间型变量Cycle转换为双整型数据,并存在变量中,本例为0.1s
#Cycle_Real := DINT_TO_REAL(#Cycle_DInt);//将双整型数据转换为实型数据,并存在变量中
#Accum := ((#Value * #Cycle_Real) / #Intervall_Real) + #Accum;//累积计算
#Total := #Accum; //Kopiere Ergebnis nach #Total / Copy result to #Total.//累计值传递
END_IF;


(文章来源网络仅供参考。评论处大家可以补充文章解释不对或欠缺的部分)



上周五互动答案揭晓

答案:
这是一个单按钮启停的程序,所以每次按按钮,程序只能执行一遍。
第一次按下X0按钮,执行第一行,set Y0 ,导通,执行第二行触发M0线圈,M0常闭触点断开,无法执行RST Y0,这时Y0点亮。
第二次按下X0按钮,由于Y0有输出,Y0常闭触点断开,无法执行SET Y0,无法导通M0线圈,程序只能执行最后一行,由于Y0有输出,所以Y0常开触点导通,m0线圈没导通,所以M0常开触点会导通,这时触发了RST Y0指令,Y0停止输出。
第3第4次和第1第2次的执行过程一样

了您的



免责声明:如果侵犯权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则