Arduino UNO "MODBUS"

Měřáky, automatizační technika, regulační technika

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
radekzela
Příspěvky: 13
Registrován: 23 říj 2016, 00:00

#16 Příspěvek od radekzela »

Já tu mám také ještě na někoho prosbu s kódem.

Mám tu kód na měření výšky hladiny v nádrži a čtu tyto data PLCčkem (master) a potřebuji upravit tento kód aby arduino UNO (slave) bylo připojitelné pro 4 kusy čidla teploty DS1820 a každé čidlo se připojovalo na jiný pin z důvodu aby se při výměně nemuselo znovu adresovat. a teplota se zapisovala (pouze jedno desetiné místo) do registru 40010, 40011, 40012, 40013 v celých číslech ta se následně bude přepočítávat v PLCčku :-) Děkuji za pomoc


Kód: Vybrat vše

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

//Setup the brewtrollers register bank
//All of the data accumulated will be stored here
modbusDevice regBank;
//Create the modbus slave protocol handler
modbusSlave slave;

#define RS485TxEnablePin 10
#define RS485Baud 9600
#define RS485Format SERIAL_8N1

//deklarování pinů relé karty
//int rele1 = 4;
//int rele2 = 5;
//int rele3 = 6;
//int rele4 = 7;
//int rele5 = 8;
//int rele6 = 9;
//int rele7 = 10;
//int rele8 = 11;

int ECHO = 11; // Echo pin z HC-SC04 na pinu 2
int TRIG = 12; // Trig pin z HC-SC04 na pin 3

void setup() {

//Assign the modbus device ID.
regBank.setId(1);

//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(40001); //regist pro teplotni senzor A0
// regBank.add(40002); //regist pro teplotni senzor A1
regBank.add(40003); //registr pro data z ultrazvuku

slave._device = &regBank;

//inicializace sériového portu s rychlostí 9600
slave.setBaud(&Serial, RS485Baud, RS485Format, RS485TxEnablePin);

//pinMode(rele1, OUTPUT);
//pinMode(rele2, OUTPUT);
//pinMode(rele3, OUTPUT);
//pinMode(rele4, OUTPUT);
//pinMode(rele5, OUTPUT);
//pinMode(rele6, OUTPUT);
//pinMode(rele7, OUTPUT);
//pinMode(rele8, OUTPUT);

//Nastaví pin 11 jako vstupní
pinMode(ECHO, INPUT);
//Nastaví pin 12 jako výstupní
pinMode(TRIG, OUTPUT);
}

void loop() {

{
//zapnutí a vypnutí relé
//digitalWrite(rele1, regBank.get(1));
//digitalWrite(rele2, regBank.get(2));
//digitalWrite(rele3, regBank.get(3));
//digitalWrite(rele4, regBank.get(4));
//digitalWrite(rele5, regBank.get(5));
//digitalWrite(rele6, regBank.get(6));
//digitalWrite(rele7, regBank.get(7));
//digitalWrite(rele8, regBank.get(8));

slave.run();
}

//HCSR-04
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);

// Spočítá vzdálenost
float distance = pulseIn(ECHO, HIGH);
distance = distance * 0.017315f;
int vzdalenost = (distance * 10) + 0.5;

regBank.set(40003, (word) vzdalenost); //vzdálenost od 0 do 1000, 1mm = 1, 1000mm = 1000

// Spocita teplotu z cidla A0
// int sensorValue = analogRead(A0);
// float volt = (sensorValue/1020.0) * 5.0; //Volts
// float tempC = (volt -0.5) * 1000; //Celcius
// regBank.set(40001, (word) tempC);

// Spocita teplotu z cidla A1
// int sensorValue1 = analogRead(A1);
// float volt1 = (sensorValue1/1020.0) * 5.0; //Volts
// float tempC1 = (volt1 -0.5) * 1000; //Celcius
// regBank.set(40002, (word) tempC1);

slave.run();
}
Odpovědět

Zpět na „Měření, regulace a automatizace“