瀏覽代碼

Переработка логики MDIO

TelenkovDmitry 5 月之前
父節點
當前提交
025d40c562

+ 72 - 20
fw/modules/io/digital_output.c

@@ -34,6 +34,24 @@ out_t outputs[DO_NUMBER] = {
 //
 void do_init(void)
 {
+    // Таймер для выходов в режиме PWM
+    di_out_pwm_tim_init();
+    
+    
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        do_gpio_init(&outputs[i], i);
+      
+        if (save_mode_get()) {
+            do_update(&settings.dout_save[i], i) ;
+        }
+        else {
+            do_update(&settings.dout[i], i) ;
+        }
+    }
+        
+    
+#if 0  
     output_state_bit = settings.do_bits;
     output_mode_bit = settings.do_mode_bits;
     output_mode_save_bit = settings.do_mode_save_bits;
@@ -57,41 +75,49 @@ void do_init(void)
             outputs[i].pwm_period = settings.do_pwm_period[i];
         }
         
-        di_gpio_init(&outputs[i], i);
+        do_gpio_init(&outputs[i], i);
+        
+        do_update(&outputs[i], i) ;
     }
+#endif    
 }
 
+
 //
-void di_gpio_init(out_t *out, uint8_t index)
+void do_gpio_init(out_t *out, uint8_t index)
 {
     gpio_init_type gpio_init_struct;
-
     
-    // Выход
-    if (out->mode == 0)
-    {
-        gpio_default_para_init(&gpio_init_struct);
-        
-        gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
-        gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
-        gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;  
-        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
-        gpio_init_struct.gpio_pins           = out->pin;
-        gpio_init(out->port, &gpio_init_struct); 
-    }
+    gpio_default_para_init(&gpio_init_struct);
     
-    do_update(out, index) ;
+    gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
+    gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
+    gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;  
+    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    gpio_init_struct.gpio_pins           = out->pin;
+    gpio_init(out->port, &gpio_init_struct); 
 }
 
+
 // Установка состояний дискретных выходов (вкл./выкл.)
-void do_set_state(void)
+
+void do_set_state(bool save_mode)
 {
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        settings.dout[i].state = (uint8_t)((settings.do_state_bits >> i) & 1);
+    // Обычный режим работы
+    if (!save_mode) {
+        for (int i = 0; i < DO_NUMBER; i++) {
+            settings.dout[i].state = (uint8_t)((settings.do_state_bits >> i) & 1);
+        }
+    }
+    // Безопасный режим работы
+    else {
+        for (int i = 0; i < DO_NUMBER; i++) {
+            settings.dout_save[i].state = (uint8_t)((settings.do_state_save_bits >> i) & 1);
+        }
     }
 }
 
+
 //
 void do_set_common(void)
 {
@@ -99,6 +125,7 @@ void do_set_common(void)
     
     for (int i = 0; i < DO_NUMBER; i++)
     {
+#if 0      
         // 
         if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) {
             settings.do_bits = output_state_bit;
@@ -128,12 +155,14 @@ void do_set_common(void)
  
         if (flag)
             do_update(&outputs[i], i);
+#endif        
     }
 }
 
 //
 void do_set(void)
 {
+#if 0  
     if (output_state_bit == settings.do_bits) 
         return;
     
@@ -148,8 +177,27 @@ void do_set(void)
     
     // Сохраним новое значение выходов в настройках
     settings.do_bits = output_state_bit;
+#endif    
+}
+
+
+
+// Установка значения на выходе 
+void do_update(do_t *out, uint8_t i)
+{
+    // Режим ШИМ
+    if (out->mode) {
+        do_set_pwm(out->pwm_period, out->pwm_duty, i);
+    }
+    // Режим обычного выхода
+    else {
+        do_set_out(&outputs[i], out->value);
+    }
 }
 
+
+
+#if 0
 // Установка значения на выходе 
 void do_update(out_t *out, uint8_t i)
 {
@@ -171,10 +219,13 @@ void do_update(out_t *out, uint8_t i)
             do_set_out(out, settings.do_bits & (1 << i));
     }
 }
+#endif
+
 
 //
 void do_set_mode(void)
 {
+#if 0  
     if (output_mode_bit == settings.do_mode_bits)
         return;
   
@@ -189,6 +240,7 @@ void do_set_mode(void)
     }
   
     settings.do_mode_bits = output_mode_bit;
+#endif    
 }
 
 //

+ 6 - 3
fw/modules/io/digital_output.h

@@ -9,10 +9,10 @@
 void do_init(void);
 
 //
-void di_gpio_init(out_t *out, uint8_t index);
+void do_gpio_init(out_t *out, uint8_t index);
 
 //
-void do_set_state(void);
+void do_set_state(bool save_mode);
 
 //
 void do_set_common(void);
@@ -21,7 +21,10 @@ void do_set_common(void);
 void do_set(void);
 
 //
-void do_update(out_t *out, uint8_t i);
+void do_update(do_t *out, uint8_t i);
+
+//
+//void do_update(out_t *out, uint8_t i);
 
 //
 void do_set_mode(void);

+ 16 - 0
fw/modules/io/io.h

@@ -57,10 +57,26 @@ typedef struct
     
 } di_t;
 
+
+#if 0
+uint16_t    do_mode_bits;       // режим работы выхода 0 - выход, 1 - ШИМ
+uint16_t    do_mode_save_bits;  // режим работы выхода в безопасном режиме 0 - выход, 1 - ШИМ
+uint16_t    do_bits;            // последнее сохраненное значение на выходах
+uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
+uint16_t    do_pwm[DO_NUMBER];  // значение заполнения ШИМ
+uint16_t    do_pwm_save[DO_NUMBER]; // значение заполнения ШИМ в безопасном режиме
+uint16_t    do_pwm_period[DO_NUMBER];  // период ШИМ в [0.1с (10..1000)]
+uint16_t    do_pwm_period_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
+#endif
+
 //
 typedef struct
 {
     uint8_t state;          // 0 - выкл, 1 - вкл
+    uint8_t mode;           // режим работы, 0 - вход, 1 - счетчик импульсов
+    uint8_t value;          // значение на выходе в режиме обычного выхода
+    uint16_t pwm_duty;      // значение заполнения ШИМ
+    uint16_t pwm_period;    // период ШИМ в [0.1с (10..1000)]
     
 } do_t;
 

+ 21 - 2
fw/modules/modbus/modbus_dio_params.c

@@ -129,6 +129,16 @@ uint16_t mb_init_dio_params(uint16_t i)
     
     index++;
     
+    // Статус выходов вкл./выкл.
+    mb_param[index].reg = 0x0201;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.do_state_save_bits;  
+	mb_param[index].set = mb_set_do_save_state;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
     // Текущее состояние выходов
     mb_param[index].reg = 0x0201;
 	mb_param[index].size = 1;
@@ -162,7 +172,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     // Состояние выходов в безопасном режиме
     mb_param[index].reg = 0x0204;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.do_save_bits;  
+	mb_param[index].param = (uint8_t*)&settings.do_value_save_bits;  
 	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
@@ -259,10 +269,19 @@ mb_delay_action_t mb_set_din_mode(void)
 //
 mb_delay_action_t mb_set_do_state(void)
 {
-    do_set_state();
+    do_set_state(false);
     return MB_NO_ACTION;
 }
 
+
+//
+mb_delay_action_t mb_set_do_save_state(void)
+{
+    do_set_state(true);
+    return MB_NO_ACTION;
+}
+
+
 //
 mb_delay_action_t mb_set_do(void)
 {

+ 3 - 0
fw/modules/modbus/modbus_dio_params.h

@@ -28,6 +28,9 @@ mb_delay_action_t mb_set_din_mode(void);
 //
 mb_delay_action_t mb_set_do_state(void);
 
+//
+mb_delay_action_t mb_set_do_save_state(void);
+
 //
 mb_delay_action_t mb_set_do(void);
 

+ 1 - 1
fw/modules/modbus/modbus_params.h

@@ -12,7 +12,7 @@ extern "C" {
 #endif
 
 #if defined (MDIO_88)  
-#define  MB_PARAM_MAX			94
+#define  MB_PARAM_MAX			95
 #endif
 
 #if defined (MAI_12)  

+ 16 - 6
fw/modules/settings/settings_api.h

@@ -119,23 +119,33 @@ typedef struct
     di_t        di[DI_NUMBER];      //
     uint16_t    di_state_bits;      //
     
-    do_t        dout[DO_NUMBER];    // 
-    uint16_t    do_state_bits;      //    
-    
     uint16_t    di_mode_bits;           // режим работы, 0 - вход, 1 - счетчик импульсов
     uint16_t    di_norm_state_bits;     // нормальное состояние (0 - разомкнут, 1 - замкнут)        
     uint16_t    di_debounce[DI_NUMBER]; // дискретные входы
     
+    
+    do_t        dout[DO_NUMBER];        // параметры выходов в обычном режиме
+    do_t        dout_save[DO_NUMBER];   // параметры выходов в безопасном режиме
+      
+    uint16_t    do_state_bits;
+    uint16_t    do_state_save_bits;
+    
     uint16_t    do_mode_bits;       // режим работы выхода 0 - выход, 1 - ШИМ
     uint16_t    do_mode_save_bits;  // режим работы выхода в безопасном режиме 0 - выход, 1 - ШИМ
-    uint16_t    do_bits;            // последнее сохраненное значение на выходах
-    uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
+
+    uint16_t    do_value_bits;      // значение на выходах
+    uint16_t    do_value_save_bits; // значение на выходах в бесопасном режиме работы
+    
+    uint16_t    period_archive[ARCH_DIO_CH_NUMBER]; // период архивирования
+    
+#if 0    
     uint16_t    do_pwm[DO_NUMBER];  // значение заполнения ШИМ
     uint16_t    do_pwm_save[DO_NUMBER]; // значение заполнения ШИМ в безопасном режиме
     uint16_t    do_pwm_period[DO_NUMBER];  // период ШИМ в [0.1с (10..1000)]
     uint16_t    do_pwm_period_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
+#endif    
+    
     
-    uint16_t    period_archive[ARCH_DIO_CH_NUMBER]; // период архивирования
 #endif
 
 #if defined (MAI_12)

+ 21 - 7
fw/modules/settings/settings_dio.c

@@ -38,20 +38,33 @@ void settings_din_def(settings_t *settings)
     }
 }
 
-// Выходы
+// Выходы. Настройка по умолчанию.
 void settings_do_def(settings_t *settings)
 {
     settings->do_state_bits = 0;
-  
-    for (uint8_t i = 0; i < DO_NUMBER; i++) {
-        settings->dout[i].state = 0;
+
+    // 
+    for (uint8_t i = 0; i < DO_NUMBER; i++) 
+    {
+        settings->dout[i].state = 0;    // выход выключен
+        settings->dout[i].mode = 0;     // режим работы выхода (обычный выход)
+        settings->dout[i].value = 0;    // значение на выходе в режиме обычного выхода
+        settings->dout[i].pwm_duty = 30;// заполнение PWM
+        settings->dout[i].pwm_period = 50; // период PWM
+        
+        settings->dout_save[i].state = 0;    // выход выключен
+        settings->dout_save[i].mode = 0;     // режим работы выхода (обычный выход)
+        settings->dout_save[i].value = 0;    // значение на выходе в режиме обычного выхода
+        settings->dout_save[i].pwm_duty = 30;// заполнение PWM
+        settings->dout_save[i].pwm_period = 50; // период PWM
     }
   
+    
     settings->do_mode_bits = 0;     // режим работы выхода (обычный выход)
-    settings->do_state_bits = 0;    // режим работы выхода в безопасном режиме (обычный выход)
-    settings->do_bits = 0;          // последнее сохраненное значение 
-    settings->do_save_bits = 0;
+    settings->do_value_bits = 0;          // последнее сохраненное значение 
+    settings->do_value_save_bits = 0;
     
+#if 0    
     for (uint8_t i = 0; i < DO_NUMBER; i++)
     {
         settings->do_pwm[i] = 30;
@@ -59,6 +72,7 @@ void settings_do_def(settings_t *settings)
         settings->do_pwm_period[i] = 50;
         settings->do_pwm_period_save[i] = 50;
     }
+#endif    
 }
 
 #endif

+ 1 - 1
fw/user/main.cpp

@@ -108,7 +108,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);

二進制
output/fw.bin


文件差異過大導致無法顯示
+ 374 - 371
project/ewarm/iap/iap.dep


文件差異過大導致無法顯示
+ 639 - 648
project/ewarm/module_universal_io.dep


+ 1 - 1
shared/model/model_cfg.h

@@ -6,7 +6,7 @@
 
 
 #if defined (MDIO_88)
-#define MODEL_STR           "MDIO-88"
+#define MODEL_STR           "MDIO_88"
 #define MODEL_CODE          0x0100
 #elif defined (MAO_4)
 #define MODEL_STR           "MAO_4"

二進制
tools/__pycache__/mb_registers.cpython-312.pyc


+ 2 - 2
tools/analog_in.py

@@ -244,8 +244,8 @@ def main():
     # ai.sys.get_system_vars()     
     
     # print(ai.get_inputs_state())
-    # ai.set_inputs_state(0b1111_1111_1111)
-    # ai.set_inputs_state(0b0000_0000_0000)
+    ai.set_inputs_state(0b1111_1111_1111)
+    # ai.set_inputs_state(0b0000_0000_1111)
     # ai.set_inputs_state(0b1111_1111_1111)
     # print(ai.get_inputs_state())
     

+ 5 - 3
tools/digital_io.py

@@ -277,9 +277,9 @@ def main():
     '''Выходы'''
 
     # print(dio.get_outputs())
-    !!!
+    
     # dio.set_output_mode(3, 0)
-    # print(dio.get_inputs_mode())
+    print(dio.get_inputs_mode())
 
     # for i in range(100):
     #     dio.set_outputs(0b00000001)
@@ -333,7 +333,9 @@ def main():
     # dev.print_inputs()
 
     '''Обновление'''
-    # dio.updater.update('fw.bin', 'MAI_12')
+    # serial_port.timeout = 1
+    # modbus_tester.MB_DEBUG = True
+    # dio.updater.update('fw.bin', 'MDIO_88')
     
     
 if __name__ == '__main__':

二進制
tools/fw.bin


部分文件因文件數量過多而無法顯示