Ver código fonte

Безопасный режим аналоговым выходам.

TelenkovDmitry 5 meses atrás
pai
commit
e977386a58

+ 4 - 2
fw/modules/io/analog_input.c

@@ -199,17 +199,19 @@ void ai_processing(void)
         adc_com_fil_data[i + 6] = average_int(&average_filter[i + 6], adc_com_raw_data[i + 6]);
     }
 
+#if 0    
     // 4 дополнительных канала
     for (uint8_t i = 0; i < AI_ADD_NUMBER/2; i++)
     {
         adc_meas_two_channels(&settings.ai_add[i], &settings.ai_add[i + 2], 
                               &adc_add_raw_data[i], &adc_add_raw_data[i + 2]);
     }
+#endif    
     
 #if 0    
     printf("end\r\n");
-    //adc_print_data();
-    adc_print_data_extend();
+    adc_print_data();
+    //adc_print_data_extend();
     printf("end\r\n");  
 #endif
 }

+ 23 - 3
fw/modules/io/analog_output.c

@@ -36,6 +36,20 @@ void ao_init(void)
     
     // Внешний DAC
     dac_init();
+    
+#if 0    
+    // Режим измерения
+    ai_set_meas_mode();
+    
+    // Питание внешних датчиков
+    ai_ext_sens_power(settings.ext_sens_power); 
+    
+    // Внешинй ADC
+    ai_adc_init();
+    
+    // Modbus параметры
+    ai_init_modbus_params();
+#endif    
 }
 
 // Управление LED для выходов
@@ -68,13 +82,20 @@ void ao_set(void)
     }
 }
 
+// Установить режим работы каналов
+void ao_set_mode(void)
+{
+    for (int i = 0; i < AO_NUMBER; i++)
+    {
+        settings.ao[i].mode = (uint8_t)((settings.ao_mode_bits >> i) & 1);
+    }
+}
+
 // 
 void dac_task(void *params)
 {
     for (;;)
     {
-      
-        ao_mode = 0x01;
         ao_power = sh_ao_mode(ao_mode);
         //printf("AO_Power: %u\r\n", ao_power);
         vTaskDelay(100);
@@ -87,5 +108,4 @@ void dac_task(void *params)
     }
 }
 
-
 #endif

+ 4 - 0
fw/modules/io/analog_output.h

@@ -8,6 +8,7 @@ typedef struct
 {
     uint8_t state;          // 0 - выкл, 1 - вкл
     uint8_t mode;           // режим выхода (0 - напряжение, 1 - ток)
+    uint16_t value;          // значение на DAC 
     
 } ao_t;
 
@@ -21,6 +22,9 @@ void ao_led_update(void);
 // 
 void ao_set(void);
 
+// 
+void ao_set_mode(void);
+
 // 
 void dac_task(void *params);
 

+ 3 - 0
fw/modules/modbus/modbus_ai_params.c

@@ -134,6 +134,9 @@ mb_delay_action_t mb_set_ai_state(void)
 //
 mb_delay_action_t mb_set_ai_mode(void)
 {
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) {
+        settings.ai[i].mode = (uint8_t)((settings.ai_mode_bits >> i) & 1);
+    }  
     ai_set_meas_mode();  
     return MB_SAVE_SETTINGS;
 }

+ 53 - 7
fw/modules/modbus/modbus_ao_params.c

@@ -15,7 +15,7 @@ extern mb_param_t mb_param[];
 uint16_t mb_init_ao_params(uint16_t i)
 {
     uint16_t index = i;
-    //uint16_t addr = 0;  
+    uint16_t addr = 0;  
   
     // Статус выходов (вкл./выкл.)
     mb_param[index].reg = 0x0400;
@@ -27,8 +27,18 @@ uint16_t mb_init_ao_params(uint16_t i)
     
     index++;
     
-    // Режим работы выходов
+    // Статус выходов в безопасном режиме (вкл./выкл.)
     mb_param[index].reg = 0x0401;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ao_state_save_bits;
+	mb_param[index].set = NULL;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Режим работы выходов
+    mb_param[index].reg = 0x0402;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ao_mode_bits;
 	mb_param[index].set = mb_set_ao_mode;
@@ -37,8 +47,48 @@ uint16_t mb_init_ao_params(uint16_t i)
     
     index++;
     
+    // Режим работы выходов
+    mb_param[index].reg = 0x0403;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ao_mode_save_bits;
+	mb_param[index].set = NULL;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
     // ---------------------------------------------------------------------- //
     
+    // Значения выходов. Регистры 0x0410 - 0x0413.
+    addr = 0x0410;
+    for (int i = 0; i < AO_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&settings.ao[i].value;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 1;
+        index++;
+    }
+    
+    // Значения выходов в безопасном режиме. Регистры 0x0410 - 0x0413.
+    addr = 0x0420;
+    for (int i = 0; i < AO_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&settings.ao_save[i].value;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 1;
+        index++;
+    }
+    
     return index;
 }
 
@@ -59,12 +109,8 @@ mb_delay_action_t mb_set_ao_state(void)
 //
 mb_delay_action_t mb_set_ao_mode(void)
 {
-  
-#if 0  
-    ai_set_meas_mode();  
-#endif    
+    ao_set_mode();
     return MB_SAVE_SETTINGS;
 }
 
-
 #endif

+ 5 - 0
fw/modules/settings/settings_ao.c

@@ -25,6 +25,11 @@ void settings_ao_def(settings_t *settings)
     {
         settings->ao[i].state = 0;  // выход выключен
         settings->ao[i].mode = 0;   // режим выхода - напряжение
+        settings->ao[i].value = 0;  // значение на DAC
+        
+        settings->ao_save[i].state = 0;  // выход выключен (безопасный режим)
+        settings->ao_save[i].mode = 0;   // режим выхода - напряжение (безопасный режим)
+        settings->ao_save[i].value = 0;  // значение на DAC (безопасный режим)
     }
 }
 

+ 5 - 2
fw/modules/settings/settings_api.h

@@ -129,11 +129,14 @@ typedef struct
 #endif    
 
 #if defined (MAO_4)    
- 
-    ao_t        ao[AO_NUMBER];      // 
+    
+    ao_t        ao[AO_NUMBER];      // параметры выходов 
+    ao_t        ao_save[AO_NUMBER]; // параметры выходов в безопасном режиме
     
     uint16_t    ao_state_bits;      // статус выхода, 0 - выкл, 1 - вкл
+    uint16_t    ao_state_save_bits; // статус выхода в безопасном режиме, 0 - выкл, 1 - вкл
     uint16_t    ao_mode_bits;       // режим работы выходов, 0 - напряжения, 1 - ток
+    uint16_t    ao_mode_save_bits;  // режим работы выходов в безопасном режиме, 0 - напряжения, 1 - ток
     
 #endif    
     

+ 2 - 1
fw/user/main.cpp

@@ -40,6 +40,7 @@ extern "C" {
 #include "soft_wdt.h"
 #include "usb_clock.h"
 #include "filter.h"
+#include "modbus_ai_params.h"
 }
 #include "terminal_sbs.h"
 #include "terminal_usartbridge.h"
@@ -106,7 +107,7 @@ void init_task(void *argument)
     // Настройки параметров порта Modbus
     settings_set_modbus_params(settings.com_settings.mb_port);
     
-#if 0
+#if 1
 // Только для теста    
     settings_set_all_default();
     settings_save(&settings);

BIN
output/fw.bin


Diferenças do arquivo suprimidas por serem muito extensas
+ 374 - 355
project/ewarm/iap/iap.dep


Diferenças do arquivo suprimidas por serem muito extensas
+ 657 - 685
project/ewarm/module_universal_io.dep


+ 1 - 1
tools/analog_in.py

@@ -203,7 +203,7 @@ def main():
     # print(ai.get_inputs_mode())
 
     '''Питание внешних датчиков'''
-    ai.set_ext_sens_power(0)
+    # ai.set_ext_sens_power(0)
 
     '''Аварии аналоговых входов'''
     # for i in range(100):

+ 3 - 4
tools/analog_out.py

@@ -46,15 +46,14 @@ def main():
     ao.sys.get_system_vars()
 
     '''Чтение параметров'''
-    print(ao.get_outputs_state())
-    print(ao.get_outputs_state())
+    # print(ao.get_outputs_state())
+    # print(ao.get_outputs_state())
 
     '''Установка параметров'''
     # ao.set_outputs_state(0b1111)
 
     '''Сохранение настроек'''
-    ao.sys.save_sattings()
-    # ai.sys.save_sattings()
+    # ao.sys.save_sattings()
 
     '''Обновление прошивки'''
     # ao_modbus.MB_DEBUG = True

BIN
tools/fw.bin


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff