Sfoglia il codice sorgente

Рефакторинг цифровых выходов.

TelenkovDmitry 4 mesi fa
parent
commit
927358e6f2

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

@@ -251,7 +251,7 @@ void debounce(void)
 }
 
 
-// Периодический опрос дискретнрых входов и датчиков обрыва нагрузки
+// Периодический опрос дискретнрых входов и датчиков обрыва нагрузки.
 void di_task(void *params)
 {
     for (;;)

+ 97 - 176
fw/modules/io/digital_output.c

@@ -10,6 +10,9 @@
 #if defined (MDIO_88)
 
 uint16_t output_state_bit;
+uint16_t output_state_save_bit;
+uint16_t output_value_bit;
+uint16_t output_value_save_bit;
 uint16_t output_mode_bit;
 uint16_t output_mode_save_bit;
 uint16_t output_pwm[DO_NUMBER];
@@ -30,6 +33,8 @@ out_t outputs[DO_NUMBER] = {
 };
 
 
+static bool set_value_flag = false; // 
+
 
 //
 void do_init(void)
@@ -37,82 +42,40 @@ void do_init(void)
     // Таймер для выходов в режиме PWM
     di_out_pwm_tim_init();
     
-    // TODO Битовые поля вынести из настроек.
-    
-#if 1    
-    settings.dout[0].state = 1;
-    settings.dout[1].state = 0;
-    settings.dout[2].state = 1;
-    settings.dout[7].state = 1;
-    
-    settings.dout_save[0].state = 0;
-    settings.dout_save[1].state = 1;
-    settings.dout_save[2].state = 0;
-    settings.dout_save[7].state = 1;
-    
-#endif    
-    
     // Актуализация битовых полей (используюся для управления по modbus)
     
     // Состояние выходов вкл/выкл.
-    do_update_field(&settings.dout[0].state, &settings.do_state_bits);
-    do_update_field(&settings.dout_save[0].state, &settings.do_state_save_bits);
+    do_update_field(&settings.dout[0].state, &output_state_bit);
+    do_update_field(&settings.dout_save[0].state, &output_state_save_bit);
     
     // Режим работы выходов
-    do_update_field(&settings.dout[0].mode, &settings.do_mode_bits);
-    do_update_field(&settings.dout_save[0].mode, &settings.do_mode_save_bits);
+    do_update_field(&settings.dout[0].mode, &output_mode_bit);
+    do_update_field(&settings.dout_save[0].mode, &output_mode_save_bit);
     
     // Значение на выходах
-    do_update_field(&settings.dout[0].value, &settings.do_value_bits);
-    do_update_field(&settings.dout_save[0].value, &settings.do_value_save_bits);
-    
+    do_update_field(&settings.dout[0].value, &output_value_bit);
+    do_update_field(&settings.dout_save[0].value, &output_value_save_bit);
     
+    // Установить режим работы и состояние на всех выходах
     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;
-    
-    // Таймер для выходов в режиме PWM
-    di_out_pwm_tim_init();
-    
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        output_pwm[i] = settings.do_pwm[i];
-        output_pwm_save[i] = settings.do_pwm_save[i];
-        output_pwm_period[i] = settings.do_pwm_period[i];
-        output_pwm_period_save[i] = settings.do_pwm_period_save[i];
 
-        if (save_mode_get()) {
-            outputs[i].pwm_duty = settings.do_pwm_save[i];
-            outputs[i].pwm_period = settings.do_pwm_period_save[i];
-        }
-        else {
-            outputs[i].pwm_duty = settings.do_pwm[i];
-            outputs[i].pwm_period = settings.do_pwm_period[i];
-        }
-        
-        do_gpio_init(&outputs[i], i);
+        // Актуализация параметров PWM для modbus
+        output_pwm[i] = settings.dout[i].pwm_duty;
+        output_pwm_period[i] = settings.dout[i].pwm_period;
         
-        do_update(&outputs[i], i) ;
+        output_pwm_save[i] = settings.dout_save[i].pwm_duty;
+        output_pwm_period[i] = settings.dout_save[i].pwm_period;
+         
+        // Установка заданного режима и состояния выхода
+        if (!save_mode_get())
+            do_update(&settings.dout[i], i) ;
     }
-#endif    
 }
 
 
-//
+// Заполняет битовые поля по значения в массивах
 void do_update_field(uint8_t *param, uint16_t *field)
 {
     for (int i = 0; i < DO_NUMBER; i++)
@@ -127,9 +90,7 @@ void do_update_field(uint8_t *param, uint16_t *field)
 }
 
 
-
-
-//
+// Настройка GPIO выходов
 void do_gpio_init(out_t *out, uint8_t index)
 {
     gpio_init_type gpio_init_struct;
@@ -145,23 +106,6 @@ void do_gpio_init(out_t *out, uint8_t index)
 }
 
 
-// Установка состояний дискретных выходов (вкл./выкл.)
-
-void do_set_state(bool save_mode)
-{
-    // Обычный режим работы
-    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);
-        }
-    }
-}
 
 
 //
@@ -171,66 +115,63 @@ 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;
-            flag = true;
-        } 
-        else if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i))) {
-            settings.do_mode_bits ^= (1 << i);
-            settings.do_mode_bits = output_mode_bit;
-            flag = true;
-        }  
-        else if (settings.do_pwm[i] != output_pwm[i]) {
-            settings.do_pwm[i] = output_pwm[i];
+        // Изменилось состояние выходов
+        if (settings.dout[i].state != (output_state_bit & (1 << i))) {
+            settings.dout[i].state = (output_state_bit >> i) & 1;
+        }
+      
+        // Изменилось значение на выходе
+        if (settings.dout[i].value != (output_value_bit & (1 << i))) {
+            settings.dout[i].value = (output_value_bit >> i) & 1;
             flag = true;
         }
-        else if (settings.do_pwm_save[i] != output_pwm_save[i]) {
-            settings.do_pwm_save[i] = output_pwm_save[i];
+        
+        // Изменился режим работы
+        if (settings.dout[i].mode != (output_mode_bit & (1 << i))) {
+            settings.dout[i].mode = (output_mode_bit >> i) & 1;
             flag = true;
         }
-        else if (settings.do_pwm_period [i] != output_pwm_period[i]) {
-            settings.do_pwm_period[i] = output_pwm_period[i];
+                
+        // Изменилось заполнение PWM
+        if (settings.dout[i].pwm_duty != output_pwm[i]) {
+            settings.dout[i].pwm_duty = output_pwm[i];
             flag = true;
         }
-        else if (settings.do_pwm_period_save[i] != output_pwm_period_save[i]) {
-            settings.do_pwm_period_save[i] = output_pwm_period_save[i];
+        
+        // Изменился период PWM
+        if (settings.dout[i].pwm_period != output_pwm_period[i]) {
+            settings.dout[i].pwm_period = output_pwm_period[i];
             flag = true;
         }
- 
-        if (flag)
-            do_update(&outputs[i], i);
-#endif        
-    }
-}
+        
+        // Значение на выходе в безопасном режиме. Обновляем значения в настройках.
+        settings.dout_save[i].value = (output_value_save_bit >> i) & 1;
+        
+        // Режим работы в безопасном режиме. Обновляем значения в настройках.
+        settings.dout_save[i].mode = (output_mode_save_bit >> i) & 1;
+        
+        // Состояние выходов в безопасном режиме. Обновляем значения в настройках.
+        settings.dout_save[i].state = (output_state_save_bit >> i) & 1;
 
-//
-void do_set(void)
-{
-#if 0  
-    if (output_state_bit == settings.do_bits) 
-        return;
-    
-    // Состояние выхода/выходов изменилось
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) 
-        {
-            do_update(&outputs[i], i);
-        }
+        // Заполнение PWM в безопасном режие. Обновляем значение в настройках.
+        settings.dout_save[i].pwm_duty = output_pwm_save[i];
+        
+        // Период PWM в безопасном режие. Обновляем значение в настройках.
+        settings.dout_save[i].pwm_period = output_pwm_period_save[i];
+        
+        if (flag)
+            do_update(&settings.dout[i], i);
     }
-    
-    // Сохраним новое значение выходов в настройках
-    settings.do_bits = output_state_bit;
-#endif    
 }
 
 
-
-// Установка значения на выходе 
+// Установка режима и значения на выходе
 void do_update(do_t *out, uint8_t i)
 {
+    // Если выход выключен - ничего не меняем
+    if (!out->state)
+        return;
+  
     // Режим ШИМ
     if (out->mode) {
         do_set_pwm(out->pwm_period, out->pwm_duty, i);
@@ -242,53 +183,6 @@ void do_update(do_t *out, uint8_t i)
 }
 
 
-
-#if 0
-// Установка значения на выходе 
-void do_update(out_t *out, uint8_t i)
-{
-    // Режим ШИМ
-    if (settings.do_mode_bits & (1 << i)) {
-        // Безопасный режим включен
-        if (save_mode_get())
-            do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
-        else
-            do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
-    }
-    // Режим обычного выхода
-    else {
-        out->mode = 0;
-        // Безопасный режим включен
-        if (save_mode_get())
-            do_set_out(out, settings.do_save_bits & (1 << i));
-        else
-            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;
-  
-    // Состояние выхода/выходов изменилось
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i)))
-        {
-            settings.do_mode_bits ^= (1 << i);
-            do_update(&outputs[i], i);
-        }
-    }
-  
-    settings.do_mode_bits = output_mode_bit;
-#endif    
-}
-
 //
 void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
 {
@@ -307,17 +201,17 @@ void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
     outputs[index].mode = 1;
 }
 
-//
+
+// Дергает пином.
 void do_set_out(out_t *out, uint8_t val)
 {
-    if (val) {
+    if (val)
         gpio_bits_set(out->port, out->pin);
-    }
-    else {
+    else
         gpio_bits_reset(out->port, out->pin);
-    }
 }
 
+
 //
 void out_as_pwm(void)
 {
@@ -358,6 +252,33 @@ void out_as_pwm(void)
 }
 
 
+// Периодический контроль перехода в безопасный режим
+void do_task(void *params)
+{
+    for (;;)
+    {
+        if (save_mode_get()) {
+            set_value_flag = true;
+        }  
+        else
+            set_value_flag = false;
+        
+        // Нужно установить параметры выходов
+        if (set_value_flag) {
+            set_value_flag = false;
+            
+            for (int i = 0; i < DO_NUMBER; i++) 
+            {
+                do_update(&settings.dout_save[i], i) ;
+            }
+        }
+          
+        vTaskDelay(100);
+    }
+}
+      
+
+
 // -------------------------------------------------------------------------- //
 //                              PWM
 

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

@@ -11,33 +11,15 @@ void do_init(void);
 //
 void do_update_field(uint8_t *param, uint16_t *field);
 
-//
-void do_update_state_field(do_t *out, uint16_t *field);
-
-//
-void do_update_mode_field(do_t *out, uint16_t *field);
-
 //
 void do_gpio_init(out_t *out, uint8_t index);
 
-//
-void do_set_state(bool save_mode);
-
 //
 void do_set_common(void);
 
-//
-void do_set(void);
-
 //
 void do_update(do_t *out, uint8_t i);
 
-//
-//void do_update(out_t *out, uint8_t i);
-
-//
-void do_set_mode(void);
-
 //
 void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index);
 
@@ -50,6 +32,9 @@ void out_as_pwm(void);
 // 
 void di_out_pwm_tim_init(void);
 
+//
+void do_task(void *params);
+
 
 #endif  // __DIGITAL_OUTPUT_H
 

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

@@ -110,7 +110,11 @@ typedef struct
 
 
 extern uint16_t output_state_bit;
+extern uint16_t output_state_save_bit;
+extern uint16_t output_value_bit;
+extern uint16_t output_value_save_bit;
 extern uint16_t output_mode_bit;
+extern uint16_t output_mode_save_bit;
 extern uint16_t output_pwm[];
 extern uint16_t output_pwm_save[];
 extern uint16_t output_pwm_period[];

+ 13 - 34
fw/modules/modbus/modbus_dio_params.c

@@ -4,6 +4,7 @@
 #include "digital_input.h"
 #include "digital_output.h"
 #include "settings_api.h"
+#include "io.h"
 
 extern mb_param_t mb_param[];
 
@@ -122,18 +123,18 @@ uint16_t mb_init_dio_params(uint16_t i)
     // Статус выходов вкл./выкл.
     mb_param[index].reg = 0x0200;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.do_state_bits;  // +  
-	mb_param[index].set = mb_set_do_state;
+	mb_param[index].param = (uint8_t*)&output_state_bit;
+	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
     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].param = (uint8_t*)&output_state_save_bit;
+	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -142,7 +143,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     // Текущее состояние выходов
     mb_param[index].reg = 0x0202;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&output_state_bit;  
+	mb_param[index].param = (uint8_t*)&output_value_bit;  
 	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
@@ -152,7 +153,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     // Состояние выходов в безопасном режиме
     mb_param[index].reg = 0x0203;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.do_value_save_bits;  
+	mb_param[index].param = (uint8_t*)&output_value_save_bit;  
 	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
@@ -163,7 +164,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*)&output_mode_bit;  
-	mb_param[index].set = mb_set_do_mode;
+	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -172,8 +173,8 @@ uint16_t mb_init_dio_params(uint16_t i)
     // Режим работы выходов в безопасном режиме
     mb_param[index].reg = 0x0205;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.do_mode_save_bits;  
-	mb_param[index].set = NULL;
+	mb_param[index].param = (uint8_t*)&output_mode_save_bit;  
+	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -185,7 +186,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     {
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&output_pwm[i];  // Счетчик ипульсов
+        mb_param[index].param = (uint8_t*)&output_pwm[i];  
         mb_param[index].set = mb_set_do;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
@@ -200,7 +201,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     {
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&output_pwm_save[i];  // Счетчик ипульсов
+        mb_param[index].param = (uint8_t*)&output_pwm_save[i];
         mb_param[index].set = mb_set_do;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
@@ -266,22 +267,6 @@ mb_delay_action_t mb_set_din_mode(void)
 // -------------------------------------------------------------------------
 // Параметры дискретных выходов
 
-//
-mb_delay_action_t mb_set_do_state(void)
-{
-    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)
 {
@@ -289,12 +274,6 @@ mb_delay_action_t mb_set_do(void)
     return MB_NO_ACTION;
 }
 
-//
-mb_delay_action_t mb_set_do_mode(void)
-{
-    do_set_mode();
-    return MB_NO_ACTION;
-}
 
 #endif
 

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

@@ -25,18 +25,9 @@ mb_delay_action_t mb_set_di_state(void);
 //
 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);
 
-//
-mb_delay_action_t mb_set_do_mode(void);
-
 
 
 #ifdef __cplusplus

+ 0 - 19
fw/modules/settings/settings_api.h

@@ -123,29 +123,10 @@ typedef struct
     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_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    
-    
-    
 #endif
 
 #if defined (MAI_12)

+ 0 - 18
fw/modules/settings/settings_dio.c

@@ -41,9 +41,6 @@ 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;    // выход выключен
@@ -58,21 +55,6 @@ void settings_do_def(settings_t *settings)
         settings->dout_save[i].pwm_duty = 30;// заполнение PWM
         settings->dout_save[i].pwm_period = 50; // период PWM
     }
-  
-    
-    settings->do_mode_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;
-        settings->do_pwm_save[i] = 30; // значение на выходах в бесопасном режиме работы
-        settings->do_pwm_period[i] = 50;
-        settings->do_pwm_period_save[i] = 50;
-    }
-#endif    
 }
 
 #endif

+ 1 - 6
fw/user/main.cpp

@@ -132,27 +132,22 @@ void init_task(void *argument)
 
 #if defined (MDIO_88)
     
-    // Инициализация GPIO, EXTI, TIM для цифровых входов
     di_init();
-    
-    // 
     do_init();
     xTaskCreate(di_task, "input_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)    
     
     ai_init();    
     xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
 #endif    
     
 #if defined (MAO_4)    
     
     ao_init();
     xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-    
 #endif 
     
 // -------------------------------------------------------------------------- //

+ 140 - 140
iap/modules/io/io.h

@@ -1,140 +1,140 @@
-#ifndef __IO_H
-#define __IO_H
-
-#include <stdbool.h>
-
-// Период опроса входов 100 мс
-
-// -------------------------------------------------------------------------- //
-// Дискретые входы
-
-#define DI_NUMBER       8   // Количество входов
-
-#define DI_MODE_IN      0   // Режим обычного входа
-
-#define DI_MODE_CNT     1   // Режим счетного входа
-
-
-// -------------------------------------------------------------------------- //
-// Выходы
-#define DO_NUMBER       8    // Количество выходов
-
-#define DEBOUNCE_CNT    50
-
-// Прочие параметры из других модулей для передачи по modbus
-
-//uint32_t uptime;
-
-
-// -------------------------------------------------------------------------- //
-
-//
-void io_port_init(void);
-
-//
-void io_init(void);
-
-//
-void io_tim_init(void);
-
-// -------------------------------------------------------------------------- //
-
-typedef struct
-{
-    gpio_type *port;
-    uint16_t pin;
-    
-} simple_gpio_t;
-
-
-typedef struct 
-{
-    gpio_type *port;
-    uint16_t pin;
-    uint16_t mode;  // 0 - обычный вход, 1 - счетный вход
-    uint32_t deb_counter;
-    uint32_t cnt;
-    bool p_flag;
-    bool cnt_flag;
-    
-} din_t;
-
-
-typedef struct
-{
-    gpio_type *port;
-    uint16_t pin;
-    uint16_t mode;  // 0 - обычный выход, 1 - режим ШИМ
-    uint16_t pwm_period_cnt;
-    uint16_t pwm_duty_cnt;
-    uint16_t pwm_flag;
-    uint16_t pwm_period;
-    uint16_t pwm_duty;
-    
-} out_t;
-
-
-
-
-// -------------------------------------------------------------------------- //
-// Текущие параметры
-
-extern uint16_t input_state[DI_NUMBER];      // состояние входа
-extern uint16_t input_state_bit;             // битовое поле
-
-extern uint32_t input_cnt[DI_NUMBER];       // счетчики входов
-
-extern uint16_t output_state_bit;
-extern uint16_t output_mode_bit;
-extern uint16_t output_pwm[];
-extern uint16_t output_pwm_save[];
-extern uint16_t output_pwm_period[];
-extern uint16_t output_pwm_period_save[];
-
-//uint16_t output_state[DI_NUMBER];    // состояние выхода, 0 - норма, 1 - обрыв, 2 - КЗ
-
-
-// -------------------------------------------------------------------------- //
-// Структуры настроек. Хранятся во внутренней памяти контроллера.
-
-
-//
-// контроль состояний - обрыв, КЗ, норма
-typedef struct
-{
-    uint16_t state;         // состояние выхода
-    uint16_t pwm;           // 
-    uint16_t mode;          // режим работы, 0 - выход, 1 - PWM
-    uint16_t smode_state;   // значение в безопасном режиме,
-                            // 0 - разомкнут, 1 - замкнут
-    uint16_t smode_pwm;     // значение PWM в безопасном режиме (%)
-    uint16_t normal_state;  // нормальное состояние выхода
-                            // 0 - разомкнут, 1 - замкнут
-} output_t;
-
-
-typedef struct
-{
-    uint16_t smode;         // безопасный режим 0 - включен, 1 - выключен
-    uint16_t com_timeout;   // время ожидания запроса от мастера
-} system_t;
-
-
-// Структура системных настроек
-/*
-typedef struct 
-{
-	uint16_t        model;			// Модель
-	uint32_t        proddate;		// Дата производства
-	uint32_t        serial;			// Серийный номер
-	uint8_t         fw_version[8];	// Версия ПО
-	uint8_t         test_state;		// Статус тестирования
-	
-} sys_settings_t;
-
-*/
-
-
-
-#endif  // __IO_H
-
+#ifndef __IO_H
+#define __IO_H
+
+#include <stdbool.h>
+
+// Период опроса входов 100 мс
+
+// -------------------------------------------------------------------------- //
+// Дискретые входы
+
+#define DI_NUMBER       8   // Количество входов
+
+#define DI_MODE_IN      0   // Режим обычного входа
+
+#define DI_MODE_CNT     1   // Режим счетного входа
+
+
+// -------------------------------------------------------------------------- //
+// Выходы
+#define DO_NUMBER       8    // Количество выходов
+
+#define DEBOUNCE_CNT    50
+
+// Прочие параметры из других модулей для передачи по modbus
+
+//uint32_t uptime;
+
+
+// -------------------------------------------------------------------------- //
+
+//
+void io_port_init(void);
+
+//
+void io_init(void);
+
+//
+void io_tim_init(void);
+
+// -------------------------------------------------------------------------- //
+
+typedef struct
+{
+    gpio_type *port;
+    uint16_t pin;
+    
+} simple_gpio_t;
+
+
+typedef struct 
+{
+    gpio_type *port;
+    uint16_t pin;
+    uint16_t mode;  // 0 - обычный вход, 1 - счетный вход
+    uint32_t deb_counter;
+    uint32_t cnt;
+    bool p_flag;
+    bool cnt_flag;
+    
+} din_t;
+
+
+typedef struct
+{
+    gpio_type *port;
+    uint16_t pin;
+    uint16_t mode;  // 0 - обычный выход, 1 - режим ШИМ
+    uint16_t pwm_period_cnt;
+    uint16_t pwm_duty_cnt;
+    uint16_t pwm_flag;
+    uint16_t pwm_period;
+    uint16_t pwm_duty;
+    
+} out_t;
+
+
+
+
+// -------------------------------------------------------------------------- //
+// Текущие параметры
+
+extern uint16_t input_state[DI_NUMBER];      // состояние входа
+extern uint16_t input_state_bit;             // битовое поле
+
+extern uint32_t input_cnt[DI_NUMBER];       // счетчики входов
+
+extern uint16_t output_state_bit;
+extern uint16_t output_mode_bit;
+extern uint16_t output_pwm[];
+extern uint16_t output_pwm_save[];
+extern uint16_t output_pwm_period[];
+extern uint16_t output_pwm_period_save[];
+
+//uint16_t output_state[DI_NUMBER];    // состояние выхода, 0 - норма, 1 - обрыв, 2 - КЗ
+
+
+// -------------------------------------------------------------------------- //
+// Структуры настроек. Хранятся во внутренней памяти контроллера.
+
+
+//
+// контроль состояний - обрыв, КЗ, норма
+typedef struct
+{
+    uint16_t state;         // состояние выхода
+    uint16_t pwm;           // 
+    uint16_t mode;          // режим работы, 0 - выход, 1 - PWM
+    uint16_t smode_state;   // значение в безопасном режиме,
+                            // 0 - разомкнут, 1 - замкнут
+    uint16_t smode_pwm;     // значение PWM в безопасном режиме (%)
+    uint16_t normal_state;  // нормальное состояние выхода
+                            // 0 - разомкнут, 1 - замкнут
+} output_t;
+
+
+typedef struct
+{
+    uint16_t smode;         // безопасный режим 0 - включен, 1 - выключен
+    uint16_t com_timeout;   // время ожидания запроса от мастера
+} system_t;
+
+
+// Структура системных настроек
+/*
+typedef struct 
+{
+	uint16_t        model;			// Модель
+	uint32_t        proddate;		// Дата производства
+	uint32_t        serial;			// Серийный номер
+	uint8_t         fw_version[8];	// Версия ПО
+	uint8_t         test_state;		// Статус тестирования
+	
+} sys_settings_t;
+
+*/
+
+
+
+#endif  // __IO_H
+

BIN
output/fw.bin


File diff suppressed because it is too large
+ 386 - 348
project/ewarm/iap/iap.dep


File diff suppressed because it is too large
+ 707 - 697
project/ewarm/module_universal_io.dep


+ 37 - 9
tools/digital_io.py

@@ -96,32 +96,35 @@ class IO_Digital(IO_Module):
         data = self.modbus.read_holding_registers(DioReg.OUT_STATE.value, 1)
         return format(data[0], '08b')
 
+
     def get_outputs_state_save(self):
         'Состояние выходов в безопасном режиме (вкл./выкл.)'
         data = self.modbus.read_holding_registers(DioReg.OUT_STATE_SAVE.value, 1)
         return format(data[0], '08b')
 
+
     def get_outputs(self):
         'Текущее состояние выходов'
         data = self.modbus.read_holding_registers(DioReg.OUT_BITS.value, 1)
-        return format(data[0], '0b8')
+        return format(data[0], '08b')
+
 
     def get_outputs_save(self):
         'Текущее состояние выходов в безопасном режиме'
         data = self.modbus.read_holding_registers(DioReg.OUT_BITS_SAVE.value, 1)
-        return format(data[0], '0b8')
+        return format(data[0], '08b')
 
 
     def get_outputs_mode(self):
         'Режим работы выходов'
         data = self.modbus.read_holding_registers(DioReg.OUT_MODE.value, 1)
-        return format(data[0], '0b8')
+        return format(data[0], '08b')
     
 
     def get_outputs_mode_save(self):
         'Режим работы выходов в безопасном режиме'
         data = self.modbus.read_holding_registers(DioReg.OUT_MODE_SAVE.value, 1)
-        return format(data[0], '0b8')
+        return format(data[0], '08b')
     
 
     '''Установка параметров дискретных выходов'''
@@ -131,15 +134,17 @@ class IO_Digital(IO_Module):
         'Состояние выходов вкл./выкл. (битовое поле)'
         self.modbus.write_holding_register(DioReg.OUT_STATE.value, val)
 
+
     def set_outputs_state_save(self, val):
         'Состояние выходов вкл./выкл. в безопасном режиме (битовое поле)'
         self.modbus.write_holding_register(DioReg.OUT_STATE_SAVE.value, val)
     
+
     def set_outputs(self, val):
         'Текущее состояние выходов в обычном режиме'
         self.modbus.write_holding_register(DioReg.OUT_BITS.value, val)
-
     
+
     def set_output(self, output, val):
         'Установить значение на конкретном выходе [1..8]'
         ret = self.modbus.read_holding_registers(DioReg.OUT_BITS.value, 1)
@@ -157,6 +162,17 @@ class IO_Digital(IO_Module):
         self.set_outputs_mode(SysUtils.set_bit(ret, output - 1, val))
         
 
+    def set_outputs_mode_save(self, val):
+        'Режим работы выходов в безопасном режиме (битовое поле)'
+        self.modbus.write_holding_register(DioReg.OUT_MODE_SAVE.value, 1)
+
+
+    def set_output_mode_save(self, output, val):
+        'Установить режим работы конкретного выхода [1..8] в безопамном режиме'
+        ret = self.modbus.read_holding_registers(DioReg.OUT_MODE_SAVE.value, 1)[0]
+        self.set_outputs_mode(SysUtils.set_bit(ret, output - 1, val))
+
+
     def print_inputs(self):
 
         # Состояние входов (вкл./выкл.)
@@ -261,7 +277,7 @@ def main():
     # print(dio.sys.get_save_delay())
     
     '''Сохранить информацию о модуле'''
-    # dio.sys.set_info('This is super DIO!')
+    # dio.sys.set_info('This is supe r DIO!')
 
     # dio.print_inputs()
     # dio.get_inputs_counters()
@@ -297,9 +313,21 @@ def main():
     # dio.set_outputs_state(0b1001_0000)
     # print(dio.get_outputs_state())
     
-    print(dio.get_outputs_state_save())
-    dio.set_outputs_state_save(0b0001_1001)
-    print(dio.get_outputs_state_save())
+    # print(dio.get_outputs_state_save())
+    # dio.set_outputs_state_save(0b0001_1001)
+    # print(dio.get_outputs_state_save())
+
+    '''Режим работы'''
+    # print(dio.get_outputs_mode())
+    # print(dio.get_outputs_mode_save())
+    # dio.set_outputs_mode(0b0010_1100)
+    # print(dio.get_outputs_mode())
+    dio.set_outputs(0b1000_1001)
+
+
+    '''Текущие значения'''
+    # print(dio.get_outputs())
+    # print(dio.get_outputs_save())
 
     # dio.set_output_mode(3, 0)
     # print(dio.get_inputs_mode())

Some files were not shown because too many files changed in this diff