Documentos de Académico
Documentos de Profesional
Documentos de Cultura
P1 Modbus
P1 Modbus
1.1 Objetivos
El objetivo de esta práctica y de las siguientes es la utilización y la programación de una red
modbus. El alumno debe ser capaz de:
• Diferenciar los tres niveles fundamentales de la red modbus:
1. Nivel físico: RS485.
2. Nivel de protocolo. Trama básica del protocolo modbus: cabecera, funciones,
direcciones, datos, CRC. Organización maestro/esclavo.
3. Nivel de aplicación. Tipos de funciones disponibles en el equipo que se conecta
vía modbus. Datos que se pueden leer del equipo. Información que se puede
enviar al equipo.
• Trabajar la red modbus en modo programación y en modo mantenimiento:
1. Programación: montar la red con un maestro y varios esclavos. Programar el
maestro para crear un sistema complejo dirigido por el maestro (un PC o un
PLC). Aquí se incluye la versión más básica donde el maestro es la herramienta
windmill.
2. Mantenimiento: utilizar una herramienta como windmill para capturar la
información que circula entre maestro y esclavos con el fin de detectar
anomalías. La herramienta trabaja como un espía.
El CP2003 es un multiconvertidor que mide tensión, intensidad, potencia, etc. Permite enviar
dichas medidas a un ordenador o un centro de control a través de una RS485 mediante
protocolo MODBUS. En el laboratorio el alumno puede utilizar en vez del CP2003, equipos
similares de la casa SACI (MAR144, LDA) con un direccionamiento MODBUS muy similar.
El CP2003 está montado sobre una caja con las siguientes conexiones y bornas:
• Conexión de alimentación.
• Conexiones para RS485: +, - y GND.
• Bornas 24V, RL0 y RL1. Son dos salidas por contacto que proviene de 2 relés que
llevan internamente el multiconvertidor. Los contactos están colocados entre 24V y
RL0, y entre 24V y RL1. A través del protocolo MODBUS se pueden activar y
desactivar dichos contactos.
• Bornas A01 y A02. Son dos salidas analógicas en intensidad que se pueden regular
a través del protocolo MODBUS. Normalmente están definidas para que con el valor
máximo se obtenga 20 mA y con el valor mínimo 0 mA.
Una de las fases de medida de tensión está conectada a través de un divisor de tensión a
220V. El divisor de tensión está formado por una resistencia fija de 100K y una resistencia
variable de 100K, también. Además, hay una conexión externa lateral para conectar una
carga al convertidor. Con el potenciómetro y la carga, se puede medir tensión, intensidad y
potencia en una fase.
MODBUS es un protocolo que permite ver a un instrumento desde un sistema remoto como
un banco de registros contiguos. Cada registro tiene una dirección dentro del rango 0x0000
a 0xFFFF, y tiene un tamaño de 16 bits. Su equivalente pensando en una CPU es un mapa
de memoria de 16 bits en el bus de direcciones y 16 bits en el bus de datos. Según el tipo de
instrumento no todos los registros están disponibles y cada uno almacena un determinado
tipo de información (tensión, intensidad, etc.) o tiene una determinada función
(activar/desactivar un relé, disparar una alarma, etc.). El protocolo MODBUS permite
mediante tramas enviadas a través de la RS485 consultar o actualizar el valor de dichos
registros. Cada trama corresponde a función o comando dentro del protocolo.
La tabla siguiente presenta las funciones o comandos del protocolo que se van a utilizar en
esta práctica:
En la página 3 del manual del equipo CP2003 (ver web del laboratorio) se describe el
formato de las tramas que acepta el equipo, que se corresponden con la tabla anterior. A
partir de la página 13 del manual hay ejemplos de las tramas que acepta y de las tramas de
respuesta.
Para poner en marcha la comunicación vía protocolo MODBUS entre el ordenador, que
actúa como maestro, y el CP2003, que actúa como esclavo, el primer paso es comprobar
que el equipo funciona. Este paso se basa en utilizar los ejemplos que lleva el manual del
CP2003. En la práctica profesional, cuando se recibe un nuevo equipo, el primer paso es
intentar una comunicación sencilla siguiendo los ejemplos que da el fabricante. En este
caso, siguiendo la página 13 del manual, utilizaremos el comando 04 para leer el número de
serie del aparato que se encuentra a partir de la dirección 04B0 y que ocupa 5 registros (10
bytes). Se supone que el equipo tiene la dirección MODBUS 4C (76 en decimal).
Pasos a seguir:
1. Conecte el CP2003 a la red RS485, si no está ya montado.
2. Conecte el adaptado RS232/RS485 por un lado a la red RS485 y por otro al COM1
del ordenador.
3. Arranque el programa Windmill con la configuración COM1, 9600, 8 bits, sin paridad
y un bit de stop.
4. Envíe al CP2003 el siguiente comando escrito en hexadecimal para preguntarle su
identidad:
0x4C,0x04,0x04,0xB0,0x00,0x05,CRC.
CRC es un número de 16 bits que es calculado como el CRC del resto de la trama.
Para incluir el CRC pulse CRC en el menú superior del Windmill. Windmill lo calcula
automáticamente cada vez que se envía la trama. Al comando enviado desde el PC,
el CP2003 deberá responder tal como muestra la siguiente figura:
Siguiendo el ejemplo anterior lea el tipo de aparato (ver tabla 1.2.6 del manual del CP2003).
El número de registros a leer es 3. Póngase de acuerdo con el resto de grupos para evitar
demasiadas colisiones a la hora de acceder al CP2003, si está compartido.
Siguiendo la tabla del apartado 1.2.6, leer la dirección modbus del equipo. Para ello enviar al
CP2003 la trama:
0x4C,0x04,0x04,0xB5,0x00,0x01,CRC.
El equipo responderá con la dirección del equipo.
RL0 RL1
HV1 HV2
0V
Para probar el funcionamiento de los relés conecte las salidas RL0 y RL1 según el siguiente
esquema a la placa de pilotos (“pupitre de mando”, ver figura). Como fuente de alimentación
utilice la fuente de alimentación de los bastidores de los autómatas (bornas rojas rotuladas
con +24V y bornas negras – GND, ver figura). Para el resto de convertidores la conexión es
la misma.
Pupitre de control:
Piloto de
señalización
Conmutador de SC
3 posiciones
Fuente de PLC
alimentación
Entradas/s
alidas
24V
0V
Según el manual del CP2003 para trabajar con los relés primero hay que configurarlos en
modo SW y después activarlos o desactivarlos (página 11 del manual). Siga los siguientes
pasos:
1. Envíe la trama siguiente 0x4C,0x06,0x04,0xB9,0x00,0x01,CRC para configurar
los relés en modo SW (Tabla del apartado 1.2.7).
2. Envíe 0x4C,0x06,0x04,0xBA,0x00,0x01,CRC para activar el RL0.
3. Envíe 0x4C,0x06,0x04,0xBA,0x00,0x00,CRC para desactivar el RL0.
Realice la misma maniobra de activar y desactivar con el relé RL1.
Pregunta 5: Indique las tramas enviadas y su respuesta para el caso activar y desactivar
el relé RL1.
Monte el siguiente circuito para controlar el giro de los motores mediante RL0 y RL1.
RL0 RL1
12
14
22
24
12
14
22
24
32
32
A1 31
11
21
11
21
A2
Para ello utilice la placa “pupitre de control” anterior y la placa siguiente “simulador de
planta”.
Simulador de planta:
BI Sensor de
proximidad
inductivo
SF1 SF2
Final de
carrera
M Relé
KA1
KA2
Sensor de Motor
proximidad
capacitivo
Un relé es un elemento electromecánico de control formado por contactos (11 con 12 y 14,
21 con 22, 24, etc.) cuya apertura y cierra se controla a través de una bobina (A1, A2).
Cuando no pasa corriente por la bobina el relé está en reposo y se permite el paso de la
corriente a través de 11-12 (21-22 y 31-32), tal como indica la figura. Cuando pasa corriente
suficiente, la bobina se activa y los contactos basculan hacia la posición contraria. Ahora se
permite el paso de la corriente a través de 11-14 (21-24 y 31-34).
Active RL0 y RL1 para arrancar el motor en giro a derechas, giro a izquierdas y pararlo.
3. Envíe la trama de ejemplo dada en la página 15 del manual del CP2003 para escribir
en la salida A01 (posición AN_OVER0). Calcule qué valor se envía (está en formato
IEEE32). Compruebe el valor que mide el multímetro con el valor enviado.
4. Vuelva a realizar el paso 3 para conseguir que el multímetro marque 20 mA y -20
mA. Si el equipo es de 0-5 mA, en vez de 20 mA utilice 5mA.
2. Programas de prueba más sofisticados que Windmill. Windmill es muy útil pero está
muy limitado: para cualquier comunicación hay que bajar al nivel byte. Si se quiere
probar que los relés de los multiconvertidores funcionan correctamente vendría muy
bien una aplicación del tipo:
> 23 RL0 1
> 23 OK
> 23 RL0 0
> 23 OK
El objetivo de los siguientes apartados es crear un librería que pueda ser utilizada en
prácticas posteriores, y crear un programa de prueba para manejo cómodo de los relés.
Para probar la función puede utilizar las propias tramas transmitidas o la que aparece como
respuesta en el apartado 1.2. Como programa de prueba puede utilizar el siguiente:
int main(){
unsigned char mc[5]={0xc7,0x04,0x02,0x53,0x41}; // CRC es CDE1
unsigned char mCRC[2];
MODBUSCRC(5,mc,mCRC);
printf("%02x%02x",mCRC[0],mCRC[1]);
return 0;
}
• & permite realizar la función AND de dos números bit a bit (a=b&c);
• Una variable de tipo int ocupa 32 bits, lo mismo que un float (IEEE32).
• Para obtener el byte más alto de un número b de 32 bits: a=b>>24. De la misma
manera se procedería con el resto de bytes.
• Para asignar el byte más alto de un número a un determinado valor respetando el
resto habría que hacer: a=(a&(0x00ffffffL))|(b<<24).
Pregunta 9: Comprobar el cálculo del CRC con una trama de respuesta del CP2003.
int main(){
unsigned char mc[8]={0xc7,0x04,0x04,0xb0,0x00,0x01,0x00,0x00};
unsigned char mcRec[100];
int l;
hPort=OpenSerialPort("COM1",CBR_9600,8,NOPARITY,TWOSTOPBITS,10);
if (hPort==INVALID_HANDLE_VALUE) {
printf("Error abriendo puerto com1");
return 1;
}
MODBUSCRC(6,mc,mc+6);
printf("\nTrama enviada: ");
MODBUSImprime(8,mc);
MODBUSEnvia(hPort,8,mc);
l=MODBUSRecibe(hPort,100,mcRec);
printf("\nTrama recibida: ");
MODBUSImprime(l,mcRec);
CloseSerialPort(hPort);
return 0;
}
> 2 RL0 1
> 2 OK
> 2 RL0 0
> 2 OK