Kaynağa Gözat

Фильтры на входах аварии нагрузки

unknown 7 ay önce
ebeveyn
işleme
760e4394db

+ 26 - 0
fw/modules/calibration/factors.c

@@ -0,0 +1,26 @@
+#include "at32f403a_407.h"
+#include "factors.h"
+#include "common_config.h"
+#include <stdio.h>
+
+#if defined (MAI_12)
+
+#undef DBG
+#define DBG if(0)
+
+
+// Очистить сектор системных настроек
+void factos_sector_clear(void)
+{
+    flash_status_type status;
+    
+    flash_unlock();
+   
+    if ((status = flash_sector_erase(CALIBRATION_FACTOR_SECTOR)) != FLASH_OPERATE_DONE) {
+        DBG printf("Calibration factors. Erase sector error: %d\r\n", status);
+    }
+    
+    flash_lock();
+}
+
+#endif

+ 11 - 0
fw/modules/calibration/factors.h

@@ -0,0 +1,11 @@
+#ifndef __FACTORS_H
+#define __FACTORS_H
+
+
+//
+void factos_sector_clear(void);
+
+
+
+#endif  // __FACTORS_H
+

+ 39 - 9
fw/modules/io/digital_input.c

@@ -42,6 +42,7 @@ uint32_t di_cnt[DI_NUMBER];             // счетчики входов
 uint16_t di_state[DI_NUMBER];           // состояние входов
 uint16_t di_state_bit;
 
+uint8_t  di_load_tmp[DO_NUMBER][5];     // буфер для временных значений
 uint16_t di_load_state[DO_NUMBER];      // состояние датчиков обрыва нагрузки
 uint16_t di_load_state_bit;             // состояние датчиков обрыва нагрузки (битовое поле)
 
@@ -136,7 +137,7 @@ void di_load_sens_init(simple_gpio_t *sens)
     
     gpio_default_para_init(&gpio_init_struct);
         
-    gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
+    gpio_init_struct.gpio_pull           = GPIO_PULL_UP;  
     gpio_init_struct.gpio_mode           = GPIO_MODE_INPUT;  
     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
     gpio_init_struct.gpio_pins           = sens->pin;
@@ -255,11 +256,6 @@ void debounce(void)
 // TODO отрефакторить функцию
 void di_task(void *params)
 {
-    uint8_t out_state = 0; // текущее состояние выхода (для определения аварий)
-    uint8_t out_value = 0; // текущее значение на выходе (для определения аварий)
-    uint8_t led_index = 0;
-    flag_status in_err_state = RESET; // текущее состояние на датчике аварий (значение на пине)
-        
     for (;;)
     {
         // Дискретные входы
@@ -280,7 +276,29 @@ void di_task(void *params)
                 }
             }
         }        
-       
+        vTaskDelay(100);
+    }
+}
+
+
+// di_load_tmp[]
+void di_load_task(void *params)
+{
+    uint8_t out_state = 0; // текущее состояние выхода (для определения аварий)
+    uint8_t out_value = 0; // текущее значение на выходе (для определения аварий)
+    uint8_t led_index = 0;
+    flag_status in_err_state = RESET; // текущее состояние на датчике аварий (значение на пине)
+
+    uint8_t tmp_index = 0;
+    bool buffer_full = false;
+      
+    for (;;)
+    {
+        if (tmp_index == 5) {
+            tmp_index = 0;
+            buffer_full = true;
+        }
+      
         // Датчики обрыва нагрузки и нисправность выходов
         for (int i = 0; i < DI_NUMBER; i++)
         {
@@ -302,8 +320,16 @@ void di_task(void *params)
                 led_index = i - 4 + 20;
             
             // Текущее состояние пина аварий
-            in_err_state = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
+            //in_err_state = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
+            
+            di_load_tmp[i][tmp_index] = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
+            
+            // Пока буфер не заполнен нельзя принять оценить состояние входов
+            if (!buffer_full)
+                continue;
             
+            in_err_state = di_load_tmp[i][0]*di_load_tmp[i][1]*di_load_tmp[i][2]*di_load_tmp[i][3]*di_load_tmp[i][4];
+#if 1            
             // Если выход разомкнут (соответствующий бит в 0), 
             // то обновляем слово состояний датчиков обрыва нагрузки
             if (out_value == 0)
@@ -339,8 +365,12 @@ void di_task(void *params)
                     leds[led_index].state = LED_OFF;
                 }
             }
+#endif            
         }
-        vTaskDelay(100);
+        tmp_index++;
+        
+        
+        vTaskDelay(2);
     }
 }
 

+ 2 - 0
fw/modules/io/digital_input.h

@@ -36,6 +36,8 @@ void debounce(void);
 // Периодический опрос входов и датчиков обрыва нагрузки
 void di_task(void *params);
 
+//
+void di_load_task(void *params);
 
 
 extern uint32_t di_cnt[];

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

@@ -220,6 +220,22 @@ uint16_t mb_init_ai_params(uint16_t i)
         index++;
     }
     
+    // Набор калибровочных коэффициентов "K"
+/*    
+    addr = 0x0410;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&settings.preset[i].hyst;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+*/    
     return index;
 }
 

+ 6 - 0
fw/user/main.cpp

@@ -43,6 +43,7 @@ extern "C" {
 #include "modbus_ai_params.h"
 #include "rtc_battery.h"
 #include "monitoring.h"
+#include "factors.h"
 }
 #include "terminal_sbs.h"
 #include "terminal_usartbridge.h"
@@ -138,11 +139,16 @@ void init_task(void *argument)
     di_init();
     do_init();
     xTaskCreate(di_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    xTaskCreate(di_load_task, "load_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     xTaskCreate(do_task, "output_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
 #endif
     
 #if defined (MAI_12)    
     
+// Тесты коэффициентов
+
+    factos_sector_clear();
+    
     ai_init();    
     xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     xTaskCreate(adc_alarm_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);

BIN
output/fw.bin


Dosya farkı çok büyük olduğundan ihmal edildi
+ 435 - 432
project/ewarm/iap/iap.dep


Dosya farkı çok büyük olduğundan ihmal edildi
+ 622 - 608
project/ewarm/module_universal_io.dep


+ 8 - 1
project/ewarm/module_universal_io.ewp

@@ -225,7 +225,7 @@
                     <state>AT_START_F403A_V1</state>
                     <state>PRINTF_STDLIB</state>
                     <state>DEBUG</state>
-                    <state>MAI_12</state>
+                    <state>MDIO_88</state>
                 </option>
                 <option>
                     <name>CCPreprocFile</name>
@@ -388,6 +388,7 @@
                     <state>$PROJ_DIR$\..\..\fw\modules\testing</state>
                     <state>$PROJ_DIR$\..\..\fw\modules\monitor</state>
                     <state>$PROJ_DIR$\..\..\fw\modules\preset</state>
+                    <state>$PROJ_DIR$\..\..\fw\modules\calibration</state>
                     <state>$PROJ_DIR$\..\..\fw\user</state>
                     <state>$PROJ_DIR$\..\..\libs\thirdparty\freertos\include</state>
                     <state>$PROJ_DIR$\..\..\libs\thirdparty\freertos\portable\IAR\ARM_CM4F</state>
@@ -2175,6 +2176,12 @@
                     <name>$PROJ_DIR$\..\..\fw\modules\adc\ms5192t.c</name>
                 </file>
             </group>
+            <group>
+                <name>calibration</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\calibration\factors.c</name>
+                </file>
+            </group>
             <group>
                 <name>dac</name>
                 <file>

+ 6 - 0
project/ewarm/module_universal_io.ewt

@@ -2382,6 +2382,12 @@
                     <name>$PROJ_DIR$\..\..\fw\modules\adc\ms5192t.c</name>
                 </file>
             </group>
+            <group>
+                <name>calibration</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\calibration\factors.c</name>
+                </file>
+            </group>
             <group>
                 <name>dac</name>
                 <file>

+ 10 - 0
shared/board/common_config.h

@@ -16,6 +16,16 @@
   */
 #define FW_VERSION                      "1.02"
 
+/**
+  * @brief  Калибровочные коэффициенты
+  */
+#define CALIBRATION_FACTOR_SECTOR       0x0801F800
+
+/**
+  * @brief  Адрес CRC калибровочных коэффициентов
+  */ 	
+#define CRC_FACTOR                      0x0801FFFC
+
 /**
   * @brief  Адрес сектора настроек
   */ 	

BIN
tools/bin_dio/fw.bin


+ 1 - 1
tools/digital_io.py

@@ -292,7 +292,7 @@ class IO_DigitalTester:
 def main():
     colorama.init(autoreset=True)
     
-    serial_port = Serial('COM58', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM11', 115200, timeout=0.05, parity='N', xonxoff=False)
     
     modbus_tester = Modbus(serial_port, 1)
     modbus_tester.MB_DEBUG = False

+ 36 - 22
tools/tester_dio.py

@@ -20,15 +20,21 @@ class DIO_Tester(Tester):
 
     def startup(self):
         """Предварительная настройка tester, dut"""
-        
-        # Отключаем безопасные режимы
-        self.tester.sys.set_save_mode(0)
-        self.dut.sys.set_save_mode(0)        
+        self.tester.set_outputs_state(0b1111_1111)
 
         # Подача питания на DUT
+        self.tester.set_output(1, 0)
+        time.sleep(0.3)
+
         self.tester.set_output(1, 1)
         time.sleep(0.3)
 
+        # Отключаем безопасные режимы
+        self.tester.sys.set_save_mode(0)
+        self.dut.sys.set_save_mode(0)        
+
+        
+
 
     def test_di(self):
         """Тест цифровых вхдов"""
@@ -71,27 +77,34 @@ class DIO_Tester(Tester):
 
     def test_do(self, do_number=1):
         """Проверка выхода"""
-
-        self.dut.set_outputs_state(0b0000_0001)
+        self.tester.set_output(4, 1)
+        self.dut.set_outputs_state(0b1111_1111)
+        time.sleep(0.5)
         self.dut.set_outputs(0b1111_1111)
+        time.sleep(0.5)
+        # Разомкнуть нужный выход DUT
+        self.dut.set_output(do_number, 0)
         time.sleep(1)
-        self.dut.set_outputs(0b1111_1110)
-        time_start = time.time()
-        time.sleep(1)
-        while True:
-            ret = self.dut.get_loads_bit()
-            time.sleep(0.1)
-            if ret != '00000000':
-                print(ret)
-                print(time.time() - time_start)
-                break
-
+        ret = self.dut.get_loads_bit()
+        if ret[-do_number] != '0':
+            print(Fore.RED + f'Нагрузка к выходу {do_number} не подключена {ret}. ERROR.')
+            return
 
-        return
-        self.dut.set_outputs(0b1111_1100)
-        time.sleep(1)
+        self.tester.set_output(4, 0)
+        time.sleep(0.5)
         ret = self.dut.get_loads_bit()
-        print(ret)
+        if ret[-do_number] == '0':
+            print(Fore.RED + f'Датчик обрыва назгрузки выхода {do_number} не работает {ret}. ERROR.')
+            return
+        
+        print(Fore.GREEN + f'Датчик обрыва нагрузки выхода {do_number}. OK.')
+
+
+    def test_all_do(self):
+        while True:
+            for i in range(1, 9):
+                self.test_do(i)
+                time.sleep(0.3)
 
 
 
@@ -204,7 +217,8 @@ class DIO_Tester(Tester):
         elif answers['action'] == 'Тест цифровых входов':
             self.test_di()
         elif answers['action'] == 'Тест выхода 1':
-            self.test_do()
+            # self.test_do()
+            self.test_all_do()
         elif answers['action'] == 'Тест RTC':
             self.test_rtc()
         elif answers['action'] == 'Тест LED':

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor