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.