Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 6:fe0a7180ebb7, committed 2020-06-11
- Comitter:
- Aleksk
- Date:
- Thu Jun 11 20:22:11 2020 +0000
- Parent:
- 5:bb595cde0c82
- Commit message:
- An additional block has been made in the parser for decoding incoming alarm settings for writing to the EEPROM. Additional digital inputs are activated.
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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++;