Transmisja danych RS485_RS422

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Transmisja danych RS485_RS422

Post autor: Pikczu » 04 sty 2019, 23:28

Henryk,
A jest jakiś PDF do tego urządzenia ?
Może tam będzie jakieś info? może bit parzystości jest nie standardowy itp.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Transmisja danych RS485_RS422

Post autor: Henryk » 05 sty 2019, 8:44

niveasoft pisze:
04 sty 2019, 23:05
a za MAxem? Czegoś powinieneś być pewnym.
Witam :D

Przyznaje się bez przyciskania do muru , że nie sprawdzałem , nie mam drugiego konwertera .
Już nad tym pracuje by go mieć ;)
Pikczu pisze:
04 sty 2019, 23:28
Henryk,
A jest jakiś PDF do tego urządzenia ?
Może tam będzie jakieś info? może bit parzystości jest nie standardowy itp.
Witam :D
Pracuje w środowisku w którym takich wiadomości nie uświadczysz . Serwisant to "niewolnik " który ma zamawiać i wymieniać moduły .
Wiedza zdobyta na temat urządzenia jest wyłącznie moją pracą po godzinach . Na szczęści mam szefa który też jest głodny wiedzy i każde nowe urządzenie jest rozbierane w drobny mak w celu jego poznania ;)
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Transmisja danych RS485_RS422

Post autor: Henryk » 05 sty 2019, 15:25

Skleciłem na szybko układ testowy , konwerter działa poprawnie , będę musiał w pracy sprawdzić czy z portem com jest wszystko ok .
Banalny program do testów , przy okazji skorzystałem z podpowiedzi Bartka :)
  1. $regfile = "m8def.dat"
  2. $crystal = 16000000
  3. $baud = 9600
  4.  
  5. 'Config Print0 = Portd.2 , Mode = Set       ' https://bart-projects.cba.pl/rs485.html
  6. 'Config Pind.2 = Output       'ustaw pin jako wyjściowy
  7. ' ja ustawiłem na "sztywno nadawanie " podjąc stan wysoki na piny 2,3 Max,a 487
  8. Dim X As Byte
  9. X = 10
  10.  Do
  11.  
  12.  Print "Test RS485 " ; X ; " Hex " ; Hex(x) ; " Bin " ; bin(X)
  13.  If X = 250 Then : X = 0 : End If
  14.  Wait 4
  15.  X = X + 10
  16.  
  17.   Loop
  18.  End
test.JPG
IMG151002.jpg
Edit:
Tak szybko pisałem , że nawet nie zwróciłem uwagi na brak wyświetlanej wartości binarnie :oops: :lol: już poprawione w programie .
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Transmisja danych RS485_RS422

Post autor: Henryk » 07 sty 2019, 17:20

Ruszyłem z miejsca ;) przeniosłem terminal na laptopa z systemem XP i bez większego kłopotu złapałem transmisję .
Śmiga tych danych nieco więcej niż się tego spodziewałem , lecą dwie paczki , pierwsza 19 bajtów , przerwa ok. 100ms i leci druga 6 bajtów .
Zidentyfikowałem które bajty należą do wartości zmienianych w urządzeniu :D
Jeśli dobrze myślę , to teraz powinienem złapać te dane do tablicy i przypisać do właściwych zmiennych :?:
Mam jednak mały kłopot z bajtem na końcu obu paczek , nie pasuje do niczego , czy to może być suma kontrolna :?:
Awatar użytkownika
niveasoft
Posty: 1221
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Transmisja danych RS485_RS422

Post autor: niveasoft » 07 sty 2019, 17:25

Pewnie, że może być :D
Pozbieraj jakieś ramki i jak nic nie wyczaisz to zapodaj.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Transmisja danych RS485_RS422

Post autor: Henryk » 08 sty 2019, 18:34

Witam :D

Przyciąłem " Jarząbka " i wystukałem coś takiego ;)
  1.   $regfile = "m8def.dat"
  2.    $crystal = 8000000
  3.     $baud = 4800
  4.  
  5.   Dim X As Byte , Tab1(19) As Byte , Tab2(6) As Byte
  6.  
  7.   Tab1(1) =       'xxx wstawię odpowiednie wartości
  8.   Tab1(2) =       'xxx
  9.   Tab1(3) =       'xxx
  10.   Tab1(4) =       '
  11.   Tab1(5) =       '
  12.   Tab1(6) =       '
  13.   Tab1(7) =       '
  14.   Tab1(8) =       '
  15.   Tab1(9) =       'xxx
  16.   Tab1(10) =       '
  17.   Tab1(11) =       '
  18.   Tab1(12) =       '
  19.   Tab1(13) =       '
  20.   Tab1(14) =       '
  21.   Tab1(15) =       '
  22.   Tab1(16) =       '
  23.   Tab1(17) =       '
  24.   Tab1(18) =       ' xxx
  25.   X = Crc8(tab1(1) , 18)
  26.   Tab1(19) = X
  27.  
  28.   Tab2(1) =       'xxx
  29.   Tab2(2) =       '
  30.   Tab2(3) =       '
  31.   Tab2(4) =       '
  32.   Tab2(5) =       'xxx
  33.   X = Crc8(tab2(1) , 5)
  34.   Tab2(6) = X
  35.  
  36.     Do
  37.  
  38.      Print Tab1 ; Waitms 100 ; Tab2
  39.        Waitms 400
  40.  
  41.      Loop
  42.     End
Pierwsze dwa bajty w obu paczkach to informacja dla slave,a która paczka leci .
Obliczając sumę kontrolną należy je również uwzględnić :?: i co ważniejsze , czy ten programik ma prawo zadziałać :?:
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Transmisja danych RS485_RS422

Post autor: Pikczu » 08 sty 2019, 22:25

No dobrzy było dodać bufor wyjściowy i zamiast print użyć print bin bo tak się wysyła całe tablice.
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3. $hwstack = 40
  4. $swstack = 16
  5. $framesize = 32
  6.  
  7. $baud = 4800
  8.  
  9. const Timer1Reload = 781
  10. config timer1=timer,prescale = 1024
  11. load timer1 , Timer1Reload
  12. on ovf1 Timer1_isr
  13. Enable Timer1
  14. start timer1
  15. enable interrupts
  16.  
  17.  
  18. 'Timer value explination
  19. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
  20. ' The AVR is running at 8000000Hz, the prescaler is 1024
  21. ' Each tick is 0.128 ms  -  (1 / CPUSpeed in KHz ) * Prescaler
  22. ' The timer needs  781 ticks to reach the required time  ( 781 * 0.128 = 99.968ms)
  23. ' The start value for the timer must be set to 64755 so that it will overflow at 65536 after 781 ticks
  24. ' NOTE: The load command does the inversion for you (256-value or 65536-value)
  25.  
  26. Config Serialout = Buffered , Size = 64
  27.   Dim X As Byte , Tab1(19) As Byte , Tab2(6) As Byte
  28.  Dim Flaga As Byte
  29.  Dim Czas As Byte
  30.  
  31.  
  32.  
  33.   Tab1(1) = &H50                                            'xxx wstawie odpowiednie wartosci
  34.   Tab1(2) = &H61                                            'xxx
  35.   Tab1(3) = &H6E                                            'xxx
  36.   Tab1(4) = &H20                                            '
  37.   Tab1(5) = &H48                                            '
  38.   Tab1(6) = &H65                                            '
  39.   Tab1(7) = &H6E                                            '
  40.   Tab1(8) = &H72                                            '
  41.   Tab1(9) = &H79                                            'xxx
  42.   Tab1(10) = &H6B                                           '
  43.   Tab1(11) = &H20                                           '
  44.   Tab1(12) = &H74                                           '
  45.   Tab1(13) = &H75                                           '
  46.   Tab1(14) = &H20                                           '
  47.   Tab1(15) = &H62                                           '
  48.   Tab1(16) = &H79                                           '
  49.   Tab1(17) = &H6C                                           '
  50.   Tab1(18) = &H13                                           ' xxx
  51.   X = Crc8(tab1(1) , 18)
  52.   Tab1(19) = X
  53.  
  54.   Tab2(1) = &H10                                            'xxx
  55.   Tab2(2) = &H68                                            '
  56.   Tab2(3) = &H65                                            '
  57.   Tab2(4) = &H6A                                            '
  58.   Tab2(5) = &H21                                            'xxx
  59.   X = Crc8(tab2(1) , 5)
  60.   Tab2(6) = X
  61.  
  62. Do
  63.  
  64. Select Case Czas
  65. Case 5 :
  66. If Flaga.0 = 0 Then
  67. Printbin Tab1(1) ; 19
  68. Flaga.0 = 1
  69. End If
  70.  
  71. Case Is >= 10 : Printbin Tab2(1) ; 6
  72. Czas = 0
  73. Flaga.0 = 0
  74. 'Case Else : Print "czas: " ; Czas
  75. End Select
  76.  
  77. Loop
  78. End
  79.  
  80. Timer1_ISR:
  81.    load timer1, Timer1Reload
  82.   Incr Czas
  83.  
  84.  
  85.   Return
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Transmisja danych RS485_RS422

Post autor: Henryk » 09 sty 2019, 9:59

Witam :D
Dziękuje Pikaczu za usprawnienie moich wypocin ;)
Jest mały kłopot z użyciem timer1 , jest zajęty generowaniem sygnału PWM w docelowym " kombajnie "/przyrządzie , przepraszam mój błąd .
Zrobię tak , uzupełnię mój pierwotny kod o istotne linijki i sprawdzę czy będzie to działać ;) jeśli nie , to zbuduję osobne urządzenie , czego wolał bym uniknąć .
Plak potrafi ! , coś się wykombinuje :D jeszcze raz dziękuje .
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Transmisja danych RS485_RS422

Post autor: Henryk » 09 sty 2019, 17:51

Zrobiłem test , moje nie działa :( Pikaczu program działa , tylko wysyłane dane nie pasują do oryginalnej transmisji .
Wygląda na to , że z tablicy nie mogę tego wysyłać , w terminalu dane oryginalne są odbierane tak:
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka
1 bajt............................................19 bajt pierwsza paczka
1 bajt...............6 bajt druuga paczka itd. cyklicznie powtarzane .

Jednym ciągiem to chyba tylko sring,a tak można wysłać , brak mi pomysłu .
Awatar użytkownika
niveasoft
Posty: 1221
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Transmisja danych RS485_RS422

Post autor: niveasoft » 09 sty 2019, 18:11

Na drugi raz spróbuj napisać bardziej "po polsku" ahahahaha bo ja nic nie zrozumiałem z tego oprócz "Pikczu program działa a mój nie"

No więc Pikczu użył Printbin
Printbin ma taką właściwość, że można napisać Printbin Tablica(3) i jesli Twoja tablica ma zadeklarowane 20 bajtów to wyśle siedemnaście bo zacznie wysyłać od trzeciego aż do końca. Drugą własciwością Printbin jest to że można mu napisać ile ma wysłać więc Printbin Tablica(3); 5 wyśle Tablica(3) do Tablica(7).

Ci innego jest z Print

Jeśli chcesz to wysłać tak jak sobie napisałeś to powinieneś użyć pomocniczej zmiennej i wysłać to w "tym stylu":
  1.  For N = 1 To 19
  2.   Print Tablica(n);                                         'srednik nie wysyła entera za każdym printem
  3.  Next
  4.  'Print ""                                                   'jeśli chcesz mieć na końcu Enter
  5.  Waitms 100
  6.  For N = 1 To 6
  7.   Print Tablica2(n);
  8.  Next
  9.  'Print ""                                                   'jeśli chcesz mieć na końcu Enter
Twój kod nie powinien w ogóle sie skompilować..podejrzewam tu jakąś starą, spolszczoną wersję Bascom typu EDW

Co do sumy kontrolnej to jest tyle odmian że to nie musi być to co Ty ustawiasz na końcu.
Proponowałbym napisanie sobie programu i przetestowanie w symulatorze. Czyli wpisujesz 18 bajtów danych które odczytujesz tam na żywca i Bascomowi/Twojemu programowi policzenie z tego sumy kontrolnej i wyświetlenie 19nastego bajtu ;) . Zdziwiłbym się gdyby to było proste CRC. Pewnie się będzie różnił od tego co widzisz jako bajt nr19.
ODPOWIEDZ