Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Biblioteki modbus do atmegi

Tomasz_K
-
-
Posty:7
Rejestracja:20 cze 2004, o 15:02
Lokalizacja:o/k Rybnika
Kontaktowanie:
Biblioteki modbus do atmegi

Postautor: Tomasz_K » 12 lis 2005, o 15:42

Witam
Mam zamiar zrobić sobie taką namiastkę "inteligentnego domu" na razie jestem w fazie budowy prototypu ( prosta komunikacja działa na dwóch modułach i komputerem).
Sieć postawiłem właśnie na RS485, ale jako protokół chciałbym wykorzystać Modbus-a ( chyba najprostszy z arbitrażem) w związku z czym mam pytanie:
Czy mogę gdzieś zdobić biblioteki ( najlepiej c na biedę bascom też może być ), które można by ŁATWO zaimplementować w moich mikrokontrolerach ( AtMega 8 i AtMega 8515) i na komputerze ( wolałbym linuxa ale win*** też może być)?


PS.
Bascom ma swoje ale nigdzie opisu do nich znaleźć nie mogę.

sablik
-
-
Posty:101
Rejestracja:7 lip 2004, o 06:18
Lokalizacja:Czaniec
Kontaktowanie:

Postautor: sablik » 13 lis 2005, o 16:43

Niestety z tym są kłopoty.
Ja pisałem to Bascomie korzystając z istniejącej biblioteki wyliczającej CRC a dla Delphi sam pisasłem procedury dla RTU wykorzystując Cport do komunikacji(choć to i tak nie wyszło prawdziwe RTU to jednak działa)
Jeśli piszesz w C to polecam samemu napisać obliczanie CRC algorytmy są dostępne w sieci.
pozdr AS

Tomasz_K
-
-
Posty:7
Rejestracja:20 cze 2004, o 15:02
Lokalizacja:o/k Rybnika
Kontaktowanie:

Postautor: Tomasz_K » 15 lis 2005, o 18:05

no szkoda.
właśnie tego chciałem uniknąć tj. pisania samemu protokołu wymiany danych.

Thx.

marcinpie
-
-
Posty:4
Rejestracja:12 sty 2006, o 09:24
Lokalizacja:Jelenia góra

Postautor: marcinpie » 12 sty 2006, o 09:37

Witam.Sablik czy mógłbyś troche rozwinąć temat ja próbowałem korzystać z biblioteki crc ale nic mi nie wyszło,wiem również że modbus ma również bibliotekę do obsługi modbusa rtu niestety nigdzie nie można znaleźć żadnego opisu do niej.

sablik
-
-
Posty:101
Rejestracja:7 lip 2004, o 06:18
Lokalizacja:Czaniec
Kontaktowanie:

Postautor: sablik » 12 sty 2006, o 19:42

Witam , to jest kod obliczanie CRC w delphi

ale według specjalistów lepiej jest liczyc za pomocą tablic bo wychodzi szybciej.
http://lemon.ia.polsl.gliwice.pl/~jhajd ... U.KDG87D.4
http://www.modicon.com/techpubs/dcon7.h ... N.JBG17D.B

polecam http://4programmers.net/search.php?q=crc z tej strony czytałem o kodach crc
to jest kod z którego korzystałem : http://republika.pl/grzfilo/ramka22.htm

Kod: Zaznacz cały

1. Obliczanie CRC16. Czasami istnieje potrzeba policzenia sumy kontrolnej crc16 dla ciągu znaków, lub pliku. Sumę możemy policzyć, wykorzystując następującą procedurę: function CRCArray16(text: String):Word; var crc : LongInt; i,j : Integer; begin crc := $FFFF; for i := 1 to Length(text) do begin crc := Ord(text[i]) xor crc; for j := 1 to 8 do begin if (CRC and 1) = 1 then CRC := (CRC shr 1) xor $A001 else CRC := CRC shr 1; end; end; Result := crc; end;
to jest kod dla bascoma

Kod: Zaznacz cały

Dim Ar(10) As Byte Dim J As Byte Dim W As Word Dim L As Long Ar(1) = 1 Ar(2) = 2 Ar(3) = 3 J = Crc8(ar(1) , 3) 'calculate value which is 216 W = Crc16(ar(1) , 3) '24881 L = Crc32(ar(1) , 3) '494976085
jeśli będziesz myślał o komunikacji musisz pamietać obłędach, dla tego ja używam tylko dwóch funkcji zapisz wiele i czytaj wiele.
postaram się do końca miesiąca uruchomić stronę na której zacznę umieszczać trochę materiałów.

pozdr AS[/list]

marcinpie
-
-
Posty:4
Rejestracja:12 sty 2006, o 09:24
Lokalizacja:Jelenia góra

Postautor: marcinpie » 13 sty 2006, o 08:13

Witam. Samą składnie polecenia znam ,natomiasy chodzi mi o to jak spowodować by wyliczało on sumę dla ramki . Gdzieś wyczytałem że crc wylicza się tylko dla bloku danych ,próbowałem więc wyliczać tylko dla samych dany jak i dla całej ramki.Zawsze monitor modbusa wyrzucał mi błąd sumy kontrolnej dlatego zakładam że sama składnia ramki była poprawna. Urzywałem polecenia crc16. Miniej więcej coś takiego:

dim ar(7) as byte
dim cr as word
a(1)=1
...
a(7)=7
print bin a(1);
cr=crc16(ar(1),7
print bin cr;

sablik
-
-
Posty:101
Rejestracja:7 lip 2004, o 06:18
Lokalizacja:Czaniec
Kontaktowanie:

Postautor: sablik » 13 sty 2006, o 11:04

Troszkę się pogubiłem.
Kompletny przykład masz w Bascomie plik w przykładach modbus slave.

Modbus RTU działa mniej więcej tak:
procek odbiera dane które są już konkretnymi liczbami
zapisuje je do tablicy, po kolei adres, numer funkcji, początek danych , koniec danych
Teraz z tej tablicy (bez wysłanego CRC) oblicza CRC i porównuje z odebranym CRC.
Problem jest w tym że musisz dokładnie obliczyć od którego do którego bajta liczysz crc.
Teraz inny problem , procek wysyła dane tylko jako 8-bitowe liczby, więc przed wysłaniem musisz liczby większe podzielić na starsze bajty i na młodsze a następnie po ich odebraniu znowu je połączyć .
I z tych starszych i młodszych bajtów liczysz CRC
konkretny przykład z delphi

Kod: Zaznacz cały

//************************************************************************** // Wysyla 8 bajtow zapytania dla funkcji "03 odczyt n rejestrow " //************************************************************************** procedure TForm1.Funkcja_03; Var i,j : Integer; crc : LongInt; crc_wyliczone : integer; begin bity_w[1]:= Adres_slave; bity_w[2]:= 3 ; bity_w[3]:= 0 ; bity_w[4]:= Pocz_danych; bity_w[5]:= 0 ; bity_w[6]:= Licz_danych ; //------------------------------------------------------------------------------ crc := $FFFF; for i := 1 to 6 do begin crc := bity_w[i] xor crc; for j := 1 to 8 do begin if (CRC and 1) = 1 then CRC := (CRC shr 1) xor $A001 else CRC := CRC shr 1; end; end; crc_wyliczone := crc ; bity_w[7]:= Lo(crc_wyliczone); bity_w[8]:= Hi(crc_wyliczone); ComPort1.Write( bity_w,8) ; Oczekiwana_liczba_bajtow := 5 + 2* Licz_danych ; Nr_funkcji_aktywnej:=3;

Niewiem czy dobrze wytłumaczyłem, i czy o to chodziło.

pozdrAS
Ostatnio zmieniony 13 sty 2006, o 14:32 przez sablik, łącznie zmieniany 1 raz.

marcinpie
-
-
Posty:4
Rejestracja:12 sty 2006, o 09:24
Lokalizacja:Jelenia góra

Postautor: marcinpie » 13 sty 2006, o 13:25

Witam faktycznie troche namieszałem używając raz zmiennej "ar" a raz "a" :oops: .Mój problem polegał chyba na tym że zamiast crc z wartości zmiennych liczyłem ją już z bajtów do gotowych do wysłania.Wieczorkiem będe musiał nad tym posiedzieć.w każdym razie dzięki.

sablik
-
-
Posty:101
Rejestracja:7 lip 2004, o 06:18
Lokalizacja:Czaniec
Kontaktowanie:

Postautor: sablik » 13 sty 2006, o 14:48

Sorrki trochę przegalopowałem i poprawiłem w odpowiedzi .
Postaram się na wieczór lub jutro dać ci programik który liczy CRC z zadanych bajtów.
AS


Tu masz programik do testu CRC , myślę że sie nie pomyliłem.

Liczy crc z wprowadzonych danych.
Pozdr AS
Załączniki
crc test.zip
(203.68KiB)Pobrany 384 razy

marcinpie
-
-
Posty:4
Rejestracja:12 sty 2006, o 09:24
Lokalizacja:Jelenia góra

Postautor: marcinpie » 16 sty 2006, o 09:50

Witam.Dzięki za podpowiedz program przykładowy okazałsię faktycznie strzałem w dziesiątkę można go zawsze odchudzić z niepotrzebnych funkci. Niestety natkonołem się na koleiny problem, nie każdy program do modbusa powoduje wygenerowanie przerwania, porównywałe ramki zapytania za karzdym razem wygładała identycznie , morze wynika to z tego że zamiast mxa232 zastosowałem 2 tranzystory.
Niestety delfi jest dla mnie prawie jak Chiński kantoński :oops: chociarzjest chyba bardzo podobny do pascal ,muszę poszukać swoich starych zeszytów.
pozdr.

Wróć do „Elektronika - tematy dowolne”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 79 gości