<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:webfeeds="http://webfeeds.org/rss/1.0">
    <channel>
        <title><![CDATA[Workers for LabVIEW Community]]></title>
        <description><![CDATA[Workers for LabVIEW Community]]></description>
        <link>https://community.workersforlabview.io</link>
        <generator>Bettermode RSS Generator</generator>
        <lastBuildDate>Tue, 26 May 2026 17:20:12 GMT</lastBuildDate>
        <atom:link href="https://community.workersforlabview.io/rss/feed" rel="self" type="application/rss+xml"/>
        <pubDate>Tue, 26 May 2026 17:20:12 GMT</pubDate>
        <copyright><![CDATA[2026 Workers for LabVIEW Community]]></copyright>
        <language><![CDATA[en-US]]></language>
        <ttl>60</ttl>
        <webfeeds:icon></webfeeds:icon>
        <webfeeds:related layout="card" target="browser"/>
        <item>
            <title><![CDATA[Workers on PXI Vision test system]]></title>
            <description><![CDATA[> "Workers allowed us to design a clean, modular HAL-based system. Fully abstracted, easy to scale, and simple to extend."


APPLICATION BUILT

We developed a modular PXI-based validation platform using PXIe...]]></description>
            <link>https://community.workersforlabview.io/blank-npf2mp6t/post/pxi-vision-test-platform-sq7jPJvkhDyBDv5</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/blank-npf2mp6t/post/pxi-vision-test-platform-sq7jPJvkhDyBDv5</guid>
            <dc:creator><![CDATA[Diogo Silva]]></dc:creator>
            <pubDate>Sun, 24 May 2026 18:47:22 GMT</pubDate>
            <content:encoded><![CDATA[<blockquote><p><em>"Workers allowed us to design a clean, modular HAL-based system. Fully abstracted, easy to scale, and simple to extend."</em></p></blockquote><h3 id="bf96f071-a289-4045-8c32-60a7564dd75f" data-toc-id="bf96f071-a289-4045-8c32-60a7564dd75f" class="text-lg">APPLICATION BUILT</h3><p>We developed a modular PXI-based validation platform using PXIe-148x Chimera cards for GMSL1 and GMSL2 SerDes communication, with migration plans toward GMSL3 support in LabVIEW 2025 Q3.</p><p>The system was designed with a strong focus on abstraction and modularity, allowing the application to remain scalable and maintainable as the platform evolved.</p><p>Hardware Abstraction Layers (HAL) were used to decouple hardware-specific implementations from the core application logic, making it possible to add new boards and hardware configurations without modifying the main codebase.</p><p>Communication between modules was handled dynamically, avoiding direct dependencies and increasing overall system flexibility.</p><h3 id="4a6d10a6-5999-4c70-9b58-b2c1a086eec5" data-toc-id="4a6d10a6-5999-4c70-9b58-b2c1a086eec5" class="text-lg">IMPACT ON DEVELOPMENT</h3><p>This architecture made it much easier to:</p><ul><li><p>scale the system with new functionality</p></li><li><p>support different testing modes such as Capture and Passthrough</p></li><li><p>modify individual subsystems without affecting the rest of the application</p></li><li><p>maintain responsive performance through background processing</p></li></ul><p>The modular approach also simplified long-term expansion and reduced the effort required to adapt the platform for future testing requirements.</p><h3 id="12a8d7f3-a9ac-484c-a0b0-84d29d47d352" data-toc-id="12a8d7f3-a9ac-484c-a0b0-84d29d47d352" class="text-lg">RECOMMENDATION</h3><p>Workers is especially valuable for applications that require long-term scalability, modularity, and hardware abstraction. The framework encourages clean separation between system components and makes it significantly easier to evolve applications over time.</p><h3 id="9bc11090-692c-4ec3-a8c7-32dabdb21217" data-toc-id="9bc11090-692c-4ec3-a8c7-32dabdb21217" class="text-lg">APPLICATION WORKER CALL-CHAIN DIAGRAM<br></h3><figure data-type="image" data-version="v2" data-id="unuXQebbmVEuZ6JDbWk0W" data-size="best-fit" data-align="center"><img src="https://tribe-s3-production.imgix.net/unuXQebbmVEuZ6JDbWk0W?auto=compress,format" data-id="unuXQebbmVEuZ6JDbWk0W"></figure>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automation development with simulation and abstraction]]></title>
            <description><![CDATA[> "WHENEVER I WORK ON A LEGACY SYSTEM OR SOMETHING BUILT WITHOUT WORKERS, I IMMEDIATELY THINK, “THIS WOULD HAVE BEEN SO MUCH EASIER WITH WORKERS.”


APPLICATION BUILT

I use Workers as the architectural ...]]></description>
            <link>https://community.workersforlabview.io/blank-npf2mp6t/post/automation-development-with-simulation-and-abstraction-RshTAVFUi5tmgRs</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/blank-npf2mp6t/post/automation-development-with-simulation-and-abstraction-RshTAVFUi5tmgRs</guid>
            <dc:creator><![CDATA[Philipp Herzog]]></dc:creator>
            <pubDate>Sun, 24 May 2026 18:17:40 GMT</pubDate>
            <content:encoded><![CDATA[<blockquote><h3 id="7e2824e2-29f5-44af-9f05-865195876e3e" data-toc-id="7e2824e2-29f5-44af-9f05-865195876e3e" class="text-lg"><strong><em>"Whenever I work on a legacy system or something built without Workers, I immediately think, “This would have been so much easier with Workers.”</em></strong></h3></blockquote><h3 id="7e4bac2f-bf15-4311-9801-0c90e6074933" data-toc-id="7e4bac2f-bf15-4311-9801-0c90e6074933" class="text-lg">APPLICATION BUILT</h3><p>I use Workers as the architectural foundation for industrial automation and measurement applications developed for multiple clients. During the requirements phase, I already structure the application around the planned Worker architecture, which makes both implementation and testing significantly easier later in the project.</p><p>This approach also allows individual parts of the system to be developed early or simulated independently when hardware is not yet available. The abstraction capabilities introduced in Workers 5.0 have been especially valuable for remotely developed systems and projects that need to support future hardware upgrades, such as replacing IO modules or switching DMM hardware.</p><h3 id="217a525f-deda-41e7-a36e-a808116f6f67" data-toc-id="217a525f-deda-41e7-a36e-a808116f6f67" class="text-lg">GETTING STARTED</h3><p>The examples and training material made it much easier to understand the architectural concepts behind the framework. One of the best ways to learn Workers was by rebuilding existing applications using the framework and then reviewing the architecture with experienced Workers developers.</p><p>This helped reveal better abstraction strategies and improved overall application structure.</p><h3 id="d99910a7-b9a5-429c-a814-7a3b83ef1da6" data-toc-id="d99910a7-b9a5-429c-a814-7a3b83ef1da6" class="text-lg">IMPACT ON DEVELOPMENT</h3><p>Workers significantly reduced my debugging workload and gave me confidence that applications start up and shut down reliably. Most debugging now focuses only on smaller interface or implementation details rather than large architectural problems.</p><p>The Debug Server became an essential tool throughout development, especially for validating initialization behavior, timing, and module interaction. The Call Chain Viewer is also extremely useful when returning to projects after long breaks.</p><p>The scripting tools, API Builder, launcher VIs, and modular Worker architecture greatly improved development efficiency by allowing modules to be tested independently and integrated incrementally.</p><h3 id="ebff824e-dbff-4a86-9c0b-0b2fe2ad3d6d" data-toc-id="ebff824e-dbff-4a86-9c0b-0b2fe2ad3d6d" class="text-lg">RECOMMENDATION</h3><p>I would strongly recommend Workers to developers building modular or long-term LabVIEW applications, especially when abstraction, simulation, maintainability, and hardware flexibility are important.</p><p>The framework encourages cleaner architecture from the very beginning of the project and makes it much easier to scale and evolve systems over time.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Multi-channel EV battery module tester]]></title>
            <description><![CDATA[> "WORKERS WAS BOTH EASY TO LEARN AND POWERFUL ENOUGH TO BUILD A MULTI-MODULE EV BATTERY TESTER WITH CLEAN APIS. I HAVE ZERO REGRETS CHOOSING IT."


APPLICATION BUILT

I developed an application for an EV ...]]></description>
            <link>https://community.workersforlabview.io/blank-npf2mp6t/post/multi-channel-ev-battery-module-tester-CkK6XM0DV0jsrEa</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/blank-npf2mp6t/post/multi-channel-ev-battery-module-tester-CkK6XM0DV0jsrEa</guid>
            <dc:creator><![CDATA[Kevin Henderson]]></dc:creator>
            <pubDate>Sun, 24 May 2026 17:57:26 GMT</pubDate>
            <content:encoded><![CDATA[<blockquote><h3 class="text-lg" data-toc-id="39f3ac39-c9fd-4ab0-a8e1-926172f598d3" id="39f3ac39-c9fd-4ab0-a8e1-926172f598d3"><strong><em>"Workers was both easy to learn and powerful enough to build a multi-module EV battery tester with clean APIs. I have zero regrets choosing it."</em></strong></h3></blockquote><h3 class="text-lg" data-toc-id="d9fbb2c3-a157-4cf2-8658-6057eb8cc47d" id="d9fbb2c3-a157-4cf2-8658-6057eb8cc47d">APPLICATION BUILT</h3><p>I developed an application for an EV battery module tester capable of testing up to six battery modules independently. One of the major advantages of the Workers architecture was the ability to create a reusable test-channel UI Worker once and then scale it across all six channels with minimal additional effort.</p><p>The application was successfully deployed to multiple customer locations and delivered as part of a production testing system.</p><h3 class="text-lg" data-toc-id="182a031a-d233-49b3-bacb-19f0f26639c5" id="182a031a-d233-49b3-bacb-19f0f26639c5">GETTING STARTED</h3><p>The framework was easy to learn thanks to the short explanation videos, sample projects, and documentation. The familiar QMH-style architecture also made the transition approachable.</p><p>The Workers Debug Server quickly became one of the most valuable tools during development and debugging.</p><h3 class="text-lg" data-toc-id="af9ba656-7d92-4915-8fff-a060ec0eaacc" id="af9ba656-7d92-4915-8fff-a060ec0eaacc">IMPACT ON DEVELOPMENT</h3><p>The modular Worker-based architecture allowed each hardware subsystem to be developed and debugged independently. Once a Worker’s public API was functioning correctly in isolation, integrating it into the larger application became significantly more reliable and predictable.</p><p>The framework’s scripting tools also accelerated development while reducing coding mistakes and repetitive boilerplate work.</p><p>The final application received very positive feedback for its fast loading times, responsive UI, and quick shutdown behavior.</p><h3 class="text-lg" data-toc-id="9f43411c-8e71-4f9e-9e51-dbf9745189cb" id="9f43411c-8e71-4f9e-9e51-dbf9745189cb">RECOMMENDATION</h3><p>I would definitely recommend Workers to other LabVIEW developers. The framework is approachable for newer developers while still being powerful enough for advanced architectures and scalable applications.</p><p>The active community support was also extremely helpful whenever questions came up during development.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workers with NI TestStand Integration]]></title>
            <description><![CDATA[> "WORKER PUBLIC APIS (AND HALS) SEAMLESSLY INTEGRATE WITH NI TESTSTAND. A POWERFUL FRAMEWORK THAT PROVIDES A REAL PRODUCTIVITY BOOST."


APPLICATION BUILT

We developed several Workers responsible for ...]]></description>
            <link>https://community.workersforlabview.io/blank-npf2mp6t/post/hardware-communication-workers-integrated-into-ni-teststand-RTDhuV3Iy7SB0eu</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/blank-npf2mp6t/post/hardware-communication-workers-integrated-into-ni-teststand-RTDhuV3Iy7SB0eu</guid>
            <dc:creator><![CDATA[Walid Amokrane]]></dc:creator>
            <pubDate>Sun, 24 May 2026 17:37:10 GMT</pubDate>
            <content:encoded><![CDATA[<blockquote><h3 id="0306dccf-7cb5-4420-9f20-d3578d0f9c5b" data-toc-id="0306dccf-7cb5-4420-9f20-d3578d0f9c5b" class="text-lg"><em>"Worker Public APIs (and HALs) seamlessly integrate with NI TestStand. A powerful framework that provides a real productivity boost."</em></h3></blockquote><h3 id="24c8701c-863d-4a80-8363-770803c9fb3f" data-toc-id="24c8701c-863d-4a80-8363-770803c9fb3f" class="text-lg">APPLICATION BUILT</h3><p>We developed several Workers responsible for communication with our hardware systems. Using the API functionality introduced in Workers 5, we were able to integrate these Workers directly into NI TestStand as custom steps.</p><p>This allowed us to build reusable, ready-to-use TestStand libraries while keeping the hardware communication layer modular and standardized.</p><h3 id="5cf90b92-a1dc-4d94-8b8d-77a095abaa35" data-toc-id="5cf90b92-a1dc-4d94-8b8d-77a095abaa35" class="text-lg">GETTING STARTED</h3><p>The documentation and sample projects made it straightforward to get started with the framework. Since the architecture follows the familiar LabVIEW QMH style, it made it quite easy to get started.</p><h3 id="9aa43d9a-24eb-43b8-ac5f-3f13e0ff8406" data-toc-id="9aa43d9a-24eb-43b8-ac5f-3f13e0ff8406" class="text-lg">IMPACT ON DEVELOPMENT</h3><p>Workers helped standardize our code structure across the team, making applications much easier to maintain, update, and extend. The Debug Server has also been extremely valuable, especially at customer sites where only the LabVIEW Runtime is available.</p><p>Overall, the framework has significantly improved our development efficiency and maintainability.</p><h3 id="63f3ff5d-37ae-46a3-a1fd-49d77de20486" data-toc-id="63f3ff5d-37ae-46a3-a1fd-49d77de20486" class="text-lg">RECOMMENDATION</h3><p>I would definitely recommend Workers to other LabVIEW developers. It is easy to learn, integrates naturally into existing LabVIEW development workflows, and provides immediate benefits in code organization, debugging, and long-term maintainability.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Scalable multi-machine industrial control platform]]></title>
            <description><![CDATA[> “Simple to learn, powerful to scale — Workers makes LabVIEW development efficient for developers at every level.”


APPLICATION BUILT

We developed a scalable Windows-based application for a customer ...]]></description>
            <link>https://community.workersforlabview.io/blank-npf2mp6t/post/scalable-multi-machine-industrial-control-platform-4PZFya1ogvLGuUI</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/blank-npf2mp6t/post/scalable-multi-machine-industrial-control-platform-4PZFya1ogvLGuUI</guid>
            <dc:creator><![CDATA[Shahezad Shaikh]]></dc:creator>
            <pubDate>Sun, 24 May 2026 13:06:16 GMT</pubDate>
            <content:encoded><![CDATA[<blockquote><p><em>“Simple to learn, powerful to scale — Workers makes LabVIEW development efficient for developers at every level.”</em></p></blockquote><h3 class="text-lg" data-toc-id="8a8852b6-da11-4328-97ca-1af4b940bd79" id="8a8852b6-da11-4328-97ca-1af4b940bd79">APPLICATION BUILT</h3><p>We developed a scalable Windows-based application for a customer operating around 10 similar industrial machines. Each machine consisted of three hardware modules, managed through a common inheritance-based hardware Worker architecture.</p><p>A centralized Head Worker dynamically loaded machine-specific configuration data such as Modbus addresses, IP addresses, and hardware parameters directly from a database. By inheriting from the shared hardware Worker, each machine-specific Worker automatically adapted to its own configuration without requiring separate application development.</p><p>This approach enabled us to deploy a single unified application capable of running simultaneously across all machines while ensuring easy scalability, maintainability, and centralized configuration management. Additionally, we developed an independent dashboard system that continuously monitors and displays the live operational status of all machines in real time.</p><h3 class="text-lg" data-toc-id="343691a5-5359-4f29-9fb8-9b15a7e28b43" id="343691a5-5359-4f29-9fb8-9b15a7e28b43">GETTING STARTED</h3><p>We were searching for a framework that offered strong documentation, ease of implementation, and was friendly for junior developers.</p><p>After evaluating multiple frameworks such as Actor Framework, DQMH, and others, we found that the Workers architecture best matched our requirements. One of the key advantages was its accessibility for developers who are familiar with basic QMH architecture but may not yet have deep Object-Oriented Programming (OOP) knowledge. This significantly reduced the learning curve for junior team members while still providing the flexibility and scalability required for advanced application development.</p><p>Over the past two years, we have successfully implemented multiple applications using the Workers architecture, and our experience has been extremely positive. It has proven to be an excellent framework for teams with mixed experience levels, enabling both junior and experienced developers to collaborate efficiently within a consistent and maintainable development environment.</p><h3 class="text-lg" data-toc-id="1105cc33-2bd6-4e0c-b129-5e0ab18f62ef" id="1105cc33-2bd6-4e0c-b129-5e0ab18f62ef">IMPACT ON DEVELOPMENT</h3><p>The framework has significantly improved our development speed, code reusability, and maintainability. By using a modular worker-based architecture, we developed a single scalable application that supports multiple machines with minimal code duplication.</p><p>ts clean structure, along with the Debug Server, makes debugging and issue tracing much easier, while also simplifying future modifications and expansion. Dynamic configuration handling reduces development effort when adding new machines or updating hardware settings.</p><p>Additionally, the framework enables both junior and experienced developers to collaborate efficiently within the same project structure</p><h3 class="text-lg" data-toc-id="d104f4e6-31b8-4178-9035-83af2c3e809f" id="d104f4e6-31b8-4178-9035-83af2c3e809f">RECOMMENDATION</h3><p>We would definitely recommend the Workers framework to other LabVIEW developers. Features like the Debug Server and the user-friendly Workers Tools menu make development and debugging much easier.</p><p>Creating and adding workers, messages, and requests is simple and efficient, which helps improve code organization, reduce development time, and simplify maintenance for teams with different experience levels.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Worker PPLs - An example using the DMM HAL Demo Project]]></title>
            <description><![CDATA[Packed Project Libraries (PPLs) are commonly used in LabVIEW to create modular plugin architectures. However, once inheritance and dynamic loading are introduced, dependency management can quickly ...]]></description>
            <link>https://community.workersforlabview.io/blog-9abfh5hq/post/build-labview-worker-plugins-ppls-7SP9iizwCz2Et9d</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/blog-9abfh5hq/post/build-labview-worker-plugins-ppls-7SP9iizwCz2Et9d</guid>
            <category><![CDATA[PPLs]]></category>
            <dc:creator><![CDATA[Peter Scarfe]]></dc:creator>
            <pubDate>Fri, 22 May 2026 14:24:10 GMT</pubDate>
            <content:encoded><![CDATA[<p>Packed Project Libraries (PPLs) are commonly used in LabVIEW to create modular plugin architectures. However, once inheritance and dynamic loading are introduced, dependency management can quickly become difficult. This guide describes how to create a Worker PPL plugin.</p><p>For this example, we will take a working source-code example and turn it into a deployable PPL plugin architecture. To make it easy to follow, this guide uses the <strong>DMM HAL Demo Project</strong> that ships with the <strong>Workers SDK</strong>, allowing you to follow along with the steps. The result is a version of the example project in which both the <strong>DMM HAL</strong> and the <strong>DMM Workers</strong> are <strong>PPLs</strong>, suitable for deploying in production in place of the source code.</p><h2 class="text-xl" data-toc-id="3b3ff23f-2377-4a4b-ad8f-795ddb4625de" id="3b3ff23f-2377-4a4b-ad8f-795ddb4625de">What you will need</h2><ul><li><p><strong>The DMM HAL Demo Project</strong> — one of the example projects that ships by default with the Workers SDK. This is the <strong>Source Project</strong> you will work from throughout this guide.</p></li><li><p><strong>LabVIEW Solution Builder</strong> — a free tool that builds packed libraries in the correct dependency order. Download the <strong>master branch</strong> from <a class="text-interactive hover:text-interactive-hovered" rel="noopener noreferrer nofollow" href="http://github.com/jovianarts/LVSolutionBuilder">github.com/jovianarts/LVSolutionBuilder</a>, then unzip it somewhere convenient..</p></li><li><p><strong>LabVIEW 2019 or later</strong> — required by the LabVIEW <strong>Solution Builder</strong>.</p></li></ul><h2 class="text-xl" data-toc-id="33eb751a-12ac-4081-bd6b-2f8d2f8a8e99" id="33eb751a-12ac-4081-bd6b-2f8d2f8a8e99">Important: Source and PPL modules are not interchangeable</h2><p>A library compiled into a PPL belongs to the <strong>PPL runtime tree</strong>. The same library in source form belongs to the <strong>development source tree</strong>. The two are not interchangeable: a PPL plugin cannot be loaded with source-based parents, and a source plugin cannot be loaded with PPL parents.</p><figure data-align="center" data-size="best-fit" data-id="PwKBgCAH3rxPsETk24Ev8" data-version="v2" data-type="image"><img data-id="PwKBgCAH3rxPsETk24Ev8" src="https://tribe-s3-production.imgix.net/PwKBgCAH3rxPsETk24Ev8?auto=compress,format"><figcaption class="!text-center !mx-auto !text-content-subdued !text-xs  !px-0.5 !my-1 !max-w-prose !mt-1 !rounded-none">Figure 1 : Source and PPL modules are not interchangeable. PPL Workers must inherit from the exact same parent libraries.</figcaption></figure><p><br>Because the source code and the PPLs belong to separate trees, the workflow uses two separate projects: a <strong>Source Project</strong>, where development takes place, and a <strong>PPL Project</strong>, where the built PPLs are assembled into an application. <strong>Steps 1–3</strong> produce the PPL runtime tree from the development source tree. <strong>Steps 4–5</strong> work within the PPL runtime tree.</p><h2 class="text-xl" data-toc-id="d62b0180-688b-4156-8625-f2bce2256b89" id="d62b0180-688b-4156-8625-f2bce2256b89">Let's begin...</h2><p>Before starting, create a copy of the <strong>DMM HAL Demo Project </strong>example project that ships with the <strong>Workers SDK</strong>. (This can be found under the <strong>Workers tools menu &gt; Example Projects</strong>). Confirm that the example project runs correctly from source. The code should be working before it is built.</p><h2 class="text-xl" data-toc-id="0ad8c782-ef8b-47d3-8fbd-3894acec2f48" id="0ad8c782-ef8b-47d3-8fbd-3894acec2f48">Step 1 — Organize the Source Project into libraries</h2><p>The <strong>Solution Builder</strong> works at the library level, so each component to be turned into a PPL must reside in its own library.</p><ol><li><p>Create a library named <strong>DMM Workers.lvlib</strong> and add the Worker plugins (Fluke, Keithley and Keysight DMM) to it.</p></li><li><p>Create a library named <strong>DMM HAL.lvlib</strong> and add <strong>DMM HAL.lvclass</strong> to it, together with its launchers — <strong>Asynchronous Launcher - DMM HAL.vi</strong> and <strong>Launcher - DMM HAL.vi</strong>.</p></li></ol><p>The Source Project should now contain two libraries, each holding one layer of the architecture, as shown below in Figure 2.</p><figure data-align="center" data-size="original" data-id="b3fwpnySqmlZPj3bujtZD" data-version="v2" data-type="image"><img data-id="b3fwpnySqmlZPj3bujtZD" src="https://tribe-s3-production.imgix.net/b3fwpnySqmlZPj3bujtZD?auto=compress,format"><figcaption class="!text-center !mx-auto !text-content-subdued !text-xs  !px-0.5 !my-1 !max-w-prose !mt-1 !rounded-none">Figure 2 : The Source Project. DMM Workers and DMM HAL are both moved into separate libraries, and both libraries have PPL build specs.</figcaption></figure><h2 class="text-xl" data-toc-id="76ea58a0-75bb-4b9f-ad86-83931ac7ba44" id="76ea58a0-75bb-4b9f-ad86-83931ac7ba44"><br>Step 2 — Create the packed library build specs</h2><p>Create a Packed Project Library <strong>build specification</strong> for each library, as shown in Figure 2:</p><ol><li><p><strong>PPL DMM HAL</strong> — built from <strong>DMM HAL.lvlib</strong>.</p></li><li><p><strong>PPL DMM Workers</strong> — built from <strong>DMM Workers.lvlib</strong>.</p></li></ol><p>In each build spec, open the <strong>Source Files</strong> page and confirm that the <strong>library </strong>created in <strong>Step 1</strong> is the source — not loose classes or VIs.</p><ol start="3"><li><p>Open the <strong>Additional Exclusions</strong> page and tick <strong>Exclude dependent packed libraries</strong>, as shown below. This setting prevents the builder from embedding a private copy of the HAL inside the Workers PPL. Both PPLs then resolve to one shared HAL at runtime — a single shared class identity rather than two separate ones.</p><p></p></li></ol><figure data-align="center" data-size="best-fit" data-id="eFMYOP6wQH5uaGpfAQfPk" data-version="v2" data-type="image"><img data-id="eFMYOP6wQH5uaGpfAQfPk" src="https://tribe-s3-production.imgix.net/eFMYOP6wQH5uaGpfAQfPk?auto=compress,format"><figcaption class="!text-center !mx-auto !text-content-subdued !text-xs  !px-0.5 !my-1 !max-w-prose !mt-1 !rounded-none">Figure 3 : Make sure "Exclude dependent packed libraries" is checked</figcaption></figure><h2 class="text-xl" data-toc-id="f8d25458-e29a-4101-8313-f97e5fc29626" id="f8d25458-e29a-4101-8313-f97e5fc29626"><br>Step 3 — Build the PPLs with LabVIEW Solution Builder</h2><p>The PPLs must be built in dependency order: the HAL first, then the Workers that depend on it. ⭐ <strong>Good news! You don't need to manually do this! The Solution Builder determines this order and carries out the builds.</strong></p><ol><li><p>Open <strong>SolutionBuilder.vi</strong> from the copy downloaded earlier from the <strong>LabVIEW Solution Builder </strong>GitHub repository, and point the <strong>Path</strong> field on the front panel to your <strong>Source Project</strong>.</p></li><li><p>Run <strong>SolutionBuilder.vi</strong>.</p></li></ol><p>The Solution Builder analyses the library dependencies, builds <strong>PPL DMM HAL</strong> first, relinks it in memory, then builds <strong>PPL DMM Workers</strong> with the <strong>PPL DMM HAL</strong> as its linked dependency. After the tool completes, the Status for both build specifications should say <strong>Built</strong>.</p><figure data-align="center" data-size="best-fit" data-id="0vegnW87XrKgFxAFwLR8n" data-version="v2" data-type="image"><img data-id="0vegnW87XrKgFxAFwLR8n" src="https://tribe-s3-production.imgix.net/0vegnW87XrKgFxAFwLR8n?auto=compress,format"><figcaption class="!text-center !mx-auto !text-content-subdued !text-xs  !px-0.5 !my-1 !max-w-prose !mt-1 !rounded-none">Figure 4 : Solution Builder.vi</figcaption></figure><p><br>The two output PPLs — <strong>PPL DMM HAL.lvlibp</strong> and <strong>PPL DMM Workers.lvlibp</strong> — are written to the build destinations defined in their build specs. Note these locations; the files are needed in the next step.</p><h2 class="text-xl" data-toc-id="00ee9b0b-39d0-47c1-a880-4b664656b6a4" id="00ee9b0b-39d0-47c1-a880-4b664656b6a4">Step 4 — Create the PPL Project</h2><ol><li><p>Create a new, separate project as shown in <strong>Figure 5</strong> below, and add the two PPLs produced by the Solution Builder — <strong>PPL DMM HAL.lvlibp</strong> and <strong>PPL DMM Workers.lvlibp</strong>.</p></li></ol><p>This is the <strong>PPL Project</strong>. Everything in it works with the packed libraries, which are not the same VIs the Source Project uses. This project corresponds to the <strong>PPL runtime tree</strong> in <strong>Figure 1 </strong>above.</p><figure data-align="center" data-size="original" data-id="bWaTa9biaPWjO0lqVe8uF" data-version="v2" data-type="image"><img data-id="bWaTa9biaPWjO0lqVe8uF" src="https://tribe-s3-production.imgix.net/bWaTa9biaPWjO0lqVe8uF?auto=compress,format"><figcaption class="!text-center !mx-auto !text-content-subdued !text-xs  !px-0.5 !my-1 !max-w-prose !mt-1 !rounded-none">Figure 5 : PPL Project. This project does not contain the source code, but the PPL DMM HAL and the PPL DMM Workers.</figcaption></figure><h2 class="text-xl" data-toc-id="2a1e73e4-0119-4b15-8dd6-a330c0e5ffad" id="2a1e73e4-0119-4b15-8dd6-a330c0e5ffad">Step 5 — Use the PPLs</h2><p>The <strong>PPL Project</strong> needs its own top-level VI to run the example. Add a VI named <strong>PPL Universal DMM User Interface.vi </strong>(as in Figure 5) to the project. It can begin as a copy of the <strong>Universal DMM User Interface.vi</strong> from the <strong>Source Project</strong>, but every Worker class and Public API VI used on its block diagram must be replaced with the equivalent Worker class or VI from the PPL libraries, as shown in <strong>Figure 6 </strong>below. The Source Project and the PPL Project use different files, and the deployed VI must reference the PPL versions throughout.</p><figure data-align="center" data-size="best-fit" data-id="WexcyODT5StjbeDzhLvP9" data-version="v2" data-type="image"><img data-id="WexcyODT5StjbeDzhLvP9" src="https://tribe-s3-production.imgix.net/WexcyODT5StjbeDzhLvP9?auto=compress,format"><figcaption class="!text-center !mx-auto !text-content-subdued !text-xs  !px-0.5 !my-1 !max-w-prose !mt-1 !rounded-none">Figure 6 : a copy of the Universal DMM User Interface.vi (taken from the source project) but all Public API VIs and Worker class constants are replaced with the PPL versions.</figcaption></figure><p>With that done, you have successfully built Worker PPL plugins. Because <strong>PPL DMM Workers.lvlibp</strong> was built with <strong>PPL DMM HAL.lvlibp</strong> as its linked dependency, its Worker classes inherit from the PPL HAL. A Worker (e.g. Fluke, Keithley, etc.) can therefore be wired directly into the PPL HAL Public API VIs.</p><p>Building every layer as a PPL, in dependency order, with <strong>Exclude dependent packed libraries</strong> enabled, places the whole system on a single PPL tree: one DMM HAL, one shared class identity, and any DMM Worker that inherits from it can be loaded without modification..</p><h2 class="text-xl" data-toc-id="a12d6cb5-5b54-441a-827c-392b64ab4760" id="a12d6cb5-5b54-441a-827c-392b64ab4760"><strong>Step 6 — Update the Workers and rebuild</strong></h2><p>You can now continue development in the <strong>Source Project</strong>. New DMM Workers can be created, and existing ones modified, in the usual way.</p><p>To deploy those changes, run the <strong>Solution Builder</strong> again as in <strong>Step 3</strong>. As long as the DMM HAL source code is unchanged, the Solution Builder detects this and does not rebuild <strong>PPL DMM HAL</strong> — it rebuilds only <strong>PPL DMM Workers</strong>. The updated PPL is written to the same destination, and the PPL Project picks up the new Workers without any further changes.</p><p>This is the ongoing workflow: develop in the Source Project, build with the Solution Builder, and the PPL Project always references the built PPLs.</p><p>Best of luck! 🙂</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PPL Plugin Architecture Issue in DMM HAL: Type Casting Failure Due to Inheritance Dependency]]></title>
            <description><![CDATA[I am working on building a PPL plugin architecture for the Shipping example in the DMM HAL. While I can successfully build the PPL, the example fails at runtime.

After debugging, I found that the PPL ...]]></description>
            <link>https://community.workersforlabview.io/ask-the-community-az5ilws8/post/ppl-plugin-architecture-issue-in-dmm-hal-type-casting-failure-due-to-M3tuv10xH9y2gNK</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/ask-the-community-az5ilws8/post/ppl-plugin-architecture-issue-in-dmm-hal-type-casting-failure-due-to-M3tuv10xH9y2gNK</guid>
            <category><![CDATA[HAL]]></category>
            <category><![CDATA[hardware abstraction]]></category>
            <category><![CDATA[plugins]]></category>
            <category><![CDATA[Workers 5.0]]></category>
            <dc:creator><![CDATA[SHIMJITH CHANDRAMBETH MUNDON]]></dc:creator>
            <pubDate>Tue, 19 May 2026 15:35:35 GMT</pubDate>
            <content:encoded><![CDATA[<p>I am working on building a PPL plugin architecture for the Shipping example in the DMM HAL. While I can successfully build the PPL, the example fails at runtime.</p><p>After debugging, I found that the PPL built for the HAL layer breaks during type casting. This appears to stem from the child class being dependent on the parent class. Even when attempting to build a minimally dependent PPL (similar to the Keithley approach), the HAL classes are still pulled in due to inheritance relationships, which ideally should be avoided.</p><p>One approach I considered was disconnecting or removing typedef dependencies before building the PPL, so that the child class is no longer tightly coupled to the parent. However, it looks like the child Main VI directly calls <code>MHL Cases.vi</code>, which introduces another hard dependency. Because of this, even if the typedef dependency is removed, this direct VI linkage becomes another bottleneck and prevents proper decoupling.</p><p>Has anyone encountered a similar issue? Is there a recommended workflow or best practice when building PPLs for the HAL layer, especially when dealing with workers and inheritance hierarchies?<br><br></p><figure data-align="center" data-size="best-fit" data-id="FaIOmZ8xNXK1sa8ne6hGz" data-version="v2" data-type="image"><img data-id="FaIOmZ8xNXK1sa8ne6hGz" src="https://tribe-s3-production.imgix.net/FaIOmZ8xNXK1sa8ne6hGz?auto=compress,format"></figure><p>Main vi of Keithly DMM class</p><figure data-align="center" data-size="best-fit" data-id="zTgpJDQ89V9rJ24HC1xmv" data-version="v2" data-type="image"><img data-id="zTgpJDQ89V9rJ24HC1xmv" src="https://tribe-s3-production.imgix.net/zTgpJDQ89V9rJ24HC1xmv?auto=compress,format"></figure>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using device drivers in a workers application]]></title>
            <description><![CDATA[Hello everyone, this might be a beginner’s question, but what’s the best way to integrate a device driver – which I wrote in a separate project – into a Workers project? The driver is used to control ...]]></description>
            <link>https://community.workersforlabview.io/ask-the-community-az5ilws8/post/using-device-drivers-in-a-workers-application-Xz9H8ifWIgtyld1</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/ask-the-community-az5ilws8/post/using-device-drivers-in-a-workers-application-Xz9H8ifWIgtyld1</guid>
            <dc:creator><![CDATA[Daniel Meinhardt]]></dc:creator>
            <pubDate>Mon, 11 May 2026 08:30:02 GMT</pubDate>
            <content:encoded><![CDATA[<p>Hello everyone, this might be a beginner’s question, but what’s the best way to integrate a device driver – which I wrote in a separate project – into a Workers project? The driver is used to control two linear axes. I have it as a .lvlib file.</p><p>Would it make more sense to rewrite this as a Worker?</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Launching a Workers HAL as a remote plugin using a config file]]></title>
            <description><![CDATA[After creating a HAL using the traditional method where the base class and child classes are part of the main application project, I wanted to try launching the same HAL after moving it to another ...]]></description>
            <link>https://community.workersforlabview.io/ask-the-community-az5ilws8/post/launching-a-workers-hal-as-a-remote-plugin-using-a-config-file-eue9HDORWbHtzQI</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/ask-the-community-az5ilws8/post/launching-a-workers-hal-as-a-remote-plugin-using-a-config-file-eue9HDORWbHtzQI</guid>
            <category><![CDATA[config]]></category>
            <category><![CDATA[HAL]]></category>
            <category><![CDATA[plugins]]></category>
            <dc:creator><![CDATA[Kevin Henderson]]></dc:creator>
            <pubDate>Thu, 30 Apr 2026 14:35:50 GMT</pubDate>
            <content:encoded><![CDATA[<p>After creating a HAL using the traditional method where the base class and child classes are part of the main application project, I wanted to try launching the same HAL after moving it to another location on disk and putting it in isolation in its own Workers project.  The goal would be to have no LabVIEW project dependency between the main application and the HAL that is called.  An external config file is used to give a path to the base class and which child classes are launched, giving a worker alias to each one.</p><p>The code I created, which uses "Get LV Class Default Value.vi" and "To More Specific Class.vi" seems to be working correctly as I can launch the remote HAL and it functions normally.  However, I see a difference in how the Workers Debug Server shows its status.  In the traditional HAL project, all the Workers show their status as "Initialized", but in the remote HAL project, the Workers Debug Server show their status as "Initialize called", which implies the workers did not complete their initialization (even though they seem to be functioning normally).</p><p>My question, is the status shown in the debug server expected or is there still a problem to be solved here?</p><attachment data-id="bNKv3KKVh6VNCavcuwxgC" data-type="attachment"></attachment><p> </p><attachment data-id="zGFoIfjErFOGLUUaYchWh" data-type="attachment"></attachment><p> </p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to disable Workers application running when LabVIEW starts up.]]></title>
            <description><![CDATA[When I launch LabVIEW the Workers init splash screen takes a long time and I don't want it running at all as I don't use it regularly, but I pay the penalty for having it installed.

Is there a way to ...]]></description>
            <link>https://community.workersforlabview.io/ask-the-community-az5ilws8/post/how-to-disable-workers-application-running-when-labview-starts-up-Tw5MSf4ArtjWw3A</link>
            <guid isPermaLink="true">https://community.workersforlabview.io/ask-the-community-az5ilws8/post/how-to-disable-workers-application-running-when-labview-starts-up-Tw5MSf4ArtjWw3A</guid>
            <dc:creator><![CDATA[Norman Kirchner Jr.]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 13:51:24 GMT</pubDate>
            <content:encoded><![CDATA[<p>When I launch LabVIEW the Workers init splash screen takes a long time and I don't want it running at all as I don't use it regularly, but I pay the penalty for having it installed. <br><br>Is there a way to disable this init on Load?</p>]]></content:encoded>
        </item>
    </channel>
</rss>