Go Down

Topic: Problemi comunicazione MODBUS [RISOLTO] (Read 3 times) previous topic - next topic

tapirinho

Oct 31, 2012, 12:07 am Last Edit: Jan 06, 2013, 03:11 pm by tapirinho Reason: 1
Ciao a tutti
sono un neofita di Arduino con un pò di esperienza informatica/elettronica e dopo vari sketch ben riusciti mi sto cimentando nella supervisione di un dispositivo via MODBUS e dopo un paio di settimane di test (quasi vani) sono qui a chiedere aiuto!

Ho utilizzato la libreria SimpleModbusMaster per leggere da un dispositivo (id 2) ed ho collegato l'integrato MAX485 come da schema.

http://simple-modbus.googlecode.com/files/SimpleModbusV4.1.zip

Utilizzando l'esempio SimpleModbusMaster ho testato il collegamento e funziona, perchè monitorando la variabile regs[4] (richieste con successo) continua ad incrementare, inoltre il led collegato sull'uscita allarme non si accende (cosa che avviene non appena scollego un filo bus o cambio l'indirizzo del dispositivo slave 485).

La cosa che non riesco a capire è come leggere i valori che lo slave mi dovrebbe mandare indietro! è perchè non è implementata nella libreria o non sono riuscito a capire io cosa fare? Purtroppo le mie nozioni informatiche sono molto arrugginite dopo un decennio di inutilizzo...

Grazie già da ora a tutti!!!

PaoloP

Dentro la libreria trovi le varie funzioni che si occupano della trasmissione ad esempio getData(); e sendPacket(unsigned char bufferSize);
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

tapirinho

Scusa il ritardo, ero via per alcuni giorni...

Grazie per l'aiuto, solo che non ho ben compreso come utilizzare getData()... essendo una funzione dovrebbe restituirmi un unsigned char, giusto?
Per leggere i pacchetti trasmessi, la devo utilizzare nel loop giusto? perchè se provo ad fare un semplice variabile=getData() mi dice:
       "error: 'getData' was not declared in this scope"
Immagino debba tornare a studiare ancora un bel pò, dopo 10 anni i miei ricordi sono scarsi  :smiley-red:

PaoloP

Da link da te indicato ho trovato un esempio
Code: [Select]
#include <SimpleModbusSlave.h>
#define  CE_Pin   8          // Chip Enable
#define  baudrate 57600
byte ID = 1;

//////////////// registers of your slave ///////////////////
enum
{     
  // ---- Addres Reg. 0 Lecturas de Valores 
  I,     
  V,       
  E,
  RAD,
  TEMP,
  PvGiro,
  PvEleva,
  VelGiro,
  VelEleva,
  AL1,
  AL2,
 
  // ---- Addres Reg. 11 Escrituras. Parametrso
  MaxGiroPot,
  LGi,
  LGiC,
  CalibraGiEl,
  LElMaMe,
  LElCMaMe,
  VelGiElminAl,
  ZmGiEl,
  T1,
  T2,
  TEWeb_AngPosSeg,
 
  // ---- Addres Reg. 22 Escrituras. Posicion y Ordenes
  SV_Giro,
  SV_Eleva,
  FLOrdenes,
 
  // ---- Addres Reg. 25 Escrituras. Fecha y Hora
  Ano,
  MesDia,
  HoraMin,
 
  TOTAL_ERRORS,
 
  // leave this one
  TOTAL_REGS_SIZE
 
};

unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array
////////////////////////////////////////////////////////////

void setup()
{
  // parameters(long baudrate, unsigned char ID, unsigned char transmit enable pin, unsigned int holding registers size)
  modbus_configure(115200, ID, CE_Pin, TOTAL_REGS_SIZE);  //No es necesario definir CE_Pin como OutPut, lo hace la libreria   
}


void loop()
{
  // modbus_update() is the only method used in loop(). It returns the total error
  // count since the slave started. You don't have to use it but it's useful
  // for fault finding by the modbus master.
 
  holdingRegs[I] = millis() / 1000;     
  holdingRegs[V] = 2;       
  holdingRegs[E] = 3;
  holdingRegs[RAD] = 4;
  holdingRegs[TEMP] = 5;
  holdingRegs[PvGiro] = 6;
  holdingRegs[PvEleva] = 7;
  holdingRegs[VelGiro] = 8;
  holdingRegs[VelEleva] = 9;
  holdingRegs[AL1] = 10;
  holdingRegs[AL2] = 11;
 
  //------------//
  holdingRegs[MaxGiroPot] = 12;
  holdingRegs[LGi] = 13;
  holdingRegs[LGiC] = 14;
  holdingRegs[CalibraGiEl] = 15;
  holdingRegs[LElMaMe] = 16;
  holdingRegs[LElCMaMe] = 17;
  holdingRegs[VelGiElminAl] = 18;
  holdingRegs[ZmGiEl] = 19;
  holdingRegs[T1] = 20;
  holdingRegs[T2] = 21;
  holdingRegs[TEWeb_AngPosSeg] = 22;
 
  //------------//
  holdingRegs[SV_Giro] = 23;
  holdingRegs[SV_Eleva] = 24;
  holdingRegs[FLOrdenes] = 25;
 
  //------------//
  holdingRegs[Ano] = 26;
  holdingRegs[MesDia] = 27;
  holdingRegs[HoraMin] = 28;
 
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
 
  for (byte i = 0; i < 29; i++)
   {
      Serial.print (holdingRegs[i]);
      Serial.print ("/");
    }
  Serial.println (TOTAL_REGS_SIZE);
  delay(1000);
}


forse ti potrebbe chiarire meglio come funziona la libreria.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

llluca


.. di un dispositivo via MODBUS e dopo un paio di settimane di test (quasi vani) sono qui a chiedere aiuto!


Mi fa piacere leggere che non sono l'unico..
Anche io sto facendo a pugni con il modbus e per ora vince Lui    XD e non ai punti...

perchè   hai scelto SimpleModbus e non il  ModbusMaster?
Io ho tovato che per compilare ModbusMaster bisogna usare la versione :arduino-1.0 il perchè lo ignoro....


  :~ mal comune mezzo Sketch

Luca

Go Up