Keresés

Hirdetés

Új hozzászólás Aktív témák

  • Szirty

    őstag

    válasz cooldmann #750 üzenetére

    Hali cooldmann!

    "A valós idejű ora irása és olvasása számomra érthetetlen."

    Nem dolgozok 200-assal, de az óra olvasására a READ_RTC az óra beállítására a SET_RTC hívás való.

    Egy paramétert (címet kell neki megadni)
    "The Read Real-Time Clock (TODR) instruction reads the current time and date from the hardware clock and loads it in an 8-byte Time buffer starting at address T.The Set Real-Time Clock (TODW) instruction writes the current time and date to the hardware clock beginning at the 8-byte Time buffer address specified by T."

    Pár fontos momentum a dologgal kapcsolatban.
    - Az időt 8 bte-ban adja vissza illetve 8 bíte-ban kell neki megadni.
    - A hívás paraméterében ennek a 8 byte-nak az első byte-ját kell megadni
    - Az átadott 8 byte BCD formátumú kell hogy legyen!

    A SET_RTC-nél oda kell figyelni a korrekt dátum megadására (pl. január 74 hibás) de emiatt a szökőévekre is figyelni kell a februárnál)

    A 8 byte tartalma:

    T Byte Description Byte Data
    0 year (0-99) current year (BCD value)
    1 month (1-12) current month (BCD value)
    2 day (1-31) current day (BCD value)
    3 hour (0-23) current hour (BCD value)
    4 minute (0-59) current minute (BCD value)
    5 second (0-59) current second (BCD value)
    6 00 reserved – always set to 00
    7 day of week (1-7) current day of the week, 1=Sunday (BCD value)

  • Szirty

    őstag

    válasz cooldmann #752 üzenetére

    Üdv cooldmann!

    "Kb nekem is ez van leirva, de továbra sem értem"

    Nyilván tudnám mi van neked leírva ha elárultad volna.
    Egyszerű a dolog, van egy rendszerhívás, aminek egy darab paramétert kell megadni, egy kezdőcímet.
    A kezdőcímtől kezdődő 8 byte-on kapod meg az időt illetve ott adod meg ha beállítani kell.
    Hogy melyik byte mit jelent azt leírtam az előző üzenetben.

    Pl. ha megadod paraméternek a VB102 címet, akkor az idő VB102-VB109-en lesz:
    VB102: Év
    VB103: Hónap
    VB104: Nap
    VB105: Óra
    VB106: Perc
    VB107: Másodperc
    VB108: Fenntartott byte
    VB109: A hét napja 1-7 (1=vasárnap, 2=hétfő, 3=kedd, stb)

    És újra hangsúlyozom, hogy BCD formátumban!
    Példaprogram is biztos van, én most nem kerestem...

    [ Szerkesztve ]

  • Szirty

    őstag

    válasz cooldmann #754 üzenetére

    Helló cooldmann!

    "De ez azt jelenti, hogy ezt a VB100 at valahol paraméterezni kellene?
    mármint akkor hogy és hol határozom meg a VB100-101-102 stb-t?"

    Amikor az órát beállítani akarod, akkor természetesen a programodban a SET_RTC meghívása előtt fel kell töltened a beállítani kívánt idő adatokkal azt a 8 byte-ot (értéket kell adni neki), aminek az első címét megadod a hívás paramétereként, hiszen a valós idejű órát ennek a 8 byte-nak a tartalma alapján próbálja meg átállítani.

    Amikor az órát olvasni akarod, akkor meghívod a READ_RTC-t és utána a 8 byte-ban rendelkezésedre áll az idő.
    Azt hogy melyik VB címeket használd, azt te határozod meg, teljes egészében rajtad múlik. van egy címtartomány VB0-tól valameddig, ami a rendelkezésedre áll, mint szabad felhasználású változó terület. Neked kell tudnod hogy melyiket mire használtad már fel a programban, melyikben mit tárolsz.
    Természetesen h pl. a VB102-VB109-et az óra lekérdezésére használod, akkor azt máshol másra már ne használd fel (persze megoldható az is ha nagyon kifogy az ember a változókból, de itt nem erről van szó).
    Ha a jelenlegi programodban egyáltalán nem használsz VB-ket, akkor teljesen hasraütésszerű címeket is megadhatsz, de érdemes inkább valamilyen koncepció szerint használni őket. Pl. az elejéről.

    "Azt sem értem, hogy így minden induláskor az eredeti órával indul? megadom valami csoda folytán a mai dátumot , holnap kikapcsolom, holnapután meg be, és a mai dátummal indul megint?"

    Nem, az RTC lényege, ahogy a nevében is benne van (Real Time Clock) az, hogy PLC programtól függetlenül telik. Még akkor is, amikor a PLC nincs bekapcsolva. De az adott CPU típustól is függ kicsit a dolog, mert van amikor háttértelep táplálja az órát, hogy az kikapcsolva is ketyegjen, de újabban csak egy pufferkondi van, ami pár napig látja el energiával az órát, így a CPU kikapcsolt állapotában csak addig ketyeg benne az óra, amíg a kondi ki nem sül (erre mindig megadnak a specifikációban egy időt).

    Tehát ha ma kikapcsolod, majd holnap be, akkor holnap is a pontos időt fogja mutatni nem azt az időpontot, amikor ma kikapcsoltad.

    "Sőt minden ciklusban visszafrissíti magát? Vagy most mi van?"

    Arra azért vigyázni kell, hogy amikor állítod az órát a SET_RTC-vel, akkor a SET_RTC funkciót csak EGYSZER hívja meg a programod. Tehát valamilyen impulzusfeltételt kell tenned a hívás elé. Ha úgy hívod ahogy a mellékelt képen van, akkor nincs feltétele a hívásnak, így minden PLC ciklusban lefut, így minden PLC ciklusban beállítja a pontos időt.
    Így persze az óra nem fog ketyegni az óra, ha másodpercenként 100x beleírod mindig ugyanazt az időpontot :)

    Az óra olvasását már hívhatod minden ciklusban, de az is fölösleges. Bőven elég másodpercenként egyszer vagy még ritkábban hívni.

  • Szirty

    őstag

    válasz cooldmann #759 üzenetére

    Hali cooldmann!

    "A példa a leírásban igy irja: 16#97. mondjuk ez az év. Ami zavar, hogy ez nem BCD."

    BCD az, csak hexadecimálisan :)
    Ha egy BCD számot hexában ábrázolva nézel, akkor decimálisan kell leolvasni :)

    A BCD számábrázolás lényege, hogy 4 bites digitekre van osztva a szám. Egy digit bináris kombinációja nem lehet 0-9 tartományon kívül. A lényeg tehát, hogy a BCD szám egyik 4 bites csoportja (digitje) sem lehet az alábbitól eltérő:
    0000 - 0
    0001 - 1
    0010 - 2
    0011 - 3
    0100 - 4
    0101 - 5
    0110 - 6
    0111 - 7
    1000 - 8
    1001 - 9

    A 16#97 tehát megfelel a BCD ábrázolás szabályainak. Binárisan ez 1001 0111
    De pl. az 16#1A vagy 16#C9 már nem.
    A 16#97 hexa szám tehát 97-nek felel meg decimálisan (és nem 151-nek, amennyi akkor lenne ha átkonvertálnánk decimálisra)!

    [ Szerkesztve ]

  • Szirty

    őstag

    válasz cooldmann #763 üzenetére

    Üdv cooldmann!

    "Kísérleteztem, hogy menet közben változtatom az időt, ezt PC ről tettem. Azt tapasztaltam, hogy 15 óráig szépen követi a visszaolvasott időt, aztán logikátlanul ugrálni kezd. 22 ora visszaolvasáskor 34 lesz, ami ugye irreális a percekről másodpercekről nem is beszélve."

    Nos szerintem itt csak annyi a gond, hogy decimális alakban nézed VB-ket. Pont ezért hangsúlyoztam, hogy BCD formátumban adja vissza az időt. Ha decimálisan nézed, hülyeségeket fogsz látni, mivel a szám BCD! A VB-ket Hexában jelenítsd meg és máris jó lesz.
    De előbb-utóbb az lesz, hogy át kell konvertálnod a BCD-t egész számmá, ha pl. összehasonlításokat akarsz végezni rajzuk (úgy egyszerűbb). Szerintem konvertáld át őket. (Van erre is utasítás).

    A 22 óra ezért lesz 34, mert BCD-ben ábrázolva a decimális 22 hexában is 22, de decimálisan a hexa 22 már 34! Az 59 perc pl. 89 lesz emiatt, stb

    Javaslom átnézni az alábbi linkeket:
    BCD számábrázolás
    Binárisan kódolt decimális számok

Új hozzászólás Aktív témák