1

Téma: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Viz následující příspěvek (původní dotaz) ohledně zprovoznění RS485 sběrnice pro SDS-BIG v konkrétním uživatelském zapojení.

Řešení je teméř v posledním příspěvku (citace: S odporem mezi +5V a RS485 A+ vše OK.).

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

2

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Dobrý den

Potřebuji poradit s komunikací po 485 a SDS-BIG.
Mám modul od Papoucha QUIDO RS 2/16 OC a SDS-BIG. Propojil jsem je podle návodu uvedeného v tomto foru. Zařízení komunikují. Posílám dotaz pravidelně co 1s a co následující 1s vyčítám odpověď tak Quido odpoví 4x a potom náhodný počet vyslání a vyčítání neodpoví, poté zase na 4 dotazy odpoví a zase se opakuje pořád dokola stav kdy neodpovídá.

Je zajímavé že obě zařízení pokud je připojím k PC přes převodník UC485S od Papoucha a ve Visual Basicu napíšu program který odpovídá SDS-BIG nebo se dotazuje Quida tak vše funguje bez problémů a i o hodně rychleji než co 1s. Oba zařízení odpovídají pořád.

Nevím kde mám chybu. Přikládám program - podotýkám že jsem začátečník a toto je můj první program.

int nastav_quido_rele(int rele, char stav)
{
  char prikaz[9];
  char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};

  /* Komunikace s Quido*/
  prikaz[0] = '*';
  prikaz[1] = 'B';
  prikaz[2] = '$';
  prikaz[3] = 'O';
  prikaz[4] = 'S';
  if (rele<<10)
     {
       prikaz[5] = relech[rele];
     };
  prikaz[6] = stav;
  prikaz[7] = toascii(0x0d);
  prikaz[8] = '\0';
  printf("%s\n", prikaz);
  SDS_serial_write(1, (char *)prikaz, 8);
  return(1);
}


void main(void)
{ /* deklarace promennych */
   unsigned int milis, old_milis_1s;
   int vysledek, i, cit_prijmu;
   char odpoved[7];

  /* Inicializace linky 485 */
  SDS_serial_config(1, 9600, 8, 1, 0);

  /* pořád se opakuje */
  for (;;)
      {
        milis = SDS_get_u(45);
        /* sekundovy citac */
        if ((milis-old_milis_1s)>=1000)
           {
             old_milis_1s = milis;

             /* Vse co bezi co 1s */
             /* Komunikace s Quido */
             if (vysledek==0)
                {
                  vysledek = nastav_quido_rele(1,'H');
                }
             else
                {
                  i = SDS_serial_read(1, (char *)odpoved, 7);
                  printf("%u\n", i);
                  cit_prijmu++;
                  if (i==5)
                     {
                       printf("%s\n", odpoved);
                       vysledek = 0;
                     };
                  /* opakovani kdyz neprijde odpoved */
                  if (cit_prijmu>>2)
                     {
                       cit_prijmu = 0;
                       vysledek = 0;
                     };
                };
             printf("Vysledek: %u\n",vysledek);
           };
      };
}

3

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Co třeba takto?:

char _odpoved[50];  //buffer
unsigned int res[20];  //cela odpoved
unsigned int _res;  //res[] index

void main(void)
{
    SDS_serial_config(1, 9600, 8, 1, 0);
    while(1){
        nastav_quido_rele();
        wait(100);  //pockam na odpoved 100ms
        readdata();
        wait(1000);  //1s prodleva
    }
}

int readdata()
{
    unsigned int _rss = 0;
    unsigned int _retval = 0;
    unsigned int _pru = 0;
    _res=0;
    while (1) {
        _rss = SDS_serial_read(1, _odpoved, 50);
        //pokud nic nedostanu, dam mu jeste sanci
        if (_pru <= 5 && _rss == 0 && _retval == 0) {
            wait(100);
            _pru++;
        }
        else {
            if (_rss == 0) { break; }
            _retval += _rss;
            _pru = 0;
              printf("Odpověď: (délka %u)", _rss);
            unsigned int i;
            for (i=0; i<_rss; i++){
             res[_res]=_odpoved[i];
             _res++;
             printf(" %02x", _odpoved[i]);
            }
            printf("\n");
        }
    }
    if(_retval == 0) {
     printf("Žádná odpoveď!\n");
    }
    return _retval;
}

int nastav_quido_rele(int rele, char stav)
{
  char prikaz[9];
  char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};

  /* Komunikace s Quido*/
  prikaz[0] = '*';
  prikaz[1] = 'B';
  prikaz[2] = '$';
  prikaz[3] = 'O';
  prikaz[4] = 'S';
  if (rele<<10)
     {
       prikaz[5] = relech[rele];
     };
  prikaz[6] = stav;
  prikaz[7] = toascii(0x0d);
  prikaz[8] = '\0';
  printf("%s\n", prikaz);
  SDS_serial_write(1, (char *)prikaz, 8);
  return(1);
}

4

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Děkuji za odpověď.
Momentálně jsem byl mimo domov takže jsem to odzkoušel až tento týden.
Bohužel je to stejné.
Dokonce jsem zjistil že pokud do zařízení nahraju user.htm stránku která načítá sdílené proměnné co 5s tak
počet nepřijatých odpovědí se zvýší a odpoví pouze 2 z 10.
Jakmile stránku zavřu tak se to vrátí na původní chybovost.
Proto jsem systém rozdělil na 2 a předávám si signály pomocí digitálních vstupů.

5 Naposledy upravil: Hanes (2017-02-03 23:50:31)

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Dobrý den,

již několik dní se pokouším rozchodit komunikaci přes RS485.

K SDS mám připojenou IO kartu na způsob QUIDA od Papoucha.
Pokud je karta připojena přes převodník k počítači, vše je OK.

Pokud použiju přiklad, který výše uvedl j@m, jen změním pole příkaz[] na příkaz pro mou kartu, vše funguje. SDS odešle příkaz do karty a v Console si přečtu odpověď z karty.
Jakmile však provedu další úpravu v programu, zdánlivě nesouvisející s během programu. Např. smažu pole relech[], protože jej nepoužívám. Prikaz[5] přímo nadefinuji. V Console čtu neúplnou, zkreslenou nebo žádnou odpověď.

Proto bych rád poprosil jestli zde nemá někdo odladěné funkce pro zápis a čtení přes RS485.
Nebo, nemohl by někdo přesně vysvětlit funkce SDS_serial_write a SDS_serial_read.

Předem dík.

Hanes

6

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Prikaz [5] obsahuje adresu rele. to nelze smazat. Starý c-program mohl vypadat např. takto:

   _s=0x4c;  //L
   serial_text_out('*B$OS',0x31, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x32, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x33, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x34, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x35, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x36, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x37, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x38, _s, 0x0D); //hex cislo 2
   wait(100);
   serial_text_out('*B$OS',0x39, _s, 0x0D); //hex cislo 2

7

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Popis funkcí je zde:
http://wiki.merenienergie.cz/index.php/FULL-C_serialbus_functions
http://wiki.merenienergie.cz/index.php/SDS-BIG_and_RS485

serial write posílá do linky data která jsou v poli *ptr o délce len.

kdysi jsem pouzil neco takového:

//void senddata(char * write)
void senddata(int _delka)
{
    char _data[10];
    unsigned int i;
    printf("Příkaz: .....(délka %u)", _delka);
    for (i=0; i<_delka; i++){
     _data[i]=ram[130+i];
     printf(" %02x", _data[i]);
    }
    printf("\n");
    SDS_serial_write(1, _data, _delka);
    wait(50);  //pockam na odpoved 50ms
}

int readdata()
{
    unsigned int _rss = 0;
    unsigned int _retval = 0;
    unsigned int _pru = 0;
    _ram=150;
    while (1) {
        _rss = SDS_serial_read(1, _odpoved, 50);
        //pokud nic nedostanu, dam mu jeste sanci
        if (_pru <= 5 && _rss == 0 && _retval == 0) {
            wait(100);
            _pru++;
        }
        else {
            if (_rss == 0) { break; }
            _retval += _rss;
            _pru = 0;
              printf("Odpověď: (délka %u)", _rss);
            unsigned int i;
            for (i=0; i<_rss; i++){
             //_data[i]=ram[130+i];
             ram[_ram]=_odpoved[i];
             _ram++;
             printf(" %02x", _odpoved[i]);
            }
            printf("\n");
        }
    }
    if(_retval == 0) {
     printf("Žádná odpoveď!\n");
    }
    return _retval;
}

senddata() se spouští na nejakou akci, readdata() se spouští po senddata se zpožděním.

8

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Pouziju program z predchozich prispevku:

int nastav_quido_rele()
{
  char prikaz[8];
  char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};

  /* Komunikace s Quido*/
  prikaz[0] = (16);
  prikaz[1] = (2);
  prikaz[2] = (0);
  prikaz[3] = (0);
  prikaz[4] = (0);
  prikaz[5] = (4);
  prikaz[6] = (0x7A);
  prikaz[7] = (0x88);
  SDS_serial_write(1, prikaz, 8);
  return(1);
}

Výstup z konzoly:

Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 88 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
Odpověď: (délka 6) 10 02 01 05 64 b7
...

Potom jen udelam poznamku z deklarace pole relech[11], ktere nikde nepouzivam:

//  char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};

a vystup na konzole je:

Odpověď: (délka 6) 10 02 01 05 64 b7
Žádná odpoveď!
Žádná odpoveď!
Žádná odpoveď!
Žádná odpoveď!
Žádná odpoveď!
Žádná odpoveď!
Žádná odpoveď!
Žádná odpoveď!
...

Opravdu nevim, kde muze byt problem. Dekuju za kazdou radu.

9

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Hanes napsal:

Opravdu nevim, kde muze byt problem. Dekuju za kazdou radu.

Používáte nejposlednější firmware ?

Opravdu to byla jediná změna v celém FULL-C kódu který je ve vašem zařízení spuštěn?

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

10

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Ano, pouze jediná změna v programu.

V SDS FW 20.1.2017.

Po updatu na FW 6.2.2017 je výsledek následující:

char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};

Odpovìï: (délka 6) 10 02 01 05 64 b7

Odpovìï: (délka 6) 10 02 01 05 64 b7

Odpovìï: (délka 6) 10 02 01 05 64 b7

Odpovìï: (délka 6) 10 02 01 05 64 b7

Odpovìï: (délka 6) 10 02 01 05 64 b7
...

po vypoznámkování:

//  char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};

Odpovìï: (délka 4) a0 05 64 b7

Odpovìï: (délka 4) a0 05 64 b7

Odpovìï: (délka 4) a0 05 64 b7

Odpovìï: (délka 4) a0 05 64 b7

Odpovìï: (délka 4) a0 05 64 b7
...

K nějaké změně došlo ale pořád to není ono.

11

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Máte nastavený dostatečně veliký zásobník (stack) pro váš program ? Zkuste to zvýšit a program znovu do SDS nahrát.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

12

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

V SDS mam nahran pouze kraticky program uvedeny vyse.
Se zasobnikem jsem experimentoval a nema na to vliv.
Uz si zacinam myslet, ze jde o chybu hw.

13

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Máte správně zapojenou linku RS485? viz http://wiki.merenienergie.cz/index.php/ … _and_RS485 .

Vyzkouším ten program na SDS (váš externí HW ale nemám) a zkusím zjistit co se tam děje.
Pokud to bude chyba FW, vydá se nový.
Mezitím ověřte to zapojení, zda-li odpovídá nastavení komunikace na obou stranách (rychlost atd).,
plus ověřte že váš externí hardware funguje OK když se přes jiný převodník připojí např. k vašemu PC a pošlou se stejné příkazy.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

14

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

1.
Ověřil jsem, že na sběrnici se vysílají stejné znaky ve všech variantách programu, které jsou zde uvedeny (tj. původní a zjednodušená, obě jak se zakomentovanou tak přítomnou deklarací).
Takže bude něco buď s SDS (že by časování ovládání směru RX/TX na RS485 nebylo přesné? to už by chtělo osciloskop na řídící piny RS485 chipu a zkontrolovat),
nebo spíše viz bod #2.

2.
Zřejmě, externí HW deska kterou používáte, potřebuje nějaký čas na vnitřní zpracování příkazů a nebo něco takového podobného.

Zkuste tam cvičně (jen pro pokus a ověření teorie) přidat čekání, tzn. vhodně proložit kód tímto:

 wait(500); // wait for 500 msecs

Tzn. po poslání příkazu do externí HW desky, dejte tam to umělé zpoždění a pak teprve sledujte odpověď.


3.
V prvním programu (nahoře) vydím i jinou "chybu". I když je pravda že pozdější příklad ji tam už nemá.

Proměnná "prikaz" není inicializovaná, nelze se tedy spoléhat na to co v ní bude.

  char prikaz[9];

Proto ji celou kousek po kousku nastavíte...

  prikaz[0] = '*';
  prikaz[1] = 'B';
  prikaz[2] = '$';
  prikaz[3] = 'O';
  prikaz[4] = 'S';

Ale v případě že neplatí podmínka "(rele<<10)" tak se "prikaz[5]" nevyplní známou hodnotou.

  if (rele<<10)
     {
       prikaz[5] = relech[rele];
     };

4.
Zkuste ještě SDS-BIG BETA firmware ze 7.3.2016 a dejte vědět.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

15 Naposledy upravil: Hanes (2017-03-07 22:36:57)

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

ad 1. s nejvetší pravdepodobnosti to bude ten problem
ad 2. zadna zmena
ad 3. toto v mem programu neni
ad 4. Update FW nepomohlo


Vypis celeho programu v SDS:

char _odpoved[50];  //buffer
unsigned int res[20];  //cela odpoved
unsigned int _res;  //res[] index

void main(void)
{
    SDS_serial_config(1, 9600, 8, 1, 0);
    while(1){
        nastav_quido_rele();
        wait(500);  //pockam na odpoved 100ms
        readdata();
        wait(1000);  //1s prodleva
    }
}

int readdata()
{
    unsigned int _rss = 0;
    unsigned int _retval = 0;
    unsigned int _pru = 0;
    _res=0;
    while (1) {
        _rss = SDS_serial_read(1, _odpoved, 50);
        //pokud nic nedostanu, dam mu jeste sanci
        if (_pru <= 5 && _rss == 0 && _retval == 0) {
            wait(100);
            _pru++;
        }
        else {
            if (_rss == 0) { break; }
            _retval += _rss;
            _pru = 0;
              printf("Odpověď: (délka %u)", _rss);
            unsigned int i;
            for (i=0; i<_rss; i++){
             res[_res]=_odpoved[i];
             _res++;
             printf(" %02x", _odpoved[i]);
            }
            printf("\n");
        }
    }
    if(_retval == 0) {
     printf("Žádná odpoveď!\n");
    }
    return _retval;
}

int nastav_quido_rele()
{
  char prikaz[9];


//  char relech[11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'}; 


  /* Komunikace s Quido*/
  prikaz[0] = 1;
  prikaz[1] = 6;
  prikaz[2] = 0;
  prikaz[3] = 1;
  prikaz[4] = 1;
  prikaz[5] = 0;
  prikaz[6] = (0xD9);
  prikaz[7] = (0x9A);
  prikaz[8] = '\0';
  printf("%s\n", prikaz);
  SDS_serial_write(1, (char *)prikaz, 8);
  return(1);
}

16

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

V nejbližší době se dostanu k tomu to změřit.

Zdá se že konkrétní externí HW deska, kterou používáte, je velmi citlivá na časování, a asi jí chování SDS nesedí.

Pokud to můžete změřit i u sebe, na své sestavě, a poslat sem obrázky (nebo na můj mail) tak by to bylo super.

Je důležité aby byl zapojen ten externí 390R rezistor, viz wiki, jinak se RS485 sběrnice může dostávat do neurčeného stavu, a to také může být důvod problémů.
Máte propojený i RS_GND vodič mezi SDS a externí HW deskou (na svorkovnici SDS třetí pin z kraje, kde první a druhý pin konektoru jsou sběrnice samotná) ?

Ale podle popisu to bude chtít asi trochu poladit firmware - nicméně pro to je nejprve potřeba měření (osciloskop) (mám, ale až se k tomu dostanu).
Při původním vývoji jsme to důsledně změřili a RS485 driver (SDS) vypne nejhůře do 1.5msec od posledního vyslaného znaku.
Musí se teď ověřit že se to nezměnilo, a také by mne zajímalo jak to vypadá na konkrétní sestavě (vaše konkrétní zapojení).

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

17 Naposledy upravil: Hanes (2017-03-11 01:17:37)

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

1. měření: s deklaraci; bez připojeného slave zařízení
http://jjtech.rajce.idnes.cz/RS485/#WP_20170310_22_14_02_Pro.jpg

2. měření: se zakomentovanou deklaraci; bez připojeného slave zařízení
http://jjtech.rajce.idnes.cz/RS485/#WP_20170310_22_15_21_Pro.jpg

3. měření: se zakomentovanou deklaraci; s připojeným slave zařízením
http://jjtech.rajce.idnes.cz/RS485/#WP_20170310_22_51_58_Pro.jpg

Detail 3. měření:
http://jjtech.rajce.idnes.cz/RS485/#WP_20170310_22_53_02_Pro.jpg

Kanál A: mezi vodiči A a B sběrnice RS485
Kanál B: mezi negRE+DE a zemí

Při zakomentování deklarace dojde k prodloužení posledního pulsu.
Periferní zařízení začne odpovídat do tohoto pulsu, kdy ještě není přepnut směr komunikace.

Hanes

18

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Jo, tady to jde velmi dobře vidět.

Obrázek (WP_20170310_22_51_58_Pro.jpg) to krásně ukazuje, připojený slave odpovídá dříve, než master uvolnil linku.

Předpokládám průběh B je přímo z chipu na straně logiky, a průběh a je jeden z vodičů na RS485.

Zajímavá souhra. Jsem rád že jste to objevil a poslal sem.

Rychlý dotaz - skutečně komentáře pro #1 a #2 odpovídají - čekal bych že pokud to zakomentované není, tak právě dojde k "nechtěnému" prodložení. Jen pro jistotu se ujisťuji tímto dotazem.

Uvnitř firmware jde o to, že vypínání RS485 master drive nebylo dáno do oblasti s tak velkou prioritou takže může dojít ke zpoždení vypnutí až o 1 msec. Je to teď v 1msec timeru který může být dočasně zakázán (to se děje u různých akcí kde je potřeba vnitřní atomický přístup uvnitř kódu SDS) a tím se může až o 1msec zpozdit.
Takto to je v SDS od začátku a předpokládal jsem, že by to neměl být problém.
Ale toto měření jasně ukazuje že s vaším daným slave HW to problém je.

Co to je za zajímavý slave HW, který odpovídá prakticky okamžitě ?
To v podstatě ani není "správný" přístup k sériové sběrnici, aspoň chvíli je vždy dobré (jako slave se svou odpovědí) počkat, aby se sběrnice ustálila, popřípadě aby se právě zamezilo kolizím jako je tato.
Předpokládám že ale slave HW nebudete schopen nijak upravit, jedině snad napsat výrobci . . . ale to jedno, podíváme se na to ze strany SDS a vyřeší se to tam.

Ještě to změřím u sebe a v průběhu týdne bude k dispozici upravený firmware.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

19

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Opravdu je to tak. Pokud radek neni zakomentovan, vse je OK.

Pro svůj projekt potřebuju hodně digitálních vstupů a výstupů, proto testuju různé karty "neznámých" výrobců. Neco za způsob tohoto:

https://www.x.com/item/8CH-12V-Modbus-RTU-RS485-Relay-Module-Switch-Board-for-PLC-Lamp-LED-PTZ-Camera/3.html

Mám několik podobných karet a všechny se chovají stejně(odpovídají ihned).
Při připojení k PC přes převodník vše OK.

Každopádně jsu rád, že se přišlo na to, kde je problém. A bude super, když se to vyřeší updatem firmware v SDS.

20

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Takže změřeno a změněno.
Vyzkoušejte BETA FW 14.3.2017 (nebo novější podle dostupnosti).

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

21

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Povedlo se vam to overit (ze vse funguje jak ma) s novym FW?

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

22

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

S novym FW mám odezvu Zadna odpoved.

Nyní nemám možnost podívat se co se děje na lince osciloskopem.

Během příštího týdne připojím osciloskop a dám vědět.

23

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Časování vypadá dobře - podle osciloskopu je přesné přes celý rozsah rychlostí - takže tam bude ještě asi jiný problém. Hm.

Zkuste vypsat do konzole co vám to specificky vrací (čtení z rs485) . . . jestli to odpovídá tomu co je očekávané.

Já si mezitím seženu nějakou IO desku a zkusím to u sebe...

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

24

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Časování s novým FW je opravdu již v pořádku.

Můj další problém jsem objevil jinde - zabezpečení klidového stavu na sběrnici.

Ve starší verzi FW (070317_EN_BETA) při přepnutí sběrnice na vysílání SDS naskočila nejprve log.1, teprve potom start bit prvniho vysílaného byte (log.0). 
Viz obrázek:  http://jjtech.rajce.idnes.cz/RS485_v2/#WP_20170322_21_23_21_Pro.jpg

V nové verzi FW (140317_EN_BETA) se tomu tak uz nestalo.
Viz obrázek:  http://jjtech.rajce.idnes.cz/RS485_v2/#WP_20170322_21_19_54_Pro.jpg

Slave tedy nezachytil start bit prvniho byte (adresní) a tudíž neodpovídal.

Zkusmo jsem připojil odpor 120 Ohm mezi 1W-A +5V a RS485 A+ a slave začal odpovídat (odpor 390 Ohm mezi B- a BUS GND mám).
http://jjtech.rajce.idnes.cz/RS485_v2/#WP_20170322_22_05_27_Pro.jpg

Nyní je otázkou zda je zabezpečení klidového stavu tímto způsobem správné.
Nezkoumal jsem vnitřní zapojení SDS a nevím jestli můžu použít výstup 1W-A +5V.

Dnes jsem neměl moc času. O víkendu zkusím ještě zaexperimentovat s odpory na sběrnici a udělat lepší měření.

25

Re: [vyřešeno] Jak zprovoznit RS485 na SDS-BIG

Zkuste BETA FW 23.3.2017, je tam přidáno drobné zpoždení pro vysílání prvního znaku, třeba to pomůže.

Master RS485 je realizovan chipem uvnitř SDS-BIG, a je provozován na napětí 3V3, nicméně 5V na samotné sběrnici (A+, B-) mu neublíží (tak dlouho jak jsou propojeny GND spojky mezi každým zařízením a zdroji atd.).
Na svorky A+,B- je chip připojen přímo přes sériové rezistory 10ohmů, které se v normálním stavu prakticky neuplatní (jsou tam jen jako bezpečnostní prvek). A samozřemě rezistor 120ohmů napříč, tam také je.
Ten externí rezistor 390ohmů mezi B- a GND je požadován právě z důvodu definice klidového stavu linky. Toto lze řešit i jinými způsoby, takže není se třeba čeho obávat a lze zkoušet takové zapojení, které bude dané instalaci vyhovovat.

Dejte vědět jestli ten novější FW funguje.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !