diff --git a/leakage_system/MDK-ARM/RTE/_leakage_system/RTE_Components.h b/leakage_system/MDK-ARM/RTE/_leakage_system/RTE_Components.h index 0246594..153dac0 100644 --- a/leakage_system/MDK-ARM/RTE/_leakage_system/RTE_Components.h +++ b/leakage_system/MDK-ARM/RTE/_leakage_system/RTE_Components.h @@ -11,5 +11,11 @@ #define RTE_COMPONENTS_H +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "stm32f4xx.h" + + #endif /* RTE_COMPONENTS_H */ diff --git a/leakage_system/MDK-ARM/leakage_system.uvoptx b/leakage_system/MDK-ARM/leakage_system.uvoptx index a10bc63..1bab97c 100644 --- a/leakage_system/MDK-ARM/leakage_system.uvoptx +++ b/leakage_system/MDK-ARM/leakage_system.uvoptx @@ -28,7 +28,7 @@ 12000000 - 0 + 1 1 0 1 @@ -77,7 +77,7 @@ 0 1 - 0 + 18 0 1 @@ -103,7 +103,7 @@ 1 0 0 - 0 + 4 @@ -114,28 +114,162 @@ - BIN\UL2CM3.DLL + Segger\JL2CM3.dll + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + d + + + 0 + JL2CM3 + -U-O78 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + 0 UL2CM3 UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - + + + 0 + 0 + 71 + 1 +
134256418
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\code\Git\Leakage-Control(鏈€鏂扮増)\Leakage-Control\leakage_system\usr\app\app.c + + \\leakage_system\../usr/app/app.c\71 +
+
+ + + 0 + 1 + total_records + + + 1 + 1 + record_index,0x0A + + + 2 + 1 + record_index,0x0A + + + 3 + 1 + total_records + + + 4 + 1 + total_records + + + 5 + 1 + leakage,0x0A + + + 6 + 1 + leakage,0x0A + + + 7 + 1 + new_alarm,0x0A + + + 8 + 1 + record_index + + + 9 + 1 + (sizeof(app_leakage_history_alarm_t)),0x0A + + + 10 + 1 + debug1 + + + 11 + 1 + actual_index,0x0A + + + 12 + 1 + record + + + 13 + 1 + temp_flash1,0x0A + + + 14 + 1 + leakage.history_metadata,0x0A + + + 15 + 1 + new_alarm,0x0A + + + 16 + 1 + new_alarm1,0x0A + + + 17 + 1 + W5500,0x0A + + 0 0 - 0 - 0 + 1 + 1 0 0 0 0 - 0 + 1 0 0 0 @@ -502,7 +636,7 @@ Drivers/CMSIS - 0 + 1 0 0 0 @@ -622,7 +756,7 @@ bsp - 0 + 1 0 0 0 @@ -750,7 +884,7 @@ gui - 0 + 1 0 0 0 @@ -770,7 +904,7 @@ protocol - 0 + 1 0 0 0 diff --git a/leakage_system/MDK-ARM/leakage_system.uvprojx b/leakage_system/MDK-ARM/leakage_system.uvprojx index 6c33317..2108710 100644 --- a/leakage_system/MDK-ARM/leakage_system.uvprojx +++ b/leakage_system/MDK-ARM/leakage_system.uvprojx @@ -10,14 +10,14 @@ leakage_system 0x4 ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC + 5060750::V5.06 update 6 (build 750)::ARMCC 0 STM32F407VGTx STMicroelectronics - Keil.STM32F4xx_DFP.3.0.0 - https://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.15.0 + http://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE @@ -185,7 +185,6 @@ 0 2 0 - 0 1 0 8 @@ -352,7 +351,7 @@ 0 0 0 - 4 + 0 diff --git a/leakage_system/usr/app/app.c b/leakage_system/usr/app/app.c index a1f5948..1517aa7 100644 --- a/leakage_system/usr/app/app.c +++ b/leakage_system/usr/app/app.c @@ -73,8 +73,6 @@ void app_init(void) /**/ W5500.Init(); - - /*ĻͨѶ*/ tjc_hmi.init(); diff --git a/leakage_system/usr/app/app_leakage.c b/leakage_system/usr/app/app_leakage.c index 17f1a16..c3898ab 100644 --- a/leakage_system/usr/app/app_leakage.c +++ b/leakage_system/usr/app/app_leakage.c @@ -13,6 +13,10 @@ static void history_save_metadata(void); static void app_leakage_init(void); +/*ʷ*/ +uint8_t sector_buf[2][W25Q32_SECTOR_SIZE]; + + app_leakage_t leakage = { .region_num = 0, @@ -316,22 +320,20 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar memset(&new_alarm, 0, sizeof(app_leakage_history_alarm_t)); /* */ - if(region_idx < leakage.region_num) - { + if (region_idx < leakage.region_num) { memcpy(new_alarm.region_name, leakage.region_data[region_idx].name, APP_LEAKAGE_STRING_NANE_LEN); } /* 豸ID */ - if(device_idx < APP_LEAKAGE_SUB_DEVICE_NUM) - { + if (device_idx < APP_LEAKAGE_SUB_DEVICE_NUM) { new_alarm.device_id = leakage.sub_device_data[device_idx].flash_data.modbus_id; memcpy(new_alarm.device_name, leakage.sub_device_data[device_idx].flash_data.device_name, APP_LEAKAGE_STRING_NANE_LEN); } /* ͨ͡©Һ */ - new_alarm.alarm_type = alarm_type; + new_alarm.alarm_type = alarm_type; new_alarm.channel = channel; new_alarm.leak_distance = leak_distance; @@ -341,35 +343,49 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar /* дַ */ write_addr = history_calc_record_addr(leakage.history_metadata.write_index); - /* ǷҪ */ - uint32_t current_sector = history_calc_sector_addr(leakage.history_metadata.write_index); - uint32_t prev_sector = history_calc_sector_addr( - (leakage.history_metadata.write_index == 0) ? - leakage.history_metadata.max_records - 1 : - leakage.history_metadata.write_index - 1); + /* ü¼ܿԽΧ2 */ + uint32_t start_sector = write_addr & ~(W25Q32_SECTOR_SIZE - 1); + uint32_t end_addr = write_addr + HISTORY_ALARM_RECORD_SIZE - 1; + uint32_t end_sector = end_addr & ~(W25Q32_SECTOR_SIZE - 1); + uint32_t num_sectors = (end_sector - start_sector) / W25Q32_SECTOR_SIZE + 1; - /* лҪ */ - if(current_sector != prev_sector) - { - w25q32_sector_erase(current_sector); + /* ÿ4KB */ + uint32_t sectors[2] = {start_sector, (num_sectors > 1) ? end_sector : 0}; + + /* 1. ȡ漰RAM */ + for (uint32_t i = 0; i < num_sectors; i++) { + w25q32.read(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE); } - /* д¼ */ - w25q32.write(write_addr, (uint8_t*)&new_alarm, HISTORY_ALARM_RECORD_SIZE); + /* 2. Щ */ + for (uint32_t i = 0; i < num_sectors; i++) { + w25q32_sector_erase(sectors[i]); + } - /* Ԫ */ + /* 3. RAMи¼¼ */ + uint32_t offset_in_start = write_addr - start_sector; + uint32_t first_part_len = (num_sectors == 1) ? HISTORY_ALARM_RECORD_SIZE : (W25Q32_SECTOR_SIZE - offset_in_start); + memcpy(sector_buf[0] + offset_in_start, &new_alarm, first_part_len); + if (num_sectors > 1) { + uint32_t second_part_len = HISTORY_ALARM_RECORD_SIZE - first_part_len; + memcpy(sector_buf[1], (uint8_t*)&new_alarm + first_part_len, second_part_len); + } + + /* 4. ޸ĺĻдFlash */ + for (uint32_t i = 0; i < num_sectors; i++) { + w25q32.write(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE); + } + + /* 5. ԪݣζУ */ leakage.history_metadata.write_index++; - if(leakage.history_metadata.write_index >= leakage.history_metadata.max_records) - { + if (leakage.history_metadata.write_index >= leakage.history_metadata.max_records) { leakage.history_metadata.write_index = 0; } - - if(leakage.history_metadata.total_records < leakage.history_metadata.max_records) - { + if (leakage.history_metadata.total_records < leakage.history_metadata.max_records) { leakage.history_metadata.total_records++; } - /* Ԫ */ + /* ԪݵFlash */ history_save_metadata(); } @@ -383,21 +399,24 @@ static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *rec /* ʵʴ洢ѭУ */ uint32_t actual_index; - if(leakage.history_metadata.total_records == leakage.history_metadata.max_records) - { - /* */ - actual_index = (leakage.history_metadata.write_index + record_index) % - leakage.history_metadata.max_records; + if(leakage.history_metadata.total_records == leakage.history_metadata.max_records) { + // write_index ָɼ¼ + actual_index = (leakage.history_metadata.write_index - 1 - record_index + + leakage.history_metadata.max_records) % leakage.history_metadata.max_records; + } else { + // δ˳洢 0 磬 total_records-1 + actual_index = leakage.history_metadata.total_records - 1 - record_index; } - else + if(actual_index == 125) { - /* δֱӶȡ */ - actual_index = record_index; + actual_index =125; } uint32_t read_addr = history_calc_record_addr(actual_index); w25q32.read(read_addr, (uint8_t*)record, HISTORY_ALARM_RECORD_SIZE); + + return 1; } diff --git a/leakage_system/usr/app/app_leakage.h b/leakage_system/usr/app/app_leakage.h index a3fdba1..e7eb351 100644 --- a/leakage_system/usr/app/app_leakage.h +++ b/leakage_system/usr/app/app_leakage.h @@ -70,7 +70,7 @@ typedef struct { }network_config_t; /* ʷ¼ṹ */ -typedef struct +typedef struct __attribute__((packed)) { u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /* */ u8 device_id; /* 豸ID */ diff --git a/leakage_system/usr/gui/gui_tjc_hmi.c b/leakage_system/usr/gui/gui_tjc_hmi.c index 478dea2..bf57528 100644 --- a/leakage_system/usr/gui/gui_tjc_hmi.c +++ b/leakage_system/usr/gui/gui_tjc_hmi.c @@ -68,6 +68,8 @@ static void gui_tjc_hmi_all_page_index_clear(void); static u8 hmi_tx_buffer[HMI_TX_BUFFER_NUM]; /*ַƴ */ static char gui_tjc_hmi_text_buffer[GUI_TJC_HMI_TEXT_BUFFER_NUM]; +/*豸*/ +app_leakage_sub_device_flash_data_t temp_buffer[APP_LEAKAGE_SUB_DEVICE_NUM]; /*ַ ˿ں*/ static char *hmi_proto_string_com[] = { @@ -149,10 +151,7 @@ static void gui_tjc_hmi_save_password_to_w25q(void) /* 豸Ϣapp_leakage浽W25Q32 */ static void gui_tjc_hmi_save_device_info_to_w25q(void) -{ - /* һʱ */ - app_leakage_sub_device_flash_data_t temp_buffer[APP_LEAKAGE_SUB_DEVICE_NUM]; - +{ /* app_leakageṹ帴Ƶʱ */ for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++) { @@ -306,7 +305,7 @@ static void gui_tjc_hmi_main_send(u8 cmd,u8 opa,u8 *p_data) } len += 3; /*汾*/ - len += gui_tjc_hmi_tx_text_display(GUI_MAIN,0,2,(char *)&hmi_tx_buffer[len], + len += gui_tjc_hmi_tx_text_display(GUI_MAIN,0,3,(char *)&hmi_tx_buffer[len], "%s",SwVersion); if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ @@ -521,6 +520,13 @@ static void gui_tjc_hmi_curr_alarm_send(u8 cmd,u8 opa,u8 *p_data) { page_num++; } + + if (page_num == 0) { + page_num = 1; + } + if (p_tjc_hmi->page.real_alarm_index >= page_num) { + p_tjc_hmi->page.real_alarm_index = page_num - 1; + } len += gui_tjc_hmi_tx_text_display(GUI_CURR_ALARM,0, 0, (char *)&hmi_tx_buffer[len], "%d/%d", @@ -1221,7 +1227,7 @@ static void gui_tjc_hmi_history_alarm_send(u8 cmd,u8 opa,u8 *p_data) #define HISTORY_ALARM_PER_PAGE (15) /* ÿҳ15ʷ */ u16 len = 0, i, j; u8 page_num, remain_records, display_count; - u32 total_records, start_index, record_index; + u32 total_records, start_index, record_index = 0; app_leakage_history_alarm_t history_record; char time_str[20]; char alarm_type_str[20]; diff --git a/leakage_system/usr/protocol/proto_modbus_tcp_slave_ex.c b/leakage_system/usr/protocol/proto_modbus_tcp_slave_ex.c index 0f41159..19188d6 100644 --- a/leakage_system/usr/protocol/proto_modbus_tcp_slave_ex.c +++ b/leakage_system/usr/protocol/proto_modbus_tcp_slave_ex.c @@ -78,11 +78,11 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot /*modbusЭ*/ modbus_analysis_data.id = pData[6]; modbus_analysis_data.func = pData[7]; - modbus_analysis_data.start_addr = pData[8] << 8 | pData[9]; - modbus_analysis_data.reg_number = pData[10] << 8 | pData[11]; + modbus_analysis_data.start_addr = (pData[8] << 8) | pData[9]; + modbus_analysis_data.reg_number = (pData[10] << 8) | pData[11]; send_buff_index_offset = 6; - memcpy(send_struct.send_buffer,pData,send_buff_index_offset); + memcpy(send_struct.send_buffer,pData,4); error_code = ModbusErrorCode_Success; @@ -93,9 +93,7 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot ErrorCode = ModbusErrorCode_IllegalAddr; goto Error; } - */ - - + */ switch (modbus_analysis_data.func) { case 0x03: @@ -113,7 +111,7 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot TempAddr++; } send_struct.len =send_buff_index_offset + 3 + send_struct.send_buffer[send_buff_index_offset + 2]; - }goto Success; + }break; /*Э*/ case 0x41: { @@ -132,16 +130,18 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot TempAddr++; } send_struct.len = send_buff_index_offset + 6 + 2 * modbus_analysis_data.reg_number; - }goto Success; + }break; case 0x06: { + modbus_analysis_data.write_data_addr[0] = pData[10]; + modbus_analysis_data.write_data_addr[1] = pData[11]; TempAddr = modbus_analysis_data.start_addr; TempData = (modbus_analysis_data.write_data_addr[0] << 8) | modbus_analysis_data.write_data_addr[1]; error_code = proto_modbus_data_write(TempAddr, TempData); if (error_code) { - goto Error; + break; } send_struct.len = send_buff_index_offset + 6; @@ -155,6 +155,11 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot case 0x10: { + u8 byte_count = pData[12]; // ֽ + // ݸƵ write_data_addr + for (u8 i = 0; i < byte_count; i++) { + modbus_analysis_data.write_data_addr[i] = pData[13 + i]; + } TempAddr = modbus_analysis_data.start_addr; for (inx = 0; inx < modbus_analysis_data.reg_number; inx++) { @@ -164,39 +169,43 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot TempAddr++; if (error_code) { - goto Error; + break; } } send_struct.len = send_buff_index_offset + 6; - send_struct.send_buffer[0] = modbus_analysis_data.id; - send_struct.send_buffer[1] = modbus_analysis_data.func; - send_struct.send_buffer[2] = modbus_analysis_data.start_addr >> 8; - send_struct.send_buffer[3] = modbus_analysis_data.start_addr & 0xff; - send_struct.send_buffer[4] = modbus_analysis_data.reg_number >> 8; - send_struct.send_buffer[5] = modbus_analysis_data.reg_number & 0xff; + send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 0] = modbus_analysis_data.id; + send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 1] = modbus_analysis_data.func; + send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 2] = modbus_analysis_data.start_addr >> 8; + send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 3] = modbus_analysis_data.start_addr & 0xff; + send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 4] = modbus_analysis_data.reg_number >> 8; + send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 5] = modbus_analysis_data.reg_number & 0xff; } break; default: { error_code = ModbusErrorCode_IllegalFunction; } - goto Error; + break; } -Success: - send_struct.send_buffer[4] = (send_struct.len - send_buff_index_offset) >> 8; - send_struct.send_buffer[5] = (send_struct.len - send_buff_index_offset) & 0x00ff; - proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len); - return; - -Error: - send_struct.len = send_buff_index_offset + 3; - send_struct.send_buffer[0] = modbus_analysis_data.id; - send_struct.send_buffer[1] = modbus_analysis_data.func | 0x80; - send_struct.send_buffer[2] = error_code; - send_struct.send_buffer[4] = (send_struct.len - send_buff_index_offset) >> 8; - send_struct.send_buffer[5] = (send_struct.len - send_buff_index_offset) & 0x00ff; - proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len); + /*ݴɹ*/ + if(ModbusErrorCode_Success == error_code) + { + send_struct.send_buffer[4] = (send_struct.len - send_buff_index_offset) >> 8; + send_struct.send_buffer[5] = (send_struct.len - send_buff_index_offset) & 0x00ff; + proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len); + return; + } + else + { + send_struct.len = send_buff_index_offset + 3; + send_struct.send_buffer[4] = (send_struct.len - send_buff_index_offset) >> 8; + send_struct.send_buffer[5] = (send_struct.len - send_buff_index_offset) & 0x00ff; + send_struct.send_buffer[send_buff_index_offset + 0] = modbus_analysis_data.id; + send_struct.send_buffer[send_buff_index_offset + 1] = modbus_analysis_data.func | 0x80; + send_struct.send_buffer[send_buff_index_offset + 2] = error_code; + proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len); + } } /****************************************** diff --git a/leakage_system漏液主控软件履历表.xlsx b/leakage_system漏液主控软件履历表.xlsx index 7e4404e..b4b02a1 100644 Binary files a/leakage_system漏液主控软件履历表.xlsx and b/leakage_system漏液主控软件履历表.xlsx differ diff --git a/漏液主控界面_4CH.HMI b/漏液主控界面_4CH.HMI index 5592e98..8e5ba23 100644 Binary files a/漏液主控界面_4CH.HMI and b/漏液主控界面_4CH.HMI differ