Atmega Bascom odczyt rejestru po RS485 Modbus RTU
-
Zbyszek
- Posty: 96
- Rejestracja: 30 lis 2017, 17:12
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
Piszesz w nowym Bascom. Ja mam Bascom 2.0.7.5
- niveasoft
- Posty: 1313
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
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
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
-
Zbyszek
- Posty: 96
- Rejestracja: 30 lis 2017, 17:12
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
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- niveasoft
- Posty: 1313
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
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
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
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
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.
- niveasoft
- Posty: 1313
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
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:
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:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- I = 1
- Locate 1, 1
- Do
- If Ischarwaiting(#1) > 0 Then
- Rx(i) = Waitkey(#1)
- Lcd Hex(Rx(i))
- I = I + 1
- End If
- Loop Until I > 9]
-
Zbyszek
- Posty: 96
- Rejestracja: 30 lis 2017, 17:12
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
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
... 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.
- niveasoft
- Posty: 1313
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Atmega Bascom odczyt rejestru po RS485 Modbus RTU
To mi sie kompiluje bez błędów
A co z LED`ami? Przeniosłeś na RX TX?
W której linii masz ten błąd?
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $baud = 9600
- $lib "modbus.lbx"
- Config Lcd = 16x2
- Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portc.0
- Cursor Off
- Cls
- Config Portd.4 = Output : Reset Portd.4 : Rs485dir Alias Portd.4
- Config Print0 = Portd.4 , Mode = Set
- 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
- Locate 1 , 1
- Lcd "MODBUS 2012H"
- Do
- Print #1 , Makemodbus(1 , 3 , &H2012 , 4) ' wysyłam zapytanie Modbus: FC03, slave 1, start address 0x2012, 2 rejestry = 4 bajty
- ' i czekam na odpowiedź (slave, func, bytecount, 4 dane, 2 CRC = 9 bajtów)
- I = 1
- Locate 1 , 1
- Do
- If Ischarwaiting(#1) > 0 Then
- Rx(i) = Waitkey(#1)
- Lcd Hex(rx(i))
- I = I + 1
- End If
- Loop Until I > 9
- ' Sprawdzenie poprawności odpowiedzi
- If Rx(2) = 3 And Rx(3) = 4 Then
- B1 = Rx(4)
- B2 = Rx(5)
- B3 = Rx(6)
- B4 = Rx(7)
- Dim Tempsingle As Single
- 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")
- End If
- Waitms 500
- Loop
- End
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
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.
