Você está na página 1de 23

UNIVERSIDAD DISTRITAL

Francisco Jos de Caldas


Facultad Tecnolgica

Presentado a:
Alverto Delgadillo

Integrantes
Yesid uruea cuervo
Eliseo Amado

20141383221
20151383025

Comunicacin Modbus ModSim

Todas la pruebas fueron realizadas utilizando el simulador ModSim el


cual nos garantiza que funcionara perfectamente un hardware real.

Las funciones marcadas en azul corresponden a las implementadas en


esta librera
-

Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin
Funcin

1 Read Coil Status


2 Read Input Status
3 Read Holding Registers
4 Read Input Registers
5 Force Single Coil
6 Preset Single Register
7 Read Exception Status
8 Diagnostics
9 Program 484
10 Poll 484
11 Fetch Communication Event Counter
12 Fetch Communication Event Log
13 Program Controller
14 Poll Controller
15 Force Multiple Coils
16 Preset Multiple Registers
17 Report Slave ID
18 Program 884/M84
19 Reset Comm. Link
20 Read General Reference
21 Write General Reference
22 Mask Write 4X Register
23 Read/Write 4X Registers
24 Read FIFO Queue

A continuacin detallamos las tramas de cada funcin con un ejemplo

Funcion: Read Coil Status (FC=01)

Request: Esta trama realiza la peticin del estado de los (discrete coils)
del 20 al 56 del dispositivo esclavo con direccin 17.
11 01 0013 0025 0E10
11: Direccin del Esclavo (17 = 11 hex.)
01: Cdigo de la Funcin (read Coil Status)
0013: Direccin del dato del primer coil para leer. (Coil 20 - 1 = 19
= 13 hex)
0025: Nmero de coils para leer. (del 20 al 56 = 37 = 25 hex)
0E10: El CRC (cyclic redundancy check) para manejo de errores.
Response
11 01 05 CD6BB20E1B 45E6
11: Direccin del esclavo (17 = 11 hex)
01: Cdigo de la funcin (read Coil Status)
05: Nmero de data bytes (37 Coils / 8 bits por byte = 5 bytes)
CD: Coils 27 - 20 (1100 1101)
6B: Coils 35 - 28 (0110 1011)
B2: Coils 43 - 36 (1011 0010)
0E: Coils 51 - 44 (0000 1110)
1B: 3 bits no usados & Coils 56 - 52 (0001 1011)
45E6: El CRC (cyclic redundancy check).
Funcin: Input Status (FC=02)

Request: Esta trama realiza la peticin del estado de los (discrete


inputs) del 10197 al 10218 del dispositivo esclavo con direccin 17.
11 02 00C4 0016 BA08
11: Direccin del Esclavo (17 = 11 hex.)
02: Cdigo de la Funcin (read Input Status).
00C4: Direccin de la primera entrada. (10197 - 10001 = 196 = C4 hex.)
0016: Nmero total de coils de la peticin. (197 al 218 = 22 = 16 hex.)
BA08: El CRC (cyclic redundancy check) para manejo de errores.
Response
11 02 03 CD6B32 45C4
11: Direccin del Esclavo (17 = 11 hex.)
02: Cdigo de la funcin (read Input Status)
03: El numero total de bytes (22 Inputs / 8 bits per byte = 3 bytes)
CD: Entradas Discretas 10204 -10197 (1010 1100)
6B: Entradas Discretas 10212 - 10205 (1101 1011)
32: 2 espacios vacos & Entradas Discretas 10218 - 10213 (0011 0101)
45C4: El cdigo CRC (cyclic redundancy check).

Funcin: Read Holding Registers (fc3)

Request: Esta trama realiza la peticin del estado de la salida analgica


holding registers desde 40108 a 40110 del dispositivo esclavo con
direccin 17.
11 03 006B 0003 7611
11: Direccin del Esclavo (17 = 11 hex.)
03: Cdigo de la funcin (read Analog Output Holding Registers)
006B: Direccin del Dato del primer registro requerido. (40108-40001 =
107 = 6B hex.)
0003: Nmero total de registros requeridos. (3 registros desde 40108 al
40110)
7611: El CRC (cyclic redundancy check) manejo de errores.
Response
11 03 06 AE41 5652 4340 49AD
11: Direccin del Esclavo (17 = 11 hex)
03: Cdigo de la funcin (read Analog Output Holding Registers)
06: Nmero de bytes (3 registros x 2 bytes por cada uno = 6 bytes)
AE41: Contenido del registro 40108
5652: Contenido del registro 40109
4340: Contenido del registro 40110
49AD: El CRC (cyclic redundancy check).

Funcin: Read Input Register (fc4)

Request: Esta trama realiza la peticin del estado de la entrada


analgica input registers #30009 del dispositivo esclavo con direccin
17.
11 04 0008 0001 B207
11: Direccin del Esclavo (17 = 11 hex.)
04: Cdigo de la Funcin (read Analog Input Registers)
0008: Direccin de dato del primer registro requerido. (30009-30001 =
8)
0001: El numero de registros para leer. (leer 1 registro)
B207: The CRC (cyclic redundancy check) for error checking.
Response
11 04 02 000A F8F4
11: Direccin del Esclavo (17 = 11 hex)
04: El Cdigo de Funcin (read Analog Input Registers)
02: Numero de bytes de datos (1 registro x 2 bytes por registro = 2
bytes)
000A: Contenido del registro 30009
F8F4: El cdigo CRC (cyclic redundancy check).

Funcin: Force Single Coil (fc5)

Request: Este comando escribe el registro del discrete coil # 173 a ON


en el dispositivo esclavo con direccin 17.
11 05 00AC 00FF 4F08
11: Direccin del Esclavo (17 = 11 hex)
05: Cdigo de la Funcin (Force Single Coil)
00AC: Direccin de Dato del coil. (# 173 - 1 = 172 = AC hex)
00FF: Estado a escribir ( 00FF = ON, 0000 = OFF )
4F08: El Cdigo CRC (cyclic redundancy check) para manejo de errores.
Response
11 05 00AC 00FF 4F3B
11: Direccin del Esclavo (17 = 11 hex)
05: Cdigo de la Funcin (Force Single Coil)
00AC: Direccin de Dato del coil. (coil# 173 - 1 = 172 = AC hex)
00FF: Estado actualizado ( 00FF = ON, 0000 = OFF )
4F3B: El Cdigo CRC (cyclic redundancy check) para manejo de errores.

Funcin: Preset Single Register (fc6)

Request: Este comando escribe el contenido del analog output holding


register # 40002
al dispositivo esclavo con direccion 17.
11 06 0001 0003 9A08
11: Direccin del Esclavo (17 = 11 hex)
06: Cdigo de la Funcin (Preset Single Register)
0001: Direccin del registro de Dato. (# 40002 - 40001 = 1 )
0003: Valor a escribir.
9A08: El cdigo CRC (cyclic redundancy check) para manejo de errores.
Response: La respuesta normal es un echo del request.
11 06 0001 0003 9A9B
11: Direccin del Esclavo (17 = 11 hex)
06: Cdigo de la Funcin (Preset Single Register)
0001: Direccin del registro de Dato. (# 40002 - 40001 = 1 )
0003: Valor escrito.
9A9B: El cdigo CRC (cyclic redundancy check) para manejo de errores.

Funcin: Force Multiple Coils (FC=15)

Request: Este comando escribe el contenido discreto de una serie de


10 coils desde #20 al #29 en el esclavo con direccion 17.
11 0F 0013 000A 02 CB01 BF08
11: Direccin del Esclavo (17 = 11 hex.)
0F: Cdigo de la Funcin (Force Multiple Coil, 15 = 0F hex.)
0013: Direccin del primer coil. (# 20 - 1 = 19 = 13 hex.)
000A: Nmero de coils para ser escrito (10 = 0A hex)
02: Numero de bytes de datos (10 Coils / 8 bits por byte = 2 bytes)
CB: Coils 27 - 20 (1100 1011)
01: 6 espacios vacios & Coils 29 - 28 (0000 0001)
BF08: El Cdigo CRC (cyclic redundancy check) para manejo de errores.
Response
11 0F 0013 000A 2699
11: Direccin del Esclavo (17 = 11 hex)
0F: Cdigo de la Funcin (Force Multiple Coil, 15 = 0F hex)
0013: Direccin del primer coil. (coil# 20 - 1 = 19 = 13 hex)
000A: Nmero de coils para ser escrito (10 = 0A hex)
2699: El Cdigo CRC (cyclic redundancy check) para manejo de errores.

Funcin: Preset Multiple Registers (FC=16)

Request: Este comando escribe el contenido de 2 analog output holding


registers # 40002 & 40003 en el esclavo con direccin 17.
11 10 0001 0002 04 000A 0102 C608
11: Direccin del Esclavo (17 = 11 hex)
10: Cdigo de la funcin (Preset Multiple Registers 16 = 10 hex)
0001: Direccin del primer registro. (# 40002 - 40001 = 1 )
0002: Numero de registros para escribir.
04: Numero de bytes (2 registros x 2 bytes por cada registro = 4 bytes)
000A: Valor para escribir para el registro 40002
0102: Valor para escribir para el registro 40003
C608: El cdigo CRC (cyclic redundancy check) para el manejo de
errores.
Response
11 10 0001 0002 1298
11: Direccin del Esclavo (17 = 11 hex)
10: Cdigo de la funcin (Preset Multiple Registers 16 = 10 hex)
0001: Direccin del primer registro. (# 40002 - 40001 = 1 )
0002: Nmero de bytes escritos.
1298: El Cdigo CRC (cyclic redundancy check) para manejo de errores

Cdigo del programa en artuino


#include <modbusDevice.h>
#include <modbusRegBank.h>

#include <modbusSlave.h>
//const int EnTxPin = 2; // HIGH:TX y LOW:RX
/* PINS
Add more registers if needed
Digital input pins 2,3,4,5,6,7
Digital output pins 8,9,12,13
Analog output pins 10,11 (PWM)
Analog input pins 0,1,2,3,4,5
*/
modbusDevice regBank;
modbusSlave slave;

int AI0,AI1,AI2,AI3,AI4,AI5;

void setup()
{
//pinMode(EnTxPin, OUTPUT);
// digitalWrite(EnTxPin, HIGH);
regBank.setId(1); ///Set Slave ID
//Add Digital Output registers 00001-00016 to the register bank
regBank.add(1);
regBank.add(2);
regBank.add(3);
regBank.add(4);
regBank.add(5);
regBank.add(6);
regBank.add(7);
regBank.add(8);
regBank.add(9);
regBank.add(10);

regBank.add(11);
regBank.add(12);
regBank.add(13);
regBank.add(14);
regBank.add(15);
regBank.add(16);
//Add Digital Input registers
regBank.add(10001);
regBank.add(10002);
regBank.add(10003);
regBank.add(10004);
regBank.add(10005);
regBank.add(10006);
regBank.add(10007);
regBank.add(10008);
regBank.add(10009);
regBank.add(10010);
regBank.add(10011);
regBank.add(10012);
regBank.add(10013);
regBank.add(10014);
regBank.add(10015);
regBank.add(10016);
regBank.add(10017);

regBank.add(30001);
regBank.add(30002);
regBank.add(30003);
regBank.add(30004);
regBank.add(30005);

regBank.add(30006);
regBank.add(30007);
regBank.add(30008);
regBank.add(30009);
regBank.add(30010);

//Analog input registers


regBank.add(40001);
regBank.add(40002);
regBank.add(40003);
regBank.add(40004);
regBank.add(40005);
regBank.add(40006);
regBank.add(40007);
regBank.add(40008);
regBank.add(40009);
regBank.add(40010);
regBank.add(40011);
regBank.add(40012);
regBank.add(40013);
regBank.add(40014);
regBank.add(40015);
regBank.add(40016);
regBank.add(40017);
regBank.add(40018);
regBank.add(40019);
regBank.add(40020);
regBank.add(40021);
regBank.add(40022);
regBank.add(40023);

regBank.add(40024);
regBank.add(40025);
regBank.add(40026);
regBank.add(40027);
regBank.add(40028);
regBank.add(40029);
regBank.add(40030);
//regBank.add(30005);
//regBank.add(30006);
//Analog Output registers
// regBank.add(40010);
// regBank.add(40011);

slave._device = &regBank;
slave.setBaud(9600);

// pinMode(0,OUTPUT);
//pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(12,INPUT);
pinMode(13,INPUT);

void loop(){

while(1){

byte DI13 = digitalRead(13);


if (DI13 >= 1){
regBank.set(1, 1);
regBank.set(2, 1);
regBank.set(3, 1);
regBank.set(4, 1);
regBank.set(5, 1);
regBank.set(6, 1);
regBank.set(7, 1);
regBank.set(8, 1);
digitalWrite(2,HIGH);
}
if (DI13 <= 0){
regBank.set(1, 0);
regBank.set(2, 0);
regBank.set(3, 0);
regBank.set(4, 0);
regBank.set(5, 0);
regBank.set(6, 0);
regBank.set(7, 0);
regBank.set(8, 0);
digitalWrite(2,LOW);
}

byte DI12 = digitalRead(12);


if (DI12 >= 1){

regBank.set(10001, 1);
regBank.set(10002, (word) random(0, 1));
regBank.set(10007, 1);
regBank.set(10003, 1);
regBank.set(10004, (word) random(0, 1));
regBank.set(10005, 1);
regBank.set(10006, 1);
regBank.set(10008, 1);
regBank.set(10009, (word) random(0, 1));
regBank.set(10010, 1);
regBank.set(10011, 1);
regBank.set(10012, (word) random(0, 1));
digitalWrite(3,HIGH);
}
if (DI12 <= 0){
regBank.set(10001,0);
regBank.set(10002,0);
regBank.set(10007,0);
regBank.set(10003,0);
regBank.set(10004,0);
regBank.set(10005,0);
regBank.set(10006,0);
regBank.set(10008,0);
regBank.set(10009,0);
regBank.set(10010,0);
regBank.set(10011,0);
regBank.set(10012,0);
digitalWrite(3,LOW);
}

byte DI11 = digitalRead(11);


if (DI11 >= 1){
regBank.set(30001,(word) random(0, 32767));
regBank.set(30002,200);
regBank.set(30003,350);
regBank.set(30004,(word) random(0, 32767));
regBank.set(30005,550);
regBank.set(30006,600);
regBank.set(30007,7541);
regBank.set(30008,8564);
regBank.set(30009,9985);
regBank.set(30010,1023);
regBank.set(30011,5252);
regBank.set(30013,2357);
digitalWrite(4,HIGH);
}
if (DI11 <= 0){
regBank.set(30001,0);
regBank.set(30002,0);
regBank.set(30003,0);
regBank.set(30004,0);
regBank.set(30005,0);
regBank.set(30006,0);
regBank.set(30007,0);
regBank.set(30008,0);
regBank.set(30009,0);
regBank.set(30010,0);
regBank.set(30011,0);

regBank.set(30013,0);
digitalWrite(4,LOW);
}

byte DI10 = digitalRead(10);


if (DI10 >= 1){
AI0 = analogRead(0);
delay(10);
AI0 = analogRead(0);
regBank.set(40001, (word) AI0);
delay(10);

AI1 = analogRead(1);
delay(10);
AI1 = analogRead(1);
regBank.set(40002, (word) AI1);
delay(10);

regBank.set(40003, (word) random(0, 32767));


regBank.set(40004,9999);
regBank.set(40005,4);
regBank.set(40006,5);
regBank.set(40007,6);
regBank.set(40008,8);
regBank.set(40009,9);
regBank.set(40010,10);
regBank.set(40011,5);
regBank.set(40012,6);
regBank.set(40013,7);
regBank.set(40014,8);

regBank.set(40015,(word) random(0, 32767));


regBank.set(40016,10);
regBank.set(40017,5);
regBank.set(40018,6);
regBank.set(40019,7);
regBank.set(40020,(word) random(0, 32767));
regBank.set(40021,2514);
regBank.set(40022,6);
regBank.set(40023,7);
regBank.set(40024,8);
regBank.set(40025,9);
regBank.set(40026,10);
regBank.set(40027,5);
regBank.set(40028,6);
regBank.set(40029,(word) random(0, 32767));
digitalWrite(5,HIGH);
}
if (DI10 <= 0){
regBank.set(40001,0);
regBank.set(40002,0);
regBank.set(40003,0);
regBank.set(40004,0);
regBank.set(40005,0);
regBank.set(40006,0);
regBank.set(40007,0);
regBank.set(40008,0);
regBank.set(40009,0);
regBank.set(40010,0);
regBank.set(40011,0);
regBank.set(40012,0);

regBank.set(40013,0);
regBank.set(40014,0);
regBank.set(40015,0);
regBank.set(40016,0);
regBank.set(40017,0);
regBank.set(40018,0);
regBank.set(40019,0);
regBank.set(40020,0);
regBank.set(40021,0);
regBank.set(40022,0);
regBank.set(40023,0);
regBank.set(40044,0);
regBank.set(40055,0);
regBank.set(40066,0);
regBank.set(40027,0);
regBank.set(40028,0);
regBank.set(40029,0);
digitalWrite(5,LOW);
}
int DO2 = regBank.get(2);
int DO3 = regBank.get(3);
int DO4 = regBank.get(4);
int DO5 = regBank.get(5);
if (DI10>= 1 && DO5>=1 && DO4>=1 && DO3>=1 && DO2>=1 ){
digitalWrite(6,HIGH);
}
else
digitalWrite(6,LOW);
/* byte DI3 = digitalRead(3);
if (DI3 >= 1)regBank.set(10003,1);

if (DI3 <= 0)regBank.set(10003,0);


byte DI4 = digitalRead(4);
if (DI4 >= 1)regBank.set(10004,1);
if (DI4 <= 0)regBank.set(10004,0);
byte DI5 = digitalRead(5);
if (DI5 >= 1)regBank.set(10005,1);
if (DI5 <= 0)regBank.set(10005,0);
byte DI6 = digitalRead(6);
if (DI6 >= 1)regBank.set(10006,1);
if (DI6 <= 0)regBank.set(10006,0);
byte DI7 = digitalRead(7);
if (DI7 >= 1)regBank.set(10007,1);
if (DI7 <= 0)regBank.set(10007,0);
*/
//Digital output
/*
//if (DO8 <= 0 && digitalRead(8) == HIGH)digitalWrite(8,LOW);
//if (DO8 >= 1 && digitalRead(8) == LOW)digitalWrite(8,HIGH);
int DO9 = regBank.get(9);
if (DO9 <= 0 && digitalRead(9) == HIGH)digitalWrite(9,LOW);
if (DO9 >= 1 && digitalRead(9) == LOW)digitalWrite(9,HIGH);
int DO12 = regBank.get(12);
if (DO12 <= 0 && digitalRead(12) == HIGH)digitalWrite(12,LOW);
if (DO12 >= 1 && digitalRead(12) == LOW)digitalWrite(12,HIGH);
// int DO13 = regBank.get(13);
// if (DO13 <= 0 && digitalRead(13) == HIGH)digitalWrite(13,LOW);
// if (DO13 >= 1 && digitalRead(13) == LOW)digitalWrite(13,HIGH);
*/
//Analog input ***READ Twice deliberately

/* AI2 = analogRead(2);
delay(10);
AI2 = analogRead(2);
regBank.set(40003, (word) AI2);
delay(10);

AI3 = analogRead(3);
delay(10);
AI3 = analogRead(3);
regBank.set(40004, (word) AI3);
delay(10);

AI4 = analogRead(4);
delay(10);
AI4 = analogRead(4);
regBank.set(30005, (word) AI4);
delay(10);

AI5 = analogRead(5);
delay(10);
AI5 = analogRead(5);
regBank.set(30006, (word) AI5);
delay(10);
*/
//Analog output
/* word AO10 = regBank.get(40010);
analogWrite(10,AO10);
delay(10);
word AO11 = regBank.get(40011);

analogWrite(11,AO11);
delay(10);
*/

slave.run();
}
}

Você também pode gostar