Cześć,
od kilku dni próbuję odczytać dane z licznika energii Chint DTSU666 za pomocą mikrokontrolera ATmega328P i BASCOM-AVR przez protokół Modbus RTU.
Używany sprzęt:
Mikrokontroler: ATmega328P
Komunikacja: RS485 (półdupleks)
Licznik: Chint DTSU666 (adres slave ustawiony na 2)
Wyświetlacz: LCD 20x4 na ekspanderze I2C PCF8574
Opis problemu:
Licznik odpowiada na zapytania Modbus RTU, jednak zawsze zwraca same zera. Niezależnie od tego, jaki rejestr próbuję odczytać (napięcie, prąd, moc, częstotliwość), wartość po złożeniu do zmiennej Single wynosi 0.0.
Co ważne — ten sam efekt występuje również przy użyciu zewnętrznego programu "modbus master". Czyli problem nie dotyczy tylko mojego kodu w BASCOMie.
Przykładowe ramki z programu "modbus master":
Wysłane (TX):
01 03 00 00 00 08 44 0C
Odebrane (RX):
01 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E4 59
Licznik odpowiada poprawnie (prawidłowa długość ramki i suma kontrolna), ale wszystkie 8 odczytanych rejestrów zawierają same zera.
Przykładowy kod odczytu w BASCOM-AVR:
Używam standardowej funkcji do odczytu wartości float (2 rejestry holding):
basic
Funkcja Read_float odczytuje dwa kolejne rejestry i składa je do zmiennej typu Single za pomocą instrukcji Poke.
Pytanie:
Dlaczego licznik Chint DTSU666 zwraca same zera przez Modbus RTU?
Czy w tym modelu dane pomiarowe są domyślnie niedostępne i trzeba najpierw ustawić jakieś parametry (np. przekładnie CT/PT)?
Czy może licznik zwraca dane tylko po stronie wtórnej i należy je przemnażać przez ustawione przekładnie?
Będę wdzięczny za wszelkie wskazówki i sugestie.
od kilku dni próbuję odczytać dane z licznika energii Chint DTSU666 za pomocą mikrokontrolera ATmega328P i BASCOM-AVR przez protokół Modbus RTU.
Używany sprzęt:
Mikrokontroler: ATmega328P
Komunikacja: RS485 (półdupleks)
Licznik: Chint DTSU666 (adres slave ustawiony na 2)
Wyświetlacz: LCD 20x4 na ekspanderze I2C PCF8574
Opis problemu:
Licznik odpowiada na zapytania Modbus RTU, jednak zawsze zwraca same zera. Niezależnie od tego, jaki rejestr próbuję odczytać (napięcie, prąd, moc, częstotliwość), wartość po złożeniu do zmiennej Single wynosi 0.0.
Co ważne — ten sam efekt występuje również przy użyciu zewnętrznego programu "modbus master". Czyli problem nie dotyczy tylko mojego kodu w BASCOMie.
Przykładowe ramki z programu "modbus master":
Wysłane (TX):
01 03 00 00 00 08 44 0C
Odebrane (RX):
01 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E4 59
Licznik odpowiada poprawnie (prawidłowa długość ramki i suma kontrolna), ale wszystkie 8 odczytanych rejestrów zawierają same zera.
Przykładowy kod odczytu w BASCOM-AVR:
Używam standardowej funkcji do odczytu wartości float (2 rejestry holding):
basic
Call Read_float(&H2006 , Ua)
Ua = Ua * 0.1 ' Napięcie fazy A
Call Read_float(&H200C , Ia)
Ia = Ia * 0.001 ' Prąd fazy A
Call Read_float(&H2014 , Pa)
Pa = Pa * 0.1 ' Moc fazy A
Funkcja Read_float odczytuje dwa kolejne rejestry i składa je do zmiennej typu Single za pomocą instrukcji Poke.
Pytanie:
Dlaczego licznik Chint DTSU666 zwraca same zera przez Modbus RTU?
Czy w tym modelu dane pomiarowe są domyślnie niedostępne i trzeba najpierw ustawić jakieś parametry (np. przekładnie CT/PT)?
Czy może licznik zwraca dane tylko po stronie wtórnej i należy je przemnażać przez ustawione przekładnie?
Będę wdzięczny za wszelkie wskazówki i sugestie.