Factory Tours

I love factory tours especially if they're personal ones. There's just something about seeing automation in action that's just cool.

Lego Factory Tour

I got started on a little factory tour information internet romp after watching this cool flash video about the Lego factory. I love Legos so seeing it in automation is a bit of double your pleasure. If you're a Lego fanatic and in Denmark then you might actually get an inside tour. I have no plans so you'll have to tell me about it.

There's a book called Watch It Made in the USA which is a guide to visit nearly 300 factories and company museums across the U.S.A. So you could plan your whole family vacation around factory tours. Yeah right, if you could just get the kids to agree to that. Tongue out The book is very well done but if you just want a quick run down of some local factories you can try the Factory Tours USA website.

Here's a list of one's that sound fun and interesting to me.

  • Boeing (Everett, WA) - I've actually been on this tour and would love to go again. Absolutely worth it.
  • Jelly Belly (Fairfield, CA) - Oh these jelly beans have amazing different flavors. It'd be great to be up to your armpits in them.
  • Ben and Jerrys (Waterbury, VT) - Another one of my favorites: Ice Cream!
  • Taylor Guitars (El Cajon, CA) - I play guitar so this would be awesome.
  • Toyota (Georgetown, KY) - Any automobile manufacturing is cool.
  • Crayola (Easton, PA) - Now here's one the kids could get into especially if they are Sesame Street age.
  • Celestial Seasonings (Boulder, CO) - I dunno, it just sounds so comforting.

I'm sure there's a lot more. If you have any suggestions then add a new comment.







An Introduction to RSLogix5000 Tags

Tags are the method for assigning and referencing memory locations in Allen Bradley Logix5000 controllers. No longer are there any physical addresses such as N7:0 or F8:7 which use symbols to describe them. These have been replaced with tags which are a pure text based addressing scheme. This is a departure from the more conventional ways of programming PLC’s, which includes Allen Bradley’s earlier line of PLC5 and SLC 500 controllers.

One of the hardest transitions from the older systems is realizing how the tag database works. The person with experience in Allen Bradley systems will recognize many of the instructions and be at home with the editor in RSLogix 5000. Understanding the tag database is the first major hurdle in becoming comfortable with the ControlLogix and CompactLogix systems. So let’s dig in and get started.

The Way We Used To Be

Earlier Allen Bradley PLCs programmed with RSLogix 5 and RSLogix 500 software had data files to store I/O and other internal values. These different data files could only hold one data type. A data type defines the format and the size of the stored value.

Default Data Files

Data File Descriptions

File #

Type

Description

O0

Output

This file stores the state of output terminals for the controller.

I1

Input

This file stores the state of input terminals for the controller.

S2

Status

This file stores controller operation information useful for troubleshooting controller and program operation.

B3

Bit

This file stores internal relay logic.

T4

Timer

This file stores the timer accumulator and preset values and status bits.

C5

Counter

This file stores the counter accumulator and preset values and status bits.

R6

Control

This file stores the length, pointer position, and status bits for control instructions such as shift registers and sequencers.

N7

Integer

This file is used to store bit information or numeric values with a range of -32767 to 32768.

F8

Floating Point

This file stores a # with a range of 1.1754944e-38 to 3.40282347e+38.

While this method made it easy for using instructions, it provided a challenge for logically grouping different data types together according to function. For instance, in machine control, a motor may have a start, stop, speed and alarm code each with its own data type. Thus, the data was “scattered” throughout the data files.

File #

Name

Data Type

I1

Start

Input

I1

Stop

Input

F8

Speed Setpoint

Floating Point

N7

Alarm Code

Integer

Comparing the Old and New

The Logix5000 controllers have done away with data files and in its place is the tag database. The tag database organizes memory locations in one place. Each tag is assigned its own data type. The table below shows the association between the current data types and the older systems with data files.

RSLogix 5 / 500

RSLogix 5000

File #

Type

O0

Output

Input and output modules, when configured, automatically create their own tags like Local:0:I.Data.0

I1

Input

S2

Status

Use the GSV and SSV instructions to get status information such as the CPU time, module states and scan times.

B3

Bit

Assign the Boolean (BOOL) data type to the tag.

T4

Timer

Assign the TIMER data type to the tag.

C5

Counter

Assign the COUNTER data type to the tag.

R6

Control

Assign the CONTROL data type to the tag.

N7

Integer

Assign the double integer (DINT) data type to the tag.

F8

Floating Point

Assign the REAL data type to the tag.

Creating a Tag

One way to create a new tag is right click on the Controller Tags in the Controller Organizer and select New Tag. Even faster is the Ctrl+W hot key.

The following dialog box pops up.

The Name given to the tag has the following rules:

  • only alphabetic characters (A-Z or a-z), numeric characters (0-9), and underscores (_)
  • must start with an alphabetic character or an underscore
  • no more than 40 characters
  • no consecutive or trailing underscore characters (_)
  • not case sensitive

While tags are not case sensitive, it is good practice to mix cases for readability. It is much easier to read Line1_Start then LINE1START or line1start.

In addition, the tag database list sorts alphabetically. Therefore, it is best to use similar starting characters when you want tags to be together in the monitor list.

Tags Named for Grouping

Tags Not Named for Grouping

Level_High

High_Level

Level_Low

Insert_Nut

Insert_Nut

Knife_Stop

Knife_Stop

Low_Level

Use the Description field for a longer description of the tag. It is best to keep names short yet not cryptic. Tag names are downloaded and stored in the controller but the description is not as it is part of the documentation of the project.

The tag Type defines how the tag operates in the project

Base

A tag that actually defines the memory where the data is stored

Alias

A tag that represents another tag

Produced

Send data to another controller

Consumed

Receive data from another controller

Alias tags mirror the base tag to which they refer. When the base tag value changes so does the alias tag. Use aliases in the following situations:

  • program logic in advance of wiring diagrams
  • assign a descriptive name to an I/O device
  • provide a more simple name for a complex tag
  • use a descriptive name for an element of an array

Produced and consumed tags make it possible to share tags between controllers in the same rack or over a network. This article does not cover this aspect.

Select a Data Type for the tag by typing it in or by clicking on the ellipsis button and selecting it from the list. A data type is a definition of the size and layout of memory allocated for the created tag. Data types define how many bits, bytes, or words of data a tag will use.

The term Atomic Data Type refers to the most basic data types. They form the building blocks for all other data types.

Data Type

Abbreviation

Memory bits

Range

Boolean

BOOL

1

0-1

Short Integer

SINT

8

-128 to 127

Integer

INT

16

-32,768 to 32,767

Double Integer

DINT

32

-2,147,483,648 to 2,147,483,647

Real Number

REAL

32

+/-3.402823E38 to +/-1.1754944E-38

Logix5000 controllers are true 32-bit controllers, meaning the memory words are 32-bits wide. No matter what, a tag always reserves 32 bits of memory even if it is a Boolean or integer data type. For this reason, it is best to use a DINT when dealing with integers. Furthermore, a Logix5000 controller typically compares or manipulates values as 32-bit values (DINTs or REALs).

A Logix5000 controller lets you divide your application into multiple programs, each with its own data. The Scope of the tag defines if a tag is global (controller tags) and therefore available to all programs or local (program tags) to a select program group. Pay careful attention to this field as creating it in the wrong area may lead to some confusion later on as to its location.

Controller Tags are available to all programs. You cannot go wrong using controller scoped tags unless you easily want to copy and paste programs. A tag must be controller scoped when used in a Message (MSG) instruction, to produce or consume data and to communicate with a PanelView terminal.

Program Tags are isolated from other programs. Routines cannot access data that is at the program scope of another program. Having program tags make it easy to copy/paste programs and not have to worry about conflicting tag names. Make sure though that no controller tags are named the same as program tags.

Style is the form in which to display the tag by default. The following table provides you with information on the base and notation used for each style.

Style

Base

Notation

Binary

2

2#

Decimal

10

Hexadecimal

16

16#

Octal

8

8#

Exponential

0.0000000e+000

Float

0.0

Edit and Monitor Tags

To edit existing tags select the Logic > Edit Tags menu item. A spread sheet like view lets you create and edit tags.

Clicking the + sign next to a tag reveals its structure. For a DINT tag this is the 32 individual bits that make up the tag which will not be of interest if you are using the tag as a number rather then individual bits. If you do wish to use the individual bits then you can address them in this way with the tag name followed by a period and then the bit position (e.g. MyTag.5). Shown below is the expanded structure for a TIMER. Notice it is made of two DINTs and three BOOLs. In this case, the Booleans are packed into one DINT and therefore a timer uses three DINTs of memory.

An Easier Way to Create Tags

The easiest way to create tags is on the fly while programming. When an instruction is first used a “?” will indicated the need for a tag. There are three options at this point:

  1. Double click on the “?” and select an existing tag from the drop down box.
  2. Right click on the “?” and select new tag.
  3. Double click on the “?” and type in the tag name. If it does not all ready exist, then right click on the tag name and select Create “NewTagName”. Be careful with this method not to use spaces or special characters.

The nice thing about all these methods is that RSLogix5000 will automatically fill in the correct data type according to the instruction used.

Another quick method is to drag and drop an existing tag to a new instruction. Make sure to click on the tag name rather then the instruction.

Conclusion

These are the basics of tags. The advantages are:

  1. Tags, if done right, create a level of documentation that is stored in the PLC.
  2. The software does an automatic housekeeping of memory locations. There’s no more worrying about physical addressing and memory conflicts.
  3. Structures can be more easily put together based on function rather then data type.

Advance subjects include arrays, user defined data types (UDT) and Add-On Instructions. Hopefully, you will continue to learn more about the power of tags. There is no doubt that if you grasp the principles presented here you will be well on your way to using and troubleshooting any Logix5000 controller.





An Introduction to Grafcets

by John Schop

I often find that using SFC's or Grafcets is the easiest way to design industrial automation systems. I have worked for several machine builders, and one of them had given the term 'SFC logic' another meaning. There was absolutely no process in their PLC logic that was not documented by an SFC or as I like to call it, a Grafcet. After some getting used to that, I absolutely loved the way it enabled me to program and troubleshoot complex machinery, and ever since, I've tried to use this method whenever I could.

I seriously believe that no machine cannot be programmed with this method, and if I would have the opportunity to make the decision every time (unfortunately the customer is often involved in this), I would never use anything else.

What is even better is that with a little bit of programming skills, it is possible to translate these Grafcets to ladder logic. This means nobody has to buy the expensive SFC programming modules, it is easy to read and troubleshoot, and less skilled maintenance people that you often have to deal with are not completely lost in a pile of spaghetti.

This also means that your Grafcet documentation for a certain machine does not change with the manufacturer of the PLC you are using. The translated logic is the only thing that is slightly different.

Of course, there are numerous ways of programming a Grafcet in ladder logic, but it is good to have a standard way of doing it every time, and I will show you how I do it. This article uses RSLogix 5000, but it is the same concepts in any PLC, with some minor differences.

We are going to look at a little Grafcet first, so we get the idea of what is going on. Let us assume I have a simple cylinder (CYL1) that will have to move out, when a pushbutton is pressed. Once the pushbutton is released, the valve that operates the cylinder returns to its normal state, and the cylinder will move in (the rest position).

Some other assumptions:

  • There is only one proximity switch on this cylinder, telling me it is at the rest position, so I'll have to assume it's in the 'out' position if I don't see that input for a while.
  • It cannot move out in some interlocking conditions.

This probably requires some explanation, because over the years, I have developed this way of notation, which does not necessarily follow the strict rules of IEC1131 or whatever other standards there may be, but I'm assuming that if you read this, you understand the concept of steps and transitions.

Look at the transition from Step 0 to Step 1, it says, 'INPUT_PUSHBUTTON * CYL1_INTERLOCK' which in my world means: 'the input from the pushbutton needs to be there, AND the interlock needs to be satisfied'. That would be a whole lot to write down in your documentation though, so that is why I do it that way. In case I need an 'OR', I use the '+' sign. The transition from Step1 to Step 0 says, '/INPUT_PUSHBUTTON', which means 'NOT that input'.

On the right side of the steps, you see what is actually going to happen in that step.

Step 0 does nothing except that we will tell the rest of our program that CYL1 is in, with 'CYL1_STATUS_IN', which is a Boolean variable that is true if we are in step 0, and the input from the prox 'INPUT_CYL1_IN' is true. Doing it this way makes sure we only use that input in one spot in our program, so if we ever have to change the physical location of that input, we only have to change our program in that one spot.

In Step 1, we are going to do some more stuff. For example, if 'INPUT_CYL1_IN' is not true, we're starting a timer 'TIMER_CYL1_OUT', and after that timer has expired 'TIMER_CYL1_OUT.DN', we will make 'CYL1_STATUS_OUT' true. In addition, we have to energize the actual output 'OUTPUT_CYL1_OUT'.

Now, to translate all this to ladder logic, we will follow a certain order of things:

  1. Gather the information for the interlocks
  2. Program the transitions
  3. Convert the step to a coil (I'll explain this as we go along)
  4. Program the outputs, timers and status in that step.

Let's see what it looks like in logic, step by step:

1. Gather information about interlocks:

As you can see, I have fantasized some conditions for this interlock.

2. Let's do the transitions, first Step 0 to Step 1:

I've introduced some variables here, 'CYL1_STEP', which is a DINT that we're going to use the separate bits of to indicate a step, and also 'CYL1_STEPNUMBER', another DINT, to store our step number in.

Step 1 to Step 0:

Now I use bit number 1 from our DINT called 'CYL1_STEP', to indicate that we're in Step 1, and I move a value of '0' into 'CYL1_STEPNUMBER', which will make us go back to Step 0 after the:

3. Conversion to coils.

This conversion to coils makes sure that every step is true for at least one PLC cycle after the transition. I use the value in 'CYL1_STEPNUMBER' to coil a certain bit in 'CYL1_STEP':

A little information on this one: because I latched the bit with an OTL instruction, I clear 'CYL1_STEP' first; to make sure we cannot have two steps at the same time. It is essential that not more than one-step can be active in one PLC cycle, and every step will be active for at least one PLC cycle at a time. You might have to read that last sentence a couple of times before its clear, but that is how it is.

Now we are ready to do something within these steps:

4. Program the outputs, timers and status for a step:

Let's do Step 0:

And then Step 1:

And that's all, really.

Of course, in real life, you'll have to program some more stuff after this, like a diagnostic in Step 1, to indicate that the cylinder did not reach it's 'OUT' position within a certain time, and the same for Step 0 if it does not reach the 'IN' position.

Another thing that might come in handy is a diagnostic to indicate that someone is pressing the pushbutton, but the interlocks are not ready yet, and I am sure you can come up with a lot more stuff like that. I am just trying to give you a basic idea of how to program an SFC real nice and clean in ladder logic, and more important, how to document them.

A typical Grafcet that you would use in a program could of course be exactly like this, but most of the time you are going to need some more complex structures. If people are interested in that, I might elaborate on it later. I could probably write a whole book on it, now I am thinking about it.





S7 Library Functions

I couldn't find a complete listing of all the function blocks in the standard Siemens S7 Libraries so I made one myself. It helps me get a better overview of what is available. The complete listing is also available as an Excel spreadsheet so you can sort or adjust to your needs.

System Function Blocks

Number Name Family Description
SFB 0 CTU IEC_TC Count Up
SFB 1 CTD IEC_TC Count Down
SFB 2 CTUD IEC_TC Count Up/Down
SFB 3 TP IEC_TC Generate a Pulse
SFB 4 TON IEC_TC Generate an On Delay
SFB 5 TOF IEC_TC Generate an Off Delay
SFB 8 USEND COM_FUNC Uncoordinated Sending of Data
SFB 9 URCV COM_FUNC Uncoordinated Receiving of Data
SFB 12 BSEND COM_FUNC Sending Segmented Data
SFB 13 BRCV COM_FUNC Receiving Segmented Data
SFB 14 GET COM_FUNC Read Data from a Remote CPU
SFB 15 PUT COM_FUNC Write Data to a Remote CPU
SFB 16 PRINT COM_FUNC Send Data to Printer
SFB 19 START COM_FUNC Initiate a Warm or Cold Restart on a Remote Device
SFB 20 STOP COM_FUNC Changing a Remote Device to the STOP State
SFB 21 RESUME COM_FUNC Initiate a Hot Restart on a Remote Device
SFB 22 STATUS COM_FUNC Query the Status of a Remote Partner
SFB 23 USTATUS COM_FUNC Receive the Status of a Remote Device
SFB 29 HS_COUNT COUNTERS Counter (high-speed counter, integrated function) (only exist on the CPU 312 IFM and CPU 314 IFM)
SFB 30 FREQ_MES COUNTERS Frequency Meter (frequency meter, integrated function (only exist on the CPU 312 IFM and CPU 314 IFM)
SFB 31 NOTIFY_8P COM_FUNC Generating block related messages without acknowledgement indication
SFB 32 DRUM TIMERS Implement a Sequencer
SFB 33 ALARM COM_FUNC Generate Block-Related Messages with Acknowledgment Display
SFB 34 ALARM_8 COM_FUNC Generate Block-Related Messages without Values for 8 Signals
SFB 35 ALARM_8P COM_FUNC Generate Block-Related Messages with Values for 8 Signals
SFB 36 NOTIFY COM_FUNC Generate Block-Related Messages without Acknowledgment Display
SFB 37 AR_SEND COM_FUNC Send Archive Data
SFB 38 HSC_A_B COUNTERS Counter A/B (integrated function) (only exist on the CPU 314 IFM)
SFB 39 POS ICONT Position (integrated function) (only exist on the CPU 314 IFM)
SFB 41 CONT_C ICONT Continuous Control (only exist on the CPU 314 IFM)
SFB 42 CONT_S ICONT Step Control (only exist on the CPU 314 IFM)
SFB 43 PULSEGEN ICONT Pulse Generation (only exist on the CPU 314 IFM)
SFB 44 ANALOG TEC_FUNC Positioning with Analog Output (only exist on the S7-300C CPUs)
SFB 46 DIGITAL TEC_FUNC Positioning with Digital Output (only exist on the S7-300C CPUs)
SFB 47 COUNT TEC_FUNC Controlling the Counter (only exist on the S7-300C CPUs)
SFB 48 FREQUENC TEC_FUNC Controlling the Frequency Measurement (only exist on the S7-300C CPUs)
SFB 49 PULSE TEC_FUNC Controlling Pulse Width Modulation (only exist on the S7-300C CPUs)
SFB 52 RDREC DP Reading a Data Record
SFB 53 WRREC DP Writing a Data Record
SFB 54 RALRM DP Receiving an Interrupt
SFB 60 SEND_PTP TEC_FUNC Sending Data (ASCII, 3964(R)) (only exist on the S7-300C CPUs)
SFB 61 RECV_PTP TEC_FUNC Receiving Data (ASCII, 3964(R)) (only exist on the S7-300C CPUs)
SFB 62 RES_RECV TEC_FUNC Deleting the Receive Buffer (ASCII, 3964(R)) (only exist on the S7-300C CPUs)
SFB 63 SEND_RK TEC_FUNC Sending Data (RK 512) (only exist on the S7-300C CPUs)
SFB 64 FETCH_RK TEC_FUNC Fetching Data (RK 512) (only exist on the S7-300C CPUs)
SFB 65 SERVE_RK TEC_FUNC Receiving and Providing Data (RK 512) (only exist on the S7-300C CPUs)
SFB 75 SALRM DP Send interrupt to DP master
SFB 81 RD_DPAR IO_FUNCT Read Predefined Parameter

System Function Calls

Number Name Family Description
SFC 0 SET_CLK CLK_FUNC Set System Clock
SFC 1 READ_CLK CLK_FUNC Read System Clock
SFC 2 SET_RTM CLK_FUNC Set Run-time Meter
SFC 3 CTRL_RTM CLK_FUNC Start/Stop Run-time Meter
SFC 4 READ_RTM CLK_FUNC Read Run-time Meter
SFC 5 GADR_LGC IO_FUNCT Query Logical Address of a Channel
SFC 6 RD_SINFO DB_FUNCT Read OB Start Information
SFC 7 DP_PRAL DP Trigger a Hardware Interrupt on the DP Master
SFC 9 EN_MSG COM_FUNC Enable Block-Related, Symbol-Related and Group Status Messages
SFC 10 DIS_MSG COM_FUNC Disable Block-Related, Symbol-Related and Group Status Messages
SFC 11 DPSYC_FR DP Synchronize Groups of DP Slaves
SFC 12 D_ACT_DP DP Deactivation and activation of DP slaves
SFC 13 DPNRM_DG DIAGNSTC Read Diagnostic Data of a DP Slave (Slave Diagnostics)
SFC 14 DPRD_DAT DP Read Consistent Data of a Standard DP Slave
SFC 15 DPWR_DAT DP Write Consistent Data to a DP Standard Slave
SFC 17 ALARM_SQ PMC_FUNC Generate Acknowledgeable Block-Related Messages
SFC 18 ALARM_S PMC_FUNC Generate Permanently Acknowledged Block-Related Messages
SFC 19 ALARM_SC PMC_FUNC Query the Acknowledgment Status of the last ALARM_SQ Entering State Message
SFC 20 BLKMOV MOVE Copy Variables
SFC 21 FILL MOVE Initialize a Memory Area
SFC 22 CREAT_DB DB_FUNCT Create Data Block
SFC 23 DEL_DB DB_FUNCT Delete Data Block
SFC 24 TEST_DB DB_FUNCT Test Data Block
SFC 25 COMPRESS DB_FUNCT Compress the User Memory
SFC 26 UPDAT_PI IO_FUNCT Update the Process Image Update Table
SFC 27 UPDAT_PO IO_FUNCT Update the Process Image Output Table
SFC 28 SET_TINT PGM_CNTL Set Time-of-Day Interrupt
SFC 29 CAN_TINT PGM_CNTL Cancel Time-of-Day Interrupt
SFC 30 ACT_TINT PGM_CNTL Activate Time-of-Day Interrupt
SFC 31 QRY_TINT PGM_CNTL Query Time-of-Day Interrupt
SFC 32 SRT_DINT PGM_CNTL Start Time-Delay Interrupt
SFC 33 CAN_DINT PGM_CNTL Cancel Time-Delay Interrupt
SFC 34 QRY_DINT PGM_CNTL Query Time-Delay Interrupt
SFC 35 MP_ALM PGM_CNTL Trigger Multicomputing Interrupt
SFC 36 MSK_FLT DIAGNSTC Mask Synchronous Errors
SFC 37 DMSK_FLT DIAGNSTC Unmask Synchronous Errors
SFC 38 READ_ERR DIAGNSTC Read Error Register
SFC 39 DIS_IRT IRT_FUNC Disable New Interrupts and Asynchronous Errors
SFC 40 EN_IRT IRT_FUNC Enable New Interrupts and Asynchronous Errors
SFC 41 DIS_AIRT IRT_FUNC Delay Higher Priority Interrupts and Asynchronous Errors
SFC 42 EN_AIRT IRT_FUNC Enable Higher Priority Interrupts and Asynchronous Errors
SFC 43 RE_TRIGR PGM_CNTL Re-trigger Cycle Time Monitoring
SFC 44 REPL_VAL DIAGNSTC Transfer Substitute Value to Accumulator 1
SFC 46 STP PGM_CNTL Change the CPU to STOP
SFC 47 WAIT PGM_CNTL Delay Execution of the User Program
SFC 48 SNC_RTCB CLK_FUNC Synchronize Slave Clocks
SFC 49 LGC_GADR IO_FUNCT Query the Module Slot Belonging to a Logical Address
SFC 50 RD_LGADR IO_FUNCT Query all Logical Addresses of a Module
SFC 51 RDSYSST DIAGNSTC Read a System Status List or Partial List
SFC 52 WR_USMSG DIAGNSTC Write a User-Defined Diagnostic Event to the Diagnostic Buffer
SFC 54 RD_PARM IO_FUNCT Read Defined Parameters
SFC 55 WR_PARM IO_FUNCT Write Dynamic Parameters
SFC 56 WR_DPARM IO_FUNCT Write Default Parameters
SFC 57 PARM_MOD IO_FUNCT Assign Parameters to a Module
SFC 58 WR_REC IO_FUNCT Write a Data Record
SFC 59 RD_REC IO_FUNCT Read a Data Record
SFC 60 GD_SND COM_FUNC Send a GD Packet
SFC 61 GD_RCV COM_FUNC Fetch a Received GD Packet
SFC 62 CONTROL COM_FUNC Query the Status of a Connection Belonging to a Communication SFB Instance
SFC 63 AB_CALL PLASTICS Assembly Code Block (only exists for CPU 614)
SFC 64 TIME_TCK CLK_FUNC Read the System Time
SFC 65 X_SEND COM_FUNC Send Data to a Communication Partner outside the Local S7 Station
SFC 66 X_RCV COM_FUNC Receive Data from a Communication Partner outside the Local S7 Station
SFC 67 X_GET COM_FUNC Read Data from a Communication Partner outside the Local S7 Station
SFC 68 X_PUT COM_FUNC Write Data to a Communication Partner outside the Local S7 Station
SFC 69 X_ABORT COM_FUNC Abort an Existing Connection to a Communication Partner outside the Local S7 Station
SFC 70 GEO_LOG IO_FUNCT Determine Start Address of a Module
SFC 71 LOG_GEO IO_FUNCT Determine the Slot Belonging to a Logical Address
SFC 72 I_GET COM_FUNC Read Data from a Communication Partner within the Local S7 Station
SFC 73 I_PUT COM_FUNC Write Data to a Communication Partner within the Local S7 Station
SFC 74 I_ABORT COM_FUNC Abort an Existing Connection to a Communication Partner within the Local S7 Station
SFC 78 OB_RT DIAGNSTC Determine OB program runtime
SFC 79 SET BIT_LOGC Set a Range of Outputs
SFC 80 RSET BIT_LOGC Reset a Range of Outputs
SFC 81 UBLKMOV MOVE Uninterruptible Block Move
SFC 82 CREA_DBL DB_CTRL Create a Data Block in the Load Memory
SFC 83 READ_DBL DB_CTRL Read from a Data Block in Load Memory
SFC 84 WRIT_DBL DB_CTRL Write from a Data Block in Load Memory
SFC 85 CREA_DB DB_FUNCT Create a Data Block
SFC 87 C_DIAG COM_FUNC Diagnosis of the Actual Connection Status
SFC 90 H_CTRL HF_FUNCT Control Operation in H Systems
SFC 100 SET_CLKS CLK_FUNC Setting the Time-of-Day and the TOD Status
SFC 101 RTM CLK_FUNC Handling runtime meters
SFC 102 RD_DPARA IO_FUNCT Redefined Parameters
SFC 103 DP_TOPOL DP Identifying the bus topology in a DP master system
SFC 104 CIR PGM_CNTL Controlling CiR
SFC 105 READ_SI PMC_FUNC Reading Dynamic System Resources
SFC 106 DEL_SI PMC_FUNC Deleting Dynamic System Resources
SFC 107 ALARM_DQ PMC_FUNC Generating Always Acknowledgeable and Block-Related Messages
SFC 108 ALARM_D PMC_FUNC Generating Always Acknowledgeable and Block-Related Messages
SFC 112 PN_IN PROFIne2 Update inputs in the user program interface of PROFInet components
SFC 113 PN_OUT PROFIne2 Update outputs in the user program interface of PROFInet components
SFC 114 PN_DP PROFIne2 Update DP interconnections
SFC 126 SYNC_PI IO_FUNCT Update process image partition input table in synchronous cycle
SFC 127 SYNC_PO IO_FUNCT Update process image partition output table in synchronous cycle

S5-S7 Converting Blocks

Number Name Family Description
FC 61 GP_FPGP S5_CNVRT Change fixed point number to floating point number
FC 62 GP_GPFP S5_CNVRT Change floating point number to fixed point number
FC 63 GP_ADD S5_CNVRT Add floating point numbers
FC 64 GP_SUB S5_CNVRT Subtract floating point numbers
FC 65 GP_MUL S5_CNVRT Multiply floating point number
FC 66 GP_DIV S5_CNVRT Divide floating point numbers
FC 67 GP_VGL S5_CNVRT Compare floating point numbers
FC 68 RAD_GP S5_CNVRT Extract root of floating point numbers
FC 69 MLD_TG S5_CNVRT Clock generator
FC 70 MLD_TGZ S5_CNVRT Clock generator (timing element)
FC 71 MLD_EZW S5_CNVRT Message of first value with single flashing light, wordwise, A
FC 72 MLD_EDW S5_CNVRT Message of first value with double flashing light, wordwise, A
FC 73 MLD_SAMW S5_CNVRT Collected message, wordwise (sound alert)
FC 74 MLD_SAM S5_CNVRT Collected message, bitwise
FC 75 MLD_EZ S5_CNVRT Message of first value with single flashing light, bitwise, A
FC 78 MLD_EDWK S5_CNVRT Message of first value with double flashing light, wordwise, A+M
FC 79 MLD_EZK S5_CNVRT Message of first value with single flashing light, bitwise, A+M
FC 80 MLD_EDK S5_CNVRT Message
of first value with double flashing light, bitwise, A+M
FC 81 COD_B4 S5_CNVRT Change BCD number to 16 bit dual number
FC 82 COD_16 S5_CNVRT Change 16 bit dual number to BCD number
FC 83 MUL_16 S5_CNVRT Multiply 16 bit dual numbers
FC 84 DIV_16 S5_CNVRT Divide 16 bit dual numbers
FC 85 ADD_32 S5_CNVRT Add 32 bit dual numbers
FC 86 SUB_32 S5_CNVRT Subtract 32 bit dual numbers
FC 87 MUL_32 S5_CNVRT Multiply 32 bit dual numbers
FC 88 DIV_32 S5_CNVRT Divide 32 bit dual numbers
FC 89 RAD_16 S5_CNVRT Extract roots of 16 bit dual numbers
FC 90 REG_SCHB S5_CNVRT Bi-directional shift register, bitwise
FC 91 REG_SCHW S5_CNVRT Bi-directional shift register, wordwise
FC 92 REG_FIFO S5_CNVRT Buffer memory (FIFO)
FC 93 REG_LIFO S5_CNVRT Stack register (LIFO)
FC 94 DB_COPY1 S5_CNVRT Copy data block, direct assignment of parameters
FC 95 DB_COPY2 S5_CNVRT Copy data block, indirect assignment of parameterization
FC 96 RETTEN S5_CNVRT Save scratchpad memory
FC 97 LADEN S5_CNVRT Load scratchpad memory
FC 98 COD_B8 S5_CNVRT Change BCD number to 32 bit dual number
FC 99 COD_32 S5_CNVRT Change 32 bit dual number to BCD number
FC 100 AE_460_1 S5_CNVRT Read analog value
FC 101 AE_460_2 S5_CNVRT Read analog value
FC 102 AE_463_1 S5_CNVRT Read analog value
FC 103 AE_463_2 S5_CNVRT Read analog value
FC 104 AE_464_1 S5_CNVRT Read analog value
FC 105 AE_464_2 S5_CNVRT Read analog value
FC 106 AE_466_1 S5_CNVRT Read analog value
FC 107 AE_466_2 S5_CNVRT Read analog value
FC 108 RLG_AA1 S5_CNVRT Output analog value
FC 109 RLG_AA2 S5_CNVRT Output analog value
FC 110 PER_ET1 S5_CNVRT Read and Write for extended periphery (direct assignment of parameters)
FC 111 PER_ET2 S5_CNVRT Read and Write for extended periphery (indirect assignment of parameters)
FC 112 SINUS S5_CNVRT Sine (x)
FC 113 COSINUS S5_CNVRT Cosine (x)
FC 114 TANGENS S5_CNVRT Tangent (x)
FC 115 COTANG S5_CNVRT Cotangent (x)
FC 116 ARCSIN S5_CNVRT Arc sine (x)
FC 117 ARCCOS S5_CNVRT Arc cosine (x)
FC 118 ARCTAN S5_CNVRT Arc tangent (x)
FC 119 ARCCOT S5_CNVRT Arc cotangens (x)
FC 120 LN_X S5_CNVRT Natural logarithm ln (x)
FC 121 LG_X S5_CNVRT Decade logarithm Iog (x)
FC 122 B_LOG_X S5_CNVRT General logarithm log (x) to basis b
FC 123 E_H_N S5_CNVRT e to the power of n
FC 124 ZEHN_H_N S5_CNVRT 10 to the power of n
FC 125 A2_H_A1 S5_CNVRT AKKU 2 to the power of AKKU 1

IEC Function Blocks

Number Name Family Description
FC 1 AD_DT_TM IEC Point Math Add duration to a time
FC 2 CONCAT IEC Combine two STRING variables
FC 3 D_TOD_DT IEC Combine DATE and TIME_OF_DAY to DT
FC 4 DELETE IEC Delete in a STRING variable
FC 5 DI_STRNG IEC Data type conversion DINT to STRING
FC 6 DT_DATE IEC Extract the DATE from DT
FC 7 DT_DAY IEC Extract the day of the week from DT
FC 8 DT_TOD IEC Extract the TIME_OF_DAY from DT
FC 9 EQ_DT IEC Compare DT for equal
FC 10 EQ_STRNG IEC Compare STRING for equal
FC 11 FIND IEC Find in a STRING variable
FC 12 GE_DT IEC Compare DT for greater than or equal
FC 13 GE_STRNG IEC Compare STRING for greater than or equal
FC 14 GT_DT IEC Compare DT for greater than
FC 15 GT_STRNG IEC Compare STRING for greater than
FC 16 I_STRNG IEC Data type conversion INT to STRING
FC 17 INSERT IEC Insert in a STRING variable
FC 18 LE_DT IEC Compare DT for smaller than or equal
FC 19 LE_STRNG IEC Compare STRING for smaller than or equal
FC 20 LEFT IEC Left part of a STRING variable
FC 21 LEN IEC Length of a STRING variable
FC 22 LIMIT IEC Point Math Limit
FC 23 LT_DT IEC Compare DT for smaller than
FC 24 LT_STRNG IEC Compare STRING for smaller than
FC 25 MAX IEC Point Math Select maximum
FC 26 MID IEC Middle part of a STRING variable
FC 27 MIN IEC Point Math Select minimum
FC 28 NE_DT IEC Compare DT for unequal
FC 29 NE_STRNG IEC Compare STRING for unequal
FC 30 R_STRNG IEC Data type conversion REAL to STRING
FC 31 REPLACE IEC Replace in a STRING variable
FC 32 RIGHT IEC Right part of a STRING variable
FC 33 S5TI_TIM IEC Data type conversion S5TIME to TIME
FC 34 SB_DT_DT IEC Point Math Subtract two time values
FC 35 SB_DT_TM IEC Point Math Subtract duration from a time
FC 36 SEL IEC Point Math Binary selection
FC 37 STRNG_DI IEC Data type conversion STRING to DINT
FC 38 STRNG_I IEC Data type conversion STRING to INT
FC 39 STRNG_R IEC Data type conversion STRING to REAL
FC 40 TIM_S5TI IEC Data type conversion TIME to S5TIME

PID Control Blocks

Number Name Family Description
FB 41 CONT_C ICONT Continuous Control
FB 42 CONT_S ICONT Step Control
FB 43 PULSEGEN ICONT Pulse Generation
FB 58 TCONT_CP CONTROL Temperature Continuous Controller
FB 59 TCONT_S CONTROL Temperature Step Controller

Communication Blocks

Number Name Family Description
FB 2 IDENTIFY CP_300 For checking device
properties
FB 3 READ CP_300 Reads data from a data area of the communication partner specified by a name or index depending on the assignment of parameters for the job.
FB 4 REPORT CP_300 Allows unconfirmed transmission of variables by an FMS server.
FB 5 STATUS CP_300 allows status information to be requested from the communications partner on the specified FMS connection.
FB 6 WRITE CP_300 Transfers data from a specified local data area to a data area on the communication partner.
FB 8 USEND CP_300 Uncoordinated Sending of Data
FB 9 URCV CP_300 Uncoordinated Receiving of Data
FB 12 BSEND CP_300 Sending Segmented Data
FB 13 BRCV CP_300 Receiving Segmented Data
FB 14 GET CP_300 Read Data from a Remote CPU
FB 15 PUT CP_300 Write Data to a Remote CPU
FB 20 GETIO IO_FUNCT Read All Inputs of a DP Standard Slave/PROFINET IO Device
FB 21 SETIO IO_FUNCT Write All Outputs of a DP Standard Slave/PROFINET IO Device
FB 22 GETIO_PART IO_FUNCT Read a Part of the Inputs of a DP Standard Slave/PROFINET IO Device
FB 23 SETIO_PART IO_FUNCT Write a Part of the Outputs of a DP Standard Slave/PROFINET IO Device
FB 55 IP_CONFIG CP_300 Transfers a configuration data block (CONF_DB) containing connection data for an Ethernet CP.
FB 63 TSEND COMM Sending Data via TCP native and ISO on TCP
FB 64 TRCV COMM Receiving Data via TCP native and ISO on TCP
FB 65 TCON COMM Establishing a Connection using TCP native and ISO on TCP
FB 66 TDISCON COMM Terminating a Connection using TCP native and ISO on TCP
FB 67 TUSEND COMM Sending Data via UDP
FB 68 TURCV COMM Receiving Data via UDP
FC 1 DP_SEND CP_300 transfers data to the PROFIBUS CP
FC 2 DP_RECV CP_300 receives data on PROFIBUS
FC 3 DP_DIAG CP_300 used to request diagnostic information
FC 4 DP_CTRL CP_300 transfers control jobs to the PROFIBUS CP
FC 5 AG_SEND CP_300 data by means of a configured connection to the communication partner (<= 240 bytes).
FC 6 AG_RECV CP_300 data by means of a configured connection from the communication partner (<= 240 bytes, not email).
FC 7 AG_LOCK CP_300 the external data access by means of FETCH/WRITE (not for UDP, email).
FC 8 AG_UNLOCK CP_300 the external data access by means of FETCH/WRITE (not for UDP, email).
FC 10 AG_CNTRL CP_300 allows you to diagnose connections. When necessary, you can reinitialize connection establishment using the FC.
FC 11 PNIO_SEND CP_300 used for data transfer in
the CP modes PROFINET IO controller or PROFINET IO device.
FC 12 PNIO_RECV CP_300 used to receive data in the CP modes PROFINET IO controller or PROFINET IO device.
FC 40 FTP_CONNECT CP_300 Establish an FTP connection
FC 41 FTP_STORE CP_300 Store a file on the FTP server
FC 42 FTP_RETRIEVE CP_300 Retrieve a file from the FTP server
FC 43 FTP_DELETE CP_300 Delete a file on the FTP server
FC 44 FTP_QUIT CP_300 Enable an FTP connection
FC 50 AG_LSEND CP_300 data by means of a configured connection to the communication partner.
FC 60 AG_LRECV CP_300 data by means of a configured connection from the communication partner (not email).
FC 62 C_CNTRL CP_300 Query a connection status for S7-300

TI-S7 Converting Blocks

Number Name Family Description
FB 80 LEAD_LAG CONVERT Lead/Lag Algorithm
FB 81 DCAT TIMERS Discrete Control Alarm Timer
FB 82 MCAT TIMERS Motor Control Alarm Timer
FB 83 IMC COMPARE Index Matrix Compare
FB 84 SMC COMPARE Scan Matrix Compare
FB 85 DRUM TIMERS Event Maskable Drum
FB 86 PACK MOVE Pack Data
FC 80 TONR TIMERS Software Timer On Delay—Retentive
FC 81 IBLKMOV MOVE Indirect Block Move
FC 82 RSET BIT_LOGC Reset Range of Outputs
FC 83 SET BIT_LOGC Set Range of Outputs
FC 84 ATT TABLE Add to Table
FC 85 FIFO TABLE First In/First Out Unload Table
FC 86 TBL_FIND TABLE Table Find
FC 87 LIFO TABLE Last In/First Out Unload Table
FC 88 TBL TABLE Table
FC 89 TBL_WRD TABLE Move Table to Word
FC 90 WSR SHIFT Word Shift Register
FC 91 WRD_TBL TABLE Word to Table
FC 92 SHRB SHIFT Bit Shift Register
FC 93 SEG CONVERT Seven Segment Decoder
FC 94 ATH CONVERT ASCII to Hex
FC 95 HTA CONVERT Hex to ASCII
FC 96 ENCO CONVERT Encode Binary Position
FC 97 DECO CONVERT Decode Binary Position
FC 98 BCDCPL CONVERT Ten’s Complement
FC 99 BITSUM CONVERT Sum Number of Bits
FC 100 RSETI BIT_LOGC Reset Range of Immediate Outputs
FC 101 SETI BIT_LOGC Set Range of Immediate Outputs
FC 102 DEV MATH_FP Standard Deviation
FC 103 CDT TABLE Correlated Data Table
FC 104 TBL_TBL TABLE Table to Table
FC 105 SCALE CONVERT Scaling Values
FC 106 UNSCALE CONVERT Unscaling Values

Miscellaneous Blocks

Number Name Family Description
FB 60 SET_SW TIMEFUNC supports the summertime/wintertime changeover in CPUs that do not have the time status. For this purpose it sets the CPU clock to the current time and according to the changeover rules in the Control DB.
FB 61 SET_SW_S TIMEFUNC supports the summertime/wintertime changeover in CPUs that do have the time status. For this purpose it sets the time status to the current time and according to the changeover rules in the Control DB.
FB 62 TIMESTMP TIMEFUNC transfers the time-stamped messages of an IM153-2 into its instance DB.
FC 60 LOC_TIME TIMEFUNC reads the time status or time of the CPU and calculates the local time. It is therefore only useful on CPUs with time status.
FC 61 BT_LT TIMEFUNC calculates the local time from the base time given at the input.
FC 62 LT_BT TIMEFUNC calculates the base time from the local time given at the input.
FC 63 S_LTINT TIMEFUNC sets the required time interrupt to the preset time. This time is given in local time.




Case Study: Water and Waste Water Plants

Water and Waste Water Plants Transform Using Web-Launched, Java-Based SCADA Software

Professionals in the water and waste water management field face a series of difficult challenges as they seek to stabilize and expand their service delivery capabilities, while at the same time meeting the regulatory reporting requirements of the state. As if that were not enough, they must accomplish this in the current economic environment facing local governments. Managers clearly need better ways of doing business and an economic model which will give them the functionality and scalability required at a price point that does not break the budget.

Presented here are the perspectives of three jurisdictions that have found a workable solution to address their needs. Brazeau County in the Province of Alberta Canada; the City of Lago Vista in Texas and the Helix Water District in California’s San Diego County.

How It All Began

Steve Hechtman, the President and Founder of Inductive Automation Software, brings over 20 years experience as a systems integrator to the problem of managing water and waste water treatment plants. He shares his perspective on why he got into the software business and why it should matter to you:

“We needed a solution that allowed for PLC data to be readily available in SQL databases, that would not become obsolete every few years and which would provide an affordable expansion model for both run time and development needs. That was not available in the marketplace so I was forced into the software business.

“The first hurdle we put behind us was making PLC data readily available in SQL databases. From there we naturally started making reports and user interfaces using web pages. But it quickly became apparent we needed a rapid, standardized way of making such applications and of course security was a concern so we started investigating the various technologies available to do this.

“Ultimately, we decided to use Java for our platform, when virtually every other SCADA vendor chose the Microsoft route.”

Why Choose Java?

“Proofing against obsolescence is one major consideration. Every five years Microsoft reinvents itself and in that act churns the very platform these other SCADA applications are built on. The cost to the water plant manager is often prohibitive with current traditional vendor licensing models.

“Cross-platform support is another consideration. Vista was having problems. Meanwhile Linux operating systems such as Ubuntu are free and are gaining ground fast around the world.

“Our Java application could care less what platform it runs on or what database it interacts with. It works comfortably with them all.

“So now, today, what do we have? We have the world’s only fully mature, cross-platform, web-launched, secure, reliable SCADA application server which can support any SQL database and which is very easy to use. A skilled integrator can set up an amazing SCADA application in about an hour and then proceed from there to launch five or fifty clients anywhere, totally securely.”

The benefits to the water and waste water plant manager or supervisor will be obvious as you read the case studies and thoughts of Rick Flikkema from Brazeau County, Alberta; M.J. Duke from the City of Lago Vista and Henry Palachek, the Information and Process Control Systems Supervisor from the Helix Water District in San Diego.

Brazeau County, Alberta, Canada

Clearly, every municipality has a water and waste water department. The people who work in these departments are responsible for maintaining water quality delivered to their constituents as well as the delivery system itself. Well pumps and HighLift pumps are typically employed to move the water from the inside the earth or from reservoirs to fill the miles of pipes that go to each home and business to supply fresh potable water. On the output end, the systems have to treat contaminated water and remove the waste.

Typically these departments rely on the expertise of a system integrator (SI) or a consultant to guide them in their technological quests.

The county of Brazeau is located north-west of Calgary, Alberta in the Canadian Rockies. They needed to upgrade their Texas Instruments PLCs and chose to go with KSB Industrial (KSBI) as the SI.

Ken Bannard, President of KSBI, used GE PLCs for the Brazeau county new technology platform. These two PLCs are connected to the main office by leased lines using 9600 baud modems. Along with the new platform, KSBI implemented new SCADA software as well.

FactoryPMI from Inductive Automation was selected as the ideal software for this implementation. Rick Flikkema operates the two water plants and the three lift stations for the county.

“FactoryPMI has eased up alot of my time,” Rick said. “I was skeptical at first, when Ken introduced me to FactoryPMI.”

Over time Ken showed Rick how it would save the county money and time. “FactoryPMI is very cost-effective solution. Our end users become very interested when they hear that they can have unlimited clients at no extra cost,” Ken said.

Most municipalities are on a reduced budget and have fewer resources available to them. FactoryPMI makes up for those ‘losses’.

“FactoryPMI is both the development system and runtime. My customer has the ability to have anyone make changes if needed,” said Bannard. “And with the VPN remote access ability, a web access license doesn’t need to be purchased, unlike most other SCADA products.”

For the county of Brazeau, the total cost of ownership is hugely attractive. They have one server for control, monitoring and data tracking of the two water plants and lift stations.

“FactoryPMI has been running for 24 months trouble-free. It has made my job easier because I can monitor all areas of operation efficiently,” said Rick.

For the county of Brazeau, when they move towards additional reporting and data logging as well as a third water plant, their upfront costs will be negligible. “The upgrade path is very easy and inexpensive,” remarked Bannard. “FactoryPMI is good for integrators since it empowers them on behalf of their customers. The no-limit tag count allows me to provide the best possible system for my customer with minimal capital outlay.”


Realtime Status and Control Overview

City of Lago Vista Water and Waste Water Facilities

Deep in the heart of Texas, there is a city of approximately 6,000 people called Lago Vista. Located just west of Austin, there are many qualified system integrators nearby.

Patrick Callaghan from MCS Integrations was selected as the SI to assist Lago Vista with their SCADA upgrade path. M.J. Duke, Superintendent of Plant Operations for the district explains why: “Pat does his homework and is very thorough. If Pat likes it, then I like it!”

And Pat likes FactoryPMI from Inductive Automation.

Lago Vista often had issues with their previous software; and the common answer to many questions was “We just can’t do that.” And if there was a way, it was often too costly to implement.

Like most integrators, Callaghan mainly used one of the ‘big three’, and typically used Wonderware’s Intouch HMI software. “With what we have accomplished using the stock FactoryPMI software, I would have had to write custom code [with Wonderware],” indicated Callaghan.

Inductive Automation’s licensing model made the decision easy. “We were operating on stand-alone systems, and wanted to move towards a centralized system,” said Duke. “Runtime licensing with our former supplier was an issue. The upfront license costs for the new system were one-fifth what it would have cost using Wonderware,” stated Callaghan.

Duke oversees the operation of two water plants and the waste water facilities. There are six distribution pump stations remote to the main plants, as well as two intake stations all having Automation Direct PLC technology. There are also four holding ponds which require monitoring. And soon, Lago Vista will add an irrigation system for a city-owned golf course which will also need control and monitoring.

MCS Integrations began the migration by consolidating the existing applications into one FactoryPMI server-based application. After adding all the functionality available before the migration, the city was able to add additional functionality which wasn’t previously possible. “There were no holes in the conversion,” Callaghan said. “There was a learning curve in the beginning – my database experience was small. But Inductive Automation’s new SQLTags technology was a blessing.”


Graph Screen Showing History of Turbidity, Tank Level, Flows, etc.

The former HMI/SCADA system had stand-alone applications running in each different location. In order to monitor the operations, the operators needed to drive to individual locations. While the efficiency of the department wasn’t ideal, it was rapidly deteriorating as the cost of operator travel increased.

Callaghan installed a FactoryPMI server at the primary water plant (WP1). Plant-to-plant communications were established with fiber optics. VHF communications connect the remote

PLCs to the system network. As well, there are client workstations in each plant. The router at WP1 connects to the Internet to allow for remote VPN access. Each plant also has a Wi-Fi access point.

Lago Vista wanted to be able to access all systems from each plant, as well as from mobile tablets, which they can now do. “When the operators are in their trucks, they can use the tablet PCs to access the network,” Duke said. They use a Bluetooth-enabled cell phone for internet connectivity and then create a VPN connection through the Internet to the router located at WP1.

All forms the operators need are embedded into the FactoryPMI system. The operators can input data in real-time, speeding up some compliance requirements. “No more driving to get data. They used to enter data on paper on a clipboard,” said Duke. “We looked into using Palm Pilot type devices before, but we wouldn’t be able to get the amount of data onto the screen that we needed. Without the tablets and system coverage, our response to issues would be way too slow.”

The department has to provide 24/7 service, so the mobile tablets and the ability to access the systems from any location means very fast response. “The FactoryPMI server will send an email alarm-notification to the cell phone of the person on call,” says Callaghan. The operator can then log-on to the FactoryPMI server and figure out what the issues might be. “This has increased our efficiencies,” stated Duke.

The operators can also do process checks at night, which can catch problems before they escalate. “Equipment failure can be circumvented,” says Callaghan.

Compliance regulations require city water departments to log and track data on all aspects of water plants and waste water facilities. This is done to ensure municipal compliance with the law, and ensure required levels are maintained (such as of chlorine).

Callaghan says, “Data logging with FactoryPMI is really easy. Logging this much data with Wonderware would have been much more difficult and costly. We have over 3,000 tags. Every day there is something different to add – with direct data entry and SQL—voila!”

There was some hand-holding at the beginning of the project due to Callaghan’s lack of database experience. “The support from Inductive Automation was immediate when required,” Callaghan said. He observes that what the project now entails could not be easily replicated using another HMI product. In fact, he wonders if it would be possible at all without a lot of custom code. There is no doubt that—regardless of which product it might be—it would cost more and take longer.

Callaghan concludes “FactoryPMI is a non-proprietary solution and uses standard platforms. The scripting language is very powerful (Python for Java). It’s a fabulous product!”


A Year’s Worth of Data in a PDF Document

An interview with Helix Water District’s Henry Palachek

Information and Process Control Systems Supervisor

Henry Palachek has been with the Helix Water District for the past fifteen years. He serves as the Information and Process Control Systems Supervisor. Inductive Automation (IA) caught up with him to get his views on the value of implementing web-launched and database centric SCADA software in meeting the challenges he faces supervising the water and waste water systems for the Helix Water District.

What is the biggest challenge you face with your job?

The way in which SCADA systems age and how it is related to the operating system they work on is a big challenge for us particularly right now.

With the current SCADA system and how traditional SCADA software products work, you are not certified to run on Vista. You are then forced to upgrade your system because you are only certified to work on Windows 2000 or XP II and if those are going away then the cost of upgrading the SCADA system becomes too much.

This means that obsolescence becomes a big problem with traditional SCADA software products.

When software is created based on working directly with the DB, which is what Inductive Automation has done with FactorySQL, you get a longer life span for the system. The life span goes to 10-13 years. Obsolescence and cost prohibitive upgrade cycles then are not a problem.

How does Inductive Automation’s FactorySQL assist you with California state reporting requirements?

The Surface Water Treatment Rule for California requires monitoring filters’ turbidity and reporting that to the state on set intervals. So having a software package that allows for talking directly to the field controller is a great advantage.

Helix has 50 sq. mile distribution system and 260,000 customers. The Distribution Manager logs the data to the database on 5 minute intervals. We have then set up stored procedures that create hourly and daily summary data.

This then gives us the ability to create reports which we can mail directly to the state for complying easily with the Surface Water Treatment Rule.

We have had InTouch for over 10 years. Classic SCADA packages don’t have an easy way to do that. The drag and drop ease of use of FactorySQL is great for these reporting requirements.

Ease of use, learning curve and set up time are important factors. Has IA software measured up in that area?

Absolutely, I had it set up on my notebook in about half an hour. With a classical Wonderware package it is cumbersome if you do DB. It requires multiple steps to configure. With FactorySQL it is like one step configuration. You put in a tag name and drag the tag name and drop to the bottom to create a table and start logging. It is like night and day difference.

How did you make a decision to go with Inductive Automation software?

I went out and looked at all the leading vendors; none of them had the same ease of use with the drag and drop feature.

We have had no issues with reliability or uptime.

Plus there is a big advantage if a computer fails. With traditional systems you have to rebuild the computer and then get SCADA system back on it with whatever patches or upgrades you may have. It can cost time and money and lost data. With FactorySQL you can take any PC almost out of the box and get it easily up and running. This will help you solve hardware problems a lot faster.

It is a nice feature to have unlimited tags and to not have to buy a license for unlimited tags and not to worry about how many tags I do have.

Is there a cost advantage?

We’re running 16 SCADA clients in our treatment plant. When you start adding up 16 licenses just so our operators can view and acknowledge alarms, it starts getting pretty expensive.

The cost of just a single license for development or runtime with traditional software vendors can be about $5,000 to $12,000. So you certainly do have a cost advantage with FactorySQL and FactoryPMI, as the license is sold by the server and provides unlimited tags and unlimited clients to us as the customer.

If you are doing a SCADA change out with a large number of clients price does become an issue.

Any final thoughts for our readers?

In the water utility field there is a lot more pressure than there used to be in three areas:

1. Regulation requirements—Working with a database-centric product helps with regulatory issues.

2. Economic issues—It is not just business as usual. You really have to look at the cost of the system and FactoryPMI and FactorySQL have a definite advantage there.

3. Managers need better ways of doing business—Web technology with SQL databases is really a better way of doing business.