SillyBoy

Standard Pumping Station Logic

13 posts in this topic

Hello Everyone...

I got a project of pumping station...

Need your help to fulfill client requirements through PLC logic...

 

#System#

There are 6 pumps, every pump is Controlled by Individual VFD, and all 6 VFDs are in Communication with PLC.

Output header is common for all pumps, and a Pressure Transmitter is connected at output header...

 

#Logic Requirements#

Now when we start sequence in auto, the least run hour vfd should start first and increase the frequency slowly to maintain the pressure setpoint, now if vfd1 at 50hz and pressure is lower then the SP next vfd according to run hour should start and and increase frequency slowly, afterwords 3rd vfd according to runhour and so on untill pressure match SP, then maintain the pressure of header...


If pressure increases above the setpoint, last started vfd should reduce rpm and shut down first and then second last started to shutdown and so on...

And client also need enable-disbale logic, if they mark a pump disable then that pump should not start...


Can you help me out and suggest anything, or provide some sample backups or documents ?

1 person likes this

Share this post


Link to post
Share on other sites

The logic may be flawed. I had a system that I programmed like this a while back (without the pressure maintenance requirement). With the logic of always starting the pump with the least run time and stopping the pump with the most run time you end up with all pumps with around the same runtime. This sounds good until you realize that, if all the pumps are identical, then they will all fail around the same time.

You may want a startup phase that has a priority system to have some pumps run more than others. You should still throw all the pumps into the mix to keep them from extended off time. Eventually then, you could equalize the priorities of the pumps so that they get about the same amount of run time each week (or whatever time frame makes sense). Then they will all have different accumulated run times that keep increasing. The longest running pumps should fail first but the others will still have some life in them so you won't have to replace them all around the same time.

It's a more complicated system but makes more sense in the long run.

Share this post


Link to post
Share on other sites

I've written logic very similar to this for Refrigeration Compressors with a common header.  I did it with two sequencers and a bunch of indirect addressing.  I monitored the header and when it was below setpoint deadband for the required amount of time I would trigger the Increase Speed Subroutine which would bump the current pump by 5hz and if the current pump was at max , 60 hz in my case, 50hz in yours, I would go to the next pump in sequence and bump it.   Likewise if I was above setpoint deadband for the required time I would drop the current pump 5hz or if it was at minimum speed 20 hz in my case, I would shut it off and proceed to the next pump in line.  THis basic logic works fine until some physical condition causes one of your pumps to fault.  Now instead of running VFDs 1,2 & 3 you're running 1,2 &4 and must allow in your code for skipping the failed VFD and when maintenance or operations does reset drive 3 how to you bring it back into sequence.   Hope this gives you some food for thought.

Also to build on what ndzied1 said.  HAving a configurable sequence not based strictly on hours allows you to run pump 1 till it reaches a PM interval and then make it pump 6 , taking it offline for the PM.  With planning you can spread the PM out and never lose two pumps at once.

2 people like this

Share this post


Link to post
Share on other sites
On 10/08/2020 at 11:31 PM, BobLfoot said:

I've written logic very similar to this for Refrigeration Compressors with a common header.  I did it with two sequencers and a bunch of indirect addressing.  I monitored the header and when it was below setpoint deadband for the required amount of time I would trigger the Increase Speed Subroutine which would bump the current pump by 5hz and if the current pump was at max , 60 hz in my case, 50hz in yours, I would go to the next pump in sequence and bump it.   Likewise if I was above setpoint deadband for the required time I would drop the current pump 5hz or if it was at minimum speed 20 hz in my case, I would shut it off and proceed to the next pump in line.  THis basic logic works fine until some physical condition causes one of your pumps to fault.  Now instead of running VFDs 1,2 & 3 you're running 1,2 &4 and must allow in your code for skipping the failed VFD and when maintenance or operations does reset drive 3 how to you bring it back into sequence.   Hope this gives you some food for thought.

Also to build on what ndzied1 said.  HAving a configurable sequence not based strictly on hours allows you to run pump 1 till it reaches a PM interval and then make it pump 6 , taking it offline for the PM.  With planning you can spread the PM out and never lose two pumps at once.

Do you have sample backup or any documents ?

Share this post


Link to post
Share on other sites

Unfortunately , I wrote this logic over 15 years on a PLC5 and have moved jobs twice since then.

Best I can advise in the more modern Controllogix environment is create a UDT for Pump which has all the signals and values a pump would need.

Write the logic for controlling pump[0] if it were the only pump.

Then before you call the logic copy Pump[x] to Pump[0} and after executing the logic copy Pump[0] to Pump[x].

Add to this an Array of PumpNumbers and you can choose the value of X from PumpNumber[y} where Y is 1 thru totalnumber of pumps.

Share this post


Link to post
Share on other sites

Could you post a PDF version of the file?

Mike

 

Share this post


Link to post
Share on other sites

there are many ways to do this. and while it is always good to take a look at someone else code, i would say to at least try to make own solution. this is better in the long run, in order to maintain and support some. following example is offered as one idea. it is not necessarily correct or complete solution but it may offer something to think about. i tried to keep it both scaleable and as simple as possible.

 

pump_logic.png

Share this post


Link to post
Share on other sites

6 Pumps to control a single Output?

Essentially you have a Duty-Standby-Assist system.

Monitor the Hours Run for each of the pumps, create a retentive array for each pump totalizer run hours. This will be fundamental pointer to which pump to start. Most VFDs should have this info though.

Make sure the pump is not faulted (i.e. Running but pressure doesn't increase), takes this pump offline if that's the case.

Customer wants Auto Mode Enabled/Disable button on HMI or maybe hardwired selector switch.

Depending on the Pumps, I would configure them to be quite 'smart' in manual mode.

Assuming you are running only 3 Pumps at most it seems to be a Dual Redundancy multi pump system. I would have a simple Pump set (3 pumps) duty rotation and believe this would be ok for this project.

 

Share this post


Link to post
Share on other sites

Logic has been successfully implemented on site and running satisfactory.

I have used Bubble Sort algorithm to sort pump array by run hour at every auto start.

Given same frequency command to all running pump from PID (Load Sharing).

Share this post


Link to post
Share on other sites

@SillyBoy Glad you solved it and thanks for closing the loop and reporting back.  Nice to have questions and answers on the forum.

Share this post


Link to post
Share on other sites
On 17/08/2020 at 11:14 PM, BobLfoot said:

Unfortunately , I wrote this logic over 15 years on a PLC5 and have moved jobs twice since then.

Best I can advise in the more modern Controllogix environment is create a UDT for Pump which has all the signals and values a pump would need.

Write the logic for controlling pump[0] if it were the only pump.

Then before you call the logic copy Pump[x] to Pump[0} and after executing the logic copy Pump[0] to Pump[x].

Add to this an Array of PumpNumbers and you can choose the value of X from PumpNumber[y} where Y is 1 thru totalnumber of pumps.

If anyone looking for the solution, follow these instructions by @BobLfoot and study Bubble Sort algorithm and you are done.

Happy to Help...

 

Share this post


Link to post
Share on other sites
@sillyboy can you share the logic in PDF smsbond@gmail.com

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now