f
Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 548

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 549

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/page_header.php on line 343
And-Tech :: Zobacz temat - BASCOM - Modbus RTU błędnie interpretowane ramki

Strona korzysta z plików cookie w celu realizacji usług zgodnie z Politykš prywatnoœci.

Możesz okreœlić warunki przechowywania lub dostępu do cookie w Twojej przeglšdarce lub konfiguracji usługi.

And-Tech Strona Główna And-Tech
Forum firmy And-Tech

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum  DownloadDownload

Poprzedni temat «» Następny temat
BASCOM - Modbus RTU błędnie interpretowane ramki
Autor Wiadomość
chris 

Dołączył: 01 Cze 2015
Posty: 1
Wysłany: Pon Cze 01, 2015 12:54 pm   BASCOM - Modbus RTU błędnie interpretowane ramki

Witam.

Mam problem z protokołem MODBUS RTU na ATMega644, który błędnie interpretuje mi ramki.

Kod w BASCOM wygląda następująco:

Kod:

'* KONFIGRUACJA PROCESORA I ZEGARA
$regfile = "m644pdef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200

'* WCZYTANIE BIBLIOTEKI MODBUS
$lib "modbus.lbx"
Config Print1 = Portb.1 , Mode = Set                        ' Ustawienie pinu zarządzajęcego ruchem

'* KONFIGURACJA KIERUNKU RUCHU DLA MODBUS
Rs485dir Alias Portb.1
Config Rs485dir = Output
Rs485dir = 0

Portb.0 = 1

'* KONFIGURACJA UART

' Złącza UART
'         TX    RX
' COM0   PD.1   PD.0   RS232 dla monitoriwania
' COM1   PD.3   PD.2   RS485 dla MODBUS -  halve duplex
'           PD.4       Sterowanie ruchem w RS485

' Konfiguracja UART0 dla RS232
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

' Konfiguracja UART1 dla RS485/MODBUS.
Config Com2 = 9600 , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0

' Otwarcie UART1
Open "COM2:" For Binary As #1

' Deklaracje zmiennych
Dim Adres As Integer
Dim Ramka As Word
Dim B As Byte

' Uruchomienie programu
Print "Uruchomiono MODBUS"

Do
   If Pinb.0 = 0 Then                                       ' Wywołanie swichem polecenia

      Waitms 500
      Print "SEND >>"

      Adres = 52
      Ramka = 2
      Print #1 , Makemodbus(1 , 3 , Adres , Ramka);
   End If

   If Ischarwaiting(#1) <> 0 Then                           ' Sprawdzamy jakie dane oczekują w buforze
      B = Waitkey(#1)                                       ' Pobranie
      Print Hex(b) ; ",";                                   ' Wyświetlenie
   End If

Loop

End


Czyli standard jaki znajdzie się w podręczniku BASCOM'a.
Na początek kilka informacji, by ewentualnie wyeliminować jakieś wątpliwości:
- procesor jest mocny jak na potrzeby tego programu, ale jego rola, jak i program są znacznie rozbudowane, a 644 to minimum jakie potrzebuje;
- płytka jest kupna, to EvB 5.1 (http://and-tech.pl/zestaw-evb-5-1/) i przy innych projektach nie stanowi problemu, więc to nie problem z wykonaniem prototypu,
- procesor ustawiony tak jak przyszedł z tą płytką - ma wgrany bootloader (to jest problemem?) i standardowe fusebit'y,
- BASCOM, bo korzystam już z tego co mam kiedyś napisane i raczej nie chciałbym tego przepisywać na inny język, a komunikacja MODBUS to ostatnia rzecz jakiej mi brakuje przy tym projekcie.

Płytka komunikuje (a właściwie nie komunikuje się) się z urządzeniem zewnętrznym przy pomocy MODBUS'a. Chciałbym to zrobić wykorzystując MODBUS RTU (teoretycznie zostaje mi jeszcze ASCII),a do zestawu mam podpięty jeszcze skaner nasłuchujący na RS485, by wstawiać własne ramki i nasłuchiwać co się dzieje na magistrali (bez skanera objawy są identyczne).

Prawidłowa ramka w transmisji wygląda następująco:
Kod:

[11:48:43 ---] 01 03 00 34 00 01 C5 C4
[11:48:43  23] 01 03 02 00 02 39 85


Zostawiam znaczniki czasu by było widać co pochodzi ze skanera.
Pierwsza to zapytanie wysłane do urządzenia, z którym chce połączyć mój procesor, druga odpowiedź z urządzenia. Takiej się spodziewałem więc wszystko jest OK - ale to ruch pomiędzy skanerem, a urządzeniem zewnętrznym - czyli urządzenia działają poprawnie, problem więc jest w moim urządzeniu.

Teraz co się dzieje na płytce po wgraniu przedstawionego powyżej programu.
Płytka po wgraniu oprogramowania widzi powyżej wykazane linie jako:
Kod:

01,20,34,01,71,FC,
01,20,00,A0,2A,


Czyli coś się łapie w ramce z oryginału, ale większość to informacji w ramce to śmieci.
Polecenie makebodbus użyte w programie zgodnie z dokumentacją powinno wysłać ramkę:
Kod:

01 03 00 34 00 01 C5 C4

a wysyła:
Kod:

[11:53:16 ---] 01 03 00 34 00 01 C5 C4 00

lub

Kod:

[11:53:16 464] C0 40 34 00 01 C5 C4 00


Jak widać w pierwszym przypadku, wynik jest nawet zbliżony, na końcu dodane są jednak wartości 00, co zważywszy że w ramce jest suma kontrolna całkowicie odpada.

Jak wyślę ramkę w postaci:
Kod:

[12:02:37 ---] 01 FF 00 FF 02 FF 03 FF

jest ona na płytce AVR odczytywana jako:
Kod:

01,00,02,03,


I jeszcze kilka przykładów, opisanych jako wysłana ramka ---> odczytana przez procesor ramka, może komuś pozwoli to na wysunięcie jakiś wniosków:
Kod:

[12:04:15 ---] 01 ---> 01,
[12:06:37 ---] 01 AB ---> 01,F5,
[12:13:15 ---] 01 AB 02 ---> 01,35,
[12:14:19 ---] 01 AB 02 CD ---> 01,35,CD,
[12:15:28 ---] 01 AB 02 CD 03 ---> 01,35,CD,E0,
[12:17:29 ---] 01 AB 02 CD 03 EF ---> 01,35,CD,A0,FF,
[12:19:09 ---] 01 AB 02 CD 03 EF 04 --- 01,35,CD,A0,8F,


Może ktoś wie co tu jest nie tak? Bo ja już chyba poległem, na temacie który wygląda na prosty. Prędkości na RS są prawidłowe, a odebrane wartości nie są losowe, bo za każdym razem są identyczne.

Pozdrawiam wszystkich czytających:
Chris[/code]
 
     
Piotr41

Dołączył: 18 Sty 2010
Posty: 9
Wysłany: Sro Maj 25, 2016 10:31 am   

Problem rozwiązany?
Przykład napisany na szybko:

Kod:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 40

'To bardzo ważna konfiguracja:
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0

'Deklaracja zmiennych
Dim Tab(8) As Byte
Dim Crc As String * 4
Dim Tab8 As String * 2
Dim Tab7 As String * 2


'Dane zapisane w tabeli do wysłania
Tab(1) = &H01
Tab(2) = &H03
Tab(3) = &H00
Tab(4) = &H34
Tab(5) = &H00
Tab(6) = &H01

'Obliczamy CRC16 MODBUS dla danych z tabeli
Crc = Hex(crc16uni(tab(1) , 6 , &HFFFF , &H8005 , 1 , 1))

'odwracamy wynik
Tab7 = Right(crc , 2 )
Tab8 = Left(crc , 2)

'dopisujemy do tabeli
Tab(7) = Hexval(tab7)
Tab(8) = Hexval(tab8)

' wysyłamy kompletną ramkę
Printbin Tab(1) ; 8
End
  
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group