Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
NDICE
INTRODUCCIN
-COMUNICACIN SERIAL
--Qu es la comunicacin serial?
--Como se enva la informacin de forma serial
--Bit de Start y bit de Stop
--Bit de paridad
--Velocidad de transmisin
-PROTOCOLO RS-485
--Qu es el protocolo RS-485
--Comunicacin RS-485 a dos hilos (half-duplex)
--Otra ventaja del RS-485
-MODBUS
--MODBUS sobre conexin RS-485
--Modos de Transmisin del MODBUS
MODBUS RTU
MODBUS ASCII
--Comunicacin Maestro-Esclavo en MODBUS
--Representacin de datos en MODBUS
---Output Coils
--Algunas anotaciones
---Holding Registers
-Cdigos de operacin o de funcin en MODBUS
-Descripcin de la trama de informacin enviada por el Maestro
--Ejemplo #1. Lectura de un solo coil del esclavo.
---Primer Dato de la Trama: Numero de esclavo
---Segundo Dato de la Trama: Cdigo de operacin o funcin MODBUS
---Tercer Dato: Direccin del primer coil que se desea leer
---Cuarto Dato: Nmero de coils a leer
---Quinto Dato: Cdigo de Deteccin de Error: CRC
---Respuesta del esclavo a la funcin 01
---Respuesta del esclavo al maestro suponiendo que el coil es 0
--Ejemplo #2. Lectura de varios coil del esclavo.
---Peticin del maestro
---Respuesta del esclavo
INTRODUCCIN
COMUNICACIN SERIAL
Por supuesto que para que funcione correctamente la transmisin de unos y ceros los dos
dispositivos deben estar enviando y recibiendo la informacin a la misma velocidad, de esto
hablamos ms adelante.
Serialmente podemos enviar cualquier dato, por ejemplo, vamos a pensar que yo deseo
enviar la letra A de un dispositivo a otro, cuando son letras las que se envan
generalmente se usa el cdigo ASCII de la letra, as pues, para la letra A le corresponde
el cdigo ASCII 65, que convertido a unos y ceros (cdigo binario) nos da como resultado
el 1000001, entonces para enviar la letra A simplemente se enva una trama de bits.
Notas:
1. Se enva siempre, del bit menos significativo al bit ms significativo.
2. Generalmente se enva los datos de forma serial en bloques de 8 bits, el cdigo ASCIII
de la letra es de 7 bits, por lo que se agrega un 0 al final, en el bit ms significativo.
3. El envi de datos es a una velocidad previamente establecida por los dispositivos, por
eso es posible saber cundo es 0 y cuando es 1.
De esta forma se pueden enviar informacin, cualquier tipo de informacin, letras, nmeros
y caracteres. Se puede enviar el cdigo ASCII de una letra seguida de otra y as
sucesivamente para formar palabras, y as enviar la informacin que nosotros queremos, as
de simple es la comunicacin serial.
Bit de Start y bit de Stop
A la trama de 8 bits que enva la letra A y que se mostro en la imagen anterior, siempre se le
agregan dos bits mas, uno al inicio y otro al final, esto con la finalidad de indicarle al
receptor cuando inicia el dato (bit de start) y cuando termina (bit de stop), es de suponer
que ambos bits van al inicio y al final de la trama de bits.
Bit de paridad
Existe otro bit que se agrega a la trama, es el llamado bit de paridad, que sirve para detectar
errores en las tramas enviadas, no entraremos en detalle de este bit, pues es opcional su uso.
[
b]Velocidad de transmisin
[/b]
Finalmente debemos tener en cuenta la velocidad a la que se envan lo bits serialmente, es
de suma importancia pues como se menciono arriba, ambos dispositivos deben estar a la
misma velocidad para transmitir y recibir bits, si no lo estn, simplemente la transmisin
serial no sera correcta.
La velocidad de transferencia de informacin indica el nmero de bits que se transmiten en
un segundo, se mide en bauds (baudios) algunas velocidades de transmisin que son muy
usadas son las siguientes: 1200, 2400, 4800, 9600, 19200.
PROTOCOLO RS-485
Qu es el protocolo RS-485?
En el artculo anterior se vio que dos dispositivos pueden comunicarse serialmente usando
dos cables, uno llamado receptor (Rx) y otro llamado trasmisor (Tx), pues basta con
agregar un dispositivo electrnico llamado transceptor (transceiver) para protocolo RS-485.
Este chip es capaz de manejar la recepcin y transmisin de datos con los niveles de voltaje
requeridos en la especificacin que se defini para el protocolo RS-485.
Observe la figura, el transceptor se conecta a las terminales Tx y Rx de un dispositivo
serial, para as tener lista la conexin RS-485 a 4 hilos, as de simple.
O
tra ventaja del RS-485
Adems de las ventajas mostradas en este articulo, existe otra caracterstica de la conexin
RS-485, la posibilidad de conectar ms dispositivos a la misma red, es decir, que puedo
conectar a los dos hilos del RS-485 una gran cantidad de dispositivos electrnicos,
anteriormente los transceptores, soportaban solamente 32 dispositivos en la misma red,
ahora hay chips que soportan muchos ms.
Generalmente, cuando se conectan en la red varios dispositivos uno de ellos es llamado
maestro y los otros esclavos, observe la figura siguiente, muestra la conexin RS-485 de
dos hilos con varios esclavos, en la figura por simplicidad no se muestra el transceptor.
MODBUS
El protocolo MODBUS es un protocolo que usa lneas seriales, por lo que comnmente se
implementa sobre redes de comunicacin RS-485, pero tambin sobre redes que usan la
comunicacin serial RS-232, incluso se puede implementar va TCP/IP sobre una red
Ethernet, en SDM se usa la implementacin MODBUS sobre una red RS-485 como la que
se vio en el articulo pasado.
Los modos de transmisin definen como se envan los paquetes de datos entre maestros y
esclavos, el protocolo MODBUS define dos principales modos de transmisin:
MODBUS RTU (Remote Terminl Unit). La comunicacin entre dispositivos se realiza por
medio de datos binarios. Esta es la opcin ms usada del protocolo y es la que se
implemento en nuestras tarjetas.
MODBUS ASCII (American Standard Code for Information Interchange). La
comunicacin entre dispositivos se hace por medio de caracteres ASCII.
Comunicacin Maestro-Esclavo en MODBUS
El MODBUS siempre funciona con un maestro y uno o ms esclavos, siendo el maestro
quin controla en todo momento el inicio de la comunicacin con los esclavos, que segn la
especificacin pueden ser hasta 247 en una misma red. El esclavo por otro lado se limita a
retornar los datos solicitados por el maestro, as de simple es la comunicacin usando el
MODBUS, el maestro enva los mensajes y el respectivo esclavo los responde.
Cada esclavo debe tener una nica direccin, as el maestro sabe con quin se debe
comunicar. Vea la animacin siguiente, observe cmo funciona el envi de mensajes entre
el maestro y el esclavo tome en cuenta lo siguiente:
Cada esclavo tiene su propia direccin, que puede ir desde 1 hasta 247.
El maestro siempre inicia la comunicacin enviando un paquete de informacin bien
estructurado a todos los esclavos, entre otras muchas cosas en la informacin se incluye el
nmero del esclavo.
El esclavo elegido responde, enviando lo que se le pide por medio tambin de un paquete
de informacin bien estructurado.
Adems recuerde que el MODBUS se realiza sobre una red RS-485, como se observa en la
animacin, con ello solo se requieren dos cables entre dispositivos como se vio en el
anterior articulo.
Observe que hay dos direcciones, una es usada para diferenciar entre las tablas de datos, la
llamamos direccin MODBUS y la otra es la direccin usada en la comunicacin entre el
maestro y el esclavo, est es la direccin usada en la trama o paquetes de datos enviados
entre maestros y esclavos.
Output Coils
En MODBUS un coil representa un valor booleano tpicamente usado para representar una
salida, solo hay dos estados para el coil el ON y el OFF. Por ejemplo la tarjeta de
relevadores usa dos coils, para activar o desactivar precisamente dos relevadores.
El coil entonces, puede verse como una celda o un bloquecito de memoria que me permite
almacenar el estado de un bit, que puede tener solo dos valores como se vio arriba, el ON o
el OFF, o en lgica binaria, un 1 o un 0, o ms cerca de la realidad fsica, tierra (0 Volts) y
voltaje (5 Volts), como el lector quiera verlo, eso s debe quedar claro que son solo dos
valores por cada coil.
Hablemos de las direcciones, el coil segn la tabla de datos puede tener una direccin
MODBUS, la cual yo elijo y segn la tabla anterior, puede ser entre 1 y 9999 valores, por
simplicidad, se puede elegir el coil 1 y el coil 2 para, activar o desactivar, en nuestro caso,
los relevadores de la tarjeta, pero por supuesto que yo puedo elegir el coil 9998 y coil 9999,
si yo as lo quisiera, cualquier direccin en ese rango se puede usar sin ningn problema.
[
align=left]Algunas anotaciones
[/align]
En el intercambio de mensajes, ahora aparte de la direccin del esclavo se escribe que
estado deseamos para el coil. Aunque la animacin solo muestra los coil con el estado de
ON, tambin se enva de la misma forma el estado OFF del coil cuando as se necesite.
Note como el esclavo responde a la peticin del maestro, colocando el coil en el estado
que se le pide, pero adems regresa una trama de informacin al maestro, que
prcticamente es lo mismo que se le pidi.
Sobra decir que la trama de informacin enviada por el maestro y la respuesta enviada por
el esclavo, son nmeros binarios como se ver en la siguiente leccin.
Holding Registers
Los registros Holding, representan cantidades de 16 bits, se puede ver cada registro como
un bloque o celda de memoria, que es capaz de almacenar nmeros entre 0 y 65535.
Las direcciones usadas para los registros holding inician en la direccin 40001, pero puede
usarse cualquiera de las mencionadas en la tabla para los registros holding.
Estos registros son de lectura/escritura, es decir que el maestro puede hacer peticiones de
informacin para leer el dato que est almacenado, o puede enviar peticiones para escribirle
un valor al registro holding en el momento que se requiera.
Antes de ver como se forman exactamente las tramas de informacin que se envan entre
maestros y esclavos en el protocolo MODBUS, cabe recordar algo que se mencion en el
anterior artculo, se dijo que el MODBUS se basaba en tablas de datos que se almacenan en
el esclavo, de hecho enseguida se vuelve a reproducir la tabla de datos que maneja el
MODBUS, pues la vamos a necesitar ms adelante.
Direccin MODBUS Direccin Usada en la trama de informacin. Nombre de la Tabla de
Datos
1 - 9999 0000 9998 Output Coils (Lectura/escritura)
10001 - 19999 0000 9998 Inputs Contact (Lectura)
30000 - 39999 0000 9998 Inputs Registers (Lectura)
40001 - 49999 0000 9998 Holding Registers (Lectura/Escritura)
Son cuatro las tablas de datos que maneja el esclavo, y para cada una de esas tablas se
pueden realizar varias operaciones, por ejemplo para los Output Coils, se pueden realizar
las siguientes operaciones:
Leer el valor de un determinado coil
Escribir un valor a un coil
La primera operacin, la de lectura, sirve para que el esclavo vea, que valor tiene el
coil ( si es un 1 o un 0). La segunda operacin permite enviar un 0 o un 1 al coil elegido,
para diferenciar entre estas operaciones se usa un cdigo de funcin o un cdigo de
operacin como se ve enseguida.
Exactamente el cdigo de operacin que usa MODBUS para diferenciar entre una
operacin y otra es un nmero de un solo byte, recuerde, este nmero indica al esclavo qu
funcin o que operacin tiene que hacer, enseguida se muestran los cdigos de operacin
para cada una de las tablas de datos que maneja MODBUS y una pequea descripcin de lo
que hace cada funcin.
Output Coils
Cdigo de operacin Accin Descripcin
01 (01 Hexadecimal) Lectura de uno o ms coils Sirve para leer que valor tiene el coil
(un 1 o un 0)
05 (05 Hexadecimal) Escritura de un solo coil Sirve para enviar un uno o un cero al coil
elegido
15 (0F Hexadecimal) Escritura de mltiples coils Envia unos o ceros a varios coil.
Input Contact
Cdigo de operacin Accin Descripcin
02 (02 Hex) Lectura de los Input Contact Lee los valores que tiene almacenado el o los
input contact
Input Register
Cdigo de operacin Accin Descripcin
04 (04 Hex) Lectura de los Input Registers Lee los valores que tiene almacenado el o los
input register
Holding Registers
Cdigo de operacin Accin Descripcin
03 (03 Hex) Lectura de los holding Lee qu valor tiene almacenado uno o varios Holding
Registers
06 (06 Hex) Escritura de un holding Escribe un valor entre 0 65535 en un solo holding
16 (10 Hex) Escritura de mltiples holding Escribe un valor entre 0 65535 en varios
holdings
Descripcin de la trama de informacin enviada por el Maestro
A continuacin se detalla exactamente la trama de informacin o paquete de datos que
enva el maestro para que el esclavo realice alguna operacin, se muestra incluso un
ejemplo especfico para que el lector vea con gran detalle la informacin que se enva entre
maestros y esclavos.
Supongamos que deseamos saber que trama de informacin tiene que enviar el maestro,
para saber el valor que tiene, especficamente, el coil #5 en un esclavo cuya direccin es la
#240.
El segundo dato, es el cdigo de operacin visto arriba, por supuesto que tambin es un
nmero de un solo byte, que como recordaremos, le indica al esclavo qu funcin o que
operacin tiene que hacer.
Para nuestro ejemplo, se pide conocer el valor del coil #5, esto es entonces una lectura de
un solo coil, por tanto el cdigo de operacin es obviamente el 01 (Hex), como se vio en las
tablas de arriba. As pues la trama de informacin o paquete de datos MODBUS va
formndose como se observa en la figura siguiente:
El tercer dato para el cdigo de funcin 01, es la direccin del coil que se desea leer, debe
ser un nmero de 2 bytes, pues la direccin es un nmero entre 0 y 9998, para nuestro
ejemplo, se desea leer el coil #5, pero, las direcciones de los coil inician en 0, recordemos
esto reproduciendo una vez ms la tabla de datos en la siguiente imagen, donde se marcan
las direcciones usadas para la tabla de datos de los Output Coil.
La direccin MODBUS es el coil que se elige por el usuario, para nuestro ejemplo es el coil
#5, pero la verdadera direccin que se usa en la trama est en la siguiente columna, que
como se mencion arriba es un nmero entre 0 y 9998, el lector debe observar que para el
coil #1, le corresponde la direccin 0, esto implica que se debe restar una unidad para
conocer la direccin absoluta que debe ir en la trama de informacin, as pues para nuestro
ejemplo, el coil es el #5, entonces le corresponde la direccin 4, que en hexadecimal y para
dos bytes es: 0004, siendo este nmero el que se debe enviar en la trama de informacin.
El cuarto dato para el cdigo de funcin 01, es el total de coils que se desean leer, la
funcin 01, puede leer desde uno hasta el total de coils (9998) que puede haber, es por eso
que debe ser un nmero de dos byte, para nuestro ejemplo, solo se pide el valor del coil #5,
pero es posible saber con un solo paquete de informacin, el valor de mltiples coils, como
se ver ms adelante. Entonces para nuestro ejemplo, el nmero de coils a leer es 1, en
formato a dos byte es: 00001. Entonces la trama de informacin va quedando as:
Cuando el maestro hace peticiones como las vistas en la seccin anterior el esclavo debe
responder, justo con la funcin que se le pide, que para el caso de la funcin 01, es el valor
de los coils que se enviaron en la trama de informacin.
Para el ejemplo que se est analizando, si se enva la peticin que se muestra en la imagen
anterior, el esclavo solo tiene dos opciones de respuesta, esto por que como recordar el
lector, un coil solo tiene dos valores o es un 1 o es un 0, las imgenes siguientes nos
muestran estas dos respuestas posibles. Pero la trama del esclavo inicia, como la que enva
el maestro, con un byte para denotar el # de esclavo, otro para denotar el # de funcin y los
dems bytes ahora si nos dan la respuesta pedida y termina con el cdigo CRC tambin.
Respuesta del esclavo al maestro suponiendo que el coil es 0
La respuesta prcticamente es igual, a excepcin del byte de datos, donde se observa justo
ah el valor del coil, en un caso un 00 y en otro caso un 01, con esto basta para que el
maestro conozca el valor del coil pedido.
La misma funcin 01, sirve para conocer el estado de uno o muchos coil, este ejemplo
muestra la trama de informacin para leer el estado de varios coils.
Supongamos ahora que deseamos saber que trama de informacin tiene que enviar el
maestro, para saber el valor que tiene, especficamente, el coil #1, el #2, el #3, el #4, el #5,
el #6, y el #7 en un esclavo cuya direccin es la #240.
Uff para esta peticin puede haber muchsimas respuestas, pues los esclavos pueden tener 0
o 1s, vamos a suponer algunos ejemplos especficos por facilidad.
Supongamos que el coil #1=0, #2=1, #3=0, #4=1, #5=0, #6=1, #7 =1, para este caso la
respuesta del esclavo es como la mostrada en la imagen siguiente:
Dos aspectos a destacar, el nmero de byte, sigue siendo un 1, esto debido a que con un
byte puedo representar los 7 coils, si me hubieran pedido por ejemplo el estado de 15 coils,
entonces ah si el byte de datos seria 02, puesto que solo con dos byte de datos puedo
mostrar el dato de 15 coil, por otro lado observe el byte de datos 6A, este valor es asi por
que es el valor que se obtiene de la representacin del estado de cada uno de los coils.
En su origen estaba orientado a una conectividad a travs de lneas serie como pueden ser
RS-232 o RS-485, pero con el paso del tiempo han aparecido variantes como la Modbus
TCP, que permite el encapsulamiento del Modbus serie en tramas Ethernet TCP/IP de
forma sencilla. Esto sucede porque desde un punto de vista de la torre OSI, el protocolo
Modbus se ubica en la capa de aplicacin.
Lo dicho, en una red Modbus todos los dispositivos esclavos deben tener una direccin
asignada que debe estar comprendida entre la 1 y la 247.Desde un punto de vista prctico,
no pueden co-existir dos dispositivos esclavos con la misma direccin Modbus. Dentro de
la trama Modbus RTU, la direccin del esclavo corresponde al primer byte. En una red
Modbus el Master no slo puede ejercer la funcin de recompilar informacin de los
esclavos mediante preguntas, sino que puede interactuar con ellos o alterar su estado,
pudiendo escribir adems de leer informacin en cualquiera de ellos.
Con el paso de los aos y segn la evolucin de las redes de comunicaciones entre
dispositivos electrnicos, as como de la conectividad entre dispositivos, han ido
apareciendo variantes del protocolo Modbus que estaba pensado en su inicio para redes
implementadas sobre lneas serie. La evolucin ms utilizada/conocida es la que se conoce
como Modbus TCP, una versin del protocolo Modbus que permite la implementacin
de este protocolo sobre redes Ethernet i, en consecuencia, aumenta el grado de
conectividad. Est versin del protocolo encapsula la trama base del protocolo Modbus
en la capa de aplicacin TCP/IP de forma sencilla. Con un poco de tiempo colgar la
estrucura a nivel de byte de las tramas Modbus RTU y Mobus TCP.
As pues la estructura bsica de una trama Modbus RTU, tanto de lectura como escritura,
es la que se muestra a continuacin:
Direccin Esclavo
Este es el campo al que haba hecho referencia en el post anterior y que de manera directa
limita el nmero de esclavos que podemos tener conectados de forma correcta al bus serie
Modbus. Dado que existen direcciones reservadas para propsitos especiales como el
broadcast el valor que puede ir de 1 a 247.
Funcin Modbus
Con este campo se especifica que accin requiere el master del slave al que va dirigida la
trama. Con el paso de los aos se han ido aadiendo ms funciones especificas. En
cualquier caso, os explico las mas utilizadas y/o genricas.
En este caso, el valor contenido en este campo si que puede variar si se trata de una trama
Master->Slave o si por el contrario es Slave->Master. El valor de este byte se ver
modificado en la trama de respuesta slo cuando exista algn error en el campo de datos de
la trama Modbus enviada por el Master, no cuando el cdigo de comprobacin de errores
de esta sea errneo. Reiterando lo dicho, si la trama del Master es correcta, la trama de
respuesta tiene este byte con el mismo valor. En el caso de existir error el Slave responder
con la misma funcin que en la trama enviada por el Master pero con la mscara 0x80
aplicada. Por ejemplo: si el mster enva una trama con funcin 0x03 correcta el Slave
responder con el mismo campo y el mismo valor, 0x03; si por el contrario contiene algn
error, el Master aplicar la mscara 0x80 y responder con una trama con el valor 0x83.
Poco a poco, mas adelante explicar con mas detalle la trama de error de respuesta para que
quede mas claro. Ahora centrmonos en los casos no excepcionales y sin error. Pues
primero se gatea y despus se camina.
En este post podis ver como son cada una de las funciones. He preferido dedicarle un post
por su variabilidad.
Para el clculo del CRC se utilizan cada uno de los bytes que conforman la trama. El
procedimiento es el siguiente: