The values of the EEPROM2 settings are displayed in pc.print in a special line with the current diagnostic data. An additional block has been made in the parser for decoding incoming alarm settings; they are written in EEPROM2.
Diff: main.cpp
- Revision:
- 6:fe0a7180ebb7
- Parent:
- 5:bb595cde0c82
- Child:
- 7:97881cd71b31
--- a/main.cpp Thu Jun 04 22:55:40 2020 +0000 +++ b/main.cpp Thu Jun 11 20:22:11 2020 +0000 @@ -1,4 +1,9 @@ -// 05.06.2020 Продолжение (клон )mbed-os5-press6 +// 11.06.2020 Продолжение (клон )mbed-os5-press9 +// Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок для EEPROM +// Сделан timer_2 для отсчёта времени открытого состояния вентиля 1 +// Сделан timer_3 для отсчёта времени открытого состояния вентиля 2 +// Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям. +// Реализован сброс события (event_N = 255) через кнопку Стоп в программе оператора // Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10) // Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора. @@ -21,24 +26,39 @@ AnalogIn analog_value_3(A3); //подключение аналогового входа A3 AnalogIn analog_value_4(A4); //подключение аналогового входа A4 AnalogIn analog_value_5(A5); //подключение аналогового входа A5 -DigitalOut led(LED1); +//DigitalOut led(LED1); DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge). DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge) DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4) DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off) +DigitalIn idigital_11(PA_7); //initialize digital pin 11 as an input концевик при растяжении сильфона +DigitalIn idigital_12(PA_6); //initialize digital pin 12 as an input концевик при сжатии сильфона +DigitalIn idigital_13(PA_5); //initialize digital pin 12 as an input внутрь опрессовщика попала вода RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5 -Timer timer; //инициализация таймера -//========УСТАВКИ======== +Timer timer; //инициализация таймера для определения частот переключений вентилей 1 и 2 +Timer timer_2; //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1 +Timer timer_3; //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2 +//========УСТАВКИ_1 EEPROM======== uint8_t delta_value = 0; //set delta pressure 1...99 -uint8_t flag_autoset = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора -uint8_t flag_plotter = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов +uint8_t flag_compressor = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора +uint8_t flag_stopRegulator = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов uint8_t num_chan = 1; //set номер аналогового канала 0...5 (1-as default = Pa) int value = 0; //set begin value "pressure" 1...3300 - -//======================= +//========УСТАВКИ_2 EEPROM======== +int Pd_eeprom = 2000; // mV, максимальное дифференциальное давление (беззнаковое) +int frequencyValve1_eeprom = 5; // Гц, максимальная частота переключений клапана 1 +int frequencyValve2_eeprom = 5; // Гц, максимальная частота переключений клапана 2 +int WL01_eeprom = 10; // mV, минимальный вес опрессовщика +int WL99_eeprom = 2000; // mV, максимальный вес опрессовщика +int T_1 = 4000; // ms, максимальное время открытого состояния для клапана 1 +int T_2 = 4000; // ms, максимальное время открытого состояния для клапана 2 +uint8_t event_N = 255; // номер события , по умолчанию 255 - событий нет +//======temporary set===== +int numSet, anySet; +//================================= int value_auto=250 ; //set begin value auto "pressure" int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика) int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление) @@ -49,6 +69,7 @@ int counter_cycle1 = 0; //счётчик цикла while(true) int counter_cycle2 = 0; //счётчик внутри функции auto_set int sig = 1; //знак инкримента для автоустаки + // FIFO_buffer must be full (only char and '\0') //#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания) #define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче) @@ -56,18 +77,21 @@ //уставки и контрольная сумма умноженная на два, должны быть больше нуля char trueSource[maxnsym]; //верифицированная строка для callback char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback +char trueSource2[maxnsym]; //верифицированная строка для callback +char trueSource2Old[maxnsym]; //предыдущая верифицированная строка для callback volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором volatile bool flag_comand_detected = false; //если строка декодирована правильно то true +volatile bool flag_comand2_detected = false; //если строка в блоке парсинга уставок eeprom декодирована правильно то true volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true -volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана +//volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана //_____________________________________________________________________________ void save_EEPROM () { int data2; plotter.printf("EEPROM write------\r\n"); eeprom.byte_write(0, delta_value); - eeprom.byte_write(1, flag_autoset); - eeprom.byte_write(2, flag_plotter); + eeprom.byte_write(1, flag_compressor); + eeprom.byte_write(2, flag_stopRegulator); eeprom.byte_write(3, num_chan); data2 = value; eeprom.nbyte_write( 10, &data2, sizeof(int)); @@ -82,10 +106,10 @@ delta_value=data1; eeprom.nbyte_read( 1, &data1, 1 ); plotter.printf("adress 1 =%d \r\n",data1); - flag_autoset=data1; + flag_compressor=data1; eeprom.nbyte_read( 2, &data1, 1 ); plotter.printf("adress 2 =%d \r\n",data1); - flag_plotter=data1; + flag_stopRegulator=data1; eeprom.nbyte_read( 3, &data1, 1 ); plotter.printf("adress 3 =%d \r\n",data1); num_chan=data1; @@ -113,7 +137,9 @@ char Destination[50]; int pos,len; int controlSum1, controlSum2; - int value_, delta_value_, flag_autoset_, flag_plotter_, num_chan_; + int value_, delta_value_, flag_compressor_, flag_stopRegulator_, num_chan_; + int controlSumSet1, controlSumSet2; + int numSet_, anySet_; int ch = '$'; // Код искомого символа int indexCh; // Char on position char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск. @@ -148,7 +174,7 @@ if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки - goto endParsing ; //в начале сообщения нет $press пропускаем парсинг + goto eepromSet ; //в начале сообщения нет $press , переход с следующему блоку приёма } pos=8; //начало подстроки 1000 - на 8 позиции len=4; //длина подстроки 1000 равна 4 @@ -171,13 +197,13 @@ pos=16; //начало подстроки 0 - на 16 позиции len=1; //длина подстроки 0 равна 1 substring(Source,Destination,pos,len); - flag_autoset_=atoi(Destination); - //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_autoset_); + flag_compressor_=atoi(Destination); + //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_compressor_); pos=18; //начало подстроки 0 - на 18 позиции len=1; //длина подстроки 0 равна 1 substring(Source,Destination,pos,len); - flag_plotter_=atoi(Destination); - //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_plotter_); + flag_stopRegulator_=atoi(Destination); + //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_stopRegulator_); pos=20; //начало подстроки 1 - на 20 позиции len=1; //длина подстроки 1 равна 1 @@ -191,11 +217,11 @@ controlSum1=atoi(Destination); if (controlSum1==2) { flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC - flag_autoset=flag_autoset_; //здесь можно включать-выключать компрессор, но без записи в EEPROM + flag_compressor=flag_compressor_; //здесь можно включать-выключать компрессор, но без записи в EEPROM goto endParsing; //контрольная сумма должна быть больше двух, пропускаем парсинг } //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1); - controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении + controlSum2=(value_+delta_value_+flag_compressor_+flag_stopRegulator_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2); if (controlSum1!=controlSum2) { //не совпала контрольная сумма //pc.printf ("controlSum1!=controlSum2 \r\n"); @@ -203,19 +229,108 @@ } //*********присваиваем проверенные значения глобальным переменным*********** strcpy(trueSource,Source); //копировать из Source в trueSource - if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не имземняем их в регуляторе и не пишем в EEPROM - flag_autoset=flag_autoset_; - flag_plotter=flag_plotter_; //для работы кнопки Stop + if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не изменяем их в регуляторе и не пишем в EEPROM + flag_compressor=flag_compressor_; + flag_stopRegulator=flag_stopRegulator_; //для работы кнопки Stop } else { value=value_; delta_value=delta_value_; - flag_autoset=flag_autoset_; - flag_plotter=flag_plotter_; + flag_compressor=flag_compressor_; + flag_stopRegulator=flag_stopRegulator_; num_chan=num_chan_; } flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок + goto endParsing ; //завершение блока приема рабочих уставок для работяющего релейного регулятора + + //========Начало блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM =================== + eepromSet: + if (strcmp(Destination,"$setup" ) != 0) { //функция возвращает ноль если строки совпадают + //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки + goto endParsing ; //в начале сообщения нет $setup , пропускаем парсинг + } + pos=8; //начало подстроки 123 - на 8 позиции + len=3; //длина подстроки 123 равна 3 + substring(Source,Destination,pos,len); + numSet_=atoi(Destination); + pos=12; //начало подстроки 123456 - на 12 позиции + len=6; //длина подстроки 123456 равна 6 + substring(Source,Destination,pos,len); + anySet_ =atoi(Destination); + pos=19; //начало подстроки 1234567 - на 19 позиции + len=7; //длина подстроки 1234567 равна 7 + substring(Source,Destination,pos,len); + controlSumSet1 =atoi(Destination); + controlSumSet2=(numSet_+anySet_)*2; + if (controlSumSet1!=controlSumSet2) { //не совпала контрольная сумма + //pc.printf ("controlSumSet1!=controlSumSet2 \r\n"); + goto endParsing; //пропускаем парсинг + } + //*********присваиваем проверенные значения глобальным переменным*********** + strcpy(trueSource2,Source); //копировать из Source в trueSource2 + if (numSet_==0) { //при старте с пустым номером не изменяем уставки и не пишем в EEPROM + goto endParsing; //пропускаем парсинг + } else { + numSet=numSet_; + anySet=anySet_; + } + switch ( numSet ) { + case 1: // это двоеточие + + plotter.printf("1 Valve1=%d\r\n",anySet); + break; + case 2: + plotter.printf("2 Valve2=%d\r\n",anySet); + break; + case 3: + plotter.printf("3 Valve3,4=%d\r\n",anySet); + break; + case 4: + plotter.printf("4 Compressor=%d\r\n",anySet ); + break; + case 10: + Pd_eeprom = anySet; + plotter.printf( "10 Pd_eeprom=%d\r\n",anySet ); + break; + case 11: + frequencyValve1_eeprom = anySet; + plotter.printf( "11 frequencyValve1_eeprom=%d\r\n",anySet ); + break; + case 12: + frequencyValve2_eeprom = anySet; + plotter.printf( "12 frequencyValve2_eeprom=%d\r\n",anySet ); + break; + case 13: + WL01_eeprom = anySet; + plotter.printf( "13 WL01_eeprom=%d\r\n",anySet ); + break; + case 14: + WL99_eeprom = anySet; + plotter.printf( "14 WL99_eeprom=%d\r\n",anySet ); + break; + case 18: + T_1 = anySet; + plotter.printf( "18 T_1=%d\r\n",anySet ); + break; + case 19: + T_2 = anySet; + plotter.printf( "19 T_2=%d\r\n",anySet ); + break; + default: + plotter.printf( "Wrong case.\r\n" ); + } + + + + + + + + + flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок + //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM =================== + endParsing: @@ -229,7 +344,7 @@ //______________________________________________________________________________ void auto_set () { //подпрограмма управления компрессором - digital_6.write(flag_autoset); //включение-выкючение компрессора + digital_6.write(flag_compressor); //включение-выкючение компрессора } //***************************************************************************** @@ -238,7 +353,7 @@ int main() { pc.attach(&onDataReceived, Serial::RxIrq); - int time, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor; + int time, time_2, time_3, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor; int frequencyValve1, frequencyValve2; 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; digital_4.write(0); //valve1 off; @@ -246,7 +361,7 @@ digital_5.write(0); //valve3,4 off; digital_6.write(0); //выключение компрессора load_EEPROM (); //загрузка уставок из EEPROM - if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2 && num_chan < 6) { + if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) { flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора } else { flag_stopRegulator = true; //флаг остановки установлен @@ -257,13 +372,16 @@ Watchdog &watchdog = Watchdog::get_instance(); watchdog.start(100); //WDlimit = 100 ms timer.start(); + timer_2.start(); + timer_3.start(); while (true){ //бесконечный цикл // kick watchdog regularly within provided timeout (сброс собаки в начало счёта) watchdog.kick(); - flag_stopRegulator = flag_plotter; //вывод на плоттер не актуален, теперь он будет флагом полной остановки опрессовщика - if (flag_stopRegulator) { //полный останов регулятора и принудительное запирание всех клапанов + if (flag_stopRegulator == 1){ event_N = 255;} //сброс события через кнопку Стоп в программе оператора + + if (flag_stopRegulator == 1 || event_N < 255) { //полный останов регулятора и принудительное запирание всех клапанов digital_4.write(0); //valve1 off digital_7.write(0); //valve2 off digital_5.write(0); //valve3,4 off @@ -271,14 +389,15 @@ } if (flag_comand_detected) { //пришла правильная командная строка - pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n", - value,delta_value,flag_autoset,flag_plotter, + + 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", + value,delta_value,flag_compressor,flag_stopRegulator, sensor_value,frequencyValve1,frequencyValve2, WL,Pb,Pw1,Pw2,Pd, - digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read()); //передача текущих значений в РС + digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read()); //передача текущих значений в РС // pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n", - // value,delta_value,flag_autoset,flag_plotter, + // value,delta_value,flag_compressor,flag_stopRegulator, // sensor_value,frequencyValve1,frequencyValve2); //передача текущих значений в РС //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи @@ -295,11 +414,11 @@ } if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске) - pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n", - value,delta_value,flag_autoset,flag_plotter, + 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", + value,delta_value,flag_compressor,flag_stopRegulator, sensor_value,frequencyValve1,frequencyValve2, WL,Pb,Pw1,Pw2,Pd, - digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read()); //передача текущих значений в РС + digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read()); //передача текущих значений в РС flag_zerostart = false; } @@ -335,12 +454,13 @@ raw_value_sum_4 = 0 ; //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением //raw_value_sum_5 = 0 ; + Pd = abs(sensor_value - Pw1); if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1 if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3 if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4 - if (flag_stopRegulator == false) { // можно запускать регулятор + if (flag_stopRegulator == 0 && event_N == 255) { // можно запускать регулятор digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета //--------------regulator begin----------------------- if (temp_valueSensor > value + delta_value) { @@ -367,9 +487,57 @@ countValve1=0; countValve2=0; } + //--------------------==_ALARM_scope_Begin==---------------------- + if (Pd >= Pd_eeprom) { + event_N = 0; + } + if (frequencyValve1 >= frequencyValve1_eeprom) { + event_N = 1; + } + if (frequencyValve2 >= frequencyValve2_eeprom) { + event_N = 2; + } + if (WL <= WL01_eeprom) { + event_N = 3; + } + if (WL >= WL99_eeprom) { + event_N = 4; + } + if (idigital_11.read()==1) { + event_N = 5; + } + if (idigital_12.read()==1) { + event_N = 6; + } + if (idigital_13.read()==1) { + event_N = 7; + } - auto_set(); //включение-выкючение компрессора через flag_autoset - led = !led; //гасим/зажигаем индикаторный светодиод + //-----------------Valve1 open time---------------------- + if (digital_4.read() == 0) { + timer_2.reset(); + time_2 = 0; + } else { + time_2 = timer_2.read_ms(); + } + if (time_2 >= T_1) { + event_N = 8; + } + //-----------------Valve2 open time---------------------- + if (digital_7.read() == 0) { + timer_3.reset(); + time_3 = 0; + } else { + time_3 = timer_3.read_ms(); + } + if (time_3 >= T_2) { + event_N = 9; + } + //--------------------==_ALARM_scope_End==---------------------- + + + auto_set(); //включение-выкючение компрессора через flag_compressor + //led = !led; //гасим/зажигаем индикаторный светодиод } ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5 counter_cycle1++;