HAPCAN Wizualizator - prośba o dodanie funkcji

Post Reply
RysiekS
Posts: 4
Joined: 07 Mar 2019, 00:50

HAPCAN Wizualizator - prośba o dodanie funkcji

Post by RysiekS »

Witam
Miałbym taką wielką prośbę, o ile jest to możliwe
aby dodać do HAPCAN Wizualizatora wyświetlanie liczb.
Dokładnie - to chodzi o rozszerzenie funkcji takich jak Temp(), Therm() wyświetlających temperaturę,
a mi chodzi o możliwość wyświetlenia w identyczny sposób;

1. np; Liczba()
podaje w 2 zaznaczonych bajtach liczbę i wyświetla liczbę +/- 32767

2. np; Liczbap()
podaję w 1 bajcie liczbę całkowitą, a w 2 bakcie liczbę dziesiatych i wyświetla +/- 127.9
na kształt komunikatu zegara godzina: minuta : sekunda

3. np; Zegar()
wyświetla czas z komunikatu zegara czyli 3 bajty gg:mm:ss

A jak już to i takie coś może się przydać do przedstawienia trybu pracy;
4. np; Tekst()
wyświetla znaki ASCII o numerach zawartych w 4 lub więcej bajtach

Powód mojej prośby ?
- Mam sterowanie rekuperatora i interesuje mnie pełny przegląd jego
parametrów pracy - a tam mam wydatek przepływu powietrza (100 - 400)
sprawność (87.7 ale bez C), obroty wentylatorów (800-3200) oraz spadek ciśnienia
na filtrach (20-300).
Mam też pomiar ciśnienia atmosferycznego (1000), a nie mogę tego w prosty sposób
przedstawić na Hapcan Wizualizator, bo muszę korzystać z wielu ramek, i żonglować bajtami.

Brakuje mi też możliwości odtworzenia połączenia po utracie zasilania przez bramkę,
należy zrobić to ręcznie - Wizualizator nie podejmuje próby nawiązania połączenia po jego utracie.
Można liczyć na pomoc Autorów ?, a może to gdzieś jest zaszyte tylko nie doczytałem ?.

Pozdrawiam
Rysiek S.
Jacek
Posts: 560
Joined: 17 Feb 2007, 18:00

Re: HAPCAN Wizualizator - prośba o dodanie funkcji

Post by Jacek »

Nie sądziłem, że jeszcze ktoś używa HAPCAN Wizualizatora - nie był uaktualniany od 2012 roku.
Mam pytanie odnośnie punktu 1 i 2. W jaki sposób chcesz przerzucić te bajty z rekuperatora na magistralę HAPCAN?
Ad3. Z zegarem pewnie byłby najmniejszy problem.
Ad4. Tryby pracy można by już teraz wyświetlić przy pomocy obiektu Text (dowolny tekst w zależności od ramki na magistrali)
Automatycznego odnawiania połączenia niestety nie ma.
Regards
Jacek
RysiekS
Posts: 4
Joined: 07 Mar 2019, 00:50

Re: HAPCAN Wizualizator - prośba o dodanie funkcji

Post by RysiekS »

Nie sądziłem, że jeszcze ktoś używa HAPCAN Wizualizatora - nie był uaktualniany od 2012 roku.
Dzięki za odpowiedź.
Nie tylko używa ale zaczyna używać - dobre idee są jak widać wieczne ;)
Mam pytanie odnośnie punktu 1 i 2. W jaki sposób chcesz przerzucić te bajty z rekuperatora na magistralę HAPCAN?
Doczytałem że mogę sobie określić typ ramki użytkownika z końca zakresu - więc korzystam z tego -
a w grupach bajtów ramki danych umieszczam liczby tj; 1,2 - 3,4 - 5,6 - 7,8
czyli mogę przekazać w jednej ramce max. 4 liczby.
Następne liczby przekazuję w kolejnych typach ramek.
Rekuperator wysyła na szynę CAN kolejne typy ramek co np. 1 sekundę.
W ten sposób zbieram wszystkie dane do wyświetlenia.
Czyli 11 liczb - do przedstawienia stanu pracy - w ciągu 4 sekund - 4 ramki.
To jest tablica synoptyczna więc nie muszę mieć wszystkiego w trybie rzeczywistym.
Natychmiast to na kolejnym typie ramki wysyłam przyciski sterujące,
a rekuperator natychmiast odpowiada o stanie tego przycisku - trybie pracy.
Opisany tu sposób realizacji poszczególnych zdarzeń można zoptymalizować
pod kątem obciążenia sieci, ale tak to działa teraz.

Co do wyświetlania liczb to problem został rozwiązany w sposób następujący;
(pisząc post powyżej miałem "poważne" :) trudności przy korzystaniu z Borland Buildera,
na usprawiedliwienie nadmienię że jest to moja 1 kompilacja w życiu - programu w C )

Plik main.cpp linia 635 kodu źródłowego - procedura teraz wygląda tak;

Code: Select all

//---------------------------------------------------------------------------
void __fastcall ReadTextFunction(void)
{
        //read temperature
        if(TmpString == "Temp()")
        {
           byte MSB = BufferIn[7];
           byte LSB = BufferIn[8];
           if((BufferIn[7] & 0x80) == 0x80)             //negative
           {
              WORD TEMP = MSB*256+LSB;
              TEMP = ~TEMP+1;
              MSB = TEMP/256;
              LSB = TEMP;
              TmpString = "-"+IntToStr(MSB*16+(LSB/16))+"."
              +IntToStr((LSB&0x0F)*625/1000)+"°C";
           }
           else                                         //positive
           {
              TmpString = IntToStr(MSB*16+(LSB/16))+"."
              +IntToStr((LSB&0x0F)*625/1000)+"°C";
           }
        }
        if(TmpString == "Therm()")
        {
           if((BufferIn[9] & 0x80) == 0x80)             //negative
           {
              BYTE THERM = BufferIn[9];
              THERM = ~THERM+1;
              TmpString = "-"+IntToStr(THERM)+"°C";
           }
           else                                         //positive
              TmpString = IntToStr(BufferIn[9])+"°C";
        }
        //================= dodano ====================================
        //================= dodano ====================================
        if(TmpString == "Liczba()")
        {
           byte MSB = BufferIn[7];
           byte LSB = BufferIn[8];

              WORD TEMP = MSB*256+LSB;
              TmpString = IntToStr(TEMP)+ '.';

        }
        else if(TmpString == "Tekst()")
        {
           TmpString = String(char(BufferIn[7])) +  char(BufferIn[8])
                + char(BufferIn[9]) + char(BufferIn[10]) + char(BufferIn[11]);

        }
        else if(TmpString == "Zegar()")
        {
           WORD GODZ = BufferIn[9];
           WORD MIN = BufferIn[10];
           WORD SEK = BufferIn[11];
           TmpString = IntToStr(GODZ) + ':' + IntToStr(MIN) + ':' + IntToStr(SEK);
        }
        //================= dodano ====================================
        //================= dodano ====================================

}
//---------------------------------------------------------------------------
I uzyskuję zamierzony efekt.
Może tylko kolega spojrzy na to czy wszystko poprawnie zrobione.
Ewentualnie jak przerobić zegar z wyświetlaniem 0 przed jednocyfrową wartością,
aby godzina nie była taka --> 12:5:7 tylko 12:05:07
Automatycznego odnawiania połączenia niestety nie ma.
To teraz tu mam do kolegi prośbę jak można - opiszę to w następnym poście,
bo chciałbym to szczegółowo przedstawić, a teraz nie mogę do tego usiąść.

Pozdrawiam.
Rysiek S.
Jacek
Posts: 560
Joined: 17 Feb 2007, 18:00

Re: HAPCAN Wizualizator - prośba o dodanie funkcji

Post by Jacek »

Godzinę można wyświetlić poniższym kodem:

Code: Select all

        else if(TmpString == "Zegar()")
        {
           TmpString = IntToStr((BufferIn[9]&0xF0)>>4)+IntToStr(BufferIn[9]&0xF)      //hour
                  +":"+IntToStr((BufferIn[10]&0xF0)>>4)+IntToStr(BufferIn[10]&0xF)    //min
                  +":"+IntToStr((BufferIn[11]&0xF0)>>4)+IntToStr(BufferIn[11]&0xF);   //sec
        }
a w zasadzie linia z sekundami jest niepotrzebna, bo na magistrali pojawia się czas raz na minutę, więc sekundy zawsze sa równe 00.

A tak powinna wyglądać konfiguracja obiektu Text wyświetlającego czas:
Untitled.png
Untitled.png (10.6 KiB) Viewed 6368 times
Regards
Jacek
RysiekS
Posts: 4
Joined: 07 Mar 2019, 00:50

Re: HAPCAN Wizualizator - prośba o dodanie funkcji

Post by RysiekS »

Dzięki.
Po analizie doszedłem do wniosku że to jest jednak system 10, a nie 16
i wyszło coś takiego;

Code: Select all

        else if(TmpString == "Zegar()")
        {
           TmpString = IntToStr(BufferIn[9])      //hour
           +":"+IntToStr((BufferIn[10]/10))+IntToStr( BufferIn[10]-((BufferIn[10]/10)*10) )   //min
           +":"+IntToStr((BufferIn[11]/10))+IntToStr( BufferIn[11]-((BufferIn[11]/10)*10) );  //sec
        }
Działa.
A jak już idzie ramka 8 bitów dopisalem date i dzien tygodnia;

Code: Select all

        else if(TmpString == "Dzien()")  // 5 miesiac, 6-dzien, 7 dzien_tygodnia
        {
             switch (BufferIn[7])
                {
                case 0:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " niedziela"; break;
                case 1:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " poniedziałek"; break;
                case 2:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " wtorek"; break;
                case 3:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " sroda"; break;
                case 4:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " czwartek"; break;
                case 5:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " piatek"; break;
                case 6:
                        TmpString = IntToStr(BufferIn[6]) + '-' + IntToStr(BufferIn[5]) 
                        + " sobota"; break;
             }
        }
Takie małe pytanie
Czy w systemie - w ramce daty przewidziana jest jakas inna informacja systemowa,
inaczej - czy zapisanie wszystkich bajtów danych tej ramki może powodowac jakieś problemy
w systemie ?
(0) 1 bajt typu
(1) 2 bajt typu
(2) numer modułu
(3) numer grupy
dtąd wszystko zostaje
poniżej dane nadpisane;
1- (4) ->rok
2- (5) ->miesiac
3- (6) ->dzien
4- (7) ->dzien tygodnia
5- (8) ->nic
6- (9) ->godzina
7- (10) ->minuta
8- (11) ->sekunda

Jak doczytałem na teraz to
1,2 bajt ramki - Typ ramki definiujący co jest w polu danych
3 bajt - Numer modułu
4 bajt - grupa modułów
5-12 - bajty danych

i dalej
grupa = 0x01 - przycisk
grupa = 0x02 - przekaźnik
grupa = 0x03 - odbiornik podczerwieni
grupa = 0x04 - czujnik temperatury
grupa = 0x05 - nadajnik podczerwieni
grupa = 0x06 - ściemniacz
grupa = 0x07 - sterownik rolet
grupa = 0x08 - sterownik LED
grupa = 0xFF - typ użytkownika 0xFE, 0xFC, 0xFB, 0xFA .....

Numery modułów to poszczególne urządzenia

Tyle doczytałem, ale nie trafiłem na informację odnośnie
bajtów 1 i 2 - jakie są używane, aby nie kolidowało z moimi urządzeniami.
Czy jest gdzieś taka rozpiska ?

Aktualnie robię coś takiego;
Image

Pozdrawiam
Rysiek S.
Jacek
Posts: 560
Joined: 17 Feb 2007, 18:00

Re: HAPCAN Wizualizator - prośba o dodanie funkcji

Post by Jacek »

Listę używanych typów ramek znajdziesz w opisie bootloader-a (tabela 2).
https://hapcan.com/devices_pl/universal ... -4b_pl.pdf
W międzyczasie powstała jedna nowa ramka:
0x309 - wiadomość sterownika OC (otwarty kolektor)
Dodatkowo Bartek używa 0x4F4 dla hapcanuino.

Ramka zegara kodowana jest w kodzie BCD. Tzn, że 0x10 to godzina 10.
Twój kod "TmpString = IntToStr(BufferIn[9])" wyświeli ją jako 16.
Regards
Jacek
RysiekS
Posts: 4
Joined: 07 Mar 2019, 00:50

Re: HAPCAN Wizualizator - prośba o dodanie funkcji

Post by RysiekS »

Listę używanych typów ramek znajdziesz w opisie bootloader-a (tabela 2).
Ok. Czasem człowiek czyta to co chce przeczytać, a nie to co rzeczywiście jest napisane.
Dzięki za naprowadzenie.
Ramka zegara kodowana jest w kodzie BCD. Tzn, że 0x10 to godzina 10.
Twój kod "TmpString = IntToStr(BufferIn[9])" wyświeli ją jako 16.
To teraz zrozumiałem gdzie popełniłem błąd w rozumowaniu.
Steruję Hacpan-Wizualizatorem z Arduino, więc sam wysatawiam dane zegara,
umknęło mi że dane mogą być wystawiane w BCD, a nie jako liczba w kodzie dwójkowym.

Hacpan-Wizualizator już pracuje w trybie "produkcyjnym" na dwóch ekranach sterowania rekuperatorem,
teraz jestem na etapie dołączania pieca C.O., C.W.U. oraz podlewania trawnika.
Ogólne wrażenie - zaskakująco dobre.
Rysiek S.
Post Reply