<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=47&amp;t=17264&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-01-18T11:44:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=17264&amp;mode</id>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-18T11:44:53+01:00</updated>
<published>2017-01-18T11:44:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=180127#p180127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=180127#p180127"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=180127#p180127"><![CDATA[
Dla potomnych <br />Więc biblioteka SimpleModbusSlave.h obsługuje funkcje F16 oraz liczby ujemne... ale w głównym programie należy sobie zmienić z  unsigned int holdingRegs[HOLDING_REGS_SIZE]; na int holdingRegs[HOLDING_REGS_SIZE];<br /><br />Ale co do wyświetlania po przecinku to mam pytanie bo chce przesłać liczbę -22,22 to chciałem zrobić w ten sposób że mnożę x100 i mam -2222 którą wysyłam po modbasie ale jest problem z odwroceniem<br />[syntax=c]int x = holdingRegs&#91;reg1_VAL&#93;;<br />int y = x/100;<br />int z = x%100;<br />tft.print(y); tft.print(&quot;.&quot;); tft.print(z); tft.print(&quot;    &quot;);[/syntax]<br /><br />bo jest problem ze znakiem &quot;-&quot; który pojawia się w całości i reszcie <br /><br />a może jest inny sposób na zrobienie tego??<br /><br />Mam jeszcze jedno pytanie odnośnie komendy modbus_update(); <br />Mimo że nie wysyłam nic po modbus-sie to on wyświetla ostatnią zapamiętaną wartość jak sie tego pozbyć?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 18 sty 2017, o 11:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-12T21:34:01+01:00</updated>
<published>2017-01-12T21:34:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179731#p179731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179731#p179731"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179731#p179731"><![CDATA[
No i fajnie, że działa. Musi działać. Modbus jest fajny. <br /><br />F16 i liczby ujemne to już z górki<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 12 sty 2017, o 21:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-12T21:23:48+01:00</updated>
<published>2017-01-12T21:23:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179728#p179728</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179728#p179728"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179728#p179728"><![CDATA[
Co do zmiany adresu miałeś rację  ale trochę inny miał być a wynika to z tego...<br /><br /> <br /><br />Read Holding Registers (FC=03)<br /><br />Request<br /><br />This command is requesting the content of analog output holding registers # 40108 to<br /> 40110 from the slave device with address 17.<br /><br />11 03 006B 0003 7687<br /><br />11: The Slave Address (11 hex = address17 )<br />03: The Function Code 3 (read Analog Output Holding Registers)<br />006B: The Data Address of the first register requested.<br />             ( 006B hex = 107 , + 40001 offset = input #40108 )<br />0003: The total number of registers requested. (read 3 registers 40108 to 40110)  <br />7687: The CRC (cyclic redundancy check) for error checking.<br /><br />Response<br /><br />11 03 06 AE41 5652 4340 49AD<br /><br />11: The Slave Address (11 hex = address17 )<br />03: The Function Code 3 (read Analog Output Holding Registers)<br />06: The number of data bytes to follow (3 registers x 2 bytes each = 6 bytes)<br />AE41: The contents of register 40108<br />5652: The contents of register 40109 <br />4340: The contents of register 40110<br />49AD: The CRC (cyclic redundancy check).<br /><br /><br />A działający kod wygląda tak:  <br /><br />[syntax=c]//wyswietlacz<br />#include &lt;LiquidCrystal.h&gt;<br /><br />//modbus<br />#include &lt;modbus.h&gt;<br />#include &lt;modbusDevice.h&gt;<br />#include &lt;modbusRegBank.h&gt;<br />#include &lt;modbusSlave.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />//dotyczy obslugi modbus<br />modbusDevice regBank;<br />modbusSlave slave;<br /><br /><br />// piny wyswietlacza LCD<br />LiquidCrystal lcd(8, 9, 4, 5, 6, 7);<br /><br /><br />void setup()<br />{<br /> regBank.setId(10); // ID slave 10<br /> <br /> regBank.add(40002);  //adres 1 w programie nalezy ustawic slave=10 ,function= 06 write single register, adres=1<br /> regBank.add(40001);  //adres 0<br /> <br /> slave._device = &amp;regBank;  <br /> slave.setBaud(9600);  //predkosc transmisji danych 9600.8.N.1<br /> <br /> lcd.begin(16, 2);              // wyswietlacz 16x2<br /> lcd.print (&quot;Modbus LCD slave&quot;);<br /> <br /> lcd.clear();<br /> <br />}<br /> <br />void loop()<br />{<br /> <br />lcd.setCursor(0,0);            <br />lcd.print(&quot;40002 &quot;) ;  lcd.print(regBank.get(40002)); lcd.print(&quot;     &quot;);  //slave 10 , adres 1<br />lcd.setCursor(0,1);<br />lcd.print(&quot;40001 &quot;);  lcd.print(regBank.get(40001)); lcd.print(&quot;     &quot;);  //slave 10,adres 0 <br />  <br />  delay(100);<br />  slave.run(); <br />   <br /> <br />}[/syntax]<br /><br />Dzięki wielkie za pomoc !!!!  a teraz muszę się pobawić w liczby ujemne i z funkcja 16 write multiple register<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 12 sty 2017, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-10T09:26:39+01:00</updated>
<published>2017-01-10T09:26:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179541#p179541</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179541#p179541"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179541#p179541"><![CDATA[
Masz rację co do adresu ale jego dopiero sprawdzę w piątek jak wrócę z delegacji i na pewno dam znać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 10 sty 2017, o 09:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-09T21:32:46+01:00</updated>
<published>2017-01-09T21:32:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179500#p179500</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179500#p179500"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179500#p179500"><![CDATA[
Troche jaśniej please bo zaczynam się gubić. <br /><br />Wyswietla ale co? Tak jak Ci pisałem po wpisie przez regBank.set tak? i wyswietla wartosć taką jaką wpisujesz? Wyswietlasz przez lcd.print(regBank.get())??<br /><br /><br />-----------------------<br /><br />teraz mnie oswieciło. Rejestry 3xxxx to tzw Input registers. Holding Registers to 1xxxx chyba.<br />W C można sobie przypisywać dowolne zakresy. W arduino chyba jest na stałe o ile dobrze widzę. Jeżeli tak jest to do InputRegisters nie możesz nic zapisać z poziomu magistrali.  Rejestry te przechowują dane otrzymane bezposrednio w module czyli czujniki itp. Możesz je odpytać ale nie zapisać do nich. Nie wiem czy nie powinienes dostać odpowiedź z kodem błędu illegal operation ale może w arduino nie ma tak. sprobuj zapisac do np.:<br />regBank.set(10001,100)<br />i wyswiel=tlic na lcd:<br />lcd.print(regBank.get(10001))<br /><br />daj znac co sie dzieje<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 9 sty 2017, o 21:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-09T15:58:46+01:00</updated>
<published>2017-01-09T15:58:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179472#p179472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179472#p179472"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179472#p179472"><![CDATA[
Tak wyświetla, ale dalej szukam miejsca gdzie te dane przychodzą... i nie potrafię znaleźć<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 9 sty 2017, o 15:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-09T09:14:10+01:00</updated>
<published>2017-01-09T09:14:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179441#p179441</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179441#p179441"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179441#p179441"><![CDATA[
Kurczaki....<br />Jak dostajesz odpowiedź taką samą, znaczy, że slave przyjął dane i tak włąśnie to potwierdza. Ramka też jest prawidłowa<br />0A 06 75 32 00 6F 73 5E<br /><br />0A - adres slave'a w hex 10<br />06 - funkcja Write Single Reg<br />75 32 - adres rejestru w hex 30002<br />00 6F -  2x8bit wartości -  6f czyli 111<br />73 5E - CRC<br />----------------------<br />czyli komunikacja jest ok. Teraz trzeba poszukać dlaczego nie wyświetla. Na początku spróbuj na sztywno ustawić ten rejestr przez<br />regBank.set(30002,111); przed pętlą while, najlepiej zaraz po inicjalizacji modbusa i rejestrów<br />zoczacz czy wyświetli.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 9 sty 2017, o 09:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-09T06:18:43+01:00</updated>
<published>2017-01-09T06:18:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179440#p179440</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179440#p179440"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179440#p179440"><![CDATA[
Wiec wyświetla cały czas &quot;0&quot; a jak w programie modbus poll wysyłam jakąś liczbę to w tej samej sekundzie dostaje odpowiedz o takiej samej treści jak zapytanie .<br /><a href="https://obrazkiforum.atnel.pl/1442/bb62f032fcc2412a3641d0fbdaa1abf7.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1442/bb62f032fcc2412a3641d0fbdaa1abf7.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 9 sty 2017, o 06:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-08T21:07:31+01:00</updated>
<published>2017-01-08T21:07:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179423#p179423</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179423#p179423"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179423#p179423"><![CDATA[
a funkcja lcd.print wyświetla co? wszystko?? czy czasem nie tylko stringi??<br /><br />jak nie działa?? nie kompiluje się?? nic nie wyswietla? wyswietla 0?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 8 sty 2017, o 21:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-08T20:51:44+01:00</updated>
<published>2017-01-08T20:51:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179421#p179421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179421#p179421"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179421#p179421"><![CDATA[
Zrobiłem jak napisałeś chyba.... <br />[syntax=c]//wyswietlacz<br />#include &lt;LiquidCrystal.h&gt;<br /><br />//modbus<br />#include &lt;modbus.h&gt;<br />#include &lt;modbusDevice.h&gt;<br />#include &lt;modbusRegBank.h&gt;<br />#include &lt;modbusSlave.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />//dotyczy obslugi modbus<br />modbusDevice regBank;<br />modbusSlave slave;<br /><br /><br />// piny wyswietlacza LCD<br />LiquidCrystal lcd(8, 9, 4, 5, 6, 7);<br /><br /><br />void setup()<br />{<br /> regBank.setId(10); // ID slave 10<br /> //regBank.add(30001); //tu wpisze wartosc temp z ds18b20_1 WAZNE odczyt ma byc int16 w plc<br /> regBank.add(30002); //tu wpisze wartosc temp z ds18b20_2 WAZNE odczyt ma byc int16 w plc<br /><br /> <br /> slave._device = &amp;regBank;  <br /> slave.setBaud(9600);  //predkosc transmisji danych 9600.8.N.1<br /> <br /> lcd.begin(16, 2);              // wyswietlacz 16x2<br /> lcd.print (&quot;Modbus LCD slave&quot;);<br /> <br /> <br />}<br /> <br />void loop()<br />{<br />  <br />//regBank.set(30002);<br />lcd.setCursor(0,1);            <br />lcd.print(&quot;wart 30002 &quot;) ,  lcd.print(regBank.get(30002));<br />  <br />  <br />  delay(100);<br />  slave.run(); <br />   <br /> <br />}[/syntax]<br /><br />ale funkcja regBank.set(30002); nie dziala<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 8 sty 2017, o 20:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-08T19:59:30+01:00</updated>
<published>2017-01-08T19:59:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179416#p179416</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179416#p179416"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179416#p179416"><![CDATA[
Jak master (PLC lub komputer) wyśle dane i nie dostanie odpowiedzi z błędem ani timeouta, możesz śmiało założyć, że dane dotarły do modułu i ten je poprawnie odebrał. Połowa roboty za Tobą. Załóżmy, że wysyłasz dane do adresów - Temp1 do 30001, Temp2 do 30002. W module z wyświetlaczem nie msz czujników temperatury, więc te adresy są wolne i możesz ich użyć prawda?<br /><br />I teraz kolej na Ciebie. Dane trafiają do tablicy modbusa, którą na pewno gdzieś definiowałeś i podawałeś jej rozmiar oraz adres początkowy. U Ciebie adresy zaczynają się od 0 czyli to co zapiszesz pod adres 30001 trafi do procesora pod element [01] w Twojej tablicy.<br /><br /><strong><span style="font-size: 150%; line-height: normal">Nie znam arduino</span></strong> jak już pisałem, ale szukałbym tutaj:<br /><br />[syntax=c]word modbusRegBank::get(word addr)<br />{<br />        if(addr &lt; 20000)<br />        {<br />                modbusDigReg * regPtr;<br />                regPtr = (modbusDigReg *) this-&gt;search(addr);<br />                if(regPtr)<br />                        return(regPtr-&gt;value);<br />                else<br />                        return(NULL);  <br />        }<br />        else<br />        {<br />                modbusAnaReg * regPtr;<br />                regPtr = (modbusAnaReg *) this-&gt;search(addr);<br />                if(regPtr)<br />                        return(regPtr-&gt;value);<br />                else<br />                        return(NULL);  <br />        }<br />}[/syntax]<br />domyślam się, że to:<br />[syntax=c]regBank.add(30001)[/syntax] rezerwuje miejsce na dane a to<br />[syntax=c]regBank.set(30001,xxxdanexxx)[/syntax]zapisuje dane do konkretnej komórki pamięci.<br /><br />zauważ, że funkcja regBank.get() zwraca wynik w postaci uint16t<br /><br />spróbuj czegoś w stylu: LCD_long(regBank.get(30001));<br />Nie wiemy do teraz jakiego lcd używasz ale to nie istotne. pamiętaj, że wyświetlasz danle 16-to bitowe.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 8 sty 2017, o 19:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-08T19:15:31+01:00</updated>
<published>2017-01-08T19:15:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179413#p179413</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179413#p179413"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179413#p179413"><![CDATA[
Tak działa wysyłanie temperatury do komputera  <br /><a href="https://obrazkiforum.atnel.pl/1442/53a90440ed5516fb0ce1cd3f537c4f23.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1442/53a90440ed5516fb0ce1cd3f537c4f23.jpg" alt="Obrazek" /></a><br /><br />Zrobiłem też twoim programem ale na innych ustawieniach bo tak dziwactwa wysyłał <br /><a href="https://obrazkiforum.atnel.pl/1442/7947221b97c1da5b55d911e4f0ddbfe4.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1442/7947221b97c1da5b55d911e4f0ddbfe4.jpg" alt="Obrazek" /></a><br /><br />Co do drugiej części to za bardzo nie wiem jak wyświetlić te dane na wyświetlaczu bo wyśle ale jak je odebrać i wyświetlić ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 8 sty 2017, o 19:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-08T17:41:52+01:00</updated>
<published>2017-01-08T17:41:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179407#p179407</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179407#p179407"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179407#p179407"><![CDATA[
A spróbuj inaczej. Ściągnij sobie program np. modbus poll i podepnij się rs'em pod Twoje arduino z wgranym wsadem. Może być nawet Twój moduł, który już działa ten od temperatur. W programie na komputerze odpytuj moduł o temperatury i zobacz czy odpowiada. <br />w modbus poll wduś:<br /><a href="https://obrazkiforum.atnel.pl/4850/33fe61cb6fc63b0d29369d22ca7b5af6.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/4850/33fe61cb6fc63b0d29369d22ca7b5af6.jpg" alt="Obrazek" /></a><br />i w okienku, które się ukażeustaw:<br /> slave ID 10, funkcja 03, adress 3000, quantity 2.<br /><a href="https://obrazkiforum.atnel.pl/4850/0a25375e56932dddfa35620d722bbc7a.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/4850/0a25375e56932dddfa35620d722bbc7a.png" alt="Obrazek" /></a><br />Jeżeli działa Tobie modbus tak jak pisałeś w 1 poście, powinieneś uzyskać komunikację z modułem i otrzymywać temperatury w komputerze.<br /><br /><br />Jak zadziała, miożesz iść dalej:<br />Wybierz funkcję 06<br /><a href="https://obrazkiforum.atnel.pl/4850/4dea68d1869d1293fdc20f55daf1e1e4.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/4850/4dea68d1869d1293fdc20f55daf1e1e4.jpg" alt="Obrazek" /></a><br />i w okienku ustaw swoje parametry:<br /><a href="https://obrazkiforum.atnel.pl/4850/78d20b5ecd90817e5be310ba59181002.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/4850/78d20b5ecd90817e5be310ba59181002.png" alt="Obrazek" /></a><br />zobacz czy program wysyła dane do modułu i nie ma błędów.<br /><br />Da Ci to obraz, czy Twój moduł obsługuje F06,16.<br /><br />Jak bedzie ok, pójdziemy dalej<br /><br />Oczywiście pamiętaj o ustawieniu parametrów RS w programie zgodnie z Twoim modułem<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 8 sty 2017, o 17:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-08T17:02:33+01:00</updated>
<published>2017-01-08T17:02:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179403#p179403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179403#p179403"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179403#p179403"><![CDATA[
Tak wiem ze slave nie poprosi o dane z mastera ale może wyłapywać dane jakie master wysyła i z tym mam problem.<br />Z wyświetlaniem nie ma problemów tylko nie wiem skąd mam je pobrać ;-(<br />Co do języka C hmmm kilka razy próbowałem ale dla mnie to jest sklep Torebkami i damskimi butami... po prostu nie wiem o co w tym chodzi ;p<br /><br />modbus.h<br />[syntax=c]#include &lt;stdint.h&gt;<br />#ifndef _MODBUSPROTOCOL<br />#define _MODBUSPROTOCOL<br /><br />//Maximum device list for network<br />#define DEVMAX10<br />//Maximum control register que size<br />#define QUEMAX10<br />//Maximum serial wait in micro seconds<br />#define SERIALMAXDELAY100<br />#define SERIALBAUD9600<br />//the total silence time needed to signify an EOM or SOM in RTU mode<br /><br />//Modbus function codes<br />#define READ_DO 0x01<br />#define READ_DI0x02<br />#define READ_AO 0x03<br />#define READ_AI0x04<br /><br />#define WRITE_DO0x05<br />#define WRITE_AO0x06<br /><br />#define RTU 0x01<br />#define ASCII0x02<br /><br />#define MASTER0x01<br />#define SLAVE0x02<br /><br />#define DO0x00<br />#define DI0x01<br />#define AI0x03<br />#define AO0x04<br /><br />#endif[/syntax]<br /><br /><br />modbusDevice.ccp<br />[syntax=c]#include &lt;modbusDevice.h&gt;<br /><br />modbusDevice::modbusDevice(void)<br />{<br />_id=NULL;<br />}<br /><br />void modbusDevice::setId(byte id)<br />{<br />_id=id;<br />}<br /><br />byte modbusDevice::getId(void)<br />{<br />return(_id);<br />}[/syntax]<br /><br />modbusDevice.h<br />[syntax=c]#include &lt;modbusDevice.h&gt;<br /><br />modbusDevice::modbusDevice(void)<br />{<br />_id=NULL;<br />}<br /><br />void modbusDevice::setId(byte id)<br />{<br />_id=id;<br />}<br /><br />byte modbusDevice::getId(void)<br />{<br />return(_id);<br />}[/syntax]<br /><br />modbusRegBank.ccp<br />[syntax=c]#include &lt;modbusRegBank.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />modbusRegBank::modbusRegBank(void)<br />{<br />_digRegs= 0;<br />_lastDigReg= 0;<br />_anaRegs= 0;<br />_lastAnaReg= 0;<br />}<br /><br /><br />void modbusRegBank::add(word addr)<br />{<br />if(addr&lt;20000)<br />{<br />modbusDigReg *temp;<br /><br />temp = (modbusDigReg *) malloc(sizeof(modbusDigReg));<br />temp-&gt;address = addr;<br />temp-&gt;value= 0;<br />temp-&gt;next= 0;<br /><br />if(_digRegs == 0)<br />{<br />_digRegs = temp;<br />_lastDigReg = _digRegs;<br />}<br />else<br />{<br />//Assign the last register's next pointer to temp;<br />_lastDigReg-&gt;next = temp;<br />//then make temp the last register in the list.<br />_lastDigReg = temp;<br />}<br />}<br />else<br />{<br />modbusAnaReg *temp;<br /><br />temp = (modbusAnaReg *) malloc(sizeof(modbusAnaReg));<br />temp-&gt;address = addr;<br />temp-&gt;value = 0;<br />temp-&gt;next = 0;<br /><br />if(_anaRegs == 0)<br />{<br />_anaRegs = temp;<br />_lastAnaReg = _anaRegs;<br />}<br />else<br />{<br />_lastAnaReg-&gt;next = temp;<br />_lastAnaReg = temp;<br />}<br />}<br />}<br /><br />word modbusRegBank::get(word addr)<br />{<br />if(addr &lt; 20000)<br />{<br />modbusDigReg * regPtr;<br />regPtr = (modbusDigReg *) this-&gt;search(addr);<br />if(regPtr)<br />return(regPtr-&gt;value);<br />else<br />return(NULL);<br />}<br />else<br />{<br />modbusAnaReg * regPtr;<br />regPtr = (modbusAnaReg *) this-&gt;search(addr);<br />if(regPtr)<br />return(regPtr-&gt;value);<br />else<br />return(NULL);<br />}<br />}<br /><br />void modbusRegBank::set(word addr, word value)<br />{<br />//for digital data<br />if(addr &lt; 20000)<br />{<br />modbusDigReg * regPtr;<br />//search for the register address<br />regPtr = (modbusDigReg *) this-&gt;search(addr);<br />//if a pointer was returned the set the register value to true if value is non zero<br />if(regPtr)<br />if(value)<br />regPtr-&gt;value = 0xFF;<br />else<br />regPtr-&gt;value = 0x00;<br />}<br />else<br />{<br />modbusAnaReg * regPtr;<br />//search for the register address<br />regPtr = (modbusAnaReg *) this-&gt;search(addr);<br />//if found then assign the register value to the new value.<br />if(regPtr)<br />regPtr-&gt;value = value;<br />}<br />}<br /><br />void * modbusRegBank::search(word addr)<br />{<br />//if the requested address is 0-19999 <br />//use a digital register pointer assigned to the first digital register<br />//else use a analog register pointer assigned the first analog register<br /><br />if(addr &lt; 20000)<br />{<br />modbusDigReg *regPtr = _digRegs;<br /><br />//if there is no register configured, bail<br />if(regPtr == 0)<br />return(0);<br /><br />//scan through the linked list until the end of the list or the register is found.<br />//return the pointer.<br />do<br />{<br />if(regPtr-&gt;address == addr)<br />return(regPtr);<br />regPtr = regPtr-&gt;next;<br />}<br />while(regPtr);<br />}<br />else<br />{<br />modbusAnaReg *regPtr = _anaRegs;<br /><br />//if there is no register configured, bail<br />if(regPtr == 0)<br />return(0);<br /><br />//scan through the linked list until the end of the list or the register is found.<br />//return the pointer.<br />do<br />{<br />if(regPtr-&gt;address == addr)<br />return(regPtr);<br />regPtr = regPtr-&gt;next;<br />}<br />while(regPtr);<br />}<br />return(0);<br />}[/syntax]<br /><br />modbusRegBank.h<br />[syntax=c]#include &lt;stdint.h&gt;<br />#include &lt;Arduino.h&gt;<br /><br />#ifndef _MODBUSREGBANK<br />#define _MODBUSREGBANK<br /><br />#include &lt;modbus.h&gt;<br />//#include &lt;Wprogram.h&gt;<br /><br /><br />struct modbusDigReg<br />{<br />word address;<br />byte value;<br /><br />modbusDigReg *next;<br />};<br /><br />struct modbusAnaReg<br />{<br />word address;<br />word value;<br /><br />modbusAnaReg *next;<br />};<br /><br />class modbusRegBank<br />{<br />public:<br /><br />modbusRegBank(void);<br /><br />void add(word);<br />word get(word);<br />void set(word, word);<br /><br />private:<br />void * search(word);<br /><br />modbusDigReg*_digRegs,<br />*_lastDigReg;<br /><br />modbusAnaReg*_anaRegs,<br />*_lastAnaReg;<br />};<br />#endif[/syntax]<br /><br />modbusSlave.cpp<br />[syntax=c]#include &lt;modbusSlave.h&gt;<br />#include &lt;modbus.h&gt;<br />#include &lt;modbusDevice.h&gt;<br />#include &lt;Arduino.h&gt;<br /><br />modbusSlave::modbusSlave()<br />{<br />}<br />/*<br />Set the Serial Baud rate.<br />Reconfigure the UART for 8 data bits, no parity, and 1 stop bit.<br />and flush the serial port.<br />*/<br />void modbusSlave::setBaud(word baud)<br />{<br />_baud = baud;<br />//calculate the time perdiod for 3 characters for the given bps in ms.<br />_frameDelay = 24000/_baud;<br /><br />Serial.begin(baud);<br /><br />// defaults to 8-bit, no parity, 1 stop bit<br />//clear parity, stop bits, word length<br />//UCSR0C = UCSR0C &amp; B11000001;<br />//UCSR0B = UCSR0B &amp; B11111011; <br /><br />//Set word length to 8 bits<br />//UCSR0C = UCSR0C | B00000110;<br /><br />//No parity<br />//UCSR0C = UCSR0C | B00000000;<br /><br />//1 Stop bit<br />//UCSR0C = UCSR0C | B00000100;<br /><br />Serial.flush();<br />}<br /><br />/*<br />Retrieve the serial baud rate<br />*/<br />word modbusSlave::getBaud(void)<br />{<br />return(_baud);<br />}<br /><br />/*<br />Generates the crc for the current message in the buffer.<br />*/<br /><br />void modbusSlave::calcCrc(void)<br />{<br />byteCRCHi = 0xFF,<br />CRCLo = 0x0FF,<br />Index,<br />msgLen,<br />*msgPtr;<br /><br />msgLen = _len-2;<br />msgPtr = _msg;<br /><br />while(msgLen--)<br />{<br />Index = CRCHi ^ *msgPtr++;<br />CRCHi = CRCLo ^ _auchCRCHi&#91;Index&#93;;<br />CRCLo = _auchCRCLo&#91;Index&#93;;<br />}<br />_crc = (CRCHi &lt;&lt; 8) | CRCLo;<br />}<br /><br />/*<br />  Checks the UART for query data<br />*/<br />void modbusSlave::checkSerial(void)<br />{<br />//while there is more data in the UART than when last checked<br />while(Serial.available()&gt; _len)<br />{<br />//update the incoming query message length<br />_len = Serial.available();<br />//Wait for 3 bytewidths of data (SOM/EOM)<br />//delayMicroseconds(RTUFRAMETIME);<br />delay(_frameDelay);<br />//Check the UART again<br />}<br />}<br /><br />/*<br />Copies the contents of the UART to a buffer<br />*/<br />void modbusSlave::serialRx(void)<br />{<br />byte i;<br /><br />//allocate memory for the incoming query message<br />_msg = (byte*) malloc(_len);<br /><br />//copy the query byte for byte to the new buffer<br />for (i=0 ; i &lt; _len ; i++)<br />_msg&#91;i&#93; = Serial.read();<br />}<br /><br />/*<br />Generates a query reply message for Digital In/Out status update queries.<br />*/<br />void modbusSlave::getDigitalStatus(byte funcType, word startreg, word numregs)<br />{<br />//initialize the bit counter to 0<br />byte bitn =0;<br /><br />//if the function is to read digital inputs then add 10001 to the start register<br />//else add 1 to the start register<br />if(funcType == READ_DI)<br />startreg += 10001;<br />else<br />startreg += 1;<br /><br />//determine the message length<br />//for each group of 8 registers the message length increases by 1<br />_len = numregs/8;<br />//if there is at least one incomplete byte's worth of data<br />//then add 1 to the message length for the partial byte.<br />if(numregs%8)<br />_len++;<br />//allow room for the Device ID byte, Function type byte, data byte count byte, and crc word<br />_len +=5;<br /><br />//allocate memory of the appropriate size for the message<br />_msg = (byte *) malloc(_len);<br /><br />//write the slave device ID<br />_msg&#91;0&#93; = _device-&gt;getId();<br />//write the function type<br />_msg&#91;1&#93; = funcType;<br />//set the data byte count<br />_msg&#91;2&#93; = _len-5;<br /><br />//For the quantity of registers queried<br />while(numregs--)<br />{<br />//if a value is found for the current register, set bit number bitn of msg&#91;3&#93;<br />//else clear it<br />if(_device-&gt;get(startreg))<br />bitSet(_msg&#91;3&#93;, bitn);<br />else<br />bitClear(_msg&#91;3&#93;, bitn);<br />//increment the bit index<br />bitn++;<br />//increment the register<br />startreg++;<br />}<br /><br />//generate the crc for the query reply and append it<br />this-&gt;calcCrc();<br />_msg&#91;_len - 2&#93; = _crc &gt;&gt; 8;<br />_msg&#91;_len - 1&#93; = _crc &amp; 0xFF;<br />}<br /><br />void modbusSlave::getAnalogStatus(byte funcType, word startreg, word numregs)<br />{<br />word val;<br />word i = 0;<br /><br />//if the function is to read analog inputs then add 30001 to the start register<br />//else add 40001 to the start register<br />if(funcType == READ_AI)<br />startreg += 30001;<br />else<br />startreg += 40001;<br /><br />//calculate the query reply message length<br />//for each register queried add 2 bytes<br />_len = numregs * 2;<br />//allow room for the Device ID byte, Function type byte, data byte count byte, and crc word<br />_len += 5;<br /><br />//allocate memory for the query response<br />_msg = (byte *) malloc(_len);<br /><br />//write the device ID<br />_msg&#91;0&#93; = _device-&gt;getId();<br />//write the function type<br />_msg&#91;1&#93; = funcType;<br />//set the data byte count<br />_msg&#91;2&#93; = _len - 5;<br /><br />//for each register queried<br />while(numregs--)<br />{<br />//retrieve the value from the register bank for the current register<br />val = _device-&gt;get(startreg+i);<br />//write the high byte of the register value<br />_msg&#91;3 + i * 2&#93;  = val &gt;&gt; 8;<br />//write the low byte of the register value<br />_msg&#91;4 + i * 2&#93; = val &amp; 0xFF;<br />//increment the register<br />i++;<br />}<br /><br />//generate the crc for the query reply and append it<br />this-&gt;calcCrc();<br />_msg&#91;_len - 2&#93; = _crc &gt;&gt; 8;<br />_msg&#91;_len - 1&#93; = _crc &amp; 0xFF;<br />}<br /><br />void modbusSlave::setStatus(byte funcType, word reg, word val)<br />{<br />//Set the query response message length<br />//Device ID byte, Function byte, Register byte, Value byte, CRC word<br />_len = 8;<br />//allocate memory for the message buffer.<br />_msg = (byte *) malloc(_len);<br /><br /><br />//write the device ID<br />_msg&#91;0&#93; = _device-&gt;getId();<br />//if the function type is a digital write<br />if(funcType == WRITE_DO)<br />{<br />//Add 1 to the register value and set it's value to val<br />_device-&gt;set(reg + 1, val);<br />//write the function type to the response message<br />_msg&#91;1&#93; = WRITE_DO;<br />}<br />else<br />{<br />//else add 40001 to the register and set it's value to val<br />_device-&gt;set(reg + 40001, val);<br /><br />//write the function type of the response message<br />_msg&#91;1&#93; = WRITE_AO;<br />}<br /><br />//write the register number high byte value<br />_msg&#91;2&#93; = reg &gt;&gt; 8;<br />//write the register number low byte value<br />_msg&#91;3&#93; = reg &amp; 0xFF;<br />//write the control value's high byte<br />_msg&#91;4&#93; = val &gt;&gt; 8;<br />//write the control value's low byte<br />_msg&#91;5&#93; = val &amp; 0xFF;<br /><br />//calculate the crc for the query reply and append it.<br />this-&gt;calcCrc();<br />_msg&#91;_len - 2&#93;= _crc &gt;&gt; 8;<br />_msg&#91;_len - 1&#93;= _crc &amp; 0xFF;<br />}<br /><br />void modbusSlave::run(void)<br />{<br /><br />byte deviceId;<br />byte funcType;<br />word field1;<br />word field2;<br /><br />int i;<br /><br />//initialize mesasge length<br />_len = 0;<br /><br />//check for data in the recieve buffer<br />this-&gt;checkSerial();<br /><br />//if there is nothing in the recieve buffer, bail.<br />if(_len == 0)<br />{<br />return;<br />}<br /><br />//retrieve the query message from the serial uart<br />this-&gt;serialRx();<br /><br />//if the message id is not 255, and<br />// and device id does not match bail<br />if( (_msg&#91;0&#93; != 0xFF) &amp;&amp; <br />(_msg&#91;0&#93; != _device-&gt;getId()) )<br />{<br />return;<br />}<br />//calculate the checksum of the query message minus the checksum it came with.<br />this-&gt;calcCrc();<br /><br />//if the checksum does not match, ignore the message<br />if ( _crc != ((_msg&#91;_len - 2&#93; &lt;&lt; 8) + _msg&#91;_len - 1&#93;))<br />return;<br /><br />//copy the function type from the incoming query<br />funcType = _msg&#91;1&#93;;<br /><br />//copy field 1 from the incoming query<br />field1= (_msg&#91;2&#93; &lt;&lt; 8) | _msg&#91;3&#93;;<br /><br />//copy field 2 from the incoming query<br />field2  = (_msg&#91;4&#93; &lt;&lt; 8) | _msg&#91;5&#93;;<br /><br />//free the allocated memory for the query message<br />free(_msg);<br />//reset the message length;<br />_len = 0;<br /><br />//generate query response based on function type<br />switch(funcType)<br />{<br />case READ_DI:<br />this-&gt;getDigitalStatus(funcType, field1, field2);<br />break;<br />case READ_DO:<br />this-&gt;getDigitalStatus(funcType, field1, field2);<br />break;<br />case READ_AI:<br />this-&gt;getAnalogStatus(funcType, field1, field2);<br />break;<br />case READ_AO:<br />this-&gt;getAnalogStatus(funcType, field1, field2);<br />break;<br />case WRITE_DO:<br />this-&gt;setStatus(funcType, field1, field2);<br />break;<br />case WRITE_AO:<br />this-&gt;setStatus(funcType, field1, field2);<br />break;<br />default:<br />return;<br />break;<br />}<br /><br />//if a reply was generated<br />if(_len)<br />{<br />int i;<br />//send the reply to the serial UART<br />//Senguino doesn't support a bulk serial write command....<br />for(i = 0 ; i &lt; _len ; i++)<br />Serial.write(_msg&#91;i&#93;);<br />//free the allocated memory for the reply message<br />free(_msg);<br />//reset the message length<br />_len = 0;<br />}<br />}[/syntax]<br /><br />modbusSlave.h<br />[syntax=c]#include &lt;stdint.h&gt;<br />#include &lt;Arduino.h&gt;<br /><br />#ifndef MODBUSSLAVE<br />#define MODBUSSLAVE<br /><br />#include &lt;modbus.h&gt;<br />#include &lt;modbusDevice.h&gt;<br />//#include &lt;Wprogram.h&gt;<br /><br />/* Table of CRC values for high–order byte */<br />const byte _auchCRCHi&#91;&#93; = {<br />0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,<br />0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,<br />0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,<br />0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,<br />0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,<br />0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,<br />0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,<br />0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,<br />0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,<br />0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,<br />0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,<br />0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,<br />0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,<br />0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,<br />0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,<br />0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,<br />0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,<br />0x40};<br /><br />/* Table of CRC values for low–order byte */<br />const byte _auchCRCLo&#91;&#93; = {<br />0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,<br />0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,<br />0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,<br />0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,<br />0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,<br />0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,<br />0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,<br />0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,<br />0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,<br />0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,<br />0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,<br />0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,<br />0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,<br />0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,<br />0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,<br />0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,<br />0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,<br />0x40};<br /><br />class modbusSlave<br />{<br />public:<br />modbusSlave(void);<br />void setBaud(word);<br />word getBaud(void);<br />void calcCrc(void);<br />void checkSerial(void);<br />void serialRx(void);<br />void getDigitalStatus(byte, word, word);<br />void getAnalogStatus(byte, word, word);<br />void setStatus(byte, word, word);<br />void run(void);<br /><br />modbusDevice *_device;<br /><br />private:<br />byte *_msg,<br />  _len;<br /><br /><br />word _baud,<br /> _crc,<br /> _frameDelay;<br />};<br />#endif[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 8 sty 2017, o 17:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-08T15:29:31+01:00</updated>
<published>2017-01-08T15:29:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179392#p179392</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179392#p179392"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179392#p179392"><![CDATA[
Nie wiem co masz na myśli pisząc <div class="quotetitle">endurasek napisał(a):</div><div class="quotecontent"><br />nie znalazłem tam możliwości pobierania danych z mastera i wyświetlania go na wyświetlaczu.<br /></div>ale slave nigdy nie poprosi mastera o dane, więc takiej funkcji nie oczekuj. Ale na pewno master powinien mieć możliwość zapisu n-rejestrów do slavea. Sam modbus jako standard to zapewnia. Co innego czy Twoja biblioteka ma zaimplementowaną obsługę funkcji 16. Niestety biblioteki nie załączyłeś to musisz się sam pomęczyć.<br /><br />Druga sprawa - wyświetlanie danych na wyświetlaczu to oddzielny temat - z tym chyba nie masz problemu??<br /><br />Możesz się przesiąść na C w przypadku tego jednego modułu czy musi być arduino?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 8 sty 2017, o 15:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-08T14:52:02+01:00</updated>
<published>2017-01-08T14:52:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179390#p179390</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179390#p179390"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179390#p179390"><![CDATA[
Sprawdziłem bibliotekę którą używam i nie znalazłem tam możliwości pobierania danych z mastera i wyświetlania go na wyświetlaczu. Nie upieram się na moim przykładzie ale jeśli ktoś posiada jakiś inny to prosił bym o udostępnienie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 8 sty 2017, o 14:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-07T12:53:06+01:00</updated>
<published>2017-01-07T12:53:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179303#p179303</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179303#p179303"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179303#p179303"><![CDATA[
Nie znam arduino wogole więc ciężko mi się to czyta ale poszukaj w bibliotekach funkcji odpowiedniej. <br /><br />Ogólnie zasada jest taka, że tutaj w programie odczytujesz czujniki temp i zapisujesz wynik do tablicy (chyba regBank 30001 i 30002) a PLC odpytuje je funkcją pewnie 03.<br /><br />U ciebie w module z wyświetlaczem musisz odwrócić sytuację. <br />Używając w PLC funkcji np 16 musisz zapisać do tablicy (może być ta sama regBank(30001) - to i tak inny procek) liczby odpowiadające pomiarom temperatury.<br />Później juź w funkcji wyświetlającej liczby na wyświetlaczu wyświetlasz interesujące Cię dane. Pamiętaj, że zmienne z modbusa to słowa 16-to bitowe. Musisz użyć odpowiedniej funkcji lub przerobić je na stringi i wyświetlić jako tekst.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 7 sty 2017, o 12:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-07T12:18:08+01:00</updated>
<published>2017-01-07T12:18:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179301#p179301</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179301#p179301"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179301#p179301"><![CDATA[
Aktualnie korzystam z tego przykładu<br /><br />[syntax=c]#include &lt;modbus.h&gt;<br />#include &lt;modbusDevice.h&gt;<br />#include &lt;modbusRegBank.h&gt;<br />#include &lt;modbusSlave.h&gt;<br /><br />/* PINS<br />Add more registers if needed<br />Digital input pins 2,3,4,5,6,7<br />Digital output pins 8,9,12,13<br />Analog output pins 10,11 (PWM)<br />Analog input pins 0,1,2,3,4,5<br />*/<br /><br /><br />modbusDevice regBank;<br />modbusSlave slave;<br /><br />int AI0,AI1,AI2,AI3,AI4,AI5;<br /><br /><br />void setup()<br />{   <br />  regBank.setId(10); ///Set Slave ID<br /><br />//Add Digital Input registers<br />  regBank.add(10002);<br />  regBank.add(10003);<br />  regBank.add(10004);<br />  regBank.add(10005);<br />  regBank.add(10006);<br />  regBank.add(10007);<br />// Add Digital Output registers<br />  regBank.add(8);<br />  regBank.add(9);<br />  regBank.add(12);<br />  regBank.add(13);<br />//Analog input registers<br />  regBank.add(30001);<br />  regBank.add(30002);<br />  regBank.add(30003);<br />  regBank.add(30004);<br />  regBank.add(30005);<br />  regBank.add(30006);<br />//Analog Output registers<br />  regBank.add(40010);  <br />  regBank.add(40011);  <br /><br />  slave._device = &amp;regBank;  <br />  slave.setBaud(9600);   <br />  <br />  pinMode(2,INPUT);<br />  pinMode(3,INPUT);<br />  pinMode(4,INPUT);<br />  pinMode(5,INPUT);<br />  pinMode(6,INPUT);<br />  pinMode(7,INPUT);<br />  pinMode(8,OUTPUT);<br />  pinMode(9,OUTPUT);<br />  pinMode(12,OUTPUT);<br />  pinMode(13,OUTPUT);<br /><br />//ustawiam sobie wejscia w stan wysoki i steruje to 0<br />  digitalWrite(2, HIGH);<br />  digitalWrite(3, HIGH);<br />  digitalWrite(4, HIGH);<br />  digitalWrite(5, HIGH);<br />  digitalWrite(6, HIGH);<br />  digitalWrite(7, HIGH);<br />}<br />void loop(){<br /><br />  while(1){   <br />  //Digital Input<br />    byte DI2 = digitalRead(2);<br />    if (DI2 &gt;= 1)regBank.set(10002,1);<br />    if (DI2 &lt;= 0)regBank.set(10002,0);<br />    byte DI3 = digitalRead(3);<br />    if (DI3 &gt;= 1)regBank.set(10003,1);<br />    if (DI3 &lt;= 0)regBank.set(10003,0);<br />    byte DI4 = digitalRead(4);<br />    if (DI4 &gt;= 1)regBank.set(10004,1);<br />    if (DI4 &lt;= 0)regBank.set(10004,0);<br />    byte DI5 = digitalRead(5);<br />    if (DI5 &gt;= 1)regBank.set(10005,1);<br />    if (DI5 &lt;= 0)regBank.set(10005,0);<br />    byte DI6 = digitalRead(6);<br />    if (DI6 &gt;= 1)regBank.set(10006,1);<br />    if (DI6 &lt;= 0)regBank.set(10006,0);<br />    byte DI7 = digitalRead(7);<br />    if (DI7 &gt;= 1)regBank.set(10007,1);<br />    if (DI7 &lt;= 0)regBank.set(10007,0);<br />                                <br />  //Digital output<br />    int DO8 = regBank.get(8);<br />      if (DO8 &lt;= 0 &amp;&amp; digitalRead(8) == HIGH)digitalWrite(8,LOW);<br />      if (DO8 &gt;= 1 &amp;&amp; digitalRead(8) == LOW)digitalWrite(8,HIGH);<br />    int DO9 = regBank.get(9);<br />      if (DO9 &lt;= 0 &amp;&amp; digitalRead(9) == HIGH)digitalWrite(9,LOW);<br />      if (DO9 &gt;= 1 &amp;&amp; digitalRead(9) == LOW)digitalWrite(9,HIGH);<br />    int DO12 = regBank.get(12);<br />      if (DO12 &lt;= 0 &amp;&amp; digitalRead(12) == HIGH)digitalWrite(12,LOW);<br />      if (DO12 &gt;= 1 &amp;&amp; digitalRead(12) == LOW)digitalWrite(12,HIGH);<br />    int DO13 = regBank.get(13);<br />      if (DO13 &lt;= 0 &amp;&amp; digitalRead(13) == HIGH)digitalWrite(13,LOW);<br />      if (DO13 &gt;= 1 &amp;&amp; digitalRead(13) == LOW)digitalWrite(13,HIGH);<br />            <br />  //Analog input  ***READ Twice deliberately<br />    AI0 = analogRead(0);<br />    delay(10);<br />    AI0 = analogRead(0);<br />    regBank.set(30001, (word) AI0);<br />    delay(10);<br />    <br />    AI1 = analogRead(1);<br />    delay(10);<br />    AI1 = analogRead(1);<br />    regBank.set(30002, (word) AI1);<br />    delay(10);<br />    <br />    AI2 = analogRead(2);<br />    delay(10);<br />    AI2 = analogRead(2);<br />    regBank.set(30003, (word) AI2);<br />    delay(10);<br />    <br />    AI3 = analogRead(3);<br />    delay(10);<br />    AI3 = analogRead(3);<br />    regBank.set(30004, (word) AI3);<br />    delay(10);<br />    <br />    AI4 = analogRead(4);<br />    delay(10);<br />    AI4 = analogRead(4);<br />    regBank.set(30005, (word) AI4);<br />    delay(10);<br />    <br />    AI5 = analogRead(5);<br />    delay(10);<br />    AI5 = analogRead(5);<br />    regBank.set(30006, (word) AI5);<br />    delay(10);<br />        <br />  //Analog output <br />    word AO10 = regBank.get(40010);<br />    analogWrite(10,AO10);<br />    delay(10);<br />    word AO11 = regBank.get(40011);<br />    analogWrite(11,AO11);<br />    delay(10);<br />        <br />  slave.run();  <br />  }<br />}[/syntax]<br /><br />Do moich potrzeb przerobiłem go na odczyt dwóch czujników DS18B20 których wartość wysyła po modbasie np. 25,34C   jako 2534<br />[syntax=c]//wyswietlacz<br />#include &lt;LiquidCrystal.h&gt;<br />//ds18b20<br />#include &lt;OneWire.h&gt;<br />#include &lt;DallasTemperature.h&gt;<br />//modbus<br />#include &lt;modbus.h&gt;<br />#include &lt;modbusDevice.h&gt;<br />#include &lt;modbusRegBank.h&gt;<br />#include &lt;modbusSlave.h&gt;<br /><br />//dotyczy obslugi modbus<br />modbusDevice regBank;<br />modbusSlave slave;<br /><br />// ds18b20 podlaczony pod 2 i 3 pin<br />#define ONE_WIRE_BUS_1 2<br />#define ONE_WIRE_BUS_2 3<br /><br /><br />//znak stopnia<br />byte stopienCelc&#91;8&#93; = <br />{<br />        B01000,<br />        B10100,<br />        B01000,<br />        B00000,<br />        B00000,<br />        B00000,<br />        B00000,<br />        B00000<br />};<br /><br />byte sygPraca&#91;8&#93; = {<br />        B00111,<br />        B00111,<br />        B00111,<br />        B00000,<br />        B00000,<br />        B00000,<br />        B00000,<br />        B00000<br />};<br /><br />// Setup a oneWire instance to communicate with ANY OneWire devices <br />OneWire oneWire_1(ONE_WIRE_BUS_1);<br />OneWire oneWire_2(ONE_WIRE_BUS_2);<br /><br />// Set oneWire reference to Dallas Temperature sensor. <br />DallasTemperature sensors_1(&amp;oneWire_1);<br />DallasTemperature sensors_2(&amp;oneWire_2);<br /><br />// piny wyswietlacza LCD<br />LiquidCrystal lcd(8, 9, 4, 5, 6, 7);<br /><br /><br />void setup()<br />{<br /> regBank.setId(10); // ID slave 10<br /> regBank.add(30001); //tu wpisze wartosc temp z ds18b20_1 WAZNE odczyt ma byc int16 w plc<br /> regBank.add(30002); //tu wpisze wartosc temp z ds18b20_2 WAZNE odczyt ma byc int16 w plc<br /> <br /> slave._device = &amp;regBank;  <br /> slave.setBaud(9600);  //predkosc transmisji danych 9600.8.N.1<br /> <br /> lcd.begin(16, 2);              // wyswietlacz 16x2<br /> sensors_1.begin();<br /> sensors_2.begin();<br /><br /> lcd.createChar(1, stopienCelc);   //znak specjalny <br /> lcd.createChar(2, sygPraca);    //znak specjalny<br />}<br /> <br />void loop()<br />{<br />  lcd.setCursor(15,0); //miga kursor w prawym rogu<br />  lcd.write(2);<br />  <br />  <br />  <br />  //odczytanie temp z obu czujnikow<br />  sensors_1.requestTemperatures();<br />  sensors_2.requestTemperatures();<br /><br />  //wyswietla pierwsza wartosc i zamazuje reszte<br />  lcd.setCursor(0,0);<br />  lcd.print(&quot;T.Piec &quot;); lcd.print(sensors_1.getTempCByIndex(0)); lcd.write(1); lcd.print(&quot;  &quot;);  //wyswietla cala temp z ds18b20_1 z ulamikiem<br />    <br />  lcd.setCursor(0,1);            <br />  lcd.print(&quot;T.Boj  &quot;) , lcd.print (sensors_2.getTempCByIndex(0)); lcd.write(1);  lcd.print(&quot;  &quot;); //wyswietla cala temp z ds18b20_2 z ulamikiem   <br />  <br />  lcd.setCursor(15,0);  // kasuje kursor w rogu<br />  lcd.print(&quot; &quot;);<br />  <br />      <br />  regBank.set(30001, sensors_1.getTempCByIndex(0)*100); //przesowam przecinek o dwie pozycje i wpisuje je do rejestru<br />  regBank.set(30002, sensors_2.getTempCByIndex(0)*100); //przesowam przecinek o dwie pozycje i wpisuje je do rejestru<br />  delay(100);<br /><br />  slave.run(); <br />     <br /> <br />}[/syntax]<br /><br />W moim przykładzie nie mam takiej opcji czy muszę mieć inna bibliotekę ? w jaki sposób na wyswietlaczu slave mam odczytać tą wartość która  jest zapisana pod 30001<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 7 sty 2017, o 12:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skalarro]]></name></author>
<updated>2017-01-07T11:26:32+01:00</updated>
<published>2017-01-07T11:26:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179297#p179297</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179297#p179297"/>
<title type="html"><![CDATA[Re: Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179297#p179297"><![CDATA[
Tak, Wyświetlacz robisz jako trzecie urządzenie slave ze swoim adresem, podłączasz go pod magistralę i zapisujesz do niego dane które chcesz wyświetlić.<br /><br />Oczywiście wyświetlacz to będzie moduł z własnym mikrokontrolerem, zasilaniem i RS485. Zapis robisz za pomocą funkcki 16 - write N-registers<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4850">skalarro</a> — 7 sty 2017, o 11:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[endurasek]]></name></author>
<updated>2017-01-07T10:24:20+01:00</updated>
<published>2017-01-07T10:24:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179296#p179296</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179296#p179296"/>
<title type="html"><![CDATA[Modbus + LCD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17264&amp;p=179296#p179296"><![CDATA[
Witam<br />mam podłączone arduino z PLC gdzie PLC pracuje jako master a arduino jako slave. Plc odpytuje dwa urządzenia slave o stan pinow oraz temperaturę. I teraz chciał bym na tej samej lini RS485 podłączyć wyświetlacz(slave) który by wyświetlał wybrane dane na wyświetlaczu które są przesyłane między pozostałymi urządzeniami.  Czy ma ktoś jakis pomysł jak to zrobić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1442">endurasek</a> — 7 sty 2017, o 10:24</p><hr />
]]></content>
</entry>
</feed>