Modbus Tcp Para Pic

December 16, 2016 | Author: Daniel Castrellon Medellin | Category: N/A
Share Embed Donate


Short Description

Download Modbus Tcp Para Pic...

Description

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 comunicación industrial más extendido y, claro está, con la aparición de ethernet se ‘actualizó’ para seguir estando en tre los top 5. También es cierto que desde que Microchip lanzó sus controladoras de ethernet y sus micros con ethernet embedded (también antes con los RTL,…) se abrieron las puertas hacia

el

mundo

de

las

comunicaciones.

Evidentetemente no es mi intención soltar un discurso de como se implementa el protocolo, basta con ir a cualquier buscador y encontraréis 1000 referencias al respecto. Mi intención es simplemente poner un pequeño ejemplo de como se puede implementar un servidor MODBUS TCP en un PIC que soporte las funciones 03 y 16, que son las que básicamente se usan sobre tcp.

El código 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 configuración 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, básicamente 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 configuración si es necesario,

creo

que

con

los

comentarios

está

suficientemente

claro

////////////////////////////////////////////////////////// // //

CONFIGURACION

DE

USUARIO

// ////////////////////////////////////////////////////////// //Puerto #define MODBUS_PORT 502

TCP

para

MODBUS

// 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 código 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 dirección inicial y al número de elementos recibidos o pedidos por si necesitamos alguna manipulación de la información: void

ModbusRx(WORD_VAL

*datos,int

inicio,

int

cantidad)

{ 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)

static

int

peticiones;

char

cadena[32];

// //

memset(LCDText, sprintf(cadena,

//

“ini

‘ %u

cant

‘, %u



32); ,inicio,cantidad);

strcpy((char*)LCDText,

(char*)cadena);

//

LCDUpdate();

datos[0].Val=BUTTON0_IO;

//estado

del

boton

1

datos[1].Val=BUTTON1_IO;

//estado

del

boton

2

datos[2].Val=BUTTON2_IO;

//estado

del

boton

3

datos[3].Val=BUTTON3_IO;

//estado

del

boton

4

*(DWORD

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

datos[6].Val=(WORD)ADC1BUF0; datos[7].Val=peticiones++;

// //valor

Valor

del

Tick

del

potenciometro

//numero de peticiones que hemos procesado

sprintf((char *)cadena,”Peticiones %Lu”,peticiones); // cadena de texto con el numero

de

peticiones

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 sólo falta inicializar el stack Modbus Tcp con la llamada a la función: IniciaModbusTCP(ModbusRx,ModbusTx); y llamar cíclicamente 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 código se puede optimizar, o añadir funciones nuevas o soporte para más 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

en

el

Kepserver.

Descarga el código fuente aqui ———- actualización 06/2010———He recompilado para C18, pero la verdad es que no tengo ahora plataforma hardware para probarlo. básicamente hay que reordenar las declaraciones de variables al inicio de las funciones y eliminar por

los

punteros lo

a demás

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 función ModbusTCPServer(); dentro

del

bucle

principal.

Con eso se ‘comparte’ el array MAPA_MODBUS……. Descarga el código fuente aqui Sería interesante algún feedback de alguien que lo tenga andando en C18. También dejo algunos pantallazos de la configuración básica 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.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF