Răsfoiți Sursa

Вывел аварии DIO в modbus.

unknown 4 luni în urmă
părinte
comite
b11314dc32

+ 1 - 1
fw/modules/io/analog_input.c

@@ -247,7 +247,7 @@ void ai_processing(void)
     }
     
     
-#if 1    
+#if 0    
     printf("end\r\n");
     adc_print_data();
     //adc_print_data_extend();

+ 42 - 20
fw/modules/io/digital_input.c

@@ -252,8 +252,13 @@ void debounce(void)
 
 
 // Периодический опрос дискретнрых входов и датчиков обрыва нагрузки.
+// TODO отрефакторить функцию
 void di_task(void *params)
 {
+    uint8_t out_state = 0; // текущее состояние выхода (для определения аварий)
+    uint8_t out_value = 0; // текущее значение на выходе (для определения аварий)
+    flag_status in_err_state = RESET; // текущее состояние на датчике аварий (значение на пине)
+    
     for (;;)
     {
         // Дискретные входы
@@ -273,33 +278,50 @@ void di_task(void *params)
                     leds[i].state = LED_ON;
                 }
             }
-        }
-        
+        }        
        
-        // Датчики обрыва нагрузки
+        // Датчики обрыва нагрузки и нисправность выходов
         for (int i = 0; i < DI_NUMBER; i++)
-        {                           
-            di_load_state[i] = (uint16_t)gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
-            
-            // Текущее состояние датчиков нагрузки.
-            if (!di_load_state[i]) {
-                di_load_state_bit &= ~(1 << i);  // снять бит
+        {
+            // Определяем текущие состояние выхода
+            if (save_mode_get())
+            {
+                out_state = settings.dout_save[i].state;
+                out_value = settings.dout_save[i].value;
             }
-            else {
-                di_load_state_bit |= 1 << i;
+            else
+            {
+                out_state = settings.dout[i].state;
+                out_value = settings.dout[i].value;
             }
+             
+            // Текущее состояние пина аварий
+            in_err_state = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
             
-            // Установка битов достоверности
-            // Если 0 (выход разомкнут), то состояние достоверно и нужно 
-            // выставить соответствующий бит
-            if (!(output_state_bit & (1 << i))) {
-                di_credibility_state_bit |= 1 << i;
+            // Если выход разомкнут (соответствующий бит в 0), 
+            // то обновляем слово состояний датчиков обрыва нагрузки
+            if (out_value == 0)
+            {
+                if (out_state == 0)
+                    di_load_state_bit &= ~(1 << i);
+                else if (in_err_state == RESET)
+                    di_load_state_bit &= ~(1 << i);
+                else 
+                    di_load_state_bit |= 1 << i;
+            }
+              
+            // Если выход замкнут (соответствующий бит в 1),
+            // то обновляем слово состояний неисправности выходов
+            else
+            {
+                if (out_state == 0)
+                    di_output_state_bit &= ~(1 << i);
+                if (in_err_state == RESET)
+                    di_output_state_bit |= 1 << i;
+                else
+                    di_output_state_bit &= ~(1 << i);
             }
-            else { 
-                di_credibility_state_bit &= ~(1 << i);
-            }  
         }
-            
         vTaskDelay(100);
     }
 }

+ 1 - 1
fw/user/main.cpp

@@ -111,7 +111,7 @@ void init_task(void *argument)
     // Настройки параметров порта Modbus
     settings_set_modbus_params(settings.com_settings.mb_port);
     
-#if 1
+#if 0
 // Только для теста    
     settings_set_all_default();
     settings_save(&settings);

BIN
output/fw.bin


Fișier diff suprimat deoarece este prea mare
+ 339 - 351
project/ewarm/iap/iap.dep


Fișier diff suprimat deoarece este prea mare
+ 611 - 622
project/ewarm/module_universal_io.dep


+ 1 - 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>

BIN
tools/__pycache__/io_module.cpython-313.pyc


BIN
tools/__pycache__/log_reader.cpython-313.pyc


BIN
tools/__pycache__/mb_registers.cpython-313.pyc


BIN
tools/__pycache__/modbus.cpython-313.pyc


BIN
tools/__pycache__/sys_params.cpython-313.pyc


BIN
tools/__pycache__/updater.cpython-313.pyc


+ 3 - 3
tools/analog_in.py

@@ -199,7 +199,7 @@ class IO_AnalogInput(IO_Module):
 def main():
     colorama.init(autoreset=True)
     
-    serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM4', 115200, timeout=0.05, parity='N', xonxoff=False)
     
     modbus_tester = Modbus(serial_port, 1)
     # modbus_tester.MB_DEBUG = True
@@ -241,11 +241,11 @@ def main():
     '''
 
 
-    # ai.sys.get_system_vars()     
+    ai.sys.get_system_vars()     
     
     # print(ai.get_inputs_state())
     # ai.set_inputs_state(0b1111_1111_1111)
-    print(ai.sys.get_module_state())
+    # print(ai.sys.get_module_state())
     # ai.set_inputs_state(0b0000_0000_0000)
     # ai.set_inputs_state(0b1111_1111_1111)
     # print(ai.get_inputs_state())

+ 19 - 2
tools/digital_io.py

@@ -89,6 +89,19 @@ class IO_Digital(IO_Module):
         self.set_inputs_mode(data)
 
 
+    def get_load_err(self):
+        'Состояние датчиков обрыва нагрузки'
+        data = self.modbus.read_holding_registers(DioReg.LOAD_ERR.value, 1)
+        return format(data[0], '08b')
+
+
+    def get_outputs_err(self):
+        'Неисправность реле'
+        data = self.modbus.read_holding_registers(DioReg.OUT_ERR.value, 1)
+        return format(data[0], '08b')
+
+
+
     '''Запрос параметров дискретных входов'''
     
     def get_outputs_state(self):
@@ -275,9 +288,9 @@ class IO_DigitalTester:
 def main():
     colorama.init(autoreset=True)
     
-    serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM4', 115200, timeout=0.05, parity='N', xonxoff=False)
     
-    modbus_tester = Modbus(serial_port, 2)
+    modbus_tester = Modbus(serial_port, 1)
     # dev_tester = IO_Digital(modbus_tester)
     dio = IO_Digital(modbus_tester)
 
@@ -409,6 +422,10 @@ def main():
     '''Регистры модуля'''
     # dev.print_inputs()
 
+    '''Аварии'''
+    print(dio.get_load_err())
+    print(dio.get_outputs_err())
+
     '''Настройи модуля'''
     # for i in range(1, 9):
     #     dev.set_input_mode(i, 1)

+ 4 - 0
tools/mb_registers.py

@@ -21,6 +21,9 @@ class DioReg(Enum):
     IN_NORM         = 0x0122 # Нормальное состояние входов
     IN_DEBOUNCE     = 0x0124 # Время антидребезга (ms)
 
+    LOAD_ERR        = 0x0130 # Состояние датчиков обрыва нагрузки (битовое поле)
+    OUT_ERR         = 0x0131 # Неисправность реле (битовое поле)
+
     OUT_STATE       = 0x0200 # Состояние выходов (вкл./выкл.)
     OUT_STATE_SAVE  = 0x0201 # Состояние выходов в безопасном режиме (вкл./выкл.)
     OUT_BITS        = 0x0202 # Текущее состояние выходов
@@ -30,6 +33,7 @@ class DioReg(Enum):
 
 
 
+
 class AiReg(Enum):
 
     IN_STATE        = 0x0300 # Состояние входов (вкл./выкл.)

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff