Michael Lloyd

MrPLC Member
  • Content count

    953
  • Joined

  • Last visited

Community Reputation

81 Excellent

3 Followers

About Michael Lloyd

  • Rank
    Random Pixel Generator
  • Birthday 06/01/58

Profile Information

  • Gender Male
  • Location Texas
  • Country United States
  • Interests Photography, Flying, Electronics, Long Range Shooting, Reloading, Fishing, Hunting

Recent Profile Visitors

6776 profile views
  1. Compact Logix run without I/O Cards

    I've never done it but have you tried disabling the IO cards in the IO tree? Right Click the card, select the Connection tab, Check the Inhibit Module box
  2. I hate when something is right in front of me and I don't see it :) It looks like it performs the function on the array variables (FAL_Top or does that point to an array?), one at a time every time Top_New_Data cycles, and updates the single Real value?
  3. Failed to write out of range value

    To the OP - It's not unusual to use 0,1, or 2 (or higher) with a compare to make things happen in an HMI or program. As everyone else has said- you can't use a BOOL tag for an integer function.
  4. Copied this from the help file Description The FAL instruction performs the same operations on arrays as the CPT instruction performs on elements. Added rambling thoughts- Length 520 double integers. It's set to INC so it's going to step through every time the HSC see new data.  So where's the math (computation) that's being performed?  This is why I prefer a clear and concise description to blah_blah_blahty_blah tag structure :/
  5. Masked moved instruction

    I was just looking at the help info for that instruction. It didn't make sense. A mask value of 0 is supposed to block the source bit and 1 passes the source bit yet  Input a = 0101 0101 ... etc Mask = 1111 0000 ... etc Output = 1111 1111 ... etc Description The MVM instruction uses a Mask to either pass or block Source data bits. A "1" in the mask means the data bit is passed; a "0" in the mask means the data bit is blocked. If you mix integer data types, the instruction fills the upper bits of the smaller integer data types with 0s so that they are the same size as the largest data type.   So basically I'm just camping out on your post to get an explanation that's useful.
  6. Programmatically Change IP address of Target Module

    Nothing against the OP but if this was possible I would expect Rockwell to close that hole asap
  7. Allen Bradley Newbie

    RS Logix 500. You may be able to use the HMI end of the cable to connect to your laptop serial port. <--- yes... you need a serial port or at least a good USB to serial adapter. 
  8. MikeC

    I need to see the logic to know. DN is probably happening so fast that you don't see it energize. Use Timer[].DN to a OTL and see if it latches (it will)
  9. Replace CompactLogix L32e to L33er - DH485

    I installed something like 15 or 20 L32e's in our SCADA system almost 10 years ago. I used an ethernet card rather than the DH485 port. We have no plans to change them. We have PLC 5's that have been obsolete for a very long time. We are just now thinking about replacing them. Cost vs benefit. If what you have ia working, maybe put a spare L32e processor on the shelf (you should already have one) and leave the L32e's in place. 
  10. Control Logix CPT Statement Oddity

    Over 10 years ago I was working on a burner management system for the company, that I now work for, at the same time someone else was working on a surge controller for two Solar Saturn turbines. Their PLC's kept showing up on the network. What does any "good" integrator do when they encounter someone else's program? Why they download it and check it out of course  I was already using UDT's and making my own AOI's so I wasn't overly interested in the program, but you never know what kind of jewels (or feces) you might find in someone else's program (including mine). The did the surge calc for the antisurge controller in ladder. It almost 100% duplicated my AOI (it's a common method and I'm not implying they copied mine. In fact, if they had there wouldn't have been one of "those conversations" with them years later. One thing that made me scratch my head was the last rung. It was a divide and the result was placed into an integer. I didn't think too much about it. Fast forward a few years later, now an employee, and I was called to come investigate why our turbine driven centrifugal compressor surge valve opened. They had already figured out that the high temperature shutdown on the suction didn't kill it. The RTD element was 3" long. The thermowell was 18" long. The element tip wasn't in the process flow. I was tasked with figuring out why the surge valve came open and stayed open. That's more complicated than what I'll get into but hot gas has less differential across an orifice plate thna cold gas. The rest is elementary. The surge valve basically connects discharge to suction to keep flow through the compressor from dropping so low that it surges and bad things happen. Discharge in this case came off before the cooler (ie it was hot).  I remembered the weird calc (not the specifics) so I started there. The surge calc is easy Relative Flow / Relative Speed (Relative = % so actual over design)). Calculating flow accurately takes a little effort. So if I'm at 96% flow and 96% speed, 0,96/0.96 = 1.000. Life is good even if it is an integer. If the turbine is it 50% Flow and 96% speed, 0.50/0.96 = 0.52, still a 1.0 if it's an integer but approaching surge. Sort of. I'd normally start with the setpoint for the surge controller at 70%. Normally a Saturn is going to run between 100% and 110% gas producer speed (max) so my example is a little off but basically te result drops below .50 and that makes it 0 in integer form. The surge valve opened, nobody caught it, hot gas returned to suction makes the discharge temperature higher which increases suction temp, etc, etc... melted compressor internals. and much dinero spent on the repair.  Decimal points matter.
  11. I need to. I wrote an orifice plate sizing calc that I used VBA in the background. It's been a long time since I looked at it though. I wonder where the OP went?
  12. PS - I hated the Rx3i system because it failed one weekend. The primary controller AND the redundant controller lost their program. Like gone. Nobody home. Sorry, I can't hear you... The IO was programmed to hold last position. The operator looked around and said he only had one PID controller on that system and he wasn't using it so there was no need to shut down. That's correct... the plant was still running with a brainless PLC. I called our engineer, explained what I was told, and we left it alone. The plant ran all weekend like that. Well guess what, when we finally loaded a program in the PLC we found out that a good 65% of the PID loops were on a remote rack that everyone had forgotten about AND the GE (pos) doesn't store the PID loop parameters in the saved file. When the guy we called out to dump the program in (I refused to touch that thing) and switched to run, all hell broke loose. :) Nothing that the ESD button wouldn't fix... It took all day to pull the PID config out of the HMI historian and reconfigure all of the PID loops. We sent the controller to GE to analyze why the primary and secondary lost their minds... They charged for the service. The answer? Couldn't find anything. :/ 
  13. The last plant I managed had a redundant GE RX3i system (about 3 years ago). It's was newer than the 90-30 by quite a bit but not up to Rx7i standards. I hated that system. After working with S7 and CLX I've turned into a PLC snob lol  When I contracted to the company I work for now I did a couple of burner management PLC's in that plant. The first BMS was done with a CLX, then next one was GE because the plant manager at the time "didn't like Allen Bradley". He didn't even know how to spell Allen Bradley but that's what the subcontractor he used liked. So, I used an Rx3i on that BMS. Same basic program just in a different platform. I'm a big fan of UDT's. I live by the tag lol The contract guy that did all of their GE work hated my BMS program lol. Today... that same guy loves the CLX stuff and doesn't ever spec GE. We hired him to replace me when I transferred to NM. I have standardized routines with standardized tag structure. Pump control, valve control, etc each have a starting ladder structure that can be modified. If I need to add a pump, I just create a new pump tag, copy the existing routine to a new routine, search and replace the tagname (before the .), fix the shutdown string and add or delete whatever I need. At the peak of building the pipeline system we built in the Eagle Ford I could write a 3 pump, 4 tank station program in one day and build out the HMI (ClearSCADA) the next day. I didn't reuse old programs. I started clean every time. Make the IO sheet complete with tag names, transmitter list, alarm and shutdown list, and cause and effect. Do some cut / paste import / export tag stuff, pull in all of the UDT's needed, create all of the tags, start programming. It seems like oil and gas is a different animal than machine or factory floor automation. We use a lot of analog inputs. The largest station that we built had 241 analog inputs (quite a few of those were calculated variables), 255 analog input "tag slots". It took about 30s to document them via an Excel sheet (with a VB backend) and csv import. I start with a base program that has text in the description to make it a simple cut / paste operation. 53 station programs spec'd, panel and transmitters ordered, FAT done (btw the FAT's were linked back to the HMI server with a cell modem so validating the panel wiring also validated the HMI), and pre-startup checkout done in a hair over a 3 year time period. At one point I had 6 programs in progress at the same time. I didn't get to the point of being able to write the programs in a day until about 1/2 way through the system build out. While that was going on I was also the guy they called when something wasn't working right. Baptism by fire but I'd do it all over again.  The analog UDT looks like this: String1    STRING        Tag    Read/Write    1    0 String2    STRING        Description    Read/Write    2    0 PV    REAL    Float    Scaled Process Variable    Read/Write    3    0 AHHA    REAL    Float    High High Alarm Setpoint    Read/Write    4    0 AHA    REAL    Float    High Alarm Setpoint    Read/Write    5    0 ALA    REAL    Float    Low Alarm Setpoint    Read/Write    6    0 ALLA    REAL    Float    Low Low Alarm Setpoint    Read/Write    7    0 Deadband    REAL    Float    Alarm Deadband    Read/Write    8    0 HH_Limit    BOOL    Decimal    High High Alarm Bit    Read/Write    10    0 H_Limit    BOOL    Decimal    High Alarm Bit    Read/Write    11    0 L_Limit    BOOL    Decimal    Low Alarm Bit    Read/Write    12    0 LL_Limit    BOOL    Decimal    Low Low Alarm Bit    Read/Write    13    0 MinEU    REAL    Float    Transmitter LRV for HMI    Read/Write    14    0 MaxEU    REAL    Float    Transmitter URV for HMI    Read/Write    15    0 EnableAlarmHH    BOOL    Decimal    Enable HH Alarm    Read/Write    17    0 EnableAlarmH    BOOL    Decimal    Enable H Alarm    Read/Write    18    0 EnableAlarmL    BOOL    Decimal    Enable L Alarm    Read/Write    19    0 EnableAlarmLL    BOOL    Decimal    Enable LL Alarm    Read/Write    20    0 Status    DINT    Hex    Alarm Block Status    Read/Write    21    0 The Motor UDT (anything with and electric motor uses this one) String1    STRING            Read/Write    1    0 String2    STRING            Read/Write    2    0 SW    INT    Decimal        Read/Write    3    0 A    BOOL    Decimal        Read/Write    5    0 A_Stop    BOOL    Decimal        Read/Write    6    0 A_Start    BOOL    Decimal        Read/Write    7    0 Stop_I    BOOL    Decimal        Read/Write    8    0 Start_I    BOOL    Decimal        Read/Write    9    0 HMIStop    BOOL    Decimal        Read/Write    10    0 HMIStart    BOOL    Decimal        Read/Write    11    0 RunStat    BOOL    Decimal        Read/Write    12    0 Stop    BOOL    Decimal        Read/Write    14    0 Run    BOOL    Decimal        Read/Write    15    0 AStop_OS    BOOL    Decimal        Read/Write    16    0 AStart_OS    BOOL    Decimal        Read/Write    17    0 FStart_OS    BOOL    Decimal        Read/Write    18    0 HStart_OS    BOOL    Decimal        Read/Write    19    0 SOS    BOOL    Decimal        Read/Write    20    0 RH    DINT    Decimal        Read/Write    21    0 S    DINT    Decimal        Read/Write    22    0 FailTMR    TIMER            Read/Write    23    0 T1    TIMER            Read/Write    24    0 T2    TIMER            Read/Write    25    0 T3    TIMER            Read/Write    26    0 T4    TIMER            Read/Write    27    0 T5    TIMER            Read/Write    28    0 T6    TIMER            Read/Write    29    0 T7    TIMER            Read/Write    30    0 T8    TIMER            Read/Write    31    0 T9    TIMER            Read/Write    32    0 T10    TIMER            Read/Write    33    0 RMT    TIMER            Read/Write    34    0 RMC    COUNTER            Read/Write    35    0   Basically anything that we needed for an analog tag is in the Analog udt and anything that could come up for a pump or other motor driven device is in the motor tag. The larger REDA pumps used every timer. Things like low suction shutdown delay, vibration shutdown delay (1s), start sequencing... all kinds of stuff. If I needed to see what was going on with P-9001 I just expand the tag called P9001. The two strings are used by the HMI in the faceplate that pops when you click on the value box. The guy that wrote the ClearSCADA back end made templates that matched the UDT's that I used. To "make" a point on the screen you create the tag in the HMI, run a script that replaces Analog[10] with the correct Analog[x] value, drag the mimic to the screen. Poof... What was really handy was copying a whole station to a new group and running a global script that replaced the station number. Like this - Lets say I have Station 9000 built. They decide to build Station 7000. Btw... I picked the numbering system so that made it easy. The pumps in station 9000 were P901, P902, and P903 for the boosters and P9001, P9002, and P9003 for the mainline pumps. Station 7000 only had 2 of each. Copy past the station folder to a new folder named 7000, search and replace the 9 with a 7, delete the two extra pumps, done. The same applied for MOV's (motor operated valves), tanks, tank mixers, etc. The main caveat is that the numbering and naming had to be tightly controlled and there was a little bit of crystal ball stuff going on. Station 9000 was easy, It was at the end of the mainline. Picking what all of the stations upstream would be numbered was a SWAG because there was no way to know how many booster stations were going to be on the pipeline. Back then oil was over $100.00 a barrel and the Eagle Ford was going to last for at least 10 years. We were moving 150,000 BPD at the peak. You can increase capacity on a pipeline three ways, increase the diameter, loop the line with a second pipeline, or add a booster station and breakout tanks. 1 and 2 were not an option, so 5000 was around the middle, 1000 was at the beginning, and I just hoped the numbering I picked for everything in between worked otherwise I was going to have to do a lot of work renumbering. We could have got out of order, Nobody but me would have cared and it would have driven me nuts lol. It worked out. No renumbering required. Gas plants are little more tedious due to tags needing to match P&ID and other PSM docs. But with the right pre-planning and tag structure it's not that hard.  
  14. Some of the best programmers that I've ever followed (converting to Logix) were SLC programmers. I started with the Siemens S5, then went to TI505 (which is still viable), then moved to the Siemens S7-300 and S7-400, then Logix. I have Logix programs that I would rewrite for free if the customer would let me lol. If think I started on 10 but I don't remember. I stayed with 19 until a few years ago. It was rock solid and did all I needed it to do. You probably had a bunch of multicolored jumpers :) I saw my first PLC in 1979 but didn't have a clue what it was. I was 20-21 in 1979. I'm not 20 now lol All through the 80's everywhere I worked used big relay panels (gas processing plants). Relays and one-line diagrams seemed to make life simple.   
  15. One of the things I like about this site is the diversity of programmers that participate here. In my line of work scan time isn't an issue but it's good to know that branches take longer than series. I'm old school. It hurts my brain to see it. I hear the routine as I type it in and I don't like the way it sounds :)  Bonus for the day is the "viewing the code in ASCII" tip. I had never tried that.