Ver Fonte

Добавил обработку уставок.

unknown há 6 meses atrás
pai
commit
5d2de066a9

+ 23 - 17
fw/modules/io/analog_input.c

@@ -29,6 +29,8 @@
 #define CUR_LIM_DELTA_U     0.6
 
 
+extern preset_cur_t preset_cur[];
+
 uint8_t ai_mux;     // выход сдвигового регистра U1010 (управляет MUX 301, 401)
                     // мультиплексоры отвечат за коммутацию аналоговых входов и АЦП
 
@@ -267,14 +269,10 @@ void ai_processing(void)
     }
     
     // Работа с уставками
-/*    
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {      
-        adc_com_data[i] = i + 1;
-    }
-          
+#if 1    
     preset_process(adc_com_data);
-*/      
+
+#endif      
     
     
 #if 0    
@@ -352,10 +350,8 @@ void adc_print_data(void)
     printf("AN_INP_11: 0x%X, %.3f\r\n", adc_com_raw_data[10],adc_com_data[10]);
     printf("AN_INP_12: 0x%X, %.3f\r\n", adc_com_raw_data[11],adc_com_data[11]);
     
-    printf("V_ISO_CL:  0x%X, %f\r\n", adc_add_raw_data[0], (double)adc_add_raw_data[0]*VOLTAGE_FACTOR);
-    printf("V_ISO   :  0x%X, %f\r\n", adc_add_raw_data[1], (double)adc_add_raw_data[1]*VOLTAGE_FACTOR);
-    printf("CRNT_LIM_U_BFR_R : 0x%X, %f\r\n", adc_add_raw_data[2],(double)adc_add_raw_data[2]*VOLTAGE_FACTOR);
-    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n", adc_add_raw_data[3],(double)adc_add_raw_data[3]*VOLTAGE_FACTOR);
+    printf("CRNT_LIM_U_BFR_R : 0x%X, %f\r\n", adc_add_raw_data[0],(double)adc_add_raw_data[0]*VOLTAGE_FACTOR);
+    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n", adc_add_raw_data[1],(double)adc_add_raw_data[1]*VOLTAGE_FACTOR);
 #endif
 }
 
@@ -500,8 +496,8 @@ void ai_current_alarm_detect(void)
 // TODO добавить событие в журнал
 void ai_ext_sens_current_control(void)
 {
-    float crnt_lim_u_bfr = (float)adc_add_raw_data[2]*CRNT_LIM_V_FACTOR;
-    float crnt_lim_u_abfr = (float)adc_add_raw_data[3]*CRNT_LIM_V_FACTOR;
+    float crnt_lim_u_bfr = (float)adc_add_raw_data[0]*CRNT_LIM_V_FACTOR;
+    float crnt_lim_u_abfr = (float)adc_add_raw_data[1]*CRNT_LIM_V_FACTOR;
       
     if ((CUR_LIM_LOW_LIMIT < 23.0) || (CUR_LIM_LOW_LIMIT > 25.0))
         return;
@@ -703,17 +699,27 @@ void ai_ext_sens_power(uint16_t state)
 void ai_leds_processing(void)
 {
     // Управление индикацией аварий (12 красных LED) (слово ai_alarm)
-    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) {
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) 
+    {
+        if (settings.ai[i].state == false)
+            continue;
+          
         if (ai_alarm & (1 << i)) {
             leds[ai_alarm_led[i]].state = LED_ON;
         }
-        else {
-            leds[ai_alarm_led[i]].state = LED_OFF;
+        // Если нет алармов, то анализирум уставки
+        else 
+        {
+            if ((preset_cur[i].max == true) || (preset_cur[i].min == true)) {
+                leds[ai_alarm_led[i]].state = LED_ON;
+            }
+            else {
+                leds[ai_alarm_led[i]].state = LED_OFF;
+            }
         }
     }
 }
 
-
 //
 void adc_alarm_detect(void)
 {

+ 1 - 0
fw/modules/io/analog_input.h

@@ -149,5 +149,6 @@ extern ai_alarm_t ai_alarm_f[];
 
 extern ai_alarm_t ai_cur_lim;
 
+
 #endif  // __ANALOG_INPUT_H
 

+ 40 - 4
fw/modules/preset/preset_ai.c

@@ -3,6 +3,7 @@
 #include "task.h"
 #include "settings_api.h"
 #include "triggers.h"
+#include "mux.h"
 #include <stdio.h>
 
 #if defined (MAI_12)
@@ -10,10 +11,12 @@
 #undef DBG
 #define DBG if(1)
 
+extern led_t ai_alarm_led[];
 
 
 hyst_state_t hyst_state[AI_COMMON_NUMBER];
 
+preset_cur_t preset_cur[AI_COMMON_NUMBER];
 
 
 // 
@@ -22,6 +25,9 @@ void preset_init(void)
     for (int i = 0; i < AI_COMMON_NUMBER; i++)
     {
         hyst_state[i] = hyst_idle;
+        
+        preset_cur[i].max = false;
+        preset_cur[i].min = false;
     }
 }
 
@@ -47,7 +53,7 @@ void preset_process(float *data)
 
     for (int i = 0; i < AI_COMMON_NUMBER; i++)
     {
-        if (settings.preset[i].state == 0)
+        if ((settings.preset[i].state == 0) || (settings.ai[i].state == 0))
             continue;
         
         // 0 - тип уставки - фиксированное значение
@@ -56,14 +62,44 @@ void preset_process(float *data)
             high = trig_high_value(data[i], 0, settings.preset[i].max, settings.preset[i].hyst, &hyst_state[i]);
             low = trig_low_value(data[i], settings.preset[i].min, 0, settings.preset[i].hyst, &hyst_state[i]);
             
-            // Запись в журнале событий
+   
+            if (preset_cur[i].max != high) {
+                // Запись в журнал о срабатывании верхней уставки
+                if (high == true) {
+                    printf("LOG high level! [%f]\r\n", data[i]);
+                    
+                }
+                else {
+                    printf("LOF high norm [%f]\r\n", data[i]);
+                    
+                }
+            }
+
+            if (preset_cur[i].min != low) {
+                // Запись в журнал о срабатывании нижней уставки
+                if (low == true) {
+                    printf("LOG low level! [%f]\r\n", data[i]);
+                    
+                }
+                else {
+                    printf("LOF low norm [%f]\r\n", data[i]);
+                    
+                }
+            }  
+            
+            preset_cur[i].max = high;
+            preset_cur[i].min = low;
+            
+#if 0            
+            // 
             if (high) {
-                DBG printf("Channel %i, preset HIGH\r\n", i);
+                DBG printf("Chan: %i, val: %f, HIGH\r\n", i, data[i]);
             }
             
             if (low) {
-                DBG printf("Channel %i, preset LOW\r\n", i);
+                DBG printf("Chan: %i, val: %f, LOW\r\n", i, data[i]);
             }
+#endif            
         }
         
         

+ 9 - 1
fw/modules/preset/preset_ai.h

@@ -2,7 +2,7 @@
 #define __PRESET_AI_H
 
 #include "at32f403a_407.h"
-
+#include <stdbool.h>
 
 
 //
@@ -17,6 +17,14 @@ typedef struct
 } preset_ai_t;
 
 
+// Структура для текущих значений уставок
+typedef struct 
+{
+    bool max;       // значение сигнала больше верхней уствки
+    bool min;       // значение сигнала меньше нижней уставки
+  
+} preset_cur_t;
+
 
 // 
 void preset_init(void);

+ 3 - 0
fw/modules/testing/soft_test.c

@@ -31,6 +31,9 @@ void test_tim_init(void)
     tmr_counter_enable(TMR3, TRUE);
     
     tmr_interrupt_enable(TMR3, TMR_OVF_INT, TRUE);
+    
+    test_sin_input();
+    sin_signal = 10*(sin(0.0174533*sin_input) + 1);
 }
 
 

+ 3 - 0
fw/modules/testing/soft_test.h

@@ -5,6 +5,9 @@
 //
 void test_tim_init(void);
 
+//
+void test_sin_input(void);
+
 //
 float test_get_signal(void);
 

+ 3 - 2
fw/user/main.cpp

@@ -82,6 +82,8 @@ int main(void)
 
 void init_task(void *argument)
 {
+    test_tim_init();
+  
 // -------------------------------------------------------------------------- //    
 // Software watchdog
   
@@ -245,8 +247,7 @@ void init_task(void *argument)
     
 // -------------------------------------------------------------------------- //        
 // Тесты
-    
-    test_tim_init();
+        
     //xTaskCreate(test_signal_task, "signal_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
         
     //usb_eth_init();

BIN
output/fw.bin


Diff do ficheiro suprimidas por serem muito extensas
+ 354 - 336
project/ewarm/iap/iap.dep


Diff do ficheiro suprimidas por serem muito extensas
+ 637 - 638
project/ewarm/module_universal_io.dep


+ 23 - 19
tools/analog_in.py

@@ -140,8 +140,7 @@ class IO_AnalogInput(IO_Module):
 
     def get_presets_max(self):
         'Максимальное значение уставок по все каналам'
-        data = struct.unpack('>ffffffffffff', self.modbus.read_holding_registers_raw(AiReg.PR_MAX.value, 24))
-        return data
+        return struct.unpack('>ffffffffffff', self.modbus.read_holding_registers_raw(AiReg.PR_MAX.value, 24))
      
 
     def get_preset_hist(self, channel):
@@ -150,11 +149,9 @@ class IO_AnalogInput(IO_Module):
 
 
     def get_presets_hist(self):
-        'Максимальное значение уставок по все каналам'
-        data = []
-        for i in range(12):
-            data.append(self.modbus.read_float_holding(AiReg.PR_HIST.value + i*2))
-        return data
+        '''Значение гистерезисов уставок'''
+        return struct.unpack('>ffffffffffff', self.modbus.read_holding_registers_raw(AiReg.PR_HIST.value, 24))
+
     
 
 
@@ -218,6 +215,9 @@ class IO_AnalogInput(IO_Module):
         'Максимальное значение уставки на отдельный канал'
         self.modbus.write_float(AiReg.PR_MAX.value + 2*(channel - 1), value)
 
+    def set_preset_hyst(self, channel, value):
+        'Значение гистерезиса уставки на отдельный канал'
+        self.modbus.write_float(AiReg.PR_HIST.value + 2*(channel - 1), value)
 
     '''Настройки входов'''
     def print_inputs(self):
@@ -241,18 +241,18 @@ class IO_AnalogInput(IO_Module):
 
         # Нижнее значение уставки
         data = self.get_presets_min()
-        print('Inputs preset min: ', Fore.GREEN + f'1: {data[0]}, 2: {data[0]}, 3: {data[0]}, 4: {data[0]}, 5: {data[0]}, 6: {data[0]}')
-        print('Inputs preset min: ', Fore.GREEN + f'7: {data[0]}, 8: {data[0]}, 9: {data[0]}, 10: {data[0]}, 11: {data[0]}, 12: {data[0]}')
+        print('Inputs preset min: ', Fore.GREEN + f'1: {data[0]}, 2: {data[1]}, 3: {data[2]}, 4: {data[3]}, 5: {data[4]}, 6: {data[5]}')
+        print('Inputs preset min: ', Fore.GREEN + f'7: {data[6]}, 8: {data[7]}, 9: {data[8]}, 10: {data[9]}, 11: {data[10]}, 12: {data[11]}')
 
         # Верхнее значение уставок
         data = self.get_presets_max()
-        print('Inputs preset max: ', Fore.GREEN + f'1: {data[0]}, 2: {data[0]}, 3: {data[0]}, 4: {data[0]}, 5: {data[0]}, 6: {data[0]}')
-        print('Inputs preset max: ', Fore.GREEN + f'7: {data[0]}, 8: {data[0]}, 9: {data[0]}, 10: {data[0]}, 11: {data[0]}, 12: {data[0]}')
-
-
+        print('Inputs preset max: ', Fore.GREEN + f'1: {data[0]}, 2: {data[1]}, 3: {data[2]}, 4: {data[3]}, 5: {data[4]}, 6: {data[5]}')
+        print('Inputs preset max: ', Fore.GREEN + f'7: {data[6]}, 8: {data[7]}, 9: {data[8]}, 10: {data[9]}, 11: {data[10]}, 12: {data[11]}')
 
         # Гистерезис
-
+        data = self.get_presets_hist()
+        print('Input preset hyst: ', Fore.GREEN + f'1: {data[0]}, 2: {data[1]}, 3: {data[2]}, 4: {data[3]}, 5: {data[4]}, 6: {data[5]}')
+        print('Input preset hyst: ', Fore.GREEN + f'7: {data[6]}, 8: {data[7]}, 9: {data[8]}, 10: {data[9]}, 11: {data[10]}, 12: {data[11]}')
 
 
         # Коэффициенты усиления
@@ -317,13 +317,17 @@ def main():
     ai = IO_AnalogInput(modbus_tester) 
 
     '''Режим работы аналоговых входов'''
-    # ai.print_inputs()
-    # ai.set_presets_state(0b00_0000_0000)
-
+    # ai.set_inputs_state(0b1111_1111_1111)
+    ai.print_inputs()
+    
     # ai.show_graph(ai.get_fil_inputs, 'AIN_FIL_1')
 
     '''Уставки'''
-    
+    # ai.set_presets_state(0b1111_1111_1111)
+    # for i in range(1, 13):
+    #     ai.set_preset_max(i, 18.5)
+    #     ai.set_preset_min(i, 2)
+    #     ai.set_preset_hyst(i, 1)    
 
     '''Данные входов'''
     # while True:
@@ -335,7 +339,7 @@ def main():
 
     # ai.print_inputs()
 
-    # ai.sys.save_settings()
+    ai.sys.save_settings()
 
     '''Установка коэффициентов усиления. Канал, коэффициент'''
     '''

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff