<?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>John Williams, Author at DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/author/johnw/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Wed, 02 Sep 2026 20:45: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>John Williams, Author at DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DMC Presents at ICC – Scaling Smart: Architecting for Industrial Growth</title>
		<link>https://static.dmcinfo.com/blog/38876/dmc-presents-at-icc-scaling-smart-architecting-for-industrial-growth/</link>
		
		<dc:creator><![CDATA[John Williams]]></dc:creator>
		<pubDate>Wed, 08 Oct 2025 14:13:15 +0000</pubDate>
				<category><![CDATA[Ignition]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=38876</guid>

					<description><![CDATA[<p>DMC sent five engineers to the Inductive Community Conference (ICC) on September 16–18 in Sacramento, CA. It was a great opportunity to catch up on the latest technology trends, real-world use cases, partner demos, and product roadmaps in the Ignition ecosystem. While there, I co-presented with an engineer from one of our clients, Sila Nanotechnologies, [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/38876/dmc-presents-at-icc-scaling-smart-architecting-for-industrial-growth/">DMC Presents at ICC – Scaling Smart: Architecting for Industrial Growth</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DMC sent five engineers to the <a href="https://icc.inductiveautomation.com/">Inductive Community Conference (ICC)</a> on September 16–18 in Sacramento, CA. It was a great opportunity to catch up on the latest technology trends, real-world use cases, partner demos, and product roadmaps in the Ignition ecosystem. While there, I co-presented with an engineer from one of our clients, <a href="https://www.silanano.com/">Sila Nanotechnologies</a>, on a challenge many manufacturers face: how to scale without chaos. The session was a chance to share lessons learned not only from our work with Sila, but also from DMC’s broader experience helping customers grow their operations. Below is a summary of some of the key points from our presentation.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full has-custom-border"><img fetchpriority="high" decoding="async" width="819" height="1024" data-id="39080" src="https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-presenters.jpg" alt="ICC 2025 presentation" class="wp-image-39080" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-presenters.jpg 819w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-presenters-240x300.jpg 240w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-presenters-768x960.jpg 768w" sizes="(max-width: 819px) 100vw, 819px" /></figure>



<figure class="wp-block-image size-large has-custom-border"><img decoding="async" width="819" height="1024" data-id="38884" src="https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-819x1024.jpeg" alt="dmc at icc event" class="wp-image-38884" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-819x1024.jpeg 819w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-240x300.jpeg 240w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-768x960.jpeg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-1229x1536.jpeg 1229w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc-1638x2048.jpeg 1638w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-at-icc.jpeg 2048w" sizes="(max-width: 819px) 100vw, 819px" /></figure>



<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="819" height="1024" data-id="39082" src="https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-icc-presenter-2025.jpg" alt="ICC 2025" class="wp-image-39082" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-icc-presenter-2025.jpg 819w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-icc-presenter-2025-240x300.jpg 240w, https://static.dmcinfo.com/wp-content/uploads/2025/10/dmc-icc-presenter-2025-768x960.jpg 768w" sizes="(max-width: 819px) 100vw, 819px" /></figure>
</figure>



<h2 id="h-common-program-level-scaling-problems-and-solutions" class="wp-block-heading">Common Program Level Scaling Problems and Solutions</h2>



<p class="wp-block-paragraph">From an integrator’s perspective, the challenges companies face when scaling their operations tend to repeat:</p>



<ul class="wp-block-list">
<li><strong>Lack of investment early:</strong> Doing the bare minimum to get running might work for a pilot, but it creates real pain when scaling to full production.</li>



<li><strong>Lack of internal resources: </strong>Controls engineers are commonly stretched thin fighting fires, leaving little bandwidth for big-picture design.</li>



<li><strong>More voices, more complexity:</strong> Larger operations mean more voices in the room. Customers end up working with EPCs, OEMs, integrators, and other 3rd party contractors — the larger the scope, the harder it is to stay aligned.</li>



<li><strong>Limited vendor visibility:</strong> Even with strong internal controls standards, if you don’t have visibility into how OEMs are completing their projects, new machines can drop onto your plant floor that your internal team won’t be able to support.</li>



<li><strong>Geographic spread: </strong>New plants in different time zones introduce communication and localization challenges.</li>
</ul>



<p class="wp-block-paragraph">These problems are real — but they’re also solvable. We highlighted a few key strategies that help companies overcome these challenges and scale more effectively:</p>



<ul class="wp-block-list">
<li><strong>Dedicated internal teams:</strong> Separating plant support from new plant development frees resources to focus on architecture-level design.</li>



<li><strong>Up-front expectation setting.</strong> Clear communication of controls standards and architectures early on ensures alignment across internal teams, integrators, and OEMs.</li>



<li><strong>Supplemental external resources: </strong>Partners like DMC can provide local support and scale up quickly, freeing internal engineers to focus on the higher-level problems only they can solve.</li>
</ul>



<p class="wp-block-paragraph">Companies that invest in these approaches early tend to scale smarter, faster, and with fewer surprises.</p>



<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="1007" height="571" src="https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-common-scaling-problems.png" alt="Common Scaling Problems" class="wp-image-38877" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-common-scaling-problems.png 1007w, https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-common-scaling-problems-300x170.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-common-scaling-problems-768x435.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></figure>



<h3 id="h-the-technical-backbone-mqtt-udts-structured-data" class="wp-block-heading">The Technical Backbone: MQTT + UDTs + Structured Data</h3>



<p class="wp-block-paragraph">While program-level issues matter, technical architecture is equally critical. Our presentation walked through how MQTT and standardized UDTs can form a flexible, resilient backbone:</p>



<ol start="1" class="wp-block-list">
<li><strong>Standardized UDTs: </strong>Define tags in a consistent hierarchy and structure so that all systems “speak the same language.”</li>



<li><strong>MQTT as transport:</strong> Instead of point-to-point gateway connections, devices publish once to a central MQTT broker. Consumers subscribe as needed, making onboarding fast and keeping systems resilient.</li>



<li><strong>Structured data backbone: </strong>Together, UDTs and MQTT enable a model where:
<ul class="wp-block-list">
<li>Data is published once, consumed many times.</li>



<li>Access is democratized — different systems, from cloud data lakes to custom trending software, are able to access the same data without friction.</li>



<li>Context is understood by all parties, because it is consistent across the site.</li>



<li>Data is real-time<strong>.</strong> Key parameters are live, not batched, enabling faster decisions.</li>
</ul>
</li>
</ol>



<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="1007" height="565" src="https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-key-technical-problems.png" alt="Key Technical Problems" class="wp-image-38878" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-key-technical-problems.png 1007w, https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-key-technical-problems-300x168.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/09/dmc-and-sila-icc-presentation-key-technical-problems-768x431.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></figure>



<h3 id="h-consistent-user-experience" class="wp-block-heading">Consistent User Experience</h3>



<p class="wp-block-paragraph">We also emphasized user experience as a critical piece of scale. With Ignition Edge and central Gateway deployment pipelines, companies can:</p>



<ul class="wp-block-list">
<li>Deploy shared screen libraries via global projects to ensure a consistent look and feel across OEM and internally developed tools.</li>



<li>Use session properties so the same screens adapt whether running locally or remotely.</li>



<li>Utilize Enterprise Administration Module to push entire projects to the edge to ensure consistency from control room to edge HMI</li>
</ul>



<p class="wp-block-paragraph">Operators and engineers benefit from a common interface across systems, which reduces training time and builds trust in the system.</p>



<h2 id="h-why-this-matters" class="wp-block-heading">Why This Matters</h2>



<p class="wp-block-paragraph">At DMC, one of our values is <strong>“Make Things Happen.”</strong> That means helping clients not only solve today’s challenges, but also laying the foundation for sustainable growth.</p>



<p class="wp-block-paragraph">The strategies and architectures we presented at ICC — tackling scaling problems head-on, leveraging standardized UDTs, using MQTT as a flexible backbone, and delivering a consistent user experience — show that scaling doesn’t have to be chaotic.</p>



<p class="wp-block-paragraph">When done right, scaling becomes predictable, consistent, and repeatable. The foundation built here supports not just this scale-out, but future expansions for years to come.</p>



<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">Learn more about DMC&#8217;s MQTT expertise. Visit DMC at ICC.</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">Looking to scale with <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/ignition-programming/" data-type="page" data-id="509">Ignition</a>? Partner with DMC&#8217;s <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" id="420">Automation experts</a> to create resilient architectures, standardized data models, and consistent user experiences.</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/38876/dmc-presents-at-icc-scaling-smart-architecting-for-industrial-growth/">DMC Presents at ICC – Scaling Smart: Architecting for Industrial Growth</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Alarm Acknowledgment in WinCC Comfort and Advanced</title>
		<link>https://static.dmcinfo.com/blog/21200/alarm-acknowledgment-in-wincc-comfort-and-advanced/</link>
		
		<dc:creator><![CDATA[John Williams]]></dc:creator>
		<pubDate>Wed, 24 Jul 2019 07:46:30 +0000</pubDate>
				<category><![CDATA[HMI and SCADA]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Alarm Acknowledgement]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[WinCC]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/21200/alarm-acknowledgment-in-wincc-comfort-and-advanced/</guid>

					<description><![CDATA[<p>In this blog, I will walk through the&#160;built-in options for alarm acknowledgment in WinCC Comfort and Advanced and give example situations in which you might choose different ones. Creating an Alarm The first thing we need to do is create an alarm in WinCC. This is done through the &#8220;HMI Alarms&#8221; editor in TIA Portal. [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/21200/alarm-acknowledgment-in-wincc-comfort-and-advanced/">Alarm Acknowledgment in WinCC Comfort and Advanced</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 will walk through the&nbsp;built-in options for alarm acknowledgment in WinCC Comfort and Advanced and give example situations in which you might choose different ones.</p>



<h2 class="wp-block-heading" id="h-creating-an-alarm">Creating an Alarm</h2>



<p class="wp-block-paragraph">The first thing we need to do is create an alarm in WinCC. This is done through the <strong>&#8220;HMI Alarms&#8221;</strong> editor in TIA Portal. WinCC accesses all alarms by specifying a bit address in an HMI tag. This means you can group alarms in a couple of ways:</p>



<p class="wp-block-paragraph">1. Add all alarms to an unoptimized data block as Booleans, then create a single HMI tag that is a <strong>word </strong>array with the same length as the block</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="395" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarmed-Cathy-ACK.png" alt="Alarmed Cathy ACK" class="wp-image-21189" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarmed-Cathy-ACK.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarmed-Cathy-ACK-300x132.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarmed-Cathy-ACK-768x337.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph"><em><cite>Data block &#8211; Unoptimized&nbsp;</cite></em></p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="82" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-2.png" alt="Alarm ACK 2" class="wp-image-21190" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-2.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-2-300x27.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-2-768x70.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph"><em><cite>HMI tag &#8211; this is&nbsp;an array of word with the appropriate size</cite></em></p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="104" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-3.png" alt="Alarm ACK 3" class="wp-image-21191" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-3.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-3-300x35.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-ACK-3-768x89.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph"><em><cite>Alarms – this is a link to the correct address of the relevant alarm</cite></em></p>



<p class="wp-block-paragraph">2. Group alarms into other data types, such as <strong>Word</strong>, <strong>DWord</strong>, <strong>Dint</strong>, etc.</p>



<p class="wp-block-paragraph">DMC developed the <a href="https://openplclibrary.com/" target="_blank">Siemens Open Library</a>, which has&nbsp;a function&nbsp;that automatically will combine 16&nbsp;bits into a word</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="660" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-4.png" alt="Alarm 4" class="wp-image-21192" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-4.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-4-300x220.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-4-768x563.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph"><i>Move alarms into the bits of the alarm word</i></p>



<figure class="wp-block-image size-full"><img decoding="async" width="869" height="96" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/WordAlarm_1.png" alt="WordAlarm 1" class="wp-image-21193" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/WordAlarm_1.png 869w, https://static.dmcinfo.com/wp-content/uploads/2025/05/WordAlarm_1-300x33.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/WordAlarm_1-768x85.png 768w" sizes="(max-width: 869px) 100vw, 869px" /></figure>



<p class="wp-block-paragraph"><i>Each alarm corresponds to a bit in the word</i></p>



<p class="wp-block-paragraph">Option one can be effective when you&#8217;re creating alarms for a large number of devices. The <a href="https://openplclibrary.com/" target="_blank">Siemens Open Library</a>&nbsp;includes a windows application that will automatically generate a list of alarms from an unoptimized DB that can be directly imported into the alarm editor. This eliminates the hassle of having to create each of the alarms individually.&nbsp;Option two can be useful when you want to group alarms by device or subsystem. Each word can correspond to a specific device, which can be useful for checking device state on the PLC or displaying it on the HMI.</p>



<h2 class="wp-block-heading" id="h-local-acknowledgement-on-hmi">Local Acknowledgement on HMI</h2>



<p class="wp-block-paragraph">If you do no other configuration, the default acknowledgment setup is that all information about alarm state/acknowledgment is stored locally on the HMI. There are a few&nbsp;possible states for an alarm:</p>



<ol class="wp-block-list">
<li>Incoming
<ul class="wp-block-list">
<li>An alarm condition is present; no acknowledgement has occurred</li>
</ul>
</li>



<li>Incoming/Acknowledged
<ul class="wp-block-list">
<li>An alarm condition is present; acknowledgment has occurred</li>
</ul>
</li>



<li>Incoming/Outgoing
<ul class="wp-block-list">
<li>Alarm condition was present, then went away before the alarm was acknowledged</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"><strong><u>Alarm display colors</u></strong></p>



<p class="wp-block-paragraph">Using the Alarms group tab of the editor, you can customize colors and display information for each of these acknowledgment states. Important note:&nbsp;you must enable colors in runtime settings or they will not be displayed.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="348" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-5.png" alt="Alarm 5" class="wp-image-21194" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-5.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-5-300x116.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-5-768x297.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph"><strong><u>Alarm Groups</u></strong></p>



<p class="wp-block-paragraph">By default,&nbsp;each alarm must be acknowledged individually. To change this, assign the alarms to groups in the alarm editor. Acknowledging one alarm in the group will acknowledge all the other alarms in that group as well.</p>



<p class="wp-block-paragraph"><strong><u>Acknowledgment Button</u></strong></p>



<p class="wp-block-paragraph">There are two ways to acknowledge alarms. The first is using the button built into the alarm viewer. The other way is by configuring a custom button with the <strong>“AlarmViewAcknoweldgeAlarm” </strong>event.</p>



<h2 class="wp-block-heading" id="h-hmi-acknowledgement-bit-pass-acknowledgment-information-from-hmi-to-plc">HMI Acknowledgement Bit – Pass Acknowledgment Information from HMI to PLC</h2>



<p class="wp-block-paragraph">The HMI acknowledgment word is used to pass the acknowledgment status of an alarm from the HMI to the PLC. It must be a bit in a tag that is different than the alarm’s trigger tag. When acknowledgment of the alarm occurs on the HMI, the bit on the PLC is set to one. It will stay high until the alarm condition goes away, then occurs again. A diagram displays this below:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="348" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-6.png" alt="Alarm 6" class="wp-image-21195" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-6.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-6-300x116.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-6-768x297.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph">This bit is useful if you want to use the acknowledgment status as a pre-requisite for clearing the alarm condition on the PLC.</p>



<p class="wp-block-paragraph"><u><strong>Multiple HMI Considerations</strong></u></p>



<p class="wp-block-paragraph">If multiple HMIs are part of the project, and each has a separate alarm viewer, any of the HMIs can acknowledge the alarm and set the HMI Acknowledgment bit. However, this information is stored locally on each HMI &#8211; the acknowledgement is not passed to the other HMIs. This disparity in information means that if one HMI acknowledges an alarm, it will still display as unacknowledged on a different HMI until this is also acknowledged there.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="517" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7.png" alt="Alarm 7" class="wp-image-21196" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7-300x172.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7-768x441.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<h2 class="wp-block-heading" id="h-plc-acknowledgment-bit-pass-acknowledgement-information-from-plc-to-hmi">PLC Acknowledgment Bit – Pass Acknowledgement Information from PLC to HMI</h2>



<p class="wp-block-paragraph">The PLC acknowledgment bit is used to acknowledge alarms by passing down a bit from the PLC. When you set the bit on the PLC, the acknowledgement status of the associated alarm&nbsp;is updated on the HMI. This is useful as it allows multiple HMIs to keep their alarm acknowledgments in sync. A single PLC tag/bit is used as the PLC acknowledgement bit on all the HMIs, so each of them receives acknowledgements in sync.</p>



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



<p class="wp-block-paragraph">One disadvantage of this approach is that it makes individual alarm acknowledgment, that is the ability to choose which alarm is going to be acknowledged by highlighting it in the alarm viewer, more difficult. When using the built-in acknowledgment in the alarm viewer (as you must with the HMI ack bit), a user can highlight/select a specific alarm to acknowledge.</p>



<p class="wp-block-paragraph">However, there is no way to tell the PLC which alarm is currently highlighted, which prevents individual acknowledgement via PLC. Generally, when using this acknowledgment scheme, we have used a global alarm acknowledge button that automatically acknowledges&nbsp;all available alarms. Alternatively, we&#8217;ve grouped the alarms by system, and had a separate acknowledgement button for each system.</p>



<p class="wp-block-paragraph">Important note: the acknowledgment bit must stay high long enough for the HMI to see it. We will normally pulse it on for a short duration (e.g. 1 second if the HMI tag update rate is 1s). This ensures each of the HMIs has time to see the tag&#8217;s value change.</p>



<p class="wp-block-paragraph">The PLC acknowledgment bit is required to be in the same tag as the actual alarm bit. We have a couple of approaches to get around handle this:</p>



<p class="wp-block-paragraph"><u><strong>Approach 1:&nbsp;Unoptimized db with Structs</strong></u></p>



<p class="wp-block-paragraph">The first way is to create an <strong>unoptimized </strong>DB with all alarm conditions at the top, and an identical structure at the bottom for alarm acknowledgment.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="517" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7.png" alt="Alarm 7" class="wp-image-21196" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7-300x172.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-7-768x441.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph">You can then access this DB as an array of words on the HMI, as discussed above.&nbsp;To configure the acknowledgment, use the bit in the first structure as the alarm bit, and the bit in the second structure as the plc acknowledgment bit. Then, set the plc acknowledgment bit high on the PLC to globally acknowledge the alarm on all HMIs.</p>



<p class="wp-block-paragraph"><u><strong>Approach 2:&nbsp;Alarm Word</strong></u></p>



<p class="wp-block-paragraph">Another approach is to use Words for your alarms and keep them in a normal db. In this case, we generally group alarms by system or device, and use the first half of the word for the alarm conditions and the second half of the word for acknowledgments:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="284" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-10.png" alt="Alarm 10" class="wp-image-21199" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-10.png 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-10-300x95.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Alarm-10-768x242.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



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



<p class="wp-block-paragraph">Overall, WinCC Comfort and Advanced give you several options for alarm acknowledgment. I hope this blog helps you implement it in your project!</p>



<p class="wp-block-paragraph">Learn more about DMC&#8217;s&nbsp;<a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/siemens-simatic-wincc-programming">WinCC Expertise</a>&nbsp;and <a href="https://static.dmcinfo.com/contact">contact us</a> today&nbsp;to get started on your next project.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/21200/alarm-acknowledgment-in-wincc-comfort-and-advanced/">Alarm Acknowledgment in WinCC Comfort and Advanced</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SQL Express Scripting from WinCC Advanced</title>
		<link>https://static.dmcinfo.com/blog/22931/sql-express-scripting-from-wincc-advanced/</link>
		
		<dc:creator><![CDATA[John Williams]]></dc:creator>
		<pubDate>Tue, 03 Jul 2018 11:01:32 +0000</pubDate>
				<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22931/sql-express-scripting-from-wincc-advanced/</guid>

					<description><![CDATA[<p>The ability to access a SQL database in real time from WinCC runtime can be beneficial for manufacturing processes. It can be used to determine what should be run on a line, log parameters of a process, or provide tracking of products in real time. This tutorial will go through some of the steps necessary [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22931/sql-express-scripting-from-wincc-advanced/">SQL Express Scripting from WinCC Advanced</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The ability to access a SQL database in real time from WinCC runtime can be beneficial for manufacturing processes. It can be used to determine what should be run on a line, log parameters of a process, or provide tracking of products in real time. This tutorial will go through some of the steps necessary to access data from an SQL database with WinCC advanced.</p>



<p class="wp-block-paragraph">An important note is that SQL access is not allowed through scripting from a Siemens Comfort Panel.&nbsp;One way to work around this&nbsp;is to have WinCC Advanced runtime running somewhere on your network to handle&nbsp;communication with the database. You can then access the database from&nbsp;WinCC Advanced, pass its values to the PLC, and then access them on the PLC from the comfort panel.</p>



<h2 class="wp-block-heading" id="h-database-settings">Database Settings</h2>



<p class="wp-block-paragraph">I will not go through the entire setup of an SQL database here. However, the user must update several essential settings for access from WinCC.</p>



<h2 class="wp-block-heading" id="h-in-sql-server-management-studio">In SQL Server Management Studio</h2>



<p class="wp-block-paragraph">1. Open SQL Server Management Studio and connect to the server where the database you wish to access from WinCC resides.&nbsp;</p>



<p class="wp-block-paragraph">Right-click that <strong>server </strong>and open its <strong>properties</strong>. In the <strong>Security</strong> tab choose <strong>SQL Server and Windows Authentication Mode</strong>&nbsp;for Server Authentication. This allows access to the server with a username and password instead of a standard windows login.</p>



<p class="wp-block-paragraph"><br>
&nbsp;<br>
2. In the connection explorer, open the <strong>Security</strong>&nbsp;folder and right click <strong>Logins</strong>.&nbsp;Then choose <strong>New Login</strong>.</p>



<p class="wp-block-paragraph">This step adds a user to this server.</p>



<p class="wp-block-paragraph"><br>
&nbsp;<br>
3. <strong>Add </strong>a user, choose <strong>SQL Server Authentication</strong>,&nbsp;and set the default database to the database you wish to access from WinCC.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-3.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-in-sql-server-configuration-manager">In SQL Server Configuration Manager</h2>



<p class="wp-block-paragraph">1. Open <strong>SQL Server Configuration Manager</strong>. If you are having trouble finding it, try browsing to the locations seen on this site. Under <strong>SQL Server Network Configuration</strong>&nbsp;then <strong>Protocols for SQLEXPRESS</strong>,&nbsp;enable <strong>TCP/IP</strong>.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-4.png" alt=""/></figure>



<p class="wp-block-paragraph">2. Under <strong>SQL Server Services,</strong>&nbsp;change the start mode of <strong>SQL Server Browser</strong>&nbsp;to <strong>Automatic </strong>and ensure it’s running.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-5.png" alt=""/></figure>



<p class="wp-block-paragraph">3. Right click on <strong>SQL Server</strong>&nbsp;and <strong>SQL Server Browser</strong>&nbsp;and <strong>restart </strong>them.</p>



<h2 class="wp-block-heading" id="h-in-windows-firewall-with-advanced-features">In Windows Firewall with Advanced Features</h2>



<p class="wp-block-paragraph">1. Open <strong>Windows Firewall with Advanced Features</strong>.&nbsp;Choose <strong>Inbound Rules</strong>&nbsp;from the bar on the left, then <strong>New Rule</strong>…&nbsp;on the right.</p>



<p class="wp-block-paragraph">2. Make the rule with the following features:</p>



<p class="wp-block-paragraph"><p style="margin-left: 40px;"><strong>Rule type: Port<br>
Protocol and Ports: UPD type, port number 1434<br>
Action: Allow the connection<br>
Profile: Choose all<br>
Name: SQLExpressBrowser</strong></p></p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-6.png" alt=""/></figure>



<p class="wp-block-paragraph">3. Add another <strong>incoming rule</strong>. This time choose a <strong>custom type</strong>.</p>



<p class="wp-block-paragraph"><p style="margin-left: 40px;"><strong>Rule Type: Custom</strong><br>
<strong>Program:</strong> Select&nbsp;<strong>Customize</strong>&nbsp;next to services and apply the rule to the service <strong>SQL Server (SQLEXPRESS).</strong></p></p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-7.png" alt=""/></figure>



<p class="wp-block-paragraph"><p style="margin-left: 40px;"><strong>Protocol and Ports: Protocol type Any<br>
Scope: Any IP address local or remote<br>
Action: Allow the connection<br>
Profile: Apply to all<br>
Name: SQL Server Database Engine Service</strong></p></p>



<h2 class="wp-block-heading" id="h-script-setup"><br>
Script Setup</h2>



<p class="wp-block-paragraph">Now that we have the settings for the database nailed down it’s time to get into the fun part, the actual scripting!</p>



<p class="wp-block-paragraph">Below, I will go through the lines of my code and explain what’s happening at each part. In this example, I’m calling a <strong>stored procedure</strong> from the database that takes inputs of integers and strings from the PLC and outputs to an array of UDTs on the PLC.</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">VBScript</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>Sub SQLQuery()
'Keep running script if error occurs
On Error Resume Next

'Declare Variables
Dim i, index, test, row, iType, sFirstInput, iSecondInput, offset
Dim connection, recordset, record, connectionstring, query
Dim continue

continue = True</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 style="color: #569CD6">Sub</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SQLQuery</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #6A9955">&apos;Keep running script if error occurs</span></span>
<span class="line"><span style="color: #569CD6">On Error Resume Next</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">&apos;Declare Variables</span></span>
<span class="line"><span style="color: #569CD6">Dim</span><span style="color: #9CDCFE"> i, index</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> test</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> row</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> iType</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> sFirstInput</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> iSecondInput</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> offset</span></span>
<span class="line"><span style="color: #569CD6">Dim</span><span style="color: #9CDCFE"> connection, recordset</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> record</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> connectionstring</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE"> query</span></span>
<span class="line"><span style="color: #569CD6">Dim</span><span style="color: #9CDCFE"> continue</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> True</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Line 3</strong> ensures that if the script encounters an error, it keeps running. This&nbsp;line allows us to record the error we’re getting and set status tags for the script. Then <strong>declare </strong>all the variables being used and set the <strong>continue&nbsp;variable </strong>to <strong>true</strong>. This variable will do <strong>error handling</strong>.</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">VBScript</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>If Not SmartTags("bCallScript") Then
	Exit Sub
End If</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 style="color: #C586C0">If</span><span style="color: #D4D4D4"> Not </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;bCallScript&quot;</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: #C586C0">End If</span></span></code></pre></div>


<table border="0" cellpadding="1" cellspacing="1" style="width: 500px;">
<tbody>
<tr>
<td><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-10.png"  /></td>
<td><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sql-blog-11.png"  /></td>
</tr>
</tbody>
</table>


<p class="wp-block-paragraph">Now, trigger the script on the <strong>PLC tag bCallScript</strong>. This tag has a continuous cyclic acquisition and calls&nbsp; <strong>ExampleScript</strong>&nbsp;on a value change. <strong>Lines 12-14</strong> ensure that we only run the SQL logic on a positive value change of <strong>bCallScript</strong>.&nbsp;</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">VBScript</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>'Create connection string and database object
connectionstring = "Provider=SQLOLEDB.1;Persist Security Info=True;"&amp;_
					"User ID=ExampleUser;Password=ExamplePassword;"&amp;_
					"Initial Catalog=ExampleDatabase;"&amp;_
                    "Data Source=192.168.0.1\SQLEXPRESS;"
Set connection = CreateObject("ADODB.Connection")
'Open connection to database
connection.Open connectionstring</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 style="color: #6A9955">&apos;Create connection string and database object</span></span>
<span class="line"><span style="color: #9CDCFE">connectionstring</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;Provider=SQLOLEDB.1;Persist Security Info=True;&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #9CDCFE">_</span></span>
<span class="line"><span style="color: #D4D4D4">					</span><span style="color: #CE9178">&quot;User ID=ExampleUser;Password=ExamplePassword;&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #9CDCFE">_</span></span>
<span class="line"><span style="color: #D4D4D4">					</span><span style="color: #CE9178">&quot;Initial Catalog=ExampleDatabase;&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #9CDCFE">_</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #CE9178">&quot;Data Source=192.168.0.1\SQLEXPRESS;&quot;</span></span>
<span class="line"><span style="color: #569CD6">Set </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">CreateObject</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ADODB.Connection&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #6A9955">&apos;Open connection to database</span></span>
<span class="line"><span style="color: #D4D4D4">connection.Open connectionstring</span></span></code></pre></div>



<p class="wp-block-paragraph">Make a connection string for the database using the <strong>password </strong>and <strong>User ID</strong>&nbsp;created earlier. The <strong>data source</strong> is the <strong>IP address</strong> of the computer that hosts the database.</p>



<p class="wp-block-paragraph"><strong>Line 24</strong> creates a database object and <strong>line 27</strong> tries to connect to the database. The connection string will vary based on the type of database you’re using, the username and ID created, and other factors.</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">VBScript</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>If Err.Number &lt;> 0 Then
    SmartTags("ErrorTag") = "Opening Connection: " &amp; Err.Description
    Err.Clear
    connection.close
    Set connection = Nothing
    continue = False
End If</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 style="color: #C586C0">If</span><span style="color: #D4D4D4"> Err.</span><span style="color: #9CDCFE">Number</span><span style="color: #D4D4D4"> &lt;&gt; </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: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ErrorTag&quot;</span><span style="color: #D4D4D4">) = </span><span style="color: #CE9178">&quot;Opening Connection: &quot;</span><span style="color: #D4D4D4"> &amp; Err.Description</span></span>
<span class="line"><span style="color: #D4D4D4">    Err.</span><span style="color: #DCDCAA">Clear</span></span>
<span class="line"><span style="color: #D4D4D4">    connection.close</span></span>
<span class="line"><span style="color: #569CD6">    Set </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> False</span></span>
<span class="line"><span style="color: #C586C0">End If</span></span></code></pre></div>



<p class="wp-block-paragraph">Put in the first error handling block. If an error has occurred trying to connect to the database, write <strong>Opening Connection: actual text of error</strong>&nbsp;to the tag <strong>dbSQL_sError</strong>.</p>



<p class="wp-block-paragraph">Then,&nbsp;close the connection to the database and set the <strong>continue variable </strong>to <strong>false</strong>. This is useful in troubleshooting, as you can check the tag dbSQL_sError to help diagnose connection problems.</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">VBScript</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>If continue = True Then
    'Convert inputs to strings
    sFirstInput = CStr(SmartTags("dbPLC_sFirstInput"))
    iSecondInput = Cstr(SmartTags("dbPLC_iSecondInput"))
    
    'Create query text
    query = "EXECUTE dbo.ExampleStoredProcedure" &amp; sFirstInput &amp; "," &amp; iSecondInput
    
    'Execcute query and create recordset object
    Set recordset = connection.Execute(query)

    'Error routine
    If Err.Number &lt;> 0 Then SmartTags("ErrorTag") = "Database query: " &amp; Err.Description
        Err.Clear
        connection.close
        Set connection = Nothing
        Set recordset = Nothing
        continue = False
    End If
End If</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 style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> True</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;Convert inputs to strings</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sFirstInput</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">CStr</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_sFirstInput&quot;</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">iSecondInput</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">Cstr</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_iSecondInput&quot;</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: #6A9955">&apos;Create query text</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">query</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;EXECUTE dbo.ExampleStoredProcedure&quot;</span><span style="color: #D4D4D4"> &amp;</span><span style="color: #9CDCFE"> sFirstInput</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #CE9178">&quot;,&quot;</span><span style="color: #D4D4D4"> &amp;</span><span style="color: #9CDCFE"> iSecondInput</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos;Execcute query and create recordset object</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">Set </span><span style="color: #9CDCFE">recordset</span><span style="color: #D4D4D4"> = connection.</span><span style="color: #DCDCAA">Execute</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">query</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos;Error routine</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> Err.</span><span style="color: #9CDCFE">Number</span><span style="color: #D4D4D4"> &lt;&gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ErrorTag&quot;</span><span style="color: #D4D4D4">) = </span><span style="color: #CE9178">&quot;Database query: &quot;</span><span style="color: #D4D4D4"> &amp; Err.Description</span></span>
<span class="line"><span style="color: #D4D4D4">        Err.</span><span style="color: #DCDCAA">Clear</span></span>
<span class="line"><span style="color: #D4D4D4">        connection.close</span></span>
<span class="line"><span style="color: #569CD6">        Set </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #569CD6">        Set </span><span style="color: #9CDCFE">recordset</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> False</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #C586C0">End If</span></span></code></pre></div>



<p class="wp-block-paragraph">Now that the database connection is open, run the first query. First, check whether the <strong>continue&nbsp;variable </strong>is <strong>true</strong>. There is no use trying to run this logic if we had an error connecting to the database earlier.</p>



<p class="wp-block-paragraph">For this example, I am running a query that calls a stored procedure in our database <strong>dbo</strong><strong>.ExampleStoredProcedure</strong>.&nbsp;This procedure takes two inputs. The first is a <strong>string,&nbsp;</strong>the second is an <strong>integer </strong>and returns a table of results.</p>



<p class="wp-block-paragraph">I take two PLC tags, convert/ensure they are strings, and combine them with another string to create the SQL query <strong>EXECUTE </strong><strong>dbo</strong><strong>.ExampleStoreProcedure </strong><strong>sFirstInput</strong><strong>, </strong><strong>iSecondInput</strong>&nbsp;that is passed to the database.</p>



<p class="wp-block-paragraph">The&nbsp;query can be any valid SQL query. However, I found that it’s easier to create stored procedures in the database than to write long queries in the VBA editor in TIA Portal. This makes the scripting in portal simpler and easier to troubleshoot.</p>



<p class="wp-block-paragraph">We <strong>store </strong>the result of the query as the variable <strong>recordset</strong>,&nbsp;which is a recordset object.&nbsp; This makes it easy to manipulate the data later.</p>



<p class="wp-block-paragraph">Once again, there is an error routine here that <strong>sets&nbsp;</strong>the continue&nbsp;variable<strong> </strong>to <strong>false</strong>, <strong>records</strong> the error text, and <strong>closes</strong> the database connections in the case of 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">VBScript</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>If continue = True Then
    'Make sure we're at the start of the record
    recordset.MoveFirst
    
    'Determine how many rows to offset
    offset = (SmartTags("dbPLC_iPageNumber")-1)*10

    'Move to desired row
    recordset.Move(offset)

    'Error routine
    If Err.Number &lt;> 0 Then SmartTags("ErrorTag") = "Page offset: " &amp; Err.Description
        Err.Clear
        connection.close
        Set connection = Nothing
        Set recordset = Nothing
        continue = False
    End If
End If</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 style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> True</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;Make sure we&apos;re at the start of the record</span></span>
<span class="line"><span style="color: #D4D4D4">    recordset.MoveFirst</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos;Determine how many rows to offset</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> = (</span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_iPageNumber&quot;</span><span style="color: #D4D4D4">)</span><span style="color: #B5CEA8">-1</span><span style="color: #D4D4D4">)*</span><span style="color: #B5CEA8">10</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos;Move to desired row</span></span>
<span class="line"><span style="color: #D4D4D4">    recordset.</span><span style="color: #DCDCAA">Move</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">&apos;Error routine</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> Err.</span><span style="color: #9CDCFE">Number</span><span style="color: #D4D4D4"> &lt;&gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ErrorTag&quot;</span><span style="color: #D4D4D4">) = </span><span style="color: #CE9178">&quot;Page offset: &quot;</span><span style="color: #D4D4D4"> &amp; Err.Description</span></span>
<span class="line"><span style="color: #D4D4D4">        Err.</span><span style="color: #DCDCAA">Clear</span></span>
<span class="line"><span style="color: #D4D4D4">        connection.close</span></span>
<span class="line"><span style="color: #569CD6">        Set </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #569CD6">        Set </span><span style="color: #9CDCFE">recordset</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> False</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #C586C0">End If</span></span></code></pre></div>



<p class="wp-block-paragraph">In this example, the goal was to display ten&nbsp;rows of the table produced by our stored procedure on an HMI screen.&nbsp;</p>



<p class="wp-block-paragraph">This code is only&nbsp;run if our continue flag is true. The first line does the <strong>MoveFirst</strong> command on the recordset object we created earlier. Think of the recordset object like a big table with one row highlighted. The <strong>MoveFirst</strong> command ensures highlighting of the first row. Then calculate how many rows we need to offset to display entries 1-10 on page 1, 11-20 on page 2, 21-30 on page 3, etc.&nbsp;</p>



<p class="wp-block-paragraph">This <strong>offset </strong>will always be a <strong>0 </strong>or some <strong>multiple of 10</strong>.&nbsp; Use the <strong>recordset.Move(offset) </strong>command next to move our highlighted row down however many rows required. The move command moves <strong>down </strong>the table for <strong>positive </strong>numbers and <strong>up </strong>the table for <strong>negative </strong>numbers.&nbsp;</p>



<p class="wp-block-paragraph">For example, if we move to row 1 using the MoveFirst command, then offset 10 with the move command, we end up highlighting row 11.&nbsp;This would start the second page of entries.</p>



<p class="wp-block-paragraph">There is now an<strong> error routine</strong> again. This&nbsp;command catches errors such as the stored procedure returning an empty table or trying to move to a second page when there are less than ten entries.</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">VBScript</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>If continue = True Then
    For i = 0 to 9
        If Not recordset.EOF Then
            SmartTags("dbPLC_Data{"&amp;CStr(i)&amp;"}.iOutputOne") = CInt(recordset.Fields("OutputOne").Value)
            SmartTags("dbPLC_Data{"&amp;CStr(i)&amp;"}.sOutputTwo") = CInt(recordset.Fields("OutputTwo").Value)
            SmartTags("dbPLC_Data{"&amp;CStr(i)&amp;"}.bExists") = True
        Else
            SmartTags("dbPLC_Data{"&amp;CStr(i)&amp;"}.bExists") = False
        End If

        'Error routine
        If Err.Number &lt;> 0 Then SmartTags("ErrorTag") = "Retrieve Data: " &amp; Err.Description
            Err.Clear
            connection.close
            Set connection = Nothing
            Set recordset = Nothing
            continue = False
        End If
    Next
End If</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 style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> True</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">For</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">to</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">9</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> Not recordset.EOF </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_Data{&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #DCDCAA">CStr</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)&amp;</span><span style="color: #CE9178">&quot;}.iOutputOne&quot;</span><span style="color: #D4D4D4">) = </span><span style="color: #DCDCAA">CInt</span><span style="color: #D4D4D4">(recordset.</span><span style="color: #DCDCAA">Fields</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;OutputOne&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: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_Data{&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #DCDCAA">CStr</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)&amp;</span><span style="color: #CE9178">&quot;}.sOutputTwo&quot;</span><span style="color: #D4D4D4">) = </span><span style="color: #DCDCAA">CInt</span><span style="color: #D4D4D4">(recordset.</span><span style="color: #DCDCAA">Fields</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;OutputTwo&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: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_Data{&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #DCDCAA">CStr</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)&amp;</span><span style="color: #CE9178">&quot;}.bExists&quot;</span><span style="color: #D4D4D4">) =</span><span style="color: #569CD6"> True</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">Else</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_Data{&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #DCDCAA">CStr</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)&amp;</span><span style="color: #CE9178">&quot;}.bExists&quot;</span><span style="color: #D4D4D4">) =</span><span style="color: #569CD6"> False</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;Error routine</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">If</span><span style="color: #D4D4D4"> Err.</span><span style="color: #9CDCFE">Number</span><span style="color: #D4D4D4"> &lt;&gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ErrorTag&quot;</span><span style="color: #D4D4D4">) = </span><span style="color: #CE9178">&quot;Retrieve Data: &quot;</span><span style="color: #D4D4D4"> &amp; Err.Description</span></span>
<span class="line"><span style="color: #D4D4D4">            Err.</span><span style="color: #DCDCAA">Clear</span></span>
<span class="line"><span style="color: #D4D4D4">            connection.close</span></span>
<span class="line"><span style="color: #569CD6">            Set </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #569CD6">            Set </span><span style="color: #9CDCFE">recordset</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> False</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">End If</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">Next</span></span>
<span class="line"><span style="color: #C586C0">End If</span></span></code></pre></div>



<p class="wp-block-paragraph">This block moves data into an array of <strong>UDTs</strong> on the PLC. The <strong>UDT </strong>has <strong>three&nbsp;elements</strong>: <strong>iOutputOne</strong>,<strong> </strong><strong>sOutputTwo</strong>, and <strong>bExists</strong>. The array has <strong>ten&nbsp;elements</strong> and is called <strong>dbSQL_Data</strong>. Loop from 0 to 9 to fill each element of the array.</p>



<p class="wp-block-paragraph">Within the <strong>for loop</strong>, there is an <strong>if statement</strong>&nbsp;that checks <strong>recordset.EOF</strong>. This is a property of the recordset object which tells whether you have moved past the last row of the table. In this case, use it to ensure that we don’t attempt to read data from an empty row.</p>



<p class="wp-block-paragraph">If <strong>recordset.EOF</strong> is <strong>false</strong>, then read data from the recordset object using the&nbsp;<strong>.</strong><strong>Field</strong><strong> </strong>and <strong>.Value </strong>properties. Each field corresponds to the name of a column from the database table returned by the stored procedure. The .Value property returns the value in that column from the row that is currently selected.</p>



<p class="wp-block-paragraph">Wrap the <strong>recordset.Fields</strong><strong>.(</strong><strong>).Value</strong> commands in Cstr and Cint to ensure the correct data types are in the PLC. We write to the <strong>dbSQL_bExists</strong>&nbsp;bit if we are not at the end of the file, as this means we successfully<span style="background-color: rgb(245, 246, 245);"> populated this entry in the array wit</span>h information. This is useful for deciding whether or not to display info on a screen or use it in the PLC.</p>



<p class="wp-block-paragraph">After writing the data to the PLC, use the <strong>.</strong><strong>MoveNext</strong> method to move down one row in the data table.</p>



<p class="wp-block-paragraph">If&nbsp;at the end of the file (<strong>recordset.EOF&nbsp; = true</strong>), do not read any data, and set the <strong>dbSQL_bExists</strong>&nbsp;bit to <strong>false</strong>.</p>



<p class="wp-block-paragraph">Finish with another error routine for this part of the code.</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">VBScript</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>If continue = False Then
    SmartTags("dbPLC_bErrorExists") = True
    For i = 0 to 9
        SmartTags("dbPLC_Data{"&amp;CStr(i)&amp;"}.bExists") = False
    Next
End If

SmartTags("dbPLC_bScriptComplete") = True
SmartTags("dbPLC_bCallSCript") = False

connection.close
connection = Nothing
recordset = Nothing
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 style="color: #C586C0">If</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">continue</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> False</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">Then</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_bErrorExists&quot;</span><span style="color: #D4D4D4">) =</span><span style="color: #569CD6"> True</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">For</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">to</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">9</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_Data{&quot;</span><span style="color: #D4D4D4">&amp;</span><span style="color: #DCDCAA">CStr</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)&amp;</span><span style="color: #CE9178">&quot;}.bExists&quot;</span><span style="color: #D4D4D4">) =</span><span style="color: #569CD6"> False</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">Next</span></span>
<span class="line"><span style="color: #C586C0">End If</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_bScriptComplete&quot;</span><span style="color: #D4D4D4">) =</span><span style="color: #569CD6"> True</span></span>
<span class="line"><span style="color: #DCDCAA">SmartTags</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;dbPLC_bCallSCript&quot;</span><span style="color: #D4D4D4">) =</span><span style="color: #569CD6"> False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">connection.close</span></span>
<span class="line"><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #9CDCFE">recordset</span><span style="color: #D4D4D4"> =</span><span style="color: #569CD6"> Nothing</span></span>
<span class="line"><span style="color: #569CD6">End Sub</span></span></code></pre></div>



<p class="wp-block-paragraph">This is the end of the script. At this point, if the continue flag is false, write to a <strong>dbSQL_ErrorExists</strong>&nbsp;status bit on the PLC. Furthermore, set the “<strong>bSQL_bExists</strong>&nbsp;bit to false for all <strong>Data array </strong>elements&nbsp;to make it clear something went wrong while trying to access the database.</p>



<p class="wp-block-paragraph"><strong>Line 122</strong> sets a PLC tag indicating that the script has completed running to <strong>True</strong>, signaling to the PLC it can continue with other logic. Reset the <strong>dbSQL¬_CallScript</strong> tag here so that the script can be called again.</p>



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



<p class="wp-block-paragraph">This is a relatively simple implementation of SQL access, but it shows some of the key features and methods you need&nbsp;to read data&nbsp;<span style="background-color: rgba(250, 214, 51, 0.25);">successfully</span><span style="background-color: rgba(250, 214, 51, 0.25);">&nbsp;</span>to your PLC. I hope it can be of use to you in future projects.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/hmi-and-scada-programming/siemens-simatic-wincc-programming">WinCC programming expertise</a>.</strong></p>



<p class="wp-block-paragraph">&nbsp;</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22931/sql-express-scripting-from-wincc-advanced/">SQL Express Scripting from WinCC Advanced</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Houston Rockets Basketball Welcome Party</title>
		<link>https://static.dmcinfo.com/blog/23287/houston-rockets-basketball-welcome-party/</link>
		
		<dc:creator><![CDATA[John Williams]]></dc:creator>
		<pubDate>Wed, 28 Mar 2018 14:57:32 +0000</pubDate>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Houston]]></category>
		<category><![CDATA[Special Events]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/23287/houston-rockets-basketball-welcome-party/</guid>

					<description><![CDATA[<p>One of the best things about your first few weeks working at DMC is that you get to host a welcome party of your choice! As an avid fan of basketball, I chose to go to a Houston Rocket&#8217;s game and took the Houston office with me. After a catered dinner at the office, we [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/23287/houston-rockets-basketball-welcome-party/">Houston Rockets Basketball Welcome Party</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">One of the best things about your first few weeks working at DMC is that you get to host a welcome party of your choice! As an avid fan of basketball, I chose to go to a Houston Rocket&rsquo;s game and took the Houston office with me.</p>

<p class="wp-block-paragraph">After a catered dinner at the office, we carpooled over to the stadium. I will watch almost any basketball game alone and enjoy myself, but being at the game with the DMC Houston team made it even more fun. It allowed us to hang out and bond outside the office, as well as meet some of each other&rsquo;s friends, family, and roommates.</p>

<p class="wp-block-paragraph">DMC makes a point of allowing you a plus one to every party. It&rsquo;s an excellent way to feel more comfortable going to events when you&apos;re a new employee, and a great way to get to know new people!</p>

<figure class="wp-block-image"><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/John-Williams-Party-Group-Photo-edit.jpg" /></figure>

<p class="wp-block-paragraph">I was even lucky enough to be selected to be part of a shooting competition on the court!</p>

<p class="wp-block-paragraph">The promotion was a wheel of fortune inspired shooting game. I shot free throws for 20 seconds. For each basket I made, an assistant revealed one letter in a Southwest Airlines destination. At the end of the 20 seconds of shooting, I had to guess the location. A correct guess would net me 15,000 Southwest Rapid Rewards!</p>

<p class="wp-block-paragraph">I have shot a fair number of free throws in my life, but none in front of this many people. I was unquestionably nervous!</p>

<figure class="wp-block-image"><img decoding="async" alt="John shoots free throws to win airline points." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Houston-Rockets-playing-basketball.jpg"  /></figure>

<p class="wp-block-paragraph">Near the end of the 2nd quarter, it was my time to compete. I missed the first shot, but then made a few in a row. After 20 seconds I turned around to the letters &ldquo;N-A-S-H-V-I.&rdquo; I correctly guessed &ldquo;Nashville,&rdquo; and that was that! 15,000 Southwest miles anywhere I wanted, thanks, Ceci!</p>

<figure class="wp-block-image"><img decoding="async" alt="John won airline points shooting free throws." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/John-Wins-Airline-Points.jpg"  /></figure>

<p class="wp-block-paragraph">The game was incredibly exciting, with the now first place Rockets beating the Pelicans 130-123. James Harden recorded 14 assists in the first half, tying a Houston record.</p>

<p class="wp-block-paragraph">All in all, it was a great time, and I can&rsquo;t wait for our five future new hires to have their welcome parties later this summer!</p>

<p class="wp-block-paragraph"><iframe loading="lazy" allow="autoplay; encrypted-media" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/198KptMCp3A" width="560">&amp;amp;amp;amp;amp;amp;lt;!&#8211;cke_bookmark_207S&#8211;&amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;lt;!&#8211;cke_bookmark_207E&#8211;&amp;amp;amp;amp;amp;amp;gt;</iframe></p>

<p class="wp-block-paragraph">DMC&apos;s offices are always expanding, so if you wish you were with us, <a href="https://static.dmcinfo.com/careers" target="_blank">check out our careers page</a>.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/23287/houston-rockets-basketball-welcome-party/">Houston Rockets Basketball Welcome Party</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DMC Houston Is Bigger Than Ever</title>
		<link>https://static.dmcinfo.com/blog/23679/dmc-houston-is-bigger-than-ever/</link>
		
		<dc:creator><![CDATA[John Williams]]></dc:creator>
		<pubDate>Mon, 20 Nov 2017 10:18:19 +0000</pubDate>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Houston]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/23679/dmc-houston-is-bigger-than-ever/</guid>

					<description><![CDATA[<p>Back in April, we announced that the Houston office was undergoing a renovation and posted some in-progress construction pictures. I started at DMC&apos;s Houston&#160;office in early September, so I arrived at the right&#160;time to enjoy the finished&#160;product.&#160; DMC Houston&apos;s Expansion We have been thoroughly enjoying each of the new areas. On the Inside&#160; My time [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/23679/dmc-houston-is-bigger-than-ever/">DMC Houston Is Bigger Than Ever</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Back in April, we announced that the Houston office was undergoing a renovation and posted some in-progress <a href="/latest-thinking/blog/id/9404/dmc-houston-office-expansion-is-underway">construction pictures</a>.</p>

<p class="wp-block-paragraph">I started at DMC&apos;s Houston&nbsp;office in early September, so I arrived at the right&nbsp;time to enjoy the finished&nbsp;product.&nbsp;</p>

<h2 class="wp-block-heading">DMC Houston&apos;s Expansion</h2>

<p class="wp-block-paragraph">We have been thoroughly enjoying each of the new areas.</p>

<ul class="wp-block-list">
 <li><strong>Kitchen&nbsp;</strong>&#8211; Board and card games are a daily staple in the expanded kitchen during lunch.</li>
 <li><strong>Conference Room </strong>&#8211; All&nbsp;Houston teammates&nbsp;can comfortably fit in the new conference room for status meetings.</li>
 <li><strong>Quads </strong>&#8211; A fierce rivalry has erupted between those who work in the front workspace (known as &ldquo;Power Quad&rdquo;) and those who work in the back (name TBD).</li>
 <li><strong>Collaboration Room</strong> &#8211; A second collaboration room allows for more flexibility when scheduling meetings with other DMC offices or clients.</li>
</ul>

<p class="wp-block-paragraph"><figure class="wp-block-image"><img decoding="async" alt="The DMC Houston team enjoys their newly expanded office kitchen" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/dmc-houston-kitchen.jpg"  /></figure><em>The Houston team enjoying their newly expanded office kitchen.</em></p>

<h2 class="wp-block-heading">On the Inside&nbsp;</h2>

<p class="wp-block-paragraph">My time at DMC has been a blast so far!&nbsp;Our fridge and pantry are always stocked with lunch fare and snacks, which I take full advantage of.</p>

<p class="wp-block-paragraph">One of the biggest learning curves I have faced is mastering the card game <a href="https://www.bearsvsbabies.com/" target="_blank">Bears vs. Babies</a>. There is fierce competition almost daily at lunch, but I think I&rsquo;m beginning to hold my own.</p>

<p class="wp-block-paragraph">I&rsquo;ve befriended our office dog,&nbsp;Travie.&nbsp;She&rsquo;s a massive Irish Wolfhound who is simultaneously bigger and gentler than any other dog I have ever met.</p>

<figure class="wp-block-image"><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Travie.jpg"  /></figure>

<h2 class="wp-block-heading">Expansion Photos</h2>

<p class="wp-block-paragraph">DMC Houston&apos;s newly expanded kitchen has plenty of storage for snacks and space for playing shuffle board or card games.&nbsp;</p>

<figure class="wp-block-image"><img decoding="async" alt="Expanded Houston Kitchen Looking Out" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Expanded-Kitchen-Looking-Out.jpg"  /></figure>

<figure class="wp-block-image"><img decoding="async" alt="Expanded Houston kitchen looking in." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Expanded-Kitchen-Looking-In.jpg"  /></figure>

<p class="wp-block-paragraph">We&apos;ve added more quads to accommodate the growing Houston team. You can see Peter hard at work in the corner!</p>

<figure class="wp-block-image"><img decoding="async" alt="Peter King working in the back of the new Houston quad." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Peter-King-Back-of-the-New-Quad.jpg"  /></figure>

<p class="wp-block-paragraph">Our new conference room is more spacious than ever.</p>

<figure class="wp-block-image"><img decoding="async" alt="Houston's new conference room." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/New-Conference-Room.jpg"  /></figure>

<h2 class="wp-block-heading">Let&apos;s Keep Growing</h2>

<p class="wp-block-paragraph">DMC Houston&apos;s next move is joining a corporate basketball league that starts in January for some competition outside of the office. I hope this means the next addition to the office will be a championship banner hanging from the rafters.</p>

<p class="wp-block-paragraph">We are always looking to hire&nbsp;more engineers to fill&nbsp;the rest of our space.&nbsp;Wish you were with us? <a href="/careers">Check out our opportunities</a>.</p>

<p class="wp-block-paragraph">If you&rsquo;re in the area feel free to stop by and say hello, we&rsquo;d love to give you a tour and play a game of shuffleboard!</p>

<p class="wp-block-paragraph"><strong><a href="/latest-thinking/blog/articletype/categoryview/categoryid/129/houston">See what else is going on at&nbsp;DMC Houston.</a></strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/23679/dmc-houston-is-bigger-than-ever/">DMC Houston Is Bigger Than Ever</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
