Modbus Tcp Para Pic
December 16, 2016 | Author: Daniel Castrellon Medellin | Category: N/A
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