Modbus USB

Redes Industriales 12 de Junio del 2019 UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE CARRERA: MECATRÓNICA TEMA : Arquitect

Views 201 Downloads 2 File size 652KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Redes Industriales 12 de Junio del 2019

UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE CARRERA:

MECATRÓNICA

TEMA : Arquitectura maestro/esclavo con adaptador USB a RS485 Modbus

NIVEL : OCTAVO PARALELO : B MARZO 2019 – JULIO 2019

CONTENIDO 1.

TEMA.................................................................................................................................................3

2.

OBJETIVOS........................................................................................................................................3 2.2.

3.

Objetivos específicos...................................................................................................................3

MARCO TEÓRICO............................................................................................................................3 3.1.

RS-485.........................................................................................................................................3

3.2.

Adaptador USB a RS-485............................................................................................................3

3.3.

Acceso a características del protocolo MODBUS........................................................................4

4.

MATERIALES....................................................................................................................................5

5.

DESARROLLO...................................................................................................................................6

6.

CONCLUSIONES...............................................................................................................................7

7.

BIBLIOGRAFÍA.................................................................................................................................8

8.

ANEXOS.............................................................................................................................................9 8.1.

Programación Arduino:................................................................................................................9

1. TEMA Arquitectura maestro/esclavo con adaptador USB a RS485 Modbus 2. OBJETIVOS 2.1. Objetivo general Realizar una comunicación maestro/esclavo entre arduinos utilizando el protocolo Modbus, con un adaptador USB a RS485 2.2. Objetivos específicos  Investigar sobre el protocolo de comunicación Modbus.  Investigar sobre el adaptador USB a RS485.  Realizar una comunicación maestro y dos arduinos esclavo utilizando el protocolo de comunicación Modbus y un adaptador USB a RS485. 3. MARCO TEÓRICO 3.1. RS-485 El estándar RS-485 define un bus para la transmisión serie multipunto, donde, en un instante, puede haber un equipo transmitiendo y varios recibiendo. La comunicación es semiduplex, de forma un equipo puede enviar y recibir, pero no a la vez. El cableado básico consiste en un par de hilos de cobre trenzados sobre el que se transmite una señal diferencial para enviar los bits de datos, que es bastante inmune a las interferencias y admite largas distancias. Además del par trenzado para datos, pueden usarse líneas de 0V y 5V para alimentar dispositivos del bus. Los bits se transmiten mediante una trama asíncrona.[ CITATION Nay16 \l 12298 ] 3.2. Adaptador USB a RS-485 El conversor USB a RS485 integra un conversor USB a serial TTL (CH340) y un chip serial a RS485 (MAX485). El conversor USB a RS485 permite establecer comunicación entre una PC (USB). El estándar RS485 también llamado EIA-485 es muy utilizado por equipos industriales de instrumentación y control: Variadores de velocidad, PLC, Pirómetros. El

estándar RS485 está definido como un sistema de comunicación en bus de transmisión multipunto diferencial, es ideal para transmitir a velocidades medianas sobre largas distancias (35 Mbit/s hasta 10 metros y 100 kbit/s en 1200 metros) y a través de canales ruidosos, ya que al emplear voltajes diferenciales reduce los ruidos eléctricos que aparecen en la línea de transmisión. El medio físico de transmisión (cableado) es el cable par trenzado que admite hasta 32 estaciones en 1 solo bus, con una longitud máxima de 1200 metros operando entre 300 y 19200 bit/s bajo comunicación halfduplex (semiduplex).[ CITATION Nor12 \l 12298 ]

Figura 1. Comunicación RS-485 y Modbus

3.3. Acceso a características del protocolo MODBUS 

Si se desea acceder a toda la información de estado de un canal E/S del PLC, es necesario definir una variable IODDT.



A través de los campos de esa variable se pude acceder al estado del canal, para detectar posibles errores, o para cambiar alguna configuración durante la ejecución del programa.



Es necesario recurrir a un acceso directo e inmediato a las variables del módulo.



Para realizar un intercambio explícito en un M340, se dispone de dos funciones: READ_STS para lectura de palabras de estado y WRITE_CMD para escritura de palabras de comando.



Las instrucciones READ_STS y WRITE_CMD se ejecutan al mismo tiempo que la tarea que las llama y siempre correctamente, y su resultado queda disponible automáticamente después de su ejecución.[ CITATION Ele15 \l 12298 ]

4. MATERIALES Tabla 1.Materiales y descripción Material

Descripción

Arduino

Placa electrónica basada en el microcontrolador ATmega328.

Protoboard

Placa de pruebas en los que se pueden insertar elementos electrónicos y cables.

Resistencia

Diseñado para introducir una resistencia eléctrica determinada entre dos puntos de un circuito eléctrico.

Potenciómetro

Instrumento para medir las diferencias de potencial eléctrico.

Switch

Un interruptor eléctrico  es un dispositivo que permite desviar o interrumpir el curso de una corriente eléctrica.

LED

Un diodo emisor de luz.

Cables de conexión

Interconectar entre sí los componentes

Módulo 485

Módulo para realizar la conexión entre las tarjetas

Adaptador USB

Convertidor de USB a RS-485

Gráfico

5. DESARROLLO En la figura 2, se muestra el diagrama de comunicación maestro/esclavo por medio de tres arduinos en donde el maestro va a enviar distintas condiciones a cada uno de los arduinos esclavos, el esclavo 1 tendrá un potenciómetro y un switch, esclavo 2 indicará el estado de un led, la variación del potenciómetro y el estado del switch será mostrado por medio de un PC, conectado por medio de un adaptador USB a RS485

Figura 2. Diagrama de comunicación maestro/esclavo

Realizar la programación para el maestro, esclavo 1 y esclavo 2 en Arduino. Ingresar las variables en el programa KEPServerEX 6

Crear un nuevo proyecto en Labview

Realizar el HMI en el Labview, programando el block diagram y realizando la visualización en el panel frontal.

6. CONCLUSIONES 

Modbus es un Protocolo monomestro, es decir que a pesar de tener 32 equipos solo puede estar un maestro al tiempo estableciendo la comunicación con el esclavo que él seleccione.



Utilizando RS485 como capa física es posible implementar un bus de campo industrial tipo MODBUS para comunicación entre equipos industriales o DMX para el control de luces entre otras aplicaciones.



El módulo permite usar el estándar RS-485 y MODBUS para comunicarse con otros dispositivos que lo soporten,: usando un par de cobre trenzado conectado a la bornera o usando un cable DB9.

7. BIBLIOGRAFÍA Normas

de

comunicación

en

serie.

(2012).

Obtenido

de

http://www.unilibre.edu.co/revistaingeniolibre/revista-11/art13.pdf Electronilab. (2015). Obtenido de https://electronilab.co/tienda/convertidor-usb-rs485/ Naylap. (2016). Obtenido de https://naylampmechatronics.com/conversores-ttl/230conversor-usb-rs485.html

8. ANEXOS 8.1. Programación Arduino: Maestro #include #define MAX485_EN 2 #include ModbusMaster esclavo1, esclavo2; const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); uint8_t switch1; void preTransmission(){ digitalWrite(MAX485_EN, 1); } void postTransmission(){ digitalWrite(MAX485_EN, 0); } void setup(){ lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); pinMode(3,OUTPUT); pinMode(MAX485_EN, OUTPUT); // Init in receive mode digitalWrite(MAX485_EN, 0); // Modbus communication runs at 9600 baud Serial.begin( 9600 ); // Serial3.begin( 9600 ); //Serial2.begin(9600); // Modbus slave ID 1 esclavo1.begin(1, Serial); esclavo2.begin(2, Serial); // Callbacks allow us to configure the RS485 transceiver correctly esclavo1.preTransmission(preTransmission); esclavo1.postTransmission(postTransmission); esclavo2.preTransmission(preTransmission); esclavo2.postTransmission(postTransmission); lcd.clear(); } void loop(){ //lcd.clear();

uint8_t result; // Read 2 registers starting at 0x0000) result = esclavo1.readHoldingRegisters( 0x0000, 2 ); Serial.write( 'a' ); Serial.write( '\t' ); if( result == esclavo1.ku8MBSuccess ){ Serial.write( 'a' ); Serial.print( esclavo1.getResponseBuffer( 0x00 )); Serial.write( '\t' ); Serial.write( 'b' ); Serial.print( esclavo1.getResponseBuffer( 0x01 )); Serial.println( 'x' ); } else{ Serial.write( 'e' ); Serial.print( result ); Serial.println( 'x' ); } delay(50); // Read 2 registers starting at 0x0000) result = esclavo2.readHoldingRegisters( 0x000, 2 ); Serial.write( 'b' ); Serial.write( '\t' ); if( result == esclavo2.ku8MBSuccess ){ Serial.write( 'a' ); Serial.print( esclavo2.getResponseBuffer( 0x00 )); Serial.write( '\t' ); Serial.write( 'b' ); Serial.print( esclavo2.getResponseBuffer( 0x01 )); Serial.println( 'x' ); switch1 = esclavo2.getResponseBuffer( 0x00 ); if(switch1==1){ digitalWrite(3,HIGH); }else{ digitalWrite(3,LOW); } } else{ Serial.write( 'e' ); Serial.print( result ); Serial.println( 'x' ); } lcd.setCursor(0,0); lcd.print("pote= "); //lcd.setCursor(7,0);

//lcd.print(esclavo1.getResponseBuffer( 0x00 )); if(esclavo1.getResponseBuffer( 0x00 )9 && esclavo1.getResponseBuffer( 0x00 )100 && esclavo1.getResponseBuffer( 0x00 )1000){ lcd.setCursor(5,0); lcd.print(esclavo1.getResponseBuffer( 0x0 0 )); } lcd.setCursor(9,0); lcd.print("led= ");

//lcd.print(esclavo1.getResponseBuffer( 0x01 )); if(switch1==1){ lcd.setCursor(15,0); lcd.print(" "); lcd.setCursor(13,0); lcd.print("on"); }else{ lcd.setCursor(13,0); lcd.print("off"); } //===================== lcd.setCursor(0,1); lcd.print(" Button= "); lcd.setCursor(9,1); if(switch1==1){ //lcd.setCursor(,1); //lcd.print(" "); //lcd.setCursor(13,1); lcd.print("yes"); }else{ //lcd.setCursor(13,1); lcd.print("no"); } //=========================== delay(50); //lcd.setCursor(8,0); //lcd.print(" "); }

Esclavo 1 #include #include #include #include //#include LiquidCrystal lcd(26, 27, 28, 29, 30, 31); //SoftwareSerial mySerial(9, 10); // RX, TX int dato=0,inByte=0; char datoc=0; char SMS[200]; char SMS1[5]; char SMS2[5]; char received[200]; #include enum{ REG1, REG2, TOTAL_ERRORS, TOTAL_REGS_SIZE }; unsigned int registros[ TOTAL_REGS_SIZE ];

#define SLAVE_ID 1 #define SLAVE_EN 2 void setup() { pinMode(8,OUTPUT); modbus_configure( 9600, SLAVE_ID, SLAVE_EN, TOTAL_REGS_SIZE, 0 );//modbus_configure( 9600, 2, 2, TOTAL_REGS_SIZE, 0 ); } int t1=0,t2=0; void loop(){ if (digitalRead(9) == HIGH){ t2=1; digitalWrite(8,HIGH); }else{ digitalWrite(8,LOW); t2=0; } registros[ TOTAL_ERRORS ] = modbus_update( registros ); registros[ REG1 ] = analogRead(A0);//registros[ REG1 ] = t1; registros[ REG2 ] = t2;//registros[ REG2 ] = t2; }

Esclavo 2 #include #include #include #include LiquidCrystal lcd(26, 27, 28, 29, 30, 31); int dato=0,inByte=0; char datoc=0;

char SMS[200]; char SMS1[5]; char SMS2[5]; char received[200]; #include enum{ REG1, REG2,

TOTAL_ERRORS, TOTAL_REGS_SIZE }; unsigned int registros[ TOTAL_REGS_SIZE ]; #define SLAVE_ID 2 #define SLAVE_EN 2 void setup() { modbus_configure( 9600, SLAVE_ID, SLAVE_EN, TOTAL_REGS_SIZE, 0 );//modbus_configure( 9600, 2, 2, TOTAL_REGS_SIZE, 0 ); } int t1=0,t2=0; void loop(){ if(digitalRead(8)==HIGH){ t1=1; }else{ t1=0; } //int pot = map(analogRead(0),0,1024,0,255); //int pot1 = map(analogRead(1),0,1024,0,255); registros[ TOTAL_ERRORS ] = modbus_update( registros ); registros[ REG1 ] = t1;//registros[ REG1 ] = t1; registros[ REG2 ] = 125;//registros[ REG2 ] = t2; }