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.
Diff: main.cpp
- Revision:
- 7:97881cd71b31
- Parent:
- 6:fe0a7180ebb7
- Child:
- 8:bf73cc68a823
--- a/main.cpp Thu Jun 11 20:22:11 2020 +0000
+++ b/main.cpp Fri Jun 19 10:33:01 2020 +0000
@@ -1,5 +1,6 @@
-// 11.06.2020 Продолжение (клон )mbed-os5-press9
-// Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок для EEPROM
+// 19.06.2020 Продолжение (клон )mbed-os5-press12
+// значения уставок EEPROM2 выводяться в pc.print в специальной строке с текущими данными диагностики
+// Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок, они пишутся в EEPROM2
// Сделан timer_2 для отсчёта времени открытого состояния вентиля 1
// Сделан timer_3 для отсчёта времени открытого состояния вентиля 2
// Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям.
@@ -33,7 +34,7 @@
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 внутрь опрессовщика попала вода
+DigitalIn idigital_13(PA_5); //initialize digital pin 13 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
@@ -56,6 +57,7 @@
int T_1 = 4000; // ms, максимальное время открытого состояния для клапана 1
int T_2 = 4000; // ms, максимальное время открытого состояния для клапана 2
uint8_t event_N = 255; // номер события , по умолчанию 255 - событий нет
+uint8_t flag_stopRegulatorEEPROM = 0; //если 1 остановка регулятора, когда вручную управляют клапанами через программу SetUp_EEPROM
//======temporary set=====
int numSet, anySet;
//=================================
@@ -96,6 +98,46 @@
data2 = value;
eeprom.nbyte_write( 10, &data2, sizeof(int));
}
+void save_EEPROM2 () {
+ int data2;
+ plotter.printf("EEPROM2 write------\r\n");
+ eeprom.nbyte_read( 100, &data2, sizeof(int) );
+ if (data2 != Pd_eeprom) { //записываем в eeprom только изменившиеся значения (одна из семи уставок)
+ data2 = Pd_eeprom;
+ eeprom.nbyte_write( 100, &data2, sizeof(int));
+ }
+ eeprom.nbyte_read( 110, &data2, sizeof(int) );
+ if (data2 != frequencyValve1_eeprom){
+ data2 = frequencyValve1_eeprom;
+ eeprom.nbyte_write( 110, &data2, sizeof(int));
+ }
+ eeprom.nbyte_read( 120, &data2, sizeof(int) );
+ if (data2 != frequencyValve2_eeprom){
+ data2 = frequencyValve2_eeprom;
+ eeprom.nbyte_write( 120, &data2, sizeof(int));
+ }
+ eeprom.nbyte_read( 130, &data2, sizeof(int) );
+ if (data2 != WL01_eeprom){
+ data2 = WL01_eeprom;
+ eeprom.nbyte_write( 130, &data2, sizeof(int));
+ }
+ eeprom.nbyte_read( 140, &data2, sizeof(int) );
+ if (data2 != WL99_eeprom){
+ data2 = WL99_eeprom;
+ eeprom.nbyte_write( 140, &data2, sizeof(int));
+ }
+ eeprom.nbyte_read( 180, &data2, sizeof(int) );
+ if (data2 != T_1){
+ data2 = T_1;
+ eeprom.nbyte_write( 180, &data2, sizeof(int));
+ }
+ eeprom.nbyte_read( 190, &data2, sizeof(int) );
+ if (data2 != T_2){
+ data2 = T_2;
+ eeprom.nbyte_write( 190, &data2, sizeof(int));
+ }
+
+}
//_____________________________________________________________________________
void load_EEPROM () {
uint8_t data1;
@@ -117,6 +159,32 @@
plotter.printf("adress 10 = %d \r\n",data2);
value=data2;
}
+void load_EEPROM2 () {
+ int data2;
+ plotter.printf("EEPROM2 read------\r\n");
+ eeprom.nbyte_read( 100, &data2, sizeof(int) );
+ //pc.printf("$adress,100,%d,*\r\n",data2);
+ Pd_eeprom=data2;
+ eeprom.nbyte_read( 110, &data2, sizeof(int) );
+ //pc.printf("$adress,110,%d,*\r\n",data2);
+ frequencyValve1_eeprom=data2;
+ eeprom.nbyte_read( 120, &data2, sizeof(int) );
+ //pc.printf("$adress,120,%d,*\r\n",data2);
+ frequencyValve2_eeprom=data2;
+ eeprom.nbyte_read( 130, &data2, sizeof(int) );
+ //pc.printf("$adress,130,%d,*\r\n",data2);
+ WL01_eeprom=data2;
+ eeprom.nbyte_read( 140, &data2, sizeof(int) );
+ //pc.printf("$adress,140,%d,*\r\n",data2);
+ WL99_eeprom=data2;
+ eeprom.nbyte_read( 180, &data2, sizeof(int) );
+ //pc.printf("$adress,180,%d,*\r\n",data2);
+ T_1=data2;
+ eeprom.nbyte_read( 190, &data2, sizeof(int) );
+ //pc.printf("$adress,190,%d,*\r\n",data2);
+ T_2=data2;
+ //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
+ }
//______________________________________________________________________________
void substring(char *s,char *d,int pos,int len) {
//usage: substring(Source,Destination,pos,len);
@@ -239,7 +307,7 @@
flag_stopRegulator=flag_stopRegulator_;
num_chan=num_chan_;
}
-
+ flag_stopRegulatorEEPROM = 0; //флаг остановки только релейного регулятора (теперь регулятор управляет клапанами!)
flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
goto endParsing ; //завершение блока приема рабочих уставок для работяющего релейного регулятора
@@ -274,21 +342,39 @@
numSet=numSet_;
anySet=anySet_;
}
+ //При первом входе в режим $setup из режима $press - Закрываются все клапана
+ if (flag_stopRegulatorEEPROM == 0) {
+ digital_4.write(0); //valve1 off
+ digital_7.write(0); //valve2 off
+ digital_5.write(0); //valve3,4 off
+ digital_6.write(0); //выключение компрессора
+ }
switch ( numSet ) {
case 1: // это двоеточие
-
+ digital_4.write(anySet); //valve1
plotter.printf("1 Valve1=%d\r\n",anySet);
break;
case 2:
+ digital_7.write(anySet); //valve2
plotter.printf("2 Valve2=%d\r\n",anySet);
break;
case 3:
+ digital_5.write(anySet); //valve3,4
plotter.printf("3 Valve3,4=%d\r\n",anySet);
break;
case 4:
+ digital_6.write(anySet); //компрессор
plotter.printf("4 Compressor=%d\r\n",anySet );
break;
+ case 9:
+ if (anySet == 0) {
+ flag_stopRegulator=0;
+ pc.printf("Reset ALARM \r\n");
+ } else {
+ flag_stopRegulator = 1;
+ }
+ break;
case 10:
Pd_eeprom = anySet;
plotter.printf( "10 Pd_eeprom=%d\r\n",anySet );
@@ -321,14 +407,8 @@
plotter.printf( "Wrong case.\r\n" );
}
-
-
-
-
-
-
-
- flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
+ flag_stopRegulatorEEPROM = 1; //флаг остановки только релейного регулятора (теперь оператор вручную управляет клапанами!)
+ flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
//========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
endParsing:
@@ -344,11 +424,12 @@
//______________________________________________________________________________
void auto_set () { //подпрограмма управления компрессором
- digital_6.write(flag_compressor); //включение-выкючение компрессора
-
+ if (flag_stopRegulatorEEPROM == 0) {
+ digital_6.write(flag_compressor); //включение-выкючение компрессора
+ }
}
-//*****************************************************************************
-//*****************************************************************************
+//******************************************************************************************************************
+//******************************************************************************************************************
int main() {
@@ -361,16 +442,17 @@
digital_5.write(0); //valve3,4 off;
digital_6.write(0); //выключение компрессора
load_EEPROM (); //загрузка уставок из EEPROM
+ load_EEPROM2 (); //загрузка граничных уставок (аварийных событий)из EEPROM2
if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) {
- flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
+ flag_stopRegulator=0; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
} else {
- flag_stopRegulator = true; //флаг остановки установлен
+ flag_stopRegulator = 1; //флаг остановки установлен
pc.printf("Regulator stopped, error in EEPROM \r\n");
}
pc.printf("Program started \r\n");
Watchdog &watchdog = Watchdog::get_instance();
- watchdog.start(100); //WDlimit = 100 ms
+ watchdog.start(100); //WDlimit = 100 ms
timer.start();
timer_2.start();
timer_3.start();
@@ -395,16 +477,10 @@
sensor_value,frequencyValve1,frequencyValve2,
WL,Pb,Pw1,Pw2,Pd,
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_compressor,flag_stopRegulator,
- // sensor_value,frequencyValve1,frequencyValve2); //передача текущих значений в РС
-
+
//pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи
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) { //функция возвращает ноль если командные строки совпадают
save_EEPROM (); //пишем в память уставки отличные от старых
load_EEPROM ();
@@ -413,6 +489,25 @@
strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld
}
+ if (flag_comand2_detected ) { //пришла правильная строка из программы SetUp_EEPROM и передана уставка
+ pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%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, //1,2,3,4
+ sensor_value,frequencyValve1,frequencyValve2, //5,6,7
+ WL,Pb,Pw1,Pw2,Pd, //8,9,10,11,12
+ digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(), //13,14,15,16
+ event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(), //17,18,19,20
+ Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2 ); //21,22,23,24,25,26,27
+ flag_comand2_detected = false; //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта
+
+ if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) { //функция возвращает ноль если командные строки совпадают
+
+ save_EEPROM2 (); //пишем в память все уставки от SetUp_EEPROM если хоть одна изменилась
+ load_EEPROM2 ();
+ }
+ strcpy(trueSource2Old,trueSource2); //копировать из trueSource2 в trueSource2Old
+ //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
+ }
+
if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
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,
@@ -460,8 +555,8 @@
if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3
if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4
- if (flag_stopRegulator == 0 && event_N == 255) { // можно запускать регулятор
- digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
+ if (flag_stopRegulator == 0 && event_N == 255 && flag_stopRegulatorEEPROM == 0) { // можно запускать регулятор
+ digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
//--------------regulator begin-----------------------
if (temp_valueSensor > value + delta_value) {
valve2 = digital_7.read();
@@ -503,18 +598,18 @@
if (WL >= WL99_eeprom) {
event_N = 4;
}
- if (idigital_11.read()==1) {
+ if (idigital_11.read()==0) {
event_N = 5;
}
- if (idigital_12.read()==1) {
+ if (idigital_12.read()==0) {
event_N = 6;
}
- if (idigital_13.read()==1) {
+ if (idigital_13.read()==0) {
event_N = 7;
}
//-----------------Valve1 open time----------------------
- if (digital_4.read() == 0) {
+ if (digital_4.read() == 0 || flag_stopRegulatorEEPROM == 1 ) { // для режима $setup отключаем счёт времени
timer_2.reset();
time_2 = 0;
} else {
@@ -524,7 +619,7 @@
event_N = 8;
}
//-----------------Valve2 open time----------------------
- if (digital_7.read() == 0) {
+ if (digital_7.read() == 0 || flag_stopRegulatorEEPROM == 1) { // для режима $setup отключаем счёт времен
timer_3.reset();
time_3 = 0;
} else {