├── .gitattributes ├── .gitignore ├── 20160320_215017.jpg ├── 20160320_224435.jpg ├── Arduino Modbus - PC.jpg ├── Master_modbus_RTU.ino ├── README.md └── escritura de registros.jpg /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /20160320_215017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/b45a030bbb4988fb747208b0e7ea18323aa61b77/20160320_215017.jpg -------------------------------------------------------------------------------- /20160320_224435.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/b45a030bbb4988fb747208b0e7ea18323aa61b77/20160320_224435.jpg -------------------------------------------------------------------------------- /Arduino Modbus - PC.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/b45a030bbb4988fb747208b0e7ea18323aa61b77/Arduino Modbus - PC.jpg -------------------------------------------------------------------------------- /Master_modbus_RTU.ino: -------------------------------------------------------------------------------- 1 | /** 2 | * Modbus master example 2: 3 | * The purpose of this example is to query several sets of data 4 | * from an external Modbus slave device. 5 | * The link media can be USB or RS232. 6 | * 7 | * Recommended Modbus slave: 8 | * diagslave http://www.modbusdriver.com/diagslave.html 9 | * 10 | * In a Linux box, run 11 | * "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1" 12 | * This is: 13 | * serial port /dev/ttyUSB0 at 19200 baud 8N1 14 | * RTU mode and address @1 15 | * 16 | */ 17 | 18 | //// http://pdacontrol.blogspot.com.co/2016/03/pruebas-libreria-modbus-rtu-maestro-con.html 19 | 20 | 21 | 22 | #include 23 | 24 | 25 | /// oled debuging 26 | 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #define OLED_RESET 4 // not used / nicht genutzt bei diesem Display 33 | Adafruit_SSD1306 display(OLED_RESET); 34 | 35 | 36 | /// 37 | 38 | uint16_t au16data[32]; //!< data array for modbus network sharing Array 39 | uint8_t u8state; //!< machine state 40 | uint8_t u8query; //!< pointer to message query 41 | 42 | /** 43 | * Modbus object declaration 44 | * u8id : node id = 0 for master, = 1..247 for slave 45 | * u8serno : serial port (use 0 for Serial) 46 | * u8txenpin : 0 for RS-232 and USB-FTDI 47 | * or any pin number > 1 for RS-485 48 | */ 49 | Modbus master(0,0,7); // this is master and RS-232 or USB-FTDI /// 7 = PIN ENEABLE rs485 50 | 51 | /** 52 | * This is an structe which contains a query to an slave device 53 | */ 54 | modbus_t telegram[2]; 55 | 56 | unsigned long u32wait; 57 | 58 | 59 | 60 | void setup() { 61 | 62 | // initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren 63 | display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 64 | display.display(); 65 | delay(2000); 66 | display.clearDisplay(); 67 | display.setTextSize(0.5); 68 | display.setTextColor(INVERSE); 69 | 70 | ////////////////////////////// 71 | 72 | // telegram 0: read registers 73 | telegram[0].u8id = 1; // slave address 74 | telegram[0].u8fct = 3; // function code (registers read multiple 3) 75 | telegram[0].u16RegAdd = 0; // start address in slave - direccion de Inicio 0 76 | telegram[0].u16CoilsNo = 10; // number of elements (coils or registers) to read 0 - 16 77 | telegram[0].au16reg = au16data; // pointer to a memory array in the Arduino - Almacenamiento en Array de memoria de arduino 78 | 79 | // telegram 1: write a multiple register = function 16 80 | telegram[1].u8id = 1; // slave address 81 | telegram[1].u8fct = 16; // function code (write multiple registers 16 ) 82 | telegram[1].u16RegAdd = 10; // start address in slave - direccion de Inicio 10 83 | telegram[1].u16CoilsNo = 10; // number of elements (coils or registers) to read 84 | telegram[1].au16reg = au16data+10; // pointer to a memory array in the Arduino - Almacenamiento en Array de memoria de arduino 10 posiciones despues 85 | 86 | 87 | master.begin( 19200 ); // baud-rate at 19200 88 | master.setTimeOut( 5000 ); // if there is no answer in 5000 ms, roll over 89 | u32wait = millis() + 1000; 90 | u8state = u8query = 0; 91 | } 92 | 93 | void loop() { 94 | switch( u8state ) { 95 | case 0: 96 | if (millis() > u32wait) u8state++; // wait state 97 | break; 98 | case 1: 99 | master.query( telegram[u8query] ); // send query (only once) 100 | u8state++; 101 | u8query++; 102 | if (u8query > 2) u8query = 0; 103 | break; 104 | case 2: 105 | master.poll(); // check incoming messages 106 | if (master.getState() == COM_IDLE) { 107 | u8state = 0; 108 | u32wait = millis() + 1000; 109 | } 110 | break; 111 | } 112 | 113 | display.clearDisplay(); 114 | 115 | //Read Multiple Holding Register - Lectura de multiples registros 116 | 117 | display.setCursor(0,0); 118 | display.print(au16data[0]); // Read Holding Register [0] 119 | display.print(","); 120 | display.print(au16data[1]); // Read Holding Register [1] 121 | display.print(","); 122 | display.print(au16data[2]); // Read Holding Register [2] 123 | display.print(","); 124 | display.print(au16data[3]); // Read Holding Register [3] 125 | display.print(","); 126 | display.print(au16data[4]); // Read Holding Register [4] 127 | display.print(" Hold 0-4"); 128 | 129 | display.setCursor(0,8); 130 | display.print(au16data[5]); // Read Holding Register [5] 131 | display.print(","); 132 | display.print(au16data[6]); // Read Holding Register [6] 133 | display.print(","); 134 | display.print(au16data[7]); // Read Holding Register [7] 135 | display.print(","); 136 | display.print(au16data[8]); // Read Holding Register [8] 137 | display.print(","); 138 | display.print(au16data[9]); // Read Holding Register [9] 139 | display.print(" Hold 5-9"); 140 | 141 | 142 | 143 | 144 | //Write Multiple Holding Register - Escritura de multiples registros 145 | 146 | au16data[10] = analogRead( 0 ); // Write Holding Register [10] 147 | 148 | au16data[11] = analogRead( 0 ); // Write Holding Register [11] 149 | 150 | au16data[12] = analogRead( 0 ); // Write Holding Register [12] 151 | 152 | au16data[13] = analogRead( 0 ); // Write Holding Register [13] 153 | 154 | au16data[14] = analogRead( 0 ); // Write Holding Register [14] 155 | 156 | au16data[15] = analogRead( 0 ); // Write Holding Register [15] 157 | 158 | au16data[16] = analogRead( 0 ); // Write Holding Register [16] 159 | 160 | au16data[17] = analogRead( 0 ); // Write Holding Register [17] 161 | 162 | au16data[18] = analogRead( 0 ); // Write Holding Register [18] 163 | 164 | au16data[19] = analogRead( 0 ); // Write Holding Register [19] 165 | 166 | 167 | // Print Oled Write Holding Register 168 | 169 | display.setCursor(0,16); 170 | display.print(au16data[10]); 171 | display.print(","); 172 | display.print(au16data[11]); 173 | display.print(","); 174 | display.print(au16data[12]); 175 | display.print(","); 176 | display.print(au16data[13]); 177 | display.print(","); 178 | display.print(au16data[14]); 179 | display.print(","); 180 | display.print(au16data[15]); 181 | display.print(","); 182 | display.print(au16data[16]); 183 | display.print(","); 184 | display.print(au16data[17]); 185 | display.print(","); 186 | display.print(au16data[18]); 187 | display.print(","); 188 | display.print(au16data[19]); 189 | display.print(" Hold 10-19"); 190 | 191 | 192 | display.display(); 193 | 194 | 195 | 196 | 197 | 198 | } 199 | 200 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Arduino Modbus Master RTU y Simulator Modbus Slave RTU 2 | Arduino Modbus Master in 5 minutes 3 | 4 | #Arduino MEGA 2560 R3 5 | ![Portada](https://github.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/blob/master/20160320_224435.jpg) 6 | 7 | # Display Oled 128 x 64 I2c 8 | 9 | ![Portada](https://github.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/blob/master/20160320_215017.jpg) 10 | 11 | # Simulator Slave Registers 12 | 13 | ![Portada](https://github.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/blob/master/escritura%20de%20registros.jpg) 14 | 15 | #Architecture Arquitectura 16 | 17 | ![Portada](https://github.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/blob/master/Arduino%20Modbus%20-%20PC.jpg) 18 | 19 | 20 | # Hi .... More information Proyects PDAControl 21 | 22 | # Hola .... Mas informacion sobre Proyectos PDAControl 23 | 24 | Welcome to this space learning automation technology applied to industry and everyday life. 25 | If you like electronics, home automation, automation, programming, PLC, microcontrollers, 26 | Arduino, Python, Open source .... my blog will be a great help ... 27 | if you need help and information do not hesitate to consult. 28 | 29 | Blog PDAControl English http://pdacontrolenglish.blogspot.com.co/ 30 | Blog PDAControl Español http://pdacontrol.blogspot.com.co/ 31 | Channel Youtube https://www.youtube.com/c/JhonValenciaPDAcontrol/videos 32 | Twitter Spanish https://twitter.com/PDAControl 33 | Twitter Enghish: https://twitter.com/Jhon_Control 34 | -------------------------------------------------------------------------------- /escritura de registros.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JhonControl/Arduino_Modbus_Master_in_5_minutes/b45a030bbb4988fb747208b0e7ea18323aa61b77/escritura de registros.jpg --------------------------------------------------------------------------------