From 38eb087efcc9aaeb437767e9051ae6b80fb55b26 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Tue, 25 Feb 2025 10:01:34 +0300 Subject: [PATCH] =?UTF-8?q?-=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B1=D0=B0=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - дефайны и настройки нормально переименованы (A_POS, A_NEG, B_POS, B_NEG, TIME_FOR_FORWARD, TIME_FOR_REVERSE) - Добавлена микросекундная задержка для прямого включения (прямое включение на заданное колво микросекунд) - Кнопка переделана на подтягивание к нулю --- diode_tester/Core/Interfaces/modbus_data.h | 15 +++--- diode_tester/Core/Src/gpio.c | 2 +- diode_tester/Core/Tester_main/tester_config.h | 47 +++++++++--------- diode_tester/Core/Tester_main/tester_func.c | 8 +-- diode_tester/Core/Tester_main/tester_func.h | 4 +- diode_tester/Core/Tester_main/tester_main.c | 44 ++++++++-------- diode_tester/MDK-ARM/diode_tester.uvoptx | 14 +++++- docs/mb_adr.xlsx | Bin 15922 -> 17041 bytes 8 files changed, 73 insertions(+), 61 deletions(-) diff --git a/diode_tester/Core/Interfaces/modbus_data.h b/diode_tester/Core/Interfaces/modbus_data.h index a25468a..9fcb038 100644 --- a/diode_tester/Core/Interfaces/modbus_data.h +++ b/diode_tester/Core/Interfaces/modbus_data.h @@ -48,10 +48,10 @@ typedef struct //MB_DataInRegsTypeDef typedef struct //MB_DataInRegsTypeDef { uint16_t TimeForForward; + uint16_t TimeForReverse; uint16_t TimeBeforeTest; uint16_t TimeDeadtime; uint16_t TimeBeforePeak; - uint16_t TimeBeforeDisconnect; uint16_t Adc_PulseWidth; uint16_t Adc_PulseSign; @@ -104,18 +104,19 @@ typedef struct //MB_DataCoilsTypeDef unsigned ForwardTest:1; unsigned ReverseTest:1; unsigned StartTest:1; - unsigned PhaseForwardHiTest:1; - unsigned PhaseForwardLoTest:1; - unsigned PhaseReverseHiTest:1; - unsigned PhaseReverseLoTest:1; + unsigned KeyForwardHiTest:1; + unsigned KeyForwardLoTest:1; + unsigned KeyReverseHiTest:1; + unsigned KeyReverseLoTest:1; unsigned reserved:9; /* reg 2 - settings */ + unsigned msTimeForForward_enable:1; + unsigned msTimeForReverse_enable:1; unsigned msTimeBeforeTest_enable:1; unsigned msTimeDeadtime_enable:1; unsigned msTimeBeforePeak_enable:1; - unsigned msTimeBeforeDisconnect_enable:1; unsigned reserved2:11; }MB_DataCoilsTypeDef; @@ -124,7 +125,7 @@ typedef struct //MB_DataCoilsTypeDef #define C_CONTROL_QNT 7 #define C_SETTINGS_ADDR 16 -#define C_SETTINGS_QNT 3 +#define C_SETTINGS_QNT 5 /** MODBUS_DATA_COILS_DEFINES * @} diff --git a/diode_tester/Core/Src/gpio.c b/diode_tester/Core/Src/gpio.c index fc4bdf5..7033e4f 100644 --- a/diode_tester/Core/Src/gpio.c +++ b/diode_tester/Core/Src/gpio.c @@ -67,7 +67,7 @@ void MX_GPIO_Init(void) /*Configure GPIO pin : PC14 */ GPIO_InitStruct.Pin = GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pins : PAPin PAPin PAPin PAPin */ diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index ca99197..66e6753 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -21,24 +21,31 @@ /** * @brief Задержка (миллисекундная) для положительного напряжения ПО УМОЛЧАНИЮ - * @details Пока только миллисекунды, т.к. меньше я пока не реализовал, да и как понимаю не требуется + * @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY */ -#define DEF_MS_TIME_FOR_POSITIVE 2000 +#define DEF_TIME_FOR_FORWARD 100 +#define DEF_TIME_FOR_FORWARD_MS_DELAY 1 ///< включение миллисекундной задержки для @ref DEF_TIME_FOR_FORWARD по умолчанию +/** + * @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ + * @details Задержка миллисекундная или микросекундная @ref TIME_FOR_REVERSE_MS_DELAY + */ +#define DEF_TIME_FOR_REVERSE 200 +#define DEF_TIME_FOR_REVERSE_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_FOR_REVERSE /** * @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ * @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_TEST_MS_DELAY */ -#define DEF_TIME_BEFORE_TEST 500 -#define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию +#define DEF_TIME_BEFORE_TEST 500 +#define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию /** * @brief Задержка для дедтайма ПО УМОЛЧАНИЮ * @details Задержка миллисекундная или микросекундная @ref DEF_DEADTIME_MS_DELAY */ -#define DEF_DEADTIME 500 -#define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию +#define DEF_DEADTIME 0 +#define DEF_DEADTIME_MS_DELAY 0 ///< включение миллисекундной задержки для @ref DEF_DEADTIME по умолчанию /** * @brief Задержка между включением АЦП и предполагаемым скачком напряжения ПО УМОЛЧАНИЮ @@ -48,15 +55,8 @@ * @note Но если миллисекундная, то скорее всего скачок не попадет в буфер АЦП. * Поэтому желательно только микросекундная (@ref TIME_BEFORE_PEAK_MS_DELAY = 0) */ -#define DEF_TIME_BEFORE_PEAK 5 -#define DEF_TIME_BEFORE_PEAK_MS_DELAY 0 ///< включение миллисекундной задержки для @ref TIME_BEFORE_PEAK - -/** - * @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ - * @details Задержка миллисекундная или микросекундная @ref TIME_BEFORE_DISCONNECT_MS_DELAY - */ -#define DEF_TIME_BEFORE_DISCONNECT 2000 -#define DEF_TIME_BEFORE_DISCONNECT_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_DISCONNECT +#define DEF_TIME_BEFORE_PEAK 5 +#define DEF_TIME_BEFORE_PEAK_MS_DELAY 0 ///< включение миллисекундной задержки для @ref TIME_BEFORE_PEAK /** TESTER_SW_TIMINGS_CONFIG * @} @@ -86,8 +86,8 @@ /* Дефайны для кнопки */ /* Состояния нажатой и отжатой кнопки */ -#define SW_ON 1 ///< Состояние нажатой кнопки -#define SW_OFF 0 ///< Состояние отжатой кнопки +#define SW_ON 0 ///< Состояние нажатой кнопки +#define SW_OFF 1 ///< Состояние отжатой кнопки /* Пин кнопки при перенастройке надо также перенастроить через cube) */ #define SWITCH_START_Port GPIOC ///< Порт кнокпи старта (при перенастройке надо также перенастроить через cube) @@ -107,7 +107,7 @@ @{ */ //#define USE_HAL_GPIO_FUNCTIONS ///< По этому дефайну для переключения пинов будут использоваться HAL_GPIO функции -//#define RECONNECT_WITHOUT_DEADTIME ///< По этому дефайну дедтайм отключается. Если отключить и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (160 нс) +#define RECONNECT_WITHOUT_DEADTIME ///< По этому дефайну дедтайм отключается. Если отключить и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (160 нс) /* Состояния ключей для подключения и откючения питания */ #define PHASE_CONNECT 1 ///< Ключ замкнут подключено в данном состоянии пина @@ -115,16 +115,15 @@ /* Ключи для прямого включения диода */ /* (при перенастройке надо также перенастроить через cube) */ -#define SWITCH_PHASE_FORWARD_Port GPIOB ///< Порт пина первого ключа для прямого включения диода -#define SWITCH_PHASE_FORWARD_HI_Pin GPIO_PIN_0 ///< Пин первого ключа для прямого включения диода -#define SWITCH_PHASE_FORWARD_LO_Pin GPIO_PIN_1 ///< Пин второго ключа для прямого включения диода +#define SWITCH_PHASES_Port GPIOB ///< Порт пина первого ключа для прямого включения диода +#define SWITCH_PHASE_A_POS_Pin GPIO_PIN_0 ///< Пин первого ключа для прямого включения диода +#define SWITCH_PHASE_B_NEG_Pin GPIO_PIN_1 ///< Пин второго ключа для прямого включения диода /* Ключи для обратного включения диода */ /* (при перенастройке надо также перенастроить через cube) */ -#define SWITCH_PHASE_REVERSE_Port GPIOB ///< Порт пина первого ключа для обратного включения диода -#define SWITCH_PHASE_REVERSE_HI_Pin GPIO_PIN_10 ///< Пин первого ключа для обратного включения диода -#define SWITCH_PHASE_REVERSE_LO_Pin GPIO_PIN_11 ///< Пин первого ключа для обратного включения диода +#define SWITCH_PHASE_A_NEG_Pin GPIO_PIN_10 ///< Пин первого ключа для обратного включения диода +#define SWITCH_PHASE_B_POS_Pin GPIO_PIN_11 ///< Пин первого ключа для обратного включения диода /** TESTER_PHASE_SW_CONFIG * @} diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index 5d4f90f..b8529fd 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -43,7 +43,7 @@ void TESTER_TestDiode_Forward(TESTER_TestHandleTypeDef *htest) while(1) { /* Считывание АЦП пока таймаут истечет */ - res = ADC_ReadContinuous(htest->adc, htest->continuous_buff_size, tickstart, htest->SwTimings.msticks_for_forward); + res = ADC_ReadContinuous(htest->adc, htest->continuous_buff_size, tickstart, htest->SwTimings.ticks_for_forward.ticks); if(res != HAL_OK) break; @@ -85,7 +85,7 @@ void TESTER_TestDiode_Reverse(TESTER_TestHandleTypeDef *htest) TESTER_Connect_Phase(&htest->SwPhaseReverse); /* Обратное включение на определенное время */ - TESTER_Delay(&htest->SwTimings.ticks_before_disconnect, &hmcstim); + TESTER_Delay(&htest->SwTimings.ticks_for_reverse, &hmcstim); /* Отключение питания от диода */ TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward); @@ -118,7 +118,7 @@ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) TESTER_Connect_Phase(&htest->SwPhaseForward); /* Прямое включение на определенное время */ - msDelay(htest->SwTimings.msticks_for_forward); + TESTER_Delay(&htest->SwTimings.ticks_for_forward, &hmcstim); htest->DiodeForwardVolt = htest->adc->chAdc.U_Current; TESTER_LED_TestingDiodeReverse(&htest->leds->LED1); @@ -126,7 +126,7 @@ void TESTER_TestDiode_SwitchConnection(TESTER_TestHandleTypeDef *htest) TESTER_Reconnect_TwoPhases(&htest->SwPhaseForward, &htest->SwPhaseReverse, &htest->SwTimings.ticks_deadtime); /* Обратное включение на определенное время */ - TESTER_Delay(&htest->SwTimings.ticks_before_disconnect, &hmcstim); + TESTER_Delay(&htest->SwTimings.ticks_for_reverse, &hmcstim); /* Отключение питания от диода */ TESTER_Disconnect_AllPhases(&htest->SwPhaseReverse, &htest->SwPhaseForward); diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h index 5ce0d83..044d12b 100644 --- a/diode_tester/Core/Tester_main/tester_func.h +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -71,11 +71,11 @@ typedef struct */ typedef struct { - uint32_t msticks_for_forward; ///< миллисекундная задержка для положительного напряжения @ref TESTER_TestDiode_Forward + TESTER_TicksDelayTypeDef ticks_for_forward; ///< задержка для прямого включения @ref TESTER_TestDiode_Forward + TESTER_TicksDelayTypeDef ticks_for_reverse; ///< задержка для прямого включения @ref TESTER_TestDiode_Reverse TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или мкс) TESTER_TicksDelayTypeDef ticks_deadtime; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или мкс) TESTER_TicksDelayTypeDef ticks_before_expected_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или мкс) - TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением фаз (мс или мкс) }TESTER_SwitchTimingsTypeDef; /** diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index b88c0c3..34a1269 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -54,13 +54,13 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester) /* ПОДТЯГИВАНИЕ СОСТОЯНИЯ КЛЮЧЕЙ С МОДБАС */ TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseForward.SwHI_Pin, - tester->mbdata->Coils.PhaseForwardHiTest); + tester->mbdata->Coils.KeyForwardHiTest); TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseForward.SwLO_Pin, - tester->mbdata->Coils.PhaseForwardLoTest); + tester->mbdata->Coils.KeyForwardLoTest); TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseReverse.SwHI_Pin, - tester->mbdata->Coils.PhaseReverseHiTest); + tester->mbdata->Coils.KeyReverseHiTest); TESTER_TestOneSwitch(tester->htest->SwPhaseForward.SW_Port, tester->htest->SwPhaseReverse.SwLO_Pin, - tester->mbdata->Coils.PhaseReverseLoTest); + tester->mbdata->Coils.KeyReverseLoTest); @@ -162,16 +162,17 @@ void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester) */ void TESTER_UpdateSettings(TESTER_TestHandleTypeDef *htest, MB_DataStructureTypeDef *mbdata) { - htest->SwTimings.ticks_before_disconnect.ticks = mbdata->HoldRegs.TimeBeforeDisconnect; + htest->SwTimings.ticks_for_reverse.ticks = mbdata->HoldRegs.TimeForReverse; htest->SwTimings.ticks_deadtime.ticks = mbdata->HoldRegs.TimeDeadtime; htest->SwTimings.ticks_before_expected_peak.ticks = mbdata->HoldRegs.TimeBeforePeak; htest->SwTimings.ticks_before_test.ticks = mbdata->HoldRegs.TimeBeforeTest; - htest->SwTimings.msticks_for_forward = mbdata->HoldRegs.TimeForForward; + htest->SwTimings.ticks_for_forward.ticks = mbdata->HoldRegs.TimeForForward; - htest->SwTimings.ticks_before_disconnect.msdelay = mbdata->Coils.msTimeBeforeDisconnect_enable; + htest->SwTimings.ticks_for_reverse.msdelay = mbdata->Coils.msTimeForReverse_enable; htest->SwTimings.ticks_deadtime.msdelay = mbdata->Coils.msTimeDeadtime_enable; htest->SwTimings.ticks_before_expected_peak.msdelay = mbdata->Coils.msTimeBeforePeak_enable; htest->SwTimings.ticks_before_test.msdelay = mbdata->Coils.msTimeBeforeTest_enable; + htest->SwTimings.ticks_before_test.msdelay = mbdata->Coils.msTimeForForward_enable; TESTER_ADC_UpdateSettings(htest->adc, mbdata); } @@ -185,15 +186,15 @@ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester) tester->mbdata->Coils.ForwardTest = 1; tester->mbdata->Coils.ReverseTest = 1; - /* Настройка пинов для прямого включения */ - tester->htest->SwPhaseReverse.SW_Port = SWITCH_PHASE_REVERSE_Port; - tester->htest->SwPhaseReverse.SwHI_Pin = SWITCH_PHASE_REVERSE_HI_Pin; - tester->htest->SwPhaseReverse.SwLO_Pin = SWITCH_PHASE_REVERSE_LO_Pin; - /* Настройка пинов для обратного включения */ - tester->htest->SwPhaseForward.SW_Port = SWITCH_PHASE_FORWARD_Port; - tester->htest->SwPhaseForward.SwHI_Pin = SWITCH_PHASE_FORWARD_HI_Pin; - tester->htest->SwPhaseForward.SwLO_Pin = SWITCH_PHASE_FORWARD_LO_Pin; + tester->htest->SwPhaseForward.SW_Port = SWITCH_PHASES_Port; + tester->htest->SwPhaseForward.SwHI_Pin = SWITCH_PHASE_A_POS_Pin; + tester->htest->SwPhaseForward.SwLO_Pin = SWITCH_PHASE_B_NEG_Pin; + + /* Настройка пинов для прямого включения */ + tester->htest->SwPhaseReverse.SW_Port = SWITCH_PHASES_Port; + tester->htest->SwPhaseReverse.SwHI_Pin = SWITCH_PHASE_B_POS_Pin; + tester->htest->SwPhaseReverse.SwLO_Pin = SWITCH_PHASE_A_NEG_Pin; /* Настройка пинов для кнопки старта */ @@ -206,10 +207,14 @@ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester) tester->leds.LED1.LED_Pin = LED1_Pin; /* Настройка таймингов по умолчанию для тестирования */ - tester->mbdata->HoldRegs.TimeForForward = DEF_MS_TIME_FOR_POSITIVE; + tester->mbdata->HoldRegs.TimeBeforeTest = DEF_TIME_BEFORE_TEST; + tester->mbdata->Coils.msTimeBeforeTest_enable = DEF_TIME_BEFORE_TEST_MS_DELAY; - tester->mbdata->HoldRegs.TimeBeforeDisconnect = DEF_TIME_BEFORE_DISCONNECT; - tester->mbdata->Coils.msTimeBeforeDisconnect_enable = DEF_TIME_BEFORE_DISCONNECT_MS_DELAY; + tester->mbdata->HoldRegs.TimeForReverse = DEF_TIME_FOR_REVERSE; + tester->mbdata->Coils.msTimeForReverse_enable = DEF_TIME_FOR_REVERSE_MS_DELAY; + + tester->mbdata->HoldRegs.TimeForForward = DEF_TIME_FOR_FORWARD; + tester->mbdata->Coils.msTimeForForward_enable = DEF_TIME_FOR_FORWARD_MS_DELAY; tester->mbdata->HoldRegs.TimeDeadtime = DEF_DEADTIME; tester->mbdata->Coils.msTimeDeadtime_enable = DEF_DEADTIME_MS_DELAY; @@ -217,9 +222,6 @@ void TESTER_Set_Default_Settings(TESTER_ProjectTypeDef *tester) tester->mbdata->HoldRegs.TimeBeforePeak = DEF_TIME_BEFORE_PEAK; tester->mbdata->Coils.msTimeBeforePeak_enable = DEF_TIME_BEFORE_PEAK_MS_DELAY; - tester->mbdata->HoldRegs.TimeBeforeTest = DEF_TIME_BEFORE_TEST; - tester->mbdata->Coils.msTimeBeforeTest_enable = DEF_TIME_BEFORE_TEST_MS_DELAY; - /* Настройка АЦП */ tester->mbdata->HoldRegs.Adc_PulseWidth = TESTER_ADC_PULSE_EXPETCED_WIDTH; diff --git a/diode_tester/MDK-ARM/diode_tester.uvoptx b/diode_tester/MDK-ARM/diode_tester.uvoptx index 7ddebb9..3347148 100644 --- a/diode_tester/MDK-ARM/diode_tester.uvoptx +++ b/diode_tester/MDK-ARM/diode_tester.uvoptx @@ -145,7 +145,7 @@ 0 ST-LINKIII-KEIL_SWO - -U53FF72064980555724221187 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 + -U005600373433510237363934 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 @@ -190,6 +190,16 @@ 1 hmodbus1,0x0A + + 8 + 1 + MB_DATA,0x0A + + + 9 + 1 + \\diode_tester\../Core/Interfaces/modbus.c\MB_DATA.HoldRegs.TimeForForward + @@ -271,7 +281,7 @@ 0 0 0 - 0 + 1 1 0 0 diff --git a/docs/mb_adr.xlsx b/docs/mb_adr.xlsx index 2fc0eecf277507ebbca468d3e8f9ead00d055b5e..4ad9b081b379c645ab4d39080e66a977b003ed05 100644 GIT binary patch delta 9619 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