基于西门子博途电机运行时间的先起先停控制

2023-12-21 22:01

本文主要是介绍基于西门子博途电机运行时间的先起先停控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是我同事在2019年做的一个功能,基于这个功能,可以形成类似的其他更多的功能,这些功能在一些项目上的实用性还是比较强!

1,控制目标博途工控人平时在哪里技术交流博途工控人社群

根据需要启动电机的数量,按照以下规则进行控制:

        a,故障及手动状态的电机不参与自动控制;

        b,运行时间短的电机优先启动;

        c,运行时间长的电机优先停止;

2,实验环境

操作系统

Windows7 Ultimate SP1

编程软件

TIA Portal V15.1 Update3

系统硬件

CPU1215C 6ES7 215-1AG40-0XB0 V4.2

3,实现方案

     在OB1里调用MotorCtrl的FB,用于控制电机的先起先停程序。

    3.1 电机控制算法

      a,根据电机控制的重复性,建立一个数据类型Motor,包含电机的状态变量:启动/停止/运行/故障/手动;

图片

                           

      b,在FB中建立InOut变量MotorStatus,用于记录所有电机的状态,由于电机数量不确定,我们可以建立一个可变数组;

图片

      c,编写电机控制程序,首先引入3个变量:

图片

        1, #Num.Running:已运行电机的数量;

        2, #Num.NeedStart:需要运行电机的数量;

        3, #MotorOrderNum,数组变量,用于定义电机运行时间的由短到长的电机编号,即MotorOrderNum[1]是运行时间最短的电机编号:

当#Num.Running小于#Num.NeedStart时,由MotorOrderNum[1]开始寻找启动没有启动,没有故障,不在手动状态的电机;

图片

  

当#Num.Running大于#Num.NeedStart时,由MotorOrderNum[max]开始反向寻找已启动的电机停止;

图片

        d,电机启停控制及状态统计

图片

 

    3.2 运行时间统计算法

  对于S7-1200/1500的PLC,可以使用Runtime指令对电机运行时间统计:

    a,在FB的Static里建立3个变量:

图片

1,#Run_Time::用于记录程序每次循环的时间;

2,#TimeMemory:中间变量,用于记录调用RUNTIME指令的时间点;

3,#Total_Run_Time:用于记录总循环的时间;

    b,调用RUNTIME指令,计算所有电机的运行时间:

图片

 

    3.3 先起先停算法

   由于需要把电机按照运行时间的长短进行排序,我们建立两个临时变量用于存储运行时间最短的电机编号及时间,同时实时和其他电机数据进行比较:

    a,在FB的Temp里建立2个变量:

图片

 1,#Temp_Min_Num::运行时间最短的电机编号;

 2,#Temp_Min_Runtime:运行最短的时间;

    b,确定运行时间最短的电机编号及时间,确定MotorOrderNum[1]的电机编号:

先把1#电机的编号及时间设为#Temp_Min_Num和#Temp_Min_Runtime,调用循环,从第2台电机开始进行比较,如果比第一台电机的时间短,则把当前电机的电机编号和时间赋值给#Temp_Min_Num和#Temp_Min_Runtime;

图片

    c,依次确定时间由短到长的电机编号,依次填入MotorOrderNum[2]…:

图片

  上述嵌套循环用于确定除已确定电机序号MotorOrderNum[]以外的电机的#Temp_Min_Num和#Temp_Min_Runtime两个变量的值,具体思路如下:

在b步骤里,MotorOrderNum[1]的电机编号已确定,如果想找MotorOrderNum[2]的电机编号,则从第1台电机开始搜索,如果第一台电机的编号1等于MotorOrderNum[1],则跳过对#Temp_Min_Num变量进行赋值,进行下个循环,这时就把第二台电机的编号2赋值给#Temp_Min_Num;如果第一台电机的编号1不等于MotorOrderNum[1],则把第一台电机的编号1赋值给#Temp_Min_Num;同理,如果想找MotorOrderNum[3]的电机编号,则从第一台电机的编号开始和MotorOrderNum[1]和MotorOrderNum[2]的数据比较,相同则跳过赋值#Temp_Min_Num,不同则把当前的电机编号赋值给#Temp_Min_Num,#Temp_Min_Num和#Temp_Min_Runtime赋值完成后,退出循环;

图片

  在确定了#Temp_Min_Num和#Temp_Min_Runtime后,我们依次把除已确定顺序的电机的运行时间分别与#Temp_Min_Runtime进行比较,找到最小值后,把该电机的编号赋值给MotorOrderNum[]…按顺序依次确定好MotorOrderNum数组的值。

    3.4 IO映像区读写算法

  在确定好电机启动顺序后,需要把PLC的IO点和电机的状态映射:

  1,电机的故障信号(#MotorStatus.fault)映射到DI区,即通过DI点读取电机的故障信息;

   2,电机的运行信号映射DQ区,即把电机的运行信号(#MotorStatus.run)传输到DQ点,作为电机的使能信号;

   PLC的DI/DQ点选择建议是连续的点,不连续则需要多次调用FB(IO-Mapping)进行映射。

图片

FB的管脚定义如下:

 MappingArea:String:定义需要映射的区域,I/Q/M/DB;

 Function:Bool:定义读写,0=read,1=write;

 StartAddr:Real:定义位的起始地址;

      Count:Int:定义映射连续位的数量;博途工控人平时在哪里技术交流博途工控人社群

这篇关于基于西门子博途电机运行时间的先起先停控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/521632

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取