[C++] RS485 multypoint probleem

Pagina: 1
Acties:

  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
Hoi,

Ik ben hier bezig om een aantal pc's te koppelen op een RS485 bus. Hiervoor gebruik ik beiden varianten (2 en 4 draads variant). Op de bus heb ik 1 hoofdcomputer aangesloten waarop ik vervolgens een N aantal client computer bijsluit. Die hoofdcomputer stuurt aanvragen naar de clients, die daarop antwoorden met bepaalde data uit hun process. Elke client heeft een eigen nodenaam en die naam word bij elke aanvraag ook de master meegegeven. Als het pakketje niet matched negeert hij het pakketje, anders antwoord hij met de gevraagde data.

Het probleem is nu dat ik al die tijd getest heb met 1 master en 1 client. Dit werkt helemaal geweldig tot ik een 2'de client op de bus aansloot. Die 2'de node ontvangt nu alleen maar rotzooi. Als ik de eerste node uitzet ontvangt de tweede wel correcte data. Alleen de eerste op de bus aangesloten client ontvangt dus data. Terwijl 485 juist zo is gemaakt dat alle apparaten elektrisch op de bus aangesloten alles ontvangen.

Het openen van de seriele poort doe ik op deze manier
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    // old and new serial port settings
    termios oldtio;
    termios newtio;

    // Opening serial port based on Serial-Programming-HOWTO, chapter 3.2
    this->connection = open(this->iodevice.c_str(), O_SYNC | O_RDWR | O_NOCTTY | O_NONBLOCK);

    if (this->connection < 0)
    {
            return false;
    }

    tcgetattr(this->connection, &oldtio);

    bzero(&newtio, sizeof(newtio));

    newtio.c_cflag = BAUDRATE | CS8 | CREAD | CLOCAL;

    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;

    newtio.c_cc[VTIME]=10; // 1.0 seconds timeout before read will return
    newtio.c_cc[VMIN]=1; // read has to read something

    tcflush(this->connection, TCIFLUSH);
    tcsetattr(this->connection, TCSANOW, &newtio);


Het versturen doe ik zo
code:
1
2
3
4
5
6
7
8
9
10
tcflush(this->connection, TCIFLUSH);

    //ioctl(this->connection, TIOCMBIC, &rts);  //2draads

    int res = write(this->connection, data.c_str(), data.length());
    
    do
    {
       ioctl(this->connection, TIOCSERGETLSR, &arg);
    }while((arg & TIOCSER_TEMT)==0);



Het ontvangen doe ik zo
code:
1
2
3
4
5
6
7
8
9
        //ioctl(this->connection, TIOCMBIS, &rts);   //2draads

    bzero(totalreceived, sizeof(totalreceived));

    while ((!timeout)&&(length<bytestoread))
    {
        bzero(received, sizeof(received));
        res = read(this->connection, received, bytestoread);
        .......


Heeft iemand een idee heo het kan dat de eerste node ervoor zorgt dat ik op de nodes erachter niets goeds meer ontvang?Na het dagenlang nalezen van de 485 specs enzo snap ik het echt niet meer.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Ik weet niet welke 232->485 omzetters je gebruikt, maar bij sommige types moet je met de RTS lijn de transmitter in high impedance toestand schakelen als je niet transmit. ( Dit is bijvoorbeeld bij omzetters van BEM het geval, andere doen aan autosensing bv ADAM )

Maw, een send is een combinatie van RTS hoog, zenden, RTS laag. Als je de transmitter hoog laat van een node, zal het signaal niet correct aankomen.

Btw, 485 heeft wel een 4 draads variant, maar dit wordt erg weinig gebruikt. Dit is waarschijnlijk 422.

[ Voor 13% gewijzigd door farlane op 03-05-2004 12:02 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
ik gebruik geen omzetters, het is een dimm-pc, het bordje waar de dimm-pc inzit heeft een (werkende)485 poort. Hierdoor hoef ik dus niets te doen met de RTS signalen als ik de 4 draads variant gebruik. Bij de 2 draads zal dat wel moeten. Tenminste wat ik ervan gehoord/gelezen heb.

Btw Naar mijn weten heeft RS485 wel degelijk een 2 en 4 draads variant. Jij doelt denk ik op RS422 maar dat is geen multypoint en RS485 wel, of je het nu met 2 of 4 draden doet.

[ Voor 26% gewijzigd door GAEvakYD op 03-05-2004 12:01 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GAEvakYD schreef op 03 mei 2004 @ 11:58:
ik gebruik geen omzetters, het is een dimm-pc, het bordje waar de dimm-pc inzit heeft een (werkende)485 poort. Hierdoor hoef ik dus niets te doen met de RTS signalen als ik de 4 draads variant gebruik. Bij de 2 draads zal dat wel moeten. Tenminste wat ik ervan gehoord/gelezen heb.
Dat is niet zeker, het kan goed zijn dat je alsnog de transmitter in high-impedance moet schakelen ( van de slaves iig in vierdraads modus ), omdat je anders het signaal dat de tweede slave verstuurt naar de master vernaggelt.
Btw Naar mijn weten heeft RS485 wel degelijk een 2 en 4 draads variant. Jij doelt denk ik op RS422 maar dat is geen multypoint en RS485 wel, of je het nu met 2 of 4 draden doet.
Je hebt gelijk.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
farlane schreef op 03 mei 2004 @ 12:07:
Dat is niet zeker, het kan goed zijn dat je alsnog de transmitter in high-impedance moet schakelen ( van de slaves iig in vierdraads modus ), omdat je anders het signaal dat de tweede slave verstuurt naar de master vernaggelt.
En daar heb jij weer gelijk in. Op de printplaat van het bordje zit een chipje die het signaal omzet van en naar RS485.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GAEvakYD schreef op 03 mei 2004 @ 12:42:
En daar heb jij weer gelijk in. Op de printplaat van het bordje zit een chipje die het signaal omzet van en naar RS485.
Wij gebruiken daarvoor vaak een Maxim MAX485. Deze heeft een pin ( driver enable ) waarmee je de transmitter kunt schakelen. Je zou de docs van je dimm pc moeten doorlezen om te kijken of de RTS idd je transmitter schakelt.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
Dat is 100% goed, ik heb hier ook een proggie (zonder source ofzo) die wel over die testbordjes kan communiceren met meerdere clients.

Misschien dat het iets met de timeout te maken kan hebben. De hoofdnmutc heeft een queue waar hij elke seconde een pakket uithaalt en die verstuurd. Als die een pakket verstuurd heeft wacht hij maximaal 5 seconden op antwoord van de desbetreffende node. Het opvolgende pakket kan dus worden verstuurd tussen de 1-5 seconden.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Als het helemaal niet wil, zou ik ff een scoop op de pinnetjes van je MAX485 zetten. De datasheets kun je zo downloaden bij Maxim.

Overigens zie ik op dat testbordje dat je ook de receiver kunt in en uitschakelen met het DTR signaal. Maw, je kunt als je zelf aan het zenden bent ook je eigen receiver disabelen. Wel handig, hoef je niet je echo eruit te filteren.

[ Voor 48% gewijzigd door farlane op 03-05-2004 15:32 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
Ik heb even een scoop op de pinnen gezet en nu snap ik er helemaal niets meer van.
Ik ontvang namelijk wel een signaal op de RX van de laatste node.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GAEvakYD schreef op 03 mei 2004 @ 16:39:
Ik heb even een scoop op de pinnen gezet en nu snap ik er helemaal niets meer van.
Ik ontvang namelijk wel een signaal op de RX van de laatste node.
Ik denk dat je even je signaal, je receive enable en je transmit enable op je scoop moet hebben zodat je kunt zien wat er gebeurt.

Als je zelf je transmitter nog open hebt staan, of je receiver dicht kan die MAX483 er waarschijnlijk geen soep van koken.

[ Voor 15% gewijzigd door farlane op 03-05-2004 18:03 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
Het lijkt erop dat 1 van de bordjes van de dimm-pc niet helemaal lekker is. Dat concludeer ik uit het volgende.

Ik heb al die tijd zo getest HOOFDPC---------NODE1---------NODE2
Nu kreeg NODE2 dus helemaal geen (bruikbare)data binnen. Als ik de power uit NODE1 haalde kreeg NODE2 wel data.

Nu heb ik de nodes omgedraaid tot zo:
HOOFDPC---------------NODE2--------------NODE1
Nu ontvangt NODE2 nog niets als NODE1 aanstaat,pas als ik NODE1 uitzet wil NODE2 data gaan ontvangen. Helaas kan ik de bordjes niet omwisselen, er hangen namelijk verschillende type dimm-pc's in.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
En waarom doet je tetstprogrammaatje het wel dan ? Heb je het verband van je data signaal en je R/T enable al bekeken ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
Ik heb zojuist de 2 draads variant weer eens aangesloten en die doet het dus wel goed. Het bordje en de daarop zittende 485 chips blijken goed te werken. Ik ga nu weer verder proberen het 4 draads gebeuren werkend te krijgen.

Maar als ik het goed begrijp kan ik met de 4draads variant de RTS en DTR signalen negeren?Of kan ik die statement ook gewoon aanlaten staan?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GAEvakYD schreef op 04 mei 2004 @ 10:45:
Maar als ik het goed begrijp kan ik met de 4draads variant de RTS en DTR signalen negeren?Of kan ik die statement ook gewoon aanlaten staan?
Zelfde als tweedraads, nix aan doen. Denk je ook aan een correcte terminator aan je bus, anders kan het zijn dat je reflecties, en dus rommel krijgt.

[ Voor 17% gewijzigd door farlane op 04-05-2004 20:30 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
Ah kijkaan die tip kende ik niet. Net zoiets als vroeger die coax netwerken hadden?.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GAEvakYD schreef op 05 mei 2004 @ 10:13:
Ah kijkaan die tip kende ik niet. Net zoiets als vroeger die coax netwerken hadden?.
Idd, over het algemeen is het echter zo dat je er pas bij echt lange lengtes last van krijgt. Pas vooral op met aftakkingen; dus het stuk van je bus naar de dimm pc, deze moet je zo kort mogelijk laten.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • GAEvakYD
  • Registratie: Juni 2001
  • Nu online
De dimm-pc's komen straks in het veld te staan met grootte tussenruimtes (10 tot 100 meter tussenruimte).

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GAEvakYD schreef op 05 mei 2004 @ 12:07:
De dimm-pc's komen straks in het veld te staan met grootte tussenruimtes (10 tot 100 meter tussenruimte).
Dan zou ik zeker de bus correct afsluiten met terminators. Zou je even in de documentatie van je dimm pc moeten kijken hoe dat moet; misschien hebben ze wel een jumper waarmee je een eventuele onboard afluitweerstand kunt inschakelen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1