Arduino ModbusRTU programming into Modbus TCP

dpslusser

Member
Join Date
Jan 2016
Location
PA
Posts
48
So I found this code (below) on a forum and it works great for me.

The problem is that I want to get away from serial and go TCP.

Anyone with Arduino skills know how to change it to work with an Ethernet shield via TCP?



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

/* 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()
{
regBank.setId(1); ///Set Slave ID

//Add Digital Input registers
regBank.add(10002);
regBank.add(10003);
regBank.add(10004);
regBank.add(10005);
regBank.add(10006);
regBank.add(10007);
// Add Digital Output registers
regBank.add(8);
regBank.add(9);
regBank.add(12);
regBank.add(13);
//Analog input registers
regBank.add(30001);
regBank.add(30002);
regBank.add(30003);
regBank.add(30004);
regBank.add(30005);
regBank.add(30006);
//Analog Output registers
regBank.add(40010);
regBank.add(40011);

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

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

}
void loop(){

while(1){
//Digital Input
byte DI2 = digitalRead(2);
if (DI2 >= 1)regBank.set(10002,1);
if (DI2 <= 0)regBank.set(10002,0);
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
int DO8 = regBank.get(8);
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
AI0 = analogRead(0);
delay(10);
AI0 = analogRead(0);
regBank.set(30001, (word) AI0);
delay(10);

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

AI2 = analogRead(2);
delay(10);
AI2 = analogRead(2);
regBank.set(30003, (word) AI2);
delay(10);

AI3 = analogRead(3);
delay(10);
AI3 = analogRead(3);
regBank.set(30004, (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();
}
}

 
Modbus RTU is ancient serial based while TCP is new ethernet based. Its not just going to be like changing a parameter in the code. Either you need to find the TCP standard and rewrite the code, or simpler: Use google or ask the experts on the arduino forum.
 

Similar Topics

I'm trying to write a data in Arduino using MODWR function block .I used the code I got from online for both PLC and Arduino. I made the wiring...
Replies
4
Views
117
I am working on a project that had originally started on a sparkfun redboard artemis. Through some testing I've pushed to utilize a PLC for the...
Replies
9
Views
1,592
Hello, I have been getting more and more requests for Real Time Clock (RTC) sensitive automation from my clients. I know that there is a Modbus...
Replies
13
Views
2,743
https://www.arduino.cc/pro/software-plc-ide Diving in when I get home. With its full IEC language support, object-oriented programming...
Replies
65
Views
19,706
https://www.hackster.io/news/arduino-unveils-the-opta-its-first-micro-plc-for-the-industrial-internet-of-things-d97f1d6b868a...
Replies
32
Views
10,143
Back
Top Bottom