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 with a step of 250 mV.

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
--- 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