6台泵自动轮换问题 点击:0 | 回复:88



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14399帖 | 54471回
  • 年度积分:0
  • 历史总积分:579
  • 注册:2008年9月08日
发表于:2004-03-05 10:48:00
楼主
有一变压器冷却项目,1台变压器有6台冷却泵,A.当变压器低压侧(二次输出)投入时,需要轮换启动2台冷却泵(即每隔2小时 轮换启动,每次要保证有2台泵运行);B.当变压器高压侧(一次输入)投入时,需要轮换启动3台冷却泵(即每隔2小时 轮换启动,每次要保证有3台泵运行),当冷却泵故障退出运行后,将按排列顺序自动启动备用冷却器。请问:如何对以轮换进行简单有效的组态? 当A条件向B转换时,怎样判断并启动第3台泵,当B条件向A转换时,怎样判断并退出第3台泵?循环排列方式要本着均衡、对称的原则。



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14399帖 | 54471回
  • 年度积分:0
  • 历史总积分:579
  • 注册:2008年9月08日
发表于:2004-03-05 12:27:00
1楼
怎么没有人回复阿?是我没有说清楚吗?

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-05 15:34:00
2楼
-----系统初始化(开始)------- 1.分配6个Word内存(水泵编号),将这6个Word内容分别初始化为1,2,3,4,5,6 2.定义变量:V1(需要开启台数)V2(当前开启台数)V3(水泵输出缓存)V4(循环计数器)V5(保存水泵编号首地址)V6(水泵运行输入缓存)V7(水泵故障输入缓存) ------系统初始化(结束)------- ------每隔2小时执行1次(开始)------- 1.用循环移位指令对6个Word进行移位(注意:每次必须移1个Word)。这样第一次移位后,数据应该是2,3,4,5,6,1下一次应该是3,4,5,6,1,2依此类推。 ------每隔2小时执行1次(结束)------- ------每次故障执行1次(开始)------- 1.将水泵切换程序执行1次。 ------每次故障执行1次(结束)------- ------水泵切换程序(开始)------- 1.将V2、V3和V5设置为0 2.循环:如果(V4 <= 6)并且(V2 <= V1)则->如果将"常数1"左移@V5(间接寻址)位,然后和V6和V7进行AND操作,如果结果位0(说明此泵未开,并且没有故障),则将V2加1。然后将结果对V3进行1次OR操作。 3.跳出循环后,将V3内容复制到物理输出。 ------水泵切换程序(结束)------- 如果条件A满足要求,则将V1设为2,如果条件B满足要求,则将V1设为3

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-05 15:36:00
3楼
补充:每隔2小时还应该将水泵切换程序执行1次。 :)

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14399帖 | 54471回
  • 年度积分:0
  • 历史总积分:579
  • 注册:2008年9月08日
发表于:2004-03-05 17:20:00
4楼
谢谢microtomato 还有没有更简单的方法啊?

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14399帖 | 54471回
  • 年度积分:0
  • 历史总积分:579
  • 注册:2008年9月08日
发表于:2004-03-05 17:27:00
5楼
microtomato: 能不能把程序贴上来,这样看的更好理解一些.

candy2000

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2004年3月04日
发表于:2004-03-06 13:03:00
6楼
to microtomato: 对你的方法,我有几个疑问,清执教: 1,定义变量:V4的循环计数是给哪个计数?V5(保存水泵编号首地址),这个在程序中怎么做? 2,能否将水泵切换程序在详细的说一遍。

candy2000

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2004年3月04日
发表于:2004-03-06 16:46:00
7楼
还有,我用的S7-300,再STEP7 V5.2里该如何定义V变量?

candy2000

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2004年3月04日
发表于:2004-03-06 17:02:00
8楼
定义的变量V能否用字代替?

肖工

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 333回
  • 年度积分:0
  • 历史总积分:631
  • 注册:2003年8月10日
发表于:2004-03-06 20:16:00
9楼
不要没事找事,用的着这样吗?这和在空调系统压缩机启动退出不是一回事吗?

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-07 22:07:00
10楼
回candy2000: 1.真够死板的:) 我这里的V1、V2等只是1个代号而已,你可以在符号表里面进行定义啊,比如V1代表DB1.DBW100,当然你也可以不起V1这样讨厌的名字。 2.V4的功能就是给循环体进行计数,每循环1次,该计数值+1。如果V4的值=6,则说明已经把所有的6台泵都检测过了,此时就可以退出循环。V2是当前已经开启的水泵台数,每当找到1台完好的泵,则该计数值+1。如果V2=V1,则说明已经开启了足够多数量的水泵,此时就退出循环。 3.V5这个变量的内容就是你存放“水泵编号”这块内存的起始地址。比如你把代表“水泵编号”的1,2,3,4,5,6放在了DBW100开始的6个字,那么V5就应该初始化为100,这样间接寻址时就会自动到DBW100去取数据了。如果V5=101,那么程序就去取DBW101的数据了。当然你也可以找块你喜欢的地方保存这些数据。 4.程序的运作方式就是这样: (a)每隔2小时(也就是你的切换时间)对6台泵的启动优先级进行排序。然后调用“水泵切换程序” (b)每次故障(无论哪台泵发生故障),都调用一次“水泵切换程序” (c)在“水泵切换程序”中,(1)首先将代表“当前水泵运行台数”的变量初始化为0(2)根据水泵的优先级依次检测水泵的启动条件是否满足要求,如果满足要求则开(并且把“当前水泵运行台数”这个变量+1),反之则找下1台。(3)如果“当前水泵运行台数”变量=“需要运行的台数”,则跳出循环(可以开的水泵已经够多了)。(4)如果循环了6次(你的水泵一共就6台)“当前水泵运行台数”还是小于“需要运行的水泵台数”,则跳出循环(所有水泵中就这么几台是好的)。(5)刷新输出。 5.这里的移位指令移位的具体位数就是“水泵编号”的值。比如1号泵就移1位,2号泵就移2位。(假设你代表水泵故障和水泵运行的输入端是从1开始的,比如I0.1是1号泵的运行,I1.1是1号泵的故障,如果从0开始,则前面的移位数就必须减1)这样你就得到了1个用于比较的参考值。然后将这参考值和故障输入和运行输入进行比较,将比较结果和输出缓冲或1下就能决定该泵是否运行了。 ------------------------------ 设你的I0.1~I0.6依次是1~6号泵的故障输入(如果故障,则对应输入端为on),I1.1~I1.6依次是1~6号泵的运行输入(如果运行,则对应输入端为on),I2.1~I2.6依次是泵的运行输出(如果运行,则对应输出端为on) 如果现在要知道2号泵是否可以运行:(1)将常数1左移2位,得到二进制0000000000000100,然后把整个故障输入取1下反再对该二进制进行一次AND操作,如果现2号泵没有故障,则得出结果仍然为0000000000000100,如果2号泵有故障,则结果为0000000000000000。此时再把整个运行输入取1下反,再对刚才的结果进行一次AND操作。如果2号泵没有运行,则原先为0000000000000100计算结果还是0000000000000100。如果2号泵已经运行了,则计算结果就是0000000000000000。经过2次判断后,将计算结果和输出缓冲区进行OR操作。这样就把2号泵的输出状态写下去了。这下应该明白了吧 :)

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-08 21:36:00
11楼
你的来信我已收到。问题的1,2,3请参考我在工控网上的回复。问题4:这个我也没办法,我没D版的Step7,所以无法做梯形图。也没机器测试。我在工控网上解释的还是比较完整的,你可以参考一下,有问题可以继续问。关于6个字循环移位的问题,你可以查看编程手册(手册在公司,没法翻),如果实在没有可用指令,可以自己实现(见附件1.gif)。

喜怒不行于色

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 94回
  • 年度积分:0
  • 历史总积分:105
  • 注册:2002年2月21日
发表于:2004-03-09 09:37:00
12楼
这个以前我夜曾经作过,我是这样做的: 1、 给1—6#泵各分配1个字,从DB6.DBW1~ DB6.DBW6,当字等于1时,就启动相应的泵,为零则停止,比如,当DB6.DBW1=1,启动1#泵,DB2.DBW1=1,启动2#泵; 2、 做6个循环体,即每台泵都有1个循环体,每个循环体被触发时,只循环一次,这6个循环体分别为(按泵的编号排列):1-2-3-4-5-6(1#泵的循环)、2-3-4-5-6-1(2#泵的循环)、3-4-5-6-1-2(3#泵的循环)、4-5-6-1-2-3(4#泵的循环)、5-6-1-2-3-4(5#泵的循环)、6-1-2-3-4-5(6#泵的循环)。由变压器的运行规程可知:低压侧正常情况下是一直投运,所以当2次投入时,即指定运行1、2#(1#比2#晚投运10秒,避免启动电流冲击),当1、2#泵延时运行2小时后,1#`停止即给DB6.DBW1赋0,然后指定启动2#,但此时2#认在运行,古轮换到3# 启动,如果3#切除或有故障,就轮换启动4#,如5#泵正常且未启动,就启动他,即停止循环,依次类推,直至1#泵的循环体执行完毕;如果3#泵正常,则启动3#泵,依次类推; 3、 当1次投入时,判断6台泵中,运行分钟数最少的泵,并启动他,循环或故障同上2一样;当1次退出时,判断6台泵中,运行分钟数最多的泵,并退出他。 请microtomato指正,谢谢!

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-09 11:30:00
13楼
re:无奈得人生 说得太客气了。 1.你采用独立的6个循环进行泵的选择有一个非常大的好处,由于程序是顺序执行的,所以就算不支持For循环的PLC也能够正常执行(兼容性好)。而我的程序对于不支持for循环的PLC就难以适用了(因为某些PLC的跳转指令不支持向前跳转)。 2.是不是应该增加1个“当前水泵运行台数”计数器,在执行循环体过程中,如果找到1台可用泵,则将计数器加1,当计数值到达“需要运行的台数”,则跳出循环。如果没有这个计数器,也许每次循环都会把6台泵都运行起来了。 3.你的程序每次只执行6个循环体中的1个。如果是这样的话,是不是可以把6个字合并成1个字(暂且命名为“循环体选择”)。若该变量=1,则执行循环体1,若为2,则执行循环体2。这样也许更直观些。 4.存放每台泵运行分钟数的变量的数据类型应该是DWORD,这样才够用,如果用WORD类型,则单台泵连续运行45小时计数器就会自动复位1次。 也许这些问题你都已经想到了(曾经做过的,自然有问题都已经解决了,现在是优化的问题了:) )。请多指教。

喜怒不行于色

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 94回
  • 年度积分:0
  • 历史总积分:105
  • 注册:2002年2月21日
发表于:2004-03-09 12:33:00
14楼
Microtomato兄: 对于你的第2个建议,非常的好,我的程序里没有做这个,谢谢 对于你的第3个建议,也可以这样做,要用脉冲来触发循环一次。 对于你的第4个建议,开始用的DB6.DBM(WORD),后来改成了DB6.DBD(DWORD)。 另外有个问题请教Microtomato: 6台泵的运行分钟数,找出其最大和最小的数,有没有简单明了的方法,我以前做的判断比较复杂,程序写的也比较长。

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14399帖 | 54471回
  • 年度积分:0
  • 历史总积分:579
  • 注册:2008年9月08日
发表于:2004-03-09 15:04:00
15楼
谢谢microtomato和无奈的人生,从2位的讨论中小妹我学到不少东西。

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-09 19:40:00
16楼
找最大值: 1.定义V1(当前参考值),V2(运行时间最长的泵号),V3(运行时间首地址) 2.将运行时间首地址赋给V3 2.V1=@V3(间接寻址),V2=1 3.将V1和@(V3+1)(间接寻址)进行比较,若小于,则(a):V1的值=@(V3+1)(间接寻址);(b):V2=V3-运行时间首地址 4.如果V3>(运行时间首地址+最大泵号),则退出。此时V2就是你要的结果。 ------------- 找最小值: 1.定义V1(当前参考值),V2(运行时间最短的泵号),V3(运行时间首地址) 2.将运行时间首地址赋给V3 2.V1=@V3(间接寻址),V2=1 3.将V1和@(V3+1)(间接寻址)进行比较,若大于,则(a):V1的值=@(V3+1)(间接寻址);(b):V2=V3-运行时间首地址 4.如果V3>(运行时间首地址+最大泵号),则退出。此时V2就是你要的结果。

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-09 19:43:00
17楼
补充:上面程序必须循环“最大泵号”次

countryboy

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2004年2月10日
发表于:2004-03-09 19:48:00
18楼
你何不试一下PLC控制系统

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-09 19:51:00
19楼
找最大值: 1.定义V1(当前参考值),V2(运行时间最长的泵号),V3(运行时间首地址) 2.将运行时间首地址赋给V3,V2=1 -------找最大值循环(开始)------- 3.如果V3>(运行时间首地址+最大泵号),则退出。 4.V1=@V3(间接寻址) 5.将V1和@(V3+1)(间接寻址)进行比较,若小于,则(a):V1的值=@(V3+1)(间接寻址);(b):V2=V3-运行时间首地址 6.V3=V3+1 -------找最大值循环(结束)------- 7.此时V2就是你要的结果。 ------------- 找最小值: 1.定义V1(当前参考值),V2(运行时间最短的泵号),V3(运行时间首地址) 2.将运行时间首地址赋给V3,V2=1 -------找最小值循环(开始)------- 3.如果V3>(运行时间首地址+最大泵号),则退出。 4.V1=@V3(间接寻址) 5.将V1和@(V3+1)(间接寻址)进行比较,若大于,则(a):V1的值=@(V3+1)(间接寻址);(b):V2=V3-运行时间首地址 6.V3=V3+1 -------找最小值循环(结束)------- 7.此时V2就是你要的结果。

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:100帖 | 1476回
  • 年度积分:1
  • 历史总积分:2059
  • 注册:2001年11月02日
发表于:2004-03-09 19:53:00
20楼
re:countryboy 这就是用PLC控制系统实现的,没用其他东西啊

相关主题

官方公众号

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