Problemem raczej nie jest if. Zrób parę eksperymentów - np. do crcCalculate przypisz stałą, a w kolejnej instrukcji rezultat crc16.Modbus. Zobacz jak zachowa się kod, gdy wykonasz operację na crcCalculate np. crcCalculate++ Ja kiedyś miałem dziwną sytuację - szereg funkcji, które zwracały "String" (z dużej litery). W kilku projektach działa to bez problemu,...
Patrz wyżej, zamieściłem kod, który daje poprawny wynik (z dokładnością do endianessu). Dodano po 6 Bład masz logiczny... 0x22 to jeden bajt a ty rozpisałeś to tak jakby były dwa bajty 0x2 czyli 0x0202. Badaną wartościa jest 0x22 i jest to jeden bajt.
Witam Np. tak unsigned char bufor[]={0x01,0x01,0x00,0x13,0x00,0x25} + do tego CRC16 Pozdrawiam,
Jeśli zdecydujesz się na Basic, co zapewne dużo ułatwi pisanie aplikacji, prosze przykład komunikacji MODBUS RTU dla Zamel EXTA FREE, do sterowania ROP. [syntax=vbnet]$regfile = "m8def.dat" $crystal = 8000000 $baud = 9600 $hwstack = 32 $swstack = 10 $framesize = 40 Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol...
Witam. Troche mi to nie pasuje bo trzeba przetstowac a ja na czym to zrobie testy jak nie mam takiego inwertera. Tu masz link do liczenia CRC16 MODBUS https://www.lammertbies.nl/comm/info/crc... Popbierz sobie HERCULES i prob proby piszac pojedyncze ramki i wysylajac je do inwertera i co otrzyma. I zrob ramke pytajaca o wszysykie paramatry...
Przyczyna jest zła interpretacja typu danej wejściowej w podanym linku. Jeśli chcesz obliczyć CRC od liczby 123 to musisz przełączyć "Input type" na Hex i podać wartość szesnastkową z "123" czyli "7b". Po poprawnym wpisaniu wynik jest ten sam: CRC-16 (Modbus)0x63FF
W stosie, który wykopałem ze źródeł mam: [syntax=c]STATIC USHORT usUtlCRC16GetTab( UBYTE ubIdx ) { USHORT usCRC16; USHORT usC; UBYTE i; usCRC16 = 0; usC = ( USHORT ) ubIdx; for( i = 0; i < 8; i++ ) { if( ( usCRC16 ^ usC ) & 0x0001 ) { usCRC16 = ( usCRC16 >> 1 ) ^ 0xA001U; } else { usCRC16 = usCRC16 >> 1; } usC = usC >> 1; }...
Do odczytywania polecał bym Read Input Registers - 0x04. 0x10 służy do zapisywania. Na końcu każdej ramki wysyłane jest crc16 wiec dobrze by było to liczyć.
crc=CRC16(Mbuf,8); lub crc=CRC16(&Mbuf[0],8);
Jak masz już komunikacje po RS232, to tylko wystarczy Ci złożyć ramkę i wysłać a potem czekać na odpowiedź. Na końcu ramki należy dodać dwa bajty sumy kontrolnej CRC16, zresztą wygląd ramki modbusa znajdziesz bez problemu.
1) Czy u Ciebie też pin 2 i 4 oraz 5 i 6 są zwarte ? Tak, potwierdzam. U mnie również te piny są zwarte po podłączeniu do kotła przewodu. Jak pisałem wcześniej mam również przewód RS oryginalny dostarczony z ST-505, w którym przewód jest cztero żyłowy. Connector A (RJ12) 123456 |||||| y.gw.b Connector B (RJ12) 123456 |||||| y.gw.b y-yellow...
Wydaje mnie się że wszystko przetrzepałem, nawet robiłem 1:1 z jakimś tutorialem i to nie działa. Myślałem jeszcze żeby w ostateczności zrobić to na rs232 i konwerter na 485 ale to taka partyzantka i zostaje jeszcze wtedy konieczność liczenia CRC16 dla modbusa gdzie za bardzo nie wiem jak to zrobić w TIA. Dodano po 17 Kolego a mam pytanie bo w sumie...
Poniżej przedstawiam działającą procedurkę jaką sobie napisałem do obliczania CRC16 w komunikacji po ModBusie z falownikami. Nie wiem tylko pojęcia czy algorytm obliczania dla ModBus jest jednakowy np z tym dla czujników dallasa z 1-wire ale CRC to CRC :) ;crcl, crch - zmienne zdefiniowane w wewnętrznej RAM ;-----obliczanie CRC16----r0, r1, acc----...
Witam.Chciałbym do swojego urządzenia na avr dopisać komunikację korzystając z protokół jak w temacie wiem że w bascomie jest biblioteka obliczająca sumy kontrolne do tego protokół niestety nie mam do niej żadnego opisu,natomiast jeżeli korzystam crc16 monitor modbusa wyrzuca mi błąd sumy kontrolnej.
I rzeczywiście, teraz wychodzi 140C. A jak to powinno wyglądać w modbusie w takim razie? Zarówno realterm jak i simply modbus master 8.0.6 crc przedstawiają jako 0C 14. W modbusie przestawia się bajty crc?
Tak myślałem. Do tej pory próbowałem sam napisać obsługę opartą na przerwaniach od UATR'u i liczniku, ale dojechałem do chyba martwego punktu - odpytywanie pojedyńczego modułu działa bez problemu, natomiast problem jest z kilkoma modułami, tzn. jak odpytuję kilka modułów odpowiada tylko jeden... Algorytm po krótce wyglądał tak, może ktoś zobaczy błąd...
Polecam specyfikacje Modbus do poczytania i książkę Pana Witkowskiego "Mikrokontrolery AVR programowanie w języku C - przykłady zastosowań", gdzie bardzo przystępnie pokazuje w C komunikację po RS485 z crc16 i detekcją błędów. Zakładasz w programie środowisko idealne, pomyśl co się zacznie dziać, gdy pojawią się zakłócenia... Tak jak mówił albertb nawet...
Niestety problemów ciąg dalszy . W instrukcji falownika w dziale MODBUS przy opisie funkcji jest przykład : aby zapisać wartość 15 i 400 do parametrów(słów) W400 i W401 odpowiedzialnych za ruch i częstotliwość pracy jest podana następujaca komenda : 02 10 0190 0002 04 000F 0190 CRC16 i tu wszystko jasne 02 adres urządzenia 10 funkcja zapisu wielu kolejnych...
Jaka wersje MODBUS chcesz zastosowac. Jesli ASCI to suma kontrolna to exor wszystkich bajtow a jesli RTU to suma CRC16. Niestety nie znam sie na VB.
Konfiguracja taka jak wyżej w programie... Do tego kwarc 8MHz. Dodano po 47 Tu ustawiaj flagę, która spowoduje ze w Twoim głównym kodzie zostaną zrobione obliczenia i wysłane ramki. Czyli w ten sposób jak zrobiłem teraz: [syntax=c] void SysTick_Handler(void) { static unsigned short count = 0; count++; if (count ==10) //wykonaj co 2s { flaga = 1; count...
Więc mam ten programik w wersji 3.24. Ale za chiny nie potrafię go obsłużyć. Może mi ktoś z grubsza wytłumaczyć jak używa się takie programy? Gdzie wpisujemy dane w ramki, gdzie odczytujemy? Czy to rzeczywiście działa na takiej zasadzie jak myślę? Dodano po 8 Program ustawić na slave czy master? Co oznacza w ramkach z 1 postu CRC16?
Drugi bajt 0x10 oznacza instrukcje 16 czyli "preset multiple registers" Kolejne dwa bajty oznaczają adres rejestru czyli 00 0F to 40001+15= 40016 Następne dwa bajty 00 01 oznacza liczbę rejestrów do zapisu czyli 1 Potem jest liczba bajtów do zapisu i wartość lub wartości do zapisu, a na końcu suma crc16
Proponuje abys zdobyl opis protoklo transmsji dla SMA i tam bedzie duzo rzeczy napisane jak sie co ustawia po RS485 i nie trzeba miec program firmowy bo to mozesz zrobic za pomoca terminala PUTTY. Tylko pamietaj aby ze strony kalkulatora dolozyc do ramki CRC . Tu masz dobry kalkulator https://crccalc.com/ Z tego co pamietam do starsze SMA maja CRC16/X25...
Witam, Na Moxie mam postawiony Serwer TCP i pod nią mam podpięte rejestratory. W WinCC jako kanał komunikacji ustawiam Modbus TCP/IP Serwer ModBus TCP? Urządzenie za Moxą spodziewa się Modbus RTU. WinCC komunikuje się po Modbus TCP. To są różne protokoły. Ale jak jest różnica miedzy ModBus RTU a ModBus TCP?. Z tego co ja wiem to różnica jest taka że...
W załączniku (ZIP) są pliki: [syntax=less]-rwx 364 2022-12-05 22:32:29 mktcrc16.tcl -rw- 2444 2022-12-05 22:37:03 sclpcrc-m.pas -rw- 2425 2022-12-05 22:41:38 sclpcrc.pas -rwx 660 2022-12-06 00:36:20 lcrc16.py -rw- 370 2022-12-31 00:10:00 modbus-crc.py -rw- 1920 2023-12-15 23:41:54 tcrc16.txt[/syntax] Z tego: mktcrc16.tcl wygenerował tabelę pomagającą...
Po pierwsze adres 0 to w modbusie adres rozgłoszeniowy więc nie koniecznie jakieś urządzenie musi odpowiadać na tą ramkę. Po drugie CRC w Modbusie w przeciwieństwie do reszty danych umieszczone jest odwrotnie, najpierw część lo, a potem hi. Można skorzystać z biblioteki avr-libc do liczenia CRC MODBUSa [syntax=c]#include <util/crc16.h> uint16_t...
Witam Załączam procedurkę jaką wykożystuje do oblicznia CRC16 w komunikacji po ModBusie z falownikiem. Całej reszty do komunikacji nie zamieszczam bo w moim przypadku poszedłem po najmniejszej lini oporu - umieszczam w pamięci bajty jakie mają byc wysłane w ramce ModBus, obliczam CRC i wysyłam kolejno wszystko (nie robiłem slave). Nie bawiłem się nawet...
Witam. Chciałem zrobić ekstremalnie uproszczonego modbusa RTU Slave na STM32. Tz w przerwaniu od RX jeśli pojawi się adres mojego urządzenia (Slave) to odrazu wyślij ramkę w postaci: adres,funkcja,ilosc_danych,dane,CRC16. Czy z punktu widzenia modbusa stanowi jakiś problem to uproszczenie ? Dodano po 24 Działa :) Dodano po 33 Tylko pytanie dlaczego...
Widzę tu dwa problemy. Urządzenie wymaga zapisu rozkazem 0x06 (zapis jednego rejestru). Fatek może używać rozkazu 0x10 (zapis wielu rejestrów) nawet gdy zapisuje jeden rejestr. Pseudo adres 400001 oznacza Holding Register o adresie 0. Urządzenie wymaga adresów 1 do 8. Zdefiniuj sobie 1 słowo o adresie 400002 i spróbuj je odczytać (rozkaz 0x03). Jak...
Używam też EW11 i udało się bez problemów skomunikować z SDM630, lecz mam problem z SofarSolar. Testuje za pomocą aplikacji Modbus Pool i innych i działa tylko "Holding registers" . Przy "Input registers" mam timeout. Nie mam doświadczenia z modbus i nie wiem gdzie jest problem Zwykle CRC w Modbus RTU ma 2 bajty. Pierwszy bajt jest Hi, drugy - Lo....
O ile mi wiadomo - Bascom potrafi jedynie zbudować i wysłać ramkę do urządzenia SLAVE. Kod slave musisz napisać sobie sam. Podpowiem trochę. Modbus RTU od strony slave nie jest skomplikowany w implementacji. Przyjdzie Ci na port UART taka ramka danych: - początek transmisji (3,5 znaku ciszy) - adresu urządzenia (1 bajt) - kod funkcji (1 bajt) - danych...
Hmm a da się to jakoś wpasować w to? Bo wygląda na adres 1 i fc02. http://www.simplymodbus.ca/FC02.htm W ModbusRTU masz na końcu CRC16, czyli 2 bajty, ale jeśli dobrze pamiętam to w kolejności low/high. Nie masz dokumentacji do tego panela? Pewnie tam jest to opisane czarno na białym.
No zgadza się, sprawdzałem w międzyczasie z tymi samymi tabelami a i tak nie wychodziło to samo. Jak ma się sprawa z tym xorowaniem na końcu funkcji? Dodano po 5 U mnie jak zwykle wszystko na opak i zamiast zajrzeć tu na początku - zajrzałem na końcu... http://www.modbustools.com/modbus_crc16.... Odwołałem się do tej strony po to by sprawdzić czy to...
Witam Ja pisałem programu do komunikacji po ModBus'e z miernikiem LUMEL NA6 i moim zdaniem łatwiej by było wykonać komunikacje w trybie RTU. Suma kontrolna CRC16 jest dostępna w dokumentacji do ModBus'a w języku C. Ja przerobiłem ją na C#. Ramka zapytania jest prosta i nie potrzeba nic dodawać dodatkowego np: public byte[] getRamkaStatusNr1(byte...
Czy ktoś używał tej funkcji, działa poprawnie? Prosze o opinie i porady. Funkcja licząca CRC ramki MODBUS unsigned short ModbusCRC(unsigned char * buf, int size) { unsigned short crc = 0xffff; int i; while(size--) { crc ^= *buf; buf++; for(i=0; i<8; i++) { if(crc & 1) { crc >>= 1; crc...
Format modbusa : 1bajt adres, 1bajt funkcja, 2bajty pierwsyz rejestr, 2bajty ilosc rejestr, 2bajty suma CRC16 a więc to co wysyłam { 0x01, 0x03, 0x00, 0x01, 0x00, 0x02, 0x095, 0xCB } No właśnie błędów nie ma bo jest RPi2 z windows 10ioT a to co wysyła to aplikacja napisana w C#. Parametry komunikacji zgadzają się. Jedyne jeszcze co mi przychodzi do...
Drodzy koledzy, Temat widzę stary ale również zmagam się z sumą kontrolną. Co prawda jest to transmisja z piecem CO. Czy wiecie może w jaki sposób jest wyliczana suma następującej ramki? 0x02 0x26 0xFF 0xF4 0x02 0x18 0xA1 0xDE gdzie: 0x02 0x26 to początek ramki / start, gdyż zawsze się powtarza 0x02 0x18 to koniec ramki. Po nim A1DE to właśnie obliczona...
Komunikuje się z urządzeniem po protokole modbus. Mam problem z obliczeniem sumy kontrolnej. Znalazłem taką funkcję: [syntax=delphi] function TForm1.CRC16(str:string):string; var crc: word; n,i: integer; b:byte; temp,by:string; begin crc := $FFFF; for i:=0 to (length(str) div 2) - 1 do begin by := str[i*2+1]+str[i*2+2]; Memo1.Lines.Add(by); b:=Byte(hextoint(str));...
Kod: [syntax=c] /************************* * stm32 uart main.c *************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "stdint.h" #include "misc.h" #define CLK_FREQ 36000000 /* User defined function prototypes */ void GPIOA_Init(void);...
Jakieś dziwne zjawisko. Wszystko działało tz. w pętli pytałem urządzenie po modbusie a teraz jakieś dziwnie zachowanie . Tak jakby zawieszony procesor nic się nie wykonuje w pętli . Co może być przyczyną ? Całość poniżej : [syntax=c] /************************* * stm32 uart main.c *************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h"...
Zrobiłem tak jak zaproponowałeś. A więc uruchomiłem całe moje ustrojstwo. Dodatkowo innym komputerem z programem "SimpleTerm Gold" wpiąłem się pod RS485 i słuchałem. To co otrzymałem to: <01><03><00><01>... <DA><5D> Gdzie pierwsza część <01><03><00><01>...
Tak mniej więcej wyglądał mój program testowy. Nie jestem pewien czy nie ma w nim teraz błędów bo wycinałem z niego obsługę panelu HMI. Nie mam teraz czasu żeby go przetestować. Używa dwóch portów szeregowych więc przydatne jest arduino większe niż UNO / pro mini. Ja używałem Mega 2560. bool cobrareceived=false; const byte nrsterownika=5; unsigned long...
https://obrazki.elektroda.pl/8343613300_... Postanowiłem podłączyć rekuperator Thessla Green do Home Assistanta. Rekuperator posiada dosyć dobrze udokumentowane wyjście ModbusRTU. Do połączenia postanowiłem użyć konwertera RS485 na Ethernet dosyć popularnej firmy Waveshare. HA posiada wsparcie dla Modbus-TCP, ale chcę zachować pewien...
Zrobiłem obliczanie CRC-16 wg algorytmu podanego na CRCCALC: //Oblicza CRC dla wielomianu 0xA001 LDI R18,0xff //WE: R17=ILOSC,X=ADRES; Oblicza sume CRC bloku danych, MOV R19,R18 //R19:CRCH; R18=CRCL NEXTB:TST R17 BREQ ENDCRC LD R20,X+ //Ładuj Bajt_L LDI R21,0 //Ładuj Bajt_H EOR R19,R21 EOR R18,R20 DEC R17 //Dekrementuj licznik bajtów...
Wygląda, na to, że CAS funkcją 0x10 wysyła w każdym rejestrze to samo, więc w Twoim przypadku nie zadziała. Natomiast Simply tworzy poprawną ramkę, ale biorąc pod uwagę przykład z dokumentacji i próbę ustawienia adresu 60, nie zgadza się suma kontrolna. Może w dokumentacji jest błąd, bo CRC16 w Simply wygląda na prawidłowe. https://obrazki.elektroda.pl/3782307900_...
Witam Mam taki problem z biblioteką SimpleModbusSlave dla arduino. Arduino Uno z wyświetlaczem LCD(slave) wyświetla dane przesyłane z PC (master) po RS485(modbus), wszystko fajnie działa ale w momencie kiedy odłączę arduino od magistrali rs485 lub wyłączę program na PC którym wysyłam dane do sterownika to dane na wyświetlaczu pozostają bez zmian (zapamiętuje)...
Gdzieś pod koniec tego DOCX masz "4.4 Communication protocol example and explanation" i dalej Query frame: 0x01 0x03 0x00 0x00 0x00 0x02 0xC4 0x0B - wysyłałeś dokładnie to? Pewnie przydałoby się zorientować, jak się to CRC liczy, ale myślę, że w przykładzie podali poprawne. Z tym czujnikiem "PZEM-003" gorzej, on ma więcej parametrów do odczytywania,...
Witam! Mam pewnien problem. Mianowicie muszę wysłać ramkę MODBUS RTU do sterownika w postaci mniej wiecej takiej: (pierwsze dwa pola to kolejno adres sleva i funkcja, drugie dwa to adres pamieci w sterowniku, kolejne dwa do ilośc adresów pamieći o które pytamy, no i ostatenie dwa to suma kontrolna-bez nawiasów oczywiście;). Niestety programista ze mnie...
var CRC_dane:ARRAY[0..99] of BYTE; suma_CRC_hi,suma_CRC_lo:integer; function TForm1.CRC16(length:integer)... const wCRCTable: array [0..255]of WORD =($0000,$C0C1,$C181,$0140,$C301,$03C... $C741,$0500,$C5C1,$C481,$0440,$CC01,$0CC... $CE81,$0E40,$0A00,$CAC1,$CB81,$0B40,$C90...
Witam, faktycznie też odpuszczam sobie tego freemodbusa, jednakże próbuję teraz napisać własną bibliotekę opartą ściśle na zasadach komunikacji Modbus czyli tak jakby własny modbus. Nie wiem jak poradzić sobie z odbiorem ramki po stronie slave, a dokładnie z detekcją faktycznego pierwszego znaku z nadanej ramki, tzn jak wykryć że odebrany znak jest...
http://obrazki.elektroda.net/8_122877286... Komunikacja miedzy dwoma mikroprocesorami AVR oparta na zmodyfikowanym protokole MODBUS RTU zrealizowana na interfejsie RS422 (full duplex). Witam wszystkich. To pierwsza publikacja jednego z moich samodzielnie zrealizowanych projektów (a kilka ich było). Układ (sterownik) docelowo ma służyć do kontroli...
Witam Najlepiej użyć kosci TP-UART i problem rozwiązany ale cena 150zl netto powala!!! Wlasnie jestem na etapie testowania rs485 MultiMaster i tak: Kosc sn75176 docelowo sn75lbc184 obsługa do 128 nadajnikow. Kanal A poprzez rezystor podciągniety do VCC Kanal B poprzez rezystor do GND. Tylko w jednym sterowniku calej sieci i terminatory 120 na koncach,...
Witam, Ten kod działa na 1000% :) [syntax=c]unsigned short int Crc16(unsigned char *puchMsg,unsigned short int usDataLen) { //High-Order Byte Table Table of CRC values for high-order byte static unsigned char auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00,...
Cześć. Pracuję nad takim małym systemem komunikacji pomiędzy kilkoma urządzeniami pomiarowymi a PC. Pomiędzy urządzeniami a PC jest coś w rodzaju hub'a, co sam zaprojektowałem i wykonałem - ogólny schemat jest taki: http://obrazki.elektroda.pl/5939738300_1... Wspomniane przeze mnie urządzenia pomiarowe nie są pierwszej nowości, więc...
(at)Markosik20 Dziękuję za zainteresowanie! :-D Nie zrozumieliśmy się. Nie chcę transmitować znaków w czasie rzeczywistym. Druga sprawa - w RS485 masz wiele nadajników, jeden master reszta slave - nie można sobie tak śmiecić na linii (po znaku), to nie buforowany RS232! Inna sprawa, że docelowo przesył będzie w trybie ASCII (później rozszerzę soft o...
Witam, probówałem różnych przykładów obliczania sumy kontrolnej i nadal nic. Mam zrobioną na sztywno tablice: 01 03 02 00 00 na końcu doklejam 2 słowa CRC wyliczone w funkcji i program symulujący modbus master mówi CRC error. Gdy nie wyliczam sumy kontrolnej tylko wpisuje do tablicy prawidłowe wartości sumy dla moich danych to program do symulacji modbusa...
crc16 tablica modbus timeout modbus github
avrdude arduino revox tuner unitra g8010
wf60f4e3w2w wirowanie shelly dotykowy
Nice Spido 6000 – brama po zamknięciu sama się otwiera, samoczynny rewers, fotokomórki, krańcówki Silnik jednofazowy nie startuje, rusza po zakręceniu w lewo – kondensator rozruchowy, wyłącznik odśrodkowy