Está en la página 1de 4

MODBUS TCP para PIC (parte I)

http://blog.sasian.es/2010/01/08/modbus-tcp-para-picparte-i/
De todos es sabido que Modbus es uno de los protocolos de comunicacin industrial ms extendido y, claro est, con la aparicin de ethernet se actualiz para seguir estando en tre los top 5. Tambin es cierto que desde que Microchip lanz sus controladoras de ethernet y sus micros con ethernet embedded (tambin antes con los RTL,) se abrieron las puertas hacia el mundo de las comunicaciones. Evidentetemente no es mi intencin soltar un discurso de como se implementa el protocolo, basta con ir a cualquier buscador y encontraris 1000 referencias al respecto. Mi intencin es simplemente poner un pequeo ejemplo de como se puede implementar un servidor MODBUS TCP en un PIC que soporte las funciones 03 y 16, que son las que bsicamente se usan sobre tcp.

El cdigo es muy simple, consisten en dos ficheros, ModbusTcp.c y ModbusTcp.h que se integran en el stack tcp de microchip, un par de opciones de configuracin y un par de funciones a llamar en nuestro main.c el primer paso ser copiar los dos ficheros en la carpeta del stack tcp y en la de includes, luego en el TCPIPConfig.h creamos un nuevo tipo de socket, bsicamente para tener controlado el que estamos usando #define TCP_PURPOSE_MODBUS_TCP_SERVER 12 y {TCP_PURPOSE_MODBUS_TCP_SERVER, TCP_ETH_RAM, 200, 200}, a partir de aqu podemos ediar el ModbusTcp.h y cambiar nuestra configuracin si es necesario, // // // ////////////////////////////////////////////////////////// //Puerto #define MODBUS_PORT 502 TCP para MODBUS CONFIGURACION DE USUARIO creo que con los comentarios est suficientemente claro //////////////////////////////////////////////////////////

// para usar el ORDEN DE BYTE deseado, si nuestro cliente tiene la posibilidad de cambiarlo se puede // comentar esta linea y dejar trabajar al PC, es el caso del OPC de kepware. // para los equipos que no pueden hacerlo dejarlo sin comentar (caso de las Magelis de Telemecanique) #define MODBUS_ORIGINAL //numero de WORDS disponibles para funcion 03

#define numerowordsmodbus0316 50u ////////////////////////////////////////////////////////// A partir de aqu hacemos referencia en nuestro cdigo al stack con un include #include TCPIP Stack/ModbudTcp.h y luego creamos las dos funciones de callback a las que llamar el stack Modbus cada vez que se reciba o se transmita un mensaje. En ellas tenemos acceso a la direccin inicial y al nmero de elementos recibidos o pedidos por si necesitamos alguna manipulacin de la informacin: void { if(datos[8].Val==1) { LED3_IO=1; datos[8].Val=0; } if(datos[8].Val==2) { LED3_IO=0; datos[8].Val=0; } if(datos[9].Val==1) { LED4_IO=1; datos[9].Val=0; } if(datos[9].Val==2) { LED4_IO=0; datos[9].Val=0; } } void { ModbusTx(WORD_VAL *datos,int inicio, int cantidad) ModbusRx(WORD_VAL *datos,int inicio, int cantidad)

static char // // // // datos[0].Val=BUTTON0_IO; datos[1].Val=BUTTON1_IO; datos[2].Val=BUTTON2_IO; datos[3].Val=BUTTON3_IO; *(DWORD datos[6].Val=(WORD)ADC1BUF0; datos[7].Val=peticiones++; numero } //estado //estado //estado //estado memset(LCDText, sprintf(cadena, ini %u cant strcpy((char*)LCDText,

int %u ,

peticiones; cadena[32]; 32); ,inicio,cantidad); (char*)cadena); LCDUpdate(); del del del del boton boton boton boton del 1 2 3 4 Tick

*)&datos[4]=TickGet();

// //valor

Valor del

potenciometro

//numero de peticiones que hemos procesado de peticiones

sprintf((char *)cadena,Peticiones %Lu,peticiones); // cadena de texto con el strncpy(&datos[12].Val,&cadena[0],20);

es posible no usar estas funciones y acceder directamente al mapa compartido por Modbus usando el array MAPA_MODBUS[] pero es conveniente hacerlo con las callbacks para estar seguro de lo que hacemos con esto ya slo falta inicializar el stack Modbus Tcp con la llamada a la funcin: IniciaModbusTCP(ModbusRx,ModbusTx); y llamar cclicamente al stack dentro de nuestro bucle principal: ModbusTCPServer(); y esto es todo, un stack totalmente operativo para usar con cualquier software Modbus Tcp. Evidentemente este cdigo se puede optimizar, o aadir funciones nuevas o soporte para ms de un cliente simultaneo, pero eso lo dejamos para otro post. dejo una captura de pantalla con ele KEPSERVER comunicando con la Explorer 16.

Tags Descarga el cdigo fuente aqui - actualizacin 06/2010-

en

el

Kepserver.

He recompilado para C18, pero la verdad es que no tengo ahora plataforma hardware para probarlo. bsicamente hay que reordenar las declaraciones de variables al inicio de las funciones y eliminar por los lo punteros a dems funciones debe (de momento). funcionar.

el fichero .c se copia en el directorio C:\Microchip Solutions\Microchip\TCPIP Stack y los .h en

el directorio C:\Microchip Solutions\Microchip\Include\TCPIP Stack. en el main solo es necesario incluir #include TCPIP Stack/modbus.h y llamar a la funcin ModbusTCPServer(); dentro del bucle principal. Con eso se comparte el array MAPA_MODBUS. Descarga el cdigo fuente aqui Sera interesante algn feedback de alguien que lo tenga andando en C18. Tambin dejo algunos pantallazos de la configuracin bsica del KEPSERVER

This entry was posted on Viernes, Enero 8th, 2010 at 4:44 pm and is filed underMicrochip. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.