Více čidel na RS485

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Více čidel na RS485

Příspěvek od kiRRow » 19 pro 2019, 19:12

Další co by mě zajímalo je ... co udělá čidlo po tom, co příjme po RS485 zprávu, která není pro něj ?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Více čidel na RS485

Příspěvek od ondraN » 19 pro 2019, 19:23

Podívej se na ten kód

Kód: Vybrat vše

  if (counter==10)  { 
      RS485.write("*BE0+045.8C");      // protokol -> *B=instrukce E0= adresa cidla a pak teplota
       while (RS485.available() > 0) {   // Read serial input:
        int inChar = RS485.read();
Předpokládejme že je před RS485.write() přijímací buffer prázdný, tedy RS485.available()==0
Pak pošleš RS485.write("*BE0+045.8C");
a pak se hned ptáš while (RS485.available() > 0)
Ale v tom okamžiku je stále ještě tedy RS485.available()==0, protože se ještě pravděpodobně vysílá z vysílacího bufferu a čidlo nedostalo zatím kompletní zprávu. Takže se z toho while neprovede nic.

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 19:25

Nic ignoruje jí. To šlape na 100%. Zkusil jsem tu zapojit na sběrnici 10 čidel a krásně jedno po druhém čtu.
Jak z Terminálu - s 485 převodníkem, tak i tady v tom prográmku, kdy měním kody...
Jsou to čidla od Papoucha.com TQS1 a nové TQS3. šlapou jak švýcary...

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 19:28

Ondro to máš asi pravdu, ale jak to, že to s jedním funguje a i když dám po vysílání delay(2000) tak ho stejně přečtu, protože visí v Bufferu.
A další čidlo je oslovováno stejně až za dlouho... :-( i když nastavím ten můj pseudo counter na čtení po minutě :-(

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Více čidel na RS485

Příspěvek od kiRRow » 19 pro 2019, 19:32

ondraN píše:
19 pro 2019, 19:23
Podívej se na ten kód

Kód: Vybrat vše

  if (counter==10)  { 
      RS485.write("*BE0+045.8C");      // protokol -> *B=instrukce E0= adresa cidla a pak teplota
       while (RS485.available() > 0) {   // Read serial input:
        int inChar = RS485.read();
Předpokládejme že je před RS485.write() přijímací buffer prázdný, tedy RS485.available()==0
Pak pošleš RS485.write("*BE0+045.8C");
a pak se hned ptáš while (RS485.available() > 0)
Ale v tom okamžiku je stále ještě tedy RS485.available()==0, protože se ještě pravděpodobně vysílá z vysílacího bufferu a čidlo nedostalo zatím kompletní zprávu. Takže se z toho while neprovede nic.
Už v momentě prvního platného přijatého znaku je něco v "bufferu" ... jenže ten znak má několik 0/1 + start a stop ... parita? ... ani náhodou se tam nestihne dostat. A pak už není counter 10 :(. Takže v bufferu se to hromadí ... counter je 20 ... čidlo si přečte zprávu co není pro něj ... ani ji nestihne dočíst (jestli vyprázdní buffer dřív než se to odešle celý) ... a pak už není counter 20 :( ...

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 19:49

No počkej, dokud cykl neopustí smyčku, tak je pořád tam kde je counter 20. Teprve pak vyleze ven a projede celý SW
a teprve znova na začatku Loop je counter +1. To taky asi nebude problém, když ostatní zakometuju - jakýkoli - a nechám běžet jen jedno.
tak nevím, asi děláme někde jinou chybu.

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Více čidel na RS485

Příspěvek od kiRRow » 19 pro 2019, 19:52

Pokud jedna část programu samostatně pracuje .... a druhá část samostatně pracuje taky .... a dohromady obě nefungují, tak je problém nejspíše tam, jak režíruješ jejich obsluhu současně.

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 19:54

Já vím, že nic nevím...... jasně že dělám někde chybu, proto tu žádám o radu, či změnu kodu.
Prostě jak obsloužit jednoho, pak si dát pauzu a obsloužit druhého atd atd. Kde dělám chybu?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Více čidel na RS485

Příspěvek od ondraN » 19 pro 2019, 20:09

Zkus u každého čidla vložit tohle"

Kód: Vybrat vše

  if (counter==10)  { 
  	while(RS485.available()>0){
  	  RS485.read();
  	  }		// vyprazdni cely prijimaci buffer
      RS485.write("*BE0+045.8C");      // protokol -> *B=instrukce E0= adresa cidla a pak teplota
       while(RS485.available()==0){
         delay(1);
         }  // ceka, dokud nezacne cidlo neco posilat, pozor, pokud cidlo bude odpojene tak se odtud program nedostane, nutne zaradit nejaky timeout
         //tady uz je neco v prijimacim bufferu, tak mohu zacit cist a zpracovavat
       while (RS485.available() > 0) {   // Read serial input:
        int inChar = RS485.read();
        delay(2); // male zpozdeni aby se buffer nevycetl rychleji, nez se staci plnit
        inString += (char)inChar;           //PŘÍKLAD  *BE0+045.8C

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Více čidel na RS485

Příspěvek od AstroMiK » 19 pro 2019, 20:21

Zkus něco takovéhodle:

Kód: Vybrat vše

if (counter==20)
  { 

    while (RS485.available())   // vymaže buffer, kdyby v něm náhodou byly nějaké zbytky dat z předchozích čidel
      {
        RS485.read();
      }

                              // odeslání žádosti
    RS485.write(84);          //84,77,73,13 = "TMI"<CR>
    RS485.write(77);          // u tohoto je M=adresa
    RS485.write(73);
    RS485.write(13);

    delay(800);               // měření trvá až 700 ms, tak se dá ještě nějaká rezerva na přenos
   
    while (RS485.available() > 0)       // pak bych jen převedl celý přijímací buffer do řetězce
      {       // Read serial input:     //PŘÍKLAD  "*M+020.8C"<CR>
        int inChar = RS485.read();
        inString += (char)inChar;           
      }


     adr = inString.charAt(1);                             // na závěr z řetězce vysosat potřebné údaje
     hodnota = inString.substring(4,6).toInt() * 10;
     hodnota = hodnota + inString.substring(7,8).toInt();

     Serial.print(adr); Serial.print("  ");
     Serial.println(hodnota);
     inString = ""; 
  }


if (counter==30)
  { 
    // to samý jako při  (counter==20) - kromě adresy v žádosti
  }

if (counter==40)
  { 
    // to samý jako při  (counter==20) - kromě adresy v žádosti
  }


Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů