<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/</id><updated>2021-12-04T10:07:48.289000Z</updated><subtitle>Recent posts to Serial communication</subtitle><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#b4ed/9030" rel="alternate"/><published>2021-12-04T10:07:48.289000Z</published><updated>2021-12-04T10:07:48.289000Z</updated><author><name>damian177</name><uri>https://forge.codesys.com/u/damian177/</uri></author><id>https://forge.codesys.com496a232ea205284d48fc75f9792281c6041d4a6a</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi, Where I can download AgavaLibraries ?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#b4ed" rel="alternate"/><published>2020-02-27T14:06:39.151000Z</published><updated>2020-02-27T14:06:39.151000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com3dff0a5de2bc113f949ff1eaa07c9fc4b703a87c</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; Viacheslav Mezentsev&lt;/p&gt;
&lt;p&gt;Yes, this code must be improved by adding processing of some special cases. You are right, the function block must be executed in a sufficiently fast separate task.&lt;/p&gt;
&lt;p&gt;You can try how it works. This code is part of the AgavaModbus library (see AgavaSDK package &lt;a class="" href="http://files.kb-agava.ru/index.php/s/DsxDv7ZgnIdHqKN" rel="nofollow"&gt;here&lt;/a&gt; - &lt;strong&gt;all docs in russian&lt;/strong&gt;). See example: Примеры\AgavaModbus\ПЛК-40\ST\ModbusRTUSlave.project . You must install AgavaLibraries.3.5.10.3.package first (for Codesys &amp;gt;= 3.5.10.x).&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#d01a" rel="alternate"/><published>2020-02-27T14:06:38.156000Z</published><updated>2020-02-27T14:06:38.156000Z</updated><author><name>ericci</name><uri>https://forge.codesys.com/u/ericci/</uri></author><id>https://forge.codesys.comab78c5bda2ac58004f1e10ed2a95750cfe179a42</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello Viacheslav,&lt;/p&gt;
&lt;p&gt;Thank you for your support and i hope this will clarify the matter in the future.&lt;br/&gt;
I suppose your code is good enough to implement such a modbus slave protocol provided that your receiving routine is much faster than the sending one (Master side), and you accept that a slave could loss some packet (rarely).&lt;br/&gt;
Last assertion is due to the fact that a slave could start to read a packet when master is transmitting one and if slave receives his address and a valid modbus command into the master's packet payload only final crc it avoid a wrong command reception.&lt;br/&gt;
Hope to be clear.   &lt;/p&gt;
&lt;p&gt;Those examples are common problem related to an asynchronous packet exchange although tomorrow i will try your snippet in my code.&lt;/p&gt;
&lt;p&gt;Regards&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#04a3" rel="alternate"/><published>2020-02-27T14:06:37.584000Z</published><updated>2020-02-27T14:06:37.584000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comc5bc27cef92930ce7bfef545d3214752dc9a5873</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; Viacheslav Mezentsev&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ericci hat geschrieben:&lt;/strong&gt;&lt;br/&gt;
and i don't know how to set a callback to a byte reception interrupt (for example)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is impossible for the codesys application (IRQ handling). This is normal for microcontrollers, but not for the user application in the Codesys RTS.&lt;/p&gt;
&lt;p&gt;But I can suggest you the following algorithm.&lt;/p&gt;
&lt;p&gt;And code example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt; Сервер &lt;span class="nv"&gt;Modbus&lt;/span&gt; &lt;span class="nv"&gt;RTU&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;slave&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;function_block&lt;/span&gt; &lt;span class="nv"&gt;TModbusRTUSlave&lt;/span&gt; &lt;span class="nv"&gt;implements&lt;/span&gt; &lt;span class="nv"&gt;ISerialSettings&lt;/span&gt;
&lt;span class="nv"&gt;var_input&lt;/span&gt;
   &lt;span class="nv"&gt;xEnable&lt;/span&gt;: &lt;span class="nv"&gt;bool&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;end_var&lt;/span&gt;
&lt;span class="nv"&gt;var_output&lt;/span&gt;
   &lt;span class="nv"&gt;xError&lt;/span&gt;: &lt;span class="nv"&gt;bool&lt;/span&gt;&lt;span class="c1"&gt;;   // ошибка&lt;/span&gt;
    &lt;span class="nv"&gt;resIEC&lt;/span&gt;: &lt;span class="nv"&gt;RTS_IEC_RESULT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;end_var&lt;/span&gt;
&lt;span class="nv"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt;
    &lt;span class="nv"&gt;MODE_IDLE&lt;/span&gt;:  &lt;span class="nv"&gt;byte&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;;&lt;/span&gt;
    &lt;span class="nv"&gt;MODE_OPEN&lt;/span&gt;:  &lt;span class="nv"&gt;byte&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;;&lt;/span&gt;
    &lt;span class="nv"&gt;MODE_SETUP&lt;/span&gt;: &lt;span class="nv"&gt;byte&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;MODE_CLOSE&lt;/span&gt;: &lt;span class="nv"&gt;byte&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;MODE_ERROR&lt;/span&gt;: &lt;span class="nv"&gt;byte&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;MODE_EVENT&lt;/span&gt;: &lt;span class="nv"&gt;byte&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="c1"&gt;;      &lt;/span&gt;
    &lt;span class="nv"&gt;MODE_WORK&lt;/span&gt;:  &lt;span class="nv"&gt;byte&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;MODE_CLEAR&lt;/span&gt;: &lt;span class="nv"&gt;byte&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
&lt;span class="nv"&gt;end_var&lt;/span&gt;
&lt;span class="nv"&gt;var&lt;/span&gt;
   &lt;span class="nv"&gt;_deviceId&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;_settings&lt;/span&gt;: &lt;span class="nv"&gt;COM_Settings&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_outData&lt;/span&gt;: &lt;span class="nv"&gt;TByteArray&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_inData&lt;/span&gt;: &lt;span class="nv"&gt;TByteArray&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
&lt;span class="nv"&gt;end_var&lt;/span&gt;
&lt;span class="nv"&gt;var&lt;/span&gt;
    &lt;span class="nv"&gt;bFound&lt;/span&gt;: &lt;span class="nv"&gt;bool&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;n&lt;/span&gt;, &lt;span class="nv"&gt;k&lt;/span&gt;, &lt;span class="nv"&gt;nfdReady&lt;/span&gt;, &lt;span class="nv"&gt;saSize&lt;/span&gt;: &lt;span class="nv"&gt;dint&lt;/span&gt;&lt;span class="c1"&gt;; &lt;/span&gt;
    &lt;span class="nv"&gt;nRecv&lt;/span&gt;: &lt;span class="nv"&gt;udint&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;mode&lt;/span&gt;: &lt;span class="nv"&gt;uint&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_IDLE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;rt&lt;/span&gt;: &lt;span class="nv"&gt;r_trig&lt;/span&gt;&lt;span class="c1"&gt;; &lt;/span&gt;
    &lt;span class="nv"&gt;ft&lt;/span&gt;: &lt;span class="nv"&gt;f_trig&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;result&lt;/span&gt;: &lt;span class="nv"&gt;RTS_IEC_RESULT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Errors&lt;/span&gt;.&lt;span class="nv"&gt;ERR_OK&lt;/span&gt;&lt;span class="c1"&gt;;    &lt;/span&gt;
    &lt;span class="nv"&gt;hListener&lt;/span&gt;: &lt;span class="nv"&gt;RTS_IEC_HANDLE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;pHeader&lt;/span&gt;: &lt;span class="nv"&gt;pointer&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;MBREQUESTHEADER&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;tmpbuf&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;255&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="o"&gt;//---------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;xEnable&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; 
   
   &lt;span class="nv"&gt;xError&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;;&lt;/span&gt;
    &lt;span class="nv"&gt;resIEC&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Errors&lt;/span&gt;.&lt;span class="nv"&gt;ERR_OK&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_IDLE&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;rt&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;clk&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;xEnable&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="nv"&gt;rt&lt;/span&gt;.&lt;span class="nv"&gt;q&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
   &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_OPEN&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;ft&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;clk&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;xEnable&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="nv"&gt;ft&lt;/span&gt;.&lt;span class="nv"&gt;q&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
   &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_CLOSE&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;case&lt;/span&gt; &lt;span class="nv"&gt;mode&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt;
      
   &lt;span class="nv"&gt;MODE_OPEN&lt;/span&gt;:
   
      &lt;span class="o"&gt;//&lt;/span&gt; Открываем устройство.
      &lt;span class="nv"&gt;hListener&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysComOpen&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;_settings&lt;/span&gt;.&lt;span class="nv"&gt;sPort&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;resIEC&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      
        &lt;span class="o"&gt;//&lt;/span&gt; Формирование флага ошибки.
        &lt;span class="nv"&gt;xError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;resIEC&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Errors&lt;/span&gt;.&lt;span class="nv"&gt;ERR_OK&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        
        &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;sel&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;xError&lt;/span&gt;, &lt;span class="nv"&gt;MODE_SETUP&lt;/span&gt;, &lt;span class="nv"&gt;MODE_ERROR&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        
      
    &lt;span class="nv"&gt;MODE_SETUP&lt;/span&gt;:
        &lt;span class="o"&gt;//&lt;/span&gt; Настраиваем устройство.
        &lt;span class="nv"&gt;resIEC&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysComSetSettings&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hCom&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt;, &lt;span class="nv"&gt;pSettings&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;_settings&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;_&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    
        &lt;span class="o"&gt;//&lt;/span&gt; Формирование флага ошибки.
        &lt;span class="nv"&gt;xError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;resIEC&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Errors&lt;/span&gt;.&lt;span class="nv"&gt;ERR_OK&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        
        &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;sel&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;xError&lt;/span&gt;, &lt;span class="nv"&gt;MODE_CLEAR&lt;/span&gt;, &lt;span class="nv"&gt;MODE_ERROR&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   
        
    &lt;span class="o"&gt;//&lt;/span&gt; Очистка приёмного буфера.
   &lt;span class="nv"&gt;MODE_CLEAR&lt;/span&gt;:
      &lt;span class="nv"&gt;_inData&lt;/span&gt;.&lt;span class="nv"&gt;Clear&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   
      &lt;span class="nb"&gt;result&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysComPurge&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      
      &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_EVENT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        
        
    &lt;span class="o"&gt;//&lt;/span&gt; Ожидание событий.
    &lt;span class="nv"&gt;MODE_EVENT&lt;/span&gt;:
        
      &lt;span class="nv"&gt;nRecv&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Receive&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt;, &lt;span class="nv"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;tmpbuf&lt;/span&gt;, &lt;span class="nb"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;result&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="nv"&gt;nRecv&lt;/span&gt; &lt;span class="o"&gt;&amp;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="nv"&gt;_inData&lt;/span&gt;.&lt;span class="nv"&gt;AddRange&lt;/span&gt;&lt;span class="ss"&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;tmpbuf&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;udint_to_uint&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;nRecv&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      
         &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_WORK&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         
      &lt;span class="nv"&gt;end_if&lt;/span&gt;
        
        
   &lt;span class="o"&gt;//&lt;/span&gt; Обработка запросов.
   &lt;span class="nv"&gt;MODE_WORK&lt;/span&gt;:
   
        &lt;span class="o"&gt;//&lt;/span&gt; Считываем данные.      
        &lt;span class="nv"&gt;nRecv&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Receive&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt;, &lt;span class="nv"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;tmpbuf&lt;/span&gt;, &lt;span class="nb"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;result&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="nb"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Errors&lt;/span&gt;.&lt;span class="nv"&gt;ERR_OK&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            
            &lt;span class="o"&gt;//&lt;/span&gt; Если есть данные.
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;nRecv&lt;/span&gt; &lt;span class="o"&gt;&amp;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="nv"&gt;_inData&lt;/span&gt;.&lt;span class="nv"&gt;AddRange&lt;/span&gt;&lt;span class="ss"&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;tmpbuf&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;udint_to_uint&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;nRecv&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            
            &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;_inData&lt;/span&gt;.&lt;span class="nv"&gt;Size&lt;/span&gt; &lt;span class="o"&gt;&amp;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;pHeader&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_inData&lt;/span&gt;.&lt;span class="nv"&gt;Bytes&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;pHeader&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;.&lt;span class="nv"&gt;StationAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_deviceId&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;OnReceive&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt;, &lt;span class="nv"&gt;_inData&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="k"&gt;else&lt;/span&gt;
                    
                    &lt;span class="nv"&gt;OnFailure&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;Errors&lt;/span&gt;.&lt;span class="nv"&gt;ERR_SIZE_MISMATCH&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;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_CLEAR&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                
            &lt;span class="nv"&gt;end_if&lt;/span&gt;
            
        &lt;span class="k"&gt;else&lt;/span&gt;
            
            &lt;span class="nv"&gt;OnFailure&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;result&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            
            &lt;span class="nv"&gt;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_CLEAR&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
            
        &lt;span class="nv"&gt;end_if&lt;/span&gt;                        
                               
   
   &lt;span class="o"&gt;//&lt;/span&gt; Закрываем устройство.
   &lt;span class="nv"&gt;MODE_CLOSE&lt;/span&gt;:
      
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;RTS_INVALID_HANDLE&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
      
         &lt;span class="nb"&gt;result&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysComClose&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hCom&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;hListener&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         
         &lt;span class="nv"&gt;hListener&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;RTS_INVALID_HANDLE&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;mode&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MODE_IDLE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
        
   &lt;span class="o"&gt;//&lt;/span&gt; Ошибка.
   &lt;span class="nv"&gt;MODE_ERROR&lt;/span&gt;: &lt;span class="c1"&gt;;&lt;/span&gt;
 
    &lt;span class="nv"&gt;MODE_IDLE&lt;/span&gt;: &lt;span class="c1"&gt;;&lt;/span&gt;
    
&lt;span class="nv"&gt;end_case&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;img alt="IMG: 2018" rel="nofollow" src="https://forum.codesys.com//download/file.php?id=3611"/&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#0435" rel="alternate"/><published>2020-02-27T14:06:37.155000Z</published><updated>2020-02-27T14:06:37.155000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com4f073f5228195b65f2b7603cf6d15e70809c8b5b</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; ph0010421&lt;/p&gt;
&lt;p&gt;Hello Enrico&lt;br/&gt;
I'm interested to discuss things like this.&lt;br/&gt;
My understanding is the serial buffer is filled asynchronously, so the rate that the Read fb is executed doesn't matter.&lt;br/&gt;
As long as the szBuffer is larger than the maximum number of characters that can be received between executing then it's reliable.&lt;br/&gt;
The fb's reliability is based on an extended stress test.&lt;/p&gt;
&lt;p&gt;The szSize is sometimes more than 1; ie multiple characters were received in 1 scan.&lt;/p&gt;
&lt;p&gt;Best wishes&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#75a3" rel="alternate"/><published>2020-02-27T14:06:36.856000Z</published><updated>2020-02-27T14:06:36.856000Z</updated><author><name>ericci</name><uri>https://forge.codesys.com/u/ericci/</uri></author><id>https://forge.codesys.com33f6bceaed2226eb2097394bb7f2a2d32338b65e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I'm interested in understanding if there exist some chance to write code for an event driven task. In this case the event would be byte received from com port.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#1d29" rel="alternate"/><published>2020-02-27T14:06:35.954000Z</published><updated>2020-02-27T14:06:35.954000Z</updated><author><name>ericci</name><uri>https://forge.codesys.com/u/ericci/</uri></author><id>https://forge.codesys.comdab1127ef7e54ae1461c96d06d102da7a83f750a</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello pp,&lt;br/&gt;
I don't believe your snippet is 100% reliable for the reason that your fb is executed at a known fixed rate and for one cycle it isn't in executing state at least. I'm could be wrong if function and fb behind COM.read continuously listen for a packet and isn't driven by argument parameter 'execute'.&lt;br/&gt;
In facts i would like to ask to everyone where i can find detailed documentation of 'Model behaviour library' and 'job executing library' that Com library it depends?&lt;/p&gt;
&lt;p&gt;Thank you,&lt;br/&gt;
Enrico&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#4d9e" rel="alternate"/><published>2020-02-27T14:06:35.613000Z</published><updated>2020-02-27T14:06:35.613000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com2bcb8ce3de6ee8cf3e9a8eb0a229252937a4882d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; ph0010421&lt;/p&gt;
&lt;p&gt;Hello&lt;br/&gt;
There may be a better answer, but I execute the COM.Read FB like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;fbiComRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;xExecute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;fbiComRead&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xDone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;hCom&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;pBuffer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JunkString&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;szBuffer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And concatenate the received string using ```&lt;/p&gt;
&lt;p&gt;fbiComRead.szSize&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;
&lt;p&gt;I've written my own FB to build the final string (and look for a termination character) if you want it?&lt;/p&gt;
&lt;p&gt;I've used this method with devices that  send serial data (115K2) and it's reliable.&lt;br/&gt;
Pp&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Serial communication</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/18b6386c70/?limit=25#142b" rel="alternate"/><published>2020-02-27T14:06:35.309000Z</published><updated>2020-02-27T14:06:35.309000Z</updated><author><name>ericci</name><uri>https://forge.codesys.com/u/ericci/</uri></author><id>https://forge.codesys.com40370600fda2ab998ebe9543c635ecd4c5a75c5b</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi all!&lt;/p&gt;
&lt;p&gt;I need to establish a serial communication (UART) with my own board that talks a proprietary protocol and i must configure PC side codesys application as a slave i.e. always listening for a command and send back an acknowledge message. The communication hasn't any flow control.&lt;br/&gt;
After readings and studying '' '' i've got stuck into the reception of unknown number of bytes from the peripheral due to the asynchronous way to transmit data with UART.&lt;br/&gt;
As my PRG it execute reading and writing routines at a fixed rate and i don't know how to set a callback to a byte reception interrupt (for example) or manage any kind of circular buffer (avoiding loss of data and) i'm asking to the community if someone faced the problem in the past and if there exist some example to be shared.&lt;br/&gt;
I'm even thinking of using python scripting but i preferred to ask you before.&lt;/p&gt;
&lt;p&gt;I think that a solution could be found out because of Modbus RTU protocol support.&lt;/p&gt;
&lt;p&gt;Can you help me?&lt;/p&gt;
&lt;p&gt;Regards &lt;/p&gt;&lt;/div&gt;</summary></entry></feed>