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
Moderatorzy:Jacek Bogusz, Moderatorzy
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ę.
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ę.
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
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
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
to jest kod dla bascoma
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]
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;
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
postaram się do końca miesiąca uruchomić stronę na której zacznę umieszczać trochę materiałów.
pozdr AS[/list]
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;
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;
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
Niewiem czy dobrze wytłumaczyłem, i czy o to chodziło.
pozdrAS
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.
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
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
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 chociarzjest chyba bardzo podobny do pascal ,muszę poszukać swoich starych zeszytów.
pozdr.
Niestety delfi jest dla mnie prawie jak Chiński kantoński chociarzjest chyba bardzo podobny do pascal ,muszę poszukać swoich starych zeszytów.
pozdr.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości