Design Like A Pro: 25+ Tips For Lightning-Fast Development
56 min video / 47 minute read Download PDFSpeakers
![Reese Tyson](/blog/sites/default/files/2024-07/Reese%20Tyson.jpg)
Reese Tyson
Sales Engineer III
Inductive Automation
![Eric Knorr](/blog/sites/default/files/2024-07/eric-knorr%20%281%29.jpg)
Eric Knorr
Application Engineer III
Inductive Automation
Fast development speed is a crucial advantage in industrial automation, letting you deliver solutions rapidly, lower project costs, and make stakeholders happier. So what if there was a way to cut your development time in half? You can achieve it by working smarter, not harder, and this webinar will show you how to do exactly that.
Join industrial automation experts as they share their top tips and tricks for developing applications amazingly fast (and without compromising quality). You’ll learn about functions in the Ignition designer that shorten a project’s timeline, how to speed up scripting, time-saving techniques for using the Ignition gateway, and a whole lot more.
- See live demos of time-saving tools
- Discover efficiency hacks to accelerate project design
- Get tips on speeding up scripting
- Learn inside tricks to save time when using Ignition’s gateway
Transcript
00:00
Reese Tyson: Hello everyone! Welcome to our webinar, "Design Like A Pro: 25+ Tips For Lightning-Fast Development." We are so glad that you can join us today, and I'm really excited about today's topic and getting to share some quick and easy ways to speed up your industrial application development. My name is Reese Tyson. I'm a Sales Engineer here at Inductive Automation, and I feel like I have one of the best jobs ever. I get to talk about Ignition all day, so whether that's modules or architectures or best practices, etcetera. I get to talk to folks about their projects and what they're doing. So, I'm also joined today by my colleague Eric Knorr, who's an Application Engineer here at Inductive Automation. Eric, you want to share a little bit about what you do here?
00:46
Eric Knorr: Yeah, sure. My name is Eric Knorr, I work as an Application Engineer here at Inductive Automation, where I get to work in the Ignition designer every day. I also have the best job ever. I make proof of concepts for clients, helping them solve their toughest problems, create cool projects, send to conferences, and as well as internal projects like the public demo, where we're always making improvements and helping things run smoothly.
01:11
Reese Tyson: Awesome, thanks, Eric. Yeah, wealth of knowledge with Eric, so I'm super excited that he can join today and kind of talk about some of the tips. So here's what we got on the agenda for today. I'll start us off by demonstrating some of my favorite tips to design control systems faster. Eric will then share some of his top tools and techniques to speed up the scripting side of things. And then we'll hop over to the gateway to show you some handy tricks to save time there. And then, Eric, I'll throw it back over to Eric, and he'll share a few additional time-saving tips at the end to help you speed up some development. As always, we'll finish up with Q&A to answer any of your questions. So if you think of a question during the webinar, go ahead and type it into the questions area of the GoTo Webinar control panel there, and we'll answer as many of them as we can.
02:02
Reese Tyson: If we can't get to your questions today, though, please reach out and one of our module account reps; they'll be able to answer it for you. So we'll have their contact info at the end of the webinar. Also, this webinar and its slides will be made available within the next few days. If you want to go over any of these tips again or share them with someone who couldn't make it today, that'll be possible. Also, additionally, a little bit different, we're going through tips today, So if we don't cover a tip that you think is valuable to highlight, that you use all the time, definitely throw it in I know it's not a question, but definitely throw it into the questions area. And we may share some of those tips at the end during the question section as well.
02:50
Reese Tyson: So, really quickly, to introduce Inductive Automation, here are a few facts about us. We make software for problem-solvers, plain and simple, and we're focused on our software platform, Ignition. We've been in the business for 21 years. 61% of the Fortune 100 and 44% of the Fortune 500 companies use Ignition. We have a highly diversified customer base across many different industries, and there are Ignition installations, really, in over 100 countries across the globe. We have a network of over 4,000 integrators worldwide that we partner with, and our company... We're profitable and independent with no outside investors. Our focus is purely on providing the best platform for our customers. But a little bit more on Ignition itself, the product that we make: Ignition is a universal industrial application platform for HMI, SCADA, MES, and IoT applications. It acts as a central hub for everything on the plant floor and beyond.
03:52
Reese Tyson: You can really use it to create any type of industrial application that you can dream up. As far as technology goes, it's web-based, it's web-managed, and it's web-deployed, and it has an unlimited licensing model, unlimited tags, designers, database connections, device connections, etcetera, and it can run on many... It's cross-platform, so it can run on Windows and Linux, and Mac, for example. It offers industrial strength, security, and stability, and as we'll be discussing today, it comes with loads of tools and functionality that help you develop applications lightning fast. This ability to develop applications quickly is, really, it's a cornerstone of Ignition. It's always been so important to us to ensure that Ignition excels at letting you build solutions fast, because having that speed gives you a critical advantage. So it lets you deliver solutions rapidly, lowering project costs and ultimately making stakeholders happier, which is all of our end goals.
04:55
Reese Tyson: So that's why Ignition was designed with so many time-saving tools, like templates and UDTs. Also, Ignition's unlimited licensing eliminates roadblocks that would slow you down in the development process, and there's an abundance of learning resources on Inductive University that provide quick answers to questions while you're developing, so you don't waste valuable time hunting down information. We also focus on including features in Ignition that accelerate development speed, such as its unlimited design clients, for faster and easier collaboration. Now, these features are highlighted often because of the immense time-saving value they bring to the end user. However, during this webinar, we really wanted to focus on some features that, you know, may not be as well-known, maybe some hidden gems, if you will. We're always coming out with new features, parts of the platform, and we're going to showcase some of those in case you miss some of them.
05:57
Reese Tyson: So, to set the stage here, I'm going to go ahead and log into this project that I have. I've already created this project with some basic resources, and as you can see, we're using an Olympics theme for today since, you know, they do start tomorrow, after all. You'll notice that I have four different runners in the 100-meter dash here, along with some metadata (weight, height, etcetera), and of course, I had to add a little bit of flavor here and adjust the runner GIF based on the height of the athlete. I can also select these runners. So, if I click on the runner here, you'll notice it'll filter the table over here to that runner and their top three 100-meter times. If I clear that out, you can see all of the times across all four of these runners.
06:43
Reese Tyson: So, pretty basic app, but I wanted to create something that we could utilize throughout this webinar to showcase some of these tips. So, now that we have an idea of the whole project that has been created, let's go ahead and light that torch and kick off our first feature that we are highlighting today, and that's going to be the Tag Reference Tracker, and by the way, there'll be plenty of forced Olympic puns to go around today, so definitely fully embrace the cringe. So, I'll go ahead and escape out of the slides here and bring that over, and we'll go ahead and bring the designer over here, since that's what we'll be in today. So, the first one, like I mentioned, is going to be the Tag Reference Tracker. So, the Tag Reference Tracker, it came out in 8.1.34, and it allows you to track where tags are used across a project, whether that is scripts or views, even indirect bindings that don't list out the full tag path.
07:42
Reese Tyson: And so to access this Tag Reference Tracker, we can actually right-click on a tag. You'll notice I have a UDT, just a runner UDT with four instances of that UDT, but if I go ahead and right-click on, let's say, this weight tag and go to "View Tag Diagnostics" here, it's going to bring up this window. Now, this diagnostics tab is actually, it's already been in the platform, but the Tag Reference Tracker adds this active subscriptions and this reference log to the table, or to the view, I should say, and so the active subscription shows us where we are using the tag, and you'll notice that it's in my webinar project, which is what I have, in Perspective, and my views, and then my runner view. Over here, you can actually see even more details. It goes from Perspective, views, runner. It gives you the root container, any containers that are inside of that root container.
08:43
Reese Tyson: And then all the way down to the property and what type of binding that is using that tag, and so that's a really handy way where we can see where this tag is being utilized. In fact, we can even say, "Hey, I want to dig into this tag a little bit and edit that." I can double-click on that record, and it's going to bring up my view here, and so that's one way that we could utilize the Tag Reference Tracker. The other one is the reference log here. I'll clear out my existing logs, and then I'll go ahead, and what I want to show you here is the reference log is going to give an instance of where this tag is used throughout either the client or in the designer, and so what I can do is if I throw this into preview mode, and maybe I'm going to change Usain Bolt's weight from 207 to 208, just temporarily here. And I refresh this, you'll notice that my reference log brings up a usage, or a log of where that tag was used in my project.
09:49
Reese Tyson: You'll notice it's a write usage, and this usage actually could be either reads or writes, subscriptions, configuration changes, etcetera. So, quite a few options here. Of course, we can also clear that logout on the right-hand side, but quite a few options here as far as the Tag Reference Tracker. And the other thing that I'll mention here is that this may need to be turned on in your gateway as well, so if we go to the gateway and we go to our config and go to gateway settings, this Enable Tag Reference Tracker needs to be enabled in order for the Tag Reference Tracker to work. The next thing that I'm going to mention is kind of sticking along with the troubleshooting and the diagnostics theme.
10:38
Reese Tyson: The next item is going to be the Help Diagnostics View, so this window allows you to see a lot of different statistics as far as the designer goes. Over here on the right-hand side, you can see these statistics apply to this instance only. For gateway statistics, go to the gateway status page, so this is for the designer specifically, and there's a lot of information on here in these different tabs. I'm not going to go through all of them. There is a lot of content. Definitely feel free to go through these on your own, kind of cruise around, see what's there, but two that I'll highlight is this Performance. You can see how much memory we're using, or maybe the tag throughput, etcetera. Another one is this Thread Viewer, which lists all the active threads, or the... I guess all the threads and their state of them, I should say.
11:26
Reese Tyson: The reason I'm highlighting this is you may use this, or, I should say, you may come across this if you call into support and you're having designer issues. The support rep might ask you to save a thread dump, which you can do here. It's just going to save those threads as a JSON structure to your local file system, then you can upload it to your support ticket. So, that's a handy way to grab threads there. Next up, we have some UI tips. The first one that I'm going to mention here is the Tab Index. So, Tab Index, it came out in 8.1.39, so relatively recently, within the last couple months. And it allows you to specify what happens when you press the tab key on your keyboard. Traditionally, Perspective uses the logical draw order of the component, or, in the layman's terms, top to bottom of the view.
12:22
Reese Tyson: So, name, country, weight, height, etcetera. But, say, you wanted to mix that order up, you can do that with Tab Index. If I select, for example, on this country text entry, and I scroll down all the way over here to the right-hand side at the bottom of my meta section, there's a Tab Index Property. Right now, I have it set to one. If I click on my name text entry in the same place, Tab Index is set to two. So instead of going down from Jamaica to 207, when I hit Tab, it should go up back to Usain Bolt. I'll be selected in Jamaica; I'll hit tab, and sure enough, it goes up instead of down. That's, again, a way that you can specify your Tab Index or your tab order across your UI. I'll also mention here along Tab Index lines that, by default, this is actually not a part of meta, but you can come down here to Add Meta Properties in Properties and add Tab Index there.
13:24
Reese Tyson: There's also the DOM ID, which, just a really hot tip here, DOM ID would be maybe useful for using an automatic GUI tester, Python library like Selenium, or something like that, or if you want to do some automated testing, the DOM ID would be a unique identifier across the DOM, which is the document object models, what that stands for, and that's how a web browser is rendered. The DOM ID would be... It's a unique ID across that DOM. Another property there. The next thing that I'm going to mention and this one I use all the time, and if you aren't aware of it, it's going to save you a ton of time. Traditionally, to get to a component inside of a container, you would have to deep-select that container. That could be done by either right-clicking on a container, you notice the little compass icon goes to that container, or right-clicking and deep-selecting that.
14:23
Reese Tyson: And then, once that's deep-selected, you can select the component, or components, inside of that container. Well, in 8.1.26, we added an alt+shift click hotkey that allows you to drill all the way down to the components at the lowest level. So I'm hitting alt + shift, clicking, and it's going to those text files and the text that I have specified in that. There's no more need to double-click and click into the container, etcetera. alt+shift click goes directly to that. Extremely helpful, really handy to use. In fact, this is actually a part of several different keyboard shortcuts that I'll highlight. We have them all listed here in our Docs. You could absolutely visit this page after the webinar if you forget the things that I'm saying, but you'll notice at the bottom of this page, you have a deep selection, selects into a container, and that's the alt+shift click.
15:18
Reese Tyson: That's the one I mentioned, but there's a whole host of other ones here. A couple that I'll highlight: F5 toggles preview mode in the designer, F10 launches a client. Those could be handy. In fact, I'll just go ahead and show that right now. If I'm in the designer and I hit F5, toggling my preview mode up there at the top. So, definitely take advantage of those. The next one I'll mention here it's still in the UI theme. You can actually double-click on either a label or a button to edit the text inside of it. You'll notice I just double-clicked in the name. I can hit backspace and hit enter, and it's going to actually update the properties, the text property, over here on the right-hand side. So, instead of having to go over the properties every time, you just double-click into that, hit enter, or make your update, hit enter, and off you go.
16:09
Reese Tyson: That's really handy. Maybe saves you a couple seconds on going over to the properties on the right-hand side. The other one that I'll mention, while I'm on this label, I might as well mention this while I'm here, is I actually have these labels over here on the left-hand side, all set to Grow zero, Shrink zero, and Basis auto. Specifying basis auto actually automatically changes the width of that label based off of, in this scenario, based off of the text that I have in it. But you can also do this with containers and pretty much everything. It's going to be based off the content that is inside of that component. And so, while this is maybe not the best use case of this, all this text is static; it's not changing; I could absolutely just specify width. Where this might become more useful is if, say, you're using dynamic text inside of here, where you're querying something, running a script, and after an operator clicks a button, that text could be something different every time you view it.
17:12
Reese Tyson: This auto will automatically grow and shrink based off of the text that is in that. Definitely a handy tip there for you as far as the basis set to auto. The last one here, as far as kind of UI is concerned, I have a couple other styles tips, but as far as UI is concerned, is you may or may not be aware of this one, but this one's really handy too. If you right-click on a property that already has a binding specified, it's an indirect tag binding, going to my name tag. If you right-click on a property, you can actually copy the binding. That would include all of the binding, any sort of transforms if you add in there, any scripts, mapping, formats, etcetera. You don't want to copy this. This is going to copy the JSON structure.
18:00
Reese Tyson: You want to make sure you copy binding. And I'll just add another custom property down here and paste that bind again. Don't paste here, you want to paste the binding, and that's going to paste that binding exactly the same as that text binding that we had. And that might not be exactly what you want, but then you could just go ahead and change the tag path, at least in my scenario, I'm going to map my weight instead of my name. And now, there you go. You don't have to redo that whole binding. Really handy if you have a lot of scripts and things specified on your binding. All right, like I said, styling is next. There are built-in styles that you can use across your project. This is an example of what I'm doing here, is on the root container. If I come over here to the right-hand side on the properties, you'll notice I have a lot of styles specified. What I'm really kind of focused on right now for this webinar is the --neutral-30 color that I have on my background color style.
19:07
Reese Tyson: Now, obviously, --neutral-30 is not a hex code, but it is rather a CSS variable that we can take advantage of, so this color represents a different color based off of the theme that we are selected within Ignition, so the theme is specified on my session properties inside of Perspective, right now is set to light, to say I change this to dark cool, for example. I switch back to my runner view, you can see it's obviously a lot darker, and it's using that dark, cool theme, and so no matter which theme you use, it's going to change the color that that...
19:45
Reese Tyson: The color that is actually shown, so you can see where these colors... Or what these colors are on, again, on our docs page, or notice here's my --neutral-30 color, here's all my different themes that are built-in to Ignition. And so whichever one I select up here is going to... Obviously, you can see it changed the color that is used within that theme, and you notice there's a ton of other colors. So we've tried to basically put all the colors that you're ever going to need and an HMI/SCADA application, including things like quality of a tag or query or whatever, an error. There's warnings, blues for info, text, etcetera.
20:28
Reese Tyson: So quite a few options. I would definitely recommend checking that out. Just helps; honestly, it just makes your project better 'cause then you can just take advantage of the theming that's built-in to the platform. I'm going to go ahead and switch that theme back to, maybe do a light cool, just because. Okay. And so that's styling. But the last major tip really that I wanted to mention here is the System.perspective.sendMessage. Some of you, probably a lot of you, are already aware of this, sending messages.
21:05
Reese Tyson: Probably some of you aren't, and what this allows you to do is send a message from, you know, one event to a corresponding message handler. It's made up of those two parts: the sending and the message handler. And this allows you... It allows you, really, to pass data around a Perspective view without having to use all the in and out parameters, especially if you had embedded views inside of embedded views, a couple layers, or something. You don't need to tunnel those parameters all the way through; just use message handlers. And so an example of that, if you remember on my view that I showed earlier in my session, I showed earlier where I can click on a runner that filters a table, that is being done with message handlers.
21:50
Reese Tyson: So if I configure the event that happens when I click on this GIF, you'll notice that it's a really basic script. This one right here is the System.perspective.sendMessage. I'm sending this select runner message, is what I've named it. This can be custom to whatever you want. And then you're passing a payload or a set of data along with that. Obviously, that payload is specified right above here. It's a JSON structure.
22:13
Reese Tyson: So you can put whatever information you want in here. I'm just putting the runner as my key. And then, essentially, what this is is the name of the runner, so I'm sending the select runner and sending the name of the runner along with that. And then if I go over to my main view and I select my Table, right-click on this, configure Events, or, I'm sorry, I'm sure you all have done that a thousand times as well, clicked on Events instead of Script, but here's my select runner message handler. And you see, I've specified it here, and literally all I'm doing in this is create a really basic script to say, "Hey, set my table filter text to payload runner." And that's it.
22:55
Reese Tyson: So it's a very easy way to send data, again, across a Perspective screen. So that's all we have time for today as far as Perspective and designer tips go. I'm going to throw it over to you, Eric, for some scripting tips.
23:10
Eric Knorr: Alrighty. So the Inductive Automation development team has added a bunch of really cool features to Ignition's native scripting console and project library that can help you increase your efficiency and debugging capabilities. So with that, let's go ahead and fire off that starting gun and kick off our first scripting feature we're going to be highlighting today. So, here I have an Ignition designer in the project library. I have a simple script that defines some attributes of a runner. If you're not familiar with object-oriented programming, that's totally all right. The features I'm going to be showing today are applicable to all types of applications. So, nothing too much to highlight here.
23:51
Eric Knorr: I'm going to go straight over into my script console, where we're going to be doing all of our work today. So left side, we have the multi-line buffer. So I'm going to go and paste in this script. You'll notice I do have the white space and tab lines on. This is just going to help me make sure I don't have any secret spaces in there. That's a bonus little tip. So first thing you'll notice is that we're using system.util.getGlobals(). So if you're not familiar with Globals, Ignition Globals is a global namespace to store objects, Python dictionaries. This dictionary persists across the life of the GVM.
24:26
Eric Knorr: So you can just store things there. It could be an object. It could be a list, a string, whatever you'd like. In this case, we're just going to store some runner records. But this script is not quite finished, so I'm going to go ahead and make a new function definition here. So define, get results. And the first thing is when I press enter here, I'm going to get an auto-return tab. If you're used to using other IDEs, you're probably real familiar with this. This is just a real great quality-of-life improvement that was added, which I think is just really nice.
25:06
Eric Knorr: So that's the first thing. Pretty simple. You don't really have to look too far to get to that one. So if I start writing here, we're all probably familiar with this autocomplete, which is really, really nice. You don't have to remember exactly which functions we have and also what arguments they take. So if I just come over here and to write blocking, you can see all of the arguments and some information about it. So, of course, you can always go to the docs page, but it's nice just to have a little quick hits here. So real quick, I'm just going to press tab, which is going to autocomplete. And then the next thing here is that we have the first argument already highlighted. So if I press tab and then shift + tab, it's going to go back and forth. Pretty cool. Now, the next thing that's been added is this concept of "Smart" quotes and "Smart" brackets.
26:07
Eric Knorr: So without even... With this text highlighted, I am going to press an opening square bracket and a double quote. You notice that just putting the opening square bracket and just one double quote, it added it around the entire selected text. This is going to make my list of tags that much easier to create. Now, straight from here, I'm going to press tab and it's going to highlight my other field. Once again, I'm going to press opening square bracket, one double quote with that text highlighted, and I can click. I can get my value. Just that simple. I'm going to press tab one more time, and it's going to put me out to the end of the line. Alrighty. Well, that was pretty quick.
27:06
Eric Knorr: Next, what we're going to do, I don't actually need this right now. I'm going to utilize the code folding and unfolding, is a feature that's been here for quite some time now. But if I don't need something, I can just go ahead and hide it. Maybe it's a debug function. Maybe it's something that I'm testing that I don't quite need. So anywhere that you see these arrows on the left-hand side, you can go and hide it. So I'm just going to hide that get_results function for now. Alrighty. So down here, I have some runners.
27:37
Eric Knorr: This utilizes the class that we created here, that we saw here. So we see athlete.runner. We have some runners defined, but I'm going to add one more runner. So one way that you can do to duplicate a line you can press control + D, or command + D on Mac, as I am, and I just copied the line that was highlighted. So now I can come over. And update this. Oh, there we go. Alrighty. So, now that I have my fourth runner in here, I'm going to press control + enter, or command + enter on Mac, in order to execute that script. Here we go. We have our output just as expected.
28:38
Eric Knorr: Now, what's really cool is on this interactive interpreter on the right side, you can actually type right into here, too. So I'm just going to type line4.name; that's accessing our class. And there we go. Usain Bolt. This is really helpful for debugging and troubleshooting. If you've already run something, you can just kind of look right into it right here. You can also run system scripts right from here. So there we go. I can run my system.util.getGlobals(), and I see exactly what I put in right here.
29:16
Eric Knorr: Once again, it can be really helpful to debug some of your scripts if you're running into some issues. One last thing, if I just click on the end of this here, say I just forgot, I forgot exactly what went in here. I'm going to press control + space, and that's going to bring back up my autocomplete. And even for custom user-defined functions and classes, I can see my docstring that I have in here and right here, so adding a docstring in your project library can help you when you're trying to debug stuff, too. Well, with that section of the relay complete, Reese, I'm going to hand the baton back to you for the next leg.
30:01
Reese Tyson: Alrighty, sounds good. And I'll just keep on with the puns and go ahead and say I'm going to high-dive right in the deep end of the gateway. But we're actually going to start in the designer. Once again, I have one last thing to show you here before we transition. In fact, it is a transition, but you can see down here on the bottom right-hand side of the designer, you have this little connected icon, and connected to the gateway. If you lose connection, that'll have a break connection. But we can actually also click on that little icon launched in another window. But it launches the gateway that that designer is connected to. So a handy little way that you can jump straight to the gateway from the designer.
30:46
Reese Tyson: But one of the things that I wanted to show here is actually under Status and Metrics Dashboard. So the Metrics Dashboard is actually a way where we can kind of build a dashboard of data that we want to see. Obviously, there's a lot of things across the gateway, a lot of data, a lot of metrics that we can track and follow. But the dashboard allows us to kind of bring all that information together. And so, for example, we'll go ahead and just create... Let's create a new... Save As New. I'll save a... Just put some text in there, save my dashboard. Maybe I want to delete some of these, delete some of these larger ones, and kind of make it my own. Maybe I'm deriving this from somebody else. We'll go ahead and add a metric. So you can come in here, you can look at maybe Ignition performance threads that we're using. Maybe I want to look at blocked threads, add that; hopefully there's, yeah, there's none right now.
31:48
Reese Tyson: But maybe another metric that we could add is the actual threads that are running. So we can add the different statistics in there that we want and then go ahead and, of course, save that. Yeah, I want to overwrite the existing. And now I have yet another dashboard that I can select. So here's my example metrics that I was using, and here's my ASDF, the dashboard that I just created. So, again, a handy way to bring some metrics together. The other one that I'll mention here is a couple of different gateway URLs.
32:25
Reese Tyson: Now, one thing that I will mention, kind of a disclaimer before I dive into these, is these can and might change and are not officially supported by Inductive Automation. But they can be handy for building different types of projects or doing different types of things. So the one that I'm... A couple that I'm going to mention here: this first one is called system-gateway info (/system/gwinfo). And so this URL extension is going to return exactly as you'd imagine with the GW info, gateway info. A bunch of info about that gateway. What the status is, the gateway address, maybe the name of it, the current version of the gateway, etcetera. So that can be handy.
33:07
Reese Tyson: Another one that you might utilize, or that you could utilize here, is our status ping. And so this is going to return a very basic JSON structure here, literally just returning what state that gateway is in. Whether that's running or maybe it's stopped. Maybe we are starting up those types of things, and it allows you to kind of see the state of that gateway. You might be thinking, "Well, where the heck would I ever use this?" Great question.
33:39
Reese Tyson: So think maybe you are using Ignition as a web dev endpoint, and you want to make sure that this gateway is up and running before you send a request. So that might be one use of this. This one here. Another one that I figured I'd mention is data.perspective.projects (data/perspective/projects). And so this brings back a list of a JSON structure or a list of JSON structures. And this probably is familiar to you if you're used to using Perspective. All the properties are lists of JSON structures. But this is going to bring back all the projects that are on the gateway. So you can... Maybe use case for this one would be, say, you create a project that you want to launch into other projects and kind of make that list dynamic. You could absolutely use something like this to be able to do that. So short and sweet. But that's all I have for some gateway tips. I know, Eric, you have some more. So I'll go ahead and throw it over to you to talk through a few more gateway tips.
34:46
Eric Knorr: That's right, Reese, with all these quick tips, we are really pulling ahead in the gold medal count. So I have a couple of quick hits here. The first one isn't something that's new. This came out in 8.1.20. It also doesn't really save you a lot of time, but it adds a little bit of flair to your project. What I'm talking about is co-branding. If you haven't seen this before, take a look. Alrighty. If you have the Perspective Module installed, at the bottom of your gateway Config page, you can click Co-Branding, and we can enable co-branding here. Alrighty. So let's make a fun little thing here. So let's see, background color, use some Olympic themes, text color, ah, we'll keep that white, button color, let's make that yellow. Making use of the little dropper here, and then we'll put this black.
35:44
Eric Knorr: Now, for the logo, put this little guy and the favicon; you can use this guy. So the logo is what's going to be displayed on your application. The favicon is actually this little icon up in the top on a tab. So if we should scroll down here for a sec, we can see a preview of what this might look like. In case you didn't know, every Olympic games has a mascot. This is the Paris '24 mascot. So, the more you know, I'm going to go ahead and save these... Oh, before that, the app icon is used only for iOS. This would be the iOS application icon. So I'm going to go ahead and save changes here. And I'm going to head over to my project, launch a project. And look at that. Now we have our favicon up at the top. And we have our little guy waving at us with our new colors.
36:43
Eric Knorr: If I log in very, very, very quickly, you saw the loading screen. If I had more than just a single image, it might take another quarter second to load. And we'd be able to see that guy too. All right, last tip here. If I come down into... And take gateway backup. So this is something we'll all be familiar with. I'm going to go ahead and save that. And bring up a couple of window here. And now. Oh, my goodness. I could bring this up in Kindling. If you're not familiar with Kindling, this is an open source project developed by Paul Griffith in the Inductive Automation development team with help from our Ignition community. it's an open-source project. And this allows you to do all sorts of cool things, like viewing different things about your gateway, say the gateway version or what Perspective projects you have and the number of all the resources you have, database connections, OPC connections, and so much more.
37:56
Eric Knorr: So it's the same stuff. If you were to open up a gateway backup in your your file explorer, you'd be able to see all of these same things, but this gives a little bit of a visual to it. So, for instance, if I just go out and click on this SQLite database here, this is the internal database that stores all of the gateway settings. So if I come in here, here's our co-branding right on top. I can select this. This is just a SQL language format. And we can see all of the things that we just set there, our colors and the favicon image, all these things. So you can take a look at all of the internal tables and so you can get an idea of what's going on in your gateway. So a little bonus, a little quick hit. So with games coming to a close, Reese, I'm going to pass back to you for the closing ceremony.
38:53
Reese Tyson: Alrighty, hopefully everybody's enjoying all these terrible puns. Go ahead and share my screen again. So since that was... I'm going to keep going with it since that was quite the marathon of tips that we just showed shared with you all. Here's a quick recap of everything that we have. So a lot of different things that we shared, as mentioned earlier, this recording will be available after this. I see, that's one of the questions that came in. And so this will be available. So you can certainly go back and watch these this again and just kind of look at all of them, but quite a few different things. Hopefully, you learned something that was kind of the goal of this, is just to highlight some of the not-as-well-known features of Ignition that can really help speed up your development process. But really, if you've never tried Ignition, right, that's what we've been showing, showcasing this whole time. You can download a free trial today. It's quick to download. Takes about three minutes, and you can use it in that trial mode for as long as you want, so you can dive right in and explore the platform that makes it possible to build industrial applications so quickly.
40:00
Reese Tyson: I also want to mention Inductive University. It's free. It's online training website with hundreds of training videos. Literally, I think there's over 800 videos on there. Kinda walks through the whole Ignition platform and all the things that you might come across, including some of the things that we've talked about today, for example, message handlers. You could look up message handlers and get even more of a deep dive on that in a video format. There's also a comprehensive online user manual that you can refer to at any time. I showed a couple of those docs pages, and so that's available and accessible to anyone as well. Additionally, we are very excited about the upcoming Ignition Community Conference, or ICC. It's taking place in September 17th to the 19th in Folsom, California, which is where our headquarters is located. So definitely join us there to learn about cutting-edge industrial automation technology. In fact, I'll also be presenting in a session where we'll be sharing some really, really exciting stuff to look forward to in 8.3, so you don't want to miss that. Visit the website here on the screen to buy any tickets before they sell out. In fact, they've actually sold out the last seven years in a row, so if you want in-person ticket, don't delay. But if you can't attend in person, definitely grab a livestream pass. That will give you access to the content as well.
41:21
Reese Tyson: And also, don't forget to sign up for ICC 2024 Golf Scramble Tournament. It's on September 20th, which is the Friday of that week, the day after the last day of the conference, and that'll be a fun way just to connect with some people post-conference here from Inductive and some end users. So very excited for ICC. For those of you outside of North America, we want you to know that we have a network of international Ignition distributors who provide business development opportunities, sales, technical support in your language and time zone. So if you wanna learn more about the distributor in your region, please visit their website listed on the screen here, or you can contact our International Distribution Manager, Yegor Karnaukhov. If you'd like to speak with one of our account reps at our headquarters in California, please call 800-266-7798. And of course, to reach our office in Australia, please call 130-010-8088.
42:27
Reese Tyson: Now, as promised, let's go ahead and get to some Q&A. Looks like we have a decent amount of time here, so definitely see the questions stacking up. We'll try to get through as many as we can here, but no promises. It looks like there's quite a few. Also, like I mentioned, if you have any other tips or tricks that you use that would be helpful for others to... For us to highlight, definitely talk about those as well. So the first one here is from Mills. Mills asked, "How can you speed up debugging in scripts?" And Eric, I think since you talked about scripts, I think I'll throw that one over to you. How can you speed up debugging with scripting?
43:10
Eric Knorr: Yeah, sure. That's a really good question. And Reese, you showed off system.perspective.print. That's the first thing that comes to my mind. It's just... It's really nice to just be able to see it directly in the console, whatever you'd like to print, whether it's maybe an intermediary step. I also use loggers a lot. You can use system.util.getLogger; you can create your own logger, and that'll send it right to the gateway logs. Also really helpful, you can have info or warning and errors, and so you can make your own errors and warnings and infos. There's so many places that you can just place those two that really helped me debugging.
43:48
Reese Tyson: Awesome. Yeah, I think that's... There's quite a few different things. I think as you work with scripting, of course, you'll get used to it and come across those, and develop your own routine there. Next question, Marvin asks, "Does fast development speed require tool creation?" Not necessarily. I guess you can certainly use the tips that we mentioned earlier to help speed up your process. That doesn't require an additional tool creation. I guess one of the things that might require tool creation is if you have more of a custom, kind of specific manual task. Maybe tag configuration from a CSV. You have a bunch of tags that you want to import from maybe another system or something from a CSV, you could absolutely create a configuration script or a tool to do something like that. But out of the box, certainly, that would be something that you don't necessarily have to create a tool for to take advantage of some of the scripts that we had today.
44:52
Reese Tyson: Let's see. Again, Eric, pop in here if you see any questions that you want to answer. I'll keep going here. Adam R. says, "Can you give a solution for using fast rate polling tags and large scale using Ignition? Any reference or recommendations?" I think he's mentioning, I have a large system, and I want to poll some of those tags very quickly. So yeah, you could absolutely achieve faster poll rates at larger scale. You really just have to think about the fundamentals, breaking the load of the gateway down across maybe different gateways, for example, a back-end gateway that's just dedicated to polling data and historizing it, separate from a front-end gateway. You could also put some of your tags that have fast polling rates in the same group. That way, if you change some of the other tags, it doesn't change how we're polling the tags in that specific tag group. You also might wanna put your gateways close to the device as possible to reduce your network latency. Yeah, if you have further questions on how something up like that, it's actually something that I would encourage you to reach out to your account rep, who... You can bring a sales engineer, like myself, in to talk through that specific solution. Everybody's situation is gonna be just a little bit different there. Alright, there are a lot more questions now, so we'll go ahead and try to hit some of these.
46:22
Reese Tyson: Brendon asks, "Will the tag diagnostics reference log work where there are dynamic bindings or just static?" It will work for dynamic tag binding. So the binding, the usage that I showed, that was actually an indirect tag binding inside of that template. So anywhere it's used, it's going to log a record to that log, so you have reference to that. So great question. "Does Tab Index obey the zeroth position, like other numberings, or does zero turn it off?" Henry asks. Looks like he has left already, but I'll answer the question anyways. So the Tab Index, I believe, it's set to zero by default, so if you do one, two, three, four, etcetera, on top of that, that's the path that it's going to follow.
47:14
Eric Knorr: Yeah, Reese, I wanna pop in here with...
47:15
Reese Tyson: Yeah, go for it.
47:16
Eric Knorr: With a couple of community tips that were sent.
47:18
Reese Tyson: Okay.
47:19
Eric Knorr: There's shift right-click. You can copy JSON for views. That's pretty cool. So that would be... If you want to copy the JSON, you can just right-click or shift right-click. So you can get it from the context menu or just that. Another one, which I use all the time and definitely worth mentioning, you can select multiple components and then set the bindings for common properties.
47:43
Reese Tyson: Oh, yeah.
47:43
Eric Knorr: For instance, if you wanna select multiple components and then, say, set the grow or shrink property for all of them at one time, that's something I use all the time. That's a really great tip.
47:54
Reese Tyson: Yeah, those are fantastic. I wish we had to showcase them now. Another question here from Don. Don asks, "Are these features for Perspective and Vision or only Perspective?" Well, the ones that we showed were for Perspective. There are some that we shared today. I can't go through... I'm not gonna go through all of them and say which ones are or aren't, but you could utilize some of those in Vision as well. The hotkeys that I mentioned, some of those will work with Vision. Actually, a lot of them will. But again, it's just gonna be used by use case there. See. "Is their plans for a UI view, like the Tag Reference Tracker, that helps keep track of all the messages being used in a project?" That is a fantastic comment.
48:45
Reese Tyson: I actually love that, where you could keep track of where all the messages are being sent, because if you have a lot of messages on a view, you might not know where that source is coming from. One of the ways that I've gotten around that or accommodated for that is to... Every time I add a usage for a message handler, it could be used on a button click or many different events on the page, I always put in the handler where that message is being sent from. So that way, I can more easily troubleshoot that when I come back to it six months later and I've forgotten where I have put in all those scripts. But that's definitely a really great idea. I like that idea, like a Tag Reference Tracker for message handlers. So I have to suggest that one to the devs.
49:32
Reese Tyson: "Can you explain more on scopes and use cases on message handlers?" Derek asks. Sure, yeah. This one might actually be... Looks like we have a little bit of time. It might actually be better... Am I still sharing my screen? Yes. So this one might be better. Just kind of show you, once again, if I go back to my main page, my notes here, there are different scopes that... Sorry, I can't click and think at the same time. There are different scopes that you can specify on a message handler. So you can see the session, page, the view. So all of these would be... For example, if a page... You specify a page, is going to listen to any messages that are sent from that page or from a view. If you only want messages from a view to be heard, essentially, you can specify as the view. Typically, I leave it at the page because that's where I'm sending a message. A lot of times, all the content that I want to send it to is on that page, but that certainly is something that you can specify there. Of course, tons more details on the docs page if you wanna check those out too. Wow. A ton of questions. Eric, do you have any you wanna jump in here and answer?
51:01
Eric Knorr: Yeah, there's several questions here regarding the scripting language. That is Python 2.7. And there was one question... When you were mentioning the DOM ID, you mentioned as well automated testing. Inductive Automation does.
51:18
Reese Tyson: Oh, Selenium?
51:19
Eric Knorr: Yeah, with Selenium. So Inductive Automation does have a repository, which I'm gonna send the link out here. That might help you get started there. There's a lot... Yep, that's exactly it. There's a lot of really helpful things that our Dev team keeps up to date.
51:37
Reese Tyson: Another thing I'll mention along that line, Eric, is Cody Mallonee in our QA department, who's really helped develop a lot of that, actually did a session on this last ICC. So highly recommend checking that out if you're interested in automated GUI or UI testing. Sorry, I've just figured I've been... Throw those things in there.
52:03
Eric Knorr: Yeah. Reese, there was a couple of questions about if you could send out that project so people could reverse-engineer it and take a look at it. Do you think we can get that sent out?
52:15
Reese Tyson: The project...
52:15
Eric Knorr: The project you're working on?
52:17
Reese Tyson: Sure. I'll have to check out that person and try to find their email, and I can see what I can do.
52:25
Eric Knorr: For sure.
52:26
Reese Tyson: Let's see. Any other ones here?
52:31
Eric Knorr: Oh, there's one question here, the name of the tool to view the backups? That's Kindling.
52:40
Reese Tyson: Perfect. Bob asks, "Do you know when Ignition version 8.3 will be released?" Yes. So the current time frame is... We're hoping to have a beta out around ICC. And then 8.3, the official, will be... The timeline currently is Q1 of next year. So that's what we're shooting for, but we will be unveiling and showing a lot of features off that are available in 8.3 during ICC. I think you mentioned Python 2.7. I'll just... I see some more questions about that. So yeah, Eric was using some scripting in there. Ignition utilizes, actually, what's called Jython, with a J, 2.7. And so, that's slightly different. It's kind of a Java-based versus Python, which is typically called Python. It's actually C Python. And so C Python is what you're thinking of when we're talking Python 3, most likely. And so we're actually at the highest version of Jython, at 2.7, and so if you need support outside of Python, or Python 2.7 for any sort of external libraries or things like that, this is a really great white paper that Kevin put together, Kevin McClusky, on Ignition, scripting, and a lot of things that you might consider as far as scripting goes and running scripting alongside of Ignition and those types of things.
54:15
Reese Tyson: So that white paper is called... This script, or this white paper, will show you... Talk a little bit more about scripting. All right, great. It looks like we are getting close to time. I apologize for not getting to every single question, but certainly, if you have more questions or want your question specifically... I'm a part of the Sales Engineering department, and so if you want some more information or questions that you have answered, certainly reach out to your account rep. They can loop me in if they need to, if they don't already know the answer, and you can certainly get the question answered that way. That's gonna be it for today. We'll be back next month with webinar about bridging the IT/OT gap. But until then, definitely stay connected with us on social media, and subscribe to our weekly newsfeed. You can also stay up-to-date through our blog. We have lots of articles, case studies, etcetera. There's a ton of helpful content for you to explore our website. Definitely be sure to check that out. But I'm gonna finish it off with a great pun. Thank you for going the distance with us today. You've all earned the gold medal in attentiveness. But have a great rest of your day.
Want to stay up-to-date with us?
Sign up for our weekly News Feed.