Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 // 19.06.2020 Продолжение (клон )mbed-os5-press12 00002 // значения уставок EEPROM2 выводяться в pc.print в специальной строке с текущими данными диагностики 00003 // Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок, они пишутся в EEPROM2 00004 // Сделан timer_2 для отсчёта времени открытого состояния вентиля 1 00005 // Сделан timer_3 для отсчёта времени открытого состояния вентиля 2 00006 // Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям. 00007 // Реализован сброс события (event_N = 255) через кнопку Стоп в программе оператора 00008 // Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора 00009 // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10) 00010 // Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора. 00011 // Эта уставка, как и все остальные, пишется в EEPROM. 00012 // Включены все шесть аналоговых входа, читаются пять 00013 // при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины 00014 // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM. 00015 // сторожевой таймер, истекает через 100мс 00016 // 00017 00018 #include "mbed.h" 00019 #include "_24LCXXX.h" 00020 00021 I2C i2c(PB_9,PB_8); // sda, scl 00022 _24LCXXX eeprom(&i2c, 0x50); 00023 00024 AnalogIn analog_value_0(A0); //подключение аналогового входа A0 00025 AnalogIn analog_value_1(A1); //подключение аналогового входа A1 00026 AnalogIn analog_value_2(A2); //подключение аналогового входа A2 00027 AnalogIn analog_value_3(A3); //подключение аналогового входа A3 00028 AnalogIn analog_value_4(A4); //подключение аналогового входа A4 00029 AnalogIn analog_value_5(A5); //подключение аналогового входа A5 00030 //DigitalOut led(LED1); 00031 DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge). 00032 DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge) 00033 DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4) 00034 DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off) 00035 DigitalIn idigital_11(PA_7); //initialize digital pin 11 as an input концевик при растяжении сильфона 00036 DigitalIn idigital_12(PA_6); //initialize digital pin 12 as an input концевик при сжатии сильфона 00037 DigitalIn idigital_13(PA_5); //initialize digital pin 13 as an input внутрь опрессовщика попала вода 00038 00039 RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages 00040 RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC 00041 EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5 00042 Timer timer; //инициализация таймера для определения частот переключений вентилей 1 и 2 00043 Timer timer_2; //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1 00044 Timer timer_3; //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2 00045 //========УСТАВКИ_1 EEPROM======== 00046 uint8_t delta_value = 0; //set delta pressure 1...99 00047 uint8_t flag_compressor = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора 00048 uint8_t flag_stopRegulator = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов 00049 uint8_t num_chan = 1; //set номер аналогового канала 0...5 (1-as default = Pa) 00050 int value = 0; //set begin value "pressure" 1...3300 00051 //========УСТАВКИ_2 EEPROM======== 00052 int Pd_eeprom = 2000; // mV, максимальное дифференциальное давление (беззнаковое) 00053 int frequencyValve1_eeprom = 5; // Гц, максимальная частота переключений клапана 1 00054 int frequencyValve2_eeprom = 5; // Гц, максимальная частота переключений клапана 2 00055 int WL01_eeprom = 10; // mV, минимальный вес опрессовщика 00056 int WL99_eeprom = 2000; // mV, максимальный вес опрессовщика 00057 int T_1 = 4000; // ms, максимальное время открытого состояния для клапана 1 00058 int T_2 = 4000; // ms, максимальное время открытого состояния для клапана 2 00059 uint8_t event_N = 255; // номер события , по умолчанию 255 - событий нет 00060 uint8_t flag_stopRegulatorEEPROM = 0; //если 1 остановка регулятора, когда вручную управляют клапанами через программу SetUp_EEPROM 00061 //======temporary set===== 00062 int numSet, anySet; 00063 //================================= 00064 int value_auto=250 ; //set begin value auto "pressure" 00065 int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика) 00066 int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление) 00067 int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне) 00068 int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика) 00069 int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета) 00070 int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика) 00071 int counter_cycle1 = 0; //счётчик цикла while(true) 00072 int counter_cycle2 = 0; //счётчик внутри функции auto_set 00073 int sig = 1; //знак инкримента для автоустаки 00074 00075 // FIFO_buffer must be full (only char and '\0') 00076 //#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания) 00077 #define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче) 00078 char Source[maxnsym]="$press,1000,25,0,0,1,2050**"; //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26 00079 //уставки и контрольная сумма умноженная на два, должны быть больше нуля 00080 char trueSource[maxnsym]; //верифицированная строка для callback 00081 char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback 00082 char trueSource2[maxnsym]; //верифицированная строка для callback 00083 char trueSource2Old[maxnsym]; //предыдущая верифицированная строка для callback 00084 00085 volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором 00086 volatile bool flag_comand_detected = false; //если строка декодирована правильно то true 00087 volatile bool flag_comand2_detected = false; //если строка в блоке парсинга уставок eeprom декодирована правильно то true 00088 volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true 00089 //volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана 00090 //_____________________________________________________________________________ 00091 void save_EEPROM () { 00092 int data2; 00093 plotter.printf("EEPROM write------\r\n"); 00094 eeprom.byte_write(0, delta_value); 00095 eeprom.byte_write(1, flag_compressor); 00096 eeprom.byte_write(2, flag_stopRegulator); 00097 eeprom.byte_write(3, num_chan); 00098 data2 = value; 00099 eeprom.nbyte_write( 10, &data2, sizeof(int)); 00100 } 00101 void save_EEPROM2 () { 00102 int data2; 00103 plotter.printf("EEPROM2 write------\r\n"); 00104 eeprom.nbyte_read( 100, &data2, sizeof(int) ); 00105 if (data2 != Pd_eeprom) { //записываем в eeprom только изменившиеся значения (одна из семи уставок) 00106 data2 = Pd_eeprom; 00107 eeprom.nbyte_write( 100, &data2, sizeof(int)); 00108 } 00109 eeprom.nbyte_read( 110, &data2, sizeof(int) ); 00110 if (data2 != frequencyValve1_eeprom){ 00111 data2 = frequencyValve1_eeprom; 00112 eeprom.nbyte_write( 110, &data2, sizeof(int)); 00113 } 00114 eeprom.nbyte_read( 120, &data2, sizeof(int) ); 00115 if (data2 != frequencyValve2_eeprom){ 00116 data2 = frequencyValve2_eeprom; 00117 eeprom.nbyte_write( 120, &data2, sizeof(int)); 00118 } 00119 eeprom.nbyte_read( 130, &data2, sizeof(int) ); 00120 if (data2 != WL01_eeprom){ 00121 data2 = WL01_eeprom; 00122 eeprom.nbyte_write( 130, &data2, sizeof(int)); 00123 } 00124 eeprom.nbyte_read( 140, &data2, sizeof(int) ); 00125 if (data2 != WL99_eeprom){ 00126 data2 = WL99_eeprom; 00127 eeprom.nbyte_write( 140, &data2, sizeof(int)); 00128 } 00129 eeprom.nbyte_read( 180, &data2, sizeof(int) ); 00130 if (data2 != T_1){ 00131 data2 = T_1; 00132 eeprom.nbyte_write( 180, &data2, sizeof(int)); 00133 } 00134 eeprom.nbyte_read( 190, &data2, sizeof(int) ); 00135 if (data2 != T_2){ 00136 data2 = T_2; 00137 eeprom.nbyte_write( 190, &data2, sizeof(int)); 00138 } 00139 00140 } 00141 //_____________________________________________________________________________ 00142 void load_EEPROM () { 00143 uint8_t data1; 00144 int data2; 00145 plotter.printf("EEPROM read------\r\n"); 00146 eeprom.nbyte_read( 0, &data1, 1 ); 00147 plotter.printf("adress 0 =%d \r\n",data1); 00148 delta_value=data1; 00149 eeprom.nbyte_read( 1, &data1, 1 ); 00150 plotter.printf("adress 1 =%d \r\n",data1); 00151 flag_compressor=data1; 00152 eeprom.nbyte_read( 2, &data1, 1 ); 00153 plotter.printf("adress 2 =%d \r\n",data1); 00154 flag_stopRegulator=data1; 00155 eeprom.nbyte_read( 3, &data1, 1 ); 00156 plotter.printf("adress 3 =%d \r\n",data1); 00157 num_chan=data1; 00158 eeprom.nbyte_read( 10, &data2, sizeof(int) ); 00159 plotter.printf("adress 10 = %d \r\n",data2); 00160 value=data2; 00161 } 00162 void load_EEPROM2 () { 00163 int data2; 00164 plotter.printf("EEPROM2 read------\r\n"); 00165 eeprom.nbyte_read( 100, &data2, sizeof(int) ); 00166 //pc.printf("$adress,100,%d,*\r\n",data2); 00167 Pd_eeprom=data2; 00168 eeprom.nbyte_read( 110, &data2, sizeof(int) ); 00169 //pc.printf("$adress,110,%d,*\r\n",data2); 00170 frequencyValve1_eeprom=data2; 00171 eeprom.nbyte_read( 120, &data2, sizeof(int) ); 00172 //pc.printf("$adress,120,%d,*\r\n",data2); 00173 frequencyValve2_eeprom=data2; 00174 eeprom.nbyte_read( 130, &data2, sizeof(int) ); 00175 //pc.printf("$adress,130,%d,*\r\n",data2); 00176 WL01_eeprom=data2; 00177 eeprom.nbyte_read( 140, &data2, sizeof(int) ); 00178 //pc.printf("$adress,140,%d,*\r\n",data2); 00179 WL99_eeprom=data2; 00180 eeprom.nbyte_read( 180, &data2, sizeof(int) ); 00181 //pc.printf("$adress,180,%d,*\r\n",data2); 00182 T_1=data2; 00183 eeprom.nbyte_read( 190, &data2, sizeof(int) ); 00184 //pc.printf("$adress,190,%d,*\r\n",data2); 00185 T_2=data2; 00186 //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); 00187 } 00188 //______________________________________________________________________________ 00189 void substring(char *s,char *d,int pos,int len) { 00190 //usage: substring(Source,Destination,pos,len); 00191 char *t; 00192 s=s+(pos-1); 00193 t=s+len; 00194 while (s!=t) { 00195 *d=*s; 00196 s++; 00197 d++; 00198 } 00199 *d='\0'; 00200 } 00201 //______________________________________________________________________________ 00202 void onDataReceived(); // callback 00203 //______________________________________________________________________________ 00204 void read_serial(void) { 00205 char Destination[50]; 00206 int pos,len; 00207 int controlSum1, controlSum2; 00208 int value_, delta_value_, flag_compressor_, flag_stopRegulator_, num_chan_; 00209 int controlSumSet1, controlSumSet2; 00210 int numSet_, anySet_; 00211 int ch = '$'; // Код искомого символа 00212 int indexCh; // Char on position 00213 char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск. 00214 while(pc.readable()) { 00215 chr_a = pc.getc(); 00216 //_____FIFO_buffer_begin_____ 00217 for ( int i = 2; i < maxnsym; i++) { 00218 Source[i-2]=Source[i-1]; 00219 } 00220 Source[maxnsym-2]=chr_a; //предпоследний элемент 00221 Source[maxnsym-1] ='\0'; //последний элемент массива это нуль-терминал для формирования конца строки в Си 00222 //_____FIFO_buffer_end_______ 00223 } 00224 ach=strchr (Source,ch); //поиск первого вхождения символа в строку , ищем указатель символа ‘$’ 00225 if (ach==NULL) { 00226 //pc.printf ("Char not finded \r\n"); //Символ $ в строке не найден 00227 goto endParsing; //пропускаем парсинг 00228 } 00229 else { 00230 indexCh = ach-Source+1; //вычитаем указатель из указателя! 00231 //pc.printf ("Char '$' on position %d\r\n",indexCh); //Искомый символ в строке на позиции 00232 } 00233 if (indexCh!=1) { //позиция символа $ не 1 00234 //pc.printf ("$ position not 1 \r\n"); 00235 goto endParsing; //пропускаем парсинг 00236 } 00237 00238 pos=1; //начало подстроки $press - на 1 позиции 00239 len=6; //длина подстроки $press равна 6 00240 substring(Source,Destination,pos,len); 00241 //pc.printf("for pos=%d and len=%d resultat is d= %s\r\n", pos, len, Destination); 00242 00243 if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают 00244 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки 00245 goto eepromSet ; //в начале сообщения нет $press , переход с следующему блоку приёма 00246 } 00247 pos=8; //начало подстроки 1000 - на 8 позиции 00248 len=4; //длина подстроки 1000 равна 4 00249 substring(Source,Destination,pos,len); 00250 value_=atoi(Destination); 00251 //if (value_==0) { 00252 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC 00253 // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг 00254 //} 00255 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_); 00256 pos=13; //начало подстроки 25 - на 13 позиции 00257 len=2; //длина подстроки 25 равна 2 00258 substring(Source,Destination,pos,len); 00259 delta_value_=atoi(Destination); 00260 //if (delta_value_==0) { 00261 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC 00262 // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг 00263 //} 00264 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_); 00265 pos=16; //начало подстроки 0 - на 16 позиции 00266 len=1; //длина подстроки 0 равна 1 00267 substring(Source,Destination,pos,len); 00268 flag_compressor_=atoi(Destination); 00269 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_compressor_); 00270 pos=18; //начало подстроки 0 - на 18 позиции 00271 len=1; //длина подстроки 0 равна 1 00272 substring(Source,Destination,pos,len); 00273 flag_stopRegulator_=atoi(Destination); 00274 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_stopRegulator_); 00275 00276 pos=20; //начало подстроки 1 - на 20 позиции 00277 len=1; //длина подстроки 1 равна 1 00278 substring(Source,Destination,pos,len); 00279 num_chan_=atoi(Destination); 00280 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, num_chan_); 00281 00282 pos=22; //начало подстроки 1025 - на 22 позиции 00283 len=4; //длина подстроки 1025 равна 4 00284 substring(Source,Destination,pos,len); 00285 controlSum1=atoi(Destination); 00286 if (controlSum1==2) { 00287 flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC 00288 flag_compressor=flag_compressor_; //здесь можно включать-выключать компрессор, но без записи в EEPROM 00289 goto endParsing; //контрольная сумма должна быть больше двух, пропускаем парсинг 00290 } 00291 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1); 00292 controlSum2=(value_+delta_value_+flag_compressor_+flag_stopRegulator_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении 00293 //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2); 00294 if (controlSum1!=controlSum2) { //не совпала контрольная сумма 00295 //pc.printf ("controlSum1!=controlSum2 \r\n"); 00296 goto endParsing; //пропускаем парсинг 00297 } 00298 //*********присваиваем проверенные значения глобальным переменным*********** 00299 strcpy(trueSource,Source); //копировать из Source в trueSource 00300 if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не изменяем их в регуляторе и не пишем в EEPROM 00301 flag_compressor=flag_compressor_; 00302 flag_stopRegulator=flag_stopRegulator_; //для работы кнопки Stop 00303 } else { 00304 value=value_; 00305 delta_value=delta_value_; 00306 flag_compressor=flag_compressor_; 00307 flag_stopRegulator=flag_stopRegulator_; 00308 num_chan=num_chan_; 00309 } 00310 flag_stopRegulatorEEPROM = 0; //флаг остановки только релейного регулятора (теперь регулятор управляет клапанами!) 00311 flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок 00312 goto endParsing ; //завершение блока приема рабочих уставок для работяющего релейного регулятора 00313 00314 //========Начало блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM =================== 00315 eepromSet: 00316 if (strcmp(Destination,"$setup" ) != 0) { //функция возвращает ноль если строки совпадают 00317 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки 00318 goto endParsing ; //в начале сообщения нет $setup , пропускаем парсинг 00319 } 00320 pos=8; //начало подстроки 123 - на 8 позиции 00321 len=3; //длина подстроки 123 равна 3 00322 substring(Source,Destination,pos,len); 00323 numSet_=atoi(Destination); 00324 pos=12; //начало подстроки 123456 - на 12 позиции 00325 len=6; //длина подстроки 123456 равна 6 00326 substring(Source,Destination,pos,len); 00327 anySet_ =atoi(Destination); 00328 pos=19; //начало подстроки 1234567 - на 19 позиции 00329 len=7; //длина подстроки 1234567 равна 7 00330 substring(Source,Destination,pos,len); 00331 controlSumSet1 =atoi(Destination); 00332 controlSumSet2=(numSet_+anySet_)*2; 00333 if (controlSumSet1!=controlSumSet2) { //не совпала контрольная сумма 00334 //pc.printf ("controlSumSet1!=controlSumSet2 \r\n"); 00335 goto endParsing; //пропускаем парсинг 00336 } 00337 //*********присваиваем проверенные значения глобальным переменным*********** 00338 strcpy(trueSource2,Source); //копировать из Source в trueSource2 00339 if (numSet_==0) { //при старте с пустым номером не изменяем уставки и не пишем в EEPROM 00340 goto endParsing; //пропускаем парсинг 00341 } else { 00342 numSet=numSet_; 00343 anySet=anySet_; 00344 } 00345 //При первом входе в режим $setup из режима $press - Закрываются все клапана 00346 if (flag_stopRegulatorEEPROM == 0) { 00347 digital_4.write(0); //valve1 off 00348 digital_7.write(0); //valve2 off 00349 digital_5.write(0); //valve3,4 off 00350 digital_6.write(0); //выключение компрессора 00351 } 00352 00353 switch ( numSet ) { 00354 case 1: // это двоеточие 00355 digital_4.write(anySet); //valve1 00356 plotter.printf("1 Valve1=%d\r\n",anySet); 00357 break; 00358 case 2: 00359 digital_7.write(anySet); //valve2 00360 plotter.printf("2 Valve2=%d\r\n",anySet); 00361 break; 00362 case 3: 00363 digital_5.write(anySet); //valve3,4 00364 plotter.printf("3 Valve3,4=%d\r\n",anySet); 00365 break; 00366 case 4: 00367 digital_6.write(anySet); //компрессор 00368 plotter.printf("4 Compressor=%d\r\n",anySet ); 00369 break; 00370 case 9: 00371 if (anySet == 0) { 00372 flag_stopRegulator=0; 00373 pc.printf("Reset ALARM \r\n"); 00374 } else { 00375 flag_stopRegulator = 1; 00376 } 00377 break; 00378 case 10: 00379 Pd_eeprom = anySet; 00380 plotter.printf( "10 Pd_eeprom=%d\r\n",anySet ); 00381 break; 00382 case 11: 00383 frequencyValve1_eeprom = anySet; 00384 plotter.printf( "11 frequencyValve1_eeprom=%d\r\n",anySet ); 00385 break; 00386 case 12: 00387 frequencyValve2_eeprom = anySet; 00388 plotter.printf( "12 frequencyValve2_eeprom=%d\r\n",anySet ); 00389 break; 00390 case 13: 00391 WL01_eeprom = anySet; 00392 plotter.printf( "13 WL01_eeprom=%d\r\n",anySet ); 00393 break; 00394 case 14: 00395 WL99_eeprom = anySet; 00396 plotter.printf( "14 WL99_eeprom=%d\r\n",anySet ); 00397 break; 00398 case 18: 00399 T_1 = anySet; 00400 plotter.printf( "18 T_1=%d\r\n",anySet ); 00401 break; 00402 case 19: 00403 T_2 = anySet; 00404 plotter.printf( "19 T_2=%d\r\n",anySet ); 00405 break; 00406 default: 00407 plotter.printf( "Wrong case.\r\n" ); 00408 } 00409 00410 flag_stopRegulatorEEPROM = 1; //флаг остановки только релейного регулятора (теперь оператор вручную управляет клапанами!) 00411 flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок 00412 //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM =================== 00413 00414 endParsing: 00415 00416 00417 pc.attach(&onDataReceived, Serial::RxIrq); // reattach interrupt - переподключение прерывания перед выходом из функции 00418 } 00419 //______________________________________________________________________________ 00420 void onDataReceived() { 00421 pc.attach(nullptr, Serial::RxIrq); // detach interrupt 00422 queue->call(read_serial); // process in a non ISR context - переход к функции приема строки - 00423 } // - в статусе отключенного прерывания (учим указатели!) 00424 //______________________________________________________________________________ 00425 void auto_set () { //подпрограмма управления компрессором 00426 00427 if (flag_stopRegulatorEEPROM == 0) { 00428 digital_6.write(flag_compressor); //включение-выкючение компрессора 00429 } 00430 } 00431 //****************************************************************************************************************** 00432 //****************************************************************************************************************** 00433 00434 int main() { 00435 00436 pc.attach(&onDataReceived, Serial::RxIrq); 00437 int time, time_2, time_3, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor; 00438 int frequencyValve1, frequencyValve2; 00439 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; 00440 digital_4.write(0); //valve1 off; 00441 digital_7.write(0); //valve2 off; 00442 digital_5.write(0); //valve3,4 off; 00443 digital_6.write(0); //выключение компрессора 00444 load_EEPROM (); //загрузка уставок из EEPROM 00445 load_EEPROM2 (); //загрузка граничных уставок (аварийных событий)из EEPROM2 00446 if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) { 00447 flag_stopRegulator=0; //уставки из EEPROM похожи на правду, разрешаем работу регулятора 00448 } else { 00449 flag_stopRegulator = 1; //флаг остановки установлен 00450 pc.printf("Regulator stopped, error in EEPROM \r\n"); 00451 } 00452 00453 pc.printf("Program started \r\n"); 00454 Watchdog &watchdog = Watchdog::get_instance(); 00455 watchdog.start(100); //WDlimit = 100 ms 00456 timer.start(); 00457 timer_2.start(); 00458 timer_3.start(); 00459 00460 while (true){ //бесконечный цикл 00461 // kick watchdog regularly within provided timeout (сброс собаки в начало счёта) 00462 watchdog.kick(); 00463 00464 if (flag_stopRegulator == 1){ event_N = 255;} //сброс события через кнопку Стоп в программе оператора 00465 00466 if (flag_stopRegulator == 1 || event_N < 255) { //полный останов регулятора и принудительное запирание всех клапанов 00467 digital_4.write(0); //valve1 off 00468 digital_7.write(0); //valve2 off 00469 digital_5.write(0); //valve3,4 off 00470 //digital_6.write(0); //выключение компрессора 00471 } 00472 00473 if (flag_comand_detected) { //пришла правильная командная строка 00474 00475 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n", 00476 value,delta_value,flag_compressor,flag_stopRegulator, 00477 sensor_value,frequencyValve1,frequencyValve2, 00478 WL,Pb,Pw1,Pw2,Pd, 00479 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read()); //передача текущих значений в РС 00480 00481 //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи 00482 flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта 00483 00484 if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают 00485 save_EEPROM (); //пишем в память уставки отличные от старых 00486 load_EEPROM (); 00487 } 00488 00489 strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld 00490 } 00491 00492 if (flag_comand2_detected ) { //пришла правильная строка из программы SetUp_EEPROM и передана уставка 00493 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,*\r\n", 00494 value,delta_value,flag_compressor,flag_stopRegulator, //1,2,3,4 00495 sensor_value,frequencyValve1,frequencyValve2, //5,6,7 00496 WL,Pb,Pw1,Pw2,Pd, //8,9,10,11,12 00497 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(), //13,14,15,16 00498 event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(), //17,18,19,20 00499 Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2 ); //21,22,23,24,25,26,27 00500 flag_comand2_detected = false; //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта 00501 00502 if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) { //функция возвращает ноль если командные строки совпадают 00503 00504 save_EEPROM2 (); //пишем в память все уставки от SetUp_EEPROM если хоть одна изменилась 00505 load_EEPROM2 (); 00506 } 00507 strcpy(trueSource2Old,trueSource2); //копировать из trueSource2 в trueSource2Old 00508 //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); 00509 } 00510 00511 if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске) 00512 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n", 00513 value,delta_value,flag_compressor,flag_stopRegulator, 00514 sensor_value,frequencyValve1,frequencyValve2, 00515 WL,Pb,Pw1,Pw2,Pd, 00516 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read()); //передача текущих значений в РС 00517 flag_zerostart = false; 00518 } 00519 00520 if (counter_cycle1 < 10 ) { 00521 float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон) 00522 raw_value_sum_0 = raw_value_sum_0 + raw_value_0; 00523 float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон) 00524 raw_value_sum_1 = raw_value_sum_1 + raw_value_1; 00525 float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон) 00526 raw_value_sum_2 = raw_value_sum_2 + raw_value_2; 00527 } 00528 if (counter_cycle1 >= 10 ) { 00529 float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон) 00530 raw_value_sum_3 = raw_value_sum_3 + raw_value_3; 00531 float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон) 00532 raw_value_sum_4 = raw_value_sum_4 + raw_value_4; 00533 //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон) 00534 //raw_value_sum_5 = raw_value_sum_5 + raw_value_5; 00535 } 00536 00537 if (counter_cycle1 >= 19 ) { 00538 counter_cycle1=0; 00539 00540 WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением 00541 raw_value_sum_0 = 0 ; 00542 sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением 00543 raw_value_sum_1 = 0 ; 00544 Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением 00545 raw_value_sum_2 = 0 ; 00546 Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением 00547 raw_value_sum_3 = 0 ; 00548 Pw2 = raw_value_sum_4/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением 00549 raw_value_sum_4 = 0 ; 00550 //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением 00551 //raw_value_sum_5 = 0 ; 00552 Pd = abs(sensor_value - Pw1); 00553 00554 if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1 00555 if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3 00556 if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4 00557 00558 if (flag_stopRegulator == 0 && event_N == 255 && flag_stopRegulatorEEPROM == 0) { // можно запускать регулятор 00559 digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета 00560 //--------------regulator begin----------------------- 00561 if (temp_valueSensor > value + delta_value) { 00562 valve2 = digital_7.read(); 00563 digital_7.write(1); //valve2 on; 00564 if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2) 00565 digital_4.write(0); //valve1 off; 00566 } else if (temp_valueSensor < value - delta_value) { 00567 valve1 = digital_4.read(); 00568 digital_4.write(1); //valve1 on; 00569 if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1) 00570 digital_7.write(0); //valve2 off; 00571 } else { 00572 digital_4.write(0); //valve1 off; 00573 digital_7.write(0); //valve2 off; 00574 } 00575 //--------------regulator end------------------------- 00576 } 00577 time=timer.read_us(); 00578 if (time > 1000000) { 00579 timer.reset(); //начало счёта времени 00580 frequencyValve1 = countValve1; //частота (Гц) срабатывания клапана 1 00581 frequencyValve2 = countValve2; //частота (Гц) срабатывания клапана 2 00582 countValve1=0; 00583 countValve2=0; 00584 } 00585 //--------------------==_ALARM_scope_Begin==---------------------- 00586 if (Pd >= Pd_eeprom) { 00587 event_N = 0; 00588 } 00589 if (frequencyValve1 >= frequencyValve1_eeprom) { 00590 event_N = 1; 00591 } 00592 if (frequencyValve2 >= frequencyValve2_eeprom) { 00593 event_N = 2; 00594 } 00595 if (WL <= WL01_eeprom) { 00596 event_N = 3; 00597 } 00598 if (WL >= WL99_eeprom) { 00599 event_N = 4; 00600 } 00601 if (idigital_11.read()==0) { 00602 event_N = 5; 00603 } 00604 if (idigital_12.read()==0) { 00605 event_N = 6; 00606 } 00607 if (idigital_13.read()==0) { 00608 event_N = 7; 00609 } 00610 00611 //-----------------Valve1 open time---------------------- 00612 if (digital_4.read() == 0 || flag_stopRegulatorEEPROM == 1 ) { // для режима $setup отключаем счёт времени 00613 timer_2.reset(); 00614 time_2 = 0; 00615 } else { 00616 time_2 = timer_2.read_ms(); 00617 } 00618 if (time_2 >= T_1) { 00619 event_N = 8; 00620 } 00621 //-----------------Valve2 open time---------------------- 00622 if (digital_7.read() == 0 || flag_stopRegulatorEEPROM == 1) { // для режима $setup отключаем счёт времен 00623 timer_3.reset(); 00624 time_3 = 0; 00625 } else { 00626 time_3 = timer_3.read_ms(); 00627 } 00628 if (time_3 >= T_2) { 00629 event_N = 9; 00630 } 00631 //--------------------==_ALARM_scope_End==---------------------- 00632 00633 00634 auto_set(); //включение-выкючение компрессора через flag_compressor 00635 //led = !led; //гасим/зажигаем индикаторный светодиод 00636 } 00637 ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5 00638 counter_cycle1++; 00639 00640 } 00641 }
Generated on Fri Jul 15 2022 06:15:21 by
1.7.2