Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino UNO "MODBUS"
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Měření, regulace a automatizace
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: ne říjen 23 2016, 20:09    Předmět: Arduino UNO "MODBUS" Citovat

Přátelé potřebuji radu.
Ano nehodí se to jako průmyslové využití ale to teď neřešme.
Jedná se mi o to. Potřebuji rozjed HMI panel a arduino po rs485 s protokolem modbus rtu. drtím se stím už tři dny ale arduino vůbec neumím.
Pevodník který chci použít je MAX485
http://arduino-shop.cz/arduino/985-prevodnik-ttl-na-rs-485-1427700037.html

V arduinu budou registry na 8 relatek 1,2,3,4,5,6,7,8
Dále regist pro 4 digitalní vstupy 10001,10002,10003,10004
Dále tam potřebuji registr 2 analogove vstupy 30001,30002
A naposled regist 40001 na ultrazvukový senzor.

Už jsme daly dohromady kód který funguje skvěle přes USB v arduinu a simulatorem HMI panelu.
Takto nám to funguje na simulatoru uplně dokonale.
https://www.youtube.com/watch?v=RVCe_gXpAxI

Na převodníku to ale nefunguje vůbec je to asi tím že nemáme definovaný pin na arduinu který se stará o přepínání odesílání a přijímání paketů.
https://www.youtube.com/watch?v=JWPuOrG4poQ


Dokonce když propojím HMI s arduinem přes převodník tak se nic neděje data prolezou ale jen chvilkově když do toho zapnu simulator v PC-arduino ale HMI-arduino se neustale odpojuje a připojuje to není to správné řešení.

Proto žádám někoho o pomoc zda by dokázal v kódu který je níže ošetřit tu komunikaci pomocí RS485 HALF-DUPLEX (převodník MAX485)

Použité knihovny: https://code.google.com/archive/p/arduino-modbus-slave/downloads


kód:

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

//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 = 12; // Echo pin z HC-SC04 na pinu 2
int TRIG = 13; // Trig pin z HC-SC04 na pin 3

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

void setup(){   

  Serial.begin(9600);

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

  slave._device = &regBank; 

  //inicializace sériového portu s rychlostí 9600
  slave.setBaud(9600);
 
  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 12 jako vstupní
  pinMode(ECHO, INPUT);
  //Nastaví pin 13 jako výstupní
  pinMode(TRIG, OUTPUT);
}

void loop(){
 
  unsigned long cas = millis();
  while(millis() - cas < 100){
    //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 * 100) + 0.5;
  if(vzdalenost > 40000) vzdalenost = 40000;
   
  regBank.set(40020, (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) * 10000; //Celcius
  regBank.set(30001, (word) tempC);

    // Spocita teplotu z cidla A1
  int sensorValue1 = analogRead(A1);
  float volt1 = (sensorValue1/1020.0) * 5.0; //Volts
  float tempC1 = (volt1 -0.5) * 10000; //Celcius
  regBank.set(30002, (word) tempC1);
   
  slave.run(); 
}
[url][/url]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3292

PříspěvekZaslal: ne říjen 23 2016, 20:59    Předmět: Citovat

když vysílá, musí být na převodníku DE na HIGH, když přijímá, musí být RE na LOW.
Proto je propoj dohromady a ovládej nějakým Dig. výstupem...

Ale hlavně nikde nevidím zachytávání nějakých přijatých dat na Rx portu nebo alespoň SoftwareSerial Rx portu ?
Leda, že by se o to starala nějaká z knihoven...

Tak to pro začátek nastav "natvrdo" jen na příjem napřímo připojením RE na GND a vyzkoušej to...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: ne říjen 23 2016, 21:13    Předmět: Citovat

Děkuji za tvůj příspěvek.
Arduino je u mě kámen úrazu. Vůbec ho neumím Smile
Pokud by zde byla dobrá duše která by mě zaslala upravený kod nebo knihovnu s kterým by to fungovalo na TX i na RX s tim automatickým přepínání a zapojením na piny, spadl by mi kámen ze srdce Smile

Opravdu je potřeba jen těch pár relátek a zachování toho ultrazvuku.

Poznámka: S arduinem jsem přišel do kontaktu teprve tento týden Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3292

PříspěvekZaslal: ne říjen 23 2016, 21:26    Předmět: Citovat

A že máš v prvním videu MEGA a ve druhém UNO?

Já bych nejprve hardwarově nastavil pouze příjem ze 485 a zkusil bych, zda to šlape. A hlavně to dal na jiné piny než 0 a 1, kde běhá UPLOAD.

Pak by se vidělo.

Taky je možné, že má arduino průběžně odpovídat, že je přítomno, pak hardwarový pevně nastavený příjem nepomůže a nezbyde než rozpitvat knihovnu, kde se komunikace ztrácí...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: ne říjen 23 2016, 21:40    Předmět: Citovat

To s tím příjmem jsem již zkošel ale HMI musí dostávat odpoveď od arduina aby vůbec zobrazilo ovladací prvky (tlačítka, hodnoty na displeji apod.)
Ty desky mám dvě objednal jsem si obě od číňana společně s těmi převodníky senzory vzdalenosti apod. Ještě mám na cestě ty usb/485 převodníky. S těmi bude možná lepší práce zjistit jak to funkuje. Teď nemám jak dostat 485ku do PC.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: ne říjen 23 2016, 21:47    Předmět: Citovat

Myslíte že by mohlo fungovat když do kódu přidám jen toto ale nevím jek to dopadne.

kód:
#define RS485TxEnablePin 2
#define RS485Baud 9600
#define RS485Format SERIAL_8N1
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3292

PříspěvekZaslal: ne říjen 23 2016, 21:51    Předmět: Citovat

A z jakých stránek máš ten odkaz na knihovny?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: ne říjen 23 2016, 21:55    Předmět: Citovat

Našel jsem nějaké příklady ZDE:https://program-plc.blogspot.cz/2015/11/plc-modbus-master-arduino-modbus-slave.html
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3292

PříspěvekZaslal: ne říjen 23 2016, 22:06    Předmět: Citovat

radekzela napsal(a):
Myslíte že by mohlo fungovat když do kódu přidám jen toto ale nevím jek to dopadne.

kód:
#define RS485TxEnablePin 2
#define RS485Baud 9600
#define RS485Format SERIAL_8N1


Zkus to, ale ještě změň a doplň řádek v programu na
citace:
slave.setBaud(&Serial,RS485Baud,RS485Format,RS485TxEnablePin);

Pak by mělo být řízení vyvedeno na PIN 2

A hlavně musíš použít knihovnu v tomto novém odkazu, protože tam je to ovládání zapracované v souboru modbusSlave.cpp
V tom odkaze na začátku vlákna je sice taky tento soubor, ale řízení není podporováno...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: ne říjen 23 2016, 22:59    Předmět: Citovat

Tak to zabralo už to vypadá že data lezou obousměrně ale je to nějaké zasekané relé mi vybaví až když kliknu třeba 10x na tlačítko na HMI panelu.

Pozoruju na udajich z ultrazvukoveho senzoru že se vždy komunikace rojede rychleji hodnoty vzdalenosti se mění dobře. Natočím video co to dělá.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: po říjen 24 2016, 0:27    Předmět: Citovat

Tak zde je to video jak jsem psal. Projevuje se tam nějaké zpoždění Sad
https://www.youtube.com/watch?v=JO98SEikCAc

Ale data chodí ve správném formátu testoval jsem to ještě na teploty a vlhkost na senzou DHT11 a všechna data byla v pořádku.

A ještě jeden poznatek když mám na HMI jen jedno tlačítko na relé bez žádných jiných ovládacích nebo zobrazovacích prvků tak zpoždění je cca 1 sek. .

Zajímavé.

Testováno na tomto kódu:

kód:
#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 2
#define RS485Baud 19200
#define RS485Format SERIAL_8E1


//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 = 12; // Echo pin z HC-SC04 na pinu 2
int TRIG = 13; // 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(30001);   //regist pro teplotni senzor A0
  regBank.add(30002);   //regist pro teplotni senzor A1
  regBank.add(40020);   //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 12 jako vstupní
  pinMode(ECHO, INPUT);
  //Nastaví pin 13 jako výstupní
  pinMode(TRIG, OUTPUT);
}

void loop(){
 
  unsigned long cas = millis();
  while(millis() - cas < 50){
    //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 * 100) + 0.5;
  if(vzdalenost > 40000) vzdalenost = 40000;
   
  regBank.set(40020, (word) vzdalenost); //vzdálenost od 0 do 1000, 1mm = 1, 1000mm = 1000


   
  slave.run(); 
}



nastavení COM portu.JPG
 Komentář:
Nastavení COM portu

Stáhnout
 Soubor:  nastavení COM portu.JPG
 Velikost:  252 kB
 Staženo:  704 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: po říjen 24 2016, 21:04    Předmět: Citovat

Tak problém byl vyřešen Smile
Změnilo se zadání adres registrů v HMI panelu a komunikace se ihned rozjela na výbornou.
Původně bylo zadáno pro digitální výstup1 - 0x1 změněno na 0x0001 a ejhle rozjelo se to.

Všem zůčastněným jak na Facebooku tak zde na fóru mockrát děkuji.
A pokusím se to dát nějak smysluplně dohromady kdyby se s tím chtěl taky někdo ještě potrápit.
Teď uvidíme jak se to bude chovat až jich pověsím 20 na linku Smile
Ale to až zítra dnes už stačilo.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3292

PříspěvekZaslal: út říjen 25 2016, 4:31    Předmět: Citovat

No tak sláva! Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
wares



Založen: Jun 08, 2017
Příspěvky: 1

PříspěvekZaslal: čt červen 08 2017, 10:02    Předmět: Citovat

Zdravím mám podobný problé nevedel by mi niekto pomocť z nastavením hmi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radekzela



Založen: Oct 23, 2016
Příspěvky: 13

PříspěvekZaslal: út červenec 25 2017, 18:02    Předmět: Citovat

wares:
Dobrý den právě jsem Vám napsal.
Nahrajte sem fotky jaké máte HMU jak v něm zadáváte hodnoty a jaký požíváte kód.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Měření, regulace a automatizace Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.17 sekund