Fórum témák
» Több friss téma |
De ez egy külön ic nem? Vagy hogy gondoltad mert ezt most nem értem. :S
A hozzászólás módosítva: Nov 20, 2015
Az egy IC aminek a segítségével le tudod választani a másik szenzort míg az egyikkel dolgozol. De az IC vezérléséhez megint kell használnod két lábat ami már három láb. Én azt javaslom hogy használj két külön lábat a hőszenzorok vezérléséhez és kész. Az a legegyszerűbb megoldás.
A hozzászólás módosítva: Nov 20, 2015
igen ez egy IC de ezzel külön tudod választani a kommunikációt.
Egy ötlet: figyeld a DS18b20 adat lábát, ha elkezdődik az adás, akkor várj pár mp-et, és utána kérdezd le a második mikrovezérlővel a hőmérsékletet. Az első AVR pedig mondjuk 10mp-ként mér, és mindig ezután jön a második eszközöd. Vagy: mivel már meg van az aktuális hőmérséklet a DS18b20-ban, nem is kell már konverzió parancsot kiadnod, és 750mS-ot várnod, egyszerűen lekéred az adatokat.
Igen az lenne nekem is a legjobb csak fogalmam sincs hogyan lehetne ezt megvalósítani úgy lenne nekem az ideális hogy a pic kérdezi az adatokat arduinoval megy akkor figyelni csak fogalmam sincs hogy ezt hogyan lehetne c szavakba önteni. Esetleg abban tudnál segíteni?
Hát pl. ha megnézed az adatlapját, akkor látod, hogy van egy normál állapot (+5V szint), amikor nincs semmi kommunikáció, egyszerűen csak létezik a DS18b20. Ezután van egy Reset impulzus, a 480uS-ig tart (0V), ilyenkor az adat vonal az előző nyugalmi állapotból átvált GND-re. Neked ezt kell figyelni. Innentől vársz pár mp-et (addig a mester befejezi a kommunikációt biztosan), és indíthatod a hőmérséklet lekérést a slave-ről, vagy akár teljes kommunikációt, a mestert pedig megbízod, hogy pl. 10 mp-nél sűrűbben sose kérje le a hőmérsékletet. Így be vannak ütemezve egymás után, a mester szabja meg, hogy milyen sűrűséggel.
A hozzászólás módosítva: Nov 20, 2015
Kedves Fórum Tagok!
Előre leszögezném, hogy még mindig hülye vagyok a C-ben programozáshoz, mint tyúk az űrhajózáshoz! A projekt a következő: több (minimum 3db) ds18b20 illesztése egy (omron) PLC egyetlen natúr digitális bemenetéhez. Ehhez interfésznek használnék egy AtTiny-t lehetőleg a 45öst, ha belefér a kód. Feladata lenne bekérni az adatokat a DS-ektők, majd "elmorzézni" azt a PLC-nek. A plc oldali programot már megírtam, legalábbis azt a részét, ami veszi az adatokat, és szavakba rendezi. Jelen pillanat kevésnek érzem magam, főleg idővel hogy átrágjam magam a DS kezelésén. Pont elég lesz kiszenvednem a plc kommunikációt. Fontos lenne az is hogy egyszerűen lehessen szenzort cserélni, illetve a sorrendjük ne keveredjen. Ehhez kérnék segítséget, könyvtárt, ötleteket!
Azt az "elmorzézni"-t, hogy gondolod. Ki vezérli a kommunikációt, hány szálon, a plc hogy különbözteti meg mikor melyik ds adatát kapja?
Szia! C-ben programozáshoz nem tudok segíteni. A DS-eket kükün-külün le tudod kérdezni. Feltételek: Minden szenzornak van saját azonosító kódja. (ezeket csak akkor tudod lekérdezni amikor csak 1 van a vonalon) Kiküldheted a mérés parancsot mindegyiknek egyszerre, de a lekérdezés csak külön-külön a példány azonosító kódjával lehetséges. Ez arra az esetre igaz, ha párhuzamosítva vannak a DS18B20-ak. A párhuzamosításnak korlátai vannak, pdf-ben megtalálod.
Másik módszer, hogy minden szenzort külön lábra kötöd. Ha van elég szabad láb ez a legegyszerübb. Idézet: „(ezeket csak akkor tudod lekérdezni amikor csak 1 van a vonalon)” Nem csak akkor lehet lekérdezni, csak úgy "macerásabb" !
Az egyedi azonosító kódot le lehet kérdezni akkor is, ha több ds.. van 1 vonalon? Azt hogyan?
Bővebben: Link 13. oldal, Search parancs !
"kissi" és "Hp41C" Jól értelmezem, hogy az összes lehetséges kóddal lekérdezem, majd ha van válasz tudom, hogy van ott valaki? (ha így van honnan tudom, hogy a 3 közül melyik melyik? - jó tudom, mindegyiket különböző hőmérsékletűre kell melegíteni)
A hozzászólás módosítva: Dec 2, 2015
Először le lehet kérdezni hány ds van a vonalon, mert ezt tudni kell. Utána le kell kérdezni az azonosítókat, eltárolni egy tömbben, ezután már azzal lehet megszólítani őket.Bascomban ez így néz ki.
Nem ! A mester lekérdezi az első bitet. Az eszköz(ök) visszaadják az 1 bitjüket, majd annak a negáltját. Ha több eszköz is van a vonalon, akkor 2 eset lehetséges: vagy megegyezik az adott bitpozíciójuk vagy nem! Ha igen, akkor a mester ( és az eszközök!) az adott bitpozícióban 0-t és 1-t is adnak és látnak, ha nem, akkor bár mind a kettőt adják, csak 0-t látnak (az az elnyomó szint!) ! Ezután a mester kiadja, hogy milyen szintű bit azonosítóval akar foglalkozni a továbbiakban ezen a helyiértéken ( miközben megjegyezte, hogy itt ütközés van!), és úgy nézi tovább a biteket. Ha végzett egy azonosítóval és még volt ütközés valahol, akkor újra végigmegy és az adott helyen a másikat válassza, így tudja feltérképezni az összes eszközt, anélkül, hogy a 64 bites kombinációt végigpróbálná!
példa (nem akarom mind a 64 bitet leírni, ezért csak az utolsó 5-t írom ! ): azonosító_1: ...XXX10011 azonosító_2: ...XXX00010 azonosító_3: ...XXX00110 Master Bit0 lekérdezése--> 0 (a 0-k elnyomják az 1-et!), a bit inverze 0 ( mert az 1-es azonosító inverze /0/ elnyomta a többiek inverz 1-esét!). Ebből a kontroller tudja, hogy több, eltérő bit című eszköz van ebben a pozícióban, ezért választja pl. a 0-t ( Master TX Bit0 =0!) és megjegyzi, hogy itt még vannak eszközök! Ezután az 1-es eszköz már nem vesz részt a játékban, mert az ő címének ebben a pozíciójában nem 0 áll, abbahagyja a címének a megadását és várja a RESET-et ! A master adja a következő órajelet, ezért az aktív eszközök kiadják a Bit1-et--> 1, majd az inverzét -->0 . A vonalon megjelenik ténylegesen 1 majd 0, azaz ebben a pozícióban nincs ütközés, a master megerősíti, hogy az ebben a pozícióban 1-es értékű eszközök mehetnek tovább, azaz mind a kettő ( a 2-es és 3-as aktív marad!)! A master adja a következő órajelet, ezért az aktív eszközök kiadják a Bit2-t --> mivel ütközés van, ezért a vonalon 0, majd inverzként újra 0 jelenik meg! A mester ezért megjegyzi, hogy az adott pozícióban is ütközés van, majd kiadja megerősítésként pl. a 0-t ( Master TX Bit2 =0!), ezért a 3-as eszköz sem vesz részt tovább a játékban, már csak a 2-es marad aktív! Így a további bitek és inverzeik kiadásánál mindig megjelenik egy 0 és egy 1, ebből tudja a proci, hogy már nincs több ütközés és megismeri a 2-es azonosítójú eszköz összes bitjét! Ezután újra elkezdi az azonosítási procedúrát a Bit0-val, de egy-egy ütközési pontban most a másik irányt (másik bitet !) választja és úgy megy végig, így megismeri az összes eszköz címét! Azaz a második lekérdezésnél a Master TX Bit2 =1!, így most megismeri a 3-as azonosítójú eszköz címét. Ezután a harmadik ütközési pozícióban is más értéket választ a 3-ik lekérdezésnél (Master TX Bit0 =1!), így megtudja az 1-es eszköz címét is! Mivel több pozícióban nem észlelt ütközést, ezért nem keres tovább, azaz 3 lekérdezésből fogja tudni az összes címet, nem kell a sok millió lehetőséget végigpróbálnia! Mivel az azonosítóikat kérdezed le (azaz, hogy kik vannak a vonalon!), így nem kell külön hőmérsékletűre melegítened ( az majd akkor jön, ha nem tudod, hogy melyiket hova raktad ! )! Remélem érthető voltam és nem tévesztettem el ilyen későn v. korán ?!
Leg egyszerűbb, ha minden szenzort külön lábra kötsz. Nem kell foglalkozni az egyedi azonosítókkal, kedvedre cserélgetheted a ds eket, a sorrend sem keveredik. Persze nem a legszebb megoldás és csak akkor működik, ha van elég láb erre a célra. Nekem a mikropascal és a mikroc függvényei teljesen jól működnek. (igaz a pic nem is nagyon csinál mást, mint a bemeneteket faggatja) Szerintem AtTiny- hez is működhet.
A hozzászólás módosítva: Dec 3, 2015
Szia,
C programot leírást, példákat, library-kat találsz a neten. Nem írtad milyen fordítóval dolgozol. Milyen gyors az a PLC program? Milyen időközönként tudja lekérdezni azt a digitális bemenetet?
Igen a plc kommunikációt nem részleteztem, de akkor megteszem!
Egyetlen szálon megy, ezért itt is fontosak az időzítések, itt a plc a slave, és csak egyirányú a kommunikáció. Az adatvonal (a mostani időket mondom, de ha lehet ezeket csökkentei akarom hogy gyorsuljon a komm.) 2másodpercig tartó felhúzásával indul a kommunikáció, amíg ez nincsen meg nem foglalkozik a bejövő jelekkel a plc. A túl hosszú magas(3,5s) ill. alacsony (2,5s) jel esetén a plc kilép az adatfogadásból, kommunikációs hibát ad. Tehát a 2s hosszú start jel után 1 másodpercen belül, kell jönnie az impulzusoknak, mert az 1s alacsony szint a szünet jel ilyenkor "szót" vált, tehát másik memória területre ment. (Ebből adódik hogy az első szót ki tudja hagyni a kommunikáció, de másodikat már nem, mert kiáll hibára). Az információt az impulzus hossza határozza meg, ha 0,2s.nél rövidebb (jellemzően 0,1s) akkor 0, ha hosszabb (0,3s) akkor 1. Az impulzusok közti szünet minimum 0,1s lehet, maximum pedig 1s, ami szünet jel. Az plc 16bites szószervezésű, a programja a szünet jel nélkül is szavakba rendezi az adatokat, a szünet jellel csupán a 16 bitnél rövidebb adatok elküldése van egyszerűsítve, nem kell végigírni a szót. Jelen pillanatban 3 szónyi adatot fogad max a plc. A 4. már felülírja az elsőt automatikusan, de ez szinte a végtelenségig kitolható. A plc-ben a szavak feltöltése a 0. bittel kezdődik. Hibajavítás, figyelés nincs, de később szeretnék legalább egy paritás bitet. Ez a kommunikáció csak azért született meg, hogy kiváltsak drága plc hardverelemeket, mint Pl. soros port, vagy analóg vonalon maradva, PT100, távadó, analóg bemenet/bővítő modul. nemgyuri ! Az alap gondolatom az, hogy nem akarok foglalkozni a példány azonosítással, mert akkor a csere macerásabb a kiköt-beköt verziónál. Mivel a DS képes táplálkozni az adat vonalból is, így azokat kell külön avr bemenetekre tennem. AtTiny45-nél elvileg 4 lábat tudok a szenzorokra szánni, ami mind lehet adat bemenet, így a 4 szenzor is lehetséges. Találtam egy egyszerű kódot ami polling módban kommunikál a szenzorokkal, az adat továbítás pedig uart-on megy.
Ha már így benne vagy biztos nem fogsz rajta változtatni, és nem írtad hány biten akarod a hőmérséklet értéket küldeni, de ez így nagyon lassú, ennél még az is gyorsabb ha egyszerűen a kiszámolt hőmérséklettel (Pl. 122.15 ) azonos impulzust küldesz tehát Pl. 20kHz. küldve 12215 impulzust, az nincs egy mp. ( az esetleges hiba, csak századnyi lehet), persze így a resethez kell még egy láb. Két éve működik nálam ilyen kommunikáció PLC és mikrovezérlő közt. Ha van még egy láb akkor A SPI elvű (LOAD, CLOCK,DATA) kommunikációval még gyorsabban lehet adatot cserélni.
Mint ahogy a fentebbi programrészletből is látszik, az azonosításos megoldásnál sincs probléma a cserekor, mert minden bekapcsoláskor beazonosítja a vonalon lévő DS-eket, tehát nyugodtan mehet egy vonalon száz ds is, erre találták ki. Nem tudom milyen messze lennének egymástól, Inkább a kontroller és PLC közti szakasz legyen rövidebb (bár szintillesztéssel (én optoval csináltam/nám) együtt lehet jelformálást is beletenni, ), a ds-ek lehetnek 10m körül a mikrovezérlőtől. Idézet: „Ez a kommunikáció csak azért született meg, hogy kiváltsak drága plc hardverelemeket, mint Pl. soros port, vagy analóg vonalon maradva, PT100, távadó, analóg bemenet/bővítő modul.” Most építettem ds-analóg átalakítókat, mcp41010 es digitális potméterrel attiny25-el, így kb 1500 Ft-ból megvan, persze a poti 8 bites felbontása miatt ez csak 8 bites, (de léteznek nagyobb felbontású potik.) Idézet: „Mint ahogy a fentebbi programrészletből is látszik, az azonosításos megoldásnál sincs probléma a cserekor, mert minden bekapcsoláskor beazonosítja a vonalon lévő DS-eket, tehát nyugodtan mehet egy vonalon száz ds is, erre találták ki.” Az lehet, hogy beazonosítja, de nem tudod, hogy hova került ! Ha egy DS-t kell cserélni, akkor OK, de ha többet, akkor már automatikusan nem lehet beírni az új címeket a régiek helyett !
Dehogynem. Annyi tömböt kell definiálni ahány ds van.
Dim Dsid1(8) As Byte Dim Dsid2(8) As Byte Dim Dsid3(8) As Byte stb... sorra lekérdezni az összes azonosítót Dsid1(1) = 1wsearchfirst() Dsid2(1) = 1wsearchnext() Dsid3(1) = 1wsearchnext() stb... És utána mindig az azonosítóján megszólítani. 1wverify Dsid1(1) 1wverify Dsid2(1) 1wverify Dsid3(1) stb... Itt egy komplett program 4 ds-re, ebben a 48. sorban az is benne van hogy megszámolja hány ds van a vonalon.
A hozzászólás módosítva: Dec 3, 2015
Ez OK, ilyet már én is használtam ! Mit csinálsz, ha elromlik az 1-es és a 2-es eszközöd, hogyan cseréled ki, ill. a csere után honnan tudod, hogy melyik honnan küldi a hőmérséklet adatot ( ha a programba nem nyúlsz bele!)?! Nem csak az a lényeg, hogy 4 adatot kapjak, azt is tudnom kell, hogy melyiket hol mértem !
szerk.: Így csak arra jó, ha egy helyen mérsz 4 hőmérsékletet és pl. átlagolod a "tuti" miatt ! A hozzászólás módosítva: Dec 3, 2015
Szóval az a gond, hogy egy csere után a sorrend felborulhat, ebben igazad van, de a cserét sem kell a háziasszonyra bízni( bár ki tudja) tehát az első bekapcsolás után helyre lehet tenni a dolgokat. A DsidX-eket, még mindig könnyebb átírni mint a fixre beírt azonosítókat. Nem tudom milyen gyakori a ds meghibásodás. Csak ezért, én nem használnék külön portlábakat.
A hozzászólás módosítva: Dec 3, 2015
Először is mindenkinek köszönöm a válaszát !
Mindenképp 12bites felbontás kell, ha már tudja a DS. Azon én is elgondolkoztam hogy már a Celsius-ba átszámolt értéket küldeném, de az már előjeles, akkor végig kell(ene) írni a szót, vagy további számolás kell a plc oldalon. Ezt még megszülöm. Igazából a felhasználási terület (épületgépészet) nem követeli meg a gyors adatcserét, a akár percenkénti frissülés is belefér bőven. A plc IO pontok drágák ezért nem akarom elpazarolni őket, 4 hőmérő megesz egy plc inputot, az még elfogatható, és a kommunikáció sebessége kielégítő. Persze kontroller cserével lehetne növelni a egy plc bemenetre kötött hőmérők számát, de akkor csökken a frissítési sebesség. Az is biztos már, hogy minden DS külön avr bemenetre teszem, és nem foglalkozom az egyed azonosítókkal. Így egy mezítlábas villanyszerelő is tud gyorsan szenzort cserélni, vagy összerakni a rendszert. Érdekes a te megoldásod is! A reset jelet valahogy bele kellene dugni az adat jelbe, pl úgy ahogy én csináltam a start és a szünet jelet. Ehhez a 20kHz-es jelhez kell gyors számláló bemenet, vagy egy sima is megteszi?? Igazából fogalmam sincs mekkora lehet az a frekvencia amit még egy sima plc input megesz, mert még nem jártam utána. Illetve a kódom mostani időzítései úgy vannak kitalálva, hogy kézzel nyomógombbal is bevihető az adat, tesztelés miatt. Nyilván a bemenet többet bír, de én már nem
Nálam a -55 = 0db.-jel, a +127 = 183db.-jel, de mivel a ds (számomra érthetetlen módon) a 0-át veszi 0-ának így nekem is három féleképpen kell számolnom az AVR-el, a PLC csak eltolja -55-el. Viszont, ha Te úgyis a "szavak" közti szünettel operálsz, akkor simán el lehetne küldeni minden ds alsó és felső byte-ját. Tehát mondjuk egy vezetéken:
-2mp jel, -0-255 impulzus 20Khz-en az első ds alsó byte-ja -1mp jel -0-255 impulzus 20Khz-en az első ds felső byte-ja -1mp jel stb... Én csak APB mini plc-kkel foglakozom (meg LOGO) ezeknél a I07 és Az I08 a gyorsszámláló bemenet, a többin van 50ns szűrő.
Nálam egy szó 16bit...nem 8.
Ha már így darabolunk akkor érdemes lenne digitenként, mert annak mozgatására van külön utasítás Omronéknál. Meg kell néznem és nemcsak átfutni hogy adja az adatot mert hirtelen nem tudom melyik bit az előjel. Milyen áron mennek ezek a kis APB-k? Én még Unitronics-ban gondolkodtam Ja szűrők, ilyen beállítás van a normál bemenetekre:
Számolgattam: ezzel az alapbeállítás 8ms szűrővel szerintem tudnék menni 100ms/ bit sebességgel, azaz egy 16 bites szó 2 másodperc alatt menne át, szünetjellel. A 4 szenzor jele pedig 10 másodperc alatt.
A te kommunikációddal 10kHz jellel, ha kb. jól számoltam belefér a 0.1 másodpercbe egy szenzor, digitenkénti szünet jellel. De jó lenne ha magától váltana digitet. Viszont gyors számláló bemenet kell, amit még nem használtam, meg lehet hogy kell még láb a kommunikációhoz.....hmmm nemtudom. Rágódom, ha nem kell(lene) másik láb, akkor érdemes volna használni.
Én annyira szeretnék rs485-ön kommunikálni a PLC-mmel, csak kevés a tudásom hozzá, felvilágosíthatnál. Ha például a PLC 0X18052 memóriacímére szeretnék írni mit küldjek UART-on?l
Omronéknál a soros port feláras extra! Ezért kihagynám!
Illetve ha jól tudom a HMI Hostlink protokollal megy, amit még nem tanulmányoztam, de nem hinném hogy több eszközt is támogatna a vonalon. |
Bejelentkezés
Hirdetés |