Files at this revision

API Documentation at this revision

Comitter:
Aleksk
Date:
Fri Apr 17 13:27:48 2020 +0000
Parent:
2:df6b8ad18bc5
Commit message:
The relay controller is debugged.; $, 1000,25,1 - for example, the following are transmitted: $ - service symbol, 1000 - pressure setpoint, 25 - pressure error, 1 - auto-set flag allows the automatic shaper of 16 stages of setting to operate

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r df6b8ad18bc5 -r 285d45a0d928 main.cpp
--- a/main.cpp	Fri Apr 17 09:35:30 2020 +0000
+++ b/main.cpp	Fri Apr 17 13:27:48 2020 +0000
@@ -1,14 +1,15 @@
 #include "mbed.h"
-//16.04.2020 23:19
-//Программа для пошагового чтения байтов из порта (файла) и разделения потока байтов на подстроки в реальном времени. Разделитель - запятая.
+//17.04.2020 15:30
+//Программа для пошагового чтения байтов из последовательного порта и разделения потока байтов на подстроки в реальном времени. Разделитель - запятая.
 //Строка сообщения должна заканчиваться только одним символом /r  или  /n (обнаружение признака окончания сообщения можно сделать любым)
-//Программа нормально разбивает принимаемую строку на подстроки (до 20) в количестве равном количеству запятых, плюс последняя подстрока без запятой
-//$,1500,2001,1001 - для примера здесь передаются:$ - служебный символ, 1500 - уставка давления, 2001 - уставка максимального давления, 1001 - уставка минимального давления
+//Программа нормально разбивает принимаемую строку на подстроки (до 20) в количестве равном количеству запятых, плюс последняя подстрока без запятой.
+//Регулятор релейного типа отлажен на RC-эмуляторе сосуда с двумя клапанами. Давление здесь измеряется в милливольтах. 
+//$,1000,25,0 - для примера здесь передаются:$ - служебный символ, 1000 - уставка давления, 25 - уставка погрешности давления, 0 - флаг запрета работы автоуставки
 
-AnalogIn analog_value(A0);                           //подключение аналогового входа A0
+AnalogIn analog_value(A0);                                          //подключение аналогового входа A0
 DigitalOut led(LED1);
-DigitalOut digitalWrite4(PB_5);    // initialize digital pin 4 as an output (high pressure air bulb charge).
-DigitalOut digitalWrite7(PA_8);    // initialize digital pin 7 as an output. (high pressure air bulb discharge
+DigitalOut digitalWrite4(PB_5);                                    // initialize digital pin 4 as an output (high pressure air bulb charge).
+DigitalOut digitalWrite7(PA_8);                                    // initialize digital pin 7 as an output. (high pressure air bulb discharge
 RawSerial pc(USBTX, USBRX, 115200);
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 
@@ -17,17 +18,17 @@
 char comand[maxnstr][maxnsym]={""};                                             // 
 int nstr=0;                                                                     //номер строки 
 
-int pressure=0;                                      //давление (аналоговый вход)
-int pressure_set=0;                                  //уставка давления 
-int pressure_set_max=0;                              //уставка максимальног давления 
-int pressure_set_min=0;                              //уставка минимального давления 
-int value=1000;                   //set "pressure" 50
+int pressure=0;                                      //давление (аналоговый вход) (резерв)
+int pressure_set=0;                                  //уставка давления (резерв)
+int pressure_set_max=0;                              //уставка максимальног давления (резерв)
+int flag_autoset=1;                                 //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
+int value=1000;                   //set "pressure" 
 int delta_value=25;              //set delta pressure
 int counter_cycle1=0;
 int counter_cycle2=0;
-
-int valve1=0;   // state valve of  charge:  0 - close, 1 - open
-int valve2=0;   //state valve of  discharge:  0 - close, 1 - open
+int sig=1;                      //знак инкримента для автоустаки
+int valve1=0;                   // state valve of  charge:  0 - close, 1 - open
+int valve2=0;                   //state valve of  discharge:  0 - close, 1 - open
 
 //______________________________________________________________________________
 void onDataReceived();                                                          // callback
@@ -53,12 +54,12 @@
    // pc.printf("****Detect number of _,_ ****=%d\r\n",zap);                                //количество приянтых запятых
     for (int i=0; i<=nstr; i++) {strcpy(comand[i],message[i]);}                  //копирование строк в глобальный массив , размеры массивов должны совпадать!
     for (int i=0; i<=nstr; i++) {pc.printf("Caught comand[%d] is : %s\r\n",i,comand[i]);}     //печать подстрок пойманного сообщения
-    pressure_set=atoi(comand[1]);                                // перевод из строчного массива (вторая подстрока сообщения) в целое число (уставка давления) 
-    pc.printf("pressure_set=%d\r\n",pressure_set);
-    pressure_set_max=atoi(comand[2]);                            // перевод из строчного массива (третья подстрока сообщения) в целое число (уставка макс. давления) 
-    pc.printf("pressure_set_max=%d\r\n",pressure_set_max);
-    pressure_set_min=atoi(comand[3]);                            // перевод из строчного массива (четвёртая подстрока сообщения) в целое число (уставка мин. давления) 
-    pc.printf("pressure_set_min=%d\r\n",pressure_set_min);
+    value=atoi(comand[1]);                                // перевод из строчного массива (вторая подстрока сообщения) в целое число (уставка давления) 
+    pc.printf("value=%d\r\n",value);
+    delta_value=atoi(comand[2]);                            // перевод из строчного массива (третья подстрока сообщения) в целое число (уставка отклонения давления) 
+    pc.printf("delta_value=%d\r\n",delta_value);
+    flag_autoset=atoi(comand[3]);                            // перевод из строчного массива (четвёртая подстрока сообщения) в целое число (флаг автоуставки ) 
+    pc.printf("flag_autoset=%d\r\n",flag_autoset);
     
     pc.attach(&onDataReceived, Serial::RxIrq);                                  // reattach interrupt - переподключение прерывания перед выходом из функции
 }
@@ -68,14 +69,17 @@
     queue->call(read_serial);                                                   // process in a non ISR context - переход к функции приема строки в статусе отключенного прерывания (учим указатели!)
 }
 //*****************************************************************************
-int main() {
+//*****************************************************************************
+int main()
+{
     pc.attach(&onDataReceived, Serial::RxIrq);                                  //подключение прерывания и имя функции обработчика прерывания по входящему символу в serial порту
     float raw_value ;
     int sensor_value ;
     printf("Start \r\n");
-    while (1) {
+ while (1)                         //бесконечный цикл
+ {
        
-/*--------------regulator begin---*/
+  /*--------------regulator begin---*/
   raw_value  = analog_value.read();                                           // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
   sensor_value  = raw_value  * 3300;                                          // преобразование в напряжение 0-3300 mV 
   if (sensor_value>value+delta_value)
@@ -91,11 +95,22 @@
    digitalWrite4=0; valve1=0;
    digitalWrite7=0; valve2=0; 
   }
-
-/*--------------regulator end-----*/
- pc.printf("$%d %d %d %d;", valve1*100-110, valve2*100-220, value, sensor_value );       
-        
-        ThisThread::sleep_for(20);                                             // (mc) правильный оператор задержки для mbed5
-        led = !led;
-    }
+  /*--------------regulator end-----*/
+  
+   pc.printf("$%d %d %d %d;\r\n", valve1*100-110, valve2*100-220, value, sensor_value );       
+   
+  //* Ступенчатое увеличение и уменьшение уставки value (для отладки)
+  if (counter_cycle2>=100 && flag_autoset==1) {
+    counter_cycle2=0;
+     if(value>2800 || value<250){
+      sig=-sig;                           //меняем знак для изменения направления роста/спада автоуставки
+      } 
+       value=value+sig*250;
+     } 
+  //*/    
+    ThisThread::sleep_for(20);                                             // (mc) правильный оператор задержки для mbed5
+    led = !led;                          //гасим/зажигаем индикаторный светодиод
+    counter_cycle1=0;
+    counter_cycle2++;                    //увеличиваем счетчик на 1
+ }
 }
\ No newline at end of file