Buggfix Plus
Aktuellt datum och tid: 04.23 2019-09-20

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 9 inlägg ] 
Författare Meddelande
InläggPostat: 14.09 2019-02-01 

Blev medlem: 14.59 2006-02-27
Inlägg: 4399
Ort: Tranås (Jönköping)
Detta är ett liiiitet projekt som inte alls funnits i planeringen nån längre tid. Och nu när det ändå var en tävling så kunde jag ju posta det som ett projekt och ett bidrag.
Någon kanske får nytta av det. :)

Hur som, på jobbet behöver vi nån pryl att prova ModBus-kommunikation mot. Nåt enkelt som vi har koll på, och kan ändra ID och baudrate på.
Så jag kom på idén att bygga en pryl av en arduino helt enkelt.

Initialt är det ModBus över RS485 som är intressant. Men jag vet inte om man kan styra vilken av TX/RX-pinnarna ModBusen kommunicerar över, så enklast vore ju faktiskt att använda en så enkel Arduino som möjligt och fysiskt växla vilket gränssnitt som jag kommunicerar med.

Så en Arduino Pro Mini valdes, utan USB-port.

Till denna köptes sen en USB-TTL och en RS485-TTL. Dessa kan jag sen bygla in beroende på vilken jag vill nyttja.
Mitt USB-TTL har ingen reset vid programmering, så man får resetta manuellt vid nedladdning av kod, men det är inget problem.
RS485-gränssnittet ansluts precis som USB-gränssnittet, med undantaget av att det finns en enable som måste sättas hög.

Första testet var helt enkelt att skicka ett Hello World. Via USB (som emulerar en COM-port på datorn) var det inga problem att ta emot texten.
Men via RS485 var det värre, "text" tas emot, men inte alls läsbart. Förmodligen beror det på det USB-RS485 gränssnitt jag använder, det är inte helt säkert att det är transparent så att säga. Det testet kan dock vänta, nånting kommer ju, så det lär väl fungera.

ModBus-programmet då, det baseras på exempel från ArduinoModbus, och jag lägger upp 10 coils och 10 holding.
Sedan mappar jag den LED som finns på Arduinon till en coil, och resterande får några ingångar mappade, och nån helt utan mappning. Då kan man testa läsa/skriva och se att det händer nåt.
De 10 holding är mappade mot de 4 analoga ingångarna, några har fasta värden, nån replikerar aktuell baudrate. Samma här, man kan läsa och skriva och se att nåt händer.

Så test med ett annat RS485-gränssnitt mot prylen ska utföras. Sen kan man komplettera med RS422 eller RS232 kanske, men det är inte så vanligt att vi använder.

Programmet:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#include <ArduinoRS485.h>
#include <ArduinoModbus.h>
int   iMBID = 1;    //Default om ingen ingång sänkt
long  lBPS  = 9600; //Default om ingen ingång sänkt
int   iAI1;
int   iAI2;
int   iAI3;

void setup() {
 
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  pinMode(2, INPUT_PULLUP); //ID 2
  pinMode(3, INPUT_PULLUP); //ID 3
  pinMode(4, INPUT_PULLUP); //1200bps
  pinMode(5, INPUT_PULLUP); //19200bps
  pinMode(6, INPUT_PULLUP); //115200bps
  pinMode(7, INPUT_PULLUP); //input
  pinMode(8, INPUT_PULLUP); //input
  pinMode(9, INPUT_PULLUP); //input
 
  pinMode(12, OUTPUT);      //RS485 enable
  digitalWrite(12, HIGH);   //RS485 enable

  if (!digitalRead(2)){ iMBID = 2; }
  if (!digitalRead(3)){ iMBID = 3; }

  if (!digitalRead(4)){ lBPS = 1200; }
  if (!digitalRead(5)){ lBPS = 19200; }
  if (!digitalRead(6)){ lBPS = 115200; }
 
  Serial.begin(lBPS);

  // start the Modbus RTU server
  ModbusRTUServer.begin(iMBID, lBPS);

  // configure coils and holdings
  ModbusRTUServer.configureCoils(0x00, 10);
  ModbusRTUServer.configureHoldingRegisters(0x00, 10);

}

void loop() {
  // poll for Modbus RTU requests
  ModbusRTUServer.poll();

  // read the current value of the coil
  int coilValue = ModbusRTUServer.coilRead(0x00);
   ModbusRTUServer.coilWrite(0x01, 1); //digitalRead(2));
   ModbusRTUServer.coilWrite(0x02, digitalRead(3));
   ModbusRTUServer.coilWrite(0x03, digitalRead(4));
   ModbusRTUServer.coilWrite(0x04, digitalRead(5));
   ModbusRTUServer.coilWrite(0x05, digitalRead(6));
   ModbusRTUServer.coilWrite(0x06, digitalRead(7));
   ModbusRTUServer.coilWrite(0x07, digitalRead(8));
   ModbusRTUServer.coilWrite(0x08, digitalRead(9));

   ModbusRTUServer.holdingRegisterWrite(0x00, analogRead(A0));
   ModbusRTUServer.holdingRegisterWrite(0x01, analogRead(A1));
   ModbusRTUServer.holdingRegisterWrite(0x02, analogRead(A2));
   ModbusRTUServer.holdingRegisterWrite(0x03, analogRead(A3));
   ModbusRTUServer.holdingRegisterWrite(0x04, 11);
   ModbusRTUServer.holdingRegisterWrite(0x05, 111);
   ModbusRTUServer.holdingRegisterWrite(0x06, 1111);
   ModbusRTUServer.holdingRegisterWrite(0x07, lBPS/10);
   

  if (coilValue) {
    // coil value set, turn LED on
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    // coild value clear, turn LED off
    digitalWrite(LED_BUILTIN, LOW);
  }
}



Upp
 Profil  
 
InläggPostat: 11.20 2019-02-07 

Blev medlem: 14.59 2006-02-27
Inlägg: 4399
Ort: Tranås (Jönköping)
Test och felsökning av RS485-gränssnittet har fortsatt.
Och vad det verkar så behöver DE och RE togglas hög/låg beroende på om man skickar/tar emot data.
Detta borde hanteras av libben ArduinoRS548, om det hanteras, så är frågan på vilken pinne. Dags att gräva.


Upp
 Profil  
 
InläggPostat: 12.54 2019-02-07 

Blev medlem: 14.59 2006-02-27
Inlägg: 4399
Ort: Tranås (Jönköping)
Då var det löst! :)

RE och DE ska bägge gå till pinne 2 på arduinon, hittade den mappningen i RS485.h som finns i libben ArduinoRS548.
Utan egen kodändring, bara genom att flytta RE och DE till pinne 2 så funkar det! Med andra ord så borde man fortfarande kunna välja ID2 genom jordning av pinnen vid uppstart. Det är kanske inte det snygga sättet, men det fungerar.


Upp
 Profil  
 
InläggPostat: 15.34 2019-02-07 
EF Sponsor
Användarvisningsbild

Blev medlem: 02.11 2004-01-06
Inlägg: 3726
Ort: Hjälteby - Tjörn
Kul projekt!

Gillar såna här smarta små verktyg :)


Upp
 Profil  
 
InläggPostat: 15.39 2019-02-07 
EF Sponsor
Användarvisningsbild

Blev medlem: 22.54 2006-09-23
Inlägg: 31992
Ort: Borås
/RE brukar man lämna ordad, och man får då medhörning om man vill, DE måste togglas om man kör 2-tråd.
EN slavenhet måste alltid toggla DE, mastern behöver inte det vid 4-tråd.

Kör man 2-tråd och inte vill ha medhörning, så kopplar man ihop /RE och DE, och slår på sändarna genom att driva DE/RE-pinnen hög.


Upp
 Profil  
 
InläggPostat: 08.15 2019-02-08 

Blev medlem: 14.59 2006-02-27
Inlägg: 4399
Ort: Tranås (Jönköping)
Tackar för infon, jag har läst databladet en hel del, men ibland är en enklare förklaring på svenska lite lättare för en annan att förstå. :)

Medhörningen, kan den skapa problem? Jag tänker att då kommer data när man inte vill/förväntar sig? Eller spelar det ingen roll kanske om man ändå inte lyssnar på den?
DE känns ju logisk nu, om den är ständigt hög så står man alltid i sändläge och kan inte höra svaret? För det var ju lite det som hände innan tror jag.


Upp
 Profil  
 
InläggPostat: 08.31 2019-02-08 

Blev medlem: 13.42 2011-08-15
Inlägg: 162
Medhörning innebär att du hör det du själv sänder - så som det faktiskt blev på bussen. Om inte biblioteket är förberett på det så kommer du att få in alla meddelanden du skickar, vilket ju behöver hanteras. Det finns en poäng med att dubbelkolla så att meddelandet faktiskt blev rätt.
Det kan man använda för att detektera att bussen är kortsluten eller att någon annan "pratar i munnen" på dig.


Upp
 Profil  
 
InläggPostat: 09.51 2019-02-08 

Blev medlem: 14.59 2006-02-27
Inlägg: 4399
Ort: Tranås (Jönköping)
Man lär sig nya saker varje dag! :)

Biblioteket kanske hanterar det, men det fungerar utan medhörningen antar jag då DE & RE är knutna och följer DE's växling och då borde RE vara hög när den borde vara låg för medhörning.


Upp
 Profil  
 
InläggPostat: 12.34 2019-02-08 
EF Sponsor
Användarvisningsbild

Blev medlem: 21.43 2006-11-06
Inlägg: 4257
Ort: Munkedal, Sverige (Sweden)
Det finns ju en massa kul som kan gå fel och som underlättar om prylen skall vara för felsökning.
Om den endast svarar på coil meddelande så förutsätter ju det att allt i princip redan funkar.....

Det är bra att kunna se om det kommer något kommando, oavsett om det är korrekt eller ej
Likaså se vilken modbus ID och modbus adress som kommer in.
Kan också vara trevligt om testenheten kan fås att svara på alla meddelande oavsett
adress mm , just för felsökning.

Det finns också ett loopback kommando i Modbus protokollet. Kika på det

Swech


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 9 inlägg ] 

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 5 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010