Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Pytania, kody i porady dotyczące nie tylko Bascom.
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: Zbyszek » 08 cze 2026, 18:45

Piszesz w nowym Bascom. Ja mam Bascom 2.0.7.5
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: niveasoft » 08 cze 2026, 19:00

To nie ma znaczenia dla tak prostej aplikacji.
Jak nie zadziała Config Print0 to to machnij tym sposobem z Waitms 3. Nadawaniem steruje się tylko przy nadawaniu a Ty nadajesz jedną komendę.
Wyobraź sobie taką aplikację na klika tysięcy linii to by się człowiek zdenerwował jakby musiał tym pinem sterować ręcznie :lol:
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: Zbyszek » 08 cze 2026, 19:29

Niestety, w dolnej linii nic nie wyświetla. Ale mam trochę bogatszą wersję z opcją TIMEOUT i MODBUS ERROR, i w niej też wprowadziłem poprawki o których mówiłeś ale też po starcie wyświetla logo "MODBUS 2012H" i zaraz potem wyświetla się TIMEOUT ale jak spinam i rozpinam wtyczkę od licznika ( tą od RS485 ) to czasami mrugnie MODBUS ERROR i zaraz potem TIMEOUT. Kod poniżej

Kod: Zaznacz cały

$regfile = "m328pdef.dat"
$crystal = 16000000
$lib "modbus.lbx"
$baud = 9600
'----- Wyświetlacz
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portc.0
Cursor Off
Cls

'----- RS-485
Config Print0 = Portd.4 , Mode = Set
Rs485dir Alias Portd.4
Config Rs485dir = Output
Rs485dir = 0

'----- UART
Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8
Open "COM1:" For Binary As #1

Dim Rx(9) As Byte
Dim I As Byte
Dim B1 As Byte , B2 As Byte , B3 As Byte , B4 As Byte
Dim Value As Single
Dim Timeout As Word

Locate 1 , 1
Lcd "MODBUS 2012H"

Do

    ' Wysyłamy zapytanie Modbus: FC03, slave 1, start address 0x2006, 2 rejestry = 4 bajty
Set Rs485dir
Waitms 3

Print #1 , Makemodbus(1 , 3 , &H2012 , 4)

Reset Rs485dir
Waitms 3
                                                       ' Odbiór z timeoutem (500ms)
    I = 1
    Timeout = 0
    Do
        If Ischarwaiting(#1) > 0 Then
            Rx(i) = Waitkey(#1)
            I = I + 1
        Else
            Waitms 5
            Timeout = Timeout + 5
        End If
        If Timeout > 500 Then Exit Do
    Loop Until I > 9

    ' Sprawdzenie czy odebrano pełną ramkę
    If I > 9 Then
        ' Sprawdzenie funkcji i długości danych
        If Rx(2) = 3 And Rx(3) = 4 Then
            Rx(2) = 0
            Rx(3) = 0
            B1 = Rx(4)
            B2 = Rx(5)
            B3 = Rx(6)
            B4 = Rx(7)

            Dim Tempsingle As Single
            ' Składamy 4 bajty w Single (float)
            Poke Varptr(tempsingle) , B1
            Poke Varptr(tempsingle) + 1 , B2
            Poke Varptr(tempsingle) + 2 , B3
            Poke Varptr(tempsingle) + 3 , B4

            Value = Tempsingle

            Cls
            Locate 1 , 1
            Lcd "Reg 2012H:"
            Locate 2 , 1
            Lcd Fusing(value , "0.00")
        Else
            Cls
            Locate 1 , 1
            Lcd "MODBUS ERROR"
        End If
    Else
        Cls
        Locate 1 , 1
        Lcd "TIMEOUT"
    End If

    Waitms 500

Loop
End
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: niveasoft » 08 cze 2026, 19:36

Jeśli używasz sterowania ręcznego to powinieneś zaremować lub usunąc ten Config Print bo teraz Bascom jeszcze prze Tobą ustawia ten kierunek z powrotem w stan niski i dopiero potem czeka 3ms.

Próbowałeś zamienić przewody A z B? Linia ma mniej niż 100m? Powyżej 100m to tam jest potrzebny rezystor terminujący 120R
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: Zbyszek » 08 cze 2026, 19:43

Usunięcie linii Config Print nic nie daje tak jak odwrócenie przewodów choć podłączone jest oki. Skrętka ma około 10 metrów i rezystor terminujący też mam dołączany za pomocą zworki.
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: Zbyszek » 08 cze 2026, 20:02

Zrobiłem jeszcze jeden myk, połączyłem ze sobą dwie diody LED o różnych kolorach ( czerwoną i zieloną ) równolegle, ale w przeciwnych kierunkach (katoda jednej diody do anody drugiej) w szereg dodałem rezystor ograniczający prąd o wartości 470 Ω. Wolny koniec rezystora wpiąłem do linii A, a wolny koniec diod do linii B. Przy braku transmisji diody nie powinny świecić, a kiedy na szynie pojawia się transmisja różnicowa, diody powinny migać naprzemiennie w rytm wysyłanych danych, a u mnie obie diody migają na raz, czy licznik jest podpięty czy nie ... ale jak zwięszyłe te twoje waitms 3 na waitms 500 to wtedy widać że świeci czerwona , potem jest wysyłane Print #1 , Makemodbus(1 , 3 , &H2012 , 4) i gaśnie czerwona a mignie tylko zielona ... to tak jak by ci coś to miało zasugerować
Ostatnio zmieniony 08 cze 2026, 20:10 przez Zbyszek, łącznie zmieniany 1 raz.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: niveasoft » 08 cze 2026, 20:08

To jest jakieś Arduino czy sam procesor? Pytam bo wygląda jakby totalnie nic nie odbierał. Tak sie dzieje jak ktoś Arduino zasila przez złącze USB. Jak jest Arduino i chcesz użyć seriala to trzeba go zasilić osobno 5V tam gdzie ma taki pin albo przez programator.

Diody lepiej podłącz sobie pomiędzy 5V a TX i RX. Stanem aktywnym w komunikacji po serialu jest stan niski więc powinny migac przy nadawaniu i odbieraniu.
Jak by coś odbierał to możesz zobaczyć co. na przykład na próbę zrobić tak:
  1.   I = 1
  2. Locate 1, 1
  3.     Do
  4.         If Ischarwaiting(#1) > 0 Then
  5.             Rx(i) = Waitkey(#1)
  6.       Lcd Hex(Rx(i))
  7.             I = I + 1
  8.         End If
  9.     Loop Until I > 9]
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: Zbyszek » 08 cze 2026, 20:59

Wywala mi błąd 242 " zmienna źródłowa nie pasuje do zmiennej docelowej" jak dobrze tłumaczę. To nie arduino. To solidnie polutowany pająk na płytce ze stabilnym zasilaniem.
... usunąłem nawias kwadratowy w linii Loop Until I > 9] i wyświetlił w pierwszej linii 0001030445D072C0 i jak wciskam reset atmegi to za każdym razem wyświetla coś innego. czasami jest to 14 a czasami 16 znaków. przy odłączonym liczniku zawsze jest 00FC00
Ostatnio zmieniony 08 cze 2026, 21:13 przez Zbyszek, łącznie zmieniany 1 raz.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: niveasoft » 08 cze 2026, 21:07

To mi sie kompiluje bez błędów
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $baud = 9600
  4. $lib "modbus.lbx"
  5.  
  6. Config Lcd = 16x2
  7. Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portc.0
  8. Cursor Off
  9. Cls
  10.  
  11. Config Portd.4 = Output : Reset Portd.4 : Rs485dir Alias Portd.4
  12.  
  13. Config Print0 = Portd.4 , Mode = Set
  14.  
  15. Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8
  16.  
  17. Open "COM1:" For Binary As #1
  18.  
  19. Dim Rx(9) As Byte
  20. Dim I As Byte
  21. Dim B1 As Byte , B2 As Byte , B3 As Byte , B4 As Byte
  22. Dim Value As Single
  23.  
  24. Locate 1 , 1
  25. Lcd "MODBUS 2012H"
  26.  
  27. Do
  28.  
  29.     Print #1 , Makemodbus(1 , 3 , &H2012 , 4)               ' wysyłam zapytanie Modbus: FC03, slave 1, start address 0x2012, 2 rejestry = 4 bajty
  30.  
  31.                                                               ' i czekam na odpowiedź (slave, func, bytecount, 4 dane, 2 CRC = 9 bajtów)
  32.     I = 1
  33.     Locate 1 , 1
  34.     Do
  35.         If Ischarwaiting(#1) > 0 Then
  36.             Rx(i) = Waitkey(#1)
  37.             Lcd Hex(rx(i))
  38.             I = I + 1
  39.         End If
  40.     Loop Until I > 9
  41.  
  42.                                                               ' Sprawdzenie poprawności odpowiedzi
  43.     If Rx(2) = 3 And Rx(3) = 4 Then
  44.         B1 = Rx(4)
  45.         B2 = Rx(5)
  46.         B3 = Rx(6)
  47.         B4 = Rx(7)
  48.  
  49.         Dim Tempsingle As Single
  50.         Poke Varptr(tempsingle) , B1
  51.         Poke Varptr(tempsingle) + 1 , B2
  52.         Poke Varptr(tempsingle) + 2 , B3
  53.         Poke Varptr(tempsingle) + 3 , B4
  54.  
  55.         Value = Tempsingle
  56.  
  57.         Cls
  58.         Locate 1 , 1
  59.         Lcd "Reg 2012H:"
  60.         Locate 2 , 1
  61.         Lcd Fusing(value , "0.00")
  62.     End If
  63.  
  64.     Waitms 500
  65.  
  66. Loop
  67. End
A co z LED`ami? Przeniosłeś na RX TX?
W której linii masz ten błąd?
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU

Post autor: Zbyszek » 08 cze 2026, 21:15

poprawiłem post wyżej. Ja na 22 muszę gnać do pracy, sprawdzę jeszcze ostatni twój kod i resztę powalczymy jutro. diody wlutuję rano.
ODPOWIEDZ