Thanks Paul, this clarifies a lot.
I have succeeded with simulating an Arduino circuit in Proteus with an old modbus library written by Juan Pablo Zometa. Since it is not supported with Arduino IDE over 1.X, I thought I'd move to Simple Modbus library, but then some problems occured.
The circuit for the tutorial is as attached.
It works pretty well with tutorial code based on old modbus library, but when I try to port it to Simple Modbus I get "Illegal function" error while trying to write from ScadaBr to Arduino slave (it works with an old code, included as an attachment). Below my code:
#include <SimpleModbusSlave.h>
/* slave registers example */
enum {
MB_REG0,
MB_REG1,
MB_REG2,
MB_REG3,
MB_REG4,
MB_REG5,
MB_REG6,
MB_REG7,
MB_REG8,
MB_REG9,
MB_REG10,
MB_REG11,
MB_REG12,
MB_REG13,
MB_REGS
};
unsigned int holdingRegs[MB_REGS]; /* this is the slave's modbus data map */
void setup()
{
modbus_configure(&Serial, 9600, SERIAL_8N1, 1, 2, MB_REGS, holdingRegs);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,INPUT);
pinMode(8,INPUT);
pinMode(7,INPUT);
pinMode(6,INPUT);
}
void loop()
{
/* This is all for the Modbus slave */
modbus_update();
holdingRegs[MB_REG0]=analogRead(0);
holdingRegs[MB_REG1]=analogRead(1);
holdingRegs[MB_REG2]=analogRead(2);
holdingRegs[MB_REG3]=analogRead(3);
holdingRegs[MB_REG4]=analogRead(4);
holdingRegs[MB_REG5]=analogRead(5);
holdingRegs[MB_REG6]=digitalRead(6);
holdingRegs[MB_REG7]=digitalRead(7);
holdingRegs[MB_REG8]=digitalRead(8);
holdingRegs[MB_REG9]=digitalRead(9);
switch ( holdingRegs[MB_REG10]) {
case 1:
digitalWrite(10,HIGH);
break;
case 0:
digitalWrite(10,LOW);
break;
default:
digitalWrite(10,LOW);
}
switch ( holdingRegs[MB_REG11]) {
case 1:
digitalWrite(11,HIGH);
break;
case 0:
digitalWrite(11,LOW);
break;
default:
digitalWrite(11,LOW);
}
switch ( holdingRegs[MB_REG12]) {
case 1:
digitalWrite(12,HIGH);
break;
case 0:
digitalWrite(12,LOW);
break;
default:
digitalWrite(12,LOW);
}
switch ( holdingRegs[MB_REG13]) {
case 1:
digitalWrite(13,HIGH);
break;
case 0:
digitalWrite(13,LOW);
break;
default:
digitalWrite(13,LOW);
}
}
modbus.txt (19.6 KB)