Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >S7-SCL流量累积功能<源码>

S7-SCL流量累积功能<源码>

作者头像
科控物联
发布于 2022-03-29 12:46:14
发布于 2022-03-29 12:46:14
1.7K01
代码可运行
举报
文章被收录于专栏:科控自动化科控自动化
运行总次数:1
代码可运行

函数块 'Totalizer' ,可以计算出一个瞬时流量的累积值。

描述 例如,在测量流量或线速度时,可以使用距离或体积作为物理量,使用毫秒,秒,分钟,小时或者天作为测量时间的单位。

图 01

"Totalizer" 功能块必须在循环中断(比如OB30)中调用,表 01 是 "Totalizer" 功能块的输入和输出变量列表

参数

变量

数据类型

描述

输入

Value

Real

瞬时流量

输入

Interval

Time

瞬时流量的时间单位

输入

Cycle

Time

扫描时间(循环中断周期)

输入

Reset

Bool

累积值清零

输出

Total

Real

累积值输出

表 01

在一个循环中

  1. 输入变量 "Interval" 和"Cycle" 数据类型 Time 被转化为 Real 类型。
  2. 转化后的值被转移到临时变量 “Interval_real” 和 “Cycle_real”。
  3. 变量 "VALUE" 的输入值乘以临时变量 "Cycle_real" 的值,然后除以临时变量 “Interval_real”。
  4. 结果存储在静态变量 “Accum” 的缓冲区。

这样每次循环之后,中间结果值存储在“Accum” 的缓冲区中递增,然后转移到输出变量“Total” 中。如果变量 “Reset” 有“True” 值,则变量 “Total” 输出值被复位为零。

例子: 在图 01 的例子中,“Value” 变量值是 60.0 ,同时变量 “Interval” 的时间值是一分钟。

  • 输出变量 "Total" 在1 分钟内从1累加到了60。
  • 周期时间 100ms 反映了FB"Totalizer"的执行过程中的扫描时间。
  • 当FB在循环中断中被调用时,程序每隔 100ms 处理一次而且程序是独立于 OB1 (主程序)的。

被测量值 "Value" (速度或流量)的计量单位可以是米每秒,立方米每分钟或公里每小时。这时变量 "Interval" 必须输入对应的间隔时间,例如,

  • 米每秒:T#1s
  • 立方米每分钟:T#1M
  • 公里每小时:T#1h

图 02

附件 "48799854_Totalizer_Lib_TIA_Portal" 的库中包含上述的"Totalizer"功能块。功能块中包含SCL程序并附有德文和英文的注释。

复制压缩文件到一个单独的目录,然后双击启动文件解压。此时库会自动解压所有相关的子目录。然后在 STEP 7 (TIA Portal) 中打开这个库,并可以添加到S7-1200/S7-1500的项目中使用。

SCL功能库Totalizer:

定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   VAR_INPUT 
      Value : Real;
      Intervall : Time;
      Cycle : Time;
      Reset : Bool;
   END_VAR

   VAR_OUTPUT 
      Total : Real;
   END_VAR

   VAR 
      Accum : Real;
   END_VAR

   VAR_TEMP 
      intervall_real : Real;
      cycle_real : Real;
      intervall_dint : DInt;
      cycle_dint : DInt;
   END_VAR

功能实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  IF #Reset = true THEN
      #Accum := 0.000000e000; //
      #Total := 0.000000e000; //The variables will be set to zero.
  ELSE
      #intervall_dint := TIME_TO_DINT(#Intervall);
      #intervall_real := DINT_TO_REAL(#intervall_dint);
      #cycle_dint := TIME_TO_DINT(#Cycle);
      #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;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验