Autor Tema: Protocolo Modbus en PIC16  (Leído 3143 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado gonzacarv

  • PIC10
  • *
  • Mensajes: 4
Protocolo Modbus en PIC16
« en: 20 de Julio de 2013, 00:42:35 »
Estimados, estoy tratando de implementar comunicación modbus entre diferentes micros (PICs de la serie 16 y 18), estuve leyendo la librería y los ejemplos ex_modbus_slave.c y ex_modbus_master.c, que vienen con mi compilador CCS... ademas busque en Google, y aquí mismo en el foro, pero no termino de entenderlo...

Lo poco que aprendí sobre PLC y modbus es que existen variables de "red", que son coils o palabras, y que el maestro puede leerlas y escribirlas (mientras que existen y trabajan, y son modificadas en el esclavo),,  en la libreria se ve que aparecen TODAS las funciones definidas por el estándar modbus con los parametros, pero no entiendo como se aplican a la memoria del PIC, o donde estan o como se mapean en cada equipo (esclavos y maestros) las variables que comparten...

Cuando veo el ejemplo, hay una parte que dice:

Código: [Seleccionar]
   int8 coils = 0b00000101;
   int8 inputs = 0b00001001;
   int16 hold_regs[] = {0x8800,0x7700,0x6600,0x5500,0x4400,0x3300,0x2200,0x1100};
   int16 input_regs[] = {0x1100,0x2200,0x3300,0x4400,0x5500,0x6600,0x7700,0x8800};
   int16 event_count = 0;

Esas variables (o arreglos) son comunes en el esclavo y el maestro? Y cualquiera de los dos puede leerlas y escibirlas? Como mapeo esas variables en cada equipo? Como se relacionan? Que registros de ram son en cada caso?

Y por otro lado, que diferencia hay entre los registros HOLD e INPUT?

Por favor si me pueden enviar algún link con algun tipo de informacion o algo para leer estare muy agradecido. :-)

Gracias.

Gonzalo

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Protocolo Modbus en PIC16
« Respuesta #1 en: 20 de Julio de 2013, 08:40:06 »
Estimados, estoy tratando de implementar comunicación modbus entre diferentes micros (PICs de la serie 16 y 18), estuve leyendo la librería y los ejemplos ex_modbus_slave.c y ex_modbus_master.c, que vienen con mi compilador CCS... ademas busque en Google, y aquí mismo en el foro, pero no termino de entenderlo...

Lo poco que aprendí sobre PLC y modbus es que existen variables de "red", que son coils o palabras, y que el maestro puede leerlas y escribirlas (mientras que existen y trabajan, y son modificadas en el esclavo),,  en la libreria se ve que aparecen TODAS las funciones definidas por el estándar modbus con los parametros, pero no entiendo como se aplican a la memoria del PIC, o donde estan o como se mapean en cada equipo (esclavos y maestros) las variables que comparten...

Cuando veo el ejemplo, hay una parte que dice:

Código: [Seleccionar]
   int8 coils = 0b00000101;
   int8 inputs = 0b00001001;
   int16 hold_regs[] = {0x8800,0x7700,0x6600,0x5500,0x4400,0x3300,0x2200,0x1100};
   int16 input_regs[] = {0x1100,0x2200,0x3300,0x4400,0x5500,0x6600,0x7700,0x8800};
   int16 event_count = 0;

Esas variables (o arreglos) son comunes en el esclavo y el maestro? Y cualquiera de los dos puede leerlas y escibirlas? Como mapeo esas variables en cada equipo? Como se relacionan? Que registros de ram son en cada caso?

Y por otro lado, que diferencia hay entre los registros HOLD e INPUT?

Por favor si me pueden enviar algún link con algun tipo de informacion o algo para leer estare muy agradecido. :-)

Gracias.

Gonzalo

En modbus.org esta toda la informacion que necesitas, ya que es un estandar abierto.
Te recomiendo arrancar usando algun maestro en OPC, que hay gratuitos y muy buenos, y te aseguran que estas cumpliendo el estandar...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado gonzacarv

  • PIC10
  • *
  • Mensajes: 4
Re: Protocolo Modbus en PIC16
« Respuesta #2 en: 21 de Julio de 2013, 13:32:28 »
En modbus.org esta toda la informacion que necesitas, ya que es un estandar abierto.
Te recomiendo arrancar usando algun maestro en OPC, que hay gratuitos y muy buenos, y te aseguran que estas cumpliendo el estandar...

Hola MGLSOFT!! Muchas gracias por tu rta!
Estuve en la pagina de modbus leyendo bastante, pero siempre se habla del estándar, no aplicado a su implementacion en MCU que es lo que me da problemas.
En mi proyecto nació la necesidad de comunicar muchos PICs, y como era facil hacer un bus RS485, los conecte a todos...
Cuando me senté a definir la comunicación, me di cuenta que si yo mismo escribía un protocolo, no iba a funcionar tan bien como Modbus.... Me decidí ademas pq tengo un dispositivo MAESTRO que consulta y modifica variables en los esclavos de la red, que no necesitan hablar entre si (solo con el master)...
Por todo esto me pareció ideal implementar modbus.

Voy entendiendo cada vez mas sobre el protocolo, pero sigo complicado con el tema de como se definen las variables que se mueven por la red (que estan en los esclavos y el maestro puede consultar/leer)... y como las mapeo (me refiero a ellas), dentro de cada equipo (esclavo, y maestro).


Por ejemplo, una de las funciones incluidas en modbus.c dice:

Código: [Seleccionar]
modbus_write_single_register(address,reg_address,reg_value);
Esa función corresponde a la numero 06 especificada en el estandar Modbus.... Los parámetros son: address, que es la dirección de esclavo, reg_address direccion del registro que quiero escribir y reg_value valor del registro que quiero escribir..

Según el estándar estos registros son de 16 bit, y aquí la gran pregunta: ¿¿Donde defino / declaro esos registros en el esclavo y en el maestro??.... y cuando desde el maestro me refiero a un registro de un esclavo (suponiendo que use la función del ejemplo), cuando digo reg_address... esa dirección!!!!!! A que refiere??? Al mapa de RAM del esclavo?

Ese es mi gran problema!

Ojala alguien me pueda explicar, o tenga algo para leer, o un ejemplo que me ayude...


GRACIAS A TODOS!  :-/ :-)
« Última modificación: 21 de Julio de 2013, 13:47:55 por gonzacarv »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Protocolo Modbus en PIC16
« Respuesta #3 en: 21 de Julio de 2013, 14:48:13 »
Esta es la forma en que yo hago el mapeo de datos en Modbus a variables y viceversa:

Código: C
  1. //  MANEJO DE DATOS MODBUS !!!
  2.          //como ejemplo copio los datos recibidos en el array datos[]
  3.          //al array de transmision datostx[]
  4.          //recordar que los primeros 16 bits de datos rx se borran solos
  5.          //porque se usan para recibir comandos
  6.          //del mismo modo se podrian copiar los valores de las entradas analogicas al
  7.          //array datostx
  8.             int8 a;
  9.             int32 Mbvalorpres,MbValorTemp,MbValorHum;
  10.            
  11.             Mbvalorpres = (int32) (valor*10);
  12.             modbus.datos[2] = make8(Mbvalorpres,3);  // Copia el MSB
  13.             modbus.datos[3] = make8(Mbvalorpres,2);
  14.             modbus.datos[4] = make8(Mbvalorpres,1);
  15.             modbus.datos[5] = make8(Mbvalorpres,0);  // Copia el LSB
  16.                      
  17.             MbValorTemp = (int32) (ValorTemp*10);
  18.             modbus.datos[6] = make8(MbValorTemp,3);  // Copia el MSB
  19.             modbus.datos[7] = make8(MbValorTemp,2);
  20.             modbus.datos[8] = make8(MbValorTemp,1);
  21.             modbus.datos[9] = make8(MbValorTemp,0);  // Copia el LSB
  22.  
  23.             MbValorHum = (int32) (ValorHum*10);
  24.             modbus.datos[10] = make8(MbValorHum,3);  // Copia el MSB
  25.             modbus.datos[11] = make8(MbValorHum,2);
  26.             modbus.datos[12] = make8(MbValorHum,1);
  27.             modbus.datos[13] = make8(MbValorHum,0);  // Copia el LSB
  28.            
  29.             for (a=0;a<50;a++)
  30.             {
  31.             modbus.datostx[a]=modbus.datos[a];
  32.             }
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.