Hallo,
was sagt Ihr würde das so in etwa funktionieren?
Oder muss da noch viel mehr in den Sketch?
/**
* Modbus slave example 2:
* The purpose of this example is to link the Arduino digital and analog
* pins to an external device.
*
* Recommended Modbus Master: QModbus
* http://qmodbus.sourceforge.net/
*/
#include <ModbusRtu.h>
#define ID 1
Modbus slave(ID, 0, 0); // this is slave ID and RS-232 or USB-FTDI
boolean led;
int8_t state = 0;
unsigned long tempus;
// data array for modbus network sharing
uint16_t au16data[9];
/**
* Setup procedure
*/
void setup() {
io_setup(); // I/O settings
// start communication
slave.begin( 19200 );
tempus = millis() + 100;
digitalWrite(13, HIGH );
}
/**
* Loop procedure
*/
void loop() {
// poll messages
// blink led pin on each valid message
state = slave.poll( au16data, 9 );
if (state > 4) {
tempus = millis() + 50;
digitalWrite(13, HIGH);
}
if (millis() > tempus) digitalWrite(13, LOW );
// link the Arduino pins to the Modbus array
io_poll();
}
/**
* pin maping:
* 0 - digital input
* 1 - digital input
* 2 - digital output PWM
* 3 - digital output PWM
* 4 - digital output PWM
* 5 - digital output PWM
* 6 - digital output PWM
* 7 - digital output PWM
* 8 - digital output PWM
* 9 - digital output PWM
* 10 - digital output PWM
* 11 - digital output PWM
* 12 - digital output PWM
* 13 - digital output PWM
* 14 - digital input
* 15 - digital input
* 16 - digital input
* 17 - digital input
* 18 - digital input
* 19 - digital input
* 20 - digital input
* 21 - digital input
* A0 - analog input
* A1 - analog input
* A2 - analog input
* A3 - analog input
*
* pin 13 is reserved to show a successful query
*/
void io_setup() {
// define i/o
pinMode(0, INPUT);
pinMode(1, INPUT);
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(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
pinMode(19, INPUT);
pinMode(20, INPUT);
pinMode(21, INPUT);
digitalWrite(2, LOW );
digitalWrite(3, LOW );
digitalWrite(4, LOW );
digitalWrite(5, LOW );
digitalWrite(6, LOW );
digitalWrite(7, LOW );
digitalWrite(8, LOW );
digitalWrite(9, LOW );
digitalWrite(10, LOW );
digitalWrite(11, LOW );
digitalWrite(12, LOW );
digitalWrite(13, LOW );
}
/**
* Link between the Arduino pins and the Modbus array
*/
void io_poll() {
// get digital inputs -> au16data[0]
bitWrite( au16data[0], 0, digitalRead( 0 ));
bitWrite( au16data[0], 1, digitalRead( 1 ));
bitWrite( au16data[0], 2, digitalRead( 15 ));
bitWrite( au16data[0], 3, digitalRead( 16 ));
bitWrite( au16data[0], 4, digitalRead( 17 ));
bitWrite( au16data[0], 5, digitalRead( 18 ));
bitWrite( au16data[0], 6, digitalRead( 19 ));
bitWrite( au16data[0], 7, digitalRead( 20 ));
bitWrite( au16data[0], 8, digitalRead( 21 ));
// set digital outputs -> au16data[1]
digitalWrite( 2, bitRead( au16data[1], 0 ));
digitalWrite( 3, bitRead( au16data[1], 1 ));
digitalWrite( 4, bitRead( au16data[1], 2 ));
digitalWrite( 5, bitRead( au16data[1], 4 ));
digitalWrite( 6, bitRead( au16data[1], 5 ));
digitalWrite( 7, bitRead( au16data[1], 6 ));
digitalWrite( 8, bitRead( au16data[1], 7 ));
digitalWrite( 9, bitRead( au16data[1], 8 ));
digitalWrite( 10, bitRead( au16data[1], 9 ));
digitalWrite( 11, bitRead( au16data[1], 10 ));
digitalWrite( 12, bitRead( au16data[1], 11 ));
digitalWrite( 13, bitRead( au16data[1], 12 ));
// set analog outputs
// analogWrite( 10, au16data[2] );
// analogWrite( 11, au16data[3] );
// read analog inputs
au16data[4] = analogRead( 0 );
au16data[5] = analogRead( 1 );
au16data[6] = analogRead( 2 );
au16data[7] = analogRead( 3 );
// diagnose communication
au16data[8] = slave.getInCnt();
au16data[9] = slave.getOutCnt();
au16data[10] = slave.getErrCnt();
}
Gruß