<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[SDS PLC/PAC: Měření Energie & OnlineTechnology.cz - [vyřešeno] RS 485 / stack]]></title>
	<link rel="self" href="https://forum.sds.an-d.cz/extern.php?action=feed&amp;tid=943&amp;type=atom" />
	<updated>2021-01-12T08:21:30Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.sds.an-d.cz/viewtopic.php?id=943</id>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6870#p6870" />
			<content type="html"><![CDATA[<p>ano, přesně, viz ... <a href="http://wiki.merenienergie.cz/index.php/FULL-C_tips_and_tricks">http://wiki.merenienergie.cz/index.php/ … and_tricks</a></p><p>Není to totiž deklarováno jako const a proto je to bráno jako kdykoliv měnitelná proměnná (pole) na heapu či na stacku (podle místa deklarace)... a proto to při každém průchodu místem deklarace &quot;sežere&quot; další paměť.<br />Řešení je více, vhodné je např. to nastavení po jednotlivých prvcích.</p>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2021-01-12T08:21:30Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6870#p6870</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6869#p6869" />
			<content type="html"><![CDATA[<p>Už vím čím to je, jen nerozumím proč.<br />Program jsem vám ještě neposílal, protože při srovnávání funkční a testovací verze mne napadla ještě tato věc:<br />ve funkční verzi ( cca2 roky)&nbsp; mám většinu polí naplněnu takto:<br />char pr4[8];<br />&nbsp; pr4[0] = 0x05;<br />&nbsp; pr4[1] = 0x05;<br />&nbsp; pr4[2] = 0x00;<br />&nbsp; pr4[3] = 0x00;<br />&nbsp; pr4[4] = 0xFF;<br />&nbsp; pr4[5] = 0x00;<br />&nbsp; pr4[6] = 0x8D;<br />&nbsp; pr4[7] = 0xBE;<br />později jsem začal používat tento způsob zápisu do pole:<br />char pr4[] = {0x05,0x05,0x00,0x00,0xFF,0x00,0x8D,0xBE};<br />a ten způsobuje , že roste Heap - právě jsem si to ověřil.<br />Navíc to vysvětluje i proč se mi onehdá zasekla funkční verze. V této verzi je většina polí naplněna prvním způsobem, ale některé z poslední doby již druhým způsobem a ten pomaličku užírá volnou paměť . Taky jsem to teď ověřil stav Heap byl už na 10792kB a po resetu zařízení je 6560kB.<br />Raději bych používal druhý způsob zápisu, protože program je s ním přehlednější, dnes ovládám cca 7 relé a další mám v plánu a program je pak v textu hodně dlouhý.</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2021-01-11T21:31:05Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6869#p6869</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6868#p6868" />
			<content type="html"><![CDATA[<p>pošlete mi ten program, podívám se</p>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2021-01-10T08:58:04Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6868#p6868</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6867#p6867" />
			<content type="html"><![CDATA[<p>Pročtu si to, vidím, že je tam dost informací.<br />Já myslím že důvodem zaseknutí byl nedostatek paměti ( dle výpisu ve FULL-status) , ale nepodařilo se mi to opakovaně vyvolat. Měřím poměrně dlouhý čas ( 2 hodiny) , během kterého je vypnuté topení, když se větrá a v praxi se hraniční hodnoty většinou nedosáhne. Při zaseknutí byl tento čas překročen, ale asi to nebyla příčina, zkoušel jsem to vyvolat a nepodařilo se.</p><p>Mám ještě jednu nejasnost v mém jednoduchém testovacím programu na 485, vše funguje zapisuje i čte, stack se nemění, ale vidím, že roste Heap. Posílám na 485 něco každou 1,5 sekundu , tak po pár minutách běhu programu je Heap 8000kB ze 126615kB. Předpokládám, že po vyčerpání paměti program zkolabuje.<br />Pomůže v tomto případě si alokovat a pak uvolnit paměť?<br />pokud ano , tka jak to správně udělat? Napadá mne pře každým vložením HEX řetězce alokovat a po odeslání uvolnit , ale netuším .</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2021-01-09T22:03:50Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6867#p6867</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6866#p6866" />
			<content type="html"><![CDATA[<p>zatuhlo? tak to by mne zajímaly podrobnosti</p><p>wdg je v zařízení SDS hned na několika úrovních, <br />- v HW se samostatným RC oscilátorem, kdy hlídá procesor (timeout 1 sec), resetuje procesor při zaseknutí, aktivován vždy<br />- v HW dohledy nevhodného poklesu napájení (brownout a PF), aktivován vždy<br />- v SW programový pro systém, aktivován vždy<br />- v SW programový pro FULL-C program, ale ten je potřeba aktivovat dle uživatelských potřeb</p><p>více viz wiki, tam je vše<br />http://wiki.merenienergie.cz/index.php/FULL-C_general_functions</p>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2021-01-09T15:52:14Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6866#p6866</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6865#p6865" />
			<content type="html"><![CDATA[<p>Ve FULL-C Statusu je na pátém řádku:<br />FC watchdog : inactive<br />Předpokládám, že se nejedná o IP watchdog, který na Smallu ještě nepoužívám, ale nikde se nemůžu dočíst o tomto watchdogu více - jak jej aktivovat.<br />Po eliminaci problémů se 485 se zařízení drží, ale přesto se mi jednou stalo, že zatuhlo. Připravuji externí watchdog, ale interní by byl lepší .</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2021-01-08T21:14:00Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6865#p6865</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6863#p6863" />
			<content type="html"><![CDATA[<p>viz ... <a href="http://wiki.merenienergie.cz/index.php/FULL-C_tips_and_tricks">http://wiki.merenienergie.cz/index.php/ … and_tricks</a></p>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2021-01-03T09:49:39Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6863#p6863</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6862#p6862" />
			<content type="html"><![CDATA[<p>Tak po předchozí úpravě již funguje vše jak má jak zápis tak i čtení.<br />Děkuji.</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2021-01-02T22:30:00Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6862#p6862</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6861#p6861" />
			<content type="html"><![CDATA[<p>Přesunutí obsahu pole ven ze smyčky pomohlo a stack již neroste. Toto jsem ověřil na tom nejjednoduším programku, zkusím se vrátit zpět ke čtení z RS485</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2021-01-02T21:09:57Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6861#p6861</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6857#p6857" />
			<content type="html"><![CDATA[<p>Ještě jsem se k tomu nedostal, ale na první pohled - doporučím premístit tento řádek zevnitř smyčky while ven.</p><div class="quotebox"><cite>krevla napsal:</cite><blockquote><div class="codebox"><pre><code>char pr4[] = {0x05,0x06,0x00,0x01,0x06,0x20,0xDB,0xF6};</code></pre></div></blockquote></div>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2020-12-31T11:17:26Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6857#p6857</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6856#p6856" />
			<content type="html"><![CDATA[<p>Tak jsem nahrál poslední verzi FW a Stack pořád roste.<br />Program jen posílá:<br /></p><div class="codebox"><pre><code>    SDS_serial_config(1, 9600, 8, 1, 0);
    while(1){
              SDS_serial_config(1, 9600, 8, 1, 0); 
char pr4[] = {0x05,0x06,0x00,0x01,0x06,0x20,0xDB,0xF6};

  wait(10000);
 SDS_serial_write(1, pr4,8);
 wait(1000);
       </code></pre></div><p>a výskedek je:<br /></p><div class="codebox"><pre><code>out of mem(29)(24)(S)
!!! YOU NEED TO INCREASE STACK SIZE FOR YOUR PROGRAM !!!
out of mem(110)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2020-12-30T22:36:21Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6856#p6856</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6855#p6855" />
			<content type="html"><![CDATA[<p>Tak po dalším bádání jsem úplně z programu zrušil čtení a ponechal jen zápis na RS485 a STACK s každým odeslaným příkazem také roste.<br />Nechápu to, když na hlavním zařízení&nbsp; posílám desítky příkazů denně&nbsp; bez problémů . Zkontroloval jsem FW - moje hlavní zařízení&nbsp; má FW z&nbsp; 9.7.2020 a na druhém zařízení, kde provádím tyto pokusy mám FW z 3.11.2020 . Vidím že již existuje FW z 12.12.2020, tak jej zkusím nainstalovat, jen nevím jestli to ještě stihnu letos.</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2020-12-30T21:59:40Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6855#p6855</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6854#p6854" />
			<content type="html"><![CDATA[<p>Pošlete mi to na sds@an-d.cz .</p><p>Zde je zcela fungující příklad pro RS485 pro komunikaci mezi SDS a střídačem SITON :</p><div class="codebox"><pre><code>// následující kód je jen malá část celého programu, ale i tak je to kompletní ukázka čtení dat z RS485 z připojeného zařízení SITON 

// POZOR jedná se o vlastní protokol použitý autorem střídače SITON, ale pro ilustraci je to neméně vhodné
// protokoly typu MODBUS se budou prakticky zpracovávat úplně stejným principem, s přihlédnutím k jiné formě protokolu

// --- SITON

struct SitonPayloadTX
{
  unsigned char nodeID;  // toto jsou data z nodu xx
  unsigned char address;
  unsigned char command;
  unsigned char func;
  signed short data1; // napeti ve Voltech
  signed short data2; // proud ve formatu 865 (8,65A)
  signed short data3; // vykon ve Wattech
  signed short data4; // teplota ve degC
  signed short data5;
  signed short data6;
  signed short data7;
  signed short data8;
  signed int data9;   // vyroba ve Wh
  signed int data10;
  signed int data11;
  signed int data12;
};

// posledni platna prijata zprava
struct SitonPayloadTX siton;
unsigned int siton_stari_zpravy = 0xFFFF; // sekundy

// sem ukladame novou zpravu
unsigned char sitonpay[sizeof(struct SitonPayloadTX) + 8];

//
unsigned char siton_et_hlavicka = 0;
unsigned char siton_et_ptr = 0;
unsigned char siton_et_chk = 0;
unsigned char siton_et_size = 0;

void SITONserialRead(void)
{

 int limit;
 unsigned char rC;

 limit = 80;

 while (1 == SDS_serial_read(1, (void *) &amp;rC, 1))
 {
   if (0 == siton_et_hlavicka)
   {
     if (0x06 == rC) siton_et_hlavicka = 1;
     siton_et_ptr = 0;
     siton_et_chk = 0;
   } else
   if (1 == siton_et_hlavicka)
   {
     if (0x85 == rC) { siton_et_hlavicka = 2; } else { siton_et_hlavicka = 0; }; 
   } else
   if (2 == siton_et_hlavicka)
   {
     siton_et_size = rC;
     if (siton_et_size != sizeof(struct SitonPayloadTX)) // musi odpovidat na obou stranach
     {
       siton_et_hlavicka = 0;
     } else
     {
       siton_et_chk = siton_et_size;
       siton_et_hlavicka = 3;
     }
   } else
   if ((siton_et_hlavicka &gt;= 3)&amp;&amp;(siton_et_hlavicka &lt; 3+siton_et_size))
   {
     // payload
     sitonpay[siton_et_ptr] = rC;
     siton_et_chk ^= rC;
     siton_et_ptr++;
     siton_et_hlavicka++;
   } else
   if (siton_et_hlavicka == 3+siton_et_size)
   {
     // crc
     if (rC == siton_et_chk)
     {
       memcpy((void *)&amp;siton, (void *)sitonpay, sizeof(struct SitonPayloadTX));

       siton_stari_zpravy = 0;

       if (old_siton_data4 != siton.data4)
       {
         old_siton_data4 = siton.data4;
//         print_time();
         printf(&quot; [%u %u %u %u] %uV %u.%02uA %uW %uC %u\n&quot;, siton.nodeID, siton.address, siton.command, siton.func, siton.data1, siton.data2/100, siton.data2 % 100, siton.data3, siton.data4, siton.data9);
       }
     }
     siton_et_hlavicka = 0;
   } else
   {
     // unknown state
     siton_et_hlavicka = 0;
   }

   // rs485 rx counter
   if (0 == limit) break;
   limit--;
 }

}

void main(void)
{
 SDS_serial_config(1, 9600, 8, 1, 0);

 memset(&amp;siton, 0, sizeof(struct SitonPayloadTX));

  // pro jednoduchost je zde jen tato nekonečná smyčka
  while (1)
  {
     SITONserialRead();
     // pro každou přijatou zprávu funkce výše provede její výpis do konzole...
  }

}</code></pre></div><p>Funguje to OK pro celou řadu uživatelů...</p><p>Přímo pro vzorový program na MODBUS-485 zkuste napsat zdejšímu členovi fóra s uživatelskou zkratkou &quot;J@M&quot;.</p>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2020-12-29T10:04:03Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6854#p6854</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6853#p6853" />
			<content type="html"><![CDATA[<p>Po delší době jsem se vrátil ke čtení dat ze RS485, ale program mi vždy zkolabuje.<br />Vzal jsem tedy z fora program, který měl být funkční jen jsem upravil odesílaná data pro své relé, ale je to&nbsp; také stejné s každým přečtením se zvyšuje STACK až dojde k přetečení. Zvýšení Stacku při kompilaci jen oddálí pád programu.</p><p>Pokud program ještě jede, tak čte správně hodnoty ze sériové linky až do okamžiku jeho zastavení. Co udělat pro to , aby se program po x načtených hodnotách nezastavil?</p><p>Když sem program zkopíruji, tak mi nejde příspěvek odeslat.</p>]]></content>
			<author>
				<name><![CDATA[krevla]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=34</uri>
			</author>
			<updated>2020-12-29T01:38:34Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6853#p6853</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [vyřešeno] RS 485 / stack]]></title>
			<link rel="alternate" href="https://forum.sds.an-d.cz/viewtopic.php?pid=6481#p6481" />
			<content type="html"><![CDATA[<p>Před odesláním příkazu, po kterém bude chtěno přečíst odpověď, stačí celý vstupní buffer přečíst a tím jeho případný obsah zahodit; zbyde tak celý prázdný a tím pádem připravený pro příchozí odpověď.</p>]]></content>
			<author>
				<name><![CDATA[adamn]]></name>
				<uri>https://forum.sds.an-d.cz/profile.php?id=7</uri>
			</author>
			<updated>2018-12-22T15:53:34Z</updated>
			<id>https://forum.sds.an-d.cz/viewtopic.php?pid=6481#p6481</id>
		</entry>
</feed>
