فهرست منبع

Поправил баг с номером канала в архивах.

unknown 7 ماه پیش
والد
کامیت
38dbdd8098

+ 4 - 7
fw/modules/log/log.c

@@ -17,9 +17,9 @@
 #include <inttypes.h>
 
 #undef DBG
-#define DBG if(1)
+#define DBG if(0)
 
-static bool archive_state = false;
+static bool archive_state = true;
 static bool log_state = true;
 
 static bool log_init_f = false;
@@ -53,9 +53,6 @@ static struct ringfs_flash_partition ringfs_flash_log =
 void log_init(bool format) 
 {
 	DBG printf("[LOG] Init...\r\n");
-
-	if (!spi_flash_desc.present)
-		return;
     
     // ---------------------------------------------------------------------- //
     // Журнал
@@ -139,7 +136,7 @@ void TMR8_TRG_HALL_TMR14_IRQHandler(void)
         if (archive_state) 
         {
             log_check_archive_cnt();
-            printf("TMR_14 irq\r\n");
+            //printf("TMR_14 irq\r\n");
         }
     }
 }
@@ -441,7 +438,7 @@ void log_check_archive_cnt(void)
 
     for (uint8_t i = 0; i < channel_number; i++)
     {
-        if (archive_cnt[i]++ == 10*settings.period_archive[i])
+        if (archive_cnt[i]++ >= 10*settings.period_archive[i])
         {
             archive_cnt[i] = 0;
 

+ 1 - 1
fw/modules/log/log_ai.c

@@ -154,7 +154,7 @@ void log_archive_task_device(void)
             entry.input_value = 1;
         
             DBG printf("Append archive entry...");
-            ret = log_append((void*)&entry, ARCHIVE_ENTRY, i - 1);
+            ret = log_append((void*)&entry, ARCHIVE_ENTRY, i);
                 
             if (ret != 0) {
                 DBG printf("FAIL\r\n");

+ 145 - 146
fw/modules/log/log_dio.c

@@ -1,146 +1,145 @@
-#include "at32f403a_407.h"
-#include "log_dio.h"
-#include "settings_api.h"
-#include "ringfs.h"
-#include "ringfs_api.h"
-#include "digital_input.h"
-
-
-#if defined (MDIO_88)
-
-
-#undef DBG
-#define DBG if(1)
-
-
-EventGroupHandle_t archive_event;
-
-uint32_t archive_cnt[ARCH_DIO_CH_NUMBER] = {0};
-
-struct ringfs fs_ch_arch[ARCH_DIO_CH_NUMBER];
-
-
-static struct ringfs_flash_partition fingfs_flash_ch_arch[ARCH_DIO_CH_NUMBER] = 
-{
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*1,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*2,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*3,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*4,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*5,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*6,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-    {
-        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*7,
-        .sector_erase = op_sector_erase,
-        .program = op_program,
-        .read = op_read,
-    },
-};
-
-
-// Архив. 8 буферов на каждый канал.
-void log_dio_archive_init(void)
-{
-    for (uint8_t i = 0; i < ARCH_DIO_CH_NUMBER; i ++) 
-    {
-        fingfs_flash_ch_arch[i].sector_size = spi_flash_desc.sector_size;
-        
-        fingfs_flash_ch_arch[i].sector_count = ARCHIVE_FLASH_SECTOR_COUNT;
-        
-        ringfs_init(&fs_ch_arch[i], &fingfs_flash_ch_arch[i], 
-                    ARCHIV_ENTRY_VERSION + i, sizeof(archive_entry_t));
-        
-        if (ringfs_scan(&fs_ch_arch[i]) != 0) {
-            DBG printf("FAT for channel %u is false\r\n", i + 1);
-            ringfs_format(&fs_ch_arch[i]);
-        }
-        DBG printf("FAT for channel %u is true\r\n", i + 1);
-    }
-}
-    
-    
-//
-uint8_t log_get_arch_channel_number(void)
-{
-    return (uint8_t)ARCH_DIO_CH_NUMBER;
-}
-
-
-//
-uint8_t log_is_channel_on(uint8_t channel)
-{
-    return (bool)settings.di[channel].state;
-}
-
-
-//
-void log_archive_task_device(void)
-{
-    int ret = 0;
-    EventBits_t bits;
-    archive_entry_t entry = {0};
-    
-    bits = xEventGroupWaitBits(archive_event, 
-                               ARCH_CH_1 | ARCH_CH_2 | ARCH_CH_3 | ARCH_CH_4 | 
-                               ARCH_CH_5 | ARCH_CH_6 | ARCH_CH_7 | ARCH_CH_8 |
-                               ARCH_CH_9 | ARCH_CH_10 | ARCH_CH_11 | ARCH_CH_12,
-                               pdTRUE, pdFALSE, portMAX_DELAY);
-     
-    for (uint32_t i = 0; i < ARCH_AI_CH_NUMBER; i++)
-    {
-        if (bits & (1 << i))
-        {
-            DBG printf("Archive event: %u\r\n", (1 << i));
-                
-            entry.timestamp = 0;
-            entry.input_value = di_get(i - 1);
-        
-            DBG printf("Append archive entry...");
-            ret = log_append((void*)&entry, ARCHIVE_ENTRY, i - 1);
-                
-            if (ret != 0) {
-                DBG printf("FAIL\r\n");
-            }
-            else {  
-                DBG printf("OK\r\n");
-            }
-        }
-    }
-}
-
-#endif
+#include "at32f403a_407.h"
+#include "log_dio.h"
+#include "settings_api.h"
+#include "ringfs.h"
+#include "ringfs_api.h"
+#include "digital_input.h"
+
+
+#if defined (MDIO_88)
+
+
+#undef DBG
+#define DBG if(0)
+
+
+EventGroupHandle_t archive_event;
+
+uint32_t archive_cnt[ARCH_DIO_CH_NUMBER] = {0};
+
+struct ringfs fs_ch_arch[ARCH_DIO_CH_NUMBER];
+
+
+static struct ringfs_flash_partition fingfs_flash_ch_arch[ARCH_DIO_CH_NUMBER] = 
+{
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*1,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*2,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*3,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*4,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*5,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*6,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+    {
+        .sector_offset = ARCHIVE_FLASH_SECTOR_OFFSET + ARCHIVE_CHANNEL_OFFSET*7,
+        .sector_erase = op_sector_erase,
+        .program = op_program,
+        .read = op_read,
+    },
+};
+
+
+// Архив. 8 буферов на каждый канал.
+void log_dio_archive_init(void)
+{
+    for (uint8_t i = 0; i < ARCH_DIO_CH_NUMBER; i ++) 
+    {
+        fingfs_flash_ch_arch[i].sector_size = spi_flash_desc.sector_size;
+        
+        fingfs_flash_ch_arch[i].sector_count = ARCHIVE_FLASH_SECTOR_COUNT;
+        
+        ringfs_init(&fs_ch_arch[i], &fingfs_flash_ch_arch[i], 
+                    ARCHIV_ENTRY_VERSION + i, sizeof(archive_entry_t));
+        
+        if (ringfs_scan(&fs_ch_arch[i]) != 0) {
+            DBG printf("FAT for channel %u is false\r\n", i + 1);
+            ringfs_format(&fs_ch_arch[i]);
+        }
+        DBG printf("FAT for channel %u is true\r\n", i + 1);
+    }
+}
+    
+    
+//
+uint8_t log_get_arch_channel_number(void)
+{
+    return (uint8_t)ARCH_DIO_CH_NUMBER;
+}
+
+
+//
+uint8_t log_is_channel_on(uint8_t channel)
+{
+    return (bool)settings.di[channel].state;
+}
+
+
+//
+void log_archive_task_device(void)
+{
+    int ret = 0;
+    EventBits_t bits;
+    archive_entry_t entry = {0};
+    
+    bits = xEventGroupWaitBits(archive_event, 
+                               ARCH_CH_1 | ARCH_CH_2 | ARCH_CH_3 | ARCH_CH_4 | 
+                               ARCH_CH_5 | ARCH_CH_6 | ARCH_CH_7 | ARCH_CH_8,
+                               pdTRUE, pdFALSE, portMAX_DELAY);
+     
+    for (uint32_t i = 0; i < ARCH_DIO_CH_NUMBER; i++)
+    {
+        if (bits & (1 << i))
+        {
+            DBG printf("Archive event: %u\r\n", (1 << i));
+                
+            entry.timestamp = 0;
+            entry.input_value = di_get(i - 1);
+        
+            DBG printf("Append archive entry...");
+            ret = log_append((void*)&entry, ARCHIVE_ENTRY, i);
+                
+            if (ret != 0) {
+                DBG printf("FAIL\r\n");
+            }
+            else {  
+                DBG printf("OK\r\n");
+            }
+        }
+    }
+}
+
+#endif

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

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

+ 2 - 4
fw/user/main.cpp

@@ -82,8 +82,6 @@ int main(void)
 
 void init_task(void *argument)
 {
-    uint8_t ret;
-    
 // -------------------------------------------------------------------------- //    
 // Software watchdog
   
@@ -173,7 +171,7 @@ void init_task(void *argument)
     
 // -------------------------------------------------------------------------- //
 // RTC, ADC для измерения напряжения батареи.
-    ret = TM_RTC_Init();
+    TM_RTC_Init();
 
     if (bpr_data_read(BACKUP_RTC_UPDATE) != 0x1234) 
         mon_set_err(MON_RTC, 1);
@@ -208,7 +206,7 @@ void init_task(void *argument)
     
 // -------------------------------------------------------------------------- //    
 // SPI flash, журнал событий, архив
-#if 0
+#if 1
     common_spi_init();
     spi_flash_init();
     

BIN
output/fw.bin


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 476 - 443
project/ewarm/iap/iap.dep


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 795 - 787
project/ewarm/module_universal_io.dep


+ 12 - 1
shared/board/common_config.h

@@ -14,7 +14,18 @@
 /**
   * @brief  Версия прошивки
   */
-#define FW_VERSION                      "1.02"
+#if defined (MDIO_88)
+#define FW_VERSION                      "1.01"
+#endif
+
+#if defined (MAI_12)
+#define FW_VERSION                      "1.01"
+#endif
+
+#if defined (MAI_12)
+#define FW_VERSION                      "1.01"
+#endif
+
 
 /**
   * @brief  Калибровочные коэффициенты

+ 1 - 1
shared/peripherals/src/spi_common.c

@@ -49,7 +49,7 @@ void common_spi_init(void)
     spi_default_para_init(&spi_init_struct);
     spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
     spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
-    spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_32; //SPI_MCLK_DIV_2;
+    spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_2, //SPI_MCLK_DIV_32; //SPI_MCLK_DIV_2;
     spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
     spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
     spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;

+ 15 - 2
tools/digital_io.py

@@ -292,16 +292,29 @@ class IO_DigitalTester:
 def main():
     colorama.init(autoreset=True)
     
-    serial_port = Serial('COM11', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM5', 115200, timeout=0.05, parity='N', xonxoff=False)
     
     modbus_tester = Modbus(serial_port, 1)
     modbus_tester.MB_DEBUG = False
     # dev_tester = IO_Digital(modbus_tester)
     dio = IO_Digital(modbus_tester)
 
+    dio.sys.set_save_mode(0)
+    # dio.set_outputs_state(0b1111_1111)
+    dio.set_inputs_state(0b1111_1111)
+    # dio.set_inputs_state(0b0000_0000)
 
+
+    """
+    for addr in range(1, 7):
+        modbus_tester.address = addr
+        dio.sys.set_save_mode(0)
+        dio.set_outputs_state(0b1111_1111)
+        dio.set_outputs(0b1111_1111)
+    """
+        
     '''Тесты отдельного модуля DIO'''
-    dio.sys.get_system_vars()
+    # dio.sys.get_system_vars()
     # print(dio.sys.get_save_mode())
     # print(dio.sys.get_save_delay())
     

+ 27 - 11
tools/log_reader.py

@@ -1,5 +1,5 @@
 from modbus import Modbus
-from mb_registers import reg_table, LOG_REGS
+from mb_registers import reg_table, LOG_REGS, Log
 from colorama import Fore
 from random import randint
 from time import sleep
@@ -7,6 +7,8 @@ import time
 import colorama
 import struct
 from datetime import datetime, timedelta, timezone
+from serial import Serial
+
 
 ARCHIVE_ENTRY = 0x06
 LOG_ENTRY = 0x07
@@ -69,13 +71,13 @@ class LogReader:
         print("LogReader")
 
     def get_log_info(self):
-        data = self.modbus.read_holding_registers(reg_table['log_info'], 19)
+        # data = self.modbus.read_holding_registers(Log.INFO.value, 19)
+        data = self.modbus.read_holding_registers(Log.LOG_ENTRYS_MAX.value, 11)
         self.log_capacity = data[0]
         self.log_entries_number = data[1]
         self.archive_capacity = data[2]
         self.archive_entries_number = data[3:11]
-
-        self.archive_period = data[12:21]
+        self.archive_period = self.modbus.read_holding_registers(Log.ARCH_PER_CH1.value, 8)
 
         print(Fore.CYAN + "Log and archive params:\n")
         print('Log capacity           :', Fore.CYAN + str(self.log_capacity))
@@ -84,14 +86,17 @@ class LogReader:
         print('Archive entries number :', Fore.CYAN + str(self.archive_entries_number))
         print('Archive period         :', Fore.CYAN + str(self.archive_period), end='\n')
 
-    def set_archive_period(self, value, channel):
-        self.modbus.write_holding_register(LOG_REGS['arch_per'] + channel, value)
+    def set_archive_channel_period(self, channel, value):
+        """Установить период архивирования в канале 1..12 в секундах"""
+        self.modbus.write_holding_register(Log.ARCH_PER_CH1.value + channel - 1, value)
 
     def log_clear(self):
-        self.modbus.write_holding_register(reg_table['param_manager'], self.COM_LOG_CLEAR)
+        """Очистить журнал событий"""
+        self.modbus.write_holding_register(Log.CMD.value, self.COM_LOG_CLEAR)
 
-    def archive_clear(self):
-        self.modbus.write_holding_register(reg_table['param_manager'], self.COM_ARCHIVE_CLEAR)
+    def archive_channel_clear(self, channel):
+        """Очистить архив по каналам 1..12"""
+        self.modbus.write_holding_register(Log.CMD.value, self.COM_ARCHIVE_CLEAR + channel - 1)
 
 
 
@@ -166,9 +171,20 @@ class AnalogInputLogReader(LogReader):
 
 def main():
 
-    module = DigitalLogReader('COM24', 115200, 15)
+    serial = Serial('COM5', 115200, timeout=0.05, parity='N', xonxoff=False)
+    modbus = Modbus(serial, 1)
+    modbus.MB_DEBUG = False
+    dio = DigitalLogReader(modbus)
+    
+    # dio.get_log_info()
+    
+    # for i in range(1, 9):
+    #     dio.set_archive_channel_period(i, 10)
+    # dio.get_log_info()
+
+    while True:
+        dio.get_all_log()
 
-    # module.get_log_info()
     # module.get_archive()
     # module.set_archive_period(10)
 

+ 40 - 1
tools/mb_registers.py

@@ -92,4 +92,43 @@ class SysReg(Enum):
     SAVE_DELAY  = 0x081C # Время до перехода в безопасный режим
 
     '''Команды'''
-    WDT_STOP    = 0x0014 # Отключить watchdog (программно) 
+    WDT_STOP    = 0x0014 # Отключить watchdog (программно) 
+
+
+class Log(Enum):
+
+    """Управление"""
+    CMD             = 0x0800 # Регистр управления
+
+    LOG_ENTRYS_MAX  = 0x0900 # Количество записей в журнале событий (возможное)
+    LOG_ENTRYS_CNT  = 0x0901 # Количество записей в журнале (текущее)
+    ARCH_ENTRYS_MAX = 0x0902 # Количество записей в (возможное для одного канала)
+
+    ARCH_ENTRYS_CH1 = 0x0903 # Количество записей в архиве для канала 1
+    ARCH_ENTRYS_CH2 = 0x0904 # Количество записей в архиве для канала 2
+    ARCH_ENTRYS_CH3 = 0x0905 # Количество записей в архиве для канала 3
+    ARCH_ENTRYS_CH4 = 0x0906 # Количество записей в архиве для канала 4
+    ARCH_ENTRYS_CH5 = 0x0907 # Количество записей в архиве для канала 5
+    ARCH_ENTRYS_CH6 = 0x0908 # Количество записей в архиве для канала 6
+    ARCH_ENTRYS_CH7 = 0x0909 # Количество записей в архиве для канала 7
+    ARCH_ENTRYS_CH8 = 0x090A # Количество записей в архиве для канала 8
+
+    ARCH_ENTRYS_CH9 = 0x090B # Количество записей в архиве для канала 9
+    ARCH_ENTRYS_CH10 = 0x090C # Количество записей в архиве для канала 10
+    ARCH_ENTRYS_CH11 = 0x090D # Количество записей в архиве для канала 11
+    ARCH_ENTRYS_CH12 = 0x090A # Количество записей в архиве для канала 12
+
+    """Период ведения архива"""
+    ARCH_PER_CH1    = 0x090F # Период ведения архива для канала 1
+    ARCH_PER_CH2    = 0x0910 # Период ведения архива для канала 2
+    ARCH_PER_CH3    = 0x0911 # Период ведения архива для канала 3
+    ARCH_PER_CH4    = 0x0912 # Период ведения архива для канала 4
+    ARCH_PER_CH5    = 0x0913 # Период ведения архива для канала 5
+    ARCH_PER_CH6    = 0x0914 # Период ведения архива для канала 6
+    ARCH_PER_CH7    = 0x0915 # Период ведения архива для канала 7
+    ARCH_PER_CH8    = 0x0916 # Период ведения архива для канала 8
+
+    ARCH_PER_CH9    = 0x0917 # Период ведения архива для канала 9
+    ARCH_PER_CH10   = 0x0918 # Период ведения архива для канала 10
+    ARCH_PER_CH11   = 0x0919 # Период ведения архива для канала 11
+    ARCH_PER_CH12   = 0x091A # Период ведения архива для канала 12

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است