• 1
  • 2
  • 3
  • 4
  • 5
  • 14
Най - вълнуващия въпрос зимно време.
stan4o333 - специалист
Не мога да разбера как да нулирам грешка когато се появи без да ходя до горелката, което ме дразни повече от всичко. Според мен не може да не е оставена такава вратичка в контролера. За сега закърпих положението с управляем контакт ама не ме кефи така !!!
AviRad - напреднал
Сумата от твоя пример излиза абсолютно точно по описания от мен алгоритъм https://en.wikipedia.org/wiki/Checksum# ... arity_word.

Код: Избери всички

Orig:   0x1D 0x16 0x14 0x13 0x09 0x2C 0x1A 0x07 0x1E 0x09 0x09 0x13 0x0B 0x0C 0x0D 0x0E 0x0F 0x47 0x44 0x3A 0x93 0xC2 0x1D 0x16 0x45 0x1A 0x19 0x1A 0x1B 0x67
             0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C
Denorm: 0x1D 0x16 0x13 0x11 0x06 0x28 0x15 0x01 0x17 0x01 0x00 0x09 0x00 0x00 0x00 0x00 0x00 0x37 0x33 0x28 0x80 0xAE 0x08 0x00 0x2E 0x02 0x00 0x00 0x00 0x4B
Sum = 4B (0x67 - 0x1C)
Мерси за изпратената програма. Аз очаквах да е код за да разгледам и видя някоя и друга идея, а и да погледна защо при теб се различава сметката.
stan4o333 - специалист
Ще ти изпратя и сорса въпреки че не е интересен ( нахвълян е набързо) , по интересна е идеята. Пускам го ако може и някой друг да се включи, повече глави винаги е по добре , а и аз нямам много време за съжаление.


Orig: 0x1D 0x16 0x14 0x13 0x09 0x2C 0x1A 0x07 0x1E 0x09 0x09 0x13 0x0B 0x0C 0x0D 0x0E 0x0F 0x47 0x44 0x3A 0x93 0xC2 0x1D 0x16 0x45 0x1A 0x19 0x1A 0x1B 0x67
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C
Denorm: 0x1D 0x16 0x13 0x11 0x06 0x28 0x15 0x01 0x17 0x01 0x00 0x09 0x00 0x00 0x00 0x00 0x00 0x37 0x33 0x28 0x80 0xAE 0x08 0x00 0x2E 0x02 0x00 0x00 0x00 0x4B
Sum = 4B (0x67 - 0x1C)


Въпреки че като разгледах сега, ако ти генерираш пакета ( нямаш го готов като в примера ) имаш 2 неизвестни. т.е знаеш само 0x1C

Не можеш да получиш 0x4B защото то се получава от разликата на 0x67 ( което също не знаеш ) с 0x1C ( единственото което знаеш )


т.е знаеш само 0x1D 0x16 0x14 0x13 0x09 0x2C 0x1A 0x07 0x1E 0x09 0x09 0x13 0x0B 0x0C 0x0D 0x0E 0x0F 0x47 0x44 0x3A 0x93 0xC2 0x1D 0x16 0x45 0x1A 0x19 0x1A 0x1B и искаш да изпратиш валиден пакет как ще изчислиш че е ( 0x67 - чексумата )




Въпроса е когато трябва да го генерираш как ще му изчислиш чексумата и го направиш валиден ?


В твоя случай ако смениш
0x16 с 0x17 (първия байт или който и да е) чексумата пак ще е същата ............. а тя не е вече същата !!!





ПП: трябва да спра да пиша когато съм седнал на ракия :-D . Въпроса е, трябва да генерираш пакет с следните стойности

0x1D 0x16 0x14 0x13 0x09 0x2C 0x1A 0x07 0x1E 0x09 0x09 0x13 0x0B 0x0C 0x0D 0x0E 0x0F 0x47 0x44 0x3A 0x93 0xC2 0x1D 0x16 0x45 0x1A 0x19 0x1A 0x1B как се смята чексумата последния байт ( която незнаеш ) като използваш sum и XОR 0xFF
Последна промяна от stan4o333 на вт яну 17, 2017 7:13 am, променено общо 1 път.
AviRad - напреднал
Всъщност трябваше да уточним, че примера по-горе не е команда, а е отговор от горелката и нашата цел е просто да проверим дали сме получили правилно данните, които тя изпраща към нас и нищо не се е счупило при преноса на данните по серийния порт.
Стъпките за тази проверка са:
1. Получаваме някакви данни от горелката и ги запазваме в масив в паметта.

Код: Избери всички

5A 5A 1D 16 14 13 09 2C 1A 07 1E 09 09 13 0B 0C 0D 0E 0F 47 44 3A 93 C2 1D 16 45 1A 19 1A 1B 67
2. Проверяваме дали първите два байта са 5A 5A.
3. Прочитаме стойността в третия байт (0x1D = 29 байта) и проверяваме колко байта има от там до края на масива. Дължината на данните до края на масива е точно 29 байта, следователно и тази проверка за валидността на данните е успешна и продължаваме нататък.
4. Преминаваме през масива с получените данни и изваждаме от всеки байт стойността на отместването му спрямо началото, като пропускаме хедъра и байта с дължината на данните. Първия байт се намалява с 0, втория байт с 1, третия с 2 и т.н.
Получаваме следния резултат:

Код: Избери всички

1D 16 13 11 06 28 15 01 17 01 00 09 00 00 00 00 00 37 33 28 80 AE 08 00 2E 02 00 00 00 4B
Това са реалните данни, с които ще работим по-нататък. Първият байт от този нов масив е дължината на данните, а последния е чексумата на данните в масива.
5. Обхождаме новия масив, изключвайки последната позиция, и събираме стойността последователно на всеки байт.
1D + 16 + 13 + 11 + 06 + 28 + 15 + 01 + 17 + 01 + 00 + 09 + 00 + 00 + 00 + 00 + 00 + 37 + 33 + 28 + 80 + AE + 08 + 00 + 2E + 02 + 00 + 00 + 00 = 2B4
Вземаме само младшия байт B4 и правим XOR FF. В резултат получаваме 4B.
Сравняваме дали получената стойност е равна на последната позиция в масива. В случая 4B = 4B, значи данните върнати от горелката са валидни и можем да работим по-нататък с тях.
-----------------

Сега да се върнем на твоя пример, който задава режима на горелката и на въпроса ти как можем да сменим нещо в командата и да преизчислим чексумата според това:
Standby/Ch Priority ( 5A 5A - хедър ) ( 04 - размер на данните ) ( 03-поле ) ( 01 - Mode ) ( 02- приоритет ) ( FB - чексума )

Standby/Ch Priority 5A 5A 04 03 01 02 FB

Mode:
Standby - 0x01
AUTO - 0x02
Timer - 0x03

Приоритет:
Ch Priority - 0x02
DHW Priority- 0x03
Paralel Pumps- 0x04
Summer Mode- 0x05
При следенето на комуникацията си видял, че софтуера изпраща на горелката 5A 5A 04 03 01 02 FB.
Разсъжденията са правилни, но само си пропуснал, че трябва стойността на всеки байт след третия, трябва да се увеличи с отместването му спрямо началото. В случая това се отразява на последните три байта 01 02 FB. Реалните стойности са 03 - 00 = 03, 01 - 01 = 00, 02 - 02 = 00 и FB - 03 = F8.
т.е. командата е следната: 5A 5A 04 03 00 00 F8
чексумата, която е генерирал софтуера е F8 и тя се получава пак по познатия начин:
04 + 03 + 00 + 00 = 07
07 XOR FF = F8

Следователно стойностите за двата параметъра на командата запазват реда си, но се изместват малко:
Mode:
Standby - 0x00
AUTO - 0x01
Timer - 0x02

Приоритет:
Ch Priority - 0x00
DHW Priority- 0x01
Paralel Pumps- 0x02
Summer Mode- 0x03

Например ако искаме да изпратим AUTO (0x01) и Ch Priority (0x00), ще трябва да генерираме следното:
5A 5A 04 03 01 00 xx
чексумата е 04 + 03 + 01 + 00 = 08 и след XOR FF получаваме F7
5A 5A 04 03 01 00 F7
Преди да изпратим командата обаче правим корекцията според позицията на всеки байт (+00, +01, +02 и т.н.) и получаваме:
5A 5A 04 03 02 02 FA
Точно това трябва да изпратим по серийния порт и горелката ще го приеме като валидна команда.


Това, което си открил помага наистина много :partyman: Постепенно ще попълним празнините и ще може да се направи нещо работещо.
stan4o333 - специалист
Тук вече съм напълно СЪГЛАСЕН с изчисленията ( ТОВА Е ПРАВИЛНИЯ НАЧИН ) :supz: . Аз обаче ще работя с моя алгоритъм, които е доста по прост , не се налагат толкова операции и работи на 100 % , както се вижда в програмата която съм публикувал. След като изяснихме въпроса даваме смело и безотговорно напред .........
stan4o333 - специалист
16 1 byte Errors:
0x0D - No errors
0x2D - Pellet_Jam
0x0E - IgnitionFail
?x?? - FlameLoss
stan4o333 - специалист
4 byte SwVer: 0x14 -0x01 = 1.3 Version
5 byte Hour : 0x22 - 0x02 = 20 Hour
6 byte Minutes: 0x19 - 0x03 = 16 Min

8 byte day 0x25 - 0x05 = 20 ти
9 byte month 0x07 - 0x06 = Януари
10 byte year 0x1F - 0x07 = 18


Особеност тук е че се взимат директните стойности без да се преобразуват ( BCD код ).
AviRad - напреднал
Ехаа, страшен си!! :shock: Ти направо му разказа играта :)
Не мога да смогна да попълвам документа :D
gnt69 - майстор
Понеже не мога да помогна с нищо на този етап указвам морална подкрепа и виртуална почерпка.
САМО ТАКА. :supz: :supz: :supz: :partyman: :drinkers:
stan4o333 - специалист
Вече имам успешна комуникация с горелката под Linux, което означава че всяко устройство ползващо тази ОС ще може да работи с нея. Мога да подавам команди на горелката и да чета върнатия резултат от нея. Мисля да блъскам всички данни в MySQL и от там да се визуализират на WEB страница.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 14

Тема "Температурен мониторинг GREYKO RB (NPBC)" | Включи се в дискусията:


Сподели форума:

Бъди информиран. Следвай "Направи сам" във Facebook:

Намери изпълнител и вдъхновения за дома. Следвай MaistorPlus във Facebook: