基于西门子博途电机运行时间的先起先停控制
这是我同事在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:定义映射连续位的数量;博途工控人平时在哪里技术交流博途工控人社群
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!