Quellcode durchsuchen

01. 合并: DTU4小电流算法和启动处理。
02. 修改: can对时处理移到 pit_5ms_main 中。
03. 增加: wavelib.c,wavelib.h文件。
04. 增加: 小电流零压告警遥信。
05. 修改: 因硬件更改从而修改IECComm.c中串口索引。
06. 增加: 系统启动时间打印。
07. 修改: 通过GW_AREA_MAIN_2021宏关闭部分南网专用的开入和遥信。
08. 合并:开关零压跳闸逻辑
09. 修复: 过流保护幅值启动加速判断错误问题,保护线程中rt_printf_time替换为rt_printf。
10. 修改: 录波启动时间获取方式修改。
11. 修复: 104规约通道名称获取时溢出的问题。

EWen vor 11 Monaten
Ursprung
Commit
095e0e62e0

+ 13 - 0
README.md

@@ -39,3 +39,16 @@
 
 # 20251120
 01. 修改: 修改系统时钟获取API。
+
+# 20251202
+01. 合并: DTU4小电流算法和启动处理。
+02. 修改: can对时处理移到 pit_5ms_main 中。
+03. 增加: wavelib.c,wavelib.h文件。
+04. 增加: 小电流零压告警遥信。
+05. 修改: 因硬件更改从而修改IECComm.c中串口索引。
+06. 增加: 系统启动时间打印。
+07. 修改: 通过GW_AREA_MAIN_2021宏关闭部分南网专用的开入和遥信。
+08. 合并:开关零压跳闸逻辑
+09. 修复: 过流保护幅值启动加速判断错误问题,保护线程中rt_printf_time替换为rt_printf。
+10. 修改: 录波启动时间获取方式修改。
+11. 修复: 104规约通道名称获取时溢出的问题。

+ 7 - 2
app_public/fuxi_public/fuxi_bsp/source/ad7616.c

@@ -552,6 +552,7 @@ static void updata_adc(struct t_shmdata_adc *sample_data0, uint16_t us_adc_dot_i
 {
 	int i = 0;
 	int index = 0;
+	static int mod = 0;
 	int opt = ((g_adc_dots_data_count & (ADC_REC_SAMPLE_RATE - 1)) == 0) ? TRUE : FALSE;
 	//ÿƬ16·
 	for (uint8_t j = 0; j < 16; j++)
@@ -636,7 +637,11 @@ static void updata_adc(struct t_shmdata_adc *sample_data0, uint16_t us_adc_dot_i
 			}
 		}
 	}
-
+	
+	xdl_tbl_qd(mod);
+	mod++;
+	mod &=(CFG_ADC_MOD_NUM-1);
+	
 	g_adc_dots_data_count++;
 }
 
@@ -670,7 +675,7 @@ int adc_isr_new(int mod)
 		if(++cnt > 5)
 			break;
 
-		usleep(300);
+		usleep(50);
 	}
     // printf("ret1=%d, sample_idx=%d, read_index=%d, us_updata=%d, us_op=%d, us_op_bk=%d\n", 
 	// 	ret1, sample_data1.data.us_sample_idx, smus_sample_read_index1, sample_data1.us_updata, sample_data1.us_op, sample_data1.us_op_bk);

+ 0 - 2
app_public/fuxi_public/fuxi_bsp/source/can_app.c

@@ -594,8 +594,6 @@ int can_task(void)
 		}
 	}	
 
-	//对时报文发送  // 临时放在这里测试用 EWen 
-	can_app_timing();
 
 	// 子板程序更新发送
 	prog_send();

+ 2 - 1
app_public/fuxi_public/fuxi_bsp/source/led_ftu.c

@@ -189,7 +189,8 @@ int led_polling_5ms(void)
 		g_kc_led.slow_t = 0;
 		
 		// Ö÷°åÔËÐдíÎóµÆ
-		_led_run_err();
+		// TODO EWen
+		// _led_run_err();
 	}
 	
 	if (g_kc_led.quick_t == QUICK_FLASH)

+ 949 - 0
app_public/wavelib/wavelib.c

@@ -0,0 +1,949 @@
+/*******************************************************************************
+版权所有:	珠海欧力配网自动化股份有限公司
+文件名称:	wavelib.c
+文件版本:	01.00
+创建作者:	ygl
+创建日期:	2022-03-09
+功能说明:	modwt小波计算
+其它说明:	支持:DB,sym、coif、haar
+注意事项:只求近似值,不考虑数据重构
+*/
+#ifdef  __KERNEL__
+
+#include "head.h"
+#define  M_SQRT2     1.41421356237309504880
+
+#else
+#include "head.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include "wavelib.h"
+
+#define rt_malloc    malloc
+// #define rt_printf    printf
+#define rt_free      free
+
+#endif
+
+hilbert_para coef1;	//四组系数
+hilbert_para coef2;
+hilbert_para coef3;
+hilbert_para coef4;
+struct file *g_fpuo = NULL,*g_fpio = NULL;
+
+static const float db1[2] = {
+    7.071067811865475244008443621048490392848359376884740365883398e-01,
+    7.071067811865475244008443621048490392848359376884740365883398e-01
+};
+
+static const float db2[4] = {
+    4.829629131445341433748715998644486838169524195042022752011715e-01,
+    8.365163037378079055752937809168732034593703883484392934953414e-01,
+    2.241438680420133810259727622404003554678835181842717613871683e-01,
+    -1.294095225512603811744494188120241641745344506599652569070016e-01
+};
+
+
+static const float db3[6] = {
+    3.326705529500826159985115891390056300129233992450683597084705e-01,
+    8.068915093110925764944936040887134905192973949948236181650920e-01,
+    4.598775021184915700951519421476167208081101774314923066433867e-01,
+    -1.350110200102545886963899066993744805622198452237811919756862e-01,
+    -8.544127388202666169281916918177331153619763898808662976351748e-02,
+    3.522629188570953660274066471551002932775838791743161039893406e-02
+};
+
+
+static const float db4[8] = {
+    2.303778133088965008632911830440708500016152482483092977910968e-01,
+    7.148465705529156470899219552739926037076084010993081758450110e-01,
+    6.308807679298589078817163383006152202032229226771951174057473e-01,
+    -2.798376941685985421141374718007538541198732022449175284003358e-02,
+    -1.870348117190930840795706727890814195845441743745800912057770e-01,
+    3.084138183556076362721936253495905017031482172003403341821219e-02,
+    3.288301166688519973540751354924438866454194113754971259727278e-02,
+    -1.059740178506903210488320852402722918109996490637641983484974e-02
+};
+
+
+// static const float db5[10] = {
+//     1.601023979741929144807237480204207336505441246250578327725699e-01,
+//     6.038292697971896705401193065250621075074221631016986987969283e-01,
+//     7.243085284377729277280712441022186407687562182320073725767335e-01,
+//     1.384281459013207315053971463390246973141057911739561022694652e-01,
+//     -2.422948870663820318625713794746163619914908080626185983913726e-01,
+//     -3.224486958463837464847975506213492831356498416379847225434268e-02,
+//     7.757149384004571352313048938860181980623099452012527983210146e-02,
+//     -6.241490212798274274190519112920192970763557165687607323417435e-03,
+//     -1.258075199908199946850973993177579294920459162609785020169232e-02,
+//     3.335725285473771277998183415817355747636524742305315099706428e-03
+// };
+
+
+// All coif coefficents have to be multiplied by sqrt(2)
+static const float coif1[6] = {
+    -5.142972847076845595317549230122688830344559947132656813651045e-02,
+    2.389297284707684559531754923012268883034455994713265681365104e-01,
+    6.028594569415369119063509846024537766068911989426531362730209e-01,
+    2.721405430584630880936490153975462233931088010573468637269790e-01,
+    -5.142972847076845595317549230122688830344559947132656813651045e-02,
+    -1.107027152923154404682450769877311169655440052867343186348954e-02
+};
+
+
+static const float coif2[12] = {
+    1.158759673871686817889714882853120395708315073355502818875931e-02,
+    -2.932013798346856448679594524397843054053420947418409889774786e-02,
+    -4.763959031100813225872995081511549408622753909592460525840745e-02,
+    2.730210465347666137982239328923516270034828327990699588033501e-01,
+    5.746823938568638472459483149751499367740786490481481391460366e-01,
+    2.948671936956191896750637208703777973914107635455611537640778e-01,
+    -5.408560709171142997443672832006888537570221990444706777525838e-02,
+    -4.202648046077160694657530752545884878978719268926222513485613e-02,
+    1.674441016327950635146257083249391698866289538037299820224006e-02,
+    3.967883612962012109043447090269950094081810916481648252817197e-03,
+    -1.289203356140659543141355500990678257894936161704492503370186e-03,
+    -5.095053991076441489598480835620951586540050976664367876412655e-04
+};
+
+static const float coif3[18] = {
+    -2.682418670922068664584689955153722375535836177157637134187840e-03,
+    5.503126707831385107969640263617469178794666057252906037981936e-03,
+    1.658356047917034608134280439996549525220639437145367606178002e-02,
+    -4.650776447872697640390293095170192691113917841041002855534619e-02,
+    -4.322076356021191118175840907244577856782537221435748296465882e-02,
+    2.865033352736474630249006862976158896891076238443844211133873e-01,
+    5.612852568703300445990941995240077241406247774064453800050914e-01,
+    3.029835717728241602862575774374668529867757043461413348549577e-01,
+    -5.077014075488886159516471867138370972545857441670871832472707e-02,
+    -5.819625076158553022607041679522801089624825903982541419721721e-02,
+    2.443409432116695639462954438418928805487699080947974989338820e-02,
+    1.122924096203786563399489540091488781245346096838814728167341e-02,
+    -6.369601011048822977293753932627342482077585617391852852955559e-03,
+    -1.820458915566242322836631665832145136570132777862391313328351e-03,
+    7.902051009575939937150950543290226440287715441826917281929124e-04,
+    3.296651737931830308416338897758022998655744276957481989605186e-04,
+    -5.019277455327664998007173088097694083956570594580641192332170e-05,
+    -2.446573425530813115445387662881902303945941576472342106918209e-05
+};
+
+
+static const float coif4[24] = {
+    6.309612114309468490753696608619526520153127603444406835368201e-04,
+    -1.152225143769973488683007937016166047881572156705066038094891e-03,
+    -5.194525163470323267558201363327294331811309729430512113592118e-03,
+    1.136246148326482276463392678363118465908960082105224676102131e-02,
+    1.886723856956305960822813160712701905823879297781452350370094e-02,
+    -5.746424190192718517290527411385172124443396690932404284859269e-02,
+    -3.965265296244913762718094206756579981738035770770645437919302e-02,
+    2.936674050161006858761278962798582650835466243678172528509866e-01,
+    5.531264550395492870333469741987846570947502710783248169642137e-01,
+    3.071573096678856987248881030393884808414165269795297009902001e-01,
+    -4.711273752389572084912399351781012121935994396763702238263689e-02,
+    -6.803811467802056988332974920928626798429778679560269769187728e-02,
+    2.781363695846951303169163645831936314699164412528991864702607e-02,
+    1.773583142270308388403079552822372238681544967313003044695583e-02,
+    -1.075631615508724933047071603601897536695959225169888787867102e-02,
+    -4.001010844950535391911552472397083276670126595827549403173754e-03,
+    2.652664913530499860820143301690017184933302935238430721089152e-03,
+    8.955939276952843603555618778866181384528643960440369133096025e-04,
+    -4.165001950941708741516836418852536615951250588002878691463468e-04,
+    -1.838296167136253805617482342622910940008368723403836355183423e-04,
+    4.408022661597206973006038672236031501663774161685451815597956e-05,
+    2.208284691230832960893331999804142845136324572860276715790883e-05,
+    -2.304919162676504406778986897925054839632903355820414483306851e-06,
+    -1.262179179994622253884862172782890488140153502131112374520603e-06
+};
+
+
+
+// static const float coif5[30] = {
+//     -1.499645228345950331670593167919531667975440598691604525531231e-04,
+//     2.535527523580334712936363872191554706055603482812691726895588e-04,
+//     1.540286725995222360335148244676269541414659303531250711822333e-03,
+//     -2.941078164035693185044038586065593320891475311414770624555173e-03,
+//     -7.164112349410053294382279572472252500899544810929605832362178e-03,
+//     1.655218330649288840540841623080651353621667424921282557975513e-02,
+//     1.991901719798432056056857854066125809443504706772520641876273e-02,
+//     -6.499837825472324963374262221660858232544804226063450042795603e-02,
+//     -3.680255347446873527191823500872992242220223547780834450868002e-02,
+//     2.980959014587191795511466861338063554509597132272839414668911e-01,
+//     5.475082713540367154128337935687830970431964302909253422329131e-01,
+//     3.097002590784203529311533316221254677074498876376965941549923e-01,
+//     -4.386731482823615640442730013366750193381707273908757638050452e-02,
+//     -7.464442013283971243472663968192859562973186442054433655531762e-02,
+//     2.919469277528073666095772398605275751022315529465178441510318e-02,
+//     2.310457227706684192610065243663928370022983285246219996141160e-02,
+//     -1.397129268638200558584119246355879336305763752871371182932059e-02,
+//     -6.476749751505861835547590642967453082384538848552165075614441e-03,
+//     4.781116799130657606400088024549264921093190305150784065791191e-03,
+//     1.719383484385504023022397097446276782318002683055773803854075e-03,
+//     -1.174947934413537690027670037110105795928147523549002426409332e-03,
+//     -4.508222400696236312231932151038336110220594834213702970043431e-04,
+//     2.134457975086291667348984871136041914777578046177470626552867e-04,
+//     9.924691139873533169989496559631669037970741600337089424730635e-05,
+//     -2.914684388622130824599478843558087403539428940986384077972155e-05,
+//     -1.504031798197685905639227292876711236513927746903476131955063e-05,
+//     2.616809660013118152124234488302931243021794024318439103773996e-06,
+//     1.457502921355163070577152619048168436286350537937563166257584e-06,
+//     -1.148199649902979726237655584441763456854312591680755421569962e-07,
+//     -6.791060677322355511541065559242475254516249773485524025251102e-08
+// };
+
+static const float sym2[4] = {
+    0.48296291314469025, 0.83651630373746899,
+    0.22414386804185735, -0.12940952255092145 };
+
+
+static const float sym3[6] = {
+    0.33267055295095688, 0.80689150931333875,
+    0.45987750211933132, -0.13501102001039084,
+    -0.085441273882241486, 0.035226291882100656 };
+
+static const float sym4[8] = {
+    0.032223100604042702, -0.012603967262037833,
+    -0.099219543576847216, 0.29785779560527736,
+    0.80373875180591614, 0.49761866763201545,
+    -0.02963552764599851, -0.075765714789273325 };
+
+// static const float sym5[10] = {
+//     0.019538882735286728, -0.021101834024758855,
+//     -0.17532808990845047, 0.016602105764522319,
+//     0.63397896345821192, 0.72340769040242059,
+//     0.1993975339773936, -0.039134249302383094,
+//     0.029519490925774643, 0.027333068345077982 };
+
+/* 要求:
+* (1)C0^2 + C1^2 + C2^2 + C3^2 = 1
+* (2)C1 * C3 + C0 * C2 = 0
+*/
+
+/* 矩阵变换需要用到的参数 */
+static Filter DBn = {
+	.Len = 4,
+	.C0 = (const float) 0.482962913144690,
+	.C1 = (const float) 0.836516303737469,
+	.C2 = (const float) 0.224143868041857,
+	.C3 = (const float) -0.129409522550921,
+};
+
+
+/* 按分解矩阵进行分解 */
+static void transform(float *input_Data, float *output_Data, int length)
+{
+    int i=0;
+    int count=0;
+
+	for(i=0; i<=(length-3); i=i+1)
+    {
+        output_Data[count++] = DBn.C0 * input_Data[i] + DBn.C1 * input_Data[i+1] + DBn.C2 * input_Data[i+2] + DBn.C3 * input_Data[i+3];
+    }
+    output_Data[count++] = DBn.C2 * input_Data[0] + DBn.C3 * input_Data[1] + DBn.C0 * input_Data[length-2] + DBn.C1 * input_Data[length-1];
+    output_Data[count] = DBn.C1 * input_Data[0] - DBn.C0 * input_Data[1] + DBn.C3 * input_Data[length-2] - DBn.C2 * input_Data[length-1];
+}
+
+
+/******************************************************************************
+*	功能:利用矩阵进行分解
+*	@srcData:	源信号;
+*	@resData:	保存结果;
+*	@srcLen:	源信号长度;
+*******************************************************************************/
+void DWT_Matrix_Transform(float *srcData, s16 *resData, int srcLen)
+{
+	
+	int i=0;
+    float out1Data[srcLen];
+
+	memset(out1Data, 0, srcLen);
+	transform(srcData, out1Data, srcLen);
+
+    for (i = 0; i < srcLen; i +=1)			
+    {
+		resData[i] = (s16)rt_round(out1Data[i]);	//此处有风险,小心处理
+		// *((s16 *)&resData[i]) = (s16)(out1Data[i]);	//此处有风险,小心处理
+    }
+
+	return ;
+}
+
+/******************************************************************************
+函数名称:	hilbert_para_init
+函数版本:	01.01
+创建作者:	ygl
+创建日期:	2021.11.17
+函数说明:	hilbert初始化。
+参数说明:	无
+返回值:  	长度
+修改记录:	
+*******************************************************************************/
+void _hilbert_para_init(void)	//初始化系数
+{
+    memset(&coef1, 0, sizeof(coef1));
+    memset(&coef2, 0, sizeof(coef2));
+    memset(&coef3, 0, sizeof(coef3));
+    memset(&coef4, 0, sizeof(coef4));			
+}
+/******************************************************************************
+函数名称:	filter_Init
+函数版本:	01.01
+创建作者:	ygl
+创建日期:	2021.11.17
+函数说明:	卷积核初始化。
+参数说明:	无
+返回值:  	长度
+修改记录:	
+*******************************************************************************/
+void filter_Init(void)
+{
+	#if 0
+	g_fpuo = rt_file_open("/app/uo.txt", O_CREAT|O_RDWR,0);		//近似系数存储文件
+	if(IS_ERR(g_fpuo))
+	{
+		rt_printf("LINE %d write file error!\n",__LINE__);
+		rt_printf("write file error!\n");
+		// return -1;
+	}
+	g_fpio = rt_file_open("/app/io.txt", O_CREAT|O_RDWR,0);		//近似系数存储文件
+	if(IS_ERR(g_fpio))
+	{
+		rt_printf("LINE %d write file error!\n",__LINE__);
+		rt_printf("write file error!\n");
+		// return -1;
+	}
+	#endif
+	_hilbert_para_init();	
+}
+
+float hilbert_filter(float *channel1, float *channel2, int len)
+{
+		int i=0;
+		const float c1=2.0216;
+		const float c2=1.2562;
+		const float c3=0.2276;
+		const float c4=1.5219;
+		const float c5=0.6205;
+		const float c6=0.0463;
+		
+		// const float c1=2.1441;
+		// const float c2=1.4380;
+		// const float c3=0.2904;
+		// const float c4=1.6444;
+		// const float c5=0.7421;
+		// const float c6=0.0658;	
+		
+        float channel_f1 = 0;
+        float channel_f2 = 0;
+        float channel_f3 = 0;
+        float channel_f4 = 0;
+		float Qval = 0;
+
+		memset(&coef1,0,sizeof(coef1));
+		memset(&coef2,0,sizeof(coef2));
+		memset(&coef3,0,sizeof(coef3));
+		memset(&coef4,0,sizeof(coef4));
+		
+		for(i=0;i<len;i++)
+		{
+		    channel_f1 = c1*(coef1.y2)-c2*(coef1.y4)+c3*(coef1.y6)+c3*(coef1.x1)-c2*(coef1.x3)+c1*(coef1.x5)-coef1.x7;	
+                 
+		    coef1.y6 = coef1.y5;
+		    coef1.y5 = coef1.y4;
+		    coef1.y4 = coef1.y3;
+		    coef1.y3 = coef1.y2;
+		    coef1.y2 = coef1.y1;
+		    coef1.y1 = channel_f1;
+		    coef1.x7 = coef1.x6;
+		    coef1.x6 = coef1.x5;
+		    coef1.x5 = coef1.x4;
+		    coef1.x4 = coef1.x3;
+		    coef1.x3 = coef1.x2;
+		    coef1.x2 = coef1.x1;
+		    coef1.x1 = channel1[i];  
+		    
+		    
+		    channel_f2 = c4*(coef2.y2)-c5*(coef2.y4)+c6*(coef2.y6)+c6*(channel1[i])-c5*(coef2.x2)+c4*(coef2.x4)-(coef2.x6);     
+		    coef2.y6 = coef2.y5;
+		    coef2.y5 = coef2.y4;
+		    coef2.y4 = coef2.y3;
+		    coef2.y3 = coef2.y2;
+		    coef2.y2 = coef2.y1;
+		    coef2.y1 = channel_f2;		   
+		    coef2.x6 = coef2.x5;
+		    coef2.x5 = coef2.x4;
+		    coef2.x4 = coef2.x3;
+		    coef2.x3 = coef2.x2;
+		    coef2.x2 = coef2.x1;
+		    coef2.x1 = channel1[i];    
+		    
+		    channel_f3 = c1*(coef3.y2)-c2*(coef3.y4)+c3*(coef3.y6)+c3*(coef3.x1)-c2*(coef3.x3)+c1*(coef3.x5)-coef3.x7;	
+                    coef3.y6 = coef3.y5;
+		    coef3.y5 = coef3.y4;
+		    coef3.y4 = coef3.y3;
+		    coef3.y3 = coef3.y2;
+		    coef3.y2 = coef3.y1;
+		    coef3.y1 = channel_f3;
+		    coef3.x7 = coef3.x6;
+		    coef3.x6 = coef3.x5;
+		    coef3.x5 = coef3.x4;
+		    coef3.x4 = coef3.x3;
+		    coef3.x3 = coef3.x2;
+		    coef3.x2 = coef3.x1;
+		    coef3.x1 = channel2[i];  
+		    
+		    
+		    channel_f4 = c4*(coef4.y2)-c5*(coef4.y4)+c6*(coef4.y6)+c6*(channel2[i])-c5*(coef4.x2)+c4*(coef4.x4)-(coef4.x6);     
+		    coef4.y6 = coef4.y5;
+		    coef4.y5 = coef4.y4;
+		    coef4.y4 = coef4.y3;
+		    coef4.y3 = coef4.y2;
+		    coef4.y2 = coef4.y1;
+		    coef4.y1 = channel_f4;		   
+		    coef4.x6 = coef4.x5;
+		    coef4.x5 = coef4.x4;
+		    coef4.x4 = coef4.x3;
+		    coef4.x3 = coef4.x2;
+		    coef4.x2 = coef4.x1;
+		    coef4.x1 = channel2[i];  
+		    
+		    Qval += (channel_f1*channel_f4 - channel_f2*channel_f3)/2;
+                    
+		}
+		Qval =(float) Qval/len; 
+		// rt_printf("len = %d,qval = %f\r\n",len,Qval);
+		return Qval;
+}
+
+
+int filtlength(const char* name) {
+    int len = strlen(name);
+    int i = 0;
+    char *new_str = NULL;
+    int N = 0;
+	if (!strcmp(name,"haar") || !strcmp(name,"db1")) {
+		return 2;
+	}
+    else if (len > 2 && strstr(name, "db") != NULL)
+    {
+        new_str = (char*)rt_malloc(sizeof(char)*(len-2 + 1));
+        for (i = 2; i < len + 1; i++)
+            new_str[i - 2] = name[i];
+
+        N = atoi(new_str);
+        rt_free(new_str);
+        if (N>38)
+        {
+            rt_printf("\n Filter Not in Database \n");
+            return -1;
+        }
+
+        return N * 2;
+    }
+
+    else if (len > 4 && strstr(name, "coif") != NULL)
+    {
+        new_str = (char*)rt_malloc(sizeof(char)*(len - 4 + 1));
+        for (i = 4; i < len + 1; i++)
+            new_str[i - 4] = name[i];
+
+        N = atoi(new_str);
+        rt_free(new_str);
+        if (N>17)
+        {
+            rt_printf("\n Filter Not in Database \n");
+            return -1;
+        }
+
+        return N * 6;
+    }
+    else if (len > 3 && strstr(name, "sym") != NULL)
+    {
+        new_str = (char*)rt_malloc(sizeof(char)*(len - 3 + 1));
+        for (i = 3; i < len + 1; i++)
+            new_str[i - 3] = name[i];
+
+        N = atoi(new_str);
+        rt_free(new_str);
+        if (N>20 || N < 2)
+        {
+            rt_printf("\n Filter Not in Database \n");
+            return -1;
+        }
+
+        return N * 2;
+    }
+	else {
+		rt_printf("\n Filter Not in Database \n");
+		return -1;
+	}
+
+}
+
+void copy_reverse(const float *in, int N,float *out)
+{
+    int count = 0;
+    for (count = 0; count < N; count++)
+        out[count] = in[N - count - 1];
+}
+
+void qmf_even(const float *in, int N,float *out)
+{
+    int count = 0;
+    for (count = 0; count < N; count++)
+    {
+        out[count] = in[N - count - 1];
+        if (count % 2 != 0)
+        {
+            out[count] = -1 * out[count];
+        }
+    }
+}
+
+void qmf_wrev(const float *in, int N, float *out)
+{
+    float *sigOutTemp;
+    sigOutTemp = (float*)rt_malloc(N*sizeof(float));
+
+    qmf_even(in, N, sigOutTemp);
+    copy_reverse(sigOutTemp, N, out);
+
+    rt_free(sigOutTemp);
+    return;
+}
+
+void wave_copy(const float *in, int N, float *out)
+{
+    int count = 0;
+    for (count = 0; count < N; count++)
+        out[count] = in[count];
+}
+
+int filtcoef(const char* name, float *lp1, float *hp1, float *lp2, float *hp2) {
+    int i = 0; 
+    int N = filtlength(name);
+	if (!strcmp(name,"haar") || !strcmp(name,"db1")) {
+        copy_reverse(db1, N, lp1);
+        qmf_wrev(db1, N, hp1);
+        wave_copy(db1, N, lp2);
+        qmf_even(db1, N, hp2);
+
+		return N;
+	}
+	else if (!strcmp(name,"db2")){
+        copy_reverse(db2, N, lp1);
+        qmf_wrev(db2, N, hp1);
+        wave_copy(db2, N, lp2);
+        qmf_even(db2, N, hp2);
+
+        return N;
+	}
+	else if (!strcmp(name,"db3")){
+        copy_reverse(db3, N, lp1);
+        qmf_wrev(db3, N, hp1);
+        wave_copy(db3, N, lp2);
+        qmf_even(db3, N, hp2);
+
+        return N;
+	}
+	else if (!strcmp(name,"db4")){
+        copy_reverse(db4, N, lp1);
+        qmf_wrev(db4, N, hp1);
+        wave_copy(db4, N, lp2);
+        qmf_even(db4, N, hp2);
+
+        return N;
+	}
+
+	else if (!strcmp(name,"coif1")){
+        float *coeffTemp;
+        coeffTemp = (float*)rt_malloc(N*sizeof(float));
+
+        wave_copy(coif1, N, coeffTemp);
+        for (i = 0; i < N; ++i) {
+            coeffTemp[i] *= M_SQRT2;
+        }
+
+        copy_reverse(coeffTemp, N, lp1);
+        qmf_wrev(coeffTemp, N, hp1);
+        wave_copy(coeffTemp, N, lp2);
+        qmf_even(coeffTemp, N, hp2);
+        rt_free(coeffTemp);
+
+        return N;
+	}
+	else if (!strcmp(name,"coif2")){
+        float *coeffTemp;
+        coeffTemp = (float*)rt_malloc(N*sizeof(float));
+
+        wave_copy(coif2, N, coeffTemp);
+        for (i = 0; i < N; ++i) {
+            coeffTemp[i] *= M_SQRT2;
+        }
+
+        copy_reverse(coeffTemp, N, lp1);
+        qmf_wrev(coeffTemp, N, hp1);
+        wave_copy(coeffTemp, N, lp2);
+        qmf_even(coeffTemp, N, hp2);
+        rt_free(coeffTemp);
+
+        return N;
+	}
+	else if (!strcmp(name,"coif3")){
+        float *coeffTemp;
+        coeffTemp = (float*)rt_malloc(N*sizeof(float));
+
+        wave_copy(coif3, N, coeffTemp);
+        for (i = 0; i < N; ++i) {
+            coeffTemp[i] *= M_SQRT2;
+        }
+
+        copy_reverse(coeffTemp, N, lp1);
+        qmf_wrev(coeffTemp, N, hp1);
+        wave_copy(coeffTemp, N, lp2);
+        qmf_even(coeffTemp, N, hp2);
+        rt_free(coeffTemp);
+
+        return N;
+	}
+	else if (!strcmp(name,"coif4")){
+        float *coeffTemp;
+        coeffTemp = (float*)rt_malloc(N*sizeof(float));
+
+        wave_copy(coif4, N, coeffTemp);
+        for (i = 0; i < N; ++i) {
+            coeffTemp[i] *= M_SQRT2;
+        }
+
+        copy_reverse(coeffTemp, N, lp1);
+        qmf_wrev(coeffTemp, N, hp1);
+        wave_copy(coeffTemp, N, lp2);
+        qmf_even(coeffTemp, N, hp2);
+        rt_free(coeffTemp);
+
+        return N;
+	}
+
+	else if (!strcmp(name,"sym2") || !strcmp(name,"sym1")){
+        copy_reverse(sym2, N, lp1);
+        qmf_wrev(sym2, N, hp1);
+        wave_copy(sym2, N, lp2);
+        qmf_even(sym2, N, hp2);
+        return N;
+	}
+
+	else if (!strcmp(name,"sym3")){
+        copy_reverse(sym3, N, lp1);
+        qmf_wrev(sym3, N, hp1);
+        wave_copy(sym3, N, lp2);
+        qmf_even(sym3, N, hp2);
+        return N;
+	}
+
+	else if (!strcmp(name,"sym4")){
+        copy_reverse(sym4, N, lp1);
+        qmf_wrev(sym4, N, hp1);
+        wave_copy(sym4, N, lp2);
+        qmf_even(sym4, N, hp2);
+        return N;
+	}
+
+	else {
+		rt_printf("\n Filter Not in Database \n");
+		return -1;
+	}
+
+	return 0;
+}
+
+
+wave_object wave_init(const char* wname) {
+	wave_object obj = NULL;
+	int retval;
+	retval = 0;
+
+	if (wname != NULL) {
+		retval = filtlength(wname);
+	}
+
+	obj = (wave_object)rt_malloc(sizeof(struct wave_set) + sizeof(float)* 4 * retval);
+
+	obj->filtlength = retval;
+	obj->lpd_len = obj->hpd_len = obj->lpr_len = obj->hpr_len = obj->filtlength;
+	strcpy(obj->wname, wname);
+	if (wname != NULL) {
+		filtcoef(wname,obj->params,obj->params+retval,obj->params+2*retval,obj->params+3*retval);
+	}
+	obj->lpd = &obj->params[0];
+	obj->hpd = &obj->params[retval];
+	obj->lpr = &obj->params[2 * retval];
+	obj->hpr = &obj->params[3 * retval];
+	return obj;
+}
+
+wt_object wt_init(wave_object wave,const char* method, int siglength,int J) {
+	int i;
+	wt_object obj = NULL;
+
+	if (J > 100) {
+		rt_printf("\n The Decomposition Iterations Cannot Exceed 100. Exiting \n");
+		return NULL;
+	}
+
+	if (!strcmp(method, "modwt") || !strcmp(method, "MODWT")) {
+
+		if (!strstr(wave->wname,"haar")) {
+			if (!strstr(wave->wname,"db")) {
+				if (!strstr(wave->wname, "sym")) {
+					if (!strstr(wave->wname, "coif")) {
+						rt_printf("\n MODWT is only implemented for orthogonal wavelet families - db, sym and coif \n");
+						return NULL;
+					}
+				}
+			}
+		}
+
+		// obj = (wt_object)rt_malloc(sizeof(struct wt_set) + sizeof(float)* (siglength * 2 * (J + 1)));
+		// obj->outlength = siglength * (J + 1); // Default
+		obj = (wt_object)rt_malloc(sizeof(struct wt_set) + sizeof(float)* (siglength * 2));
+		obj->outlength = siglength ; // 
+		strcpy(obj->ext, "per"); // Default
+	}
+
+	obj->wave = wave;
+	obj->siglength = siglength;
+	obj->modwtsiglength = siglength;
+	obj->J = J;
+	// obj->MaxIter = MaxIter;
+	strcpy(obj->method, method);
+
+	if (siglength % 2 == 0) {
+		obj->even = 1;
+	}
+	else {
+		obj->even = 0;
+	}
+
+	obj->cobj = NULL;
+
+	strcpy(obj->cmethod, "direct"); // Default
+	obj->cfftset = 0;
+	obj->lenlength = J + 2;
+	obj->output = &obj->params[0];
+
+	if (!strcmp(method, "modwt") || !strcmp(method, "MODWT")) {
+		for (i = 0; i < siglength * 2; ++i) {
+			obj->params[i] = 0.0;
+		}
+	}
+
+	return obj;
+}
+
+static void modwt_per(wt_object wt, int M, float *inp, float *cA, int len_cA) {
+	int l, i, t, len_avg;
+	float s;
+	float *filt;
+	len_avg = wt->wave->lpd_len;
+
+	filt = (float*)rt_malloc(sizeof(float)* len_avg);
+	s = M_SQRT2;//sqrt(2.0);
+	for (i = 0; i < len_avg; ++i) {
+		filt[i] = wt->wave->lpd[i] / s;
+	}
+
+	for (i = 0; i < len_cA; ++i) {
+		t = i;
+		cA[i] = filt[0] * inp[t];
+
+		for (l = 1; l < len_avg; l++) {
+			t -= M;
+			while (t >= len_cA) {
+				t -= len_cA;
+			}
+			while (t < 0) {
+				// t += len_cA; //ygl 传入波形数据,有可能首尾不对称。此处首核卷积改为第一点开始    
+                t += M;
+			}
+
+			cA[i] += filt[l] * inp[t];
+		}
+	}
+	rt_free(filt);
+}
+
+static void modwt_direct(wt_object wt, const float *inp) {
+	int i, J, temp_len, iter, M;
+	float  *cA;
+
+
+	if (strcmp(wt->ext, "per")) {
+		rt_printf("MODWT direct method only uses periodic extension per. \n");
+		rt_printf(" Use MODWT fft method for symmetric extension sym \n");
+		return;
+	}
+
+	temp_len = wt->siglength;
+	J = wt->J;
+	wt->length[0] = wt->length[J] = temp_len;
+	wt->outlength = wt->length[J + 1] =  temp_len;	//只考虑近似值
+	M = 1;
+	for (iter = 1; iter < J; ++iter) {
+		M = 2 * M;
+		wt->length[iter] = temp_len;
+	}
+
+
+	cA = (float*)rt_malloc(sizeof(float)* temp_len);
+	M = 1;
+
+	for (i = 0; i < temp_len; ++i) {
+		wt->params[i] = inp[i];
+	}
+
+	for (iter = 0; iter < J; ++iter) {
+		if (iter > 0) {
+			M = 2 * M;
+		}
+
+		modwt_per(wt, M, wt->params, cA, temp_len);
+
+
+		for (i = 0; i < temp_len; ++i) {
+			wt->params[i] = cA[i];
+		}
+
+	}
+
+	rt_free(cA);
+
+}
+
+void modwt(wt_object wt, const float *inp) {
+	if (!strcmp(wt->cmethod, "direct")) {
+		modwt_direct(wt, inp);
+	}
+	else {
+		rt_printf("Error- Available Choices for this method are - direct and fft \n");
+		return;
+	}
+}
+
+void wave_free(wave_object object) {
+	rt_free(object);
+}
+
+void wt_free(wt_object object) {
+	rt_free(object);
+}
+
+
+/*------------------------------ 内部函数 -------------------------------------
+内部函数以下划线‘_’开头,不需要检查参数的合法性.
+*/
+
+
+/*------------------------------ 测试函数 -------------------------------------
+一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
+进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
+*/
+
+// #ifndef __KERNEL__ 
+#if 0
+/**************************************************************************
+函数名称: main()
+函数版本:1.00 
+作者:    ygl
+创建日期:2022.03.10
+函数功能说明:小波测试函数,在vscode当前文件下测试。使用D:\\MinGW\\bin\\gcc.exe,需要配置vscode相关"launch.json"和"task.json“
+            支持:haar  db1~5   sym2~5  coif1~5 共四类小波函数
+输入参数:
+输出参数:
+返回值: 
+***************************************************************************/
+int main() {
+	wave_object obj;
+	wt_object wt;
+	float *inp, *out, *diff;
+	int N, i, J;
+
+	FILE *ifp;
+    FILE *fpAppCoef = NULL;
+	float temp[10000];
+
+	char *name = "haar";
+	obj = wave_init(name);
+	// wave_summary(obj);
+
+	// ifp = fopen("signal.txt", "r");
+    ifp = fopen("myDWTData4.txt", "r");
+    fseek(ifp,0,SEEK_END);
+	N = ftell(ifp)/7;
+	fseek(ifp,0,SEEK_SET);
+	i = 0;
+	if (!ifp) {
+		printf("Cannot Open File");
+		exit(100);
+	}
+	while (!feof(ifp)) {
+        fscanf(ifp, "%f \n", &temp[i]);
+		i++;
+	}
+
+    //***********************************把注释取消掉,可以将变换结果存于文件****************************************
+	if(NULL == (fpAppCoef = fopen("DWT_AppData.txt", "w")))			//近似系数存储文件
+	{
+		printf("write file error!\n");
+		return -1;
+	}
+    //***********************************************************************************************************/
+	// N = 177;
+	
+	fclose(ifp);
+
+	inp = (float*)malloc(sizeof(float)* N);
+	out = (float*)malloc(sizeof(float)* N);
+	diff = (float*)malloc(sizeof(float)* N);
+	//wmean = mean(temp, N);
+
+	for (i = 0; i < N; ++i) {
+		inp[i] = temp[i];
+		//printf("%g \n",inp[i]);
+	}
+	J = 4;
+
+	wt = wt_init(obj, "modwt", N, J);// Initialize the wavelet transform object
+	
+	modwt(wt, inp);// Perform MODWT
+	//MODWT output can be accessed using wt->output vector. Use wt_summary to find out how to extract appx and detail coefficients
+	
+	for (i = 0; i < wt->outlength; ++i) {
+		printf("%g ",wt->output[i]);
+        fprintf(fpAppCoef, "%f\t", wt->output[i]);		//将数据流写入文件
+	}
+
+	// imodwt(wt, out);// Perform ISWT (if needed)
+	// Test Reconstruction
+
+	// for (i = 0; i < wt->siglength; ++i) {
+	// 	diff[i] = out[i] - inp[i];
+	// }
+
+
+    fclose(fpAppCoef);
+	wave_free(obj);
+	wt_free(wt);
+
+	rt_free(inp);
+	rt_free(out);
+	rt_free(diff);
+	return 0;
+}
+
+#endif
+/*------------------------------ 文件结束 -------------------------------------
+*/
+
+

+ 152 - 0
app_public/wavelib/wavelib.h

@@ -0,0 +1,152 @@
+#ifndef WAVELIB_H_
+#define WAVELIB_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(_MSC_VER)
+#pragma warning(disable : 4200)
+#pragma warning(disable : 4996)
+#endif
+
+#ifndef fft_type
+#define fft_type float
+#endif
+
+#ifndef cplx_type
+#define cplx_type float
+#endif
+
+typedef struct Filter{
+	uint Len;
+	float C0;
+	float C1;
+	float C2;
+	float C3;
+}Filter;
+
+typedef struct
+{
+		 float x1;
+		 float x2;
+		 float x3;
+		 float x4;
+		 float x5;
+		 float x6;
+		 float x7;
+		 float y1;
+		 float y2;
+		 float y3;
+		 float y4;
+		 float y5;
+		 float y6;
+		 float y7;		
+		
+}hilbert_para;	//�˲���ϵ��
+
+typedef struct wave_set* wave_object;
+
+wave_object wave_init(const char* wname);
+
+struct wave_set{
+	char wname[50];
+	int filtlength;// When all filters are of the same length. [Matlab uses zero-padding to make all filters of the same length]
+	int lpd_len;// Default filtlength = lpd_len = lpr_len = hpd_len = hpr_len
+	int hpd_len;
+	int lpr_len;
+	int hpr_len;
+	float *lpd;
+	float *hpd;
+	float *lpr;
+	float *hpr;
+	float params[0];
+};
+
+typedef struct fft_t {
+  fft_type re;
+  fft_type im;
+} fft_data;
+
+typedef struct fft_set* fft_object;
+
+fft_object fft_init(int N, int sgn);
+
+struct fft_set{
+	int N;
+	int sgn;
+	int factors[64];
+	int lf;
+	int lt;
+	fft_data twiddle[1];
+};
+
+typedef struct fft_real_set* fft_real_object;
+
+fft_real_object fft_real_init(int N, int sgn);
+
+struct fft_real_set{
+	fft_object cobj;
+	fft_data twiddle2[1];
+};
+
+typedef struct conv_set* conv_object;
+
+conv_object conv_init(int N, int L);
+
+struct conv_set{
+	fft_real_object fobj;
+	fft_real_object iobj;
+	int ilen1;
+	int ilen2;
+	int clen;
+};
+
+typedef struct wt_set* wt_object;
+
+wt_object wt_init(wave_object wave,const char* method, int siglength, int J);
+
+struct wt_set{
+	wave_object wave;
+	conv_object cobj;
+	char method[10];
+	int siglength;// Length of the original signal.
+	int modwtsiglength; // Modified signal length for MODWT
+	int outlength;// Length of the output DWT vector
+	int lenlength;// Length of the Output Dimension Vector "length"
+	int J; // Number of decomposition Levels
+	int MaxIter;// Maximum Iterations J <= MaxIter
+	int even;// even = 1 if signal is of even length. even = 0 otherwise
+	char ext[10];// Type of Extension used - "per" or "sym"
+	char cmethod[10]; // Convolution Method - "direct" or "FFT"
+
+	int N; //
+	int cfftset;
+	int zpad;
+	int length[102];
+	float *output;
+	float params[0];
+};
+
+void filter_Init(void);
+float hilbert_filter(float *channel1, float *channel2, int len);
+void DWT_Matrix_Transform(float *srcData, s16 *resData, int srcLen);
+
+void modwt(wt_object wt, const float *inp);
+
+void imodwt(wt_object wt, float *dwtop);
+
+float* getMODWTmra(wt_object wt, float *wavecoeffs);
+
+void wave_free(wave_object object);
+
+void wt_free(wt_object object);
+
+extern struct file *g_fpuo,*g_fpio;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* WAVELIB_H_ */

+ 2 - 0
dtu/dtu_main_t536/app/Appconfig.c

@@ -991,6 +991,8 @@ const SOE_DEF tAllSOE[]=
 	{0x04,		{EV_PARA_Uab,	0,			0},				"Uab2ʧѹ¸æ¾¯"},
 	{0x04,		{EV_PARA_Ubc,	0,			0},				"Ubc2ʧѹ¸æ¾¯"},
 	{0x04,		{EV_PARA_Uca,	0,			0},				"Uca2ʧѹ¸æ¾¯"},
+	{0x05,		{EV_PARA_U0,	0,			0},				"СµçÁ÷Áãѹ1¸æ¾¯"},	
+	{0x05,		{EV_PARA_U0,	0,			0},				"СµçÁ÷Áãѹ2¸æ¾¯"},	
 #ifdef DISP_SET_YYJB
 	#ifdef GD_TEST_2021
 		{0x04,		{EV_PARA_Us1,	0,			0}, 			"A²àÓÐѹ"},

+ 2 - 0
dtu/dtu_main_t536/app/Appconfig.h

@@ -694,6 +694,8 @@ enum
 	EV_UAB2SYGJ,			// UAB2失压告警
 	EV_UBC2SYGJ,			// UBC2失压告警
 	EV_UCA2SYGJ,			// UCA2失压告警
+	EV_XDL_U0GJ1,			// 小电流零压告警1
+	EV_XDL_U0GJ2,			// 小电流零压告警2
 #ifdef DISP_SET_YYJB
 	EV_POW1YY,				// PT1有压
 	EV_POW2YY,				// PT2有压

+ 1 - 1
dtu/dtu_main_t536/app/IECComm.c

@@ -47,7 +47,7 @@ union u_RsIEC 	g_tRsIEC[CFG_UART_NUM_MAX];		// 
 s8 UART_CHANNEL[CFG_UART_NUM_MAX]={CFG_UART_232_0,CFG_UART_232_1,CFG_UART_HMI,CFG_UART_485_0,CFG_UART_485_1, CFG_UART_485_2,CFG_UART_CHIP_S1};
 #else
 // s8 UART_CHANNEL[CFG_UART_NUM_MAX]={CFG_UART_232_0,CFG_UART_232_1,CFG_UART_HMI,CFG_UART_485_0,CFG_UART_485_1, CFG_UART_485_2};
-s8 UART_CHANNEL[CFG_UART_NUM_MAX]={6,4,13,11,8,3,14,9,5,1,15}; //临时调试设置
+s8 UART_CHANNEL[CFG_UART_NUM_MAX]={6,4,13,11,8,3,14,9,5,1,16}; //临时调试设置
 #endif
 
 u8 uart_test_begin=0;

+ 2 - 1
dtu/dtu_main_t536/app/MmiData.c

@@ -5742,13 +5742,14 @@ static void mmd_GetFtuYxValue(int i,DATA_FIELD_DEF *pF)
 		strcpy(tmpstr,YX_F);
 	}
 //关联压板处理
+#ifndef GW_AREA_MAIN_2021
 	if(SW_DI_BSCH+1==ecd->type && ecd->owner!=0 && (!CHZ_ALL_EN(0)))//闭锁重合压板				
 		strcpy(tmpstr,YX_H);
 	if((SW_DI_CHZ+1==ecd->type && ecd->owner!=0 && (!CHZ_ALL_EN(0)))||//重合闸投入压板 	   		
 	    (SW_DI_BHZTT+1==ecd->type && ecd->owner!=0 && (!FUN_ALL_EN(0)))||//保护总投入压板
 	    (SW_DI_TQ+1==ecd->type && ecd->owner!=0 && (!TQ_ALL_EN(0))))//同期压板	
 		strcpy(tmpstr,YX_F);	
-
+#endif
     #if defined GD_AREA_SHAOGUAN || defined BHFAGS_YB_YK || defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_ECZD_2020 || defined BH_FA_INONE_PUBLIC
 		if((SW_DI_BHTT+1==ecd->type && ecd->owner!=0 && (!BH_ALL_EN(0)))||//常规保护压板
 			(SW_DI_FA_TT+1==ecd->type && ecd->owner!=0 && (!FA_ALL_EN(0)))||//FA压板

+ 2 - 1
dtu/dtu_main_t536/app/SOE.c

@@ -784,7 +784,7 @@ void soe_record_allArg(s32 *arg,int sw)
 
 int  soe_record_imp(u16 code,u8 val)
 {
-
+#ifndef GW_AREA_MAIN_2021
 	int i;
 	u8 slot=(u8)(code>>8);	//°å¿¨ºÅ
 	u8 dino=(u8)(code);		//Ò£ÐźÅ
@@ -809,6 +809,7 @@ int  soe_record_imp(u16 code,u8 val)
 			return 1;
 		}
 	}	
+#endif
 	return 0;	
 }
 

+ 9 - 3
dtu/dtu_main_t536/app/Sys.c

@@ -107,12 +107,17 @@ DWORD dTRstTime;
 const char *ykownerstr[]=
 {
     "--",
-    "1#232",
-    "2#232",
-    "3#232",
     "1#485",
     "2#485",
     "3#485",
+    "4#232",
+    "5#232",
+    "6#232",
+	"7#232",
+	"8#232",
+	"9#232",
+	"10#232",
+	"11#232",
 #ifdef FUN_FUXI_ESAM
 	"南网加密",
 #endif
@@ -284,6 +289,7 @@ void SystemInit(void)
 	pit_regester_callback(156,pit_156us_main); //挂入采样中断
 	pit_regester_callback(5000,pit_5ms_main); //挂入保护中断
 #endif
+	xdl_i0_argument_init_by_scale();
 }
 void app_yb_refresh(void)
 {

+ 11 - 2
dtu/dtu_main_t536/app/UnitsLib.c

@@ -393,7 +393,7 @@ void ProtectRelayInit(void)
 		InitTR(&pR->tSDHZ.tHz0ms2s,pRunSet->dT_HZSB,0);
 		InitTR(&pR->tSDHZ.tTz0ms2s,pRunSet->dT_TZSB,0);	
 		InitTR(&pR->tSDHZ.tTSDHzHJS, 0, pSet->dT_Y); //上电合闸加速判断 
-#endif		
+#endif	
 		// TODO pSet对接,但国网目前没有用到FA逻辑,晚点再合 EWen
 		// InitTR(&pR->tU0TZ.tZOVTime,  		pSet->dT_OverU0, T_20ms); 
 		// InitTR(&pR->tOVER_U0TZ.tZOVTime,  	pSet->dBHTOverU0, T_20ms); 
@@ -404,6 +404,9 @@ void ProtectRelayInit(void)
 		// InitTR(&pR->tLostVot.tLostVotTime,  pSet->dT_Z, T_20ms);    	
 		// InitTR(&pR->tLostVot.tLostVLockTime,0,pSet->dT_fa_bsTz);
 		// InitTR(&pR->tTQHz.tTQTime,pSet->dT_tq,0); //同期
+		InitTR(&pR->tSDHZ.tHz0ms2s,pRunSet->dT_HZSB,0);
+		InitTR(&pR->tSDHZ.tTz0ms2s,pRunSet->dT_TZSB,0);	
+
 #ifdef ADD_TQ_FH_TIME_SET
 		InitTR(&pR->tTQHz.tTQQDTime,0, pRunSet->dT_tq_fh);
 #else
@@ -532,6 +535,8 @@ void ProtectRelayInit(void)
 		// PT断线
 	#ifdef GW_AREA_MAIN_2021
 		InitTR(&pR->tPTDX.tQDTime,  pRunSet->tPTSet.dTVol,  0);
+		// 零压跳闸
+		InitTR(&pR->tU0GZ.tQDTime,  pRunSet->tSwSet[sw].tU0Set.dTVol,  0);
 	#endif
 	}
 
@@ -891,6 +896,8 @@ void ProtectRelayInit1(void)
 		// TODO pSet对接,但国网目前没有用到FA逻辑,晚点再合 EWen
 		// InitTR_Time(&pR->tU0TZ.tZOVTime,  pSet->dT_OverU0, T_20ms); 
 		// InitTR_Time(&pR->tOVER_U0TZ.tZOVTime,  	pSet->dBHTOverU0, T_20ms); 
+		InitTR_Time(&pR->tSDHZ.tHz0ms2s,pRunSet->dT_HZSB,0);
+		InitTR_Time(&pR->tSDHZ.tTz0ms2s,pRunSet->dT_TZSB,0);	
 
 		//解列
 	#ifndef GW_AREA_MAIN_2021
@@ -948,9 +955,11 @@ void ProtectRelayInit1(void)
 		InitTR(&gb_drive.tQDTime_hz_end,pRunSet->tSwSet[sw].dT_hz_end, 0);
 	#endif
 
-		// PT断线
 	#ifdef GW_AREA_MAIN_2021
+		// PT断线
 		InitTR_Time(&pR->tPTDX.tQDTime,  pRunSet->tPTSet.dTVol,  0);
+		// 零压跳闸
+		InitTR_Time(&pR->tU0GZ.tQDTime,  pRunSet->tSwSet[sw].tU0Set.dTVol,  0);
 	#endif
 	}
 

+ 1 - 0
dtu/dtu_main_t536/app/defineSys.h

@@ -1028,6 +1028,7 @@
 	#define DISP_SET_YYJB
 	#define YX_RESET_TIME
 	#define DISP_SET_LX3 
+	#define XDL_ZT
 #else
 	#ifndef AREA_MAIN
 		#error δś¨ŇĺľŘÇřşę export _AREA=-D******* 

+ 1 - 0
dtu/dtu_main_t536/app/head.h

@@ -102,6 +102,7 @@
 #endif
 #include "protect.h"
 #include "xdljd.h"
+#include "wavelib.h"
 
 #include "get_keyword.h"
 #include "sys_api.h"

+ 8 - 0
dtu/dtu_main_t536/app/main.c

@@ -164,6 +164,14 @@ int app_main (void *unused)
 	rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n", 
               	"app_main_loop", (int)getpid(), (int)syscall(SYS_gettid));
 #endif
+	{
+		struct timespec ts;
+		struct rtc_time_t ct;
+
+		gps_get_time(&ts);
+		timespec_to_rtc(ts, &ct, 1);
+		rt_printf("µ±Ç°Ê±¼ä: %04d-%02d-%02d %02d:%02d:%02d\r\n", ct.year+2000, ct.month, ct.day, ct.hour, ct.min, ct.ms/1000);
+	}
 	rt_printf("Ö÷Ñ­»·Æô¶¯...\r\n");
 #if defined(CPU_AM335X)	
 	watchdog_unregister_module();

+ 29 - 14
dtu/dtu_main_t536/app/protect.c

@@ -369,8 +369,7 @@ int protect_polling(void)
 	{
 		Pro_vol(dTDelta);		// 电压告警逻辑
 	#ifdef	XDL_ZT //小电流接地
-		// TODO 待适配  EWen
-		// xdl_protect(dTDelta);	// 小电流接地保护
+		xdl_protect(dTDelta);	// 小电流接地保护
 	#endif
 		PT_Check(dTDelta);	
 	#ifndef GW_AREA_MAIN_2021
@@ -410,6 +409,7 @@ int protect_polling(void)
 	#endif
 
 		// 电压轮巡类
+		Pro_U0Tz(g_protect.sw,dTDelta);
 		//FA_OverU0Tz(g_protect.sw,dTDelta);			// 合后接地故障
 		//FA_lostvotTz(g_protect.sw,dTDelta);			// 失压分闸
 		Pro_TQHz(g_protect.sw,dTDelta);				// 合环
@@ -610,7 +610,7 @@ int protect_tbl_qd(void)
 	            if(wIQdCnt[sw][i] >= TBLQDDSMK)
 	            {
 	                pR->uBHQD.bFlag.bTBQD = true;
-	                rt_printf_time("protect_tbl_qd:i=%d,daaa=%d,dTBLValue=%d.\r\n",i,daaa,pRunSet->dTBLValue[sw]);
+	                rt_printf("protect_tbl_qd:i=%d,daaa=%d,dTBLValue=%d.\r\n",i,daaa,pRunSet->dTBLValue[sw]);
 	                break;
 	            }
 	        }
@@ -686,8 +686,13 @@ int protect_amp_qd_js(int sw)
 	r = 1;
 	for(i=0; i<CFG_ADC_DOTS_PER_PERIOD/2; i++)
 	{
+		#if 0
 		v = *(s16 *)((u32)(dots+i)&CFG_ADC_BUF_MASK);
 		v+= *(s16 *)((u32)(dots+i+CFG_ADC_DOTS_PER_PERIOD/2)&CFG_ADC_BUF_MASK);
+		#else
+		v = *(dots+i);
+		v+= *(dots+i+CFG_ADC_DOTS_PER_PERIOD/2);
+		#endif
 		v = abs(v);
 		if(v >= threshold) // 如果系数设置为0,则幅值加速没有效果。
 		{
@@ -698,14 +703,15 @@ int protect_amp_qd_js(int sw)
 	}
 
 	{
+	#if 0
 		float it,iv;
 //		it = (float)_Mul_Div_U(threshold*Q16_BASE, 256, g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k);
 //		iv = (float)_Mul_Div_U(v*Q16_BASE, 256, g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k);
 		it = (float)threshold*256/g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k;
 		iv = (float)v*256/g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k;
-	#if 0	// modify for xxxxxx 当输入量在保护定值的边界值时,会反复打印,导致装置重启
+		// modify for xxxxxx 当输入量在保护定值的边界值时,会反复打印,导致装置重启
 		rt_printf("threshold=%d,v=%d,r=%d,m2_max=%d,fFZLBXS=%f.\r\n",threshold,v,r,m2_max,pRunSet->fFZLBXS);
-		rt_printf_time("it=%f,iv=%f,iv/it=%f.\r\n",it,iv,iv/it);
+		rt_printf("it=%f,iv=%f,iv/it=%f.\r\n",it,iv,iv/it);
 	#endif
 	}
 	
@@ -745,8 +751,13 @@ int protect_amp_lx_js(int sw)
 	r = 1;
 	for(i=0; i<CFG_ADC_DOTS_PER_PERIOD/2; i++)
 	{
+		#if 0
 		v = *(s16 *)((u32)(dots+i)&CFG_ADC_BUF_MASK);
 		v+= *(s16 *)((u32)(dots+i+CFG_ADC_DOTS_PER_PERIOD/2)&CFG_ADC_BUF_MASK);
+		#else
+		v = *(dots+i);
+		v+= *(dots+i+CFG_ADC_DOTS_PER_PERIOD/2);
+		#endif
 		v = abs(v);
 		if(v >= threshold) // 如果系数设置为0,则幅值加速没有效果。
 		{
@@ -757,15 +768,15 @@ int protect_amp_lx_js(int sw)
 	}
 
 	{
-		float it,iv;
+		// float it,iv;
 //		it = (float)_Mul_Div_U(threshold*Q16_BASE, 256, g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k);
 //		iv = (float)_Mul_Div_U(v*Q16_BASE, 256, g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k);
-		it = (float)threshold*256/g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k;
-		iv = (float)v*256/g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k;
+		// it = (float)threshold*256/g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k;
+		// iv = (float)v*256/g_ui[UI_SW_INDEX_BEGIN(sw)].m2_factor_k;
 
 	#if 0   // modify for xxxxxx 当输入量在保护定值的边界值时,会反复打印,导致装置重启
 		rt_printf("lx_threshold=%d,v=%d,r=%d,m2_max=%d,fFZLBXS=%f.\r\n",threshold,v,r,m2_max,pRunSet->fFZLBXS);
-		rt_printf_time("lx_it=%f,iv=%f,iv/it=%f.\r\n",it,iv,iv/it);
+		rt_printf("lx_it=%f,iv=%f,iv/it=%f.\r\n",it,iv,iv/it);
 	#endif
 	}
 	
@@ -974,7 +985,8 @@ static int _protect_amp_qd(u32  dStep)
 								|| pR->tPLJL.sta.bFlag.bQD			// 频率解列								
 								|| pR->tXXTZ.uZOV.bFlag.bQD			// 选线跳闸
 								|| pR->tLostVot.uLostVot.bFlag.bQD	// 失压分闸
-								|| pR->tOVER_U0TZ.uZOV.bFlag.bTz   //过零序电压跳闸
+								|| pR->tOVER_U0TZ.uZOV.bFlag.bTz    //过零序电压跳闸
+								|| pR->tU0GZ.sta.bFlag.bQD			// 零压跳闸
 							#ifndef GW_AREA_MAIN_2021
 								|| pR->tOC[FA_GL].sta.bFlag.bQD
 								|| pR->tOC[FA_GL_II].sta.bFlag.bQD
@@ -1028,7 +1040,7 @@ static int _protect_amp_qd(u32  dStep)
 		{
 			rt_stat_in(&pR->fz_stat, ustimer_get_duration(pR->us_fz)/USTIMER_US);
 		}
-		rt_printf_time("开关%d辐值启动(bFZJS=%d)\r\n", sw,bFZJS);
+		rt_printf("开关%d辐值启动(bFZJS=%d)\r\n", sw,bFZJS);
 	}  	
 	return 0;
 }
@@ -1139,7 +1151,7 @@ static int _protect_gzcl_init(void)
 		{
 			PreSetTime(&poc->tQDTime, T_10ms+T_5ms);  
 			PreSetTime(&poc->tQD25ms, T_10ms);  
-			//rt_printf_time("dT = %d\r\n",dTCounter);
+			//rt_printf("dT = %d\r\n",dTCounter);
 		}
 	#ifdef YX_RESET_TIME		
 		if(pRunSet->dT_ZZFG>tRunPara.dTEventRst)
@@ -1357,12 +1369,13 @@ static int _protect_zzfg_check(u32 dStep)
 		||pR->tDYJL.sta.bFlag.bQD
 		||pR->tPLJL.sta.bFlag.bQD		
 		|| pR->tXXTZ.uZOV.bFlag.bQD			// 选线跳闸
-		//||pR->tCHZ.sta.bFlag.bQDFG			// 重合闸保护启动202004
+		||pR->tCHZ.sta.bFlag.bQDFG			// 重合闸保护启动202004 //用回旧的复归逻辑
 		||pR->tCHZ.sta.bFlag.bCHQD			// 重合闸保护启动
 		||pR->tLostVot.uLostVot.bFlag.bQD	// 失压分闸保护启动
 		||pR->tTQHz.uTQHz.bFlag.bQD			// 合环保护启动
 		||pR->tTQHz.uTQHz.bFlag.bLock		// 合环闭锁启动
 		||pR->tOVER_U0TZ.uZOV.bFlag.bTz	// 过零序电压跳闸
+		||pR->tU0GZ.sta.bFlag.bQD			// 零压保护启动
 	#ifdef FUN_JDXX
 		|| pR->tJD.sta.bFlag.bTz			// 接地选线跳  
 	#endif
@@ -1522,7 +1535,7 @@ static int _protect_zzfg(void)
 	pR->fzqd = 0;
 	pR->fzdz = 0;
 	pR->fzzzdz = 0;
-	rt_printf_time("开关%d整组复归\r\n", sw);	
+	rt_printf("开关%d整组复归\r\n", sw);	
 	return 0;
 }
 
@@ -1590,6 +1603,7 @@ static int _protect_sw_tz(u32 dStep)
 			||pR->tPLJL.sta.bFlag.bTz
 			||pR->tOVER_U0TZ.uZOV.bFlag.bTz	// 过零序电压跳闸
 			||pR->tLostVot.uLostVot.bFlag.bTz	//失压分闸
+			||pR->tU0GZ.sta.bFlag.bTz		//零压分闸
 		#ifdef FUN_JDXX
 		|| pR->tJD.sta.bFlag.bTz			// 接地选线跳
 		#endif
@@ -2419,6 +2433,7 @@ static bool _protect_check_fault(int sw)
 		|| pR->tPLJL.sta.bFlag.bTz
 		|| pR->tLostVot.uLostVot.bFlag.bTz
 		||pR->tOVER_U0TZ.uZOV.bFlag.bTz	// 过零序电压跳闸
+		|| pR->tU0GZ.sta.bFlag.bTz
 	#ifdef FUN_JDXX
 		|| pR->tJD.sta.bFlag.bTz		// 接地选线跳
 	#endif

+ 3 - 1
dtu/dtu_main_t536/app/protect.h

@@ -450,7 +450,9 @@ typedef struct TRELAY_T  // 
 #ifdef	CUSTOMIZE_BZT //구菱尻
 	TBZT_T		tBzt;
 #endif	
-
+#ifdef GW_AREA_MAIN_2021
+	TVOL_T		tU0GZ;				// 쥐箕믐崍
+#endif
 	TLOSTVOT_T	tLostVot;   		//呵箕깃羚
 	TU0_T		tU0TZ;			//북빈쥐箕契螺
 	TU0_T		tXXTZ;			//朞窟契螺

+ 2 - 2
dtu/dtu_main_t536/app/reclose.c

@@ -185,7 +185,7 @@ static void AR_Recharge(DWORD  dStep)
 		if((g_disp_flag.chz_cd & (1<<sw)) == 0)
 		{
 			g_disp_flag.chz_cd |= 1<<sw;
-			rt_printf_time("开关%02d充电完成!\r\n",sw+1);
+			rt_printf("开关%02d充电完成!\r\n",sw+1);
 
 			if(soe_check(EV_SW_AR_CHARGE_DONE+sw*EV_SW_NUM)==false)
 			{
@@ -205,7 +205,7 @@ static void AR_Recharge(DWORD  dStep)
 		if((g_disp_flag.chz_cd & (1<<sw)))
 		{
 			g_disp_flag.chz_cd &= ~(1<<sw);
-			rt_printf_time("开关%02d放电完成!\r\n",sw+1);
+			rt_printf("开关%02d放电完成!\r\n",sw+1);
 
 			if(soe_check(EV_SW_AR_CHARGE_DONE+sw*EV_SW_NUM)==true)
 			{

+ 19 - 10
dtu/dtu_main_t536/app/record.c

@@ -305,8 +305,9 @@ extern float g_freq;
 char wave_name[RECORD_FILES_MAX][40];	
 
 int g_wave_filetype = 1; //录波文件格式.默认是BINARY
+#ifndef GW_AREA_MAIN_2021
 bool g_rcd_type_enable[RECORD_TYPE_NUM];
-
+#endif
 
 /*------------------------------ 函数声明 -------------------------------------
 */
@@ -1414,9 +1415,14 @@ int rcd_start(u32 sw, u32 type,u32 waves)
 	{
 		return -3;
 	}
+#ifndef GW_AREA_MAIN_2021
 	if(g_rcd_type_enable[type] == 0)
+#else
+	if(pRunSet->tSwSet[sw].bTT_rcd_type[type] == 0)
+#endif
 	{
-	#ifdef XDL_ZT
+	// #ifdef XDL_ZT
+	#if 0
 		TSETSW *pSet = &pRunSet->tSwSet[sw];
 
 		if((BH_ALL_EN(sw)) == 0)
@@ -1424,10 +1430,8 @@ int rcd_start(u32 sw, u32 type,u32 waves)
 			return -4;
 		}
 
-		// if((type == RECORD_TYPE_LLTB && pSet->bTT_xdlqd == XDL_QD_I0)
-		// || (type == RECORD_TYPE_LXDY && pSet->bTT_xdlqd == XDL_QD_U0))
-		// TODO 小电流录波类型判断 EWen
-		if(1)
+		if((type == RECORD_TYPE_LLTB && pSet->bTT_xdlqd == XDL_QD_I0)
+		|| (type == RECORD_TYPE_LXDY && pSet->bTT_xdlqd == XDL_QD_U0))
 		{
 		}
 		else
@@ -1483,7 +1487,9 @@ int rcd_start(u32 sw, u32 type,u32 waves)
 	// 获取时间点,通过关中断保证时间的一致性
 	rt_irq_save(flags);
 #ifdef CPU_FUXI
-	ts=ts_adc_dots[g_adc_dots_index];
+	// ts=ts_adc_dots[g_adc_dots_index];
+	// 目前时间戳没有通过共享内存记录r核的时间,此处采用gps_get_time,但是现在采样点5ms更新一次,因此此处的时间最大可能出现5ms误差
+	gps_get_time(&ts); 
 #else
 	gps_get_time(&ts);
 #endif	
@@ -2572,9 +2578,12 @@ int _rcd_save(struct rcd *prcd)
 		{
 			TSETSW *pSet = &pRunSet->tSwSet[sw];
 			// 如果录波类型和启动类型一起,调用小电流接地判断函数
-			// if((prcd->type == RECORD_TYPE_LLTB && pSet->bTT_xdlqd == XDL_QD_I0)
-			// || (prcd->type == RECORD_TYPE_LXDY && pSet->bTT_xdlqd == XDL_QD_U0))
-			// TODO 小电流录波类型判断 EWen
+			#ifndef GW_AREA_MAIN_2021
+			if((prcd->type == RECORD_TYPE_LLTB && pSet->bTT_xdlqd == XDL_QD_I0)
+			|| (prcd->type == RECORD_TYPE_LXDY && pSet->bTT_xdlqd == XDL_QD_U0))
+			#else
+			if(prcd->type == RECORD_TYPE_JDGZ)
+			#endif
 			{
 				xdl_proc_adc(sw,prcd->dt_begin*ADC_REC_SAMPLE_RATE,&prcd->ts_begin);
 			}

+ 4 - 1
dtu/dtu_main_t536/app/record.h

@@ -25,7 +25,6 @@ enum
 {
 	RECORD_TYPE_SD,       	// 录波类型为手动
 	RECORD_TYPE_QD,       	// 录波类型为启动
-	RECORD_TYPE_AR,       	// 录波类型为重合闸
 	RECORD_TYPE_GLGZ,     	// 录波类型为过流故障
 	RECORD_TYPE_XLSY,     	// 录波类型为线路失压
 	RECORD_TYPE_LXDY,     	// 录波类型为零序电压
@@ -34,6 +33,8 @@ enum
 	RECORD_TYPE_CHZ,   		// 录波类型为重合闸
 	RECORD_TYPE_DLGZ,   	// 录波类型为短路故障
 	RECORD_TYPE_KGBW,   	// 录波类型为开关变位
+	RECORD_TYPE_JDGZ,   	// 录波类型为接地故障
+	RECORD_TYPE_LYTB,		// 录波类型为零压突变
 #ifdef FUN_JDXX
 	RECORD_TYPE_XDLJD,		// 录波类型为小电流接地
 #endif
@@ -50,7 +51,9 @@ enum
 */
 extern int g_wave_filetype;
 extern char wave_name[RECORD_FILES_MAX][40];
+#ifndef GW_AREA_MAIN_2021
 extern bool g_rcd_type_enable[RECORD_TYPE_NUM];
+#endif
 
 int rcd_init(void);
 int rcd_exit(void);

+ 45 - 18
dtu/dtu_main_t536/app/run_status.c

@@ -206,7 +206,7 @@ int run_status_init(void)
 		{
 			prun->tw = 0;
 		}
-
+	#ifndef GW_AREA_MAIN_2021	
 		// 合闸位置无配置,置无效
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_HZWZ] == INDEX_INVALLID)
 		{
@@ -217,7 +217,7 @@ int run_status_init(void)
 		{
 			prun->tzw = 0;
 		}
-
+	#endif
 	#ifdef SWITCH_GLJD_LED		
 		// 隔离刀闸无配置,置无效
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_GLDZ1] == INDEX_INVALLID)
@@ -266,7 +266,7 @@ int run_status_init(void)
 			prun->sw_sf = 0;
 		}
 
-
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_BHZTT] == INDEX_INVALLID)
 		{
 			prun->bhztt = 1;
@@ -277,7 +277,19 @@ int run_status_init(void)
 		{
 			prun->bhtt = prun->bhztt;
 		}
+	#else
+		// 保护投退无配置,置合
+		if ((short)g_sw[sw].di_cfg_index[SW_DI_BHTT] == INDEX_INVALLID)
+		{
+			prun->bhtt = 1;
+		}
 
+		// 重合闸无配置,置合
+		if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] == INDEX_INVALLID)
+		{
+			prun->chz = 1;
+		}
+	#endif
 	#ifdef JZS_FUNCTION
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_JZS_TT] == INDEX_INVALLID)
 		{
@@ -290,7 +302,7 @@ int run_status_init(void)
 		{
 			prun->fatt = prun->bhztt;
 		}
-		
+	#ifndef GW_AREA_MAIN_2021	
 		// 就地FA闭锁压板
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT] == INDEX_INVALLID)
 		{
@@ -305,13 +317,13 @@ int run_status_init(void)
 			prun->fa_g_tt = prun->bhztt;
 		#endif
 		}		
-		
+	#endif
 		// 重合闸无配置,置合
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] == INDEX_INVALLID)
 		{
 			prun->chzyb = 1;
 		}
-
+	#ifndef GW_AREA_MAIN_2021
 		// 频率解列压板无配置,置合
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_FREQ_VOL] == INDEX_INVALLID)
 		{
@@ -322,7 +334,8 @@ int run_status_init(void)
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_SAFE_AUTO] == INDEX_INVALLID)
 		{
 			prun->safe_auto = 1;
-		}		
+		}	
+	#endif	
 		prun->fa_start_hz = 1;
 	//#ifdef GD_AREA_ZHUHAI_V2
 	#if	defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
@@ -337,6 +350,7 @@ int run_status_init(void)
 			prun->kgyf = 0;
 		}
 		//  联络分段配置
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_LS] == INDEX_INVALLID)
 		{				
 			#ifndef GW_AREA_MAIN_2021	
@@ -353,7 +367,7 @@ int run_status_init(void)
 		{					
 			prun->bTQ = 1;
 		}	
-
+	#endif
 		prun->tytq = 0;
 		#ifdef TYTQ_DI_YB
 	    if ((short)g_sw[sw].di_cfg_index[SW_DI_TYTQ] == INDEX_INVALLID)
@@ -651,6 +665,7 @@ int  run_status_check(u32 dStep)
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_KRTW]];
 			prun->tw = dido_di_is_on(ecd->slot,ecd->index);
 		}
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_HZWZ] != INDEX_INVALLID)
 		{
 			//g_run_stu.hw[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_KRHW))?1:0;
@@ -663,7 +678,7 @@ int  run_status_check(u32 dStep)
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_TZWZ]];
 			prun->tzw = dido_di_is_on(ecd->slot,ecd->index);
 		}
-
+	#endif
 	#ifdef SWITCH_GLJD_LED
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_GLDZ1] != INDEX_INVALLID)
 		{
@@ -759,7 +774,7 @@ int  run_status_check(u32 dStep)
 		{
 			prun->sw = 0;
 		}
-
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_BHZTT] != INDEX_INVALLID)
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BHZTT]];
@@ -769,11 +784,15 @@ int  run_status_check(u32 dStep)
 				prun->bhztt= !prun->bhztt;
 			#endif	
 		}
-
+	#endif
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_BHTT] != INDEX_INVALLID)
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BHTT]];
+			#ifndef GW_AREA_MAIN_2021
 			prun->bhtt = dido_di_is_on(ecd->slot,ecd->index)&&prun->bhztt;
+			#else
+			prun->bhtt = dido_di_is_on(ecd->slot,ecd->index);
+			#endif
 			prun->bh_yx = dido_di_is_on(ecd->slot,ecd->index);
 		}
 
@@ -783,7 +802,14 @@ int  run_status_check(u32 dStep)
 			prun->fatt = dido_di_is_on(ecd->slot,ecd->index)&&prun->bhztt;
 			prun->fa_yx = dido_di_is_on(ecd->slot,ecd->index);
 		}
-		
+	#ifdef GW_AREA_MAIN_2021
+		if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] != INDEX_INVALLID)
+		{
+			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_CHZ]];
+			prun->chz = dido_di_is_on(ecd->slot,ecd->index);
+		}
+	#endif
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT] != INDEX_INVALLID )
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT]];
@@ -801,12 +827,13 @@ int  run_status_check(u32 dStep)
 		#endif
 			prun->fa_g_yx = dido_di_is_on(ecd->slot,ecd->index);
 		}
-		
+	#endif
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] != INDEX_INVALLID)
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_CHZ]];
 			prun->chzyb = (dido_di_is_on(ecd->slot,ecd->index));
 		}
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_FREQ_VOL] != INDEX_INVALLID)
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FREQ_VOL]];
@@ -816,14 +843,14 @@ int  run_status_check(u32 dStep)
 				prun->freq_vol = !prun->freq_vol;
 			#endif
 		}
-
-		
+	#endif
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_SAFE_AUTO] != INDEX_INVALLID)
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_SAFE_AUTO]];
 			prun->safe_auto = dido_di_is_on(ecd->slot,ecd->index);
 		}
-
+	#endif
 	#ifdef JZS_FUNCTION
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_JZS_TT] != INDEX_INVALLID)
 		{
@@ -847,6 +874,7 @@ int  run_status_check(u32 dStep)
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_KGYF]];
 			prun->kgyf= dido_di_is_on(ecd->slot,ecd->index);
 		}
+	#ifndef GW_AREA_MAIN_2021
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_LS] != INDEX_INVALLID)
 		{
 			 int dat;
@@ -860,7 +888,6 @@ int  run_status_check(u32 dStep)
 			prun->fa_ls = pRunSet->tSwSet[sw].bTT_fa_LL;
 			#endif
 		}
-
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_BSCH] != INDEX_INVALLID)
 		{
 			ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BSCH]];
@@ -876,7 +903,7 @@ int  run_status_check(u32 dStep)
 				prun->bTQ = !prun->bTQ;
 			#endif
 		}
-
+	#endif
 		#ifdef TYTQ_DI_YB
 		if ((short)g_sw[sw].di_cfg_index[SW_DI_TYTQ] != INDEX_INVALLID)
 		{

+ 0 - 1
dtu/dtu_main_t536/app/run_status.h

@@ -154,7 +154,6 @@ typedef struct run_stu_sw
 	u8 jzs_tt;		//集中式投退
 #endif
 #ifdef GW_AREA_MAIN_2021
-	// TODO 赋值 EWen
 	u8 chz;		// 重合闸
 #endif
 	u8 bhtt;	// 常规保护投退

+ 1 - 1
dtu/dtu_main_t536/app/samint.c

@@ -100,7 +100,7 @@ void  GetDcAdcValue(int dstep);
 int  pit_5ms_main(int dummy)
 {
 	soe_test();
-	
+	can_app_timing();
 	// 保护巡检
 	// ADC所有采样点准备好了,sw_init成功,才能进入保护。
 	// g_adc_sync在两种情况下起作用,1、系统初始化;2、采样频率改变。

+ 10 - 8
dtu/dtu_main_t536/app/set.c

@@ -2949,6 +2949,7 @@ const  TSETTABLE tCstSetTable[]=   	// min       max        default
 	
 	{SETTYPE_LABEL,	SET_NULL,	"录波功能", 			0 , 	0,				0 ,		0,		0,			GROUP_CSTSET_RECORD,0x0000, NULL_R},
 	{SETTYPE_LIST,	SET_NULL,	"文件格式", 		0 , 	WFListNum-1,	1 ,		WFList,	WFListNum,	GROUP_CSTSET_RECORD,0x0000, UINT_R},
+#ifndef GW_AREA_MAIN_2021
 	{SETTYPE_LIST,	SET_NULL,	"过流故障启动", 	0 , 	TTListNum-1,	0 ,		TTList,	TTListNum,	GROUP_CSTSET_RECORD,0x0000, BOOL_R},
 	{SETTYPE_LIST,	SET_NULL,	"线路失压启动", 	0 , 	TTListNum-1,	0 ,		TTList,	TTListNum,	GROUP_CSTSET_RECORD,0x0000, BOOL_R},
 	{SETTYPE_LIST,	SET_NULL,	"零序电压启动", 	0 , 	TTListNum-1,	0 ,		TTList,	TTListNum,	GROUP_CSTSET_RECORD,0x0000, BOOL_R},
@@ -2958,7 +2959,7 @@ const  TSETTABLE tCstSetTable[]=   	// min       max        default
 #ifdef FUN_JDXX
 	{SETTYPE_LIST,	SET_NULL,	"小电流接地启动",		0 , 	TTListNum-1,	1 , 	TTList, TTListNum,	GROUP_CSTSET_RECORD,0x0000, BOOL_R},
 #endif
-
+#endif
 	{SETTYPE_LABEL,	SET_NULL,	"辅助定值", 			0 , 	0,				0 ,		0,		0,			GROUP_CSTSET_OTHERS,0x0000, NULL_R},
 	{SETTYPE_UINT,	SET_S,		"未储能时间",		1 , 	30,				20 ,	0,		0,			GROUP_CSTSET_OTHERS,0x0000, UINT_R},
 	{SETTYPE_UINT,	SET_S,		"失电闭锁遥信时间",	0 , 	65535,			0 ,		0,		0,			GROUP_CSTSET_OTHERS,0x0000, UINT_R},
@@ -4057,6 +4058,7 @@ bool  MakeRunSet(bool bFirst)
 #endif	
 	// 录波
 	g_wave_filetype = (int)psetbuf[CSTSET_WAVE_FILETYPE].ff; //录波文件格式
+#ifndef GW_AREA_MAIN_2021
 	g_rcd_type_enable[RECORD_TYPE_SD]	= 1;
 	g_rcd_type_enable[RECORD_TYPE_QD] 	= 1;
 	g_rcd_type_enable[RECORD_TYPE_GLGZ] = ((WORD)psetbuf[CSTSET_WAVE_GLGZ].ff==1 )?true:false;	
@@ -4068,7 +4070,7 @@ bool  MakeRunSet(bool bFirst)
 #ifdef FUN_JDXX
 	g_rcd_type_enable[RECORD_TYPE_XDLJD]  = ((WORD)psetbuf[SET_WAVE_XDLJD].ff==1 )?true:false;
 #endif
-
+#endif
 	ptSet->dWCN_T		=GetSetTIME(psetbuf[CSTSET_WCNALARM_T].ff);      			// 未储能告警时间
 	ptSet->dSDYX_T		=GetSetTIME(psetbuf[CSTSET_SD_YX_T].ff);      				// 失电闭锁遥信时间
 	ptSet->bat_chargeok_time = psetbuf[CSTSET_CHARGEOK_TIME].ff;
@@ -5058,10 +5060,9 @@ bool  MakeRunSet(bool bFirst)
 		ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_CHZ]  = ((WORD)psetbuf[SET_WAVE_CHZ_TT  + buf_offset].ff==1 )?true:false;
 		ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_KGBW] = ((WORD)psetbuf[SET_WAVE_KGBW_TT + buf_offset].ff==1 )?true:false;
 		ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_DLGZ] = ((WORD)psetbuf[SET_WAVE_DLGZ_TT + buf_offset].ff==1 )?true:false;
-		//TODO 增加定值对接 EWen
-		// ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_JDGZ] = ((WORD)psetbuf[SET_WAVE_JDGZ_TT + buf_offset].ff==1 )?true:false;
-		// ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_LYTB] = ((WORD)psetbuf[SET_WAVE_LYTB_TT + buf_offset].ff==1 )?true:false;
-
+		ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_JDGZ] = ((WORD)psetbuf[SET_WAVE_JDGZ_TT + buf_offset].ff==1 )?true:false;
+		ptSet->tSwSet[sw].bTT_rcd_type[RECORD_TYPE_LYTB] = ((WORD)psetbuf[SET_WAVE_LYTB_TT + buf_offset].ff==1 )?true:false;
+// 
 		ptSet->tSwSet[sw].dU_u0TB = (DWORD)(psetbuf[SET_U0_TB + sw*SW_SET_NUMBER].ff*65536);
 		ptSet->tSwSet[sw].dI_i0TB = (DWORD)(psetbuf[SET_I0_TB + sw*SW_SET_NUMBER].ff*65536);
 		// ptSet->tSwSet[sw].dU_u0TB    = GetSetSQR(psetbuf[SET_U0_TB + sw*SW_SET_NUMBER].ff, fKU[PUB_AC_U01]);
@@ -5103,9 +5104,9 @@ bool  MakeRunSet(bool bFirst)
 		ptSet->tSwSet[sw].dFZTimes	= GetSetTIME(psetbuf[SET_FZ_TIME+sw*SW_SET_NUMBER].ff);
 
 	#if defined (SET_PROFE_2XB_PERCENT)
-		ptSet->tSwSet[sw].dXBCOE 	= GetSetSQR(psetbuf[SET_2XBCOE +sw*SW_SET_NUMBER].ff/100, 256);  // 二次谐波制动系数
+		ptSet->tSwSet[sw].dXBCOE 	= GetSetSQR((psetbuf[SET_2XBCOE +sw*SW_SET_NUMBER].ff-2.0)/100, 256);  // 二次谐波制动系数
 	#else
-	  	ptSet->tSwSet[sw].dXBCOE 	= GetSetSQR(psetbuf[SET_2XBCOE +sw*SW_SET_NUMBER].ff, 256);  	// 二次谐波制动系数
+	  	ptSet->tSwSet[sw].dXBCOE 	= GetSetSQR(psetbuf[SET_2XBCOE +sw*SW_SET_NUMBER].ff-0.02, 256);  	// 二次谐波制动系数
 	#endif
 		ptSet->tSwSet[sw].bTT_2XBBS=((WORD)psetbuf[SET_TT_2XB+sw*SW_SET_NUMBER].ff==1 )?true:false;  	// 二次谐波制动
 
@@ -7031,6 +7032,7 @@ void MakeRunPara(bool bFirstInit, bool bUboot)
 #ifdef YX_RESET_TIME
 	pRunPara->dTEventRst=GetSetTIME(psetbuf[PARA_EVTRSTTIME].ff);
 #endif
+	pRunPara->fT_LBXH_RST= psetbuf[PARA_EVTRSTTIME].ff;
 	if(pRunPara->dTBatBegin != dat)
 	{
 		pRunPara->dTBatBegin = dat;

+ 3 - 2
dtu/dtu_main_t536/app/set.h

@@ -1930,6 +1930,7 @@ enum
 	//录波内部定值
 	CSTSET_WAVE_RECORD_LABEL,		//列表名
 	CSTSET_WAVE_FILETYPE,	// 录波文件格式
+#ifndef GW_AREA_MAIN_2021
 	CSTSET_WAVE_GLGZ, 		// 过流故障
 	CSTSET_WAVE_XLSY,  		// 线路失压
 	CSTSET_WAVE_LXDY,		// 零序电压
@@ -1939,7 +1940,7 @@ enum
 #ifdef FUN_JDXX
 	SET_WAVE_XDLJD, 	// 小电流接地
 #endif
-	
+#endif
 	// 其它类内部定值
 	CSTSET_LABEL_OTHERS,		//列表名
 	CSTSET_WCNALARM_T,      // 未储能告警时间
@@ -2832,7 +2833,7 @@ volatile	DWORD 	ip104Link[CFG_LINK_104_NUM];		// 104
 #ifdef YX_RESET_TIME
 	DWORD	dTEventRst;		//故障遥信保持时间
 #endif
-
+	float 	fT_LBXH_RST;	// 录波信号返回时间
 	WORD	wYXFD;			// 遥信防抖时间
 	WORD	wFZMC;			// 分闸脉冲时间
 	WORD	wHZMC;			// 合闸脉冲时间

+ 55 - 43
dtu/dtu_main_t536/app/switch.c

@@ -65,60 +65,71 @@ const s8 * g_sw_di_name[SW_DI_NUM] =
 	"弹簧未储能",  // 5
 	"弹簧已储能",  // 5
 #else
-	"弹簧储能位",  // 5
+	"弹簧未储能",  // 5
 #endif	
 	"气压低",			  // 6
+#ifndef GW_AREA_MAIN_2021
 	"HQ开入",  // 7
 	"TQ开入",	  // 8
+#endif
 	"电源侧瞬压",  // 9
 	"负荷侧瞬压",  // 10
 	"手动合闸",  // 11
 	"手动分闸",  // 12
-//#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用FA及保护
-#if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护
-	"停用FA及保护",
+#ifdef GW_AREA_MAIN_2021
+	"开关远方",
+	"保护压板",
+	"重合闸压板",
+	"就地FA压板",
+	"控制回路报警",
+	"板卡在线监测",
 #else
-	"保护总功能投入",
-#endif
 
-#ifdef GD_AREA_MAIN_2020
-    "常规保护压板", //13
-    "重合闸投入压板",  // 14
-    "馈线自动化压板",  // 15
-    "智能分布式压板",  // 16
-#elif defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
-	"常规保护压板", //13
-	"重合闸投入压板",  // 14
-	"常规FA压板",  // 15
-	"智能分布式FA压板",  // 16
-#else
-	"常规保护压板", //13
-	"重合闸投入压板",  // 14
-	"就地FA压板",  // 15
-	"智能FA压板",  // 16
-#endif
+	//#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用FA及保护
+	#if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护
+		"停用FA及保护",
+	#else
+		"保护总功能投入",
+	#endif
 
-	"联络/分段模式",  // 17
-	"开关远方",  // 18
-	"闭锁重合闸",  // 19
-//#ifdef GD_AREA_ECZD_2020
-#if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护
-	"停用同期压板",  // 20
-#else
-	"同期压板",  // 20
-#endif
-	"控制回路断线", // 21
-	"脉冲计数1",  // 22
-	"脉冲计数2",  // 23	
-	"就地FA闭锁压板",//"开入8",// 31
-#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用解列压板
-	"停用自动解列功能压板",
-#elif defined GD_AREA_MAIN_2020
-    "停用解列功能压板",
-#else
-	"频率电压解列压板",
-#endif
+	#ifdef GD_AREA_MAIN_2020
+		"常规保护压板", //13
+		"重合闸投入压板",  // 14
+		"馈线自动化压板",  // 15
+		"智能分布式压板",  // 16
+	#elif defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020
+		"常规保护压板", //13
+		"重合闸投入压板",  // 14
+		"常规FA压板",  // 15
+		"智能分布式FA压板",  // 16
+	#else
+		"常规保护压板", //13
+		"重合闸投入压板",  // 14
+		"就地FA压板",  // 15
+		"智能FA压板",  // 16
+	#endif
 
+		"联络/分段模式",  // 17
+		"开关远方",  // 18
+		"闭锁重合闸",  // 19
+	//#ifdef GD_AREA_ECZD_2020
+	#if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护
+		"停用同期压板",  // 20
+	#else
+		"同期压板",  // 20
+	#endif
+		"控制回路断线", // 21
+		"脉冲计数1",  // 22
+		"脉冲计数2",  // 23	
+		"就地FA闭锁压板",//"开入8",// 31
+	#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用解列压板
+		"停用自动解列功能压板",
+	#elif defined GD_AREA_MAIN_2020
+		"停用解列功能压板",
+	#else
+		"频率电压解列压板",
+	#endif
+#endif
 	#ifdef TYTQ_DI_YB
     "停用检同期压板",     // 24
     #else
@@ -142,8 +153,9 @@ const s8 * g_sw_di_name[SW_DI_NUM] =
 #else
 	"开入4",// 27
 #endif
-	
+#ifndef GW_AREA_MAIN_2021	
 	"安全自动控制压板",
+#endif
 #ifdef BS_FAL_DI_YB
 	"闭锁FA联络压板",
 #endif

+ 14 - 2
dtu/dtu_main_t536/app/switch.h

@@ -52,19 +52,29 @@ enum
 {
 	SW_DI_KRHW = 0,	// 合位
 	SW_DI_KRTW,		// 跳位
-	SW_DI_GLDZ1,		// 隔离刀闸
+	SW_DI_GLDZ1,	// 隔离刀闸
 	SW_DI_JDDZ,		// 接地刀闸
 	SW_DI_CN,		// 弹簧未储能	
 #ifdef DISP_DOUBLE_CN
 	SW_DI_YCN,		// 弹簧已储能
 #endif
 	SW_DI_QYD,		// SF6气压低
+#ifndef GW_AREA_MAIN_2021
 	SW_DI_TZWZ,
 	SW_DI_HZWZ,
+#endif
 	SW_DI_PT1SY,	// PT1瞬压
 	SW_DI_PT2SY,	// PT2瞬压
 	SW_DI_SH,		// 手动合闸
 	SW_DI_SF,		// 手动分闸
+#ifdef GW_AREA_MAIN_2021
+	SW_DI_KGYF, 	// 开关远方
+	SW_DI_BHTT,		// 常规保护投退压板
+	SW_DI_CHZ,		// 重合闸压板
+	SW_DI_FA_TT,	// 就地FA压板
+	SW_DI_KZDX,		// 控制回路告警
+	SW_DI_BKJS,		// 板卡在线监测
+#else
 	SW_DI_BHZTT,	// 保护总功能投退压板
 	SW_DI_BHTT,		// 常规保护投退压板
 	SW_DI_CHZ,		// 重合闸压板
@@ -79,6 +89,7 @@ enum
 	SW_DI_IMP2,	// 23
 	SW_DI_FA_BS_TT,//就地FA闭锁压板//SW_DI_31,
 	SW_DI_FREQ_VOL,	//频率电压解列功能投入
+#endif
 #ifdef TYTQ_DI_YB
     SW_DI_TYTQ,   //停用检同期
 #else
@@ -104,8 +115,9 @@ enum
 #else
 	SW_DI_27,
 #endif
+#ifndef GW_AREA_MAIN_2021
 	SW_DI_SAFE_AUTO,	//安全自动控制
-
+#endif
 #ifdef BS_FAL_DI_YB
     SW_DI_BS_FAL,         //闭锁FA联络
 #endif

+ 72 - 0
dtu/dtu_main_t536/app/vol.c

@@ -1863,6 +1863,78 @@ void Pro_PTDxTz(int sw,DWORD  dStep)
 		}			
 	} 
 }
+
+/**************************************************************************
+函数名称:Pro_U0Tz
+函数版本:1.00 
+作者:    赵海洋
+创建日期:2022.2.25   
+函数功能说明:零压跳闸默认检测零压1
+输入参数:
+其他输入:
+输出参数:
+返回值: 
+***************************************************************************/
+void Pro_U0Tz(int sw,DWORD  dStep)
+{
+	bool  bQDD; 
+	TRELAY_T *pR=&g_tRelay[sw];
+	TVOL_T *pvol = &pR->tU0GZ;
+	VOL_SET *pSet = &pRunSet->tSwSet[sw].tU0Set;
+	
+	bQDD = OverRelay(g_ui[PUB_AC_U01].m2[0], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD); 
+	pvol->sta.bFlag.bQD = ((pSet->bTT || pSet->bTz)&& bQDD);
+
+	if(pvol->sta.bFlag.bQD)
+	{
+		if(!pvol->sta.bFlag.bQDWave)
+		{
+			rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD); 	//录波类型:跳闸类
+			pvol->sta.bFlag.bQDWave = true;
+		}
+	}
+	/***********动作*********************************/
+	RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);		
+	if (pSet->bTT)pvol->sta.bFlag.bGj = pvol->tQDTime.boolTrip;
+	if (pSet->bTz)pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
+	
+	/************事件记录及出口****************************/
+	if(pvol->sta.bFlag.bGj) 
+	{
+		if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==false)	
+		{
+			DWORD U0;
+			U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
+			soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,1, U0,0,0);                                          
+		}
+	}
+	else
+	{
+		if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==true)			
+		{
+			pvol->sta.bFlag.bQDWave = false;
+			soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,0, 0,0,0 );                                          
+		}			
+	} 
+
+	if(pvol->sta.bFlag.bTz) 
+	{
+		if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==false)	
+		{
+			DWORD U0;
+			U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
+			soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,1, U0,0,0);                                          
+		}
+	}
+	else
+	{
+		if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==true)			
+		{
+			pvol->sta.bFlag.bQDWave = false;
+			soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,0, 0,0,0 );                                          
+		}			
+	} 
+}
 #endif
 // = ========================= 本文件结束 =============================
 

Datei-Diff unterdrückt, da er zu groß ist
+ 3110 - 3
dtu/dtu_main_t536/app/xdljd.c


+ 2 - 0
dtu/dtu_main_t536/sh/t536/Makefile

@@ -22,6 +22,7 @@ CFLAGS += -I$(PRJ_PWD)/tmp/app_public/gps
 CFLAGS += -I$(PRJ_PWD)/tmp/app_public/xdljd
 CFLAGS += -I$(PRJ_PWD)/tmp/app_public/sys_api
 CFLAGS += -I$(PRJ_PWD)/tmp/app_public/bluetooth
+CFLAGS += -I$(PRJ_PWD)/tmp/app_public/wavelib
 CFLAGS += -I$(PRJ_PWD)/tmp/xenomai/include
 CFLAGS += -I$(PRJ_PWD)/tmp/xenomai/include/xenomai
 CFLAGS += -I$(PRJ_PWD)/tmp/xenomai/include/xenomai/cobalt
@@ -178,6 +179,7 @@ OBJS =  main_mod.o \
 		tmp/app_public/gps/gps_uart.o \
 		tmp/app_public/sys_api/sys_api.o\
 		tmp/app_public/bluetooth/bluetooth.o\
+		tmp/app_public/wavelib/wavelib.o\
 		\
 		tmp/xenomai/lib/xenomai/bootstrap.o\
 		tmp/fuxi_bsp/source/shmem.o \

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.