<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>On the Line</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/</link><description>A design challenge centred on adding intelligence to production lines, with projects that monitor processes, test products, and improve uptime through automation and data-driven control.  Participants build and share practical industrial solutions, showing</description><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>Forum Post: RE: OpenDFM: A utility for getting the logs</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57105/opendfm-a-utility-for-getting-the-logs/236411</link><pubDate>Fri, 17 Jul 2026 17:31:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:14173f7f-7715-4b43-ac62-872c8c410fdf</guid><dc:creator>colporteur</dc:creator><description>&amp;quot;Our need will be our creator&amp;quot; Plato It looks like you dug the burr out of the saddle blanket on this one. Hopefully the ride is smooth from here on out. I can recall a few &amp;quot;Augh fk-it moments&amp;quot; and just committed to fixing it.</description></item><item><title>Forum Post: OpenDFM: A utility for getting the logs</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57105/opendfm-a-utility-for-getting-the-logs</link><pubDate>Thu, 16 Jul 2026 03:50:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:a532ec93-accb-4bea-82dd-678a5634e5c4</guid><dc:creator>SensoredHacker0</dc:creator><description>Whose going to carry the boats?? Who is going to carry the logs? I work with IDEC PLCs. They have some software which was probably really nice in 1982. yesterday, I was so infuriated when a log download process kept failing, I went off and made my own utility to get logs. The general gist is that when the OEM supported software looses connection, you loose the entire set of data you had been downloading. many of our systems are thousands of miles away, on questionably reliable networks. While you might see 20Kpbs down, locally, remote connections even for small files can take hours at 2-4KBps. then to loose it. .. OMG. or the syntax is convoluted AF, or theres no direct way to automate the process via the OEM supported software. Well last night, I had enough, and delved into the internal operation of remote SD Card reading, via Maintenance Protocol. How OpenDFM Works OpenDFM is a multithreaded graphical client for accessing the SD-card filesystem exposed by IDEC PLCs through the maintenance protocol over TCP. Each PLC is represented by an independent tab and session object. A session stores the controller’s IP address, TCP port, PLC device identifier, current remote working directory, local destination path, cached directory-entry metadata, active transfer state, and synchronization primitives used to prevent overlapping protocol transactions. Ethernet maintenance communication normally uses TCP port 2101. At the transport layer, OpenDFM creates a TCP socket to the PLC and exchanges IDEC maintenance-protocol frames. A conventional request contains: ENQ control byte 0x05 two-byte device identifier, commonly FF continuation flag command and subcommand command-specific payload XOR-based block-check character carriage-return terminator 0x0D The PLC normally responds with an ACK frame beginning with 0x06 , followed by the responding device number, completion status, returned data, BCC, and terminator. Negative protocol responses are decoded separately from TCP errors, socket timeouts, truncated frames, and malformed payloads. SD-card access uses the PLC’s extended FR filesystem command family. Directory enumeration is stateful. OpenDFM first submits a remote path, such as: /FCDATA01/DATALOG/1-secLog The path-open request includes the path length and a NUL-terminated path name. The PLC returns the number of directory entries available in the opened directory context. OpenDFM then issues successive entry-read requests, using the observed FR20 sequence, until every directory record has been retrieved. The final request uses the terminating form of the command so the PLC can release the active enumeration context. Each returned directory record is parsed into structured metadata. Depending on the record format, this includes: file-versus-directory type filename length filename bytes file size FAT-style modification date FAT-style modification time additional flags or reserved fields The date and time fields are decoded from their packed filesystem representation. File sizes are converted from the protocol’s hexadecimal ASCII representation into native integers. Filenames are decoded without treating path separators as local filesystem separators until the remote entry has been validated. The GUI does not directly display raw protocol responses. Parsed entries are converted into application-level directory-entry objects and inserted into a tree or list model. Directory entries can therefore be sorted, selected, recursively traversed, and associated with transfer actions without repeatedly reparsing the original response bytes. File retrieval is also stateful and block-oriented. OpenDFM opens the selected remote file, determines or receives its expected length, and repeatedly requests the next block. Returned blocks contain protocol framing plus a binary or encoded data payload. The application removes framing, validates the response, extracts the payload, and appends it to a local output stream. The local file is normally written incrementally rather than buffering the complete remote file in memory. This allows large logs to be downloaded with a bounded memory footprint. The transfer loop tracks: expected remote file length bytes requested bytes received bytes committed to disk current remote offset retry state elapsed transfer time effective transfer rate A transfer is considered complete only when the protocol reports end-of-file or the accumulated byte count matches the size reported during directory enumeration. A short response, zero-length block before the expected end, invalid BCC, unexpected command status, or socket disconnect is treated as a transfer failure rather than silently producing a truncated file. Folder downloads are implemented as client-side recursive traversal. The PLC provides only the contents of one opened directory at a time. OpenDFM therefore performs a depth-first or breadth-first walk: Enumerate the selected remote directory. Create the matching local directory. Download each regular file. Queue or recursively enter each sub-directory. Repeat until no unvisited directories remain. The remote path is normalized independently from the local path. This prevents a PLC filename containing parent-directory components, absolute-path syntax, or unexpected separators from escaping the selected local download directory. Because the PLC’s filesystem commands maintain implicit remote state, command ordering is significant. A directory-open operation establishes the context used by subsequent directory-entry reads. Likewise, a file-open command establishes the context used by following block-read commands. If two operations against the same PLC were interleaved, one command sequence could replace the context required by the other. OpenDFM therefore serializes filesystem transactions per PLC session. A tab may have only one active directory enumeration, file transfer, or recursive operation at a time. This restriction is not primarily due to Ethernet bandwidth; it is required to preserve the PLC’s stateful command sequence. Concurrency is applied between PLC sessions rather than within one PLC session. Each tab has its own socket activity, protocol state, command lock, transfer worker, and progress reporting path. As a result, PLC A may download a log while PLC B enumerates a directory, provided the two operations use separate sessions. Blocking socket and disk operations are executed in worker threads so they do not run inside the GUI event loop. The workers publish status updates through a thread-safe queue or framework signal mechanism. The main interface thread consumes those updates and modifies widgets, progress bars, transfer labels, and tab state. GUI objects are not directly manipulated from network workers. A typical operation therefore crosses several layers: GUI action -&amp;gt; PLC session controller -&amp;gt; filesystem operation -&amp;gt; maintenance-protocol command builder -&amp;gt; TCP transport -&amp;gt; PLC response parser -&amp;gt; directory-entry or file-block decoder -&amp;gt; local filesystem writer -&amp;gt; thread-safe progress update -&amp;gt; GUI model refresh Error handling is divided by layer. Connection failures identify an unreachable PLC. Protocol failures identify a syntactically valid exchange rejected by the controller. Filesystem failures identify invalid paths, unavailable SD cards, changed directory contents, or interrupted remote file state. Local I/O failures identify permission errors, full disks, invalid filenames, or failed writes. OpenDFM can also verify that the SD card is mounted before performing filesystem operations by reading the PLC’s SD-card status devices. On FC6A controllers, special relay M8070 indicates SD-card mount status, while special registers such as D8250 and D8251 expose total and free SD-card capacity. These checks are separate from directory enumeration but provide an early indication that a browsing or download request is likely to succeed. In effect, OpenDFM translates a stateful, request-response filesystem interface into a conventional graphical file browser while preserving the strict transaction ordering, response validation, and per-controller isolation required by the PLCs. https://github.com/FOSSBOSS/OpenDFM Are there bugs? HELL YEAH! Am I going to fix it? hell ye? Did I really write this whole thing in one night? LOL NO. Vid: www.youtube.com/watch Next up: Decoding the SV1 security protocol into practical utilities.</description><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/datalog">datalog</category><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/plc">plc</category><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/industrial%2bautomation">industrial automation</category><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/automation">automation</category></item><item><title>Forum Post: RE: OpenDFM: A utility for getting the logs</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57105/opendfm-a-utility-for-getting-the-logs/236403</link><pubDate>Thu, 16 Jul 2026 03:45:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0fd24b30-8c8e-48c2-85cc-af84026b2146</guid><dc:creator>kmikemoo</dc:creator><description>I can&amp;#39;t play with it, but I like the concept and execution.</description></item><item><title>File: OpenDFM a multi PLC log file downloader for IDEC PLCs</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/m/managed-videos/151524</link><pubDate>Thu, 16 Jul 2026 00:29:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:ba261655-78a0-47ff-9117-14b6c790fc47</guid><dc:creator>SensoredHacker0</dc:creator><description>Download logs based on date selections from the YYYYMMDD format. are your logs formatted that way? ### How OpenDFM Works OpenDFM is a desktop application for browsing and downloading files from the SD card installed in an IDEC PLC. The application...</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/solarsense---edge-ai-for-optimal-cleaning-of-solar-panels?CommentId=7857fc4b-c541-4635-be19-fe6bda4e9c4b</link><pubDate>Wed, 15 Jul 2026 08:31:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:7857fc4b-c541-4635-be19-fe6bda4e9c4b</guid><dc:creator>obones</dc:creator><description>For LabView, you may find that &amp;quot;talking&amp;quot; to a LLM of your choice gives you some good hints as to what is which. But you will have to &amp;quot;steer&amp;quot; it properly, it has a tendency to give suggestions related to outdated versions, as I explained in my review of the DMM I received as a prize: community.element14.com/.../gdm-8341-trace-capabilities-review</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge?CommentId=3a27bde1-2ded-4461-a8b0-0866808dc83e</link><pubDate>Wed, 08 Jul 2026 17:28:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:3a27bde1-2ded-4461-a8b0-0866808dc83e</guid><dc:creator>manojroy123</dc:creator><description>Congrats to everyone who participated and to all the winners who completed the projects.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge?CommentId=de12ab59-1ca9-49d4-863c-adc5be71a60a</link><pubDate>Wed, 08 Jul 2026 15:47:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:de12ab59-1ca9-49d4-863c-adc5be71a60a</guid><dc:creator>dougw</dc:creator><description>Congratulations to the winners. Enjoy the great prizes.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/industrial-line-sentinel-ils?CommentId=b064db78-0600-4486-96a2-21f23069f296</link><pubDate>Tue, 30 Jun 2026 03:49:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b064db78-0600-4486-96a2-21f23069f296</guid><dc:creator>arvindsa</dc:creator><description>They never lock us out. The editing remains open even after last date.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/industrial-line-sentinel-ils?CommentId=f88286a4-7257-4709-bdcb-53a6433998d4</link><pubDate>Mon, 29 Jun 2026 20:12:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:f88286a4-7257-4709-bdcb-53a6433998d4</guid><dc:creator>skruglewicz</dc:creator><description>Yes arvindsa I was surprised that they didn&amp;#39;t lock us out.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge?CommentId=ff15b213-cc44-4fa1-a507-6595c9cd3798</link><pubDate>Sat, 27 Jun 2026 18:22:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:ff15b213-cc44-4fa1-a507-6595c9cd3798</guid><dc:creator>DAB</dc:creator><description>Well done everyone, great projects.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge?CommentId=dab13785-62bf-4d8a-b616-237288c45af2</link><pubDate>Sat, 27 Jun 2026 05:45:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:dab13785-62bf-4d8a-b616-237288c45af2</guid><dc:creator>skruglewicz</dc:creator><description>Good job mate</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge?CommentId=9da53c05-98cb-4d3e-b965-38aad41b3f8e</link><pubDate>Sat, 27 Jun 2026 02:32:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:9da53c05-98cb-4d3e-b965-38aad41b3f8e</guid><dc:creator>arvindsa</dc:creator><description>Congratulations to all the winners saramic skruglewicz fyaocn misaz pandoramc Zhar_14</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge?CommentId=0df7b38a-57f3-44bb-86ba-86cee41905de</link><pubDate>Sat, 27 Jun 2026 01:53:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0df7b38a-57f3-44bb-86ba-86cee41905de</guid><dc:creator>Qbit</dc:creator><description>Congratulations to the winners! Excited to see your next build.</description></item><item><title>Blog Post: Winners Announcement | On The Line Design Challenge</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/news/posts/winners-announcement-on-the-line-design-challenge</link><pubDate>Fri, 26 Jun 2026 16:50:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:29bb7c4c-94b5-4805-9a28-b7d6a5c5e732</guid><dc:creator>JoRatcliffe</dc:creator><description>It is time to announce the winners of the On The Line Design Challenge! Let&amp;#39;s quickly remind ourselves of the challenge and its theme, the prizes, and then get straight into it. The Challenge For a chance at winning one of the prizes, Challengers had to use the provided kit to build a smart industry-themed project and blog the build process here on the community, showcasing the features of the kit components in the most innovative, creative ways possible. Prizes Prizes are subject to change but will be of similar price and style. Prize Prize Category First Place Prize First Place wins Multicomp Pro MP720013 MSO, 2+16+1 CH, 100MHZ, 3.5NS, 1GSPS (Approx. Value $1,106) Second Place Prize Second Place wins Multicomp Pro MP750511 WAVEFORM GENERATOR, 2CH, 60MHZ (Approx. Value $712) Third Place Prize Third Place wins Multicomp Pro MP3055 Bench Digital Multimeter, 5.5, RS232, RS485, USB, 10 A, 750 V, 100 Mohm (Approx. Value $573) Finisher Prize For anyone who completes their 5 forum posts and 1 project blog demonstrating their project. Multicomp Pro AC/DC Voltage Clamp Meter (Approx. Value $30) *Don&amp;#39;t worry if a prize is out of stock in your region or does not have the right plug for you. We can ship from global stocks, include a plug adaptor, or find a local equivalent of a prize. **Grand Prize and Runner Up winners will also earn the finisher prize. The Winners 1st Place Winner SolarSense In conjunction with their Masters Thesis, arvindsa created a predictive maintenance system which uses sensors to detect when solar panels need cleaning before their output drops by too much. 2nd Place Winner Green Brain saramic designed a smart greenhouse monitoring system built around Arduino Nano nodes, an Arduino UNO Q hub, and a Python Flask dashboard. 3rd Place Winner Industrial Line Sentinel (ILS) skruglewicz created the ILS to act as an intelligent safety system for industrial environments, helping enforce PPE compliance by monitoring for workers not wearing a safety vest, not wearing protective glasses, or workers walking into a dangerous &amp;#39;red zone&amp;#39;. Finisher Prize In no particular order Smart Ventilation Motor Monitoring System Project on Labview fyaocn designed an intelligent monitoring system for industrial ventilation motors, aiming to help avoid unexpected downtime and optimize maintenance cycles. Misaz’s Experiments with Industrial Sensors misaz conducted a number of experiments with the kit parts, show how to use them, how they work, how to use them for measurements and convert values back to real values, and much more besides. Chiller Temperature Monitoring for Electrochemical Processing pandoramc built a system for helping monitor and maintain the temperature in cooling systems such as those used in electrochemical processes like electropolishing, where high temperatures generated during the process could affect the quality of the final product. AIoT: Smart Active Dry Box &amp;amp; Print Farm Supervisor To solve the problem of degraded filament material quality in 3d print farms increasing print failure rates, Zhar_14 created a system combining an automated filament drying chamber for optimal filament quality and real-time monitoring to autonomously detect print failures using computer vision. Congratulations to our winners and finishers, I hope this makes for a good start to the weekend! These were really creative projects and I strongly recommend checking out every one of them! I will be helping ship prizes for this design challenge so drop me a message if you have any questions at all. Very well done to everyone who took part, commented, and discussed this challenge, and a big thanks also to the challenge&amp;#39;s sponsors: Analog Devices, Molex, Emerson | NI, and DwyerOmega.</description><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/design%2bchallenge">design challenge</category><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/On%2bthe%2bline%2bdesign%2bchallenge">On the line design challenge</category><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/e14_2D00_on_2D00_the_2D00_line">e14-on-the-line</category><category domain="https://community.element14.com/challenges-projects/design-challenges/on-the-line/tags/dc">dc</category></item><item><title>Blog Post: Smart Ventilation Motor Monitoring System Project on Labview</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/smart-ventilation-motor-monitoring-system-project-on-labview</link><pubDate>Wed, 24 Jun 2026 08:44:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:c6f2a5f5-cc38-4f23-b28c-e1b0f546f43e</guid><dc:creator>fyaocn</dc:creator><description>1 Full System Architecture 1.1 Low-cost distributed IMU motion sensing over industrial CAN bus, edge data forwarding to PC-side LabVIEW visualization &amp;amp; AI monitoring. The schedule is delayed totally since I misuse Arduino CAN library which support MCP2501 over SPI. I have to rebuild sustomized CAN library by GPIO simulation, although the Arduino Uno Q support CAN natively, but the port is not wiring out. The STM32U support high speed CANFD, which is perfect fit for MAX33040 shield. Fully custom CAN receiver stack on Uno Q demonstrate embedded low-level CAN protocol implementation, end-to-end industrial sensing pipeline for manufacturing line monitoring challenge. 1.2 Hardware Signal Flow MKR Board + MKR IMU Shield (LSM6DSOX 6-axis IMU: Accel X/Y/Z, Gyro X/Y/Z) ↓ I2C read by Platform2Go 4200 (edge CAN transmit node) ↓ CAN 2.0B Bus differential signal ↓ MAX33040 CAN Transceiver Shield (Arduino Uno Q) (custom self-written CAN receive library, no third-party CAN libs) ↓ Uno Q USB Serial UART ↓ NI-VISA Serial Read in LabVIEW VI ↓ LabVIEW: Data parse, real-time graph visualization, AI anomaly detection, data logging 1.3 BOM Component Function Platform2Go 4200 Transmit node: read MKR IMU, package IMU X/Y/Z data into CAN frames MKR IMU Shield Motion sensor source (Accel X,Y,Z float values) CAN Twisted Pair Cable Differential CAN bus wiring, 120Ω termination resistors at bus ends Arduino Uno Q Central receive node, custom MAX33040 CAN receiver stack MAX33040 CAN Transceiver Shield Physical layer CAN bus interface for Uno Q USB Cables Platform2Go 4200 power/debug; Uno Q USB to PC for VISA NI-VISA Driver + LabVIEW PC visualization, data analysis, AI detection 1.4CAN Bus Wiring: Platform2Go 4200 CAN_H -&amp;gt; MAX33040 CAN_H Platform2Go 4200 CAN_L -&amp;gt; MAX33040 CAN_L Common GND connection between all CAN nodes 120Ω resistor across CAN_H/CAN_L at Platform2Go 4200 and Uno Q bus endpoints over MAX33040 Shiel 2 Transmit Side – Platform2Go 4200 Workflow Platform2Go 4200 polls IMU via I2C, reads raw acceleration X/Y/Z , converts raw integer register values to engineering float units #include #include float x, y, z; void setup() { Serial.begin(9600); while (!Serial); if (!IMU.begin()) { Serial.println(&amp;quot;Failed to initialize IMU!&amp;quot;); while (1); } Serial.print(&amp;quot;Accelerometer sample rate = &amp;quot;); Serial.print(IMU.accelerationSampleRate()); Serial.println(&amp;quot; Hz and Acceleration in G&amp;#39;s &amp;quot;); Serial.println(&amp;quot;X\tY\tZ&amp;quot;); if (IMU.accelerationAvailable()) { IMU.readAcceleration(x, y, z); Serial.print(x); Serial.print(&amp;#39;\t&amp;#39;); Serial.print(y); Serial.print(&amp;#39;\t&amp;#39;); Serial.println(z); } Serial.println(&amp;quot;CAN Sender&amp;quot;); // start the CAN bus at 500 kbps if (!CAN.begin(500E3)) { Serial.println(&amp;quot;Starting CAN failed!&amp;quot;); while (1); } } void loop() { // send packet: id is 11 bits, packet can contain up to 8 bytes of data Serial.print(&amp;quot;Sending packet ... &amp;quot;); CAN.beginPacket(0x12); CAN.write(&amp;#39;h&amp;#39;); CAN.write(&amp;#39;e&amp;#39;); CAN.write(&amp;#39;l&amp;#39;); CAN.write(&amp;#39;l&amp;#39;); CAN.write(&amp;#39;o&amp;#39;); /************` if (IMU.accelerationAvailable()) { IMU.readAcceleration(x, y, z); CAN.write(&amp;amp;x,4); //Serial.print(&amp;#39;\t&amp;#39;); CAN.write(y); //Serial.print(&amp;#39;\t&amp;#39;); CAN.write(z); }*/ CAN.endPacket(); int packetSize = CAN.parsePacket(); if (packetSize) { // received a packet Serial.print(&amp;quot;Received &amp;quot;); } Serial.println(&amp;quot;done&amp;quot;); } The reading for x-y-z is output 3 Receive Side – Arduino Uno Q + MAX33040 Custom Self-Built CAN Library 3.1 Hardware Control Logic MAX33040D4 STB pin set HIGH on startup to exit low-power standby UART hardware pins D0(RX)/D1(TX) connect directly to MAX33040 differential CAN physical layer 3.2 The library with GPIＯpin simulation for CAN #include &amp;quot;MAX33040_CAN.h&amp;quot; // ============================================ // ============================================ static MAX33040_CAN* _instance = NULL; // ============================================ MAX33040_CAN::MAX33040_CAN(uint8_t txPin, uint8_t rxPin) : _txPin(txPin) , _rxPin(rxPin) , _speed(DEFAULT_CAN_SPEED) , _txState(CAN_STATE_IDLE) , _txActive(false) , _rxState(CAN_STATE_IDLE) , _rxReady(false) , _rxQueueHead(0) , _rxQueueTail(0) , _errorCount(0) { } // ============================================ bool MAX33040_CAN::begin(uint32_t speed) { _speed = speed; // 初始化引脚 pinMode(_txPin, OUTPUT); digitalWrite(_txPin, HIGH); // CAN recessive pinMode(_rxPin, INPUT); _instance = this; _txState = CAN_STATE_IDLE; _txActive = false; _rxState = CAN_STATE_IDLE; _rxReady = false; _rxQueueHead = 0; _rxQueueTail = 0; _errorCount = 0; attachInterrupt(CAN_RX_INT, []() { if (_instance) { _instance-&amp;gt;interruptHandler(); } }, CHANGE); return true; } // ============================================ uint8_t MAX33040_CAN::calcCRC(const CANFrame&amp;amp; frame) { uint16_t crc = 0; for (int i = 10; i &amp;gt;= 0; i--) { bool bit = (frame.id &amp;gt;&amp;gt; i) &amp;amp; 1; bool newBit = bit ^ ((crc &amp;gt;&amp;gt; 14) &amp;amp; 1); crc = (crc = 0; i--) { bool bit = (frame.dlc &amp;gt;&amp;gt; i) &amp;amp; 1; bool newBit = bit ^ ((crc &amp;gt;&amp;gt; 14) &amp;amp; 1); crc = (crc = 0; i--) { bool bit = (frame.data[j] &amp;gt;&amp;gt; i) &amp;amp; 1; bool newBit = bit ^ ((crc &amp;gt;&amp;gt; 14) &amp;amp; 1); crc = (crc &amp;gt; 7); } // ============================================ void MAX33040_CAN::txIdle() { digitalWrite(_txPin, HIGH); // Recessive } void MAX33040_CAN::txDominant() { digitalWrite(_txPin, LOW); // Dominant } void MAX33040_CAN::writeBit(bool bit) { if (bit) { txIdle(); } else { txDominant(); } } // ============================================ bool MAX33040_CAN::sendFrame(const CANFrame&amp;amp; frame) { if (_txActive) { return false; } _txFrame = frame; if (_txFrame.dlc &amp;gt; 8) _txFrame.dlc = 8; _txState = CAN_STATE_RECV_SOF; _txActive = true; _txBitCount = 0; _txByteIndex = 0; _txBitIndex = 0; _txStartTime = micros(); txDominant(); return true; } // ============================================ bool MAX33040_CAN::sendAccelData(const AccelData&amp;amp; accel) { CANFrame frame; frame.id = CAN_ID_ACCEL_DATA; frame.dlc = 12; uint8_t* px = (uint8_t*)&amp;amp;accel.x; uint8_t* py = (uint8_t*)&amp;amp;accel.y; uint8_t* pz = (uint8_t*)&amp;amp;accel.z; for (int i = 0; i _txBitCount) { bool txBit = HIGH; switch (_txState) { case CAN_STATE_RECV_SOF: { _txState = CAN_STATE_RECV_ID; _txBitCount++; _txBitIndex = 10; break; } case CAN_STATE_RECV_ID: { txBit = (_txFrame.id &amp;gt;&amp;gt; _txBitIndex) &amp;amp; 1; if (_txBitIndex == 0) { _txState = CAN_STATE_RECV_RTR; } _txBitIndex--; break; } case CAN_STATE_RECV_RTR: { _txState = CAN_STATE_RECV_DLC; _txBitIndex = 3; break; } case CAN_STATE_RECV_DLC: { txBit = (_txFrame.dlc &amp;gt;&amp;gt; _txBitIndex) &amp;amp; 1; if (_txBitIndex == 0) { _txState = CAN_STATE_RECV_DATA; _txByteIndex = 0; _txBitIndex = 7; } else { _txBitIndex--; } break; } case CAN_STATE_RECV_DATA: { if (_txByteIndex &amp;gt; _txBitIndex) &amp;amp; 1; if (_txBitIndex == 0) { _txByteIndex++; _txBitIndex = 7; if (_txByteIndex &amp;gt;= _txFrame.dlc) { _txState = CAN_STATE_RECV_CRC; _txBitIndex = 14; _crcAccum = calcCRC(_txFrame); } } else { _txBitIndex--; } } break; } case CAN_STATE_RECV_CRC: { txBit = (_crcAccum &amp;gt;&amp;gt; _txBitIndex) &amp;amp; 1; if (_txBitIndex == 0) { _txState = CAN_STATE_RECV_ACK; } else { _txBitIndex--; } break; } case CAN_STATE_RECV_ACK: { _txState = CAN_STATE_RECV_EOF; _txBitCount = 0; break; } case CAN_STATE_RECV_EOF: { _txState = CAN_STATE_IDLE; _txActive = false; txIdle(); return; } default: _txActive = false; txIdle(); return; } writeBit(txBit); _txBitCount++; } } // ============================================ void MAX33040_CAN::interruptHandler() { static uint32_t lastTime = 0; static uint8_t lastState = HIGH; uint32_t now = micros(); uint8_t currentState = digitalRead(_rxPin); if (currentState == lastState) return; uint32_t delta = now - lastTime; lastTime = now; lastState = currentState; uint32_t bitTime = 1000000UL / _speed; uint8_t bits = delta / bitTime; if (bits == 0) bits = 1; bool bit = (currentState == HIGH); static uint8_t bitBuffer[32]; static uint8_t bitIndex = 0; static bool inFrame = false; if (!inFrame &amp;amp;&amp;amp; !bit &amp;amp;&amp;amp; _rxState == CAN_STATE_IDLE) { inFrame = true; _rxState = CAN_STATE_RECV_ID; _rxBitCount = 1; _rxByteIndex = 0; _rxBitIndex = 10; bitIndex = 0; _crcAccum = 0; memset(&amp;amp;_rxFrame, 0, sizeof(_rxFrame)); return; } if (!inFrame) return; for (uint8_t i = 0; i = 11 + 1 + 4 + 8 * 8 + 15 + 2 + 7) { parseReceivedFrame(bitBuffer); inFrame = false; _rxState = CAN_STATE_IDLE; return; } } } void MAX33040_CAN::parseReceivedFrame(uint8_t* buffer) { uint8_t idx = 0; idx++; _rxFrame.id = 0; for (int i = 10; i &amp;gt;= 0; i--) { _rxFrame.id |= (buffer[idx++] &amp;amp; 1) = 0; i--) { _rxFrame.dlc |= (buffer[idx++] &amp;amp; 1) 8) _rxFrame.dlc = 8; for (uint8_t b = 0; b = 0; i--) { _rxFrame.data[b] |= (buffer[idx++] &amp;amp; 1) 0 String cleaning subVI: Strip \r\n line terminators IMU Serial String Parsing (Extract X/Y/Z Floats) String Split by comma delimiter → string array,ax,ay,az, Array index validation (array length =7 before conversion, reject broken partial frames) String-to-number conversion for 3 float outputs: ax,ay,az Graphical Visualization &amp;amp; AI Anomaly Detection Real-Time Waveform Chart: 6 trace curves (Accel X/Y/Z ), scrolling live motion plot Python AI integration (advanced) 5 Summary The Labview is perfect for industrial line supervision and the CAN is typical choice for industrial communication over Vehicles. All the kits is enough for this design, but misuse of port and library put off the progress. This is how the project proposed and how to implement the idea. There are still more to improve for the Industrial line in operation.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/green-brain---distributed-greenhouse-control-platform?CommentId=843a9b75-6a78-4cc0-8e56-48bb105ff953</link><pubDate>Wed, 24 Jun 2026 06:30:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:843a9b75-6a78-4cc0-8e56-48bb105ff953</guid><dc:creator>saramic</dc:creator><description>I need to look into adb - I am using my typical work flow then rsync-ing it across and running the start - load etc using the app-lab cli via ssh - all my sign in is via ssh keys so no login required - means just 1 script that said, I did have app lab open recently to look at the logs in their UI as I started to have too many terminal windows with remote ssh sessions and was starting to get lost (maybe I should TMUX but then I would really be lost)</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/green-brain---distributed-greenhouse-control-platform?CommentId=10061ac1-f723-4baa-abc6-eecf73e74ec8</link><pubDate>Wed, 24 Jun 2026 06:26:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:10061ac1-f723-4baa-abc6-eecf73e74ec8</guid><dc:creator>skruglewicz</dc:creator><description>Nice Interesting I&amp;#39;ll have give that a try when I get a chance ... Thanks</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/green-brain---distributed-greenhouse-control-platform?CommentId=78f58895-cda6-4bcb-8321-084a8a442fba</link><pubDate>Wed, 24 Jun 2026 06:13:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:78f58895-cda6-4bcb-8321-084a8a442fba</guid><dc:creator>arvindsa</dc:creator><description>I am compiling on my desktop running debian, pushing it to the ArduinoQ&amp;#39;s MPU via adb and using OpenOCD onboard the MPU to flash the STM32. I seriously wished they broke out the pins to program the STM32 without the MPU. but I guess Qualcomm wanted us to use the AppLab.</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/green-brain---distributed-greenhouse-control-platform?CommentId=47c46bcb-fa79-4239-823b-f96a331be6b3</link><pubDate>Wed, 24 Jun 2026 06:09:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:47c46bcb-fa79-4239-823b-f96a331be6b3</guid><dc:creator>skruglewicz</dc:creator><description>Nice OK via linux from the MPU side Debian or from your connected Host running linux</description></item><item><title /><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/green-brain---distributed-greenhouse-control-platform?CommentId=dbf6403d-85db-44dd-a86d-5c4cc7b1f56d</link><pubDate>Wed, 24 Jun 2026 06:05:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:dbf6403d-85db-44dd-a86d-5c4cc7b1f56d</guid><dc:creator>arvindsa</dc:creator><description>I am currently running the ArduinoQ without the bridge, flashing STM32 bare metal via linux. Not using Applab at all. Honestly, It gives me the usual workflow.</description></item></channel></rss>