Igniton Edge (HMI) Multidimensional UDTs

theColonel26

Lifetime Supporting Member
Join Date
Feb 2014
Location
West Michigan
Posts
785
Can Ignition Edge handle working with multidimensional structs/UDTs on the PLC? Say I have an array of UDTs each element represent an identical machine in the real world. Inside those UDTs I may have more UDTs. How does Edge handle this?

I want to be able to reuse the same screens for each machine. Basically depending on which machine I want to control the screen would just point to one of the elements in the array of UDTs. Is this possible?


Wonderware Edge HMI is proving to be a nightmare in trying to do this on a large scale.
 
I have what is essentially a huge UDT, with many other complex UDT's inside of UDT's under it ex:


Code:
TopLevel:
   SomeReal
   SomeInt
   DriveUDT:
      SpeedAct
      TorqAct
      SpeedCal
      TorqueCal
      DriveStatus:
         Healthy

         Running

         ZeroSpeed
   PosPid:
      FeedbackScaling:
         EUMin
         EUMax
         RawMin
         RawMax
         RawIn
         ScaledOut
         SPTare
         SPHold

         Cmd:
            SetLow
            SetHigh
            Zero
            Tar  

      Setpoint
        .
        .
        .


You get the picture.
I just create a new Ignition datatype from that mess, and use it straight away.
You can even create a single dimensioned (UDT[x]) datatype in Ignition/Edge. It is a bit of work, but not too bad, and I have a bunch that are about 3200 bytes long. For really large things, I find working with them in an external programming editor helps a lot, props to UltraEdit/UEStudio there.



Edge and Full Ignition handle it exactly the same; for all intents and purposes, as far as the Vision and Tag modules go, they are completely identical. The fact that All the ignition systems are identical is a huge + to me, unlike Rockwell were everything is completely different. On all of my lines with Ignition, I normally do everything from the main server rack, but for the master OCS, I put a local gateway, or an Edge gateway on it... Then just copy the entire tag tree and project from the Server Master to the local gateway, and set it up to fall back to the local client if the network or main server dies. I have it check every minute to see when the main server comes back, and switch over again. All the operator sees is a blink, if he is looking at that screen for a moment.
 
I have what is essentially a huge UDT, with many other complex UDT's inside of UDT's under it ex:


Code:
TopLevel:
   SomeReal
   SomeInt
   DriveUDT:
      SpeedAct
      TorqAct
      SpeedCal
      TorqueCal
      DriveStatus:
         Healthy

         Running

         ZeroSpeed
   PosPid:
      FeedbackScaling:
         EUMin
         EUMax
         RawMin
         RawMax
         RawIn
         ScaledOut
         SPTare
         SPHold

         Cmd:
            SetLow
            SetHigh
            Zero
            Tar  

      Setpoint
        .
        .
        .
You get the picture.
I just create a new Ignition datatype from that mess, and use it straight away.
You can even create a single dimensioned (UDT[x]) datatype in Ignition/Edge. It is a bit of work, but not too bad, and I have a bunch that are about 3200 bytes long. For really large things, I find working with them in an external programming editor helps a lot, props to UltraEdit/UEStudio there.



Edge and Full Ignition handle it exactly the same; for all intents and purposes, as far as the Vision and Tag modules go, they are completely identical. The fact that All the ignition systems are identical is a huge + to me, unlike Rockwell were everything is completely different. On all of my lines with Ignition, I normally do everything from the main server rack, but for the master OCS, I put a local gateway, or an Edge gateway on it... Then just copy the entire tag tree and project from the Server Master to the local gateway, and set it up to fall back to the local client if the network or main server dies. I have it check every minute to see when the main server comes back, and switch over again. All the operator sees is a blink, if he is looking at that screen for a moment.


Doing a UDT array is exactly what I would like to do. that way it would be easy for me to add more machines to the program in the future with ease. You said that making a UDT array is a bit of work. Can you elaborate? or provide a link to information on that?
 
You can add as many as you need.
Actually making an array of UDT's is a bit of a pain, because A) You cannot name the individual array elements separately, and B) You have to go ahead and add in the extra parameter element for the array index.


I personally don't bother, I just use the base UDT tag I have, give it a meaningful name, and use them wherever.


I base most of my machine programming on large UDT's, so have identical ones for every driven component of every machine in the plant. Makes it easy to do nice, global template objects, and refer only to the path of the UDT in Ignition.


Taking time to think about Tag layout in Ignition is the most important thing I can stress! My tag database is laid out like this:


Code:
Company
   Plant#
      Dept
         Machine
            Machine Section
               Section UDT
               Misc Section Tags

            Machine Section
               Section UDT
               Misc Section Tags

         Another Machine
            Machine Section
               Section UDT
               Misc Section Tags

            Machine section
               Section UDT
               Misc Section Tags

      Dept
         Machine
            Machine Section
               Section UDT
               Misc Section Tags


So, having an array of UDT's really doesn't fit in.
It is possible to do, but only single dimension (as that is all Logix supports).


The UDT tags
 
To expand, I use complex UDT structures in my ControlLogix program, and I do create arrays out of those complex structures. I never use multidimensional arrays, I find it easier just to create custom single dimension arrays in the udt.

So the PLC tag might look like:

MachineArrary[0..100] AS Machine_Array_UDT

Within Ignition, you don't really need to make arrays to match, create instances and make use of parameters. With parameters and some of the built in references Ignition does a lot for you.

Say I now create a "Machine" UDT within Ignition, with a parameter called "MachineNumber". I can now just create instances of the Machine udt and assign it a machine number, which is really the array element of my MachineArray[0..100] tag in the PLC.

Ignition Tag: "MachineA" with MachineNumber = 87, this would reference the PLC tag MachineArray[87].

Ignition Tag: "MachineB" with MachineNumber = 52, this would reference the PLC tag MachineArray[52].


The OPC path definition of the Ignition UDT would look something like this:
[PLC]MachineArray[{MachineNumber}]

If you get really creative, you can leverage more parameters:

[{OpcName}]MachineArray[{MachineNumber}]/{TagName})

Then the OPC path builds itself as you build the Ignition UDT, assuming you are naming the Ignition tags in the udt to match the PLC udt names.


For screen references, you can easily add custom properties to the root of the window for the "MachineTag", and indirect your components to that property, as you change machines update the MachineTag reference and all the components will point to the new machine. in a case like this, I would build templates for the window rather than doing everything within the window, I just find it's easier to mange.
 
Last edited:

Similar Topics

I have a FX3U clone that I am failing to get a simple Structured Text example working on and would really appreciate some help. I created a...
Replies
30
Views
976
I'm trying to build my Classic Step 7 programming skills this weekend. I get stuck on little things that are not covered in YouTube tutorials. I'm...
Replies
7
Views
316
Hello, I have been tasked with adding some analog signals for display and alarm setup in some old Schneider Electric HMIGTO HMI-panels. I have...
Replies
4
Views
179
Good afternoon everyone, could someone guide me on how to program a falling edge in a wave micro control using CWDesigner? It is to reset a...
Replies
2
Views
132
Can anyone share a way to make a button on the HMI that hits the "Ack Page" in an Alarm and Event Summary Window? or better yet - a plc tag...
Replies
5
Views
266
Back
Top Bottom