Ignition Newbie looking for some help getting started

Hello there, kind developer! This post will be kinda long, so you might want to refill that coffee.

First, a little about my background so you have an idea what my knowledge level is:
I’ve been a controls engineer for about 30 years. In that time I’ve programmed mostly Allen Bradley ladder logic stuff. My most recent experience is all in automotive manufacturing, at the plant level providing support to skill trades on Control Logix and Fanuc robots. In these roles, I’m mostly using whatever code the vendors and corporate developed and troubleshooting and improving that ‘as installed’ code. I do have some light VB.NET and web development in my past, mostly as a hobby.

I recently started a new job where I have to, among other things, develop a SCADA/MES system for my company’s foray into automation. We currently have 2 machines installed, both with a Control Logix/Fanuc architecture that I need to get this SCADA system working with ASAP. I chose Ignition based on what I’ve read online to be that SCADA system. My reasoning was that I can get it working for free before I pay for anything, I can only pay for what I need as I scale up, and it looked pretty easy to work with… Fast forward to actually trying to get something going and I realize that I’m a bit out of my depth. I went through the University. Then started reading around the forum, and not really finding the answers definitively, I decided to reach out and expose my ignorance to you fine people.

My initial approach to the SCADA is to make it similar to ones I’ve used in the past. By used I mean as a user. I never had access to the backend. Anyway, I was figuring I’d do a dashboard in perspective with nav buttons on the left side to select plants(Only one at the moment) and a main window with an overview of all the machines on the floor. (Again, only two at the moment) This overview would be something simple, and exactly the same for each machine. So I made a view with 4 labels in it for machine name, status(auto,manual, blocked,staved and running), faults, and part name. My goal would be then to have the first three navigate you to a more detailed list, think like a fault history screen on a PanelView application, and the last one take you to a history of the parts that have been run, with maybe cycle time and some other OEE stuff. Not there yet, but I have to get there eventually. Anyway, I digress. So I slapped some labels on to a view and realize pretty quickly my first problem: I can’t make an Ignition tag that can look at multiple other tags to get a value. I’m thinking in my head like using a DINT in ControlLogix that has a value based on what bits of that DINT were on. Anyway, forum search forum search and I find a way to do that. YAY me! I can read! So the status thing works now. I also search around the forums to find a way to pass a custom property to give me the tag providers name so that I can actually use this template. YAY again, I’m on a roll! Then I get to the fault label and quickly hit a brick wall. All the faults in the PLC are A) in DINTS and B)Defined by station. So you have like Cell.Faults[0] - [9], Servo1.Faults[0], etc. OK! I’ll just make ignition tags for the relevant DINTS and…

Wait, I can’t see the bits in the DINTS! Forum read, Forum read, Forum read… I can’t see the bits. From what I can gather from the forum, I have to make a tag for each bit. Well that sucks. And how does logging work? There isn’t anything polling these tags even if I create them. Maybe I have to configure EACH TAG to log then? And what about the description? How do I get this export of the faults that I made from the Panelview program into ignition so I don’t have to type all this stuff in?

BOOM. Head explodes. Close the computer. Come back tomorrow. Breath…

So here I am, hoping someone will pity me enough to help me out with this. A big long list of questions is going to take someone a long time to answer, and I don’t want to monopolize your time, nice person who wants to help. So I’ll start with maybe just a couple and hope for the best.

  1. The deal with getting my faults into Ignition and logged into the database so I can use them for reports and tables on my detail page. I’m thinking that I could write a value change script on the DINT value(Not that I know how to write a script in here) Something along the lines of a FOR loop maybe that has an index that can then do a getbit(?) query on each bit in the DINT and maybe return which bit is active? But then I’d have to have a way to A) store these descriptions that I have in this CSV and look them up based on which DINT and which BIT was returned. Then I’m wondering what happens if I have more than one BIT on? I need to log all the active bits to the database with the relevant description, but for my label on the overview screen maybe I only want to return one bit so I can display that fault message(again, gotta get that description from somewhere) and make that label display the first fault it finds.

  2. Do I have to manually create each bit in Ignition to log my faults? Is that the easiest way? Any way to import that CSV I exported from the PanelView to create the tags? I probably have to make a standard tag map in the PLC so I can use a standard tag path for each instance of the template. No way to map this in Ignition?

Anyway, enough for now. I’ve taken enough of your time. Thanks for reading if you got to the bottom. And thank you even more if you’re willing to help!

Mike

Welcome!

Biggest thing to start with is Inductive University… that will get you exposed to SOOOO much.

Next… read up on Ignition UDTs. And then read up on Rockwell AOI vs UDTs: Cannot read some tags inside Rockwell AOI - #5 by Kevin.Herron

It is trivial to create an Ignition UDT that has members that are boolean that address a specific bit in a DINT in the PLC. You don’t need to read the DINT and then go from there.
Example:
This is an OPC item path for a BOOL tag in a UDT that is addressing a bit on a DINT in a Rockwell PLC.
image

Once you get your UDTs setup, then you can map thing automagically into the UDT to generate alarms etc…

Hi Mike. First, welcome to the forums! :slight_smile:

@bschroeder pretty well beat me to it, but here are a couple of UDTs you can import to take care of DINTS and INTS.
breakoutUDT.json (27.1 KB)

Link to Inductive University

Hi there!

I did go through the Inductive University. There is indeed a lot in there, and it gave me some great ideas on what is possible.

As to mapping the UDT in Ignition. I believe what you’re telling me to create a DINT read UDT. So the UDT would have 32 tags in it, and you’d have to pass a parameter with the tag provider/and DINT name so that the UDT could be reused. I can see how that might work. How do you get the descriptions in there?

Thank you for the welcome, and the file.

Not really sure what it does or what to do with it though. :joy: Let me do some more reading…

Would you be able to make a sufficiently generic UDT that could cover all your use cases?

If so, then that one UDT might have a generic description for that instance of the UDT… say a Cfg_Description memory tag. Then you can use that in combination with a static defined alarm text for each of the bits to generate your alarm message/

Ok, figured out how to import and configure the path on there. That little toggle to override the definition isn’t obvious! So that UDT is cool. Should save a bit of time, and it gave me an idea…

I’m thinking that I can make several UDTs that contain the data I want maybe, then map the relevant PLC DINTS to them. Probably. This is hard. :laughing:

But, to your original suggestion. I was thinking something along those lines. I remember something about static data from the Induction University, seems that had to do with tables though. Don’t know how you could A) store a .CSV file in Ignition and B) Use that stored CSV to pass the description to the UDT.

I suppose I can just create the UDT and copy/paste into the descriptions.

I’m going to go read or watch the tag stuff again.

Thanks!

One misconception to clear up: while Ignition’s Logix driver doesn’t browse down to the bit level for drag-and-drop, it certainly accepts .0 through .31 suffixes on a DINT to have full read/write addressing of bits. And the driver is smart enough to do one read of the DINT to satisfy any combination in one go (as long as they are at the same subscription pace). If you are already reading the DINT, tags for the individual bits are “free”.

Ignition’s Logix driver spoils us users thanks to the browsable nature of the Logix tag protocol. Most other protocols require you to construct OPC item paths manually (or semi-manually).

There are many limitations imposed by other products that simply don’t apply to Ignition.

Thanks for that info, I did read in the Forums how to get the .0 - .32 stuff addressed even though it doesn’t browse that way. I’m just spoiled in the way of using a number from a dint to drive a panelview indicator and set up triggers in an alarm panel. In the end, I’m really trying to use Ignition to mimic what’s already developed and displayed on a machines’ Panelview and log those alarm and metric data for reporting. Due to the fact that the machines I have weren’t developed in a standard way, and Ignition wasn’t even on the radar when they were developed, I’m trying to shoehorn that stuff into Ignition after the fact. Add to it that I have to learn Ignition as I go and it gets a bit overwhelming. Thanks for all of your input, I really do appreciate any insights that anyone has to offer.