GSM устройство управления котлами Webasto и не только

MaksVV
Offline
Зарегистрирован: 06.08.2015

Сразу скажу что для нормальной отладки нужен юсб клайн адаптер

ZAKHAR
Offline
Зарегистрирован: 12.02.2019

Посмотрел ваш проект  интересная идея. А что по поводу Hydronic не получается было интересно если бы не только Webasto но и Eber работал по диагностике

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

получается. Только времени не хватает доделать все. 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

MaksVV пишет:

получается. Только времени не хватает доделать все. 

Я вот некоторые детальки получил с Китая, так что скоро тоже буду в теме ))) Надо добить протокол по гидроникам,  буду оказывать всяческую помощь ))

MaksVV
Offline
Зарегистрирован: 06.08.2015

на моей машине стоит этот гидропоник, тут проще. Ну я ж вроде всё расшарил по протоколу , забыл только уже. опять заново исслеовать надо.

зЫ. Только твой гидроник древний, там все сильно отличаться может. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Шнурок есть, программа с инженерным режимом тоже, время не хватает ,сегодня по быстрому подцепи на автомобиль, по 3 проводам +,-,w-bus, который на диагностику, всё работает , вебасто запустилась, отчёты пришли, даже 2 шт . почему то, один вебасто он, стартвебосто файл, а второй вебасто он , стартвебасто ок. Температуру по шине не читает .

ZAKHAR
Offline
Зарегистрирован: 12.02.2019

Этот протокол  снят с Hydronica первого покаления  программой Saleae Logic котел запускался  GSM text+ по диагносики

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Не могу понять , как считывается напряжение в бортсети , если в настройкай скетча стоит считывание данных с шины , у меня в ответных смсках , почемуто напряжение питания стоит 0.00 вольт, оно должно по шине читаться или с делителя? 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Dushman7776 не спеши, по шине на данный момент в скетче идёт опрос только пламени , т.е. StartwebastoOK. Все остальное нужно допиливать. То что заработало и увидело реальный запуск это уже гуд. Два отчёта так и должно быть - один должен сразу приходить после отсылки команды на запуск, второй через 6 мин - показывает запустился ли реально котёл или нет. 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Друзья, все предыдущие Gerber файлы были с ошибками. Надеюсь всё исправил. Сейчас я заказал плату китайцам на https://jlcpcb.com  вышло 740 рублей за 5 плат. Посмотрим , что там придёт. Жду с нетерпением. плата v8.8 layout    файлы для заказа в китай gerber8_8

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Почему напряжение в борт сети не показало? Цепи ло пина А7 я проверил.

MaksVV
Offline
Зарегистрирован: 06.08.2015

потому что в логике программы я заложил так. Когда выбран опрос статусов по шине, всё по шине и должно читаться. (см. п 13. инструкции).  Если выбрать чтение статусов по аналогу, что все данные будут собираться силами ардуино (по её датчикам). Другое дело, что я ещё по шине не написал  чтение параметров. Выберете параметры, которые нужны , скоро сделаю. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Я думаю что будет достаточно напряжения , температуры и уровня мощности пламени. И еще как отключить лишние смс , а то на один цикл уходит 3 ответа от устройства, а у меня в тарифе всего 200 штук, потом по 3 руб. за штуку, нужно доп пакет покупать , можете сделать оповещение голосом по звонку, или через интернет, а то трафик сейчас дешовый а смс дорогие стали , сейчас уже нет тарифов без абонентской платы, у меня например в тарифе на симкоме 5гб. трафика и всего 200 минут и 200 см, зато на смартфоне безлимит звонков и 25 гб. и ни одной смс , но за 55 руб . можно подключить безлимит смс, если на смартфоне они мне и могут пригодиться , то на машине они мне безлимитные не нужны.

MaksVV
Offline
Зарегистрирован: 06.08.2015

у меня просьба взять программу WTT с инженернум режимом. См. выше есть ссылка. Подключиться к котлу этой прогой, выставить галочки параметров которые нужны и выложить лог сюда. Нужно знать как ответит котёл. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

должно вроде два смс быть за цикл. Пофиксим. На счёт интернета это дело будущего. Не шарю я в этом пока. MQTT нужно штудировать. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

В суботу попробую логи снять на работе, программа есть.шнурок есть , время нужно найти, может и в пятницу что нибудь получистя. Утром еще попробую посчитаю смски ,может я чего напутал.  К котлу подключатьсяэ в режиме сканирования шины или в режиме управления ? И какие команды посылать на котел.

MaksVV
Offline
Зарегистрирован: 06.08.2015

при подаче команды на старт котла - периодически также шлются команды заспроса параметров. Но можно и просто запрос параметров посылать (например когда котёл выключен, а мы просто ZAPROS посылаем, напряжение или температуру посмотреть). Когда лог будет,  я команды пропишу в скетче

MaksVV
Offline
Зарегистрирован: 06.08.2015

поставь такие галки, вроде самые нужные параметры

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Хорошо , и так по дейсвиям , я подключаюсь программой к котлу , высталяю галки в списке , даю команду на запуск из программы и потом выкладываю сюда файл , я правильно понял ? А то я с этой програмаой не очень знаком , только ошибки там считать или блокировку сбросить, ну еще делал себе резервный файл  прошивки .

MaksVV
Offline
Зарегистрирован: 06.08.2015

всё верно

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот скетч v 3.55  с запросом по шине w-bus  t двигла, напряжения борт сети, запросом режима половинной мощности, запросом флагов работы элементов котла, запросом пламени. Также читаются ошибки

char ver[] = "Firmware 3.55";

//#define debugW_bus        // раскоментировать эту строку для отладки w-bus, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM 
//#define debugSIM800

#include <EEPROM.h>
enum Cells {
ResetNumber_cell,      //0
TimeWebasto_cell,      //1
ProtocolSTART_cell,    //2
StartByte_cell,        //3
ProtocolSTATUS_cell,   //4
Heater_cell,           //5
delta_cell,            //6
TelNumber1_cell =20,  //20
TelNumber2_cell =40   //40
};

#include <Button.h>
Button test;

// для GSM модуля *********************

String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};

bool SaveNumber2 = 0;  // флаг когда необходима запись номера#2, он true
byte isStringMessage = 0; 
byte KTOzapros = 0;
byte KTOreport = 1;

//************************


                                   
//_______Все для цикла void voltmetr()*************
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП


// дефайны входов выходов на соостветствующие пины ************** (плата весий 8.5-8.7)

#define OutWebasto_12V      2  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Dallas_pin          3  // пин шины OneWire для датчиков даллас
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define IGN                 8  // Сюда состояние зажигания
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM           12  // пин ресета GSM подключен к реле, разрывающее питание модуля. 
#define Eng                14  // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED   15  // (А1) пин LED  индикация включенности котла
#define StartButtonpin     16  // (А2) пин тактовой кнопки вкл/выкл котла 
#define DTR                17  // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng           18  // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp  19  // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).  
#define Voltmeter_pin      A7  // пин, которым измеряем напряжение питания
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX             10  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             11  // пин софт TX Arduino для соединения с RX модуля SIM800

/*

#define Dallas_pin          2  // пин шины OneWire для датчиков даллас
#define OutWebasto_12V      3  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define StartEng            8  // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define IGN                10  // Сюда состояние зажигания
#define Eng                11  // Сюда состояние работы ДВС
#define OutWebasto_GndImp  12  // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера). 
#define StatusWebastoLED   13  // пин индикация включенности котла
#define ResetGSM           16  // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля. 
#define StartButtonpin     17  // пин тактовой кнопки вкл/выкл котла 
#define DTR                19  // пин (А5), управляющий энергосберегающим режимом GSM модуля
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        0; // логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
#define GSM_RX             14  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             15  // пин софт TX Arduino для соединения с RX модуля SIM800

*/

#include <SoftwareSerial.h>

#ifndef debugW_bus
      SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx   //UART для соединения с GSM модулем
#else 
      SoftwareSerial DEBUG (GSM_RX, GSM_TX); //Rx, Tx   //UART для соединения с отладкой (используется юсб<->УАРТ вместо SIM800)
#endif



// для шины 1-wire и датчиков DS18B20****************

#include <OneWire.h>    // библиотека для DS18B20
OneWire ds(Dallas_pin); // датчики DS18B20 на нужный пин

enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)

// ниже соответствие адресов датчиков различным температурам (изначально 0х14=20*С)
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC,  0x14}, 
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC,  0x14}, 
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC,   0x14},  
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC,   0x14}
};
byte delta = 50;  // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть. 

// для организации W-BUS и различные таймеры********************

#define K_LINE Serial                  //UART для соединения с шиной котла
#define TX 1    

byte header = 0;          // состояние заголовка 
byte message_size = 0;    // размер тела принимаемого сообщения, кол-во байт

byte j = 2;               // инкремент
byte n = 2;
const byte bufsize = 140;  // размер буфера принятого сообщения
byte buf [bufsize] = {0};  // буфер принятого сообщения
byte checksum = 0;         // контрольная сумма входящего сообщения
uint32_t curmillis = 0;    // снимок системного времени
byte delaybyte_TX = 0 ;    // задержка между байтами отправляемого сообщения 
byte waitbyte_RX = 1;      // задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
uint32_t timerdelay = 0;   // таймер ожидания байт (для успевания заполнения буфера УАРТ)
bool Delay = 0;            // таймер ожидания байт (для успевания заполнения буфера УАРТ)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера

uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались


// ниже строка даже не спрашивайте что это)) это так... кот по клаве прошёл
#define ConstArray(...)  [](void)->size_t{ const byte _[] = { __VA_ARGS__}; return sizeof(_)/sizeof(_[0]); }(),[](void)->const byte *{ const static byte _[] = { __VA_ARGS__}; return _; }()

// команды для котлов ЭВО
byte StartByte = 0x20;
#define HEATER_START          ConstArray (StartByte, 0x3B)
#define HEATER_PRESENCE       ConstArray (0x44, StartByte, 0x00)
#define HEATER_STOP           ConstArray (0x10)
#define HEATER_STATUS_VEVO    ConstArray (0x50, 0x05)
#define HEATER_STATUS_EVO     ConstArray (0x50, 0x30, 0x05, 0x0A, 0x0C, 0x0E, 0x10)
#define HEATER_DTC_REQUEST    ConstArray (0x56, 0x01)
#define HEATER_DTC_ERASE      ConstArray (0x56, 0x03)

// команды для котлов ТТС/TTE
#define START_SESSION   ConstArray (0x81)
#define REQUEST_2A10101 ConstArray (0x2A, 0x01, 0x01)
#define REQUEST_2A10102 ConstArray (0x2A, 0x01, 0x02)
#define REQUEST_2A10105 ConstArray (0x2A, 0x01, 0x05)
#define REQUEST_DTC     ConstArray (0xA1)
#define START_TTC       ConstArray (0x31, 0x22, 0xFF)
#define STOP_TTC        ConstArray (0x31, 0x22, 0x00)


enum ProtocolSTATUS_ {STATUSBUS, ANALOG};                   // возможные протоколы чтения статуса котла
enum ProtocolSTART_  {STARTBUS, IMPULSE, POTENCIAL};        // возможные протоколы запуска котла
enum Heater_  {TTC_E, VEVO, EVO, HYDRONIC};                 // тип котла

byte  ProtocolSTATUS = STATUSBUS; 
byte  ProtocolSTART  = STARTBUS;
byte  Heater         = EVO;

byte w_bus_init = 0;                      //флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для  ЭВО
                                          //                                            либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC 
byte requiredmessage =  1;                //флаг, что отправляем в данный момент поддержание старта, запрос параметров или запрос ошибок
byte StartMessageRepeat = 0;              //количество отправленных сообщений на старт котла
byte StopMessageRepeat =  0;              //количество отправленных сообщений на остановку котла

byte  TimeWebasto = 30;                   //время работы котла, = 30мин
uint32_t EndReportMillis = 0;             //переменная для таймера отправки отчета об успешности запуска котла
uint32_t EndReportEngine = 0;             //переменная для таймера отправки отчета об успешности запуска ДВС
uint32_t Prev_PeriodW_BusMessage = 0;     //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
uint32_t Prev_PeriodW_BusStartStop = 0;   //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 
uint32_t prevdelSMS = 0;                  //переменная для таймера периодического удаления СМС 
uint32_t prevVpit = 0;                    //переменная для таймера периодического измерения напряжения АКБ

//для таймера создания импульса GND - для протокола запуска котла импульсом GND 
uint32_t timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (curmillis-timer)>800


//для таймера  - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
uint32_t  timerStartEng=0; bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500


//для таймера  - старт котла по W-BUS )
uint32_t timerStart_W_BUS=0; bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL

//для таймера инита шины W-BUS
uint32_t timerInit = 0; bool timerInitflag = 0;

//для таймера контроля жив или мертв обмен по W-bus 
uint32_t last_W_bus = 0; bool kotel_zhiv = 0;

//ниже всё для организации ресета GSM модуля, если с ним отсутствует связь****************

uint32_t  prevReset=0;           // для таймера периодичности проверки (командой "АТ")
byte  intervalReset = 2;         // каждые столько мин будет проверка жив ли GSM модуль 
uint32_t  timerWaitOK=0;         // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false;   // для таймера ожидания ответа после посылки команды "АТ"
byte errors=0;                   // количество неответов  от GSM модуля
bool gsmOK = 1;                  // флаг есть связь с GSM модулем или нет
bool resettimer = 0;             // для таймера удерживания реле в режиме сброс питания
uint32_t  resetTimer=0;          // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0;            // количество ресетов GSM модуля для статистики (хранится в еепром)

//**************************

//Основные переменные  
bool webasto = 0;             // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;     // флаг успешного запуска котла
bool report = false;          // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;    // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine =0;               // флаг работает ли ДВС или нет
bool ignition=0;              // флаг включено ли зажигание или нет
bool ohrana=0;                // флаг включена ли охрана или нет
bool trevoga=0;               // флаг включена ли тревога или нет
bool alarmSMS = 0;            // флаг отправлена ли смс о тревоге или нет

bool waterpump = 0;           // флаг работы циркуляционного насоса
bool plug      = 0;           // флаг работы штифта накаливания
bool airfan    = 0;           // флаг работы нагнетателя воздуха
bool fuelpump  = 0;           // флаг работы топливного насоса
bool blowerfan = 0;           // флаг работы вентилятора печки автомобиля
bool ecomode   = 0;           // флаг экорежима 
byte DTC[7] ={0};             // коды неисправностей котла


// СТАРТОВЫЙ ЦИКЛ

void setup() 
{


delay (3500);


test.NO(); 
test.pullUp();
test.duration_bounce       (  50);
test.duration_click_Db     ( 250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
test.duration_press        ( 500);
test.button(StartButtonpin);            // в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
 
pinMode (DopOn,   INPUT_PULLUP); 
pinMode (DopOff,  INPUT_PULLUP); 
pinMode (Sost,    INPUT_PULLUP); 
pinMode (Ohrana,  INPUT_PULLUP); 
pinMode (Trevoga, INPUT_PULLUP); 
pinMode (IGN,     INPUT_PULLUP); 
pinMode (Eng,     INPUT_PULLUP); 
  
pinMode (OutWebasto_12V,     OUTPUT);  digitalWrite (OutWebasto_12V,      LOW);
pinMode (StartEng,           OUTPUT);  digitalWrite (StartEng,            LOW);
pinMode (13,                 OUTPUT);  digitalWrite (13,                  LOW);
pinMode (StatusWebastoLED,   OUTPUT);  digitalWrite (StatusWebastoLED,    LOW);
pinMode (OutWebasto_GndImp,  OUTPUT);  digitalWrite (OutWebasto_GndImp,   HIGH);
pinMode (DTR,                OUTPUT);  digitalWrite (DTR,                 HIGH);  // делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
pinMode (ResetGSM,           OUTPUT);  digitalWrite (ResetGSM,        !RelayON);  // реле ресет на данный момент делаем "неактивно"

#ifndef debugW_bus
   SIM800.begin(19200);           // сериал соединение для gsm модуля
   delay(100);
   NastroykaGSM ();
#else DEBUG.begin(9600);
#endif

TimeWebasto =    EEPROM.read(TimeWebasto_cell);
ProtocolSTART  = EEPROM.read(ProtocolSTART_cell);
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
ResetNumber =    EEPROM.read(ResetNumber_cell);
StartByte =      EEPROM.read(StartByte_cell);
Heater =         EEPROM.read(Heater_cell);
delta  =         EEPROM.read(delta_cell);
for (int i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
for (int i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);

#ifndef debugSIM800
        if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
   else if (Heater == TTC_E) K_LINE.begin(10400);
#else 
K_LINE.begin(9600);
#endif


for (byte i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
digitalWrite (13,0);
}


void loop() {
curmillis = millis();
test.read();

digitalWrite (StatusWebastoLED, webasto);
digitalWrite (13, startWebasto_OK);
//digitalWrite (13, webasto);


//если нажали тактовую кнопку меняем состояние котла на противоположное 
if (test.event_press_short (StartButton)) {
  if (!webasto) {StartWebasto(); report = false;}
  else StopWebasto();
    }

if (ProtocolSTATUS==ANALOG) {if (Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
                             else startWebasto_OK = 0;}

if (ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);

Heater_BUS();

//ниже для таймера старта котла по шине и аналогу 
 
  if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();

//ниже для таймера создания импульса на старт ДВС 

if (timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (!ohrana) alarmSMS = false;

#ifndef debugW_bus
   if (trevoga && !alarmSMS) AlarmSMS ();
   if (gsmOK)readSMS();
   Reset_gsm();
   delSMS();
#endif

WebastoOprosImpulse ();
izmereniya();


}

void izmereniya() { 

if (millis()-prevVpit>7000){

//измерение напряжения борт сети
if (ProtocolSTATUS==ANALOG){
   volt = analogRead(Voltmeter_pin);                      
   vout = (volt * 4.13) / 1024;             
   Vpit = vout / (9700.0/(98930.0+9700.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}  

// ниже измерение датчиков даллас
static bool n=0;        // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();     // сброс шины
        ds.write(0xCC); // обращение ко всем датчикам
        ds.write(0x44); // начать преобразование (без паразитного питания)  
       }
else   {
  for (byte i=0; i<size_arrayTemp; i++){  
    int Temper_ = 20; byte buff[9];
    ds.reset();
    ds.select(DS18B20[i]);
    ds.write(0xBE); // чтение регистров датчиков
    for (byte j=0; j<9; j++) buff[j]=ds.read(); // читаем все 9 байт от датчика
    ds.reset();
    if (OneWire::crc8(buff, 8) == buff[8]){     // если контрольная сумма совпадает 
          if (DS18B20[i][8]==EngineC && ProtocolSTATUS==STATUSBUS){} // если данные берём по шине, то t двигла не мереем
          else {
          Temper_ = buff[0]|(buff[1]<<8);       // читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
          Temper_ = Temper_ / 16;
          if (Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;}
}}}


prevVpit=millis();
}}



int8_t Temper (const byte &addressTemp) {for(byte j=0; j<size_arrayTemp; j++){if(DS18B20[j][8]==addressTemp)return(int8_t)DS18B20[j][9];} return-99;}



void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) StopWebasto();
         }}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 60сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 90000ul) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 




#ifndef debugW_bus
   void NastroykaGSM () {
  digitalWrite (DTR, LOW);      // выводим из спячки GSM модуль
    delay (150);
  SIM800.println(F("AT"));                    //просто AT для разогреву
    delay(250);
  SIM800.println(F("AT+CMGF=1"));             //устанавливает текстовый режим смс-сообщения
    delay(250);
  SIM800.println(F("AT+IFC=0, 0"));           //отключает программный контроль потоком передачи данных
    delay(250);
  SIM800.println(F("AT+GSMBUSY=1"));          //запрет всех входящих звонков
    delay(250);
  SIM800.println(F("AT+CNMI=1,2,2,1,0"));     //включает оповещение о новых сообщениях
    delay(250);
  SIM800.println(F("AT+CMGDA=\"DEL ALL\""));  // удаляем все смс, ки
   delay(1500);
  SIM800.println(F("AT+CSCLK=1"));            //включает энергосберегающий режим 
  delay(150);
  digitalWrite (DTR, HIGH);     // вводим в спячку GSM модуль высоким уровнем на пине DTR
  
}

void startSMS(byte stat) //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
    if (stat==0) stat = KTOreport;
     digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
         delay (150);
     SIM800.print(F("AT+CMGF=1\r"));
         delay(200);
     SIM800.print(F("AT+CMGS=\"")); SIM800.print(TelNumber[stat]); SIM800.println("\""); 
         delay(200);
}



void EndSMS ()
{
   SIM800.println((char)26);                       // Команда отправки СМС
   delay(1500);
   digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   
}

void delSMS ()
{
if (millis() - prevdelSMS > 7200000ul){  //раз в 2 часа 
 digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
    delay (150);
 SIM800.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
 digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   delay (150);

  prevdelSMS = millis();}
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!SIM800.available()) return;
    char currSymb = SIM800.read();
#ifdef debugSIM800 
K_LINE.print (currSymb); 
#endif
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if      (!currStr.compareTo("ZAPROS"))       {SMSzapros();}              // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))    {SMSzaprosTEL();}           // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {ServiceINFO();}            // Передача сервисной информации  по СМС
else if (!currStr.compareTo("GSMResets-0"))  {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}     //сброс счетчика ресетов GSM модуля
else if (!currStr.compareTo("Version"))      {startSMS(isStringMessage);  SIM800.println (ver); EndSMS ();}               //запрос версии ПО

else if (!currStr.compareTo("Webasto-ON"))  { startSMS(isStringMessage); SIM800.println(F("Webasto ")); 
  
           if (!webasto)  {StartWebasto (); KTOreport = isStringMessage;}
           else SIM800.println(F("uzhe ")); SIM800.println (F("vkluchena")); EndSMS();}

                                                            
else if (!currStr.compareTo("Webasto-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Webasto "));  
           if (webasto)StopWebasto ();  // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
           else SIM800.println(F("uzhe "));  SIM800.println(F("otkluchena"));EndSMS();}          

// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
else if (!currStr.compareTo("Engine-ON"))  {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; KTOreport = isStringMessage;} 
           else SIM800.println(F("uzhe ")); SIM800.println(F("start")); EndSMS();}
                                                                                 
else if (!currStr.compareTo("Engine-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
           else SIM800.println(F("uzhe ")); SIM800.println(F("ostanovlen")); EndSMS();}          
              
else if (!currStr.compareTo("Impulse"))   {if (!webasto) {ProtocolSTART = IMPULSE;  EEPROM.write(ProtocolSTART_cell,ProtocolSTART);     
                                            startSMS(isStringMessage); SIM800.println(F("zapusk GND_impulse")); EndSMS();}}

else if (!currStr.compareTo("Startbus"))  {if (!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);  webasto = 0;  
                                            startSMS(isStringMessage); SIM800.println(F("zapusk BUS")); EndSMS();}}

else if (!currStr.compareTo("Potencial")) {if (!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);   
                                            startSMS(isStringMessage); SIM800.println(F("zapusk +12V Potencial")); EndSMS();}}

else if (currStr.endsWith("Status"))   {if (!webasto) {byte st = currStr.toInt(); if (st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);   
                                            startSMS(isStringMessage); SIM800.print (F("Status: "));
                                                                             if (ProtocolSTATUS == 0)SIM800.println(F("BUS")); 
                                                                        else if (ProtocolSTATUS == 1)SIM800.println(F("Analog"));
                                                                        EndSMS();}}    


else if (currStr.endsWith("HeaterType")) {if (!webasto) {byte st = currStr.toInt(); if (st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);   
                                            startSMS(isStringMessage); SIM800.print (F("Heater: "));
                                                                             if (Heater == 0)SIM800.println(F("TTC_E")); 
                                                                        else if (Heater == 1)SIM800.println(F("VEVO"));
                                                                        else if (Heater == 2)SIM800.println(F("EVO"));
                                                                        else if (Heater == 3)SIM800.println(F("HYDRONIC"));
                                                                        EndSMS();}}      
                                                                                                                                              
else if (currStr.endsWith("Delta"))   {if (!webasto) {delta = currStr.toInt(); //
               EEPROM.write(delta_cell, delta);  startSMS(isStringMessage);
               SIM800.print(F("DeltaT: ")); SIM800.print(delta); SIM800.print(F("*C")); EndSMS();}}
                                                                                                                                            

               
else if (currStr.endsWith("min"))   {if (!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>59)  TimeWebasto = 59;
               if (TimeWebasto<=15) TimeWebasto = 15;
               EEPROM.write(TimeWebasto_cell,TimeWebasto);
               startSMS(isStringMessage); SIM800.print(F("Webasto time: ")); SIM800.print(TimeWebasto); SIM800.print(F("min")); EndSMS();}}
               
else if (currStr.endsWith("StartByte")) {byte Z =currStr.toInt(); if (Z>=0x14 && Z<=0x17) StartByte= Z+12;
               startSMS(isStringMessage); SIM800.print(F("StartByte: ")); SIM800.print(StartByte, HEX); SIM800.print(F("h")); EndSMS();}

else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber[1] = "000000000000"; TelNumber[2] = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell,  TelNumber[1][i]); EEPROM.write (i+TelNumber2_cell,  TelNumber[2][i]); }}}

else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F("Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera")); EndSMS();} 

                                                                        

                                                     
else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              
              
else if (isStringMessage==3){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber[1] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[3][i]);}
              startSMS(1); SIM800.println(F("Tel Number#1 is saving in memory"));  SIM800.print("Tel#1: ");  SIM800.println (TelNumber[1]); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
else if (isStringMessage==0) {  if (TelNumber[1]!="000000000000" && !SaveNumber2 && TelNumber[1]!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }    
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 3; for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];} TelNumber[2] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber2_cell, TelNumber[3][i]);}
              startSMS(2); SIM800.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              SIM800.print(F("Tel#1: ")); SIM800.println(TelNumber[1]); SIM800.print(F("Tel#2: "));  SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11)  currStr += String(currSymb);
}



void SMSzaprosTEL(){
  startSMS(isStringMessage);
  PrintNumbers (); 
  EndSMS();                                 
  }


void SMSbalance() {
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
      delay (150);
SIM800.print(F("AT+CMGF=1\r"));
      delay(200);
SIM800.println (F("AT+CUSD=1,\"#100#\""));    // команда на замену на транслит *111*6*2# у МТС 
      delay(1500);  
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
      delay (150);  
                             
     
}


void AlarmSMS() {for (byte i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!")); EndSMS();} alarmSMS = true;}
 
#endif

void PrintNumbers () {for (byte i=0; i<2; i++) {SIM800.print(F("Tel#")); SIM800.print (i+1); SIM800.print(F(" ")); SIM800.println(TelNumber[i+1]);}}

void SMSzapros()

{
#ifndef debugW_bus  
  startSMS(isStringMessage);
  if (isStringMessage == 3){
 
 SIM800.println (F("Tel.number#1 not has been save in memory"));
 SIM800.println (F("For save Tel#1 send SMS command \"WriteNumber1\""));
 PrintNumbers ();
  }
  

  
  
  else {
  
SIM800.print (F("Webasto ")); on_off (webasto);
        if (webasto) { 
           SIM800.print (F("StartWebasto "));
           if (startWebasto_OK) SIM800.println (F("OK"));
           else SIM800.println (F("FAIL"));}
SIM800.print (F("Engine    "));  on_off (engine);
SIM800.print (F("IGN        ")); on_off (ignition);
SIM800.print (F("Ohrana  "));    on_off (ohrana);
     if (trevoga)  SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  SIM800.print(F("Battery: ")); SIM800.print (Vpit,1); SIM800.println(F(" V"));

  SIM800.print(F("Engine:  ")); SIM800.print (Temper(EngineC));  grad ();
 if (ProtocolSTATUS == ANALOG){ SIM800.print(F("Vyhlop:  ")); SIM800.print (Temper(VyhlopC));  grad ();}
  SIM800.print(F("Ulica:     ")); SIM800.print (Temper(UlicaC)); grad ();
  SIM800.print(F("Salon:    ")); SIM800.print (Temper(SalonC));  grad ();  
  SIM800.print(F("EcoMode:  ")); on_off (ecomode);
  SIM800.print(F("Errors:   ")); SIM800.println (DTC[0]);
  
  
 
  }  
   EndSMS();    
#endif                             
}

void on_off (const bool &stat) {if (stat) SIM800.println (F("ON")); else SIM800.println (F("OFF")); }
void grad () {SIM800.println (F("*C")); }

void ServiceINFO(){
       startSMS(isStringMessage);
  SIM800.print(F("StartByte:  "));
       if (ProtocolSTART==IMPULSE)   SIM800.println(F("GND Imp"));
  else if (ProtocolSTART==STARTBUS)  {SIM800.println(F("BUS"));
             if (Heater== VEVO || Heater== EVO) {SIM800.print(F("StartByte: 0x")); SIM800.println (StartByte, HEX);}}
  else if (ProtocolSTART==POTENCIAL) SIM800.println(F("Potencial+12V"));
  
  SIM800.print(F("Status:  "));
       if (ProtocolSTATUS==ANALOG)    SIM800.println(F("ANALOG"));
  else if (ProtocolSTATUS==STATUSBUS) SIM800.println(F("BUS"));
  
  SIM800.print(F("Heater:  ")); 
       if (Heater==TTC_E)     SIM800.println(F("TTC/E"));
  else if (Heater==VEVO)      SIM800.println(F("VEVO"));
  else if (Heater==EVO)       SIM800.println(F("EVO"));
  else if (Heater==HYDRONIC)  SIM800.println(F("HYDRONIC"));
  
  if (ProtocolSTART!=IMPULSE) {SIM800.print(F("Webasto Time: ")); SIM800.print (TimeWebasto); SIM800.println(F("min"));}
  SIM800.print(F("SIM800 Resets: ")); SIM800.println (ResetNumber); 

  if (ProtocolSTATUS==ANALOG) SIM800.print(F("DeltaT:  ")); SIM800.print(delta);SIM800.println(F("*C"));

  if (ProtocolSTATUS==STATUSBUS) {
    SIM800.print(F("BurnFAN   ")); on_off (airfan);
    SIM800.print(F("WaterPUMP ")); on_off (waterpump);
    SIM800.print(F("PLUG      ")); on_off (plug);
    SIM800.print(F("FuelPUMP  ")); on_off (fuelpump);
    SIM800.print(F("Blower    ")); on_off (blowerfan);
    SIM800.print(F("FuelPUMP  ")); on_off (fuelpump);    
SIM800.print (DTC[0]); SIM800.println (F(" Errors:")); 
for (byte i=0; i<DTC[0]; i++) {
  if (DTC[i+1]<=0x0F) SIM800.print(F("0"));
     SIM800.print (DTC[i+1], HEX); 
     if (bitRead(DTC[6], i)) SIM800.println (F(" Active")); 
     else SIM800.println (F(" Passive")); }

    
    }
   EndSMS();    
  
  }

void StartWebasto()
{
 if (ProtocolSTART==IMPULSE){
  
  digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
  timerStart_W_BUS=millis();
  timerenabledStart_W_BUS = true;}

  report = true; EndReportMillis = millis();
  w_bus_init = 1;
}

void StopWebasto()
{
 if (ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (OutWebasto_12V, LOW);
  timerenabledStart_W_BUS = false;}
   report = false;
   w_bus_init = 0;
   
}



void Heater_BUS (){
  
if      (Heater == EVO || Heater == VEVO){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init == 10){
  sendMessage (HEATER_START); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000)  {
    
         if (requiredmessage==1) sendMessage (HEATER_PRESENCE);  
    else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO);
                                  if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO);}
    else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST);  
requiredmessage++; if (requiredmessage > 3) requiredmessage = 1;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  sendMessage (HEATER_STOP);
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }


if (!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=10; }


if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (buf[0]==0x4F){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         else {header = 0; RESETheader_timer=0;}
         }                  

 // длина сообщения
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1]; if (message_size > bufsize) message_size = bufsize;  header = 4;j=2;n=2;checksum = 0;} 

 // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n) {
 buf[j] = K_LINE.read();
 
 if (j<message_size+n-1) checksum^= buf[j]; // подсчёт КС
 
 if (j==message_size+n-1) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
   
for(byte i = 0; i<n; i++) checksum^=buf[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( checksum == buf[message_size+n-1]) {
  
if (Heater == EVO){
    
     if (buf[2]==0xD0 && buf[3]==0x30)                          {
                 if  (buf[4] ==0x05) ecomode = (bool) buf[5];        // получаем состояние эко режима
                 if  (buf[6] ==0x0A) { 
                          airfan    = (bool)buf[7];                  // получаем флаг работы нагнетателя воздуха
                          plug      = (buf[7] & 0x02)>>1;            // получаем флаг работы штифта накаливания
                          fuelpump  = (buf[7] & 0x04)>>2;            // получаем флаг работы топливного насоса
                          waterpump = (buf[7] & 0x08)>>3;            // получаем флаг работы циркуляционного насоса
                          blowerfan = (buf[7] & 0x10)>>4;            // получаем флаг работы вентилятора печки автомобиля
                  
                                     }
                   
                 if  (buf[8] ==0x0C) {for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = buf[9]-50; break;}    }} // получаем температуру антифриза
                 if  (buf[10]==0x0E) {Vpit = (float)(buf[11]<<8|buf[12])/1000.0;}              // получаем напряжение борт сети
                 if  (buf[13]==0x10) {startWebasto_OK = (bool)buf[14]; last_W_bus = millis();} // проверяем наличие пламени                                                
                                                                
                                                                }

     if (buf[2]==0xD6 && buf[3]==0x01) {
      for (byte h = 0; h< sizeof(DTC); h++) DTC[h]=0;
      DTC[0] = buf[4];
      for (byte h = 0; h< buf[4]; h++) {DTC[h+1]=buf[h*3+5]; bitWrite (DTC[6], h+1, (bool) DTC[h*3+6]);}
      
      
      
      }                         
                                                                
                  }

if (Heater == VEVO){
     if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_W_bus = millis();}       // проверяем наличие пламени у VEVO 
                  }
  
  
                                        }   

// если контрольная сумма не совпала: 

//else K_LINE.println("CRC fail!!!" );
  
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
}




}// end EVO VEVO


else if (Heater == TTC_E){



  
if (!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299)  && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>49)   && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
if ( timerInitflag && (millis() - timerInit>24)   && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
if ( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=10;  sendMessage (START_SESSION);}

if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         
         }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==0xF1){ header = 2;} else {header = 0; RESETheader_timer=0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  buf[2]=K_LINE.read(); 
  if (buf[2]==0x51){ message_size = buf[0]; 
  if (buf[0] !=0x80) {header = 4;  message_size&=~0x80; j=3; n=3;}
  else {header = 3; j=4;n=4;}
  if (message_size > bufsize) message_size = bufsize;  checksum = 0;} else {header = 0; RESETheader_timer=0; }
  
                          }  
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
  TIMER_DELAY ;
  buf[3]=K_LINE.read(); 
  message_size = buf[3]; 
  if (message_size > bufsize) message_size = bufsize;  
  checksum = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 buf[j] = K_LINE.read(); 
 if (j<message_size+n) checksum+= buf[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  

for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты

//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}

 // если контрольная сумма верна: 
if (buf[message_size+n] == checksum) {
  
//  if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
  
  
  
  
  }   

// если контрольная сумма не совпала: 
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
}

} // end TTC_E

// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}   

if (webasto && millis() - last_W_bus>30000 && ProtocolSTATUS==STATUSBUS) {
startWebasto_OK=0; 
airfan    = 0;
plug      = 0;
fuelpump  = 0;
waterpump = 0;
blowerfan = 0;
for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = -100; break;}}
}



}

#ifndef debugW_bus
void Reset_gsm (){
  if (millis()-prevReset>(unsigned long)intervalReset*60000UL){
  
  digitalWrite (DTR, LOW); delay (150);
  SIM800.println (F("AT")); 
  timerenabledWaitOK = 1; timerWaitOK = millis();
  gsmOK = false;
  prevReset = millis(); }

 if (timerenabledWaitOK && millis()-timerWaitOK>6000) {
    timerenabledWaitOK = 0;
    if (!gsmOK) {
      SIM800.println (F("AT")); timerenabledWaitOK = 1; timerWaitOK = millis();
      errors++; if (errors>4) errors = 4; 
      
      }
}

  
 if (!gsmOK)  { 
  if (SIM800.available()>0){                                   
    char currSymb = SIM800.read(); 
#ifdef debugSIM800 
    K_LINE.print (currSymb); 
#endif           
    if ('\r' == currSymb) {                                      
                                  
       if (!currStr.compareTo("OK")) {   gsmOK = true;  timerenabledWaitOK = 0; errors=0; digitalWrite (DTR, HIGH);}
       currStr = "";                                           
    }
    
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
    
    
    if (errors>=4) Reset();
    
    }



 
 void Reset(){
     
      if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();} 
else if (millis()- resetTimer>6000 ) {
resettimer = 0; 
errors=0; 
ResetNumber++; 
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON); 
delay (3500); NastroykaGSM ();}
             }

#endif


void sendMessage(const size_t size, const byte *command){
 
 if (Heater == TTC_E){
  const byte siZe = size+4;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
    if (i==1) Mes[i] = 0x51;
    if (i==2) Mes[i] = 0xF1;    
    if (i==3) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]);  i++;}}
    if (i!=siZe-1) Checksum+=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
 }
 else if (Heater == EVO || Heater == VEVO){
  const byte siZe = size+3;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) Mes[i] = 0xF4;
    if (i==1) Mes[i]=size+1; 
    if (i==2) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
    if (i!=siZe-1) Checksum^=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
  }
  }

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Класс, осталось залить и проверить , хорошо что я не сильно запрятал сам блок. А зачем нужно вкючение вебасто через сигналку? Понятно что автозапуск двигателя через жсм нужен, а запуск вебасто сигналкой и контроль через жсм по мне не нужная фитча.

MaksVV
Offline
Зарегистрирован: 06.08.2015

нужная, быстрее намного с брелока кликнуть, и смски не тратятся. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Да что то я протупил, но по мне проще один канал на сигналке использовать паралельно кнопки включения . Зачем городить один нанал на включение другой на выключение.

MaksVV
Offline
Зарегистрирован: 06.08.2015

потому что, если вы цепляете девайс к штатному таймеру по впайке к кнопке включения, то часто возникает такая ситуация. Вы кликаете из дома на брелоке допканал. А машина довольно далеко стоит. На брелке у вас , например, пишет что ошибка связи. (А в реальности команда долетела до машины и котёл включился). Вы думаете, что нужно ещё раз кликнуть, раз команда не прошла. Кликаете ещё разок и тем самым уже выключаете котёл и приходите в холодный авто. 

а в моем случае кликаешь до талого, если плохая связь. Хоть одна команда да пройдёт и котёл включится

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Тоже логично, только хотелок ещё много а памяти в ардуино про мини мало, вот вчера ролики смотрел про esp8266, и как ее можно через ардуино иде программировать , там памяти 4 мгб и тактовая частота 80мгц. и прошивку можно по воздуху обновлять, а ещё есть esp32,так там ещё круче ,по ходу можно вообще какой нибудь автобота, робота замутить.

MaksVV
Offline
Зарегистрирован: 06.08.2015

потребление наверное у нее больше. вай фай все таки. В вообще, да, совершенству нет предела

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Там еще и блютуз есть , но главное это не специальный сетевой чип , его можно использовать как ардуино , ещё там много чего есть , а потребление тока там не больше чем ардуино есть куча энергосберегающих режимов , в спячке всего 30мкА.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Скетч 3.55 работает кривовато, температуру двигателя минус 100 градусов, напряжение 4.1 вольт, 3 ошибки , но через команду сервис инфо показывает 1 ошибку 3А замыкание на землю линии LIN, но это бывает когда шнурок подключал. Надо сделать чтобы ошибки можно было слрасывать.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Скетч 3.55 работает кривовато, температуру двигателя минус 100 градусов, напряжение 4.1 вольт, 3 ошибки , но через команду сервис инфо показывает 1 ошибку 3А замыкание на землю линии LIN, но это бывает когда шнурок подключал. Надо сделать чтобы ошибки можно было слрасывать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

будет лог - поправим корявость. Причем лог нужен как от диагностики с котлом, т.е. ещё где галочки нужно было выставлять (выбираем при диагностике W-шина), так и сниф девайса с котлом  (в WTT при этом выбираем монитор W-шины, и WTT цепляем к w-bus, третьим будет). 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Завтра попробую снять лог.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

как выложить логи , я не нашел как добавить файл в сообщение? 

MaksVV
Offline
Зарегистрирован: 06.08.2015

как код вставляй, только под спойлер (вкладка сверху и галка свернуть )

Dushman7776
Offline
Зарегистрирован: 13.01.2019
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 F2 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 1E 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 F2 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 1E 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 EB 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 31 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E8 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 31 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E8 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 2F 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 F6 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Протоколирование включено: 16.02.19 14:57:33
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 2F 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 F6 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 31 06 10 00 12 00 13 01 30 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 4F 75 00 00 E9 
Tx: F4 03 20 3B EC 
Rx: 4F 03 A0 3B D7 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 01 0C 55 0E 30 D4 10 00 12 00 13 01 2F 1D 14 D2 1E 14 D2 1F 00 23 00 24 00 28 73 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 6A 
WST -> MC (342s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 55 0E 2C D8 10 00 12 00 13 02 10 1D 08 6B 1E 08 6B 1F 00 23 C8 24 AD 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 2C 
MC -> PGL2 (3s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 02 10 E6 
Rx: 4F 02 90 DD 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F 58 10 00 12 00 13 03 41 1D 0C EF 1E 0C EF 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 B3 
PGL2 -> CL2 (3s)
Rx: 44 02 90 D6 
Rx: 44 02 90 D6 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 04 44 20 00 94 
Rx: 4F 03 C4 01 89 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F D0 10 00 12 00 13 03 32 1D 1B 9C 1E 1B 9C 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 48 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F D0 10 00 12 00 13 02 C7 1D 1B A3 1E 1B A3 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 BC 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F D0 10 00 12 00 13 02 70 1D 1B A3 1E 1B A3 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 0B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F E4 10 00 12 00 13 02 24 1D 1B A0 1E 1B A0 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 6B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F E4 10 00 12 00 13 01 E8 1D 1B 99 1E 1B 99 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 A4 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F E4 10 00 12 00 13 01 BC 1D 1B A6 1E 1B A6 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 F0 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F E4 10 00 12 00 13 01 96 1D 1B AD 1E 1B AD 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 DA 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F E4 10 00 12 00 13 01 7A 1D 1B 99 1E 1B 99 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 36 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 54 0E 2F E4 10 00 12 00 13 01 65 1D 1B C4 1E 1B C4 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 29 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 03 21 3B ED 
Rx: 4F 03 A1 3B D6 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 09 0C 54 0E 2F BC 10 00 12 00 13 01 55 1D 1D D1 1E 1D D1 1F 00 23 C8 24 00 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 A3 
CL2 -> PGL2 (27s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 54 0E 2C EC 10 00 12 00 13 02 6C 1D 08 35 1E 08 35 1F 00 23 C8 24 AD 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 65 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 53 0E 2D 28 10 00 12 00 13 03 6D 1D 07 EA 1E 07 EA 1F 00 23 C8 24 A6 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 AC 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 53 0E 2D A0 10 00 12 00 13 03 EB 1D 07 E7 1E 07 E7 1F 00 23 C8 24 95 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 91 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 53 0E 2D FA 10 00 12 00 13 04 1E 1D 07 E8 1E 07 E8 1F 00 23 C8 24 8A 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 26 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 53 0E 2D DC 10 00 12 00 13 04 31 1D 07 DC 1E 07 DC 1F 00 23 C8 24 86 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 38 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 23 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 53 0E 2E 4A 10 00 12 00 13 04 38 1D 07 D5 1E 07 D5 1F 00 23 C8 24 82 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 BA 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0B 0C 53 0E 2D C8 10 00 12 00 13 04 3A 1D 07 EA 1E 07 EA 1F 00 23 C8 24 82 28 76 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 48 60 01 48 61 00 00 74 00 75 00 00 39 
Tx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 53 0E 2D FA 10 00 12 00 13 04 3A 1D 11 30 1E 11 30 1F 4C 23 C8 24 81 28 7A 2A 00 2C 00 32 00 33 4C 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 01 9A C8 
PGL2 -> S2 (21s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 53 0E 2D 82 10 00 12 00 13 04 2C 1D 1C B8 1E 1C B8 1F 7F 23 C8 24 90 28 7B 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 83 
S2 -> S3 (3s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 53 0E 2D 46 10 00 12 00 13 04 27 1D 1C 91 1E 1C 91 1F 7F 23 C8 24 A0 28 7B 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 7C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 53 0E 2D B4 10 00 12 00 13 04 42 1D 1E DF 1E 1E DF 1F 7F 23 C8 24 91 28 7D 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC DC 
S3 -> S5 (5s)
Tx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 54 0E 2D A0 10 00 12 00 13 04 59 1D 1F F2 1E 1F F2 1F 7F 23 C8 24 71 28 7D 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 34 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 54 0E 2E 0E 10 00 12 00 13 04 54 1D 20 FD 1E 20 FD 1F 7F 23 C8 24 63 28 7D 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 86 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 55 0E 2D FA 10 00 12 00 13 04 48 1D 22 49 1E 22 49 1F 7F 23 C8 24 5F 28 7D 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 50 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 56 0E 2D FA 10 00 12 00 13 04 3A 1D 22 FB 1E 22 FB 1F 7F 23 C8 24 52 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 2F 
S5 -> S6 (11s)
Tx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 57 0E 2E 4A 10 00 12 00 13 04 29 1D 23 00 1E 23 00 1F 7F 23 C8 24 57 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 8B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 57 0E 2D C8 10 00 12 00 13 04 1D 1D 23 26 1E 23 26 1F 7F 23 C8 24 5E 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 37 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 58 0E 2E 0E 10 00 12 00 13 04 1C 1D 22 FB 1E 22 FB 1F 7F 23 C8 24 62 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC C0 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 59 0E 2D C8 10 00 12 00 13 04 1E 1D 23 10 1E 23 10 1F 7F 23 C8 24 65 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 01 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 5A 0E 2D C8 10 00 12 00 13 04 1D 1D 22 DB 1E 22 DB 1F 7F 23 C8 24 68 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 03 02 00 03 00 04 00 0A 0F 0C 5B 0E 2D DC 10 00 12 00 13 04 20 1D 22 F0 1E 22 F0 1F 7F 23 C8 24 6A 28 7E 2A 00 2C 00 32 00 33 7F 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 02 AC 26 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 02 10 E6 
Rx: 4F 02 90 DD 
Rx: 44 02 90 D6 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5B 0E 2F 44 10 00 12 00 13 04 1C 1D 22 62 1E 22 62 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 AD 
S6 -> BO_S (19s)
Rx: 44 02 90 D6 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 04 44 21 00 95 
Rx: 4F 03 C4 01 89 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5C 0E 2F 76 10 00 12 00 13 03 CE 1D 1F 73 1E 1F 73 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 4D 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5C 0E 2F 9E 10 00 12 00 13 03 91 1D 1C 51 1E 1C 51 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 FA 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5C 0E 2F BC 10 00 12 00 13 03 6E 1D 19 15 1E 19 15 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 27 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5C 0E 2F D0 10 00 12 00 13 03 57 1D 16 40 1E 16 40 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 72 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5B 0E 2F E4 10 00 12 00 13 03 48 1D 14 2D 1E 14 2D 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 27 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 5E 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5A 0E 2F E4 10 00 12 00 13 03 38 1D 12 22 1E 12 22 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 39 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 20 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 5A 0E 2F F8 10 00 12 00 13 03 27 1D 10 25 1E 10 25 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 20 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 59 0E 2F F8 10 00 12 00 13 03 1A 1D 0E FE 1E 0E FE 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1E 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 59 0E 2F F8 10 00 12 00 13 03 0E 1D 0E B7 1E 0E B7 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0A 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 59 0E 30 0C 10 00 12 00 13 03 03 1D 0E 60 1E 0E 60 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 EC 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 59 0E 30 0C 10 00 12 00 13 02 F7 1D 0E 1D 1E 0E 1D 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 19 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 58 0E 30 0C 10 00 12 00 13 02 EA 1D 0D CB 1E 0D CB 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 05 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 58 0E 30 0C 10 00 12 00 13 02 DB 1D 0D 71 1E 0D 71 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 34 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 58 0E 30 0C 10 00 12 00 13 02 C8 1D 0D 26 1E 0D 26 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 27 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 58 0E 30 0C 10 00 12 00 13 02 B3 1D 0C DD 1E 0C DD 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 5C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 58 0E 30 0C 10 00 12 00 13 02 9B 1D 0C 81 1E 0C 81 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 74 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 58 0E 30 20 10 00 12 00 13 02 84 1D 0C 68 1E 0C 68 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 47 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 30 0C 10 00 12 00 13 02 6B 1D 0E 6C 1E 0E 6C 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 8B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 30 0C 10 00 12 00 13 02 4F 1D 10 8A 1E 10 8A 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 AF 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 30 0C 10 00 12 00 13 02 34 1D 12 8C 1E 12 8C 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 D4 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F F8 10 00 12 00 13 02 1C 1D 14 AC 1E 14 AC 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 17 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F E4 10 00 12 00 13 02 05 1D 16 9D 1E 16 9D 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 12 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F E4 10 00 12 00 13 01 F2 1D 18 BB 1E 18 BB 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 E6 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F D0 10 00 12 00 13 01 DF 1D 1A B4 1E 1A B4 1F 00 23 C8 24 00 28 92 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 FF 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F D0 10 00 12 00 13 01 CF 1D 1B AD 1E 1B AD 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 E8 
BO_S -> CL1 (66s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F D0 10 00 12 00 13 01 C0 1D 1B A6 1E 1B A6 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 E7 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F D0 10 00 12 00 13 01 B4 1D 1B 6B 1E 1B 6B 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 93 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F D0 10 00 12 00 13 01 A8 1D 1B AA 1E 1B AA 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3A 59 00 00 00 5A 00 83 28 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 8F 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F BC 10 00 12 00 13 01 9E 1D 1B A3 1E 1B A3 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 D5 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F D0 10 00 12 00 13 01 95 1D 1B 96 1E 1B 96 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 B2 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 57 0E 2F BC 10 00 12 00 13 01 8D 1D 1B AA 1E 1B AA 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 C6 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 86 1D 1B 99 1E 1B 99 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 CC 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 7F 1D 1B A6 1E 1B A6 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 35 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 78 1D 1B AA 1E 1B AA 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 32 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 72 1D 1B A3 1E 1B A3 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 38 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 6D 1D 1B B4 1E 1B B4 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 27 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 68 1D 1B A0 1E 1B A0 1F 00 23 C8 24 00 28 95 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 22 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 63 1D 1B 7E 1E 1B 7E 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 2B 
CL1 -> CL2 (34s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 5F 1D 1B 8F 1E 1B 8F 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 17 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 5A 1D 1B A3 1E 1B A3 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 12 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 56 1D 1B 8C 1E 1B 8C 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1E 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 52 1D 1B 9C 1E 1B 9C 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1A 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 4F 1D 1B 9C 1E 1B 9C 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 07 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 4C 1D 1B 99 1E 1B 99 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 04 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 48 1D 1B A6 1E 1B A6 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 00 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 45 1D 1B 92 1E 1B 92 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0D 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 42 1D 1B A0 1E 1B A0 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0A 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 56 0E 2F BC 10 00 12 00 13 01 40 1D 1B B4 1E 1B B4 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 08 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 55 0E 2F BC 10 00 12 00 13 01 3E 1D 1B A6 1E 1B A6 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 75 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 55 0E 2F BC 10 00 12 00 13 01 3B 1D 1B 8C 1E 1B 8C 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 29 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 70 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 55 0E 2F BC 10 00 12 00 13 01 39 1D 1B A0 1E 1B A0 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 8F 3B 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 71 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 55 0E 2F BC 10 00 12 00 13 01 37 1D 1B 9C 1E 1B 9C 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 5B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 55 0E 2F BC 10 00 12 00 13 01 35 1D 1B A0 1E 1B A0 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 59 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 09 0C 55 0E 2F BC 10 00 12 00 13 01 33 1D 1B 92 1E 1B 92 1F 00 23 C8 24 00 28 97 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 5F 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 01 0C 55 0E 30 7A 10 00 12 00 13 01 31 1D 09 A8 1E 09 A8 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 A2 
CL2 -> WST (45s)
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 84 10 00 12 00 13 01 31 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 5D 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 98 10 00 12 00 13 01 31 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 41 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 98 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 42 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 98 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 42 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 AC 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 76 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 AC 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 76 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 AC 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 76 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 AC 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 76 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 C0 10 00 12 00 13 01 34 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 55 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 1B 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 18 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 18 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 18 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 18 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 C0 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 18 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 33 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0C 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0D 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 56 0E 30 D4 10 00 12 00 13 01 32 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 24 51 00 00 00 58 00 90 00 59 00 00 00 5A 00 83 2A 5F 01 49 60 01 49 61 00 00 74 53 75 00 00 0D 
Tx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Диагностирование окончено: 16.02.19 15:03:28

Это лог с диагностики , запуск , стирание ошибок  которых небыло  и выключение.

Dushman7776
Offline
Зарегистрирован: 13.01.2019
Диагностирование включено: 16.02.19 15:08:44
Монитор W-шины
Rx: 00 
Rx: F4 03 21 3B ED 
Rx: 00 
Rx: 44 03 C4 00 83 
Rx: 44 03 C4 00 83 
Rx: F4 03 21 3B ED 
Rx: 4F 03 A1 3B D6 
Rx: F4 03 21 3B ED 
Rx: 4F 03 A1 3B D6 
Rx: F4 03 21 3B ED 
Rx: F4 04 44 21 00 95 
Rx: 4F 03 A1 3B D6 
Rx: F4 08 50 30 05 0A 0C 0E 10 81 
Rx: 4F 0C D0 30 0A 0B 0C 53 0E 2D 14 10 00 DA 
Rx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Rx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Rx: F4 08 50 30 05 0A 0C 0E 10 81 
Rx: 4F 0C D0 30 0A 0B 0C 53 0E 2D E6 10 00 28 
Rx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Rx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Rx: F4 08 50 30 05 0A 0C 0E 10 81 
Rx: 4F 0C D0 30 0A 0F 0C 53 0E 2D 28 10 00 E2 
Rx: F4 03 56 01 A0 
Rx: 4F 04 D6 01 00 9C 
Rx: F4 04 44 21 00 95 
Rx: 4F 03 C4 00 88 
Rx: F4 08 50 30 05 0A 0C 0E 10 81 
Rx: 4F 0C D0 30 0A 0F 0C 55 0E 2E 36 10 00 F9 
Rx: F4 02 10 E6 
Rx: 4F 02 90 DD 
Rx: 44 02 90 D6 
Rx: 44 02 90 D6 
Rx: F4 02 10 E6 
Rx: 4F 02 90 DD 
Rx: F4 02 10 E6 
Rx: 4F 02 90 DD 
Rx: F4 02 10 E6 
Rx: 4F 02 90 DD 
Диагностирование окончено: 16.02.19 15:12:55

Это в режиме снифа, запустил с смс , и зделал запрос сервис инфо , но почему то мало очень получилось , может чего напутал.

MaksVV
Offline
Зарегистрирован: 06.08.2015

в последнем снифе ты сам котёл выключил? или он самовольничает? 

MaksVV
Offline
Зарегистрирован: 06.08.2015

а где же сниф с установкой необходимых галочек?  

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Я сам выключил , а то задохнулся нахрен .

MaksVV
Offline
Зарегистрирован: 06.08.2015

исправлю скетч , увидел косяк

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Да не ставил я этих галочек , делал все по умолчанию , там даже больше  этих галочек было выставлено, подумал больше не меньше, работа отвлекала, я сначала не разобрался как лог снимать, не дотумкал что каждый новый лог программы затирает старый , там еще есть логированние измерений , но это не то , это просто логрованние температур и всяких других параметров. Если этого не хватит придется еще логи снимать . Мне бы пошаговую инструкцию , какие действия нужны , а то там идет логирование пока не выключишь его. Сегодня еще работу кнопки проверил, все вроде работает, только пришлось оптрон перепаять , я его не правильно впаял , ключ перепутал, исправил , все зарабоатло как надо..

MaksVV
Offline
Зарегистрирован: 06.08.2015

v3.56 исправлен парсинг температуры и напряжения 

char ver[] = "Firmware 3.56";

//#define debugW_bus        // раскоментировать эту строку для отладки w-bus, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM 
//#define debugSIM800

#include <EEPROM.h>
enum Cells {
ResetNumber_cell,      //0
TimeWebasto_cell,      //1
ProtocolSTART_cell,    //2
StartByte_cell,        //3
ProtocolSTATUS_cell,   //4
Heater_cell,           //5
delta_cell,            //6
TelNumber1_cell =20,  //20
TelNumber2_cell =40   //40
};

#include <Button.h>
Button test;

// для GSM модуля *********************

String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};

bool SaveNumber2 = 0;  // флаг когда необходима запись номера#2, он true
byte isStringMessage = 0; 
byte KTOzapros = 0;
byte KTOreport = 1;

//************************


                                   
//_______Все для цикла void voltmetr()*************
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП


// дефайны входов выходов на соостветствующие пины ************** (плата весий 8.5-8.7)

#define OutWebasto_12V      2  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Dallas_pin          3  // пин шины OneWire для датчиков даллас
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define IGN                 8  // Сюда состояние зажигания
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM           12  // пин ресета GSM подключен к реле, разрывающее питание модуля. 
#define Eng                14  // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED   15  // (А1) пин LED  индикация включенности котла
#define StartButtonpin     16  // (А2) пин тактовой кнопки вкл/выкл котла 
#define DTR                17  // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng           18  // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp  19  // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).  
#define Voltmeter_pin      A7  // пин, которым измеряем напряжение питания
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX             10  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             11  // пин софт TX Arduino для соединения с RX модуля SIM800

/*

#define Dallas_pin          2  // пин шины OneWire для датчиков даллас
#define OutWebasto_12V      3  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define StartEng            8  // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define IGN                10  // Сюда состояние зажигания
#define Eng                11  // Сюда состояние работы ДВС
#define OutWebasto_GndImp  12  // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера). 
#define StatusWebastoLED   13  // пин индикация включенности котла
#define ResetGSM           16  // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля. 
#define StartButtonpin     17  // пин тактовой кнопки вкл/выкл котла 
#define DTR                19  // пин (А5), управляющий энергосберегающим режимом GSM модуля
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        0; // логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
#define GSM_RX             14  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             15  // пин софт TX Arduino для соединения с RX модуля SIM800

*/

#include <SoftwareSerial.h>

#ifndef debugW_bus
      SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx   //UART для соединения с GSM модулем
#else 
      SoftwareSerial DEBUG (GSM_RX, GSM_TX); //Rx, Tx   //UART для соединения с отладкой (используется юсб<->УАРТ вместо SIM800)
#endif



// для шины 1-wire и датчиков DS18B20****************

#include <OneWire.h>    // библиотека для DS18B20
OneWire ds(Dallas_pin); // датчики DS18B20 на нужный пин

enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)

// ниже соответствие адресов датчиков различным температурам (изначально 0х14=20*С)
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC,  0x14}, 
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC,  0x14}, 
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC,   0x14},  
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC,   0x14}
};
byte delta = 50;  // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть. 

// для организации W-BUS и различные таймеры********************

#define K_LINE Serial                  //UART для соединения с шиной котла
#define TX 1    

byte header = 0;          // состояние заголовка 
byte message_size = 0;    // размер тела принимаемого сообщения, кол-во байт

byte j = 2;               // инкремент
byte n = 2;
const byte bufsize = 140;  // размер буфера принятого сообщения
byte buf [bufsize] = {0};  // буфер принятого сообщения
byte checksum = 0;         // контрольная сумма входящего сообщения
uint32_t curmillis = 0;    // снимок системного времени
byte delaybyte_TX = 0 ;    // задержка между байтами отправляемого сообщения 
byte waitbyte_RX = 1;      // задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
uint32_t timerdelay = 0;   // таймер ожидания байт (для успевания заполнения буфера УАРТ)
bool Delay = 0;            // таймер ожидания байт (для успевания заполнения буфера УАРТ)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера

uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались


// ниже строка даже не спрашивайте что это)) это так... кот по клаве прошёл
#define ConstArray(...)  [](void)->size_t{ const byte _[] = { __VA_ARGS__}; return sizeof(_)/sizeof(_[0]); }(),[](void)->const byte *{ const static byte _[] = { __VA_ARGS__}; return _; }()

// команды для котлов ЭВО
byte StartByte = 0x20;
#define HEATER_START          ConstArray (StartByte, 0x3B)
#define HEATER_PRESENCE       ConstArray (0x44, StartByte, 0x00)
#define HEATER_STOP           ConstArray (0x10)
#define HEATER_STATUS_VEVO    ConstArray (0x50, 0x05)
#define HEATER_STATUS_EVO     ConstArray (0x50, 0x30, 0x05, 0x0A, 0x0C, 0x0E, 0x10)
#define HEATER_DTC_REQUEST    ConstArray (0x56, 0x01)
#define HEATER_DTC_ERASE      ConstArray (0x56, 0x03)

// команды для котлов ТТС/TTE
#define START_SESSION   ConstArray (0x81)
#define REQUEST_2A10101 ConstArray (0x2A, 0x01, 0x01)
#define REQUEST_2A10102 ConstArray (0x2A, 0x01, 0x02)
#define REQUEST_2A10105 ConstArray (0x2A, 0x01, 0x05)
#define REQUEST_DTC     ConstArray (0xA1)
#define START_TTC       ConstArray (0x31, 0x22, 0xFF)
#define STOP_TTC        ConstArray (0x31, 0x22, 0x00)


enum ProtocolSTATUS_ {STATUSBUS, ANALOG};                   // возможные протоколы чтения статуса котла
enum ProtocolSTART_  {STARTBUS, IMPULSE, POTENCIAL};        // возможные протоколы запуска котла
enum Heater_  {TTC_E, VEVO, EVO, HYDRONIC};                 // тип котла

byte  ProtocolSTATUS = STATUSBUS; 
byte  ProtocolSTART  = STARTBUS;
byte  Heater         = EVO;

byte w_bus_init = 0;                      //флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для  ЭВО
                                          //                                            либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC 
byte requiredmessage =  1;                //флаг, что отправляем в данный момент поддержание старта, запрос параметров или запрос ошибок
byte StartMessageRepeat = 0;              //количество отправленных сообщений на старт котла
byte StopMessageRepeat =  0;              //количество отправленных сообщений на остановку котла

byte  TimeWebasto = 30;                   //время работы котла, = 30мин
uint32_t EndReportMillis = 0;             //переменная для таймера отправки отчета об успешности запуска котла
uint32_t EndReportEngine = 0;             //переменная для таймера отправки отчета об успешности запуска ДВС
uint32_t Prev_PeriodW_BusMessage = 0;     //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
uint32_t Prev_PeriodW_BusStartStop = 0;   //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 
uint32_t prevdelSMS = 0;                  //переменная для таймера периодического удаления СМС 
uint32_t prevVpit = 0;                    //переменная для таймера периодического измерения напряжения АКБ

//для таймера создания импульса GND - для протокола запуска котла импульсом GND 
uint32_t timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (curmillis-timer)>800


//для таймера  - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
uint32_t  timerStartEng=0; bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500


//для таймера  - старт котла по W-BUS )
uint32_t timerStart_W_BUS=0; bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL

//для таймера инита шины W-BUS
uint32_t timerInit = 0; bool timerInitflag = 0;

//для таймера контроля жив или мертв обмен по W-bus 
uint32_t last_W_bus = 0; bool kotel_zhiv = 0;

//ниже всё для организации ресета GSM модуля, если с ним отсутствует связь****************

uint32_t  prevReset=0;           // для таймера периодичности проверки (командой "АТ")
byte  intervalReset = 2;         // каждые столько мин будет проверка жив ли GSM модуль 
uint32_t  timerWaitOK=0;         // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false;   // для таймера ожидания ответа после посылки команды "АТ"
byte errors=0;                   // количество неответов  от GSM модуля
bool gsmOK = 1;                  // флаг есть связь с GSM модулем или нет
bool resettimer = 0;             // для таймера удерживания реле в режиме сброс питания
uint32_t  resetTimer=0;          // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0;            // количество ресетов GSM модуля для статистики (хранится в еепром)

//**************************

//Основные переменные  
bool webasto = 0;             // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;     // флаг успешного запуска котла
bool report = false;          // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;    // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine =0;               // флаг работает ли ДВС или нет
bool ignition=0;              // флаг включено ли зажигание или нет
bool ohrana=0;                // флаг включена ли охрана или нет
bool trevoga=0;               // флаг включена ли тревога или нет
bool alarmSMS = 0;            // флаг отправлена ли смс о тревоге или нет

bool waterpump = 0;           // флаг работы циркуляционного насоса
bool plug      = 0;           // флаг работы штифта накаливания
bool airfan    = 0;           // флаг работы нагнетателя воздуха
bool fuelpump  = 0;           // флаг работы топливного насоса
bool blowerfan = 0;           // флаг работы вентилятора печки автомобиля
byte DTC[7] ={0};             // коды неисправностей котла


// СТАРТОВЫЙ ЦИКЛ

void setup() 
{


delay (3500);


test.NO(); 
test.pullUp();
test.duration_bounce       (  50);
test.duration_click_Db     ( 250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
test.duration_press        ( 500);
test.button(StartButtonpin);            // в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
 
pinMode (DopOn,   INPUT_PULLUP); 
pinMode (DopOff,  INPUT_PULLUP); 
pinMode (Sost,    INPUT_PULLUP); 
pinMode (Ohrana,  INPUT_PULLUP); 
pinMode (Trevoga, INPUT_PULLUP); 
pinMode (IGN,     INPUT_PULLUP); 
pinMode (Eng,     INPUT_PULLUP); 
  
pinMode (OutWebasto_12V,     OUTPUT);  digitalWrite (OutWebasto_12V,      LOW);
pinMode (StartEng,           OUTPUT);  digitalWrite (StartEng,            LOW);
pinMode (13,                 OUTPUT);  digitalWrite (13,                  LOW);
pinMode (StatusWebastoLED,   OUTPUT);  digitalWrite (StatusWebastoLED,    LOW);
pinMode (OutWebasto_GndImp,  OUTPUT);  digitalWrite (OutWebasto_GndImp,   HIGH);
pinMode (DTR,                OUTPUT);  digitalWrite (DTR,                 HIGH);  // делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
pinMode (ResetGSM,           OUTPUT);  digitalWrite (ResetGSM,        !RelayON);  // реле ресет на данный момент делаем "неактивно"

#ifndef debugW_bus
   SIM800.begin(19200);           // сериал соединение для gsm модуля
   delay(100);
   NastroykaGSM ();
#else DEBUG.begin(9600);
#endif

TimeWebasto =    EEPROM.read(TimeWebasto_cell);
ProtocolSTART  = EEPROM.read(ProtocolSTART_cell);
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
ResetNumber =    EEPROM.read(ResetNumber_cell);
StartByte =      EEPROM.read(StartByte_cell);
Heater =         EEPROM.read(Heater_cell);
delta  =         EEPROM.read(delta_cell);
for (int i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
for (int i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);

#ifndef debugSIM800
        if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
   else if (Heater == TTC_E) K_LINE.begin(10400);
#else 
K_LINE.begin(9600);
#endif


for (byte i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
digitalWrite (13,0);
}


void loop() {
curmillis = millis();
test.read();

digitalWrite (StatusWebastoLED, webasto);
digitalWrite (13, startWebasto_OK);
//digitalWrite (13, webasto);


//если нажали тактовую кнопку меняем состояние котла на противоположное 
if (test.event_press_short (StartButton)) {
  if (!webasto) {StartWebasto(); report = false;}
  else StopWebasto();
    }

if (ProtocolSTATUS==ANALOG) {if (Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
                             else startWebasto_OK = 0;}

if (ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);

Heater_BUS();

//ниже для таймера старта котла по шине и аналогу 
 
  if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();

//ниже для таймера создания импульса на старт ДВС 

if (timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (!ohrana) alarmSMS = false;

#ifndef debugW_bus
   if (trevoga && !alarmSMS) AlarmSMS ();
   if (gsmOK)readSMS();
   Reset_gsm();
   delSMS();
#endif

WebastoOprosImpulse ();
izmereniya();


}

void izmereniya() { 

if (millis()-prevVpit>7000){

//измерение напряжения борт сети
if (ProtocolSTATUS==ANALOG){
   volt = analogRead(Voltmeter_pin);                      
   vout = (volt * 4.13) / 1024;             
   Vpit = vout / (9700.0/(98930.0+9700.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}  

// ниже измерение датчиков даллас
static bool n=0;        // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();     // сброс шины
        ds.write(0xCC); // обращение ко всем датчикам
        ds.write(0x44); // начать преобразование (без паразитного питания)  
       }
else   {
  for (byte i=0; i<size_arrayTemp; i++){  
    int Temper_ = 20; byte buff[9];
    ds.reset();
    ds.select(DS18B20[i]);
    ds.write(0xBE); // чтение регистров датчиков
    for (byte j=0; j<9; j++) buff[j]=ds.read(); // читаем все 9 байт от датчика
    ds.reset();
    if (OneWire::crc8(buff, 8) == buff[8]){     // если контрольная сумма совпадает 
          if (DS18B20[i][8]==EngineC && ProtocolSTATUS==STATUSBUS){} // если данные берём по шине, то t двигла не мереем
          else {
          Temper_ = buff[0]|(buff[1]<<8);       // читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
          Temper_ = Temper_ / 16;
          if (Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;}
}}}


prevVpit=millis();
}}



int8_t Temper (const byte &addressTemp) {for(byte j=0; j<size_arrayTemp; j++){if(DS18B20[j][8]==addressTemp)return(int8_t)DS18B20[j][9];} return-99;}



void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) StopWebasto();
         }}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 60сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 90000ul) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 




#ifndef debugW_bus
   void NastroykaGSM () {
  digitalWrite (DTR, LOW);      // выводим из спячки GSM модуль
    delay (150);
  SIM800.println(F("AT"));                    //просто AT для разогреву
    delay(250);
  SIM800.println(F("AT+CMGF=1"));             //устанавливает текстовый режим смс-сообщения
    delay(250);
  SIM800.println(F("AT+IFC=0, 0"));           //отключает программный контроль потоком передачи данных
    delay(250);
  SIM800.println(F("AT+GSMBUSY=1"));          //запрет всех входящих звонков
    delay(250);
  SIM800.println(F("AT+CNMI=1,2,2,1,0"));     //включает оповещение о новых сообщениях
    delay(250);
  SIM800.println(F("AT+CMGDA=\"DEL ALL\""));  // удаляем все смс, ки
   delay(1500);
  SIM800.println(F("AT+CSCLK=1"));            //включает энергосберегающий режим 
  delay(150);
  digitalWrite (DTR, HIGH);     // вводим в спячку GSM модуль высоким уровнем на пине DTR
  
}

void startSMS(byte stat) //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
    if (stat==0) stat = KTOreport;
     digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
         delay (150);
     SIM800.print(F("AT+CMGF=1\r"));
         delay(200);
     SIM800.print(F("AT+CMGS=\"")); SIM800.print(TelNumber[stat]); SIM800.println("\""); 
         delay(200);
}



void EndSMS ()
{
   SIM800.println((char)26);                       // Команда отправки СМС
   delay(1500);
   digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   
}

void delSMS ()
{
if (millis() - prevdelSMS > 7200000ul){  //раз в 2 часа 
 digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
    delay (150);
 SIM800.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
 digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   delay (150);

  prevdelSMS = millis();}
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!SIM800.available()) return;
    char currSymb = SIM800.read();
#ifdef debugSIM800 
K_LINE.print (currSymb); 
#endif
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if      (!currStr.compareTo("ZAPROS"))       {SMSzapros();}              // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))    {SMSzaprosTEL();}           // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {ServiceINFO();}            // Передача сервисной информации  по СМС
else if (!currStr.compareTo("GSMResets-0"))  {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}     //сброс счетчика ресетов GSM модуля
else if (!currStr.compareTo("Version"))      {startSMS(isStringMessage);  SIM800.println (ver); EndSMS ();}               //запрос версии ПО

else if (!currStr.compareTo("Webasto-ON"))  { startSMS(isStringMessage); SIM800.println(F("Webasto ")); 
  
           if (!webasto)  {StartWebasto (); KTOreport = isStringMessage;}
           else SIM800.println(F("uzhe ")); SIM800.println (F("vkluchena")); EndSMS();}

                                                            
else if (!currStr.compareTo("Webasto-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Webasto "));  
           if (webasto)StopWebasto ();  // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
           else SIM800.println(F("uzhe "));  SIM800.println(F("otkluchena"));EndSMS();}          

// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
else if (!currStr.compareTo("Engine-ON"))  {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; KTOreport = isStringMessage;} 
           else SIM800.println(F("uzhe ")); SIM800.println(F("start")); EndSMS();}
                                                                                 
else if (!currStr.compareTo("Engine-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
           else SIM800.println(F("uzhe ")); SIM800.println(F("ostanovlen")); EndSMS();}          
              
else if (!currStr.compareTo("Impulse"))   {if (!webasto) {ProtocolSTART = IMPULSE;  EEPROM.write(ProtocolSTART_cell,ProtocolSTART);     
                                            startSMS(isStringMessage); SIM800.println(F("zapusk GND_impulse")); EndSMS();}}

else if (!currStr.compareTo("Startbus"))  {if (!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);  webasto = 0;  
                                            startSMS(isStringMessage); SIM800.println(F("zapusk BUS")); EndSMS();}}

else if (!currStr.compareTo("Potencial")) {if (!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);   
                                            startSMS(isStringMessage); SIM800.println(F("zapusk +12V Potencial")); EndSMS();}}

else if (currStr.endsWith("Status"))   {if (!webasto) {byte st = currStr.toInt(); if (st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);   
                                            startSMS(isStringMessage); SIM800.print (F("Status: "));
                                                                             if (ProtocolSTATUS == 0)SIM800.println(F("BUS")); 
                                                                        else if (ProtocolSTATUS == 1)SIM800.println(F("Analog"));
                                                                        EndSMS();}}    


else if (currStr.endsWith("HeaterType")) {if (!webasto) {byte st = currStr.toInt(); if (st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);   
                                            startSMS(isStringMessage); SIM800.print (F("Heater: "));
                                                                             if (Heater == 0)SIM800.println(F("TTC_E")); 
                                                                        else if (Heater == 1)SIM800.println(F("VEVO"));
                                                                        else if (Heater == 2)SIM800.println(F("EVO"));
                                                                        else if (Heater == 3)SIM800.println(F("HYDRONIC"));
                                                                        EndSMS();}}      
                                                                                                                                              
else if (currStr.endsWith("Delta"))   {if (!webasto) {delta = currStr.toInt(); //
               EEPROM.write(delta_cell, delta);  startSMS(isStringMessage);
               SIM800.print(F("DeltaT: ")); SIM800.print(delta); SIM800.print(F("*C")); EndSMS();}}
                                                                                                                                            

               
else if (currStr.endsWith("min"))   {if (!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>59)  TimeWebasto = 59;
               if (TimeWebasto<=15) TimeWebasto = 15;
               EEPROM.write(TimeWebasto_cell,TimeWebasto);
               startSMS(isStringMessage); SIM800.print(F("Webasto time: ")); SIM800.print(TimeWebasto); SIM800.print(F("min")); EndSMS();}}
               
else if (currStr.endsWith("StartByte")) {byte Z =currStr.toInt(); if (Z>=0x14 && Z<=0x17) StartByte= Z+12;
               startSMS(isStringMessage); SIM800.print(F("StartByte: ")); SIM800.print(StartByte, HEX); SIM800.print(F("h")); EndSMS();}

else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber[1] = "000000000000"; TelNumber[2] = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell,  TelNumber[1][i]); EEPROM.write (i+TelNumber2_cell,  TelNumber[2][i]); }}}

else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F("Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera")); EndSMS();} 

                                                                        

                                                     
else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              
              
else if (isStringMessage==3){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber[1] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[3][i]);}
              startSMS(1); SIM800.println(F("Tel Number#1 is saving in memory"));  SIM800.print("Tel#1: ");  SIM800.println (TelNumber[1]); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
else if (isStringMessage==0) {  if (TelNumber[1]!="000000000000" && !SaveNumber2 && TelNumber[1]!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }    
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 3; for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];} TelNumber[2] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber2_cell, TelNumber[3][i]);}
              startSMS(2); SIM800.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              SIM800.print(F("Tel#1: ")); SIM800.println(TelNumber[1]); SIM800.print(F("Tel#2: "));  SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11)  currStr += String(currSymb);
}



void SMSzaprosTEL(){
  startSMS(isStringMessage);
  PrintNumbers (); 
  EndSMS();                                 
  }


void SMSbalance() {
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
      delay (150);
SIM800.print(F("AT+CMGF=1\r"));
      delay(200);
SIM800.println (F("AT+CUSD=1,\"#100#\""));    // команда на замену на транслит *111*6*2# у МТС 
      delay(1500);  
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
      delay (150);  
                             
     
}


void AlarmSMS() {for (byte i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!")); EndSMS();} alarmSMS = true;}
 
#endif

void PrintNumbers () {for (byte i=0; i<2; i++) {SIM800.print(F("Tel#")); SIM800.print (i+1); SIM800.print(F(" ")); SIM800.println(TelNumber[i+1]);}}

void SMSzapros()

{
#ifndef debugW_bus  
  startSMS(isStringMessage);
  if (isStringMessage == 3){
 
 SIM800.println (F("Tel.number#1 not has been save in memory"));
 SIM800.println (F("For save Tel#1 send SMS command \"WriteNumber1\""));
 PrintNumbers ();
  }
  

  
  
  else {
  
SIM800.print (F("Webasto ")); on_off (webasto);
        if (webasto) { 
           SIM800.print (F("StartWebasto "));
           if (startWebasto_OK) SIM800.println (F("OK"));
           else SIM800.println (F("FAIL"));}
SIM800.print (F("Engine    "));  on_off (engine);
SIM800.print (F("IGN        ")); on_off (ignition);
SIM800.print (F("Ohrana  "));    on_off (ohrana);
     if (trevoga)  SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  SIM800.print(F("Battery: ")); SIM800.print (Vpit,1); SIM800.println(F(" V"));

  SIM800.print(F("Engine:  ")); SIM800.print (Temper(EngineC));  grad ();
 if (ProtocolSTATUS == ANALOG){ SIM800.print(F("Vyhlop:  ")); SIM800.print (Temper(VyhlopC));  grad ();}
  SIM800.print(F("Ulica:     ")); SIM800.print (Temper(UlicaC)); grad ();
  SIM800.print(F("Salon:    ")); SIM800.print (Temper(SalonC));  grad ();  
  
  SIM800.print(F("Errors:   ")); SIM800.println (DTC[0]);
  
  
 
  }  
   EndSMS();    
#endif                             
}

void on_off (const bool &stat) {if (stat) SIM800.println (F("ON")); else SIM800.println (F("OFF")); }
void grad () {SIM800.println (F("*C")); }

void ServiceINFO(){
       startSMS(isStringMessage);
  SIM800.print(F("StartByte:  "));
       if (ProtocolSTART==IMPULSE)   SIM800.println(F("GND Imp"));
  else if (ProtocolSTART==STARTBUS)  {SIM800.println(F("BUS"));
             if (Heater== VEVO || Heater== EVO) {SIM800.print(F("StartByte: 0x")); SIM800.println (StartByte, HEX);}}
  else if (ProtocolSTART==POTENCIAL) SIM800.println(F("Potencial+12V"));
  
  SIM800.print(F("Status:  "));
       if (ProtocolSTATUS==ANALOG)    SIM800.println(F("ANALOG"));
  else if (ProtocolSTATUS==STATUSBUS) SIM800.println(F("BUS"));
  
  SIM800.print(F("Heater:  ")); 
       if (Heater==TTC_E)     SIM800.println(F("TTC/E"));
  else if (Heater==VEVO)      SIM800.println(F("VEVO"));
  else if (Heater==EVO)       SIM800.println(F("EVO"));
  else if (Heater==HYDRONIC)  SIM800.println(F("HYDRONIC"));
  
  if (ProtocolSTART!=IMPULSE) {SIM800.print(F("Webasto Time: ")); SIM800.print (TimeWebasto); SIM800.println(F("min"));}
  SIM800.print(F("SIM800 Resets: ")); SIM800.println (ResetNumber); 

  if (ProtocolSTATUS==ANALOG) SIM800.print(F("DeltaT:  ")); SIM800.print(delta);SIM800.println(F("*C"));

  if (ProtocolSTATUS==STATUSBUS) {
    SIM800.print(F("BurnFAN   ")); on_off (airfan);
    SIM800.print(F("WaterPUMP ")); on_off (waterpump);
    SIM800.print(F("PLUG      ")); on_off (plug);
    SIM800.print(F("FuelPUMP  ")); on_off (fuelpump);
    SIM800.print(F("Blower    ")); on_off (blowerfan);
    SIM800.print(F("FuelPUMP  ")); on_off (fuelpump);    
SIM800.print (DTC[0]); SIM800.println (F(" Errors:")); 
for (byte i=0; i<DTC[0]; i++) {
  if (DTC[i+1]<=0x0F) SIM800.print(F("0"));
     SIM800.print (DTC[i+1], HEX); 
     if (bitRead(DTC[6], i)) SIM800.println (F(" Active")); 
     else SIM800.println (F(" Passive")); }

    
    }
   EndSMS();    
  
  }

void StartWebasto()
{
 if (ProtocolSTART==IMPULSE){
  
  digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
  timerStart_W_BUS=millis();
  timerenabledStart_W_BUS = true;}

  report = true; EndReportMillis = millis();
  w_bus_init = 1;
}

void StopWebasto()
{
 if (ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (OutWebasto_12V, LOW);
  timerenabledStart_W_BUS = false;}
   report = false;
   w_bus_init = 0;
   
}



void Heater_BUS (){
  
if      (Heater == EVO || Heater == VEVO){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init == 10){
  sendMessage (HEATER_START); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000)  {
    
         if (requiredmessage==1) sendMessage (HEATER_PRESENCE);  
    else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO);
                                  if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO);}
    else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST);  
requiredmessage++; if (requiredmessage > 3) requiredmessage = 1;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  sendMessage (HEATER_STOP);
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }


if (!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=10; }


if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (buf[0]==0x4F){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         else {header = 0; RESETheader_timer=0;}
         }                  

 // длина сообщения
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1]; if (message_size > bufsize) message_size = bufsize;  header = 4;j=2;n=2;checksum = 0;} 

 // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n) {
 buf[j] = K_LINE.read();
 
 if (j<message_size+n-1) checksum^= buf[j]; // подсчёт КС
 
 if (j==message_size+n-1) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
   
for(byte i = 0; i<n; i++) checksum^=buf[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( checksum == buf[message_size+n-1]) {
  
if (Heater == EVO){
    
     if (buf[2]==0xD0 && buf[3]==0x30)                          {
                
                 if  (buf[4] ==0x0A) { 
                          airfan    = (bool)buf[5];                  // получаем флаг работы нагнетателя воздуха
                          plug      = (buf[5] & 0x02)>>1;            // получаем флаг работы штифта накаливания
                          fuelpump  = (buf[5] & 0x04)>>2;            // получаем флаг работы топливного насоса
                          waterpump = (buf[5] & 0x08)>>3;            // получаем флаг работы циркуляционного насоса
                          blowerfan = (buf[6] & 0x10)>>4;            // получаем флаг работы вентилятора печки автомобиля
                  
                                     }
                   
                 if  (buf[6] ==0x0C) {for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = buf[7]-50; break;}    }} // получаем температуру антифриза
                 if  (buf[8]==0x0E) {Vpit = (float)(buf[9]<<8|buf[10])/1000.0;}              // получаем напряжение борт сети
                 if  (buf[11]==0x10) {startWebasto_OK = (bool)buf[12]; last_W_bus = millis();} // проверяем наличие пламени                                                
                                                                
                                                                }

     if (buf[2]==0xD6 && buf[3]==0x01) {
      for (byte h = 0; h< sizeof(DTC); h++) DTC[h]=0;
      DTC[0] = buf[4];
      for (byte h = 0; h< buf[4]; h++) {DTC[h+1]=buf[h*3+5]; bitWrite (DTC[6], h+1, (bool) DTC[h*3+6]);}
      
      
      
      }                         
                                                                
                  }

if (Heater == VEVO){
     if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_W_bus = millis();}       // проверяем наличие пламени у VEVO 
                  }
  
  
                                        }   

// если контрольная сумма не совпала: 

//else K_LINE.println("CRC fail!!!" );
  
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
}




}// end EVO VEVO


else if (Heater == TTC_E){



  
if (!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299)  && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>49)   && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
if ( timerInitflag && (millis() - timerInit>24)   && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
if ( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=10;  sendMessage (START_SESSION);}

if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         
         }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==0xF1){ header = 2;} else {header = 0; RESETheader_timer=0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  buf[2]=K_LINE.read(); 
  if (buf[2]==0x51){ message_size = buf[0]; 
  if (buf[0] !=0x80) {header = 4;  message_size&=~0x80; j=3; n=3;}
  else {header = 3; j=4;n=4;}
  if (message_size > bufsize) message_size = bufsize;  checksum = 0;} else {header = 0; RESETheader_timer=0; }
  
                          }  
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
  TIMER_DELAY ;
  buf[3]=K_LINE.read(); 
  message_size = buf[3]; 
  if (message_size > bufsize) message_size = bufsize;  
  checksum = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 buf[j] = K_LINE.read(); 
 if (j<message_size+n) checksum+= buf[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  

for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты

//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}

 // если контрольная сумма верна: 
if (buf[message_size+n] == checksum) {
  
//  if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
  
  
  
  
  }   

// если контрольная сумма не совпала: 
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
}

} // end TTC_E

// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}   

if (webasto && millis() - last_W_bus>30000 && ProtocolSTATUS==STATUSBUS) {
startWebasto_OK=0; 
airfan    = 0;
plug      = 0;
fuelpump  = 0;
waterpump = 0;
blowerfan = 0;
for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = -100; break;}}
}



}

#ifndef debugW_bus
void Reset_gsm (){
  if (millis()-prevReset>(unsigned long)intervalReset*60000UL){
  
  digitalWrite (DTR, LOW); delay (150);
  SIM800.println (F("AT")); 
  timerenabledWaitOK = 1; timerWaitOK = millis();
  gsmOK = false;
  prevReset = millis(); }

 if (timerenabledWaitOK && millis()-timerWaitOK>6000) {
    timerenabledWaitOK = 0;
    if (!gsmOK) {
      SIM800.println (F("AT")); timerenabledWaitOK = 1; timerWaitOK = millis();
      errors++; if (errors>4) errors = 4; 
      
      }
}

  
 if (!gsmOK)  { 
  if (SIM800.available()>0){                                   
    char currSymb = SIM800.read(); 
#ifdef debugSIM800 
    K_LINE.print (currSymb); 
#endif           
    if ('\r' == currSymb) {                                      
                                  
       if (!currStr.compareTo("OK")) {   gsmOK = true;  timerenabledWaitOK = 0; errors=0; digitalWrite (DTR, HIGH);}
       currStr = "";                                           
    }
    
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
    
    
    if (errors>=4) Reset();
    
    }



 
 void Reset(){
     
      if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();} 
else if (millis()- resetTimer>6000 ) {
resettimer = 0; 
errors=0; 
ResetNumber++; 
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON); 
delay (3500); NastroykaGSM ();}
             }

#endif


void sendMessage(const size_t size, const byte *command){
 
 if (Heater == TTC_E){
  const byte siZe = size+4;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
    if (i==1) Mes[i] = 0x51;
    if (i==2) Mes[i] = 0xF1;    
    if (i==3) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]);  i++;}}
    if (i!=siZe-1) Checksum+=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
 }
 else if (Heater == EVO || Heater == VEVO){
  const byte siZe = size+3;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) Mes[i] = 0xF4;
    if (i==1) Mes[i]=size+1; 
    if (i==2) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
    if (i!=siZe-1) Checksum^=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
  }
  }

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

галки нужны именно те, потому что нужно знать вкакой последовательности котёл будет отвечать байтами. Иначе если неправильно сделать, всё съедет, как это было как раз в 3.55

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Хорошо , сделаю, но не раньше понедельника. у меня шнурок на работе остался и тачку завтра не планировал брать. У нас как на зло зима кончилась , то месяц морозяка была , ночью под 40 и ниже , а днем под 30 , а сегодня всего минус 6 днем. весной запахло.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Ещё вопрос, по температуре если температура двигателя читается с шины, то с чего читается температура улицы и салона, получается должено быть комбинированное считывание аналог цифра?

MaksVV
Offline
Зарегистрирован: 06.08.2015

да улица и салон по датчикам даллас. Получается если выбран статус по цифре, то в массиве температур при измерениях , t ДВС пропускается (читается в другом месте по шине котла).  Кстати пока сделн обмен только во время работы котла. Позже сделаю, что бы обновление параметров по шине было возможно в т.ч. и когда котёл выключен (ZAPROS и ServiceINFO). 

MaksVV
Offline
Зарегистрирован: 06.08.2015

отпишись как 3.56 заработал

Dushman7776
Offline
Зарегистрирован: 13.01.2019

А напряжение считывается если котел не запущен? Не даёт покоя автоматический запуск двигателя при опасной просадке напряжения в борт сети, например автозапуск двигателя при условии , что температура двигателя не ниже минус 10 градусов если напряжение просело до опасного значения.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Конечно отпишусь.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Отчитываюсь  о работе скетча 3.56 , темпертуру двигла и напряжение читает , но надо сделать что бы можно было считать на не запущенном котле, заметил еще такой баг в ответной смс которая через 6 минут приходит . котел запустился и работает а в смс написано webasto on , startwebasto fail. Как будто не видит пламени , на скетче 3.5 было немного подругому , при запуске пришло 3 смс ,первая webasto on , вторая со статусом webasto on startwebasto fail и показания других статусов, а потом третья со статусами но уже startwebasto ok , правда я может быть сам команду на запрос послал , я стер те смски, но на скетче 3.55 и на последнем  не видит статуса startwebasto правильно И еще что заметил на остывшем заглушенном двигателе и не работающем котле послал команду сервис инфо и мне пришел ответ  что включены и помпа и бензанасос и вентилятор, я пошел на улицу проверил что все отключено , а на команду запрос пришло что вебаста оф но показания температуры двигателя 77 градусов и 12 вольт напряжения , как будто вебаста выдала данные на момент отключения.