<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to IO-Link IOL_CALL returns done_valid = false</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/10ea5368fc/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/10ea5368fc/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/10ea5368fc/</id><updated>2020-02-27T14:36:35.179000Z</updated><subtitle>Recent posts to IO-Link IOL_CALL returns done_valid = false</subtitle><entry><title>IO-Link IOL_CALL returns done_valid = false</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/10ea5368fc/?limit=25#7a65" rel="alternate"/><published>2020-02-27T14:36:35.179000Z</published><updated>2020-02-27T14:36:35.179000Z</updated><author><name>raydodo</name><uri>https://forge.codesys.com/u/raydodo/</uri></author><id>https://forge.codesys.comc940988d50bb60e6a67e6415417480acce9a6e2e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello all&lt;/p&gt;
&lt;p&gt;I have a Kunbus RevPi Core3 running a Profinet controller with various IO-Link devices attached. I can access process data without issue. The following code works fine for an acyclic call:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PROGRAM&lt;/span&gt; &lt;span class="nv"&gt;PLC_PRG&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
    &lt;span class="nv"&gt;al_read&lt;/span&gt; : &lt;span class="nv"&gt;ProfinetCommon&lt;/span&gt;.&lt;span class="nv"&gt;IOL_CALL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;err&lt;/span&gt; : &lt;span class="nv"&gt;ProfinetCommon&lt;/span&gt;.&lt;span class="nv"&gt;IOL_Error&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;convert&lt;/span&gt;: &lt;span class="nv"&gt;U_BYTES_TO_REAL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;setpoint&lt;/span&gt;:&lt;span class="nv"&gt;REAL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   
   &lt;span class="nv"&gt;aDataIn&lt;/span&gt; : &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;..&lt;span class="mi"&gt;3&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;elec&lt;/span&gt;.&lt;span class="nv"&gt;PNIOStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; 
      &lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;execution&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt; &lt;span class="nv"&gt;setting&lt;/span&gt; &lt;span class="nv"&gt;REQ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;REQ&lt;/span&gt;    :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;  &lt;/span&gt;
      
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;ID&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;elec&lt;/span&gt;.&lt;span class="nv"&gt;GetID&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;, &lt;span class="mi"&gt;1&lt;/span&gt;, &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;        // ID of IO-Link Master&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;CAP&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;#&lt;span class="nv"&gt;B400&lt;/span&gt;&lt;span class="c1"&gt;;                     // Fix for Ed. 2 devices. For legacy devices get value from vendor's documentation or use CommFB.RDREC for reading out IOL-M directory data (RDREC.Index = 0xB063)&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;Port&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;                          // IO-Link device is plugged in Port 1&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;RD_WR&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;                     // Read data&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;IOL_Index&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="c1"&gt;;                    // IOL-Index = 20 means 'Product Text', this will result in something like 'Laser Sensor'&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;IOL_Subindex&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;                  // 0 = read complete data-item&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;LEN&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;IOL_Data&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;aDataIn&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;       // an ARRAY[] OF BYTE will be returned&lt;/span&gt;
      
      &lt;span class="nv"&gt;al_read&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;ERROR&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;STATUS&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Profinet&lt;/span&gt; &lt;span class="nv"&gt;Communication&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Error&lt;/span&gt;
            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;e&lt;/span&gt;.&lt;span class="nv"&gt;g&lt;/span&gt;. &lt;span class="nv"&gt;DF80A100&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;PNIORW&lt;/span&gt;, &lt;span class="nv"&gt;application&lt;/span&gt;: &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;will&lt;/span&gt; &lt;span class="nv"&gt;be&lt;/span&gt; &lt;span class="nv"&gt;returned&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;wrong&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ID&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;submodule&lt;/span&gt; &lt;span class="nv"&gt;identifier&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;used&lt;/span&gt; &lt;span class="nv"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;target&lt;/span&gt;
         &lt;span class="k"&gt;ELSE&lt;/span&gt;
            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;get&lt;/span&gt; &lt;span class="nv"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Link&lt;/span&gt; &lt;span class="nv"&gt;related&lt;/span&gt; &lt;span class="nv"&gt;error&lt;/span&gt;:
            &lt;span class="nv"&gt;err&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ProfinetCommon&lt;/span&gt;.&lt;span class="nv"&gt;DECODE_IOL_STATUS&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;IOL_STATUS&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;END_IF&lt;/span&gt;
      &lt;span class="nv"&gt;ELSIF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;DONE_VALID&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;setpoint&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;BytesToReal&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;aDataIn&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;], &lt;span class="nv"&gt;aDataIn&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;], &lt;span class="nv"&gt;aDataIn&lt;/span&gt;[&lt;span class="mi"&gt;2&lt;/span&gt;], &lt;span class="nv"&gt;aDataIn&lt;/span&gt;[&lt;span class="mi"&gt;3&lt;/span&gt;]&lt;span class="ss"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;;   &lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
      &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;REQ&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;al_read&lt;/span&gt;.&lt;span class="nv"&gt;BUSY&lt;/span&gt;&lt;span class="c1"&gt;;        //reset REQ, we need just one execution&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;However, as soon as I split this out into a function block with a ReadAsync private method, accessed through an instance set up in the GVL, the call runs, there are no IOL_CALL.ERROR issues, but IOL_CALL.DONE_VALID is never TRUE. So I can't get any data back. I have attached a file highlighting the issue.&lt;/p&gt;
&lt;p&gt;So, I think my GoogleFu is failing me, but how can I debug the DONE_VALID response? I don't know what is causing the problem. I am creating a struct / function block class for every IO-Link device.&lt;/p&gt;
&lt;p&gt;Thanks for any links / suggestions&lt;/p&gt;
&lt;p&gt;Regards&lt;/p&gt;
&lt;p&gt;Ray&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="https://forum.codesys.com//download/file.php?id=4904" rel="nofollow"&gt;testbed_rebuild.project &lt;span&gt;&lt;span&gt;[259.94 KiB]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>