Messages transmitted via pc.printf to PC are supplemented with checksums to increase the reliability of communication.The pc.printf command was introduced, which sends an empty string once per second in case of data loss (corruption) during transfer

Dependencies:   _24LCXXX

Committer:
Aleksk
Date:
Fri Sep 11 08:00:35 2020 +0000
Revision:
8:bf73cc68a823
Parent:
7:97881cd71b31
Messages transmitted via pc.printf to PC are supplemented with checksums to increase the reliability of communication.The pc.printf command was introduced, which sends an empty string once per second in case of data loss (corruption) during transfer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Aleksk 8:bf73cc68a823 1 // 10.09.2020 Продолжение (клон )mbed-os5-press15
Aleksk 8:bf73cc68a823 2 // Суммирование значений каналов А0 А1 А2 было 9 раз, исправлено на 10.
Aleksk 8:bf73cc68a823 3 // Передаваемые через pc.printf сообщения в РС дополнены контрольными суммами для увеличения надёжности связи.
Aleksk 8:bf73cc68a823 4 // Введена команда pc.printf, посылающая пустую строку раз в секунду, на случай потери (порчи )данных при пересылке и
Aleksk 8:bf73cc68a823 5 // возможного зависания программы оператора при ожидании символа из serial порта (для этого добавлен timer_4).
Aleksk 8:bf73cc68a823 6 // Значения уставок EEPROM2 выводяться в pc.print в специальной строке с текущими данными диагностики
Aleksk 7:97881cd71b31 7 // Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок, они пишутся в EEPROM2
Aleksk 6:fe0a7180ebb7 8 // Сделан timer_2 для отсчёта времени открытого состояния вентиля 1
Aleksk 6:fe0a7180ebb7 9 // Сделан timer_3 для отсчёта времени открытого состояния вентиля 2
Aleksk 6:fe0a7180ebb7 10 // Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям.
Aleksk 6:fe0a7180ebb7 11 // Реализован сброс события (event_N = 255) через кнопку Стоп в программе оператора
Aleksk 5:bb595cde0c82 12 // Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора
Aleksk 5:bb595cde0c82 13 // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
Aleksk 5:bb595cde0c82 14 // Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора.
Aleksk 5:bb595cde0c82 15 // Эта уставка, как и все остальные, пишется в EEPROM.
Aleksk 5:bb595cde0c82 16 // Включены все шесть аналоговых входа, читаются пять
Aleksk 4:c34b84bfa2fb 17 // при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
Aleksk 4:c34b84bfa2fb 18 // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
Aleksk 4:c34b84bfa2fb 19 // сторожевой таймер, истекает через 100мс
Aleksk 4:c34b84bfa2fb 20 //
Aleksk 4:c34b84bfa2fb 21
Aleksk 0:f2aaa8c6decf 22 #include "mbed.h"
Aleksk 2:8230a5a4cc13 23 #include "_24LCXXX.h"
Aleksk 2:8230a5a4cc13 24
Aleksk 2:8230a5a4cc13 25 I2C i2c(PB_9,PB_8); // sda, scl
Aleksk 2:8230a5a4cc13 26 _24LCXXX eeprom(&i2c, 0x50);
Aleksk 0:f2aaa8c6decf 27
Aleksk 4:c34b84bfa2fb 28 AnalogIn analog_value_0(A0); //подключение аналогового входа A0
Aleksk 4:c34b84bfa2fb 29 AnalogIn analog_value_1(A1); //подключение аналогового входа A1
Aleksk 4:c34b84bfa2fb 30 AnalogIn analog_value_2(A2); //подключение аналогового входа A2
Aleksk 4:c34b84bfa2fb 31 AnalogIn analog_value_3(A3); //подключение аналогового входа A3
Aleksk 4:c34b84bfa2fb 32 AnalogIn analog_value_4(A4); //подключение аналогового входа A4
Aleksk 4:c34b84bfa2fb 33 AnalogIn analog_value_5(A5); //подключение аналогового входа A5
Aleksk 6:fe0a7180ebb7 34 //DigitalOut led(LED1);
Aleksk 0:f2aaa8c6decf 35 DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge).
Aleksk 4:c34b84bfa2fb 36 DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge)
Aleksk 4:c34b84bfa2fb 37 DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4)
Aleksk 4:c34b84bfa2fb 38 DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off)
Aleksk 6:fe0a7180ebb7 39 DigitalIn idigital_11(PA_7); //initialize digital pin 11 as an input концевик при растяжении сильфона
Aleksk 6:fe0a7180ebb7 40 DigitalIn idigital_12(PA_6); //initialize digital pin 12 as an input концевик при сжатии сильфона
Aleksk 7:97881cd71b31 41 DigitalIn idigital_13(PA_5); //initialize digital pin 13 as an input внутрь опрессовщика попала вода
Aleksk 4:c34b84bfa2fb 42
Aleksk 4:c34b84bfa2fb 43 RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages
Aleksk 4:c34b84bfa2fb 44 RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC
Aleksk 0:f2aaa8c6decf 45 EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5
Aleksk 6:fe0a7180ebb7 46 Timer timer; //инициализация таймера для определения частот переключений вентилей 1 и 2
Aleksk 6:fe0a7180ebb7 47 Timer timer_2; //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1
Aleksk 6:fe0a7180ebb7 48 Timer timer_3; //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2
Aleksk 8:bf73cc68a823 49 Timer timer_4; //инициализация таймера 4 для отсчёта периода времени отсылки в порт компьютера пустой строки.
Aleksk 6:fe0a7180ebb7 50 //========УСТАВКИ_1 EEPROM========
Aleksk 5:bb595cde0c82 51 uint8_t delta_value = 0; //set delta pressure 1...99
Aleksk 6:fe0a7180ebb7 52 uint8_t flag_compressor = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
Aleksk 6:fe0a7180ebb7 53 uint8_t flag_stopRegulator = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
Aleksk 5:bb595cde0c82 54 uint8_t num_chan = 1; //set номер аналогового канала 0...5 (1-as default = Pa)
Aleksk 4:c34b84bfa2fb 55 int value = 0; //set begin value "pressure" 1...3300
Aleksk 6:fe0a7180ebb7 56 //========УСТАВКИ_2 EEPROM========
Aleksk 6:fe0a7180ebb7 57 int Pd_eeprom = 2000; // mV, максимальное дифференциальное давление (беззнаковое)
Aleksk 6:fe0a7180ebb7 58 int frequencyValve1_eeprom = 5; // Гц, максимальная частота переключений клапана 1
Aleksk 6:fe0a7180ebb7 59 int frequencyValve2_eeprom = 5; // Гц, максимальная частота переключений клапана 2
Aleksk 6:fe0a7180ebb7 60 int WL01_eeprom = 10; // mV, минимальный вес опрессовщика
Aleksk 6:fe0a7180ebb7 61 int WL99_eeprom = 2000; // mV, максимальный вес опрессовщика
Aleksk 6:fe0a7180ebb7 62 int T_1 = 4000; // ms, максимальное время открытого состояния для клапана 1
Aleksk 6:fe0a7180ebb7 63 int T_2 = 4000; // ms, максимальное время открытого состояния для клапана 2
Aleksk 6:fe0a7180ebb7 64 uint8_t event_N = 255; // номер события , по умолчанию 255 - событий нет
Aleksk 7:97881cd71b31 65 uint8_t flag_stopRegulatorEEPROM = 0; //если 1 остановка регулятора, когда вручную управляют клапанами через программу SetUp_EEPROM
Aleksk 6:fe0a7180ebb7 66 //======temporary set=====
Aleksk 6:fe0a7180ebb7 67 int numSet, anySet;
Aleksk 6:fe0a7180ebb7 68 //=================================
Aleksk 0:f2aaa8c6decf 69 int value_auto=250 ; //set begin value auto "pressure"
Aleksk 4:c34b84bfa2fb 70 int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика)
Aleksk 4:c34b84bfa2fb 71 int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление)
Aleksk 4:c34b84bfa2fb 72 int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне)
Aleksk 4:c34b84bfa2fb 73 int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика)
Aleksk 4:c34b84bfa2fb 74 int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета)
Aleksk 4:c34b84bfa2fb 75 int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика)
Aleksk 2:8230a5a4cc13 76 int counter_cycle1 = 0; //счётчик цикла while(true)
Aleksk 2:8230a5a4cc13 77 int counter_cycle2 = 0; //счётчик внутри функции auto_set
Aleksk 0:f2aaa8c6decf 78 int sig = 1; //знак инкримента для автоустаки
Aleksk 6:fe0a7180ebb7 79
Aleksk 0:f2aaa8c6decf 80 // FIFO_buffer must be full (only char and '\0')
Aleksk 5:bb595cde0c82 81 //#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
Aleksk 5:bb595cde0c82 82 #define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
Aleksk 5:bb595cde0c82 83 char Source[maxnsym]="$press,1000,25,0,0,1,2050**"; //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26
Aleksk 0:f2aaa8c6decf 84 //уставки и контрольная сумма умноженная на два, должны быть больше нуля
Aleksk 0:f2aaa8c6decf 85 char trueSource[maxnsym]; //верифицированная строка для callback
Aleksk 2:8230a5a4cc13 86 char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback
Aleksk 6:fe0a7180ebb7 87 char trueSource2[maxnsym]; //верифицированная строка для callback
Aleksk 6:fe0a7180ebb7 88 char trueSource2Old[maxnsym]; //предыдущая верифицированная строка для callback
Aleksk 0:f2aaa8c6decf 89
Aleksk 4:c34b84bfa2fb 90 volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором
Aleksk 4:c34b84bfa2fb 91 volatile bool flag_comand_detected = false; //если строка декодирована правильно то true
Aleksk 6:fe0a7180ebb7 92 volatile bool flag_comand2_detected = false; //если строка в блоке парсинга уставок eeprom декодирована правильно то true
Aleksk 4:c34b84bfa2fb 93 volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true
Aleksk 6:fe0a7180ebb7 94 //volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана
Aleksk 2:8230a5a4cc13 95 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 96 void save_EEPROM () {
Aleksk 2:8230a5a4cc13 97 int data2;
Aleksk 4:c34b84bfa2fb 98 plotter.printf("EEPROM write------\r\n");
Aleksk 2:8230a5a4cc13 99 eeprom.byte_write(0, delta_value);
Aleksk 6:fe0a7180ebb7 100 eeprom.byte_write(1, flag_compressor);
Aleksk 6:fe0a7180ebb7 101 eeprom.byte_write(2, flag_stopRegulator);
Aleksk 5:bb595cde0c82 102 eeprom.byte_write(3, num_chan);
Aleksk 2:8230a5a4cc13 103 data2 = value;
Aleksk 2:8230a5a4cc13 104 eeprom.nbyte_write( 10, &data2, sizeof(int));
Aleksk 2:8230a5a4cc13 105 }
Aleksk 7:97881cd71b31 106 void save_EEPROM2 () {
Aleksk 7:97881cd71b31 107 int data2;
Aleksk 7:97881cd71b31 108 plotter.printf("EEPROM2 write------\r\n");
Aleksk 7:97881cd71b31 109 eeprom.nbyte_read( 100, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 110 if (data2 != Pd_eeprom) { //записываем в eeprom только изменившиеся значения (одна из семи уставок)
Aleksk 7:97881cd71b31 111 data2 = Pd_eeprom;
Aleksk 7:97881cd71b31 112 eeprom.nbyte_write( 100, &data2, sizeof(int));
Aleksk 7:97881cd71b31 113 }
Aleksk 7:97881cd71b31 114 eeprom.nbyte_read( 110, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 115 if (data2 != frequencyValve1_eeprom){
Aleksk 7:97881cd71b31 116 data2 = frequencyValve1_eeprom;
Aleksk 7:97881cd71b31 117 eeprom.nbyte_write( 110, &data2, sizeof(int));
Aleksk 7:97881cd71b31 118 }
Aleksk 7:97881cd71b31 119 eeprom.nbyte_read( 120, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 120 if (data2 != frequencyValve2_eeprom){
Aleksk 7:97881cd71b31 121 data2 = frequencyValve2_eeprom;
Aleksk 7:97881cd71b31 122 eeprom.nbyte_write( 120, &data2, sizeof(int));
Aleksk 7:97881cd71b31 123 }
Aleksk 7:97881cd71b31 124 eeprom.nbyte_read( 130, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 125 if (data2 != WL01_eeprom){
Aleksk 7:97881cd71b31 126 data2 = WL01_eeprom;
Aleksk 7:97881cd71b31 127 eeprom.nbyte_write( 130, &data2, sizeof(int));
Aleksk 7:97881cd71b31 128 }
Aleksk 7:97881cd71b31 129 eeprom.nbyte_read( 140, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 130 if (data2 != WL99_eeprom){
Aleksk 7:97881cd71b31 131 data2 = WL99_eeprom;
Aleksk 7:97881cd71b31 132 eeprom.nbyte_write( 140, &data2, sizeof(int));
Aleksk 7:97881cd71b31 133 }
Aleksk 7:97881cd71b31 134 eeprom.nbyte_read( 180, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 135 if (data2 != T_1){
Aleksk 7:97881cd71b31 136 data2 = T_1;
Aleksk 7:97881cd71b31 137 eeprom.nbyte_write( 180, &data2, sizeof(int));
Aleksk 7:97881cd71b31 138 }
Aleksk 7:97881cd71b31 139 eeprom.nbyte_read( 190, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 140 if (data2 != T_2){
Aleksk 7:97881cd71b31 141 data2 = T_2;
Aleksk 7:97881cd71b31 142 eeprom.nbyte_write( 190, &data2, sizeof(int));
Aleksk 7:97881cd71b31 143 }
Aleksk 7:97881cd71b31 144
Aleksk 7:97881cd71b31 145 }
Aleksk 2:8230a5a4cc13 146 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 147 void load_EEPROM () {
Aleksk 2:8230a5a4cc13 148 uint8_t data1;
Aleksk 2:8230a5a4cc13 149 int data2;
Aleksk 4:c34b84bfa2fb 150 plotter.printf("EEPROM read------\r\n");
Aleksk 2:8230a5a4cc13 151 eeprom.nbyte_read( 0, &data1, 1 );
Aleksk 4:c34b84bfa2fb 152 plotter.printf("adress 0 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 153 delta_value=data1;
Aleksk 2:8230a5a4cc13 154 eeprom.nbyte_read( 1, &data1, 1 );
Aleksk 4:c34b84bfa2fb 155 plotter.printf("adress 1 =%d \r\n",data1);
Aleksk 6:fe0a7180ebb7 156 flag_compressor=data1;
Aleksk 2:8230a5a4cc13 157 eeprom.nbyte_read( 2, &data1, 1 );
Aleksk 4:c34b84bfa2fb 158 plotter.printf("adress 2 =%d \r\n",data1);
Aleksk 6:fe0a7180ebb7 159 flag_stopRegulator=data1;
Aleksk 5:bb595cde0c82 160 eeprom.nbyte_read( 3, &data1, 1 );
Aleksk 5:bb595cde0c82 161 plotter.printf("adress 3 =%d \r\n",data1);
Aleksk 5:bb595cde0c82 162 num_chan=data1;
Aleksk 2:8230a5a4cc13 163 eeprom.nbyte_read( 10, &data2, sizeof(int) );
Aleksk 4:c34b84bfa2fb 164 plotter.printf("adress 10 = %d \r\n",data2);
Aleksk 2:8230a5a4cc13 165 value=data2;
Aleksk 2:8230a5a4cc13 166 }
Aleksk 7:97881cd71b31 167 void load_EEPROM2 () {
Aleksk 7:97881cd71b31 168 int data2;
Aleksk 7:97881cd71b31 169 plotter.printf("EEPROM2 read------\r\n");
Aleksk 7:97881cd71b31 170 eeprom.nbyte_read( 100, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 171 //pc.printf("$adress,100,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 172 Pd_eeprom=data2;
Aleksk 7:97881cd71b31 173 eeprom.nbyte_read( 110, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 174 //pc.printf("$adress,110,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 175 frequencyValve1_eeprom=data2;
Aleksk 7:97881cd71b31 176 eeprom.nbyte_read( 120, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 177 //pc.printf("$adress,120,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 178 frequencyValve2_eeprom=data2;
Aleksk 7:97881cd71b31 179 eeprom.nbyte_read( 130, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 180 //pc.printf("$adress,130,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 181 WL01_eeprom=data2;
Aleksk 7:97881cd71b31 182 eeprom.nbyte_read( 140, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 183 //pc.printf("$adress,140,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 184 WL99_eeprom=data2;
Aleksk 7:97881cd71b31 185 eeprom.nbyte_read( 180, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 186 //pc.printf("$adress,180,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 187 T_1=data2;
Aleksk 7:97881cd71b31 188 eeprom.nbyte_read( 190, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 189 //pc.printf("$adress,190,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 190 T_2=data2;
Aleksk 7:97881cd71b31 191 //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
Aleksk 7:97881cd71b31 192 }
Aleksk 0:f2aaa8c6decf 193 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 194 void substring(char *s,char *d,int pos,int len) {
Aleksk 0:f2aaa8c6decf 195 //usage: substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 196 char *t;
Aleksk 0:f2aaa8c6decf 197 s=s+(pos-1);
Aleksk 0:f2aaa8c6decf 198 t=s+len;
Aleksk 0:f2aaa8c6decf 199 while (s!=t) {
Aleksk 0:f2aaa8c6decf 200 *d=*s;
Aleksk 0:f2aaa8c6decf 201 s++;
Aleksk 0:f2aaa8c6decf 202 d++;
Aleksk 0:f2aaa8c6decf 203 }
Aleksk 0:f2aaa8c6decf 204 *d='\0';
Aleksk 0:f2aaa8c6decf 205 }
Aleksk 0:f2aaa8c6decf 206 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 207 void onDataReceived(); // callback
Aleksk 0:f2aaa8c6decf 208 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 209 void read_serial(void) {
Aleksk 0:f2aaa8c6decf 210 char Destination[50];
Aleksk 0:f2aaa8c6decf 211 int pos,len;
Aleksk 0:f2aaa8c6decf 212 int controlSum1, controlSum2;
Aleksk 6:fe0a7180ebb7 213 int value_, delta_value_, flag_compressor_, flag_stopRegulator_, num_chan_;
Aleksk 6:fe0a7180ebb7 214 int controlSumSet1, controlSumSet2;
Aleksk 6:fe0a7180ebb7 215 int numSet_, anySet_;
Aleksk 0:f2aaa8c6decf 216 int ch = '$'; // Код искомого символа
Aleksk 0:f2aaa8c6decf 217 int indexCh; // Char on position
Aleksk 0:f2aaa8c6decf 218 char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск.
Aleksk 0:f2aaa8c6decf 219 while(pc.readable()) {
Aleksk 0:f2aaa8c6decf 220 chr_a = pc.getc();
Aleksk 0:f2aaa8c6decf 221 //_____FIFO_buffer_begin_____
Aleksk 0:f2aaa8c6decf 222 for ( int i = 2; i < maxnsym; i++) {
Aleksk 0:f2aaa8c6decf 223 Source[i-2]=Source[i-1];
Aleksk 0:f2aaa8c6decf 224 }
Aleksk 0:f2aaa8c6decf 225 Source[maxnsym-2]=chr_a; //предпоследний элемент
Aleksk 0:f2aaa8c6decf 226 Source[maxnsym-1] ='\0'; //последний элемент массива это нуль-терминал для формирования конца строки в Си
Aleksk 0:f2aaa8c6decf 227 //_____FIFO_buffer_end_______
Aleksk 0:f2aaa8c6decf 228 }
Aleksk 0:f2aaa8c6decf 229 ach=strchr (Source,ch); //поиск первого вхождения символа в строку , ищем указатель символа ‘$’
Aleksk 0:f2aaa8c6decf 230 if (ach==NULL) {
Aleksk 0:f2aaa8c6decf 231 //pc.printf ("Char not finded \r\n"); //Символ $ в строке не найден
Aleksk 0:f2aaa8c6decf 232 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 233 }
Aleksk 0:f2aaa8c6decf 234 else {
Aleksk 0:f2aaa8c6decf 235 indexCh = ach-Source+1; //вычитаем указатель из указателя!
Aleksk 0:f2aaa8c6decf 236 //pc.printf ("Char '$' on position %d\r\n",indexCh); //Искомый символ в строке на позиции
Aleksk 0:f2aaa8c6decf 237 }
Aleksk 0:f2aaa8c6decf 238 if (indexCh!=1) { //позиция символа $ не 1
Aleksk 0:f2aaa8c6decf 239 //pc.printf ("$ position not 1 \r\n");
Aleksk 0:f2aaa8c6decf 240 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 241 }
Aleksk 0:f2aaa8c6decf 242
Aleksk 0:f2aaa8c6decf 243 pos=1; //начало подстроки $press - на 1 позиции
Aleksk 0:f2aaa8c6decf 244 len=6; //длина подстроки $press равна 6
Aleksk 0:f2aaa8c6decf 245 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 246 //pc.printf("for pos=%d and len=%d resultat is d= %s\r\n", pos, len, Destination);
Aleksk 0:f2aaa8c6decf 247
Aleksk 0:f2aaa8c6decf 248 if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают
Aleksk 0:f2aaa8c6decf 249 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки
Aleksk 6:fe0a7180ebb7 250 goto eepromSet ; //в начале сообщения нет $press , переход с следующему блоку приёма
Aleksk 0:f2aaa8c6decf 251 }
Aleksk 0:f2aaa8c6decf 252 pos=8; //начало подстроки 1000 - на 8 позиции
Aleksk 0:f2aaa8c6decf 253 len=4; //длина подстроки 1000 равна 4
Aleksk 0:f2aaa8c6decf 254 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 255 value_=atoi(Destination);
Aleksk 4:c34b84bfa2fb 256 //if (value_==0) {
Aleksk 4:c34b84bfa2fb 257 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 4:c34b84bfa2fb 258 // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг
Aleksk 4:c34b84bfa2fb 259 //}
Aleksk 0:f2aaa8c6decf 260 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_);
Aleksk 0:f2aaa8c6decf 261 pos=13; //начало подстроки 25 - на 13 позиции
Aleksk 0:f2aaa8c6decf 262 len=2; //длина подстроки 25 равна 2
Aleksk 0:f2aaa8c6decf 263 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 264 delta_value_=atoi(Destination);
Aleksk 4:c34b84bfa2fb 265 //if (delta_value_==0) {
Aleksk 4:c34b84bfa2fb 266 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 4:c34b84bfa2fb 267 // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг
Aleksk 4:c34b84bfa2fb 268 //}
Aleksk 0:f2aaa8c6decf 269 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_);
Aleksk 0:f2aaa8c6decf 270 pos=16; //начало подстроки 0 - на 16 позиции
Aleksk 0:f2aaa8c6decf 271 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 272 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 273 flag_compressor_=atoi(Destination);
Aleksk 6:fe0a7180ebb7 274 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_compressor_);
Aleksk 0:f2aaa8c6decf 275 pos=18; //начало подстроки 0 - на 18 позиции
Aleksk 0:f2aaa8c6decf 276 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 277 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 278 flag_stopRegulator_=atoi(Destination);
Aleksk 6:fe0a7180ebb7 279 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_stopRegulator_);
Aleksk 5:bb595cde0c82 280
Aleksk 5:bb595cde0c82 281 pos=20; //начало подстроки 1 - на 20 позиции
Aleksk 5:bb595cde0c82 282 len=1; //длина подстроки 1 равна 1
Aleksk 5:bb595cde0c82 283 substring(Source,Destination,pos,len);
Aleksk 5:bb595cde0c82 284 num_chan_=atoi(Destination);
Aleksk 5:bb595cde0c82 285 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, num_chan_);
Aleksk 5:bb595cde0c82 286
Aleksk 5:bb595cde0c82 287 pos=22; //начало подстроки 1025 - на 22 позиции
Aleksk 0:f2aaa8c6decf 288 len=4; //длина подстроки 1025 равна 4
Aleksk 0:f2aaa8c6decf 289 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 290 controlSum1=atoi(Destination);
Aleksk 5:bb595cde0c82 291 if (controlSum1==2) {
Aleksk 5:bb595cde0c82 292 flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 6:fe0a7180ebb7 293 flag_compressor=flag_compressor_; //здесь можно включать-выключать компрессор, но без записи в EEPROM
Aleksk 5:bb595cde0c82 294 goto endParsing; //контрольная сумма должна быть больше двух, пропускаем парсинг
Aleksk 0:f2aaa8c6decf 295 }
Aleksk 0:f2aaa8c6decf 296 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
Aleksk 6:fe0a7180ebb7 297 controlSum2=(value_+delta_value_+flag_compressor_+flag_stopRegulator_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении
Aleksk 0:f2aaa8c6decf 298 //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2);
Aleksk 0:f2aaa8c6decf 299 if (controlSum1!=controlSum2) { //не совпала контрольная сумма
Aleksk 0:f2aaa8c6decf 300 //pc.printf ("controlSum1!=controlSum2 \r\n");
Aleksk 4:c34b84bfa2fb 301 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 302 }
Aleksk 4:c34b84bfa2fb 303 //*********присваиваем проверенные значения глобальным переменным***********
Aleksk 4:c34b84bfa2fb 304 strcpy(trueSource,Source); //копировать из Source в trueSource
Aleksk 6:fe0a7180ebb7 305 if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не изменяем их в регуляторе и не пишем в EEPROM
Aleksk 6:fe0a7180ebb7 306 flag_compressor=flag_compressor_;
Aleksk 6:fe0a7180ebb7 307 flag_stopRegulator=flag_stopRegulator_; //для работы кнопки Stop
Aleksk 4:c34b84bfa2fb 308 } else {
Aleksk 4:c34b84bfa2fb 309 value=value_;
Aleksk 4:c34b84bfa2fb 310 delta_value=delta_value_;
Aleksk 6:fe0a7180ebb7 311 flag_compressor=flag_compressor_;
Aleksk 6:fe0a7180ebb7 312 flag_stopRegulator=flag_stopRegulator_;
Aleksk 5:bb595cde0c82 313 num_chan=num_chan_;
Aleksk 4:c34b84bfa2fb 314 }
Aleksk 7:97881cd71b31 315 flag_stopRegulatorEEPROM = 0; //флаг остановки только релейного регулятора (теперь регулятор управляет клапанами!)
Aleksk 0:f2aaa8c6decf 316 flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
Aleksk 6:fe0a7180ebb7 317 goto endParsing ; //завершение блока приема рабочих уставок для работяющего релейного регулятора
Aleksk 6:fe0a7180ebb7 318
Aleksk 6:fe0a7180ebb7 319 //========Начало блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
Aleksk 6:fe0a7180ebb7 320 eepromSet:
Aleksk 6:fe0a7180ebb7 321 if (strcmp(Destination,"$setup" ) != 0) { //функция возвращает ноль если строки совпадают
Aleksk 6:fe0a7180ebb7 322 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки
Aleksk 6:fe0a7180ebb7 323 goto endParsing ; //в начале сообщения нет $setup , пропускаем парсинг
Aleksk 6:fe0a7180ebb7 324 }
Aleksk 6:fe0a7180ebb7 325 pos=8; //начало подстроки 123 - на 8 позиции
Aleksk 6:fe0a7180ebb7 326 len=3; //длина подстроки 123 равна 3
Aleksk 6:fe0a7180ebb7 327 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 328 numSet_=atoi(Destination);
Aleksk 6:fe0a7180ebb7 329 pos=12; //начало подстроки 123456 - на 12 позиции
Aleksk 6:fe0a7180ebb7 330 len=6; //длина подстроки 123456 равна 6
Aleksk 6:fe0a7180ebb7 331 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 332 anySet_ =atoi(Destination);
Aleksk 6:fe0a7180ebb7 333 pos=19; //начало подстроки 1234567 - на 19 позиции
Aleksk 6:fe0a7180ebb7 334 len=7; //длина подстроки 1234567 равна 7
Aleksk 6:fe0a7180ebb7 335 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 336 controlSumSet1 =atoi(Destination);
Aleksk 6:fe0a7180ebb7 337 controlSumSet2=(numSet_+anySet_)*2;
Aleksk 6:fe0a7180ebb7 338 if (controlSumSet1!=controlSumSet2) { //не совпала контрольная сумма
Aleksk 6:fe0a7180ebb7 339 //pc.printf ("controlSumSet1!=controlSumSet2 \r\n");
Aleksk 6:fe0a7180ebb7 340 goto endParsing; //пропускаем парсинг
Aleksk 6:fe0a7180ebb7 341 }
Aleksk 6:fe0a7180ebb7 342 //*********присваиваем проверенные значения глобальным переменным***********
Aleksk 6:fe0a7180ebb7 343 strcpy(trueSource2,Source); //копировать из Source в trueSource2
Aleksk 6:fe0a7180ebb7 344 if (numSet_==0) { //при старте с пустым номером не изменяем уставки и не пишем в EEPROM
Aleksk 6:fe0a7180ebb7 345 goto endParsing; //пропускаем парсинг
Aleksk 6:fe0a7180ebb7 346 } else {
Aleksk 6:fe0a7180ebb7 347 numSet=numSet_;
Aleksk 6:fe0a7180ebb7 348 anySet=anySet_;
Aleksk 6:fe0a7180ebb7 349 }
Aleksk 7:97881cd71b31 350 //При первом входе в режим $setup из режима $press - Закрываются все клапана
Aleksk 7:97881cd71b31 351 if (flag_stopRegulatorEEPROM == 0) {
Aleksk 7:97881cd71b31 352 digital_4.write(0); //valve1 off
Aleksk 7:97881cd71b31 353 digital_7.write(0); //valve2 off
Aleksk 7:97881cd71b31 354 digital_5.write(0); //valve3,4 off
Aleksk 7:97881cd71b31 355 digital_6.write(0); //выключение компрессора
Aleksk 7:97881cd71b31 356 }
Aleksk 0:f2aaa8c6decf 357
Aleksk 6:fe0a7180ebb7 358 switch ( numSet ) {
Aleksk 6:fe0a7180ebb7 359 case 1: // это двоеточие
Aleksk 7:97881cd71b31 360 digital_4.write(anySet); //valve1
Aleksk 6:fe0a7180ebb7 361 plotter.printf("1 Valve1=%d\r\n",anySet);
Aleksk 6:fe0a7180ebb7 362 break;
Aleksk 6:fe0a7180ebb7 363 case 2:
Aleksk 7:97881cd71b31 364 digital_7.write(anySet); //valve2
Aleksk 6:fe0a7180ebb7 365 plotter.printf("2 Valve2=%d\r\n",anySet);
Aleksk 6:fe0a7180ebb7 366 break;
Aleksk 6:fe0a7180ebb7 367 case 3:
Aleksk 7:97881cd71b31 368 digital_5.write(anySet); //valve3,4
Aleksk 6:fe0a7180ebb7 369 plotter.printf("3 Valve3,4=%d\r\n",anySet);
Aleksk 6:fe0a7180ebb7 370 break;
Aleksk 6:fe0a7180ebb7 371 case 4:
Aleksk 7:97881cd71b31 372 digital_6.write(anySet); //компрессор
Aleksk 6:fe0a7180ebb7 373 plotter.printf("4 Compressor=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 374 break;
Aleksk 7:97881cd71b31 375 case 9:
Aleksk 7:97881cd71b31 376 if (anySet == 0) {
Aleksk 7:97881cd71b31 377 flag_stopRegulator=0;
Aleksk 7:97881cd71b31 378 pc.printf("Reset ALARM \r\n");
Aleksk 7:97881cd71b31 379 } else {
Aleksk 7:97881cd71b31 380 flag_stopRegulator = 1;
Aleksk 7:97881cd71b31 381 }
Aleksk 7:97881cd71b31 382 break;
Aleksk 6:fe0a7180ebb7 383 case 10:
Aleksk 6:fe0a7180ebb7 384 Pd_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 385 plotter.printf( "10 Pd_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 386 break;
Aleksk 6:fe0a7180ebb7 387 case 11:
Aleksk 6:fe0a7180ebb7 388 frequencyValve1_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 389 plotter.printf( "11 frequencyValve1_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 390 break;
Aleksk 6:fe0a7180ebb7 391 case 12:
Aleksk 6:fe0a7180ebb7 392 frequencyValve2_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 393 plotter.printf( "12 frequencyValve2_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 394 break;
Aleksk 6:fe0a7180ebb7 395 case 13:
Aleksk 6:fe0a7180ebb7 396 WL01_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 397 plotter.printf( "13 WL01_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 398 break;
Aleksk 6:fe0a7180ebb7 399 case 14:
Aleksk 6:fe0a7180ebb7 400 WL99_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 401 plotter.printf( "14 WL99_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 402 break;
Aleksk 6:fe0a7180ebb7 403 case 18:
Aleksk 6:fe0a7180ebb7 404 T_1 = anySet;
Aleksk 6:fe0a7180ebb7 405 plotter.printf( "18 T_1=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 406 break;
Aleksk 6:fe0a7180ebb7 407 case 19:
Aleksk 6:fe0a7180ebb7 408 T_2 = anySet;
Aleksk 6:fe0a7180ebb7 409 plotter.printf( "19 T_2=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 410 break;
Aleksk 6:fe0a7180ebb7 411 default:
Aleksk 6:fe0a7180ebb7 412 plotter.printf( "Wrong case.\r\n" );
Aleksk 6:fe0a7180ebb7 413 }
Aleksk 6:fe0a7180ebb7 414
Aleksk 7:97881cd71b31 415 flag_stopRegulatorEEPROM = 1; //флаг остановки только релейного регулятора (теперь оператор вручную управляет клапанами!)
Aleksk 7:97881cd71b31 416 flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
Aleksk 6:fe0a7180ebb7 417 //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
Aleksk 6:fe0a7180ebb7 418
Aleksk 0:f2aaa8c6decf 419 endParsing:
Aleksk 0:f2aaa8c6decf 420
Aleksk 0:f2aaa8c6decf 421
Aleksk 0:f2aaa8c6decf 422 pc.attach(&onDataReceived, Serial::RxIrq); // reattach interrupt - переподключение прерывания перед выходом из функции
Aleksk 0:f2aaa8c6decf 423 }
Aleksk 0:f2aaa8c6decf 424 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 425 void onDataReceived() {
Aleksk 0:f2aaa8c6decf 426 pc.attach(nullptr, Serial::RxIrq); // detach interrupt
Aleksk 0:f2aaa8c6decf 427 queue->call(read_serial); // process in a non ISR context - переход к функции приема строки -
Aleksk 0:f2aaa8c6decf 428 } // - в статусе отключенного прерывания (учим указатели!)
Aleksk 0:f2aaa8c6decf 429 //______________________________________________________________________________
Aleksk 5:bb595cde0c82 430 void auto_set () { //подпрограмма управления компрессором
Aleksk 5:bb595cde0c82 431
Aleksk 7:97881cd71b31 432 if (flag_stopRegulatorEEPROM == 0) {
Aleksk 7:97881cd71b31 433 digital_6.write(flag_compressor); //включение-выкючение компрессора
Aleksk 7:97881cd71b31 434 }
Aleksk 0:f2aaa8c6decf 435 }
Aleksk 7:97881cd71b31 436 //******************************************************************************************************************
Aleksk 7:97881cd71b31 437 //******************************************************************************************************************
Aleksk 0:f2aaa8c6decf 438
Aleksk 0:f2aaa8c6decf 439 int main() {
Aleksk 1:1d4ec28f17c4 440
Aleksk 0:f2aaa8c6decf 441 pc.attach(&onDataReceived, Serial::RxIrq);
Aleksk 8:bf73cc68a823 442 int time, time_2, time_3, time_4, ks, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
Aleksk 0:f2aaa8c6decf 443 int frequencyValve1, frequencyValve2;
Aleksk 4:c34b84bfa2fb 444 float raw_value_sum_0=0, raw_value_sum_1=0, raw_value_sum_2=0, raw_value_sum_3=0, raw_value_sum_4=0, raw_value_sum_5=0;
Aleksk 2:8230a5a4cc13 445 digital_4.write(0); //valve1 off;
Aleksk 4:c34b84bfa2fb 446 digital_7.write(0); //valve2 off;
Aleksk 5:bb595cde0c82 447 digital_5.write(0); //valve3,4 off;
Aleksk 5:bb595cde0c82 448 digital_6.write(0); //выключение компрессора
Aleksk 2:8230a5a4cc13 449 load_EEPROM (); //загрузка уставок из EEPROM
Aleksk 7:97881cd71b31 450 load_EEPROM2 (); //загрузка граничных уставок (аварийных событий)из EEPROM2
Aleksk 6:fe0a7180ebb7 451 if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) {
Aleksk 7:97881cd71b31 452 flag_stopRegulator=0; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
Aleksk 2:8230a5a4cc13 453 } else {
Aleksk 7:97881cd71b31 454 flag_stopRegulator = 1; //флаг остановки установлен
Aleksk 2:8230a5a4cc13 455 pc.printf("Regulator stopped, error in EEPROM \r\n");
Aleksk 2:8230a5a4cc13 456 }
Aleksk 2:8230a5a4cc13 457
Aleksk 1:1d4ec28f17c4 458 pc.printf("Program started \r\n");
Aleksk 2:8230a5a4cc13 459 Watchdog &watchdog = Watchdog::get_instance();
Aleksk 7:97881cd71b31 460 watchdog.start(100); //WDlimit = 100 ms
Aleksk 0:f2aaa8c6decf 461 timer.start();
Aleksk 6:fe0a7180ebb7 462 timer_2.start();
Aleksk 6:fe0a7180ebb7 463 timer_3.start();
Aleksk 8:bf73cc68a823 464 timer_4.start();
Aleksk 1:1d4ec28f17c4 465
Aleksk 0:f2aaa8c6decf 466 while (true){ //бесконечный цикл
Aleksk 2:8230a5a4cc13 467 // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
Aleksk 2:8230a5a4cc13 468 watchdog.kick();
Aleksk 4:c34b84bfa2fb 469
Aleksk 6:fe0a7180ebb7 470 if (flag_stopRegulator == 1){ event_N = 255;} //сброс события через кнопку Стоп в программе оператора
Aleksk 6:fe0a7180ebb7 471
Aleksk 6:fe0a7180ebb7 472 if (flag_stopRegulator == 1 || event_N < 255) { //полный останов регулятора и принудительное запирание всех клапанов
Aleksk 4:c34b84bfa2fb 473 digital_4.write(0); //valve1 off
Aleksk 4:c34b84bfa2fb 474 digital_7.write(0); //valve2 off
Aleksk 4:c34b84bfa2fb 475 digital_5.write(0); //valve3,4 off
Aleksk 5:bb595cde0c82 476 //digital_6.write(0); //выключение компрессора
Aleksk 4:c34b84bfa2fb 477 }
Aleksk 4:c34b84bfa2fb 478
Aleksk 1:1d4ec28f17c4 479 if (flag_comand_detected) { //пришла правильная командная строка
Aleksk 8:bf73cc68a823 480 ks=(value+delta_value+flag_compressor+flag_stopRegulator+
Aleksk 8:bf73cc68a823 481 sensor_value+frequencyValve1+frequencyValve2+
Aleksk 8:bf73cc68a823 482 WL+Pb+Pw1+Pw2+Pd+
Aleksk 8:bf73cc68a823 483 digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+event_N+idigital_11.read()+idigital_12.read()+idigital_13.read())*2;
Aleksk 8:bf73cc68a823 484 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 6:fe0a7180ebb7 485 value,delta_value,flag_compressor,flag_stopRegulator,
Aleksk 4:c34b84bfa2fb 486 sensor_value,frequencyValve1,frequencyValve2,
Aleksk 4:c34b84bfa2fb 487 WL,Pb,Pw1,Pw2,Pd,
Aleksk 8:bf73cc68a823 488 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),
Aleksk 8:bf73cc68a823 489 ks); //передача текущих значений в РС
Aleksk 7:97881cd71b31 490
Aleksk 0:f2aaa8c6decf 491 //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи
Aleksk 4:c34b84bfa2fb 492 flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
Aleksk 7:97881cd71b31 493
Aleksk 2:8230a5a4cc13 494 if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают
Aleksk 2:8230a5a4cc13 495 save_EEPROM (); //пишем в память уставки отличные от старых
Aleksk 2:8230a5a4cc13 496 load_EEPROM ();
Aleksk 2:8230a5a4cc13 497 }
Aleksk 2:8230a5a4cc13 498
Aleksk 2:8230a5a4cc13 499 strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld
Aleksk 0:f2aaa8c6decf 500 }
Aleksk 4:c34b84bfa2fb 501
Aleksk 7:97881cd71b31 502 if (flag_comand2_detected ) { //пришла правильная строка из программы SetUp_EEPROM и передана уставка
Aleksk 8:bf73cc68a823 503 ks=(value+delta_value+flag_compressor+flag_stopRegulator+
Aleksk 8:bf73cc68a823 504 sensor_value+frequencyValve1+frequencyValve2+
Aleksk 8:bf73cc68a823 505 WL+Pb+Pw1+Pw2+Pd+
Aleksk 8:bf73cc68a823 506 digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+
Aleksk 8:bf73cc68a823 507 event_N+idigital_11.read()+idigital_12.read()+idigital_13.read()+
Aleksk 8:bf73cc68a823 508 Pd_eeprom+frequencyValve1_eeprom+frequencyValve2_eeprom+WL01_eeprom+WL99_eeprom+T_1+T_2)*2;
Aleksk 8:bf73cc68a823 509 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 7:97881cd71b31 510 value,delta_value,flag_compressor,flag_stopRegulator, //1,2,3,4
Aleksk 7:97881cd71b31 511 sensor_value,frequencyValve1,frequencyValve2, //5,6,7
Aleksk 7:97881cd71b31 512 WL,Pb,Pw1,Pw2,Pd, //8,9,10,11,12
Aleksk 7:97881cd71b31 513 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(), //13,14,15,16
Aleksk 7:97881cd71b31 514 event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(), //17,18,19,20
Aleksk 8:bf73cc68a823 515 Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,
Aleksk 8:bf73cc68a823 516 ks); //21,22,23,24,25,26,27,28
Aleksk 7:97881cd71b31 517 flag_comand2_detected = false; //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта
Aleksk 7:97881cd71b31 518
Aleksk 7:97881cd71b31 519 if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) { //функция возвращает ноль если командные строки совпадают
Aleksk 7:97881cd71b31 520
Aleksk 7:97881cd71b31 521 save_EEPROM2 (); //пишем в память все уставки от SetUp_EEPROM если хоть одна изменилась
Aleksk 7:97881cd71b31 522 load_EEPROM2 ();
Aleksk 7:97881cd71b31 523 }
Aleksk 7:97881cd71b31 524 strcpy(trueSource2Old,trueSource2); //копировать из trueSource2 в trueSource2Old
Aleksk 7:97881cd71b31 525 //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
Aleksk 7:97881cd71b31 526 }
Aleksk 7:97881cd71b31 527
Aleksk 4:c34b84bfa2fb 528 if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
Aleksk 8:bf73cc68a823 529 ks=(value+delta_value+flag_compressor+flag_stopRegulator+
Aleksk 8:bf73cc68a823 530 sensor_value+frequencyValve1+frequencyValve2+
Aleksk 8:bf73cc68a823 531 WL+Pb+Pw1+Pw2+Pd+
Aleksk 8:bf73cc68a823 532 digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+event_N+idigital_11.read()+idigital_12.read()+idigital_13.read())*2;
Aleksk 8:bf73cc68a823 533 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 6:fe0a7180ebb7 534 value,delta_value,flag_compressor,flag_stopRegulator,
Aleksk 4:c34b84bfa2fb 535 sensor_value,frequencyValve1,frequencyValve2,
Aleksk 4:c34b84bfa2fb 536 WL,Pb,Pw1,Pw2,Pd,
Aleksk 8:bf73cc68a823 537 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),
Aleksk 8:bf73cc68a823 538 ks); //передача текущих значений в РС
Aleksk 4:c34b84bfa2fb 539 flag_zerostart = false;
Aleksk 4:c34b84bfa2fb 540 }
Aleksk 8:bf73cc68a823 541 //счет counter_cycle1 идет от еденицы
Aleksk 8:bf73cc68a823 542 if (counter_cycle1 < 11 ) {
Aleksk 4:c34b84bfa2fb 543 float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 544 raw_value_sum_0 = raw_value_sum_0 + raw_value_0;
Aleksk 4:c34b84bfa2fb 545 float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 546 raw_value_sum_1 = raw_value_sum_1 + raw_value_1;
Aleksk 4:c34b84bfa2fb 547 float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 548 raw_value_sum_2 = raw_value_sum_2 + raw_value_2;
Aleksk 4:c34b84bfa2fb 549 }
Aleksk 8:bf73cc68a823 550 if (counter_cycle1 >= 11 ) {
Aleksk 4:c34b84bfa2fb 551 float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 552 raw_value_sum_3 = raw_value_sum_3 + raw_value_3;
Aleksk 4:c34b84bfa2fb 553 float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 554 raw_value_sum_4 = raw_value_sum_4 + raw_value_4;
Aleksk 4:c34b84bfa2fb 555 //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 556 //raw_value_sum_5 = raw_value_sum_5 + raw_value_5;
Aleksk 4:c34b84bfa2fb 557 }
Aleksk 0:f2aaa8c6decf 558
Aleksk 8:bf73cc68a823 559 if (counter_cycle1 >= 20 ) {
Aleksk 0:f2aaa8c6decf 560 counter_cycle1=0;
Aleksk 4:c34b84bfa2fb 561
Aleksk 4:c34b84bfa2fb 562 WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 563 raw_value_sum_0 = 0 ;
Aleksk 4:c34b84bfa2fb 564 sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 565 raw_value_sum_1 = 0 ;
Aleksk 4:c34b84bfa2fb 566 Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 567 raw_value_sum_2 = 0 ;
Aleksk 4:c34b84bfa2fb 568 Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 569 raw_value_sum_3 = 0 ;
Aleksk 5:bb595cde0c82 570 Pw2 = raw_value_sum_4/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 571 raw_value_sum_4 = 0 ;
Aleksk 4:c34b84bfa2fb 572 //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 573 //raw_value_sum_5 = 0 ;
Aleksk 6:fe0a7180ebb7 574 Pd = abs(sensor_value - Pw1);
Aleksk 4:c34b84bfa2fb 575
Aleksk 5:bb595cde0c82 576 if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1
Aleksk 5:bb595cde0c82 577 if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3
Aleksk 5:bb595cde0c82 578 if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4
Aleksk 5:bb595cde0c82 579
Aleksk 7:97881cd71b31 580 if (flag_stopRegulator == 0 && event_N == 255 && flag_stopRegulatorEEPROM == 0) { // можно запускать регулятор
Aleksk 7:97881cd71b31 581 digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
Aleksk 1:1d4ec28f17c4 582 //--------------regulator begin-----------------------
Aleksk 5:bb595cde0c82 583 if (temp_valueSensor > value + delta_value) {
Aleksk 1:1d4ec28f17c4 584 valve2 = digital_7.read();
Aleksk 1:1d4ec28f17c4 585 digital_7.write(1); //valve2 on;
Aleksk 1:1d4ec28f17c4 586 if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2)
Aleksk 1:1d4ec28f17c4 587 digital_4.write(0); //valve1 off;
Aleksk 5:bb595cde0c82 588 } else if (temp_valueSensor < value - delta_value) {
Aleksk 1:1d4ec28f17c4 589 valve1 = digital_4.read();
Aleksk 1:1d4ec28f17c4 590 digital_4.write(1); //valve1 on;
Aleksk 1:1d4ec28f17c4 591 if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1)
Aleksk 1:1d4ec28f17c4 592 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 593 } else {
Aleksk 1:1d4ec28f17c4 594 digital_4.write(0); //valve1 off;
Aleksk 1:1d4ec28f17c4 595 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 596 }
Aleksk 1:1d4ec28f17c4 597 //--------------regulator end-------------------------
Aleksk 0:f2aaa8c6decf 598 }
Aleksk 0:f2aaa8c6decf 599 time=timer.read_us();
Aleksk 0:f2aaa8c6decf 600 if (time > 1000000) {
Aleksk 0:f2aaa8c6decf 601 timer.reset(); //начало счёта времени
Aleksk 0:f2aaa8c6decf 602 frequencyValve1 = countValve1; //частота (Гц) срабатывания клапана 1
Aleksk 0:f2aaa8c6decf 603 frequencyValve2 = countValve2; //частота (Гц) срабатывания клапана 2
Aleksk 0:f2aaa8c6decf 604 countValve1=0;
Aleksk 0:f2aaa8c6decf 605 countValve2=0;
Aleksk 0:f2aaa8c6decf 606 }
Aleksk 6:fe0a7180ebb7 607 //--------------------==_ALARM_scope_Begin==----------------------
Aleksk 6:fe0a7180ebb7 608 if (Pd >= Pd_eeprom) {
Aleksk 6:fe0a7180ebb7 609 event_N = 0;
Aleksk 6:fe0a7180ebb7 610 }
Aleksk 6:fe0a7180ebb7 611 if (frequencyValve1 >= frequencyValve1_eeprom) {
Aleksk 6:fe0a7180ebb7 612 event_N = 1;
Aleksk 6:fe0a7180ebb7 613 }
Aleksk 6:fe0a7180ebb7 614 if (frequencyValve2 >= frequencyValve2_eeprom) {
Aleksk 6:fe0a7180ebb7 615 event_N = 2;
Aleksk 6:fe0a7180ebb7 616 }
Aleksk 6:fe0a7180ebb7 617 if (WL <= WL01_eeprom) {
Aleksk 6:fe0a7180ebb7 618 event_N = 3;
Aleksk 6:fe0a7180ebb7 619 }
Aleksk 6:fe0a7180ebb7 620 if (WL >= WL99_eeprom) {
Aleksk 6:fe0a7180ebb7 621 event_N = 4;
Aleksk 6:fe0a7180ebb7 622 }
Aleksk 7:97881cd71b31 623 if (idigital_11.read()==0) {
Aleksk 6:fe0a7180ebb7 624 event_N = 5;
Aleksk 6:fe0a7180ebb7 625 }
Aleksk 7:97881cd71b31 626 if (idigital_12.read()==0) {
Aleksk 6:fe0a7180ebb7 627 event_N = 6;
Aleksk 6:fe0a7180ebb7 628 }
Aleksk 7:97881cd71b31 629 if (idigital_13.read()==0) {
Aleksk 6:fe0a7180ebb7 630 event_N = 7;
Aleksk 6:fe0a7180ebb7 631 }
Aleksk 0:f2aaa8c6decf 632
Aleksk 6:fe0a7180ebb7 633 //-----------------Valve1 open time----------------------
Aleksk 7:97881cd71b31 634 if (digital_4.read() == 0 || flag_stopRegulatorEEPROM == 1 ) { // для режима $setup отключаем счёт времени
Aleksk 6:fe0a7180ebb7 635 timer_2.reset();
Aleksk 6:fe0a7180ebb7 636 time_2 = 0;
Aleksk 6:fe0a7180ebb7 637 } else {
Aleksk 6:fe0a7180ebb7 638 time_2 = timer_2.read_ms();
Aleksk 6:fe0a7180ebb7 639 }
Aleksk 6:fe0a7180ebb7 640 if (time_2 >= T_1) {
Aleksk 6:fe0a7180ebb7 641 event_N = 8;
Aleksk 6:fe0a7180ebb7 642 }
Aleksk 6:fe0a7180ebb7 643 //-----------------Valve2 open time----------------------
Aleksk 7:97881cd71b31 644 if (digital_7.read() == 0 || flag_stopRegulatorEEPROM == 1) { // для режима $setup отключаем счёт времен
Aleksk 6:fe0a7180ebb7 645 timer_3.reset();
Aleksk 6:fe0a7180ebb7 646 time_3 = 0;
Aleksk 6:fe0a7180ebb7 647 } else {
Aleksk 6:fe0a7180ebb7 648 time_3 = timer_3.read_ms();
Aleksk 6:fe0a7180ebb7 649 }
Aleksk 6:fe0a7180ebb7 650 if (time_3 >= T_2) {
Aleksk 6:fe0a7180ebb7 651 event_N = 9;
Aleksk 6:fe0a7180ebb7 652 }
Aleksk 6:fe0a7180ebb7 653 //--------------------==_ALARM_scope_End==----------------------
Aleksk 6:fe0a7180ebb7 654
Aleksk 6:fe0a7180ebb7 655
Aleksk 6:fe0a7180ebb7 656 auto_set(); //включение-выкючение компрессора через flag_compressor
Aleksk 6:fe0a7180ebb7 657 //led = !led; //гасим/зажигаем индикаторный светодиод
Aleksk 0:f2aaa8c6decf 658 }
Aleksk 8:bf73cc68a823 659
Aleksk 8:bf73cc68a823 660 //---------------------print void string to PC----------------------------
Aleksk 8:bf73cc68a823 661 time_4 = timer_4.read_ms();
Aleksk 8:bf73cc68a823 662 if (time_4 >= 1000) {
Aleksk 8:bf73cc68a823 663 timer_4.reset();
Aleksk 8:bf73cc68a823 664 pc.printf("$\r\n"); //отправка пустой (символ $ обязателен!)строки раз в 1000 мс в PC
Aleksk 8:bf73cc68a823 665 }
Aleksk 8:bf73cc68a823 666
Aleksk 8:bf73cc68a823 667
Aleksk 0:f2aaa8c6decf 668 ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5
Aleksk 0:f2aaa8c6decf 669 counter_cycle1++;
Aleksk 0:f2aaa8c6decf 670
Aleksk 0:f2aaa8c6decf 671 }
Aleksk 0:f2aaa8c6decf 672 }