When receiving a command line with a zero sum (empty lines), the flag_zerostart flag is set, and the current settings and values are transferred to the series. These zero settings are not entered into the controller and are not written to the EEPROM.
Revision 4:c34b84bfa2fb, committed 2020-05-27
- Comitter:
- Aleksk
- Date:
- Wed May 27 16:01:15 2020 +0000
- Parent:
- 3:712f751b4974
- Commit message:
- When receiving a command line with a zero sum (empty lines), the flag_zerostart flag is set, and the current settings and values are transferred to the series. These zero settings are not entered into the controller and are not written to the EEPROM.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Fri May 15 08:37:36 2020 +0000 +++ b/main.cpp Wed May 27 16:01:15 2020 +0000 @@ -1,28 +1,45 @@ -// Продолжение (клон )mbed-os5-inerrupt_serial_readable_FIFO_12 -// Подключена EEPROM. Теперь уставки извлекаются из неё при перезагрузке. -// Создан сторожевой таймер, который истекает через 100мс +// 27.05.2020 Продолжение (клон )mbed-os5-press4 +// включены все шесть аналоговых входа, читаются пять +// при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины +// (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM. +// сторожевой таймер, истекает через 100мс +// + #include "mbed.h" #include "_24LCXXX.h" I2C i2c(PB_9,PB_8); // sda, scl _24LCXXX eeprom(&i2c, 0x50); -AnalogIn analog_value(A0); //подключение аналогового входа A0 +AnalogIn analog_value_0(A0); //подключение аналогового входа A0 +AnalogIn analog_value_1(A1); //подключение аналогового входа A1 +AnalogIn analog_value_2(A2); //подключение аналогового входа A2 +AnalogIn analog_value_3(A3); //подключение аналогового входа A3 +AnalogIn analog_value_4(A4); //подключение аналогового входа A4 +AnalogIn analog_value_5(A5); //подключение аналогового входа A5 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 -RawSerial pc(USBTX, USBRX, 115200); // tx, rx for F411RE in port command string -RawSerial plotter(PA_9, PA_10, 115200); // tx, rx for F411RE out port for serial_plotter +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) + +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; //инициализация таймера //========УСТАВКИ======== uint8_t flag_autoset = 0; //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение -uint8_t flag_plotter = 0; //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение -int value = 0; //set begin value "pressure" 1...3300 +uint8_t flag_plotter = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов +int value = 0; //set begin value "pressure" 1...3300 uint8_t delta_value = 0; //set delta pressure 1...99 //======================= int value_auto=250 ; //set begin value auto "pressure" -int sensor_value =0; //напряжение с аналогового входа А0 (текущее давление) +int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика) +int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление) +int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне) +int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика) +int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета) +int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика) int counter_cycle1 = 0; //счётчик цикла while(true) int counter_cycle2 = 0; //счётчик внутри функции auto_set int sig = 1; //знак инкримента для автоустаки @@ -34,13 +51,14 @@ char trueSource[maxnsym]; //верифицированная строка для callback char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback -volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором -volatile bool flag_comand_detected = false; //если строка декодирована правильно то true +volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором +volatile bool flag_comand_detected = false; //если строка декодирована правильно то true +volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана //_____________________________________________________________________________ void save_EEPROM () { int data2; - pc.printf("EEPROM write------\r\n"); + plotter.printf("EEPROM write------\r\n"); eeprom.byte_write(0, delta_value); eeprom.byte_write(1, flag_autoset); eeprom.byte_write(2, flag_plotter); @@ -51,18 +69,18 @@ void load_EEPROM () { uint8_t data1; int data2; - pc.printf("EEPROM read------\r\n"); + plotter.printf("EEPROM read------\r\n"); eeprom.nbyte_read( 0, &data1, 1 ); - pc.printf("adress 0 =%d \r\n",data1); + plotter.printf("adress 0 =%d \r\n",data1); delta_value=data1; eeprom.nbyte_read( 1, &data1, 1 ); - pc.printf("adress 1 =%d \r\n",data1); + plotter.printf("adress 1 =%d \r\n",data1); flag_autoset=data1; eeprom.nbyte_read( 2, &data1, 1 ); - pc.printf("adress 2 =%d \r\n",data1); + plotter.printf("adress 2 =%d \r\n",data1); flag_plotter=data1; eeprom.nbyte_read( 10, &data2, sizeof(int) ); - pc.printf("adress 10 = %d \r\n",data2); + plotter.printf("adress 10 = %d \r\n",data2); value=data2; } //______________________________________________________________________________ @@ -126,17 +144,19 @@ len=4; //длина подстроки 1000 равна 4 substring(Source,Destination,pos,len); value_=atoi(Destination); - if (value_==0) { - goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг - } + //if (value_==0) { + // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC + // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг + //} //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_); pos=13; //начало подстроки 25 - на 13 позиции len=2; //длина подстроки 25 равна 2 substring(Source,Destination,pos,len); delta_value_=atoi(Destination); - if (delta_value_==0) { - goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг - } + //if (delta_value_==0) { + // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC + // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг + //} //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_); pos=16; //начало подстроки 0 - на 16 позиции len=1; //длина подстроки 0 равна 1 @@ -153,21 +173,28 @@ substring(Source,Destination,pos,len); controlSum1=atoi(Destination); if (controlSum1==0) { - goto endParsing; //контрольная сумма должна быть больше еденицы, пропускаем парсинг + flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC + 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_)*2; //удвоение чтобы не было одинаковых чисел в сообщении //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2); if (controlSum1!=controlSum2) { //не совпала контрольная сумма //pc.printf ("controlSum1!=controlSum2 \r\n"); - goto endParsing; //пропускаем парсинг + goto endParsing; //пропускаем парсинг } - //присваиваем проверенные значения глобальным переменным - strcpy(trueSource,Source); //копировать из Source в trueSource - value=value_; - delta_value=delta_value_; - flag_autoset=flag_autoset_; - flag_plotter=flag_plotter_; + //*********присваиваем проверенные значения глобальным переменным*********** + strcpy(trueSource,Source); //копировать из Source в trueSource + if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не имземняем их в регуляторе и не пишем в EEPROM + flag_autoset=flag_autoset_; + flag_plotter=flag_plotter_; //для работы кнопки Stop + } else { + value=value_; + delta_value=delta_value_; + flag_autoset=flag_autoset_; + flag_plotter=flag_plotter_; + } + flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок endParsing: @@ -200,9 +227,10 @@ pc.attach(&onDataReceived, Serial::RxIrq); int time, valve1, valve2, countValve1=0, countValve2=0; int frequencyValve1, frequencyValve2; - float raw_value_sum = 0 ; + 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; - digital_7.write(0); //valve2 off; + digital_7.write(0); //valve2 off; + digital_5.write(0); //valve3,4 off; load_EEPROM (); //загрузка уставок из EEPROM if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) { flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора @@ -219,12 +247,28 @@ while (true){ //бесконечный цикл // kick watchdog regularly within provided timeout (сброс собаки в начало счёта) watchdog.kick(); + + flag_stopRegulator = flag_plotter; //вывод на плоттер не актуален, теперь он будет флагом полной остановки опрессовщика + if (flag_stopRegulator) { //полный останов регулятора и принудительное запирание всех клапанов + digital_4.write(0); //valve1 off + digital_7.write(0); //valve2 off + digital_5.write(0); //valve3,4 off + } + if (flag_comand_detected) { //пришла правильная командная строка - pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n", - value,delta_value,flag_autoset,flag_plotter,sensor_value,frequencyValve1,frequencyValve2); //текущие данные + pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n", + value,delta_value,flag_autoset,flag_plotter, + sensor_value,frequencyValve1,frequencyValve2, + WL,Pb,Pw1,Pw2,Pd, + digital_4.read(),digital_7.read(),digital_5.read()); //передача текущих значений в РС + + // pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n", + // value,delta_value,flag_autoset,flag_plotter, + // sensor_value,frequencyValve1,frequencyValve2); //передача текущих значений в РС + //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи - flag_comand_detected=false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта - flag_stopRegulator=false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг + flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта + //flag_stopRegulator = false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110, // digital_7.read()*100-220, value, sensor_value, time ); //печать в плоттер в другой СОМ-порт if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают @@ -234,14 +278,51 @@ strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld } - float raw_value = analog_value.read(); // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон) - raw_value_sum = raw_value_sum + raw_value; + + if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске) + pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n", + value,delta_value,flag_autoset,flag_plotter, + sensor_value,frequencyValve1,frequencyValve2, + WL,Pb,Pw1,Pw2,Pd, + digital_4.read(),digital_7.read(),digital_5.read()); //передача текущих значений в РС + flag_zerostart = false; + } + + if (counter_cycle1 < 10 ) { + float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон) + raw_value_sum_0 = raw_value_sum_0 + raw_value_0; + float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон) + raw_value_sum_1 = raw_value_sum_1 + raw_value_1; + float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон) + raw_value_sum_2 = raw_value_sum_2 + raw_value_2; + } + if (counter_cycle1 >= 10 ) { + float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон) + raw_value_sum_3 = raw_value_sum_3 + raw_value_3; + float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон) + raw_value_sum_4 = raw_value_sum_4 + raw_value_4; + //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон) + //raw_value_sum_5 = raw_value_sum_5 + raw_value_5; + } - if (counter_cycle1 > 20 ) { + if (counter_cycle1 >= 19 ) { counter_cycle1=0; - sensor_value = raw_value_sum/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением - raw_value_sum = 0 ; + + WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением + raw_value_sum_0 = 0 ; + sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением + raw_value_sum_1 = 0 ; + Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением + raw_value_sum_2 = 0 ; + Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением + raw_value_sum_3 = 0 ; + Pw2 = raw_value_sum_4/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением + raw_value_sum_4 = 0 ; + //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением + //raw_value_sum_5 = 0 ; + if (flag_stopRegulator == false) { // можно запускать регулятор + digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета //--------------regulator begin----------------------- if (sensor_value > value + delta_value) { valve2 = digital_7.read(); @@ -268,10 +349,10 @@ countValve2=0; } - if (flag_plotter == 1) { - plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110, - digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 ); //печать в плоттер в другой СОМ-порт (только для отладки) - } + // if (flag_plotter == 1) { + // plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110, + // digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 ); //печать в плоттер в другой СОМ-порт (только для отладки) + // } auto_set(); //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1) led = !led; //гасим/зажигаем индикаторный светодиод