logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega128][IEC 1107] - opis protokołu

herszt 09 Cze 2011 13:22 10190 5
REKLAMA
  • #1 9592878
    herszt
    Poziom 18  
    Witam,

    mam nadzieję, ze wybrałem dobry dział. Chciałem napisać program, dzięki któremu Atmega128 mogłaby się komunikować z licznikiem energii elektrycznej komunikującym się za pomocą wspomnianego protokołu (IEC1107). Problemem jest to, że nigdzie nie mogę znaleźć opisu tego protokołu. Może ktoś się kiedyś z nim zetknął (jakieś artykuły w czasopismach, albo jakaś strona z dobrym opisem)? Będę wdzięczny za wszelką pomoc.

    pozdrawiam
    herszt
  • REKLAMA
  • #2 9593189
    michalko12
    Specjalista - Mikrokontrolery
    Szukaj IEC 61107
  • REKLAMA
  • #3 9593332
    herszt
    Poziom 18  
    Ok. Znalazłem jakiś opis i chciałem tak "ręcznie wysłać" pierwszą ramkę:

    /?!<CR><LF>

    z parametrami transmisji (takie znalazłem):

    - prędkość 300
    - parzystość (Even)
    - 7 bitów danych
    - 1 bit stopu

    jednak w odpowiedzi otrzymuję tylko błąd parzystości. Do wysyłania używam Docklight, a licznik ma RS-485. Może gdzieś popełniam błąd?

    z góry dzięki
    pozdrawiam
    herszt
  • REKLAMA
  • #4 9594021
    michalko12
    Specjalista - Mikrokontrolery
    Sprawdzaj na różnych prędkościach
  • REKLAMA
  • Pomocny post
    #5 9647235
    Skyttop
    Poziom 11  
    Zaczynasz dobrze. Wg protokołu inicjację "/?!\r\n" wysyłasz na prędkości 300 bd (ustawienie transmisji 7E1). Nie żadnej innej - 300, bo tak mówi norma. Licznik energii ma wówczas maksymalnie 2 sekundy na odpowiedź, a odpowiedzią jest wpierw ramka identyfikatora licznika, który ma postać "/XXXZD<CR><LF>", gdzie XXX jest identyfikatorem producenta, D oznacza identyfikator licznika (maksymalnie 16 znaków) a Z oznacza identyfikator prędkości, z jaką licznik może się komunikować, aby zwiększyć prędkość transmisji z 300 bd na większą. Jeśli chodzi o zmianę transmisji danych z licznika, należy to wykonać dopiero po otrzymaniu ramki identyfikatora, ale jeśli tego nie zrobisz, licznik udostępni dane na prędkości 300 bd. Jeśli zaś chcesz zmienić transmisję, należy wysłać do licznika ramkę "<ACK>VZY<CR><LF?" (po otrzymaniu identyfikatora), gdzie V to cyfra 0 (pole V norma precyzuje jako opcję dla dalszych rozszerzeń protokołu), pole Z pełni tę samą rolę co znak w ramce identyfikatora, a Y identyfikuje rodzaj wykonywanej operacji w i „0” oznacza czytanie danych, a „1” programowanie.
    Z tego wniosek, że należy wysłać "0Z0<CR><LF>" i jednocześnie zmienić prędkość transmisji w komputerze/urządzeniu czytającym. Po chwili licznik powinien transmitować dane.
    Teraz trochę o prędkości transmisji, czyli polu Z. Od licznika możemy otrzymać cyfry, które kolejno oznaczają:
    0: 300 bd
    1: 600 bd
    2: 1200 bd
    3: 2400 bd
    4: 4800 bd
    5: 9600 bd
    Jak widać to licznik decyduje o tym, na jaką prędkość trzeba się przełączyć. Ale nie ma obowiązku zmieniać transmisji. Jak już wspomniałem - jeśli nie wyślesz tej drugiej ramki, licznik i tak po krótkim czasie wyśle pełne dane na prędkości 300 bd.

    Nie wiem w jaki sposób podłączasz się do licznika, ale jeśli podłączenie jest poprawne, nie ma możliwości, aby licznik nie odpowiedział. Twoje problemy mogą świadczyć o błędzie w podłączeniu lub o uszkodzeniu interfejsu licznika. Dodam, że inicjacja działa również na zwykłym Hyperterminalu, gdzie ręcznie wpisujesz znaki /?! po czym wciskasz enter i trzymając ctrl znów enter - licznik powinien odpowiedzieć.

    Ja odczytuję dane z licznika za pomocą głowicy odczytowej firmy Meter-Test (najtańsza głowica dostępna jest w tej firmie). Na ich stronie jest również darmowy program, który pozwala odczytać liczniki wg IEC1107. Sam również napisałem program, który od czasu do czasu wykorzystuję i również mam zamiar zaimplementować ten protokół w AVR, ale ciągle brakuje mi czasu.
    Licznik energii może udostępnić dosyć sporo bajtów danych (miałem taki, co udostępnił 4kB), więc AVR musiałby te dane gdzieś przechowywać, aby móc je później "obrobić", no chyba że potrzebujesz odczytać tylko wybrane rejestry, ale tu również będzie trzeba je odnajdywać za pomocą jakiegoś algorytmu. Licznik bowiem nie wysyła tylko stanu swojego rejestru energii, ale również wiele więcej informacji jednym ciągiem - dostajesz plik tekstowy, np taki:

    
    /LGZ4ZMD120AMt
    F.F(00020000)
    0.0( )
    C.1(********)
    1.8.1(000000.0*kWh)
    1.8.2(000005.3*kWh)
    1.8.0(000005.3*kWh)
    21.8.0(000000.2*kWh)
    41.8.0(000001.8*kWh)
    61.8.0(000003.2*kWh)
    22.8.0(000000.0*kWh)
    42.8.0(000000.7*kWh)
    62.8.0(000000.6*kWh)
    C.7.0(00000265)
    C.7.1(00000033)
    C.7.2(00000028)
    C.7.3(00000263)
    C.2.1(99-04-29 15:25)
    C.8.1(00000000)
    C.8.2(00118724)
    C.8.0(00118724)
    !
    



    W dalszym etapie potrzebujesz zdekodować informacje, które te licznik "wypluwa". Jest to identyfikowane wg standardu EDIS opisanego w innej normie. Są to te znaki umieszczone przed nawiasami. Jeśli będziesz zainteresowany, służę pomocą.
  • #6 10069305
    herszt
    Poziom 18  
    Dzięki Kolego @Skyttop! Po długich walkach udało mi się trochę rozszyfrować ten protokół.

    pozdrawiam
    herszt
REKLAMA