Fórum témák

» Több friss téma
Fórum » DS18B20 hőmérő-szenzor
 
Témaindító: Korben, idő: Nov 16, 2005
Témakörök:
Lapozás: OK   23 / 39
(#) morzsa15 válasza Kovabe hozzászólására (») Nov 20, 2015 /
 
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
(#) edison14 válasza morzsa15 hozzászólására (») 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
(#) Kovabe válasza morzsa15 hozzászólására (») Nov 20, 2015 /
 
igen ez egy IC de ezzel külön tudod választani a kommunikációt.
(#) Kovidivi válasza morzsa15 hozzászólására (») Nov 20, 2015 /
 
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.
(#) morzsa15 válasza Kovidivi hozzászólására (») Nov 20, 2015 /
 
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?
(#) Kovidivi válasza morzsa15 hozzászólására (») Nov 20, 2015 /
 
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
(#) dB_Thunder hozzászólása Dec 2, 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!
(#) pont válasza dB_Thunder hozzászólására (») Dec 2, 2015 /
 
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?
(#) nemgyuri válasza dB_Thunder hozzászólására (») Dec 2, 2015 /
 
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.
(#) kissi válasza nemgyuri hozzászólására (») Dec 2, 2015 /
 
Idézet:
„(ezeket csak akkor tudod lekérdezni amikor csak 1 van a vonalon)”

Nem csak akkor lehet lekérdezni, csak úgy "macerásabb" !
(#) nemgyuri válasza kissi hozzászólására (») Dec 2, 2015 /
 
Az egyedi azonosító kódot le lehet kérdezni akkor is, ha több ds.. van 1 vonalon? Azt hogyan?
(#) kissi válasza nemgyuri hozzászólására (») Dec 2, 2015 /
 
Bővebben: Link 13. oldal, Search parancs !
(#) Hp41C válasza nemgyuri hozzászólására (») Dec 2, 2015 /
 
(#) nemgyuri válasza Hp41C hozzászólására (») Dec 2, 2015 /
 
"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
(#) pont válasza nemgyuri hozzászólására (») 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.
  1. 'A két ds ID'
  2. Dim Dsid1(8) As Byte
  3. Dim Dsid2(8) As Byte
  4.  
  5. Dsid1(1) = 1wsearchfirst()
  6. Dsid2(1) = 1wsearchnext()
  7.  
  8.  
  9. Do
  10. 1wreset
  11.  
  12. 'Indítja az AD convertálást'
  13. 1wwrite &HCC
  14. 1wwrite &H44
  15. Waitms 750
  16.  
  17. 1wreset
  18. 1wverify Dsid1(1)
  19. 1wwrite &HBE
  20. A = 1wread()
  21. B = 1wread()
  22. B = B * 256
  23. B = B + A
  24. B = B * 62.5
  25. E = B Mod 1000
  26. B = B / 1000
  27.  
  28.  
  29. 1wreset
  30. 1wverify Dsid2(1)
  31. 1wwrite &HBE
  32. C = 1wread()
  33. D = 1wread()
  34. D = D * 256
  35. D = D + C
  36. D = D * 62.5
  37. F = D Mod 1000
  38. D = D / 1000
(#) kissi válasza nemgyuri hozzászólására (») Dec 3, 2015 /
 
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 ?!
(#) kitartás válasza dB_Thunder hozzászólására (») Dec 3, 2015 /
 
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
(#) Mate78 válasza dB_Thunder hozzászólására (») 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?
(#) dB_Thunder válasza pont hozzászólására (») Dec 3, 2015 /
 
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.
(#) pont válasza dB_Thunder hozzászólására (») Dec 3, 2015 /
 
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.)

ds.JPG
    
(#) kissi válasza pont hozzászólására (») Dec 3, 2015 /
 
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 !
(#) pont válasza kissi hozzászólására (») Dec 3, 2015 /
 
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.

  1. Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
  2. 'Kontakt duszkowski(małpa)o2.pl
  3.  
  4.  
  5. $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
  6. $crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
  7. 'Deklaracja portów od wyświetlacza LCD
  8. Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
  9.  
  10. Config Lcd = 20 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
  11.  
  12. '*************************************WAŻNE**********************************************
  13. 'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
  14. Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20
  15.  
  16. Dim I1 As Integer , Ss As String * 6
  17. Dim I2 As Integer
  18. Dim I3 As Integer
  19. Dim I4 As Integer
  20. Dim I11 As Integer                                          ' przechowuje poprzednią wartoś temp
  21. Dim I22 As Integer                                          ' przechowuje poprzednią wartoś temp
  22. Dim I33 As Integer                                          ' przechowuje poprzednią wartoś temp
  23. Dim I44 As Integer                                          ' przechowuje poprzednią wartoś temp
  24.  
  25. Dim Dsid1(8) As Byte
  26. Dim Dsid2(8) As Byte
  27. Dim Dsid3(8) As Byte
  28. Dim Dsid4(8) As Byte
  29. Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
  30. Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
  31.  
  32. Deflcdchar 0 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32          'znak stopnia Celsjusza
  33. Deflcdchar 1 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32            ' strzałka góra
  34. Deflcdchar 2 , 32 , 4 , 4 , 4 , 21 , 14 , 4 , 32            ' strzałka dół
  35.  
  36.  
  37. Cursor Off                                                  'Wyłącza kursor
  38. Cls                                                         'Funkcja CLS czyści ekran
  39. Lcd "     Termometr      " ;                                'ekran startowy (pojawia się tylko podczas włączania urządzenia)
  40. Lowerline
  41. Lcd " by Duch 9.09.2007  "
  42. Wait 5
  43. Cls
  44. Lcd "  Upgrade 24.04.08  " ;
  45. Wait 3                                'ekran startowy (pojawia się tylko podczas włączania urządzenia)
  46. Cls
  47.  
  48. W = 1wirecount()
  49. Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
  50. Waitms 500
  51. Lcd W
  52. Wait 3
  53. Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
  54. Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
  55. Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
  56. Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
  57. Dsid4(1) = 1wsearchnext()
  58.  
  59. '*******************Odczyt numerów ID czujników temperatury*********************
  60.  
  61. If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
  62.  Locate 1 , 1
  63.  Lcd "CRC OK Czujnik 1 ID"
  64.  Wait 1
  65.  Locate 1 , 1
  66.  For B = 1 To 8
  67.  Lcd Hex(dsid1(b))
  68.  Next
  69. End If
  70. Wait 2
  71.  
  72. If Dsid2(8) = Crc8(dsid2(1) , 7) Then
  73.  Locate 2 , 1
  74.  Lcd "CRC OK Czujnik 2 ID"
  75.  Wait 1
  76.  Locate 2 , 1
  77.  For B = 1 To 8
  78.  Lcd Hex(dsid2(b))
  79.  Next
  80. End If
  81. Wait 2
  82.  
  83. If Dsid3(8) = Crc8(dsid3(1) , 7) Then
  84.  Locate 1 , 1
  85.  Lcd "CRC OK Czujnik 3 ID"
  86.  Wait 1
  87.  Locate 1 , 1
  88.  For B = 1 To 8
  89.  Lcd Hex(dsid3(b))
  90.  Next
  91. End If
  92. Wait 2
  93.  
  94. If Dsid4(8) = Crc8(dsid4(1) , 7) Then
  95.  Locate 2 , 1
  96.  Lcd "CRC OK Czujnik 4 ID"
  97.  Wait 1
  98.  Locate 2 , 1
  99.  For B = 1 To 8
  100.  Lcd Hex(dsid4(b))
  101.  Next
  102. End If
  103. Wait 2
  104. Cls
  105.  
  106. '*******************koniec odczytu ID czujników temperatury*********************
  107.  
  108. Do
  109.   1wreset
  110.   1wwrite &H55
  111.   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
  112.    1wwrite &HBE
  113.    I1 = 1wread(2)
  114. '---------------------------------
  115.   1wreset
  116.   1wwrite &H55
  117.   1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
  118.    1wwrite &HBE
  119.    I2 = 1wread(2)
  120. '---------------------------------
  121.   1wreset
  122.   1wwrite &H55
  123.   1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
  124.    1wwrite &HBE
  125.    I3 = 1wread(2)
  126. '---------------------------------
  127.   1wreset
  128.   1wwrite &H55
  129.   1wverify Dsid4(1)                                        'wysylam adres czwartego czujnika
  130.    1wwrite &HBE
  131.    I4 = 1wread(2)
  132. '--------konwersja temp dla wszystkich dsow
  133.   1wreset
  134.   1wwrite &HCC
  135.   1wwrite &H44
  136. Wait 1
  137.  
  138. '****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********
  139.  
  140.    I1 = I1 * 10
  141.    I1 = I1 / 16
  142.    If I1 >= I11 Then
  143.    I11 = I1
  144.    If I1 > 0 Then
  145.    Ss = Str(i1)
  146.    Ss = Format(ss , " 0.0")
  147.    Locate 1 , 1
  148.    Lcd "Zew" ; Ss ; Chr(0) ; Chr(1) ;
  149.    Else
  150.    Ss = Str(i1)
  151.    Ss = Format(ss , "0.0")
  152.    Locate 1 , 1
  153.    Lcd "Zew" ; Ss ; Chr(0) ; Chr(1) ;
  154.    End If
  155.    Else
  156.    I11 = I1
  157.    If I1 > 0 Then
  158.    Ss = Str(i1)
  159.    Ss = Format(ss , " 0.0")
  160.    Locate 1 , 1
  161.    Lcd "Zew" ; Ss ; Chr(0) ; Chr(2) ;
  162.    Else
  163.    Ss = Str(i1)
  164.    Ss = Format(ss , "0.0")
  165.    Locate 1 , 1
  166.    Lcd "Zew" ; Ss ; Chr(0) ; Chr(2) ;
  167.    End If
  168.    End If
  169.  
  170.  
  171.    I2 = I2 * 10
  172.    I2 = I2 / 16
  173.    If I2 >= I22 Then
  174.    I22 = I2
  175.    If I2 > 0 Then
  176.    Ss = Str(i2)
  177.    Ss = Format(ss , " 0.0")
  178.    Locate 2 , 1
  179.    Lcd "Lod" ; Ss ; Chr(0) ; Chr(1) ;
  180.    Else
  181.    Ss = Str(i2)
  182.    Ss = Format(ss , "0.0")
  183.    Locate 2 , 1
  184.    Lcd "Lod" ; Ss ; Chr(0) ; Chr(1) ;
  185.    End If
  186.    Else
  187.    I22 = I2
  188.    If I1 > 0 Then
  189.    Ss = Str(i2)
  190.    Ss = Format(ss , " 0.0")
  191.    Locate 2 , 1
  192.    Lcd "Lod" ; Ss ; Chr(0) ; Chr(2) ;
  193.    Else
  194.    Ss = Str(i2)
  195.    Ss = Format(ss , "0.0")
  196.    Locate 2 , 1
  197.    Lcd "Lod" ; Ss ; Chr(0) ; Chr(2) ;
  198.    End If
  199.    End If
  200.  
  201.  
  202.    I3 = I3 * 10
  203.    I3 = I3 / 16
  204.    If I3 >= I33 Then
  205.    I33 = I3
  206.    If I3 > 0 Then
  207.    Ss = Str(i3)
  208.    Ss = Format(ss , " 0.0")
  209.    Locate 1 , 11
  210.    Lcd "Wew" ; Ss ; Chr(0) ; Chr(1) ;
  211.    Else
  212.    Ss = Str(i3)
  213.    Ss = Format(ss , "0.0")
  214.    Locate 1 , 11
  215.    Lcd "Wew" ; Ss ; Chr(0) ; Chr(1) ;
  216.    End If
  217.    Else
  218.    I33 = I3
  219.    If I1 > 0 Then
  220.    Ss = Str(i3)
  221.    Ss = Format(ss , " 0.0")
  222.    Locate 1 , 11
  223.    Lcd "Wew" ; Ss ; Chr(0) ; Chr(2) ;
  224.    Else
  225.    Ss = Str(i3)
  226.    Ss = Format(ss , "0.0")
  227.    Locate 1 , 11
  228.    Lcd "Wew" ; Ss ; Chr(0) ; Chr(2) ;
  229.    End If
  230.    End If
  231.  
  232.  
  233.    I4 = I4 * 10
  234.    I4 = I4 / 16
  235.    If I4 >= I44 Then
  236.    I44 = I4
  237.    If I1 > 0 Then
  238.    Ss = Str(i4)
  239.    Ss = Format(ss , " 0.0")
  240.    Locate 2 , 11
  241.    Lcd "Pie" ; Ss ; Chr(0) ; Chr(1) ;
  242.    Else
  243.    Ss = Str(i4)
  244.    Ss = Format(ss , "0.0")
  245.    Locate 2 , 11
  246.    Lcd "Pie" ; Ss ; Chr(0) ; Chr(1) ;
  247.    End If
  248.    Else
  249.    I44 = I4
  250.    If I4 > 0 Then
  251.    Ss = Str(i4)
  252.    Ss = Format(ss , " 0.0")
  253.    Locate 2 , 11
  254.    Lcd "Pie" ; Ss ; Chr(0) ; Chr(2) ;
  255.    Else
  256.    Ss = Str(i4)
  257.    Ss = Format(ss , "0.0")
  258.    Locate 2 , 11
  259.    Lcd "Pie" ; Ss ; Chr(0) ; Chr(2) ;
  260.    End If
  261.    End If
  262.  
  263. Loop
  264.  
  265. 'Koniec programu
  266. 'Pozdrawiam Duch
A hozzászólás módosítva: Dec 3, 2015
(#) kissi válasza pont hozzászólására (») 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
(#) pont válasza kissi hozzászólására (») 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
(#) dB_Thunder válasza pont hozzászólására (») 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
(#) pont válasza dB_Thunder hozzászólására (») Dec 3, 2015 /
 
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ő.
(#) dB_Thunder válasza pont hozzászólására (») Dec 3, 2015 /
 
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:

omronin.jpg
    
(#) dB_Thunder válasza dB_Thunder hozzászólására (») Dec 3, 2015 /
 
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.
(#) pont válasza (Felhasználó 15355) hozzászólására (») Dec 4, 2015 /
 
É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
(#) dB_Thunder válasza (Felhasználó 15355) hozzászólására (») Dec 4, 2015 /
 
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.
Következő: »»   23 / 39
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem