Added integration of analog channels, introduced three new setpoints (Pb_1, Pb_2, Tp) for automatic compressor operation.

Dependencies:   _24LCXXX

Files at this revision

API Documentation at this revision

Comitter:
Aleksk
Date:
Thu Jun 04 22:55:40 2020 +0000
Parent:
4:c34b84bfa2fb
Child:
6:fe0a7180ebb7
Commit message:
The flag of the Stop button is accepted - closing of 4 valves,; and the flag of the compressor buttons is a command for discrete output PB_10. The num_chan setting is switching the channel number for the feedback of the controller, written in EEPROM

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed May 27 16:01:15 2020 +0000
+++ b/main.cpp	Thu Jun 04 22:55:40 2020 +0000
@@ -1,5 +1,9 @@
-// 27.05.2020 Продолжение (клон )mbed-os5-press4
-// включены все шесть аналоговых входа, читаются пять
+// 05.06.2020 Продолжение (клон )mbed-os5-press6
+// Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора
+// Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
+// Принимается новая уставка num_chan - переключение номера  активного измерительного канала для обратной связи регулятора. 
+// Эта уставка, как и все остальные,  пишется в EEPROM.
+// Включены все шесть аналоговых входа, читаются пять
 // при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
 // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
 // сторожевой таймер,  истекает через 100мс
@@ -28,10 +32,12 @@
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 Timer timer;                                                                    //инициализация таймера
 //========УСТАВКИ========
-uint8_t flag_autoset = 0;                                                       //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
+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 num_chan = 1;                                                           //set номер аналогового канала 0...5 (1-as default = Pa)
 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 WL = 0;                                                                     //напряжение с аналогового входа А0 (WL - вес опресовщика)
@@ -44,9 +50,9 @@
 int counter_cycle2 = 0;                                                         //счётчик внутри функции auto_set
 int sig = 1;                                                                    //знак инкримента для автоустаки
 //                       FIFO_buffer must be full (only char  and '\0') 
-//#define maxnsym 24                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
-#define maxnsym 26                                     // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
-char Source[maxnsym]="$press,1000,25,0,0,2050**";      //23 char- string ,весь массив со строкой для поиска 23+1(null terminal)=24 
+//#define maxnsym 26                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
+#define maxnsym 28                                     // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
+char Source[maxnsym]="$press,1000,25,0,0,1,2050**";      //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26 
                                                       //уставки и контрольная сумма умноженная на два, должны быть больше нуля  
 char trueSource[maxnsym];                             //верифицированная строка для callback
 char trueSourceOld[maxnsym];                          //предыдущая верифицированная строка для callback
@@ -62,6 +68,7 @@
     eeprom.byte_write(0, delta_value);
     eeprom.byte_write(1, flag_autoset);
     eeprom.byte_write(2, flag_plotter);
+    eeprom.byte_write(3, num_chan);
     data2 = value;
     eeprom.nbyte_write( 10, &data2, sizeof(int));
 }
@@ -79,6 +86,9 @@
     eeprom.nbyte_read( 2, &data1, 1 );
     plotter.printf("adress 2  =%d \r\n",data1);
     flag_plotter=data1;
+    eeprom.nbyte_read( 3, &data1, 1 );
+    plotter.printf("adress 3  =%d \r\n",data1);
+    num_chan=data1;
     eeprom.nbyte_read( 10, &data2, sizeof(int) );
     plotter.printf("adress 10  = %d \r\n",data2);
     value=data2;
@@ -103,7 +113,7 @@
   char Destination[50];
   int pos,len;
   int controlSum1, controlSum2;
-  int value_, delta_value_, flag_autoset_, flag_plotter_;
+  int value_, delta_value_, flag_autoset_, flag_plotter_, num_chan_;
   int ch = '$';    // Код искомого символа
   int indexCh;       // Char on position
   char *ach;       // Указатель на искомую переменную в строке, по которой осуществляется поиск.
@@ -168,16 +178,24 @@
     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_);
-    pos=20;  //начало подстроки 1025 - на 18 позиции
+    
+    pos=20;  //начало подстроки 1 - на 20 позиции
+    len=1;   //длина подстроки 1 равна 1
+    substring(Source,Destination,pos,len);
+    num_chan_=atoi(Destination);
+    //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, num_chan_);
+    
+    pos=22;  //начало подстроки 1025 - на 22 позиции
     len=4;   //длина подстроки 1025 равна 4
     substring(Source,Destination,pos,len);
     controlSum1=atoi(Destination);
-    if (controlSum1==0) {
-      flag_zerostart = true;    //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
-      goto endParsing;           //контрольная сумма должна быть больше еденицы, пропускаем парсинг
+    if (controlSum1==2) {
+      flag_zerostart = true;       //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+      flag_autoset=flag_autoset_;  //здесь можно включать-выключать компрессор, но без записи в 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_)*2;            //удвоение чтобы не было одинаковых чисел в сообщении
+    controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_+num_chan_)*2;            //удвоение чтобы не было одинаковых чисел в сообщении
     //pc.printf("controlSum1=%d   controlSum2=%d\r\n", controlSum1, controlSum2);
     if (controlSum1!=controlSum2) {                                             //не совпала контрольная сумма
       //pc.printf ("controlSum1!=controlSum2 \r\n");
@@ -192,7 +210,8 @@
       value=value_;
       delta_value=delta_value_;
       flag_autoset=flag_autoset_;
-      flag_plotter=flag_plotter_;  
+      flag_plotter=flag_plotter_;
+      num_chan=num_chan_;  
     }      
     
     flag_comand_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
@@ -208,16 +227,10 @@
     queue->call(read_serial);                                                   // process in a non ISR context - переход к функции приема строки -
 }                                                                               // - в статусе отключенного прерывания (учим указатели!)
 //______________________________________________________________________________
-void auto_set () {
-    if (counter_cycle2 >= 100 && flag_autoset == 1) {
-      counter_cycle2=0;
-      if (value_auto > 2800 || value_auto < 250) {
-        sig = -sig;                                                             //меняем знак для изменения направления роста/спада автоуставки
-      } 
-       value_auto = value_auto + sig * 250;
-       value=value_auto;     
-    }  
-  counter_cycle2++;                                                             //увеличиваем счетчик функции auto_set() на 1
+void auto_set () {                                                              //подпрограмма управления компрессором
+    
+    digital_6.write(flag_autoset);                                              //включение-выкючение компрессора   
+ 
 }
 //*****************************************************************************
 //***************************************************************************** 
@@ -225,14 +238,15 @@
 int main() {
     
     pc.attach(&onDataReceived, Serial::RxIrq);
-    int time, valve1, valve2, countValve1=0, countValve2=0;
+    int time, 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;
     digital_7.write(0);                                                         //valve2  off;    
-    digital_5.write(0);                                                         //valve3,4  off;                                      
+    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) {
+    if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2 && num_chan < 6) {
       flag_stopRegulator=false;                                                 //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
     } else {
       flag_stopRegulator = true;                                                //флаг остановки установлен 
@@ -253,14 +267,15 @@
       digital_4.write(0);                                                       //valve1  off
       digital_7.write(0);                                                       //valve2  off
       digital_5.write(0);                                                       //valve3,4 off
+      //digital_6.write(0);                                                       //выключение компрессора
     }
     
     if (flag_comand_detected) {                                                 //пришла правильная командная строка
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      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,
         sensor_value,frequencyValve1,frequencyValve2,
         WL,Pb,Pw1,Pw2,Pd,
-        digital_4.read(),digital_7.read(),digital_5.read());                                     //передача текущих значений в РС
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read());        //передача текущих значений в РС
         
     //    pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
     //    value,delta_value,flag_autoset,flag_plotter,
@@ -280,11 +295,11 @@
     }
     
     if (flag_zerostart) {                                            //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      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,
         sensor_value,frequencyValve1,frequencyValve2,
         WL,Pb,Pw1,Pw2,Pd,
-        digital_4.read(),digital_7.read(),digital_5.read());                                     //передача текущих значений в РС  
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read());        //передача текущих значений в РС  
         flag_zerostart = false;
     }   
     
@@ -316,20 +331,24 @@
       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  с усреднением
+      Pw2 = raw_value_sum_4/10 * 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 (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) {                                        // можно запускать регулятор
         digital_5.write(1);                                                     //valve3,4 открыты - подключаемся к контуру охлаждения макета
         //--------------regulator begin-----------------------
-        if (sensor_value > value + delta_value) {
+        if (temp_valueSensor > value + delta_value) {
           valve2 = digital_7.read();
           digital_7.write(1);                                                     //valve2  on;
           if (valve2 < digital_7.read()) {countValve2++;}                         //счётчик передних фронтов напряжения (срабатывания клапана 2)
           digital_4.write(0);                                                     //valve1  off;
-        } else  if (sensor_value < value - delta_value) {
+        } else  if (temp_valueSensor < value - delta_value) {
           valve1 = digital_4.read();
           digital_4.write(1);                                                     //valve1  on;
           if (valve1 < digital_4.read()) {countValve1++;}                         //счётчик передних фронтов напряжения (срабатывания клапана 1)
@@ -349,12 +368,7 @@
         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 );   //печать в плоттер в другой СОМ-порт (только для отладки)   
-     // }
-    
-      auto_set();                                                  //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1)
+      auto_set();                                                               //включение-выкючение компрессора  через flag_autoset
       led = !led;                                                               //гасим/зажигаем индикаторный светодиод
     } 
     ThisThread::sleep_for(1);                                                   // (mc) правильный оператор задержки для mbed5