<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FactoryTalk Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/tag/factorytalk/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Fri, 04 Sep 2026 15:32:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>FactoryTalk Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>FactoryTalk Optix Series 3 &#8211; NetLogic Overview and Examples</title>
		<link>https://static.dmcinfo.com/blog/16280/factorytalk-optix-series-3-netlogic-overview-and-examples/</link>
		
		<dc:creator><![CDATA[Ben Clare]]></dc:creator>
		<pubDate>Tue, 14 May 2024 17:21:41 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[FactoryTalk Optix]]></category>
		<category><![CDATA[FT Optix]]></category>
		<category><![CDATA[HMI]]></category>
		<category><![CDATA[Optix]]></category>
		<category><![CDATA[SCADA]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/16280/factorytalk-optix-series-3-netlogic-overview-and-examples/</guid>

					<description><![CDATA[<p>HMI Programming and SCADA Programming are essential for creating efficient and responsive automation systems. When working with Optix, leveraging NetLogic allows for seamless integration between C# code and the SCADA environment, enabling advanced control and data exchange.&#160; NetLogic is C# code&#160;that is linked to Optix. Optix can call methods with parameters, set private C# variables, [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/16280/factorytalk-optix-series-3-netlogic-overview-and-examples/">FactoryTalk Optix Series 3 &#8211; NetLogic Overview and Examples</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming"><strong>HMI Programming and SCADA Programming</strong></a> are essential for creating efficient and responsive automation systems. When working with Optix, leveraging NetLogic allows for seamless integration between C# code and the SCADA environment, enabling advanced control and data exchange.&nbsp;</p>



<p class="wp-block-paragraph">NetLogic is C# code&nbsp;that is linked to Optix. Optix can call methods with parameters, set private C# variables, and has numerous C# Libraries integrated by default to assist with passing data between Optix and your C# code. Optix also allows you to link the monitoring of C# code to an Optix runtime instance.</p>



<h2 id="h-linking-variables" class="wp-block-heading">Linking Variables</h2>



<p class="wp-block-paragraph">When creating NetLogic, you can define variables that interface with the C# code, and can be both written to and read from said C# code. You can also define variable categories to assist with organization.</p>



<ul class="wp-block-list">
<li>First, Variables are added onto the NetLogic object in Optix.</li>
</ul>



<p class="wp-block-paragraph"><p style="text-align: center;">&nbsp;<img decoding="async" alt="Linking Netlogic Variables" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/net-logic-linking-variables.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example of variables attached to a NetLogic object</em></p></p>



<p class="wp-block-paragraph">These variables can be referenced in the C# logic by utilizing the “GetVariable” method on our LogicObject.</p>



<ul class="wp-block-list">
<li>For any variables at the top-most level, simply call: LogicObject.GetVariable(“YourVariable”).</li>



<li>For nested variables (such as variables under “Table” in the example above), define a new IUAVariable for the nested name (Tables in this case), and then reference the individual elements of that new variable.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
private void ParametersSetup()

{
	DB_SERVER_IP = LogicObject.GetVariable("Server IP").Value;
	DB_SERVER_PORT = uint.Parse(LogicObject.GetVariable("Server port").Value);
	SERVICE_NAME = LogicObject.GetVariable("Service name").Value;
	DB_USERNAME = LogicObject.GetVariable("Username").Value;
	DB_PASSWORD = LogicObject.GetVariable("Password").Value;
	DB_QUERIES_FEEDBACK = LogicObject.GetVariable("Queries feedback");
	TABLES = LogicObject.GetVariable("Tables");

	TABLE_DESTINATION = TABLES.GetVariable("Destination").Value;
	TABLE_DISTANCE = TABLES.GetVariable("Distance").Value;
	TABLE_LOCATIONCHANGE = TABLES.GetVariable("LocationChange").Value;
	TABLE_EQUIPMENTSTATUS = TABLES.GetVariable("EquipmentStatus").Value;
	NUMBER_OF_DEVICES = LogicObject.GetVariable("Number of devices").Value;
	NUMBER_OF_EQUIPMENT_AREAS = LogicObject.GetVariable("Number of equipment areas").Value;
	CONNECTIONSTRING = $"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={DB_SERVER_IP})(PORT={(int)DB_SERVER_PORT})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={SERVICE_NAME})));User Id={DB_USERNAME};Password={DB_PASSWORD};";
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">ParametersSetup</span><span style="color: #D4D4D4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">DB_SERVER_IP</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Server IP&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">DB_SERVER_PORT</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Parse</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Server port&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">SERVICE_NAME</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Service name&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">DB_USERNAME</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Username&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">DB_PASSWORD</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Password&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">DB_QUERIES_FEEDBACK</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Queries feedback&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">TABLES</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Tables&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">TABLE_DESTINATION</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">TABLES</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Destination&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">TABLE_DISTANCE</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">TABLES</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Distance&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">TABLE_LOCATIONCHANGE</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">TABLES</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;LocationChange&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">TABLE_EQUIPMENTSTATUS</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">TABLES</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;EquipmentStatus&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">NUMBER_OF_DEVICES</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Number of devices&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">NUMBER_OF_EQUIPMENT_AREAS</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">LogicObject</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetVariable</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Number of equipment areas&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">CONNECTIONSTRING</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">$&quot;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={</span><span style="color: #9CDCFE">DB_SERVER_IP</span><span style="color: #CE9178">})(PORT={(</span><span style="color: #569CD6">int</span><span style="color: #CE9178">)</span><span style="color: #9CDCFE">DB_SERVER_PORT</span><span style="color: #CE9178">})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={</span><span style="color: #9CDCFE">SERVICE_NAME</span><span style="color: #CE9178">})));User Id={</span><span style="color: #9CDCFE">DB_USERNAME</span><span style="color: #CE9178">};Password={</span><span style="color: #9CDCFE">DB_PASSWORD</span><span style="color: #CE9178">};&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
private IUAVariable DB_QUERIES_FEEDBACK;
private string DB_SERVER_IP;
private uint DB_SERVER_PORT;
private string SERVICE_NAME;
private string DB_USERNAME;
private string DB_PASSWORD;
public IUAVariable TABLES;
private string TABLE_DESTINATION;
private string TABLE_DISTANCE;
private string TABLE_LOCATIONCHANGE;
private string TABLE_EQUIPMENTSTATUS;
private Int32 NUMBER_OF_DEVICES;
private Int32 NUMBER_OF_EQUIPMENT_AREAS;

</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IUAVariable</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DB_QUERIES_FEEDBACK</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DB_SERVER_IP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DB_SERVER_PORT</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SERVICE_NAME</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DB_USERNAME</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">DB_PASSWORD</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IUAVariable</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">TABLES</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">TABLE_DESTINATION</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">TABLE_DISTANCE</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">TABLE_LOCATIONCHANGE</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">TABLE_EQUIPMENTSTATUS</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Int32</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">NUMBER_OF_DEVICES</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Int32</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">NUMBER_OF_EQUIPMENT_AREAS</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<h2 id="h-calling-methods" class="wp-block-heading">Calling Methods</h2>



<p class="wp-block-paragraph">C# Methods can be called directly from Optix when the [ExportMethod] Line is added above said method. Any parameters associated with the Method will also be exposed, allowing you to set them dynamically from Optix, using a MethodInvocation or by linking them to events.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Invoking C# Methods from Optix" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/method-invocation.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example method invocation that shows all the [ExportMethod] methods from the Netlogic C# code</em></p></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
&#91;ExportMethod&#93;

public void SelectAllDevicesDestination()

{

…

</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;</span><span style="color: #4EC9B0">ExportMethod</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SelectAllDevicesDestination</span><span style="color: #D4D4D4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">…</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<h2 id="h-monitoring-code" class="wp-block-heading">Monitoring Code</h2>



<p class="wp-block-paragraph">When NetLogic is created, Optix automatically configures the codespace (if utilizing VSCode) to attach to the Optix runtime instance, allowing you to monitor your C# card while the Optix application is running.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Monitoring an Optix Project in Visual Code" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/visual-code-monitoring.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>Visual Code is attached to the Optix Runtime when monitoring</em></p></p>



<h2 id="h-logging-and-error-handling" class="wp-block-heading">Logging and Error Handling</h2>



<p class="wp-block-paragraph">Optix has a C# library for logging code that should be utilized, as it will output to the console in FT Optix Studio, as well as to the log file for the Optix application.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
catch (System.Exception ex)
{
	Log.Error(MethodBase.GetCurrentMethod().Name, ex.Message);
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Exception</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ex</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">Log</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">MethodBase</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetCurrentMethod</span><span style="color: #D4D4D4">().</span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">ex</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Message</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><p style="text-align: center;">&nbsp;<img decoding="async" alt="Location of Optix Log Files" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/optix-runtime-logs.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>The location&nbsp;of Optix log files for an emulated project</em></p></p>



<h2 id="h-read-the-other-articles-in-this-series" class="wp-block-heading">Read the Other Articles in this Series</h2>



<ul class="wp-block-list">
<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10576/factorytalk-optix-series-1--getting-started-with-factorytalk-optix">FactoryTalk Optix Series 1 &#8211; Getting Started with FactoryTalk Optix</a></li>



<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10609/factorytalk-optix-series-2--variables-attributes-dynamic-links-and-converters">FactoryTalk Optix Series 2 &#8211; Variables, Attributes, Dynamic Links, and Converters</a></li>
</ul>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Extend FactoryTalk Optix with C# NetLogic</strong>.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Explore our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" data-type="page" data-id="420">Automation</a> expertise in integrating C# methods, variables, runtime monitoring, and error handling into <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/rockwell-factorytalk-programming/factorytalk-optix-programming/" data-type="page" data-id="44850">FactoryTalk Optix</a> applications.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/16280/factorytalk-optix-series-3-netlogic-overview-and-examples/">FactoryTalk Optix Series 3 &#8211; NetLogic Overview and Examples</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FactoryTalk Optix Series 2 &#8211; Variables, Attributes, Dynamic Links, and Converters</title>
		<link>https://static.dmcinfo.com/blog/16293/factorytalk-optix-series-2-variables-attributes-dynamic-links-and-converters/</link>
		
		<dc:creator><![CDATA[Ben Clare]]></dc:creator>
		<pubDate>Tue, 14 May 2024 17:15:21 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[FactoryTalk Optix]]></category>
		<category><![CDATA[FT Optix]]></category>
		<category><![CDATA[HMI]]></category>
		<category><![CDATA[Optix]]></category>
		<category><![CDATA[SCADA]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/16293/factorytalk-optix-series-2-variables-attributes-dynamic-links-and-converters/</guid>

					<description><![CDATA[<p>Overview Variables, Attributes, Dynamic Links, and converters are the building blocks of Optix UI design. Each variable has a number of attributes associated with it, and Dynamic links and Converters can be used to define a relationship between two or more variables/attributes. A map of the relationships between Variables, Attributes, Dynamic Links, and Converters Variables [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/16293/factorytalk-optix-series-2-variables-attributes-dynamic-links-and-converters/">FactoryTalk Optix Series 2 &#8211; Variables, Attributes, Dynamic Links, and Converters</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="h-overview" class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">Variables, Attributes, Dynamic Links, and converters are the building blocks of Optix UI design. Each variable has a number of attributes associated with it, and Dynamic links and Converters can be used to define a relationship between two or more variables/attributes.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Variables, Attributes, Converters, and Dynamic Link Relationships" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/variables-attributes-converters-dynamic-links.png"></p></p>



<p class="has-text-align-center wp-block-paragraph"><em>A map of the relationships between Variables, Attributes, Dynamic Links, and Converters</em></p>



<h2 id="h-variables-and-scope" class="wp-block-heading">Variables and Scope</h2>



<p class="wp-block-paragraph">Variable scope is influenced by the containers they are in. All variables with a given container (screen or panel) can access each other. Variables in nested panels have access to the variables in other nested panels and parent/children panels, and vice versa.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Nested Variables in Scope" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/nested-variable-scope.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example of variable scope extending to variables nested in other related panels</em></p></p>



<p class="wp-block-paragraph">However, scope is limited when variables are not contained within a shared container, which happens most commonly with panels utilized in popups and panel loaders. However, the scope of panel loaders is unrestricted, so variables can be added to panel loaders and modified/updated anywhere in the Optix application, and the panels being loaded by said panel loader can then reference its variables to dynamically display information.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Out of Scope for the Selected Variable" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/variable-out-of-scope.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example showing the limitations of scope when creation relationships between variables</em></p></p>



<p class="wp-block-paragraph">To see an example of a panel loader utilizing variables to allow the Main UI to interact with individual panels being loaded by a panel loader, stay tuned for our upcoming&nbsp;Optix Series – Device Sidebar Example blog.</p>



<h2 id="h-attributes" class="wp-block-heading">Attributes</h2>



<p class="wp-block-paragraph">Understanding attributes and their relationship to their parent variable is necessary to form complex Dynamic Links for UI functionality. Below is a list of the most common variable attributes.</p>


<table border="1" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="width:168px;">


<p class="wp-block-paragraph">BrowseName</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Name of the variable in the project.</p>



<p class="wp-block-paragraph">DataType</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Data type of the variable.</p>



<p class="wp-block-paragraph">DataType BrowseName</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Name of the DataType of the variable.</p>



<p class="wp-block-paragraph">Description</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Description of the variable (as set in FT Optix).</p>



<p class="wp-block-paragraph">DisplayName</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Translatable variable name that can appear on the interface at runtime.</p>



<p class="wp-block-paragraph">NodeId</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Automatically assigned unique identifier.</p>



<p class="wp-block-paragraph">Value</p>


</td>
<td style="width:456px;">


<p class="wp-block-paragraph">Value of the variable.</p>


</td>
</tr>
</tbody>
</table>


<p class="wp-block-paragraph">To see an example of different attributes being used to create a clean, complex solution, stay tuned for our upcoming Optix Series – Device Sidebar Example blog, which utilizes NodeId, BrowseName, and DataType BrowseName attributes.</p>



<h2 id="h-converters" class="wp-block-heading">Converters</h2>



<ul class="wp-block-list">
<li>Conditional Converter
 
 
<ul class="wp-block-list" style="list-style-type:circle;">
  

<li>Sets the output variable&rsquo;s value based on a true/false evaluation of the input.</li>


 </ul>
</li>
</ul>



<p class="wp-block-paragraph"><p style="margin-left:1.0in;"><img decoding="async" alt="Conditional Converter" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/conditional-converter.png"></p></p>



<ul class="wp-block-list">
<li>Engineering Unit Converter
 
 
<ul class="wp-block-list" style="list-style-type:circle;">
  

<li>Scales the output linearly based on the input.</li>


 </ul>
</li>
</ul>



<p class="wp-block-paragraph"><p style="margin-left:1.0in;"><img decoding="async" alt="Engineering Unit Converter" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/engineering-unit-converter.png"></p></p>



<ul class="wp-block-list">
<li>Linear Converter
 
 
<ul class="wp-block-list" style="list-style-type:circle;">
  

<li>Scale the output based on a defined slope and intercept.</li>


 </ul>
</li>
</ul>



<p class="wp-block-paragraph"><p style="margin-left:1.0in;"><img decoding="async" alt="Linear Converter" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/linear-converter.png"></p></p>



<ul class="wp-block-list">
<li>Key-value Converter
 
 
<ul class="wp-block-list" style="list-style-type:circle;">
  

<li>Matches an output value to the input &ldquo;Key&rdquo;.</li>


 </ul>
</li>
</ul>



<p class="wp-block-paragraph"><p style="margin-left:1.0in;"><img decoding="async" alt="Key-Value Converter" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/key-value-converter.png"></p></p>



<ul class="wp-block-list">
<li>Expression Evaluator
 
 
<ul class="wp-block-list" style="list-style-type:circle;">
  

<li>Evaluates an expression consisting of one or more input variables.</li>


  

<li>To see all of the valid operators that can be used in an expression, see <a href="https://www.rockwellautomation.com/docs/en/factorytalk-optix/1-03/contents-ditamap/using-the-software/converters/expression-evaluator.html">Rockwell&rsquo;s documentation</a>.</li>


 </ul>
</li>
</ul>



<p class="wp-block-paragraph"><p style="margin-left:1.0in;"><img decoding="async" alt="Expression Evaulator" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/expression-evaluator.png"></p></p>



<ul class="wp-block-list">
<li>String Formatter
 
 
<ul class="wp-block-list" style="list-style-type:circle;">
  

<li>Outputs a string that can be defined using variables and various formatting options.</li>


 </ul>
</li>
</ul>



<p class="wp-block-paragraph"><p style="margin-left:1.0in;"><img decoding="async" alt="String Formatter" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/string-formatter.png"></p></p>



<h3 id="h-dynamic-links" class="wp-block-heading">Dynamic Links</h3>



<p class="wp-block-paragraph">Dynamic links are defined relationships between two or more variables. Dynamic links can implement converters to create complex relationships and can be pointed at both variables and attributes.</p>



<h3 id="h-aliases" class="wp-block-heading">Aliases</h3>



<p class="wp-block-paragraph">Aliases are a unique property type that allows you to specify the structure of a variable.&nbsp; This is useful when creating panels that should be referencing a specific Data Types, such as a motor or valve Data Type. An alias allows you to reference all the elements of the defined Data Type, while still allowing the alias variable to be linked dynamically, allowing graphics to be updated in real time, such as being able to swap which motor a panel is pointing to.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Aliases" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/aliases.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example of an alias to a Motor Data Type</em></p></p>



<p class="wp-block-paragraph">An example use case of aliases is for a device sidebar that utilizes a panel loader to swap in faceplates panels for different types of devices. The panel loader would have a NodeId variable (Let’s call it “Device Tag”) that would be updated at runtime to point to a desired device tag. For each device type, one panel would be created with a tag alias with the “Kind” attribute bound to the UDT of said device and the “NodeID” attribute bound to the “Device Tag” Attribute on the panel loader. Typically, you cannot create property bindings between variables that are not within the same window or screen (or the same panel for panels that are not directly placed on windows or screens), but panel loaders can be referenced regardless of project scope, allowing us to make use of the “Device Tag” variable we attached to ours.</p>



<p class="wp-block-paragraph">For an in-depth example, Stay tuned for our upcoming Optix Series – Device Sidebar Example blog.</p>



<h2 id="h-read-the-other-articles-in-this-series" class="wp-block-heading">Read the Other Articles in this Series</h2>



<ul class="wp-block-list">
<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10576/factorytalk-optix-series-1--getting-started-with-factorytalk-optix">FactoryTalk Optix Series 1 &#8211; Getting Started with FactoryTalk Optix</a></li>



<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10610/factorytalk-optix-series-3--netlogic-overview-and-examples">FactoryTalk Optix Series 3 &#8211; NetLogic Overview and Examples</a></li>
</ul>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Build More Dynamic FactoryTalk Optix Interfaces</strong>.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Explore our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" data-type="page" data-id="420">Automation</a> expertise in <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/rockwell-factorytalk-programming/factorytalk-optix-programming/" data-type="page" data-id="44850">FactoryTalk Optix</a> variables, attributes, dynamic links, aliases, and converters for creating flexible <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/" data-type="page" data-id="497">HMI and SCADA</a> applications.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/16293/factorytalk-optix-series-2-variables-attributes-dynamic-links-and-converters/">FactoryTalk Optix Series 2 &#8211; Variables, Attributes, Dynamic Links, and Converters</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FactoryTalk Optix Series 1 &#8211; Getting Started with FactoryTalk Optix</title>
		<link>https://static.dmcinfo.com/blog/16514/factorytalk-optix-series-1-getting-started-with-factorytalk-optix/</link>
		
		<dc:creator><![CDATA[Ben Clare]]></dc:creator>
		<pubDate>Mon, 25 Mar 2024 08:56:32 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# Integration]]></category>
		<category><![CDATA[Data Stores]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[FactoryTalk Optix]]></category>
		<category><![CDATA[FT Optix]]></category>
		<category><![CDATA[HMI]]></category>
		<category><![CDATA[NetLogic]]></category>
		<category><![CDATA[Optix]]></category>
		<category><![CDATA[Presentation Engines]]></category>
		<category><![CDATA[Property Bindings]]></category>
		<category><![CDATA[SCADA]]></category>
		<category><![CDATA[Style Sheets]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/16514/factorytalk-optix-series-1-getting-started-with-factorytalk-optix/</guid>

					<description><![CDATA[<p>FactoryTalk Optix is the next generation of visualization software from Rockwell Automation, meant to provide a higher degree of customized development with its integrated C# support and flexibility for HMI and SCADA applications. This blog series covers the essentials to creating your own HMI and SCADA applications using Optix as well as some helpful examples [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/16514/factorytalk-optix-series-1-getting-started-with-factorytalk-optix/">FactoryTalk Optix Series 1 &#8211; Getting Started with FactoryTalk Optix</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">FactoryTalk Optix is the next generation of visualization software from <a href="https://www.rockwellautomation.com/en-us.html" target="_blank">Rockwell Automation</a>, meant to provide a higher degree of customized development with its integrated C# support and flexibility for HMI and SCADA applications.</p>



<p class="wp-block-paragraph">This blog series covers the essentials to creating your own HMI and SCADA applications using Optix as well as some helpful examples for common applications.</p>



<h2 id="h-installation" class="wp-block-heading">Installation</h2>



<p class="wp-block-paragraph">FactoryTalk Optix Studio is installed via <a href="https://home.cloud.rockwellautomation.com/sign-in?returnTo=%2Fdashboard" target="_blank">FactoryTalk Hub</a>, and it is the IDE used to program Optix projects. You can either download the IDE application&nbsp;or utilize a web-based IDE if your license supports it.</p>



<p class="wp-block-paragraph">The Optix Runtime tools are also installed via FactoryTalk Hub, and they are required on any machine that is going to run an Optix application.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="FactoryTalk Optix Hub" height="437px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/1-ft-optix-hub.png" width="900px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>FactoryTalk Hub:&nbsp;which hosts a number of FT applications (including FactoryTalk Design Studio for Optix)</em></p></p>



<h2 id="h-licensing-and-pricing" class="wp-block-heading">Licensing and Pricing</h2>



<p class="wp-block-paragraph">Optix licensing is done on a token-based system, with more features requiring more tokens, and, therefore, a larger license. Generally speaking, the largest contributors to token usage are multiple concurrent web clients, OPC-UA connections, or database connections.</p>



<p class="wp-block-paragraph">Examples of features that affect the sizing of your application include the following:</p>



<ul class="wp-block-list">
<li>Controller connections</li>



<li>Multiple web clients</li>



<li>Alarming</li>



<li>Recipes</li>



<li>PDF reports</li>



<li>Data logging</li>



<li>Database connectivity</li>



<li>OPC UA connectivity</li>
</ul>



<p class="wp-block-paragraph">For more information on tokens and licensing, please see <a href="https://literature.rockwellautomation.com/idc/groups/literature/documents/at/optix-at001_-en-p.pdf" target="_blank">Rockwell’s documentation</a>.</p>



<h2 id="h-presentation-engines" class="wp-block-heading">Presentation Engines</h2>



<p class="wp-block-paragraph">Presentation engines are responsible for rendering and displaying UI elements during runtime. There are two available presentation engines that can be used simultaneously – the native presentation engine and the web presentation engine.</p>



<p class="wp-block-paragraph">The native presentation engine launches the project in its own window as an application.</p>



<p class="wp-block-paragraph">The web presentation engine hosts the application on a web server, accessible via the defined web page. Multiple concurrent web clients can access the application (if multiple connections are defined in the web presentation engine), but more concurrent clients require more tokens.</p>



<p class="wp-block-paragraph">Optix can make use of session-specific tools to allow concurrent clients to have different screens/panels open, have different users logged in, and display different information, provided that the Optix project was designed with multiple clients in mind.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Optix Presentation Engine" height="680px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/2-optix-presentation-engine.png" width="449px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example configured Web Presentation Engine</em></p></p>



<h2 id="h-style-sheets" class="wp-block-heading">Style Sheets</h2>



<p class="wp-block-paragraph">Style sheets allow the definition of default colors, shapes, sizes, and other UI element configurations. A project’s style sheet can be swapped during runtime. Some properties can be defined both in the style sheet and in an individual UI element. In the case that a property is explicitly defined for an individual element, it will override the style sheet.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Style Sheet Example" height="506px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/3-style-sheet-example.png" width="585px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example Style Sheet</em></p></p>



<h2 id="h-screens-and-panels" class="wp-block-heading">Screens and Panels</h2>



<p class="wp-block-paragraph">FT Optix uses screens, panels, and popups as the main methods for displaying UI elements. Screens and popups can both contain multiple panel loaders, which can be used to dynamically change displayed content when a defined action is performed, such as hitting a button.</p>



<p class="wp-block-paragraph">To see panel loaders being implemented to create a dynamic device sidebar that changes what device it controls (and the associated UI elements) at the push of a button, stay tuned for our upcoming&nbsp;<em>F</em><em>actoryTalk Optix &#8211;&nbsp;Dynamic Device Faceplate</em> blog post.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Panel Loader" height="398px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/4-panel-loader.png" width="900px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A panel loader that is a part of the main overlay of an application. It has the ability to load either a Motor or a GroundRack panel into the panel loader.</em></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Motor Panel Loaded" height="392px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/5-motor-panel-loaded.png" width="900px">&nbsp;</p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A runtime instance with the &#8220;Motor&#8221; panel loaded into the panel loader</em></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Rack Panel Loaded" height="391px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/6-rack-panel-loaded.png" width="900px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A runtime instance with the &#8220;Ground Rack&#8221; panel loaded into the panel loader</em></p></p>



<h2 id="h-converters" class="wp-block-heading">Converters</h2>



<p class="wp-block-paragraph">Converters allow you to modify variables dynamically based on other variables. For instance, a key-value converter could change the text displayed in a string variable when a different integer variable’s value changes, and an engineering unit converter can be used to scale variable values differently.</p>



<p class="wp-block-paragraph">There are more converter types and use cases that were not mentioned above. For more information on converters, stay tuned for our upcoming&nbsp;<em>FactoryTalk Optix &#8211; Variables, Attributes, Dynamic Links, and Converters</em> blog post.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Converter" height="346px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/7-converter.png" width="900px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A Key-Value converter that parses an integer out into valve status strings</em></p></p>



<h2 id="h-dynamic-links" class="wp-block-heading">Dynamic Links</h2>



<p class="wp-block-paragraph">Dynamic links are used to define relationships between two or more variables or attributes&nbsp;within the FT Optix project. Complex dynamic links&nbsp;allow the&nbsp;use of built-in converters, allowing further customization of UI elements.</p>



<p class="wp-block-paragraph">For further information on Property Bindings, stay tuned for our upcoming<em>&nbsp;FactoryTalk Optix &#8211; Variables, Attributes, Dynamic Links, and Converters</em>&nbsp;blog post.</p>



<p class="wp-block-paragraph">For an example of leveraging complex dynamic links, stay tuned for our upcoming <em>F</em><em>actoryTalk Optix &#8211;&nbsp;Dynamic Device Faceplate</em> blog post.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Dynamic Link" height="532px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/8-dynamic-link.png" width="580px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A dynamic link that performs mathematical operations on several variables to return an adjusted distance</em></p></p>



<h2 id="h-events" class="wp-block-heading">Events</h2>



<p class="wp-block-paragraph">Events call methods when a specific trigger happens, such as a button being pressed or a variable&#8217;s value changing. Events can be added onto most UI elements, and they can trigger multiple methods.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Example Event" height="645px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/9-example-event.png" width="609px"></p></p>



<h2 id="h-methods" class="wp-block-heading">Methods</h2>



<p class="wp-block-paragraph">Methods are called by events. FT Optix has a number of built-in methods, but custom methods can be defined through NetLogic as well.</p>



<p class="wp-block-paragraph">You can also create pre-defined method invocations, which allow the calling of methods with pre-defined parameters.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Methods" height="511px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/10-methods.png" width="500px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A list of common methods available in FT Optix</em></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Method Invocation" height="137px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/11-method-invocation.png" width="450px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>A custom method invocation for renaming a MySQL Database table</em></p></p>



<h2 id="h-netlogic" class="wp-block-heading">NetLogic</h2>



<p class="wp-block-paragraph">NetLogic allows C# code to be integrated and run in an FT Optix project. FT Optix can call parameterized methods, and they can send and receive variables with the C# project.</p>



<p class="wp-block-paragraph">For further information on NetLogic, stay tuned for our upcoming&nbsp;<em>FactoryTalk Optix &#8211; NetLogic Overview and Examples</em> blog post.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Net Logic" height="766px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/12-net-logic.png" width="900px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example NetLogic snippet that returns a localized time</em></p></p>



<h2 id="h-data-stores" class="wp-block-heading">Data Stores</h2>



<p class="wp-block-paragraph">Data stores are databases used to store values from different loggers and NetLogic (if you so choose). You can either use an embedded database, which is a simple SQLite database created with minimal overhead, or you can choose to create a connection to a database (SQL Server or MySQL). Other database types may be supported through ODBC connections, but they have not been tested or confirmed yet.</p>



<p class="wp-block-paragraph">Loggers can be linked directly to a data store and will automatically configure tables for themselves on said database.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Data Store Table" height="644px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/13-datastore-table.png" width="504px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>An example data store with an &#8220;Alarm Logger&#8221; linked to it, auto generating the necessary tables</em></p></p>



<h2 id="h-communication-drivers" class="wp-block-heading">Communication Drivers</h2>



<p class="wp-block-paragraph">Communication Drivers allow defining communication paths to PLCs and other devices, as well as the importing of tags and other information to be used in the Optix project. A list of the currently available communication drivers is available below.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Available Comm Drivers" height="640px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/14-available-comm-drivers.png" width="400px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>All available communication drivers in Optix</em></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Comm Driver" height="456px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/15-comm-driver.png" width="900px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>The tag importer display from an example Rockwell Ethernet Driver linked to a PLC</em></p></p>



<h2 id="h-template-library" class="wp-block-heading">Template Library</h2>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Template Library" height="888px" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/16-template-library.png" width="819px"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><i>Optix&#8217;s Template Library</i></p></p>



<p class="wp-block-paragraph">The template library stores templates created by Rockwell and allows you to create/import your own libraries as well. Some examples of useful templates that are included with Optix are:</p>



<ul class="wp-block-list">
<li>Alarm Grid</li>



<li>Alam History</li>



<li>Alarm Banner</li>



<li>User Login Popup</li>



<li>Confirmation Dialog</li>



<li>Date and Time Display</li>



<li>File Selector</li>



<li>File System Browser</li>



<li>Alarm Importer and Exporter</li>



<li>Alarm Logger</li>
</ul>



<h2 id="h-read-the-other-articles-in-this-series" class="wp-block-heading">Read the Other Articles in this Series</h2>



<ul class="wp-block-list">
<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10609/factorytalk-optix-series-2--variables-attributes-dynamic-links-and-converters">FactoryTalk Optix Series 2 &#8211; Variables, Attributes, Dynamic Links, and Converters</a></li>



<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10610/factorytalk-optix-series-3--netlogic-overview-and-examples">FactoryTalk Optix Series 3 &#8211; NetLogic Overview and Examples</a></li>
</ul>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Build Modern HMI and SCADA Applications with FactoryTalk Optix</strong>.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Explore our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" data-type="page" data-id="420">Automation</a> expertise in <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/rockwell-factorytalk-programming/factorytalk-optix-programming/" data-type="page" data-id="44850">FactoryTalk Optix</a> for flexible visualization, web-based HMIs, C# NetLogic, and industrial data integration.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/16514/factorytalk-optix-series-1-getting-started-with-factorytalk-optix/">FactoryTalk Optix Series 1 &#8211; Getting Started with FactoryTalk Optix</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Triggering Popups and Display Changes in FactoryTalk View Site Edition from the PLC</title>
		<link>https://static.dmcinfo.com/blog/17267/triggering-popups-and-display-changes-in-factorytalk-view-site-edition-from-the-plc/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Mon, 28 Aug 2023 18:23:57 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Display]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[FactoryTalk View SE]]></category>
		<category><![CDATA[FactoryTalk View Site Edition]]></category>
		<category><![CDATA[PLC]]></category>
		<category><![CDATA[Popup]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/17267/triggering-popups-and-display-changes-in-factorytalk-view-site-edition-from-the-plc/</guid>

					<description><![CDATA[<p>Whether you are migrating from Machine Edition or working with FactoryTalk View for the first time, triggering displays or popups from the PLC in Site Edition is non-trivial. In this blog post, we are going to discuss how to use Visual Basic to our advantage to trigger both display changes and popup displays. Common questions [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/17267/triggering-popups-and-display-changes-in-factorytalk-view-site-edition-from-the-plc/">Triggering Popups and Display Changes in FactoryTalk View Site Edition from the PLC</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Whether you are migrating from Machine Edition or working with FactoryTalk View for the first time, triggering displays or popups from the PLC in Site Edition is non-trivial. In this blog post, we are going to discuss how to use Visual Basic to our advantage to trigger both display changes and popup displays.</p>



<p class="wp-block-paragraph"><strong>Common questions that may have led you here:</strong></p>


<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">


<p class="wp-block-paragraph"><strong>Why can I do this in Machine Edition but not Site Edition?</strong></p>



<p class="wp-block-paragraph">One major difference between ME and SE is the <a href="https://en.wikipedia.org/wiki/Client%E2%80%93server_model" rel="no follow" target="_blank">Client-server model</a> employed by SE. While ME has one instance of the HMI, SE can have multiple clients connected to the same server that the PLC is connected to. Each of these client instances will appear as its own <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming"><strong>HMI programming</strong></a> and can be operated independently of the others. This behavior is contrary to ME’s.</p>



<p class="wp-block-paragraph"><strong>Why can&#8217;t I use events to trigger the &#8220;Display&#8221; command?</strong></p>



<p class="wp-block-paragraph">FactoryTalk View Site Edition operates on a <a href="https://en.wikipedia.org/wiki/Client%E2%80%93server_model" rel="no follow" target="_blank">Client-server model</a>. When you run a <code>.cli</code> file, you are running a client connected to a server. When an event triggers, it is done on the server, not the client. The FactoryTalk server is configured to ignore <code><tt>Display</tt> </code>commands run on it.</p>


</div>


<h2 class="wp-block-heading" id="h-the-basics">The Basics</h2>



<p class="wp-block-paragraph">In this section, we will&nbsp;cover how to do the minimum viable work to get display changes working. This process will cover the basics and allow you to get working on your own, but feel free to stick around if you want to improve your coding and architecting skills.</p>



<h3 class="wp-block-heading" id="h-creating-a-trigger">Creating a Trigger</h3>



<p class="wp-block-paragraph">In this section, I am going to explain how to create a global trigger. This just means that we are going to set up a display such that the trigger is always being updated so you can initiate a change from any display.</p>


<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">


<p class="wp-block-paragraph"><strong>That is too vague. Give me the technical description!</strong></p>



<p class="wp-block-paragraph">In order to create a “global trigger,” we are going to employ the assistance of an event-driven VBA subroutine on a screen loaded into cache and being constantly updated.</p>



<p class="wp-block-paragraph">We will create an event-driven VB subroutine by using the <code>Change</code> event on a numeric input component. This numeric input will be put on a screen that is developed specifically to be loaded into cache and constantly updated so that the <code>Change</code> event can be seen at any time. This will be achieved by calling the <code>Display </code>command with the <code>/ZA</code> parameter (see the&nbsp;<a data-sk="tooltip_parent" data-stringify-link="https://literature.rockwellautomation.com/idc/groups/literature/documents/um/viewse-um006_-en-e.pdf#page=313" delay="150" href="https://literature.rockwellautomation.com/idc/groups/literature/documents/um/viewse-um006_-en-e.pdf#page=283" rel="noopener noreferrer" target="_blank">Rockwell Docs</a>&nbsp;for more specifics on the behavior of this command) from a macro run on startup.</p>


</div>


<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">Firstly, we are going to create a new display. You can call this display <code>PopupHandler&nbsp;</code>if you want it to be sufficiently descriptive. On this display, we are going to add a numeric input. Set the expression to be your trigger condition.</p></p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/numeric-display-on-popuphandler-display.png" alt="Numeric Display on PopupHandler Display"/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sample-expression-for-numeric-display.png" alt="Sample Expression for the Numeric Display"/></figure>


<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">


<p class="wp-block-paragraph"><strong>Multistate Triggers</strong></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 [&quot;expand&quot;,{&quot;title&quot;:&quot;Multistate Triggers&quot;,&quot;__expanded&quot;:true}]">The observant eye might realize our expression is not limited to a 0 or 1; therefore, neither is the behavior of our triggered event. If you have a more multistate tag that you want to link here, feel free to do so. We will address how to change the event by value later in the blog when discussing architecture improvements.</p></p>


</div>


<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">Once you’ve got the numeric input set up, right click the background of the display and select <code>Display Settings...</code> . Make sure the following properties match between your displays:</p></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 []"></p></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">Now, we are going to make the PopupHandler silently load and stay cached and updated so the numeric input we have created is always loaded. Create a macro and call it <code>startup</code>. When the macro opens, add the following command on a new line:</p></p>


<pre data-pm-slice="1 1 []">
<code>Display PopupHandler /ZA</code></pre>


<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/example-macro-script.png" alt="Example Macro Script"/></figure>


<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">


<p class="wp-block-paragraph"><strong>What does this command do?</strong></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 [&quot;expand&quot;,{&quot;title&quot;:&quot;What does this command do?&quot;,&quot;__expanded&quot;:true}]">This command will load this display into cache and continually update its values. This is important as it will make sure the numeric stays loaded and updated as the client runs.</p></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 [&quot;expand&quot;,{&quot;title&quot;:&quot;What does this command do?&quot;,&quot;__expanded&quot;:true}]"><strong>What if I already have a client-side startup macro?</strong></p></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 [&quot;expand&quot;,{&quot;title&quot;:&quot;What if I already have a client-side startup macro?&quot;,&quot;__expanded&quot;:true}]">If you already have one, just append this command to the end of the existing macro.</p></p>


</div>


<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">Now that we have the macro ready, we are going to add it to our client runtime. Edit your <code>.cli</code> file and make sure you’ve got the <code>startup</code> macro selected to run on startup. Once this is done, the macro should execute on startup and load the <code>PopupHandler</code> display into our cache.</p></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 [&quot;expand&quot;,{&quot;title&quot;:&quot;What does this command do?&quot;,&quot;__expanded&quot;:true}]"></p></p>



<h3 class="wp-block-heading" id="h-using-vb-to-set-a-display">Using VB to Set a Display</h3>



<p class="wp-block-paragraph">Now that we have the trigger ready, we are going to add the corresponding VB Script. Select the numeric input on your <code>PopupHandler</code> display, right click, and select <code>VBA Code...</code> . You should see the following:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/vba-subroutine-definition.png" alt="VBA Subroutine Definition"/></figure>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">The subroutine (<code>sub</code>) you see of the form <code>NumericDisplayName_Change</code> is the script that is going to run when our condition changes. To trigger our display change, we are going to add the following line of code inside the subroutine (replace “DisplayName” with the display you want to appear).</p></p>


<pre data-pm-slice="1 1 []">
<code>ExecuteCommand ("Display DisplayName")</code></pre>


<p class="wp-block-paragraph">With that, you should be ready to go. Go ahead and restart your client and try triggering your condition. Ideally, you should see the popup or display you specified appear when the condition changes. If you do, you’ve got the minimum viable product and should proceed to the &#8220;Let&#8217;s Make it Better&#8221; section to refine your implementation.</p>



<h2 class="wp-block-heading" id="h-let-s-make-it-better">Let’s Make it Better</h2>



<p class="wp-block-paragraph">We can do better and you know it. If you want to impress the&nbsp;future engineers who will look at your work, then I suggest you get&nbsp;to the end of this section.</p>



<h3 class="wp-block-heading" id="h-better-naming-practice">Better Naming Practice</h3>



<p class="wp-block-paragraph">Let’s start by changing the name of our component. Go into the component properties and set the name to something more descriptive —&nbsp;in this case, we will use <code>PopupEventTrigger</code>. If we observe the VB Script again, then we will see the name of the subroutine has been changed to reflect what was done in FactoryTalk View Studio.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/updated-vba-subroutine.png" alt="Updated VBA Subroutine"/></figure>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">Let’s also leave a clear visual indication of the work we have done. Next to the numeric input you are using, go ahead and add a text box and describe what is happening here. This will make it readily apparent to other engineers that there is VB Scripting going on behind the scenes.</p></p>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 []"></p></p>



<h3 class="wp-block-heading" id="h-case-by-case-events">Case-By-Case Events</h3>



<p class="wp-block-paragraph"><p data-pm-slice="1 1 []">Instead of triggering any time we see the value change, let&#8217;s consider the value we are seeing. In this case, we are going to nest another condition that checks if the value of our trigger is&nbsp;&#8220;1&#8221;. With this new implementation,&nbsp;we should only see our change when we have a rising edge signal.</p></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
Private Sub PopupEventTrigger_Change()
    ' If trigger value is rising '
    If PopupEventTrigger.Value = 1 Then
        ' Change Display '
        ExecuteCommand ("Display Popup")
    End If
End Sub </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">Private Sub </span><span style="color: #DCDCAA">PopupEventTrigger_Change</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; If trigger value is rising &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&apos; Change Display &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #569CD6">End Sub </span></span></code></pre></div>


<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">


<p class="wp-block-paragraph"><strong>Working with popup displays?</strong></p>



<p class="wp-block-paragraph">If you are working with popup displays, you may want to use triggers to close the popup as well as open it. Well, as luck has it, implementing this functionality is a breeze. In the simplest terms, we need only execute the command <code>Abort DisplayName</code> from our Visual Basic script; however, if we want to get clever, we can reuse our existing condition, closing the popup on a falling edge signal in addition to opening it with a rising edge signal!</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
Private Sub PopupEventTrigger_Change()
    ' If trigger value is rising '
    If PopupEventTrigger.Value = 1 Then
        ' Change Display '
        ExecuteCommand ("Display Popup")
    ' If trigger value is falling '
    ElseIf PopupEventTrigger.Value = 0 Then
        ' Close Display '
        ExecuteCommand ("Abort Popup")
    End If
End Sub
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">Private Sub </span><span style="color: #DCDCAA">PopupEventTrigger_Change</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; If trigger value is rising &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&apos; Change Display &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; If trigger value is falling &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">ElseIf</span><span style="color: #D4D4D4"> PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&apos; Close Display &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Abort Popup&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #569CD6">End Sub</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Notice that I chose to use an <code>Elsif</code> here instead of an <code>Else</code>. This was intentional, as the value of the numeric display is not limited to 1 nor 0. When deciding how to handle your code, consider what makes the most sense for you based on your intended behavior.</p>


</div>


<h3 class="wp-block-heading" id="h-error-handling">Error Handling</h3>



<p class="wp-block-paragraph">Let&#8217;s prevent errors from interfering with our operation. If there is an issue with the connection to the PLC, then the numeric display may have an error value. Unfortunately for us, this change to an error value counts as a value change and will trigger our display change subroutine. To avoid this, we will wrap our logic in an if statement that checks if there is an error value in our component.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
Private Sub PopupEventTrigger_Change()
    ' Make sure there is no error '
    If Not IsError(PopupEventTrigger.Value) Then

        ' If trigger value is rising '
        If PopupEventTrigger.Value = 1 Then
            ' Change Display '
            ExecuteCommand ("Display Popup")
        End If

    End If
End Sub
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">Private Sub </span><span style="color: #DCDCAA">PopupEventTrigger_Change</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; Make sure there is no error &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> Not </span><span style="color: #DCDCAA">IsError</span><span style="color: #D4D4D4">(PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">Then</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&apos; If trigger value is rising &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">&apos; Change Display &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">End If</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #569CD6">End Sub</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Alternatively, we could exit the subroutine early if there is an error.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
Private Sub PopupEventTrigger_Change()
    ' Make sure there is no error '
    If IsError(PopupEventTrigger.Value) Then
        Exit Sub
    End If

    ' If trigger value is rising '
    If PopupEventTrigger.Value = 1 Then
        ' Change Display '
        ExecuteCommand ("Display Popup")
    End If
End Sub
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">Private Sub </span><span style="color: #DCDCAA">PopupEventTrigger_Change</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; Make sure there is no error &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">IsError</span><span style="color: #D4D4D4">(PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Exit Sub</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; If trigger value is rising &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&apos; Change Display &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #569CD6">End Sub</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading" id="h-let-s-make-it-scalable">Let’s Make it Scalable</h2>



<p class="wp-block-paragraph">While this solution works great for changing to one specific display, it doesn’t work great at scale. Imagine, for a moment, having to repeat the process of creating a new numeric input and writing the Visual Basic subroutine for every display you want to change to. Needless to say, this proposition elicits feelings of dread.</p>



<p class="wp-block-paragraph">To avoid this monotonous task, we are going to discuss a couple possible architecture changes to support additional display changes.</p>



<h3 class="wp-block-heading" id="h-potential-architectures">Potential Architectures</h3>



<p class="wp-block-paragraph">There are, of course, more options than the two I will address here; however, they should generate some considerations for designing the architecture that fits best for your uses.</p>



<h3 class="wp-block-heading" id="h-custom-display-indexing">Custom Display Indexing</h3>



<p class="wp-block-paragraph">The numeric display we have been using to trigger our subroutine is not limited to a 1 or 0, so let’s make use of it. Change the expression to read an int on the PLC, and let&#8217;s move to a display based on what int is shown.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/integer-expression-in-numeric-display.png" alt="Integer Expression in Numeric Display"/></figure>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
Private Sub PopupEventTrigger_Change()
    ' Make sure there is no error '
    If IsError(PopupEventTrigger.Value) Then
        Exit Sub
    End If

    Select Case PopupEventTrigger.Value
        Case 1
            ExecuteCommand ("Display Popup1")
        Case 2
            ExecuteCommand ("Display Popup2")
        Case 3
            ExecuteCommand ("Display Popup3")
    End Select
End Sub
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">Private Sub </span><span style="color: #DCDCAA">PopupEventTrigger_Change</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; Make sure there is no error &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">IsError</span><span style="color: #D4D4D4">(PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Exit Sub</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">Select</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Case</span><span style="color: #D4D4D4"> PopupEventTrigger.Value</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Case</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup1&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Case</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup2&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Case</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display Popup3&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End Select</span></span>
<span class="line"><span style="color: #569CD6">End Sub</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">This approach is handy as it allows you to map integer values to displays, similar to how the process works in ME. All the display changes are handled here in this subroutine; however, you will have to manually add each new display you want to transition to. To avoid this, we can have the PLC pass a string indicating a destination display.</p>



<h3 class="wp-block-heading" id="h-passing-strings-from-the-plc">Passing Strings from the PLC</h3>



<p class="wp-block-paragraph">By setting a string on the PLC for the HMI to read, we can indicate any display we want to transfer to! For simplicity, let&#8217;s create a string display on our <code>PopupHandler</code> screen to reference in our VBA. There, we can change our command to display whatever display is referenced in the string. Make sure that the string display has plenty of characters, as it will trim the PLCs string to the specified character amount. Additionally, make sure to expose the string display to VBA from the property panel with the option &#8220;VBA Control&#8221;.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/addition-of-string-display-to-popuphandler.png" alt="Addition of String Display to PopupHandler"/></figure>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
Private Sub PopupEventTrigger_Change()
    ' Make sure there is no error '
    If IsError(PopupEventTrigger.Value) Then
        Exit Sub
    End If

    ' If trigger bit rising '
    If PopupEventTrigger.Value = 1 Then
        ' Trigger display change based on the value of the passed string '
        ExecuteCommand ("Display " &amp; DisplayNameString.Value)
    End If
End Sub
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #569CD6">Private Sub </span><span style="color: #DCDCAA">PopupEventTrigger_Change</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; Make sure there is no error &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">IsError</span><span style="color: #D4D4D4">(PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Exit Sub</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos; If trigger bit rising &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> PopupEventTrigger.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&apos; Trigger display change based on the value of the passed string &apos;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ExecuteCommand</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;Display &quot;</span><span style="color: #D4D4D4"> &amp; DisplayNameString.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #569CD6">End Sub</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>If you want help with your FactoryTalk View SE project or <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/plc-programming">PLC development</a>, <a href="https://static.dmcinfo.com/contact">contact us</a>&nbsp;today for your next project&nbsp;</strong>—<strong>&nbsp;we would love to help!</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/17267/triggering-popups-and-display-changes-in-factorytalk-view-site-edition-from-the-plc/">Triggering Popups and Display Changes in FactoryTalk View Site Edition from the PLC</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Maximizing FactoryTalk View Site Edition Performance</title>
		<link>https://static.dmcinfo.com/blog/20445/maximizing-factorytalk-view-site-edition-performance/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 17 Dec 2019 13:03:25 +0000</pubDate>
				<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[PLC Programming]]></category>
		<category><![CDATA[Rockwell]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/20445/maximizing-factorytalk-view-site-edition-performance/</guid>

					<description><![CDATA[<p>DMC recently helped a client maximize the visual performance and response of a FactoryTalk View Site Edition (FTV SE) Local Station application talking to a Micro850 PLC, and we have some tips and tricks to share for getting the most out of your FTV SE applications! Our application had some lag when loading new screens [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/20445/maximizing-factorytalk-view-site-edition-performance/">Maximizing FactoryTalk View Site Edition Performance</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">DMC recently helped a client maximize the visual performance and response of a FactoryTalk View Site Edition (FTV SE) Local Station application talking to a Micro850 PLC, and we have some tips and tricks to share for getting the most out of your FTV SE applications!</p>

<p class="wp-block-paragraph">Our application had some lag when loading new screens because of the large amount of tags required to populate the screens. FTV SE can <a href="https://rockwellautomation.custhelp.com/app/answers/detail/a_id/607499">pull up to about 200 tags from a Micro 850 per second</a>; with larger PLC programs taking more time to send tags.</p>

<p class="wp-block-paragraph">For smaller HMI/PLC applications, all of the PLC tags from a Micro 850 can easily be pulled quickly while loading a screen. For larger applications, there may be some delay after opening a screen before all of the tags on a screen are loaded from the PLC and ready to populate their indicators.</p>

<p class="wp-block-paragraph">However, <a href="/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/rockwell-factorytalk">FactoryTalk</a> lets you load screens snappily, even when talking to smaller PLCs or when large amounts of data need to be loaded.</p>

<p class="wp-block-paragraph">A few tips and tricks are below!</p>

<ol class="wp-block-list">
 <li><strong>Decrease Maximum Tag Update Rate (per Screen)</strong> &#8211; This rate controls the shortest possible time it will take the FactoryTalk application to acquire or send a tag. This is important for buttons and indicators that need to have a fast&nbsp;response, as well as for loading screens quickly.

 <ol class="wp-block-list" style="list-style-type:lower-alpha">
  <li style="margin-bottom:10px; margin-top:10px;">To access this setting, right-click on a screen, select <strong>Display Settings</strong>, and under the <strong>Properties</strong> window, select the drop-down for <strong>Maximum Tag Update Rate</strong>. The default setting is 1 second; this may appear slow for most applications. A rate of 0.25 or 0.1 seconds will usually allow the screen to react without visible lag.<br />
  <img decoding="async" alt="max tag update" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Factory-talk-performance-step1_1.png"  /></li>
  <li style="margin-bottom:10px">This may have different levels of impact with different PLC platforms &#8211; this should be a good solution for fast performance with the Logix line of processors. We found that additional steps were needed with the smaller Micro800 line.</li>
  <li style="margin-bottom:10px">Keep in mind that your application may not be able to keep up with faster Tag Update Rate setpoints. This is dependent on the number of tags you have on the screen and the number of tags that are being fetched in the background (read on to learn more about background fetching!)</li>
 </ol>
 </li>
 <li><strong>Add Screen Caching</strong> &#8211; FactoryTalk View Site Edition&apos;s default behavior is to close any screens that aren&apos;t actively being displayed. This minimizes PC resource usage and allows you to edit screens in an active application (one of my favorite features). However, you can individually configure each screen to be cached, so that the screen is kept in memory even when it isn&apos;t shown on the screen. This greatly improves behavior for laggy screens.
 <ol class="wp-block-list" style="list-style-type:lower-alpha">
  <li style="margin-bottom:10px; margin-top:10px;">To access this setting, right-click on a screen, select <strong>Display Settings</strong>, and under the <strong>Properties</strong> window, choose <strong>Yes</strong> for <strong>Cache After Displaying</strong>.</li>
  <li style="margin-bottom:10px">You also have the option to select whether the screen is <strong>Always Updating</strong> or not. <strong>Always Updating</strong> is a good selection for screens that don&apos;t populate immediately even when cached &#8211; we found this was the best choice for most of our larger screens with lots of tags. Keep in mind that if the screen is Always Updating, it will always be polling tags from the PLC. This may influence the update rate of tags on other screens in your application.<br />
  <img decoding="async" alt="updating selection" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/factorytalk-performance-step2.png"  /></li>
 </ol>
 </li>
 <li style="Margin-botton:10px"><strong>Add Screen Pre-Caching</strong> &#8211; If Screen Caching improved your application&apos;s performance, you may also want to consider Pre-Caching your screens! Pre-Caching pre-loads the screens while the application is starting up, without displaying them on the PC. Cached screens without pre-caching&nbsp;may still be slow to load the first time they&apos;re displayed; pre-caching makes the display pull from an already cached screen the first time that it&apos;s loaded.
 <ol class="wp-block-list" style="list-style-type:lower-alpha">
  <li style="Margin-botton:10px; margin-top:10px;">This can be done via a Startup Macro. Create a macro in the <strong>Explorer</strong> pane under <strong>Logic and Control &gt; Macros</strong>. Right-click to create a <strong>New</strong> Macro.<br />
  <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/factorytalk-performance-step3.png"  /></li>
  <li style="Margin-botton:10px">In the Macro editor, add a call to the &quot;Display&quot; function for each screen that you&apos;d like to precache. Use the \Z flag to cache a screen <strong>without</strong> marking it as Always Updating. Use the \ZA flag to cache a screen and set the screen to Always Update. (A full description of this function and possible flags is available in the FTV help files as &quot;FactoryTalk View Site Edition Help &gt; FactoryTalk View commands &gt; Graphics commands &gt; Display&quot;)<br />
  <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/factorytalk-performance-step3B.png"  /></li>
  <li style="Margin-botton:10px">When launching or creating your FTV SE Client with the <strong>FactoryTalk View SE Client Wizard</strong>, include your macro as the <strong>Startup Macro</strong>.<br />
  <img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/factorytalk-performance-step3C.png"  /></li>
 </ol>
 </li>
</ol>

<p class="wp-block-paragraph">If you follow these tips, you should have a fast and snappy HMI!</p>

<p class="wp-block-paragraph"><strong>Learn more about <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/plc-programming/allen-bradley-plc-programming">DMC&apos;s Rockwell Programming Services.</a></strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/20445/maximizing-factorytalk-view-site-edition-performance/">Maximizing FactoryTalk View Site Edition Performance</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Setting Up a New Allen-Bradley PLC and HMI: Tips and Tricks</title>
		<link>https://static.dmcinfo.com/blog/22073/setting-up-a-new-allen-bradley-plc-and-hmi-tips-and-tricks/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Thu, 07 Feb 2019 13:48:21 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[Denver]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22073/setting-up-a-new-allen-bradley-plc-and-hmi-tips-and-tricks/</guid>

					<description><![CDATA[<p>In this blog, I’ll walk you through the basic commissioning steps to get a brand-new Allen-Bradley PLC and HMI up and running. All the information covered here is also available in Rockwell’s help documentation, but I tried to distill out the most important bits to get you off the ground as fast as possible. Before [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22073/setting-up-a-new-allen-bradley-plc-and-hmi-tips-and-tricks/">Setting Up a New Allen-Bradley PLC and HMI: Tips and Tricks</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In this blog, I’ll walk you through the basic commissioning steps to get a brand-new Allen-Bradley PLC and HMI up and running. All the information covered here is also available in Rockwell’s help documentation, but I tried to distill out the most important bits to get you off the ground as fast as possible.</p>



<p class="wp-block-paragraph">Before we start, you&#8217;ll need all of the components networked together and powered on. You&#8217;ll also need a PC with all the relevant Rockwell software installed. Once you&#8217;ve accomplished this, give yourself a pat on the back&nbsp;and read on!</p>



<h2 class="wp-block-heading" id="h-firmware-setup">Firmware Setup</h2>



<p class="wp-block-paragraph">Congratulations, you’ve just powered up your shiny new Allen-Bradley PLC for the first time. Now what? If it’s fresh out of the box, you’ll likely have to install the firmware. To do this, you’ll need a Rockwell tool called <em>ControlFLASH.</em>&nbsp;Believe me, it’s as exciting as the icon makes it look, just without the lightning bolts.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/control-flash.png" alt="Rockwell control flash software"/></figure>



<p class="wp-block-paragraph">With an Ethernet cable connected directly between your PC and the PLC, follow the prompts to select your model number and firmware revision. Navigate to the PLC in <em>RSLinx </em>and click <strong>OK</strong>. Accept all the warnings that tell you not to do this on a live system. If you are doing this on a live system – STOP!&nbsp;When the firmware upgrade completes, the PLC will begin scrolling its MAC address across its display (if applicable). That means you’re ready to assign IP addresses.</p>



<h2 class="wp-block-heading" id="h-setting-the-plc-ip-address">Setting the PLC IP Address</h2>



<p class="wp-block-paragraph">The factory default for Allen-Bradley PLCs and many peripherals is to ship with <strong>BootP/DHCP</strong> enabled. However, DMC finds that best practice is to setup static IP addresses for all devices on the control network. This makes life much easier in the future, especially with integrating SCADA, remote access, and device troubleshooting. To disable BootP and give the PLC a static IP address, you’ll need another Rockwell tool called <em>BootP DHCP EtherNet/IP Commissioning Tool.</em></p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/bootp.png" alt="Rockwell BootP DHCP Comissioining tool"/></figure>



<p class="wp-block-paragraph">Locate your PLC by its MAC address and choose “<strong>Add Relation</strong>.” Next, right-click on the PLC (now in the lower window pane) and choose “<strong>Disable BootP/DHCP</strong>.” Enter the desired network settings and click <strong>OK</strong>. Wait for the successful confirmation message. It’s always a good idea to stop at this point and power cycle the system. If the PLC retains its IP address, go ahead and move on to the next step. If not, try this step again until the IP settings stick. If you’re having issues with the BootP/DCHP tool, check out <strong><a href="https://static.dmcinfo.com/latest-thinking/blog/id/9695/categoryid/58/quick-solution-for-rockwell-bootp-communication-error">Lillian’s blog post</a></strong> for tips.</p>



<h2 class="wp-block-heading" id="h-download-your-program">Download your program</h2>



<p class="wp-block-paragraph">At this point, your PLC is ready for operation. With your program open in <em>RSLogix</em>, select “<strong>Who Active</strong>” from the “<strong>Communication</strong>” menu. This will bring up the familiar <em>RSLinx </em>view. Select your PLC at the IP address you just assigned and click <strong>Download</strong>. Remember to move the key on the front of the PLC to either &#8220;<strong>Remote</strong>&#8221; or &#8220;<strong>Program</strong>&#8221; before downloading.&nbsp;</p>



<h4 class="wp-block-heading" id="h-set-up-the-hmi-ip-address">Set up the HMI IP Address</h4>



<p class="wp-block-paragraph">This process varies from HMI to HMI, but the fundamentals are the same. Somewhere in the device setup menu, you’ll be able to type in your network settings. This is often a few layers deep in the device settings, but it is fairly straightforward. Note that many Rockwell HMIs require a power cycle after the network configuration is changed. Just like with the PLC, it’s always a good idea to verify that the settings were retained afterwards.</p>



<h2 class="wp-block-heading" id="h-set-up-hmi-plc-communication">Set up HMI PLC Communication</h2>



<p class="wp-block-paragraph">Next, we need to tell the HMI where to find the PLC on the network. In <em>FactoryTalk View Studio</em>, the path to the PLC is configured in the “<strong>Communication Setup</strong>” menu of the project tree. The screenshots are taken from <em>FactoryTalk View Studio Machine Edition</em>.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/communication-setup-in-project-tree_1.png" alt="FactoryTalk communication setup location"/></figure>



<p class="wp-block-paragraph">Double-clicking the &#8220;<strong>Communication Setup</strong>&#8221; icon brings up this window:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Communication-setup-no-marks.png" alt="Communication setup window FactoryTalk View ME"/></figure>



<p class="wp-block-paragraph">The leftmost pane of this window contains the “<strong>Device Shortcuts</strong>,” which is where you setup the path to any device your HMI needs to talk to. If you have more than 1 PLC in your project,&nbsp;add multiple device shortcuts. In this example, I just have one PLC, which I’ve named “<em>PLC_1</em>.” Best practice is to give the PLC a more descriptive name, such as &#8220;<i>PlantHVAC_PLC.&#8221;&nbsp;</i>That way, an example tag on the HMI would read &#8220;<em>[PlantHVAC_PLC]bExampleBooleanTag</em>.&#8221; For more information on tag linking, including global object parameters, <strong>check out these other blogs by <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9258/categoryid/71/rockwell-factorytalk-studio-basics-global-objects-and-tag-substitution">Gina </a>and <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9541/categoryid/71/factorytalk-view-parameter-linking-bug-fix">Emily</a>.&nbsp;</strong></p>



<p class="wp-block-paragraph">The right pane shows you all the available connections in <em>RSLinx</em>. Assuming you’ve configured your network adaptor correctly, you should be able to see the PLC at the IP address you gave it above. In my project, for example, there are two PLCs that I can designate as “<em>PLC_1</em>”. One is an 1756-EBNT/A ControlLogix processor and the other is an emulated PLC. To choose the PLC path, I simply click on the processor I want and click <strong>OK</strong>.</p>



<p class="wp-block-paragraph"><em>But wait, there’s a catch!</em> Notice the two tabs at the top of the right pane: Design (Local) and Runtime (Target).</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/runtime-configuration.png" alt="Communication setup in FactoryTalk with runtime"/></figure>



<p class="wp-block-paragraph">This is a really powerful feature that can sometimes be confusing to new users. These tabs allow you to assign two different PLCs to the same shortcut, depending on what &#8220;environment&#8221; you&#8217;re running the HMI in. The <strong>design </strong>environment is <em>FactoryTalk View Studio</em> on your PC. This is the environment that opens when you click&nbsp;<strong>&#8220;Test Application&#8221;</strong>&nbsp;under the &#8220;<strong>Application</strong>&#8221; menu.&nbsp;</p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">The other environment is the <strong>runtime </strong>environment. These settings are included in the actual machine edition runtime (<strong>.mer)</strong> file that you download to the HMI. This feature can be especially useful when you’re simulating features on your PC before deploying them to the physical PLC and HMI. However, it means that you have to be diligent in setting the correct processor path for the right environment.  If your communication settings seem correct and it still isn&#8217;t working, then verify that the path to the PLC in the runtime environment is correct!</p>



<p class="wp-block-paragraph">Once you&#8217;ve successfully mapped the PLC path in both environments, click <strong>OK </strong>and accept the confirmation messages.</p>



<h2 class="wp-block-heading" id="h-download-to-the-hmi">Download to the HMI</h2>



<p class="wp-block-paragraph">Now that the program is configured, you’ll need to create a machine edition runtime file (<strong>.mer</strong>). The &#8220;<strong>Create Runtime Application</strong>&#8221; button is just under the &#8220;<strong>Test Application</strong>&#8221; button in the &#8220;<strong>Application</strong>&#8221; menu of <em>FactoryTalk View Studio</em> (see screenshot above). Save the file somewhere convenient and then open the &#8220;<em>ME Transfer Utility</em>.&#8221; Locate the file you just created as the source file. Select the HMI in the <em>RSLinx </em>window and click <strong>Download</strong>. </p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ME-Transfer-Utility_1.png" alt="FactoryTalk View Studio ME Transfer Utility"/></figure>



<p class="wp-block-paragraph">One option to take note of when downloading the runtime file is the “<i>replace communications</i>” checkbox. If you’ve just set up the path to the PLC, you must check this box to include the communication settings. If this isn&#8217;t a new download and you&#8217;re just making updates to an existing system, you might want to uncheck this box to eliminate the risk of messing up the communication paths. </p>



<p class="wp-block-paragraph">Once the download finishes and the HMI restarts, you should be good to go. A good test is to modify a value in&nbsp;<strong>Controller Tags</strong>&nbsp;of&nbsp;<em>RSLogix</em>&nbsp;while online with the PLC and verify that the value updates on the HMI.&nbsp;</p>



<h2 class="wp-block-heading" id="h-next-steps">Next Steps</h2>



<p class="wp-block-paragraph">Hopefully, this blog was helpful in getting your system up and running. This is by no means an exhaustive list of the settings and configuration options for PLC-HMI communication, but hopefully, it got you off the ground. If you’re in need of further assistance or if you’d like to learn more about <strong><a href="https://static.dmcinfo.com/latest-thinking/blog/articletype/categoryview/categoryid/58/allen-bradley-plc">DMC’s Rockwell programming expertise</a></strong>, please give us a call! Our team of experts is standing by, ready to get your next project rolling.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22073/setting-up-a-new-allen-bradley-plc-and-hmi-tips-and-tricks/">Setting Up a New Allen-Bradley PLC and HMI: Tips and Tricks</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Easy Alarm Generation in RSLogix and FactoryTalk View Studio ME</title>
		<link>https://static.dmcinfo.com/blog/22261/easy-alarm-generation-in-rslogix-and-factorytalk-view-studio-me/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 15 Jan 2019 09:15:39 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[Beckhoff PLC]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22261/easy-alarm-generation-in-rslogix-and-factorytalk-view-studio-me-3/</guid>

					<description><![CDATA[<p>Manually adding alarms in FactoryTalk View can be tedious. When you have a system with lots and lots of devices, as DMC often does, this can become nearly impossible. That’s why during one of our annual FedEx days, DMC engineers built a custom Windows application to do all the grunt work for us. Quick Summary [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22261/easy-alarm-generation-in-rslogix-and-factorytalk-view-studio-me/">Easy Alarm Generation in RSLogix and FactoryTalk View Studio ME</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Manually adding alarms in FactoryTalk View can be tedious. When you have a system with lots and lots of devices, as DMC often does, this can become nearly impossible. That’s why during one of our annual <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9369/fedex-day-fosters-continuous-innovation">FedEx days</a>, DMC engineers built a <a href="https://static.dmcinfo.com/blog/category/application-development/pc-application-development/">custom Windows application</a> to do all the grunt work for us.</p>



<p class="wp-block-paragraph"><strong>Quick Summary</strong></p>



<p class="wp-block-paragraph">This tool takes in a CSV file of the controller tags, which is easy to generate in RSLogix (<strong>Tools -&gt; Export -&gt; Tags and Logic Comments</strong>). In this example, we will use any bit with <strong>Alarm&nbsp;</strong>in the title as a trigger value. The tool then generates an alarm message for each trigger, using the tag’s <strong>Description</strong>&nbsp;text as the alarm message. We then export the alarm messages to an XML file and import it into FactoryTalk, ready to use.</p>



<h2 class="wp-block-heading" id="h-illustrating-how-the-tool-works">Illustrating How the Tool Works</h2>



<p class="wp-block-paragraph">To demonstrate how the tool works, consider an example project that contains 10 Allen-Bradley PowerFlex drives. Similar to how DMC organizes data in the <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9739/siemens-open-library-version-30-release">Siemens Open Library</a>, we&#8217;ll <strong>create a data type </strong>(<strong>udtHMI_VFD_PFlex753) to hold all of our data for each drive</strong>. Part of that UDT will be an error structure, where each error will have its own boolean tag.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/udt-comments-2.png" alt="Alarm bits for VFD"/></figure>



<p class="wp-block-paragraph">Next,&nbsp;we&#8217;ll <strong>make a tag for each of the motors of type udtHMI_VFD_PFlex735 </strong>in the controller tags. At DMC, we like to store our alarms in arrays of DINTs because it makes it easy to see if any alarms are active, or if any new alarms have become active since we last checked. So for this project, we&#8217;ll <strong>add an array of 3 DINTs called Alarm</strong>.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/controller-tags-small-2.png" alt="Alarm controller tags"/></figure>



<p class="wp-block-paragraph">Since our Alarm Generation Tool uses the tag description as the alarm text, we need to <strong>add the descriptions to each bit in the DINT</strong>. Adding descriptions can be done quickly and easily in Microsoft Excel.&nbsp;</p>



<p class="wp-block-paragraph">Excel&#8217;s concatenation and macro features can be extremely useful when doing this for large numbers of alarms. We&#8217;ll <strong>add a row of type COMMENT</strong>&nbsp;for each bit in the alarm, following the correct syntax shown below.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/alarms-in-excel-2.png" alt="Commented alarm tags in excel"/></figure>



<p class="wp-block-paragraph"><strong>Import this file&nbsp;back into RSLogix (Tools -&gt; Import -&gt; Tags and Logic Comments)</strong>, being&nbsp;sure to <strong>select &#8220;Overwrite Existing Tags&#8221;</strong> so that the comments get added.&nbsp;</p>



<p class="wp-block-paragraph">Next, we need to<strong> make some ladder code to copy each of the alarms from the UDT to our Alarm DINT</strong>.</p>



<p class="wp-block-paragraph">We can again do this very quickly using Microsoft Excel and RSLogix&#8217;s text-based ladder editing. The command <strong>XIC Motor1.Error.bFeedbackStillActive OTE Alarm[0].0</strong>&nbsp;will set <strong>Alarm[0].0</strong>&nbsp;to match the value of <strong>XIC Motor1.Error.bFeedbackStillActive</strong>.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Excel-2.png" alt="Generate alarm code in excel"/></figure>



<p class="wp-block-paragraph"><strong>Highlight all of the &#8220;code&#8221;&nbsp;cells and copy them</strong>. Back in RSLogix,<strong> double click on a blank rung number</strong> (&#8220;0&#8221; highlighted below) and <strong>paste</strong>, creating the mapping between the UDT and the Alarms DINT.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/alarms-small-2.png" alt="Alarm linking routine"/></figure>



<h2 class="wp-block-heading" id="h-importing-into-factorytalk">Importing into FactoryTalk</h2>



<p class="wp-block-paragraph">Now that the alarm bits are written to, all that is left is to <strong>generate the XML file to import into FactoryTalk</strong>. Using the tag CSV file created above, we can load it into&nbsp;the Alarm Generation tool, and it&#8217;ll do&nbsp;the rest of the work for us.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/completed-import-2.png" alt="Alarm generation tool xml conversion"/></figure>



<p class="wp-block-paragraph">If we import the generated XML file into FactoryTalk, we&#8217;ll see that the alarm triggers and messages are all set up and ready to use! Now whenever the alarm bits trigger in the PLC code, the operators will be notified on the HMI so they can fix the problem.&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarms-in-factorytalk-2.png" alt="Alarms imported into factorytalk"/></figure>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">This alarm generation tool is just one of the many internal tools we use at DMC to make our programming accurate, fast, and flexible. If you need help with alarm generation or any other Allen-Bradley expertise, DMC is happy to help!</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="https://static.dmcinfo.com/latest-thinking/blog/articletype/categoryview/categoryid/58/allen-bradley-plc">Allen-Bradley</a> or <a href="https://static.dmcinfo.com/services/application-development/desktop-application-development/c-net/">.NET Development</a> services. </strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/22261/easy-alarm-generation-in-rslogix-and-factorytalk-view-studio-me/">Easy Alarm Generation in RSLogix and FactoryTalk View Studio ME</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FactoryTalk View: Parameter Linking Bug Fix</title>
		<link>https://static.dmcinfo.com/blog/23607/factorytalk-view-parameter-linking-bug-fix/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Mon, 18 Dec 2017 15:08:19 +0000</pubDate>
				<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/23607/factorytalk-view-parameter-linking-bug-fix/</guid>

					<description><![CDATA[<p>Global Objects are a great way to cut down on development time, modularize, and add repeatability to your FactoryTalk HMI project. We previously explored this topic in our blog, Rockwell FactoryTalk Studio Basics: Global Objects and Tag Substitution.  This tutorial will first walk new and experienced users alike through how to create a Global Object and [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/23607/factorytalk-view-parameter-linking-bug-fix/">FactoryTalk View: Parameter Linking Bug Fix</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Global Objects are a great way to cut down on <strong>development time</strong>, <strong>modularize</strong>, and <strong>add repeatability </strong>to your FactoryTalk HMI project. We previously explored this topic in our blog, <a href="https://static.dmcinfo.com/blog/25413/rockwell-factorytalk-studio-basics-global-objects-and-tag-substitution/">Rockwell FactoryTalk Studio Basics: Global Objects and Tag Substitution</a>. </p>



<p class="wp-block-paragraph">This tutorial will first walk new and experienced users alike through how to create a Global Object and utilize many of the advanced features Rockwell Automation&#8217;s FactoryTalk offers. It will also demonstrate how to resolve potential circular reference problems that may arise when attempting to pass screen parameters in global object parameters.&nbsp;</p>



<h2 class="wp-block-heading" id="h-initial-setup">Initial Setup</h2>



<p class="wp-block-paragraph">Start by creating a Global Object<strong> </strong>and adding an instance of it to a Display. One way to assign Global Object Parameter Values is by linking Parameters from a Parameter File. By using the /P option of the Display command, a Parameter File can be passed to a display as a way to associate the tags used at runtime for a particular graphic.</p>



<p class="wp-block-paragraph">In the example shown, <strong>Test_GlobalObject&nbsp;</strong>would be displayed on the release of the button while passing all of the parameters defined in the Parameter List <strong>VisibilityValues&nbsp;</strong>to the screen.</p>



<p class="wp-block-paragraph">For more information on using Parameter Files in your HMI application, see Chapter 25 of the <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/um/viewme-um004_-en-e.pdf">FactoryTalk View Machine Edition User&#8217;s Guide</a> or Chapter 16 of the <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/um/viewse-um006_-en-e.pdf">FactoryTalk View Site Edition User&#8217;s Guide</a>.</p>



<p class="wp-block-paragraph"><br>
<em>Passing a parameter file &#8220;VisibilityValues&#8221; to the display &#8220;Test_GlobalObject&#8221;</em></p>



<p class="wp-block-paragraph">Now, instead of linking specific tags to the Global Object parameters, you can link elements from the loaded Parameter File to the Global Object parameters. This offers you another layer of modularity in your program. By dynamically loading Parameter Files to your displays, you can easily change the data sets from which your Global Objects pull information.</p>



<h2 class="wp-block-heading" id="h-parameter-linking-bug-workaround">Parameter Linking Bug Workaround</h2>



<p class="wp-block-paragraph">In the rest of this tutorial, I will walk you through a bug related to linking Parameters from a Parameter File to Global Objects and the workaround DMC uses to circumvent this issue.</p>



<p class="wp-block-paragraph">The simple Global Object I created to illustrate the bug and workaround, <strong>fp_SixParameters</strong>, has six defined boolean <strong>Global Object Parameters </strong>where #1 determines if the text <strong>Parameter #1</strong>&nbsp;is visible, #2 determines if the text <strong>Parameter #2</strong>&nbsp;is visible, and so on.</p>



<p class="wp-block-paragraph">The Parameter File <strong>VisibilityValues</strong>&nbsp;contains parameters #101-#106 which will be linked to parameters #1-#6 of an instance of <strong>fp_SixParameters </strong>on the display <strong>Test_GlobalObject</strong>.</p>



<p class="wp-block-paragraph"><br>
<em>Visibility event on &#8220;Parameter #1&#8221; linked to the Global Object Parameter #1</em></p>



<h2 class="wp-block-heading" id="h-problem-description">Problem Description</h2>



<p class="wp-block-paragraph">There is an instance of <strong>fp_SixParameters </strong>on the screen <strong>Test_GlobalObject </strong>which you would like to link to parameters #101 &#8211; #106 of <strong>VisibilityValues</strong>.</p>



<p class="wp-block-paragraph"><br>
<em>Assigning Parameter File tags to Global Object Parameter Values</em></p>



<p class="wp-block-paragraph">Everything looks good… but oh no! When you click <strong>OK</strong>, you get the following error: &#8220;A circular reference is being configured. Please do not use similar numbers [incorresponding] columns. Parameter numbers can range from #1 to #999. For example, reserve #1 to #99 for use in the Global Object Name column and #201 to #299 for use in the Value column.&#8221;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Factory-Talk-global-object-parameter-error.png" alt="Factory Talk Global Object Parameter Error - A circular reference is being configured. Please do not use similar numbers [incorrespoinding] columns. Parameter numbers can range from #1 to #999. For example, reserve #1 to #99 for use in the Global Object Name column and #201 to #299 for use in the Value column."/></figure>



<p class="wp-block-paragraph">You make sure that you didn&#8217;t accidentally create a circular reference between your <strong>Global Object Parameters</strong> and assigned<strong> Parameter File Parameters</strong> (i.e. attempt to assign #1 to #1), but everything looks good. Hmmm…</p>



<p class="wp-block-paragraph">At the time of release, Rockwell published <a href="https://rockwellautomation.custhelp.com/app/answers/detail/a_id/451893">Known Anomalies in FactoryTalk View SE 6.10 (CPR9 SR4)</a>. Under the <strong>Global Objects</strong>&nbsp;section, there is a note saying: &#8220;Circular references can be created when passing screen parameters into global object parameters.&#8221;</p>



<p class="wp-block-paragraph">It appears that <strong>only the first character after the pound symbol is read.</strong></p>



<p class="wp-block-paragraph">In this example, <strong>our first parameter (#1 &#8211;&gt; #101) is resolving to (#1 &#8211;&gt; #1), creating our (non-existent) circular reference.</strong></p>



<p class="wp-block-paragraph">Luckily, DMC has found a workaround so that you can set up your Global Objects without getting the circular reference error when none actually exists!</p>



<h2 class="wp-block-heading" id="h-solution">Solution</h2>



<p class="wp-block-paragraph">In order to assign all of the other parameters, assign a dummy value to the parameter causing the &#8220;circular reference.&#8221;&nbsp;This will allow you to select <strong>Ok</strong>&nbsp;without the error message and ensure the rest of your parameters are assigned correctly.</p>



<p class="wp-block-paragraph"><br>
<em>Assigning a dummy value, &#8220;DummyValue&#8221; to the parameter causing the circular reference error</em></p>



<p class="wp-block-paragraph">Next, right-click on the Global Object and select <strong>Tag Substitution…</strong></p>



<p class="wp-block-paragraph"><br>
<em>R</em><em>ight-click the Global Object and select &#8220;Tag Substitution…&#8221;</em></p>



<p class="wp-block-paragraph">Then, under &#8220;Search for:&#8221;,&nbsp;select the dummy value you created and under &#8220;Replace With:&#8221;, type the parameter file you previously could not assign. For this example, we will search for &#8220;DummyValue&#8221; and replace with &#8220;#101&#8221;.</p>



<p class="wp-block-paragraph"><br>
<em>Us</em><em>ing Tag Substitution to assign correct parameter</em></p>



<p class="wp-block-paragraph">Select <strong>Replace</strong>, confirm the tag substitution completed, then click <strong>OK</strong>.</p>



<p class="wp-block-paragraph"><br>
<em>R</em><em>esult of successful Tag Substitution</em></p>



<p class="wp-block-paragraph">Congratulations, your parameters are now correctly assigned!</p>



<p class="wp-block-paragraph">If you feel the need to check the parameter assignments, open the Global Object Parameter Values assigned to the object. <strong>But beware!</strong> The only way you will be able to close out is by pressing <strong>Cancel</strong>. If you try to press <strong>OK</strong>, you will get the same circular reference error as you did earlier.</p>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">By using Parameter Files with Global Objects, you can create incredibly flexible HMI programs that are easy to develop. DMC relies on this strategy and other similar programming best practices to help us <a href="https://static.dmcinfo.com/about/core-values">Respond To The Customer</a> and to <a href="https://static.dmcinfo.com/about/core-values">Make Things Happen</a>.</p>



<p class="wp-block-paragraph">Check out our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/rockwell-factorytalk">Rockwell FactoryTalk</a> and <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming">HMI and SCADA Systems Programming</a> pages to learn more about what DMC&#8217;s services and HMI solutions for control systems. Explore our blog posts and case studies for more specific tips, tricks, and examples.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/23607/factorytalk-view-parameter-linking-bug-fix/">FactoryTalk View: Parameter Linking Bug Fix</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Siemens Decentralized Motion Control with SINA_POS</title>
		<link>https://static.dmcinfo.com/blog/25328/siemens-decentralized-motion-control-with-sina-pos/</link>
		
		<dc:creator><![CDATA[Otto Gottlieb]]></dc:creator>
		<pubDate>Fri, 05 Aug 2016 16:58:25 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[Oil and Gas]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/25328/siemens-decentralized-motion-control-with-sina_pos/</guid>

					<description><![CDATA[<p>In a previous blog I discussed programming motion control with a S7-1500 with Technology Objects in TIA Portal. This is a very popular method of doing the motion control on the PLC. We can&#160;also offload&#160;the motion control to the drive control unit&#160;using Siemens’ library motion blocks such as SINA_POS and allow the PLC to control [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/25328/siemens-decentralized-motion-control-with-sina-pos/">Siemens Decentralized Motion Control with SINA_POS</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In a previous blog I discussed programming motion control with a <a href="https://static.dmcinfo.com/latest-thinking/blog/id/8969/motion-control-solutions-with-technology-objects-in-siemens-tia-portal" rel="no follow" target="_blank">S7-1500 with Technology Objects in TIA Portal</a>. This is a very popular method of doing the motion control on the PLC.</p>



<p class="wp-block-paragraph">We can&nbsp;also offload&nbsp;the motion control to the drive control unit&nbsp;using Siemens’ library motion blocks such as SINA_POS and allow the PLC to control more drives. The Siemens library motion blocks are also available for S7-300 PLCs, which do not support the same Technology Objects as S7-1500 PLCs.</p>



<h2 class="wp-block-heading">How to Do Motion Control with SINA_POS</h2>



<ol class="wp-block-list">
<li>Add the DO Servo Module to the control unit.
 
 
<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Sinamics-S120-CU Configuration" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/01-DO-Servo-Module-Resized_1.png"></p></p>
</li>



<li>Add Telegram 111.&nbsp;
 
 
<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Siemens telegram 111" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/02-Telegram-111-Resized.png"></p></p>
</li>



<li>For a 1200 or 1500 CPU note the HW identifier in the System Constants when Telegram 111 is selected. For a 300 or 400 CPU note the I address and Q address.
 

 

 

 
 
<p class="wp-block-paragraph">1200/1500</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="S7-1200/1500 HW Identifier" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/03-Telegram-111-HW-Identifier-Resized.png"></p></p>



<p class="wp-block-paragraph">300/400</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="S7-300/400 HW Identifier" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/04-Telegram-111-IQ-Address.png"></p></p>
</li>



<li>In the Global Libraries find the EPOS function blocks.
 
 
<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Siemens EPOS Library Blocks" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/05-Library-Blocks-Resized.png"></p></p>
</li>



<li>Pull the desired motion block into your code. In this case, we created fbPositionAxis and we pulled in SINA_POS. We made SINA_POS a Multiple instance block so that it will be static memory in fbPositionAxis.
 
 
<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="SINA_POS Function Block Default" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/06-SINA_POS-start-in-fbPositionAxis-Resized.png"></p></p>
</li>



<li>I added a few inputs to the fbPositionAxis function block to simplify the Axis control. I chose to include basic jogging, absolute moves, setting a zero home position, and interrupting a move with the fast stop.
 
 
<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="SINA_POS Wrapper Function Block" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/fbPositionAxis-Finished-Resized.png"></p></p>
</li>



<li>Based on the inputs to fbPositionAxis I set the ModePos input of SINA_POS. You can see how I use the other inputs and the axis status to control the axis.
 
 
<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="SINA_POS Function Block Finalized" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/SINA_POS-Finished-Resized_1.png"></p></p>
</li>
</ol>



<p class="wp-block-paragraph"><strong>A few important points:</strong></p>



<ul class="wp-block-list">
<li>The Velocity input of SINA_POS affects the absolute position move, but it does not change the speeds of Jog1 or Jog2. Those parameters must be changed in the STARTER/SCOUT configuration or by using the SINA_PARA or SINA_PARA_S function blocks.</li>



<li>My example above only uses 3 of the 8 SINA_POS operating modes, so there are functions that this example does not demonstrate.</li>



<li>SINA_POS&nbsp;uses Telegram 111 whereas SINA_SPEED uses&nbsp;Telegram 1.</li>
</ul>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/plc-programming/siemens-s7-plc-programming"><strong>Learn more about DMC&#8217;s Siemens PLC programming services.&nbsp;</strong></a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/25328/siemens-decentralized-motion-control-with-sina-pos/">Siemens Decentralized Motion Control with SINA_POS</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Rockwell FactoryTalk Studio Basics: Global Objects and Tag Substitution</title>
		<link>https://static.dmcinfo.com/blog/25413/rockwell-factorytalk-studio-basics-global-objects-and-tag-substitution/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 26 Jul 2016 14:13:46 +0000</pubDate>
				<category><![CDATA[Allen Bradley PLC]]></category>
		<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[FactoryTalk]]></category>
		<category><![CDATA[PLC Programming]]></category>
		<category><![CDATA[Rockwell]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/25413/rockwell-factorytalk-studio-basics-global-objects-and-tag-substitution/</guid>

					<description><![CDATA[<p>Global Objects in Rockwell Automation / Allen-Bradley&#8217;s FactoryTalk HMI development environment are useful to bring modularization and efficient repeatability of common elements in your project. This basic feature has been around for a long time, but knowing how to use Global Objects effectively can greatly reduce your development time, chance of errors, and number of [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/25413/rockwell-factorytalk-studio-basics-global-objects-and-tag-substitution/">Rockwell FactoryTalk Studio Basics: Global Objects and Tag Substitution</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Global Objects in Rockwell Automation / Allen-Bradley&#8217;s <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/rockwell-factorytalk">FactoryTalk HMI development environment</a> are useful to bring modularization and efficient repeatability of common elements in your project. This basic feature has been around for a long time, but knowing how to use Global Objects effectively can greatly reduce your development time, chance of errors, and number of displays to license at runtime.&nbsp;</p>



<p class="wp-block-paragraph">In this tutorial, I will show you how to set up a simple control valve as a Global Object which links to a pop-up faceplate using Tag Substitution. The final result will allow us to input just three parameters to generate a new valve on the HMI. I will be showing the development for FactoryTalk View Site Edition (SE), but also applies to Machine Edition (ME).</p>



<p class="wp-block-paragraph">Global Objects use a special type of display which allows you to link back to the parent when used in a &#8216;normal&#8217; display screen. They are more powerful than a simple template for a group of objects; any formatting or animation changes made to the Global Object propagate to all its instances in the project. Another advantage of Global Objects is that they are particularly suited for coordination in the PLC through User-Defined Data Types (UDTs) and Add-On Instructions (AOIs), which allow for consistent tag structure and modular logic.<br>
&nbsp;</p>



<h2 class="wp-block-heading" id="h-basic-setup">Basic Setup</h2>



<p class="wp-block-paragraph">First off, I have developed a simple PLC program which utilizes the UDT &#8216;udtValve&#8217; to track what is going on with our valve called &#8216;HMI_CYL&#8217;. The members of the UDT will be used on the HMI to display status animations for the valve. There is also an AOI on the PLC side which handles the logic and makes it easy for me to instantiate new valves into my PLC project.&nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-utdvalve" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/PLC_udt_1.png"><br>
<em>User defined data type &#8216;udtValve&#8217;.</em>&nbsp;</p>



<p class="wp-block-paragraph">Now that the PLC side is set, let&#8217;s move over to the HMI project. Go to &#8216;Graphics&#8217; -&gt; &#8216;Global Objects&#8217; -&gt; [Right Click] &#8216;New&#8217; to create a new global object display in FactoryTalk Studio. I&#8217;ve drawn an object group for the valve and set up color animation for the valve to show green when open, gray when closed, and red when faulted. In my PLC code, the &#8216;.Status&#8217; member of udtValve outputs a number for each of these states.<br>
&nbsp;<br>
This is where global objects are extremely helpful &#8212; we do not want to copy/paste into each animation if we need to create many valves in a project! We can insert a <strong>placeholder parameter</strong> instead of a direct PLC tag in the animation so that we can make the global object generic. Use &#8216;#1&#8217; then &#8216;.(name of UDT&nbsp;<br>
member)&#8217; to access a specific tag member of the UDT. We could create other tag placeholders that are different UDTs or just normal tags by referencing &#8216;#2&#8217;, &#8216;#3&#8217;, etc., up to &#8216;#500&#8217;. &nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk--global-object-animation" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Animation_with_GlobalObject.png"><br>
<em>Global Object Animation</em></p>



<p class="wp-block-paragraph">Next, we need to set up a definition for the parameter we just referenced. Right-click on the object (make sure all of the drawing objects are grouped together) and navigate to &#8216;Global Object Parameter Definitions&#8217;. For each placeholder you reference, you must list here with the # and number.&nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-global-object-parameter-definition" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/GlobalObject_BasicParameters.png"><br>
<em>Global object parameter definition</em></p>



<p class="wp-block-paragraph">Now we are ready to create an instance of the global object into our desired runtime screen. Simply copy/paste the global object group, then right click -&gt; &#8216;Global Object Parameter Values&#8217;. This is where we link the PLC instance name of the particular valve we want to reference to those placeholders we put in the animation. The result will concatenate to get the whole tag &#8216;[PLC]HMI_CYL.Status&#8217; in runtime.</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-global-object-parameter-values" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/GlobalObject_LinkingParameters.png"><br>
<em>Global object parameter values</em></p>



<h2 class="wp-block-heading" id="h-beyond-the-basics">Beyond the Basics</h2>



<p class="wp-block-paragraph">Alright, we&#8217;ve created a simple global object! We have a valve that changes color based on the feedback from the PLC logic. There&#8217;s a few other things we can do to give the users of our HMI application more information and control of the valve. I&#8217;m going to add a pop-up that displays when we click on the valve and a placeholder to show the name of each valve instance. &nbsp;<br>
&nbsp;<br>
Let&#8217;s start with the valve name placeholder. Add a text box to the valve global object. In its text properties, click &#8216;Insert Variable&#8217; -&gt; &#8216;String..&#8217; &nbsp;then choose &#8216;Literal string&#8217; and input &#8216;#2&#8217; to create a new placeholder. The code generated should look something like this (depending on the options you choose in the dialogue box):&nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-tag-substitution" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/String_placeholder.png"><br>
<em>Tag substitution using literal string &nbsp;</em></p>



<p class="wp-block-paragraph">Edit the global object parameter definitions again to account for the &#8216;#2&#8217; placeholder we just added. Drag a new instance of the global object to your display screen and open its parameter values. Because we chose &#8216;Literal string&#8217;, we can now input normal text to display with our global object, instead of linking to a PLC tag. If you do want it to link to a string tag in the PLC, then choose &#8216;Tag&#8217; when you Insert Variable into the text box setup. &nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/LinkingStringPlaceholder.png"><br>
<em>Global object parameter values using string for tag name</em></p>



<p class="wp-block-paragraph">Finally, we are going to create a pop-up which displays when you click on the valve. For this we will use a normal display instead of a global object display, but will reference it from our global object. Our pop-up will also use tag substitution &#8212; it doesn&#8217;t just apply to global objects!<br>
&nbsp;<br>
I&#8217;ve created a display called &#8216;CV_Faceplate&#8217; which shows additional valve statuses and has buttons which can be used to open and close the valve if it is in manual mode. Each of the tags use a &#8216;#1&#8217; placeholder with ‘.(Name of UDT member)’ just like the global object. I&#8217;ve also added the &#8216;#2&#8217; placeholder for the valve name and additionally I&#8217;ve added a &#8216;#3&#8217; literal string placeholder for a valve description. &nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-control-valve-faceplate" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/TagSubstitutionFaceplate.png"><em>Control valve faceplate / pop-up using tag substitution&nbsp;&nbsp;</em></p>



<p class="wp-block-paragraph">Now we are going to go back to the global object. I want the pop-up I created to display when the valve is clicked on, so I will add a Touch animation, which uses the display command, and /T to invoke tag substitution. Add &#8216;#3&#8217; to the global object parameter definitions. Take note that #3 is not used in the global object itself, it is passed to the pop-up display only!</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-display-faceplate" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/TouchAnimation_FaceplateDisplay.png"><em>Display faceplate/pop-up from global object</em></p>



<p class="wp-block-paragraph">Important Note: Because we are using the global object to tag substitute to the pop-up display, we are also putting #1, #2, and #3 in the display command which are linked to our global object parameter values. We could also put direct tag references in the display command which correspond to each of tag placeholders in the pop-up display if we wanted to call the pop-up outside of a global object. In that case, our Touch animation would look like: &#8216;Display CV_Faceplate /T {[PLC]Another_Valve} {CV-150} {‘CV-150 Description’} /cc&#8217;.&nbsp;<br>
&nbsp;<br>
We&#8217;ve created a valve which displays a status pop-up without having to change any background code to create a new instance. To create new valves, all we need to do is copy the global object and fill in its three input parameters! Here are a few views in runtime:</p>



<p class="wp-block-paragraph"><img decoding="async" alt="factory-talk-animated-control-valve" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Example1_1.png"><br>
<em>Animated control valve global object and faceplate / pop-up example 1</em></p>



<p class="wp-block-paragraph"><img decoding="async" alt="favtory-talk-animated-control-valve" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Example2.png"><br>
<em>Animated control valve global object and faceplate / pop-up example 2</em></p>



<p class="wp-block-paragraph"><img decoding="async" alt="animated-control-valve-rockwell" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Example3.png"><br>
<em>Animated control valve global object and faceplate / pop-up example 3</em></p>



<h2 class="wp-block-heading" id="h-tips">Tips</h2>



<ul class="wp-block-list">
<li>To test your global object, make sure you generate an actual client for runtime. Switching your screen to &#8216;Test Display&#8217; may make it look like your global object is not working correctly.</li>



<li>You can create multiple global objects in one global object display screen. Each group of objects can have separate parameter definitions and be dragged into displays individually.</li>



<li>If you want to modify an instance of a global object separately from the parent, you can &#8216;Break Link&#8217; by right-clicking on the instance in the display. It is also useful if you do want to use a global object as a graphic template, or you don&#8217;t want changes to the global object to propagate to the children.&nbsp;</li>
</ul>



<p class="wp-block-paragraph">Tools which create modular, reusable code like Global Objects, Tag Substitution, User-Defined Data Types (UDT), and Add-On-Instructions (AOI) greatly reduce your development time and makes your implementation much easier to get up and running. DMC focuses on these strategies for both PLC and HMI/SCADA in order to deliver efficient, high-performance applications to our customers across many development platforms. See this blog, <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9136/linking-plc-udt-tags-to-hmi-faceplates-and-pop-ups-in-tia-portal-v13-sp1">Linking PLC UDT Tags to HMI Faceplates and Pop-ups in TIA Portal V13 SP1</a>, for similar tips in the Siemens platform. </p>



<p class="wp-block-paragraph"><a href="/contact">Contact</a> DMC for assistance on your next PLC project.</p>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming"><strong>Learn more about DMC&#8217;s HMI and SCADA programming solutions.</strong></a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/25413/rockwell-factorytalk-studio-basics-global-objects-and-tag-substitution/">Rockwell FactoryTalk Studio Basics: Global Objects and Tag Substitution</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
