首页 上一页 1 2 3 下一页 尾页

(已结束)工控PLC擂台第8期--状态轮换程序。 点击:6442 | 回复:46



云锋

    
  • 精华:1帖
  • 求助:4帖
  • 帖子:252帖 | 5541回
  • 年度积分:0
  • 历史总积分:30376
  • 注册:2005年6月24日
发表于:2010-10-22 12:12:30
楼主

6台电机,按运行次数轮换。1#电机运行,满足停机条件后,自动停止,下次启动时,启动2#电机,若2#电机故障,则启动3#电机,依次类推。写出轮换程序,并对程序作相关说明,PLC品牌不限。

工控PLC擂台每周一期,本期下周末结贴。奖项设置:一等奖1名:50MP,二等奖5名:10MP,三等奖10名:30积分。

MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。

MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。




gwer789

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 362回
  • 年度积分:845
  • 历史总积分:1014
  • 注册:2011年6月22日
发表于:2015-07-07 20:21:00
41楼

g下来学习,学习,谢谢楼主

gwer789

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 362回
  • 年度积分:845
  • 历史总积分:1014
  • 注册:2011年6月22日
发表于:2015-07-07 20:33:26
42楼

不能出全图为什么为什么

丁昆

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:557
  • 注册:2017年10月11日
发表于:2018-08-28 13:08:26
43楼

      关于轮换,在实际工程中有很多应用,抛开此题的限制,给大家整理一下本人的思路和程序,和大家共勉。

     本人在工作中碰到的最多的单组设备为24台(设为M),也就是在M台中选取指定的台数n(设为n)开启,并且按照一定的优先级(本人碰到最多的就是按照实际运行时间长短,优先开启运行总时间最短的,优先关闭运行总时间最长的)开启或关闭设备。

     基本的思路已经出现,那就是优先级(这里是运行总时间,当然你可以设为其他)的比较决定了程序要去开启哪些或者关闭哪些,PLC程序运行的规律是从上而下,逐条运行的,碰到一下要开或者关几台怎么处理,我的思路是让程序一个周期只去处理一台,几个扫描周期一过总是可以达到要求(当然可以一起处理,无非程序多一个外置循环)。十几个毫秒的延时我认为在绝大多数系统中都是可以接受的,当然本人也没做过要求开启或者关闭绝对同步的系统。

      在实际工程中,一般电机\水泵\风机(本文以下就称电机了)没有运行总时间的点,反而有很多远程(REM)、运行(RUN)、故障(ERR)这种开关量状态点,这种是反映电机的基本状态,当然要考虑进去,当电机都不属于远程的控制位置,我们还能去控制它么?同样,当我们PLC驱动指令发送出去了,几十秒过去了运行信号还没出现(有的电机没有运行信号反馈,那是另外一回事),这个电机一定是不可靠的,不能再继续驱动下去了;故障更不用说了,那是一定要停止电机驱动的。

      从上面可以我们可以得到几个要素:这一组电机的状态点、每个电机的运行总时间、这一组电机的总数量M、需要驱动的数量n、这一组电机的驱动点.我们要得到的是一个类似于完成调度功能的一个程序,让它决定哪些电机驱动点为1,哪些为0就可以了。这个程序最好已经打包成一个子程序,接口应该已经标准化了,而且总数量最好可以变更(驱动数量一定是可以变的,不然就没有意义了),下面以SMART200为例,看一个简单点的调度子程序(电机总数量上限为3):

image.png

      可能有点懵,从最简单的说起,运行总时间怎么求,这个对有点工作经验的人来说很简单,电机的运行信号加上SM0.4/SM0.5啊,什么定时器啊都可以,只要求出来累计值即可。当然电机如果没有运行信号的话那就用驱动信号,反正系统设计就这鸟样也没办法。大家各显神通,本人就如下图处理的:

image.png

当然如果甲方需要把运行时间列到界面上去的话,就是处理一下得出天数、小时数、分数就可以了,这里就不啰嗦了。注意,每个设备运行总时间的求取和计算也放一个单独的子程序里面最好。

     驱动数量n是一定要写到子程序的引脚上的,毫无疑问,这个是核心。然后电机的驱动点也要连接,这里是分开连接的,用的是IN_OUT,而不是用OUT,什么原因说起来太长,这要另起一篇,就算了,有空再阐述一下。再看一下这个程序的引脚:

image.png

    我们知道SMART200里面子程序的引脚个数不能超过16个(我也是搞到一半才发现的),那么已经有了3个运行时间、3个驱动、1个数量,运行时间为REAL的,不能打包;3个驱动也不好打包(有的人为图省事直接要连Q点的话,打包会出问题),那么只能打包这一组电机的运行状态了,从引脚上看,我们给程序传送的是一个双字(dword)的SB_STATUS变量,那么其有32位,可以容纳32个开关量,于是在子程序中开头就有了如下声明:

image.png

对这个传送进程序的双字有了严格的格式规定:bit0为远程点,bit1为运行点,bit2为故障点,bit3为软件故障(可以理解为逻辑错误、软件内部错误什么的),bit4为禁用(实际运行中,甲方检修什么的可以使用),每个字节以此类推,这样子程序就能获取这一组电机中每个电机的当前运行状态。我们于是可以在子程序中计算出当前运行的电机数量和当前电机的可用数量。我们可以用一个临时变量#TE2代表当前运行的电机数量,注意在子程序中应该把已驱动的当成已运行的,此处不能使用运行信号,因为运行信号反馈有延时,等到它反馈到了PLC,黄花菜都凉了,所以我们不能等,驱动给出了就认为已经运行了,至于驱动给出几秒后运行信号没来就交给专门的错误判断程序去处理,到时候反馈个软件故障点位给这个子程序就好了(此时bit3就用上了)。如下图所示:

image.png

     有了已运行数量,我们看看可用数量的定义:在该组中处于远程控制状态并且没有故障并且没有软件故障并且没有禁用的电机数量。字面看上去复杂,用程序就简单多了:

image.png

     最终我们可以得到#TE1也就是可用数量和设备的可用标志位L23.1等等,当然在进入子程序时,要把#TE1和#TE2都置零,这个就不截图了。此时,子程序就可以看到所有设备的状态了,发现谁不可用了自然要关闭它的驱动了:

image.png

      到此为止,我们手上有了3个数量:已运行数量#TE2、可用数量#TE1、驱动数量n。此时如果发现驱动数量大于可用数量怎么办?比方说1#、2#、3#电机其中1#电机被禁用、2#电机出现故障,那只有3#电机可用了,此时如果驱动数量为2的话就尴尬了,子程序当然不会允许出现此类情况:

image.png

      我们引入一个DR_NUM_XZ的变量作为修正,让驱动数量不会超过可用数量(原谅我的英文太差,XZ用的是拼音),并且我们命名其为拟驱动数量。此时有了已运行数量和拟运行数量,相等就是最好了,皆大欢喜什么都不用动保持原状就可以了,如果不等,那么问题就来了,也就是核心问题,开始比较优先级了,先用文字说明:如果拟运行数量大于已运行数量,子程序应该从没有运行的可用电机中找出运行总时间最短的一台电机,置位对应的驱动;如果拟运行数量小于已运行数量,子程序应该从已运行的电机中找出运行总时间最长的一台电机,复位对应的驱动。程序了解一下:

image.png

       此时,我们用的是穷举(上限为3,就不用丧心病狂的循环和指针了)和冒泡比较法(基本的编程算法最好了解下吧,有用的),来找出该组电机中已运行并且运行总时间最长的那一个(CLOSEID)可用但是没有运行并且运行总时间最短的那一个(OPENID),如果没有找到那就是0。

      有了CLOSEID和OPENID就简单了,我们只需轻轻的复位和置位该输出就完成了:

image.png

image.png

      至此,该功能块已编程完成,我们可以得到一个最多3个设备一组的调度块(SBTHREE)并且可以利用它完成很多很多的功能。比如自动轮换、优先级设定、备用自投。我们在实际工程中,用SMART最多编制成4个设备一组(SBFOUR)。至于24个设备一组的,当然是300/400PLC的活了,可能下次有时间和兴趣再和大家一起拆解玩玩。

     胡说八道这么多,水平一般,大家见笑了,也希望大家能共同学习,共同进步!

xyl35

  • 精华:2帖
  • 求助:0帖
  • 帖子:5帖 | 75回
  • 年度积分:0
  • 历史总积分:130
  • 注册:2009年2月06日
发表于:2019-11-24 00:17:49
44楼


回复内容:

对: 丁昆       关于轮换,在实际工程中有很多应用,抛开此题... 内容的回复!

-------------------------

谢谢你的分享,有两个地方没看懂,还希望能指教一下。为什么最后面的两个临时变量OPEN_ID和CLOSE_ID可以对于2或者3 ?程序在后面也没有加的指令赋值。还有就是上面AC1和AC2 每次扫描周期都会赋值吗?AC1=-0.1和AC2=5.256E+007.没看懂。程序最后LBL 2之后是不是就写完了。

夏居然

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:557
  • 注册:2017年10月11日
发表于:2020-01-03 22:32:23
45楼


回复内容:

对: xyl35 回复内容:

-------------------------

OPENID和CLOSEID指向的就是下一次要开或者要关的设备编号,截图没办法全部截出来,你可以自己仿照上面的思路写出来。程序到LBL2之后就没了。具体可以去B站搜索我的视频---夏工说工控-从SMART开始(10)

空城11

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2017年10月12日
发表于:2020-02-23 05:25:30
46楼

回复内容:

对:夏居然 回复内容:对: xyl35 回复内容:-------------------------OPENID和CLOSEID指向的就是下一次要开或者要关的设备编号,截图没办法全部截出来,你可以自己仿照上面的思路写出来。程序到LBL2之后就没了。具体可以去B站搜索我的视频---夏工说工控-从SMART开始(10)     内容的回复:

大佬,b站视频讲的太好了,可否把程序分享一下。


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页