Răsfoiți Sursa

Пока задефайнил наличе архива в AO, рефакторинг DO.

TelenkovDmitry 4 luni în urmă
părinte
comite
d0167a52cf

+ 46 - 2
fw/modules/io/digital_output.c

@@ -37,6 +37,35 @@ 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].mode, &settings.do_mode_bits);
+    do_update_field(&settings.dout_save[0].mode, &settings.do_mode_save_bits);
+    
+    // Значение на выходах
+    do_update_field(&settings.dout[0].value, &settings.do_value_bits);
+    do_update_field(&settings.dout_save[0].value, &settings.do_value_save_bits);
+    
     
     for (int i = 0; i < DO_NUMBER; i++)
     {
@@ -83,6 +112,23 @@ void do_init(void)
 }
 
 
+//
+void do_update_field(uint8_t *param, uint16_t *field)
+{
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        if (*param)
+            *field |= 1 << i;
+        else 
+            *field &= ~(1 << i);
+        
+        param += sizeof(do_t);
+    }  
+}
+
+
+
+
 //
 void do_gpio_init(out_t *out, uint8_t index)
 {
@@ -265,11 +311,9 @@ void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
 void do_set_out(out_t *out, uint8_t val)
 {
     if (val) {
-        gpio_bits_set(GPIOB, GPIO_PINS_15);
         gpio_bits_set(out->port, out->pin);
     }
     else {
-        gpio_bits_reset(GPIOB, GPIO_PINS_15);
         gpio_bits_reset(out->port, out->pin);
     }
 }

+ 9 - 0
fw/modules/io/digital_output.h

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

+ 19 - 2
fw/modules/log/log.c

@@ -85,13 +85,15 @@ void log_init(bool format)
 
     log_entries_capacity = ringfs_capacity(&fs_log);
     
+#if defined (MDIO_88) || (MAI_12)     
     archive_entries_capacity = ringfs_capacity(&fs_ch_arch[0]);
     
     // Event
     archive_event = xEventGroupCreate();
 
 	xTaskCreate(archive_task, "archive_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
-
+#endif
+    
     log_queue = xQueueCreate(10, sizeof(log_entry_t));
 
     xTaskCreate(log_task, "log_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
@@ -153,8 +155,10 @@ int log_fetch(void *entry, entry_type_t entry_type, uint8_t ch, uint32_t timeout
         return ret;
     if (entry_type == LOG_ENTRY)
         ret = ringfs_fetch(&fs_log, entry);
+#if defined (MDIO_88) || (MAI_12)     
     else if (entry_type == ARCHIVE_ENTRY)
         ret = ringfs_fetch(&fs_ch_arch[ch], entry);
+#endif    
     else ret = -1;
 
     xSemaphoreGive(log_mutex);
@@ -172,8 +176,10 @@ int log_discard(void *entry, entry_type_t entry_type, uint8_t ch, uint32_t timeo
         return ret;
     if (entry_type == LOG_ENTRY)
         ret = ringfs_discard(&fs_log);
+#if defined (MDIO_88) || (MAI_12)     
     else if (entry_type == ARCHIVE_ENTRY)
         ret = ringfs_discard(&fs_ch_arch[ch]);
+#endif    
     else ret = -1;
     
     xSemaphoreGive(log_mutex);
@@ -203,12 +209,14 @@ int log_append(void *entry, entry_type_t entry_type, uint8_t ch)
         log_etnry_ptr->crc = crc_8(entry, sizeof(log_entry_t) - 1);
         ret = ringfs_append(&fs_log, entry);
     }
+#if defined (MDIO_88) || (MAI_12)     
     else if (entry_type == ARCHIVE_ENTRY) 
     {
         archive_etnry_ptr = (archive_entry_t*)entry;
         archive_etnry_ptr->crc = crc_8(entry, sizeof(archive_entry_t) - 1);
         ret = ringfs_append(&fs_ch_arch[ch], entry);
     }
+#endif    
     else ret = -1;
     
     xSemaphoreGive(log_mutex);
@@ -225,7 +233,9 @@ uint16_t log_capacity(void)
 //
 uint16_t log_arch_capacity(uint8_t ch)
 {
+#if defined (MDIO_88) || (MAI_12)   
     return ringfs_count_exact(&fs_ch_arch[ch]);
+#endif    
 }
 
 // -------------------------------------------------------------------------- //
@@ -261,8 +271,11 @@ void log_info(uint8_t val, uint8_t ch)
 {
     if (val > 1)
         return;
-  
+#if defined (MDIO_88) || (MAI_12)   
     struct ringfs *fs = val == 0 ? &fs_log : &fs_ch_arch[ch];
+#else
+    struct ringfs *fs = &fs_log;
+#endif    
     
     int capacity_flash = 0;
     int count_flash = 0;
@@ -295,10 +308,12 @@ void log_format(uint8_t val, uint8_t ch)
         DBG printf("Formating log partition...\r\n");
         ringfs_format(&fs_log);
     } 
+#if defined (MDIO_88) || (MAI_12)       
     else if (val == 1) {
         DBG printf("Formating archive partition...\r\n");
         ringfs_format(&fs_ch_arch[ch]);
     }
+#endif    
 }
 
 // Добавить n записей журнала
@@ -420,6 +435,7 @@ void log_task(void *params)
 // TODO
 void log_check_archive_cnt(void)
 {
+#if defined (MDIO_88) || (MAI_12)   
     BaseType_t xHigherPriorityTaskWoken = pdFALSE;
     uint8_t channel_number = log_get_arch_channel_number();
 
@@ -436,5 +452,6 @@ void log_check_archive_cnt(void)
             }
         }
     }
+#endif    
 }
 

+ 3 - 1
fw/modules/log/log_api.c

@@ -90,9 +90,11 @@ int mb_archive_get_entry(uint8_t *buf, uint8_t ch, uint16_t entry_index)
 {
     uint8_t pack_len = 3;
     buf[2] = MB_ARCHIVE_ENTRY;  // Reference type
-        
+
+#if defined (MDIO_88) || (MAI_12)       
     if (log_get_archive_entry(entry_index, &fs_ch_arch[ch], &archive_entry) == -1)
         return 0;
+#endif
     
 #if 0    
     printf("[entry] timestamp = % " PRId64 ", value = %u, crc = %u\r\n", 

+ 15 - 15
fw/modules/modbus/modbus_dio_params.c

@@ -122,7 +122,7 @@ 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].param = (uint8_t*)&settings.do_state_bits;  // +  
 	mb_param[index].set = mb_set_do_state;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
@@ -132,7 +132,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     // Статус выходов вкл./выкл.
     mb_param[index].reg = 0x0201;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.do_state_save_bits;  
+	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;
@@ -140,7 +140,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     index++;
     
     // Текущее состояние выходов
-    mb_param[index].reg = 0x0201;
+    mb_param[index].reg = 0x0202;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&output_state_bit;  
 	mb_param[index].set = mb_set_do;
@@ -149,31 +149,31 @@ uint16_t mb_init_dio_params(uint16_t i)
     
     index++;
     
-    // Режим работы выходов
-    mb_param[index].reg = 0x0202;
+    // Состояние выходов в безопасном режиме
+    mb_param[index].reg = 0x0203;
 	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].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;
     
     index++;
     
-    // Режим работы выходов в безопасном режиме
-    mb_param[index].reg = 0x0203;
+    // Режим работы выходов
+    mb_param[index].reg = 0x0204;
 	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_bit;  
+	mb_param[index].set = mb_set_do_mode;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
     index++;
     
-    // Состояние выходов в безопасном режиме
-    mb_param[index].reg = 0x0204;
+    // Режим работы выходов в безопасном режиме
+    mb_param[index].reg = 0x0205;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.do_value_save_bits;  
-	mb_param[index].set = mb_set_do;
+	mb_param[index].param = (uint8_t*)&settings.do_mode_save_bits;  
+	mb_param[index].set = NULL;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     

+ 4 - 2
fw/modules/modbus/modbus_params.c

@@ -200,7 +200,7 @@ void mb_init_params(void)
     
     index++;
     
-    
+#if defined (MDIO_88) || (MAI_12)    
     uint8_t channel_number = log_get_arch_channel_number();
     
     // Текущее количество записей в архиве по каждому каналу
@@ -232,7 +232,7 @@ void mb_init_params(void)
         addr++;
         index++;
     }
-    
+#endif    
 	// ---------------------------------------------------------------------- //
 	//	Производственные параметры
 	// ---------------------------------------------------------------------- //
@@ -647,6 +647,7 @@ void mb_check_dummy(void)
 //
 void mb_check_archiv_per(void)
 {
+#if defined (MDIO_88) || (MAI_12)   
     uint8_t channel_number = log_get_arch_channel_number();
   
     for (uint8_t i = 0; i < channel_number; i++)
@@ -654,6 +655,7 @@ void mb_check_archiv_per(void)
         if (settings.period_archive[i] > (uint16_t)MAX_ARCHIVE_PERIOD)
             settings.period_archive[i] = (uint16_t)MAX_ARCHIVE_PERIOD;
     }
+#endif    
 }
 
 

+ 3 - 0
fw/modules/terminal/terminal_sbs.cpp

@@ -115,11 +115,14 @@ int SbsTerminal::execute(int argc, const char * const *argv)
         return 0;
     }
     // 
+#if defined (MDIO_88) || (MAI_12)                 
     if (strcmp(argv[0], "aget") == 0) {
+
         if (argc > 2)
             log_get_archive_entry(atoi(argv[1]), &fs_ch_arch[atoi(argv[2])], &archive_entry);
         return 0;
     }
+#endif    
     //
     if (strcmp(argv[0], "lstate") == 0) {
         if (argc > 1)

+ 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 1
+#if 0
 // Только для теста    
     settings_set_all_default();
     settings_save(&settings);

BIN
output/fw.bin


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


Fișier diff suprimat deoarece este prea mare
+ 651 - 651
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__/sys_params.cpython-312.pyc


+ 6 - 5
tools/analog_out.py

@@ -91,13 +91,14 @@ class IO_AnalogOutput(IO_Module):
 
 def main():
     colorama.init(autoreset=True)
-    serial_port = Serial('COM22', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
     ao_modbus = Modbus(serial_port, 8)
+    ao_modbus.MB_DEBUG = True
     ao = IO_AnalogOutput(ao_modbus)
-    ao.DBG = True
+    # ao.DBG = True
 
     '''Тесты отдельного модуля аналоговых выходов'''
-    # ao.sys.get_system_vars()
+    ao.sys.get_system_vars()
         
     '''Настройка аналоговых выходов'''
     # ao.set_outputs_state(0b1111)
@@ -144,8 +145,8 @@ def main():
     # ao.sys.save_sattings()
 
     '''Обновление прошивки'''
-    ao_modbus.MB_DEBUG = True
-    ao.updater.update('fw.bin', 'MAO_4')
+    # ao_modbus.MB_DEBUG = True
+    # ao.updater.update('fw.bin', 'MAO_4')
 
 
 if __name__ == '__main__':

+ 24 - 1
tools/digital_io.py

@@ -96,12 +96,21 @@ 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')
 
+    def get_outputs_save(self):
+        'Текущее состояние выходов в безопасном режиме'
+        data = self.modbus.read_holding_registers(DioReg.OUT_BITS_SAVE.value, 1)
+        return format(data[0], '0b8')
+
 
     def get_outputs_mode(self):
         'Режим работы выходов'
@@ -122,6 +131,9 @@ 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):
         'Текущее состояние выходов в обычном режиме'
@@ -244,7 +256,7 @@ def main():
 
 
     '''Тесты отдельного модуля DIO'''
-    dio.sys.get_system_vars()
+    # dio.sys.get_system_vars()
     # print(dio.sys.get_save_mode())
     # print(dio.sys.get_save_delay())
     
@@ -278,6 +290,17 @@ def main():
 
     # print(dio.get_outputs())
     
+    '''~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'''
+    '''             Выходы              '''
+    '''Выходы вкл/выкл'''
+    # print(dio.get_outputs_state())
+    # 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())
+
     # dio.set_output_mode(3, 0)
     # print(dio.get_inputs_mode())
 

+ 1 - 1
tools/sys_params.py

@@ -5,7 +5,7 @@ import time
 import random
 from datetime import datetime, timedelta, timezone
 
-models = {0x100: 'MDIO_88', 0x200: 'MAO_8', 0x300: 'MAI_12'}
+models = {0x100: 'MDIO_88', 0x200: 'MAO_4', 0x300: 'MAI_12'}
 test_state = {0: 'No Test', 1: 'Test OK', 2: 'Test FAIL'}
 
 

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