Просмотр исходного кода

增加 : 遥信点表点号;

lch 8 месяцев назад
Родитель
Сommit
eb83f4e206

+ 2 - 1
README.md

@@ -55,4 +55,5 @@
 # 202512(22-28)
 01. 修改 : 对接开入量数据;
 02. 增加 : ch423s驱动;
-03. 修改 : 按照南网文件修改自动化参数;
+03. 修改 : 按照南网文件修改自动化参数;
+04. 增加 : 遥信点表点号;

+ 87 - 13
dtu/dtu_main_t536/app/Appconfig.c

@@ -109,28 +109,27 @@ const char *ev_back[]=
 
 /***************************************************************************
 类型定义 
-Bit.7 ==1  故障记录上送
-Bit.6 ==1 作为关键记录,单独保存  by sunxi 20190925
-Bit.5 备用
-Bit.4 ==1 全参数保存
+Bit.7 == 1 故障记录上送
+Bit.6 == 1 关键记录 单独保存 会置位bit4 保存全参数 SOE_TYPE_VIP
+Bit.5 == 1 等至开关分/合位,延迟保存SOE 和宏 SOE_RECORD_DELAY 有关
+Bit.4 == 1 全参数保存
 Bit.3 备用
 Bit.2 备用
-Bit.[10]  事件返回后,显示描述的索引
+Bit.[10]  事件返回后,显示描述的索引 ev_back
 索引定义:
 {
-	"返回",	// ==0
-	"消失",	// ==1
-	"恢复",	// ==2
+	"返回",	 0
+	"消失",	 1
+	"恢复",	 2
+	"退出",	 3
 }
 
-
-
 参数属性 ;
 Bit.[7-5] 显示属性 
 默认为0为定点数,高16位整数低16位小数,保留3位小数点
-#define PARA_TYPE_INT          	(1<<5)//事件显示,类型定义:整数显示
-#define PARA_TYPE_YK           (2<<5)//遥控点号
-#define PARA_TYPE_YB         	(3<<5)//事件显示,类型定义:压板操作
+#define PARA_TYPE_INT   (1 << 5) // 事件显示,类型定义:整数显示
+#define PARA_TYPE_YK    (2 << 5) // 遥控点号
+#define PARA_TYPE_YB    (3 << 5) // 事件显示,类型定义:压板操作
 Bit.[0-4] 参数表的索引,    =0为没有参数。
 ********************************************************************************/
 
@@ -609,6 +608,81 @@ const SOE_DEF tAllSOE[]=
 	{0x04,		{0,        0,        0},    "面板合闸"},
 	{0x04,		{0,        0,        0},    "面板分闸"},
 
+#if (1)
+	{0x00,		{0,				0,			0},				"总保护运行"},
+	{0x00,		{0,				0,			0},				"常规保护运行"},
+	{0x00,		{0,				0,			0},				"FA运行"},
+	{0x00,		{0,				0,			0},				"智能分布式运行"},
+	{0x00,		{0,				0,			0},				"集中式运行"},
+	{0x00,		{0,				0,			0},				"重合闸运行"},
+	{0x00,		{0,	            0,          0},				"功能模式异常"},
+
+	{0x00,		{0,				0,			0},				"常规保护压板"},
+	{0x00,		{0,				0,			0},				"自动重合闸压板"},
+	{0x00,		{0,	            0,	        0},			    "停用重合闸压板"},
+	{0x00,		{0,				0,			0},				"就地馈线自动化压板"},
+	{0x00,		{0,				0,			0},				"智能分布式压板"},
+	{0x00,		{0,				0,			0},				"集中式压板"},
+	{0x00,		{0,				0,			0},				"同期合闸压板"},
+	{0x00,		{0,				0,			0},				"自动解列压板"},
+    {0x00,      {0,             0,          0},             "小电流接地压板"},
+    {0x00,      {0,             0,          0},             "线路断线告警压板"},
+    {0x00,      {0,             0,          0},             "不停电传动压板"},
+    {0x00,      {0,             0,          0},             "功能总投退压板"},
+    {0x00,      {0,             0,          0},             "功能总出口压板"},
+    {0x00,      {0,             0,          0},             "重合闸软压板"},
+    {0x00,      {0,             0,          0},             "远程运维压板"},
+
+    {0x00,      {0,             0,          0},             "过流零流告警投入"},
+    {0x00,      {0,             0,          0},             "常规保护跳闸投入"},
+    {0x00,      {0,             0,          0},             "过流一段投入"},
+    {0x00,      {0,             0,          0},             "过流二段投入"},
+    {0x00,      {0,             0,          0},             "过流三段投入"},
+    {0x00,      {0,             0,          0},             "过流一段方向投入"},
+    {0x00,      {0,             0,          0},             "过流二段方向投入"},
+    {0x00,      {0,             0,          0},             "过流三段方向投入"},
+    {0x00,      {0,             0,          0},             "零流一段投入"},
+    {0x00,      {0,             0,          0},             "零流二段投入"},
+    {0x00,      {0,             0,          0},             "零流三段投入"},
+    {0x00,      {0,             0,          0},             "PT断线投入"},
+    {0x00,      {0,             0,          0},             "后加速投入"},
+    {0x00,      {0,             0,          0},             "过流启动重合投入"},
+    {0x00,      {0,             0,          0},             "零流启动重合投入"},
+    {0x00,      {0,             0,          0},             "涌流识别投入"},
+    {0x00,      {0,             0,          0},             "零压保护投入"},
+    {0x00,      {0,             0,          0},             "一次重合闸投入"},
+    {0x00,      {0,             0,          0},             "二次重合闸投入"},
+    {0x00,      {0,             0,          0},             "重合闸检同期投入"},
+    {0x00,      {0,             0,          0},             "重合闸检无压投入"},
+    {0x00,      {0,             0,          0},             "大电流闭锁重合投入"},
+	{0x00,		{0,	            0,          0},				"分段联络模式"},
+    {0x00,      {0,             0,          0},             "A侧得电延时合投入"},
+    {0x00,      {0,             0,          0},             "B侧得电延时合投入"},
+    {0x00,      {0,             0,          0},             "A侧失电延时合投入"},
+    {0x00,      {0,             0,          0},             "B侧失电延时合投入"},
+    {0x00,      {0,             0,          0},             "合到故障快速分投入"},
+    {0x00,      {0,             0,          0},             "合成功闭锁失压分"},
+    {0x00,      {0,             0,          0},             "FA过流告警投入"},
+    {0x00,      {0,             0,          0},             "FA接地告警投入"},
+    {0x00,      {0,             0,          0},             "合到零序电压保护"},
+    {0x00,      {0,             0,          0},             "非遮断投入"},
+    {0x00,      {0,             0,          0},             "PT断线投入"},
+    {0x00,      {0,             0,          0},             "多次失压分闭锁合"},
+    {0x00,      {0,             0,          0},             "涌流闭锁投入"},
+    {0x00,      {0,             0,          0},             "硬件残压模快投入"},
+    {0x00,      {0,             0,          0},             "分布式FA方式"},
+    {0x00,      {0,             0,          0},             "联络自投投入"},
+    {0x00,      {0,             0,          0},             "过载闭锁自投投入"},
+    {0x00,      {0,             0,          0},             "首开关失压保护投入"},
+    {0x00,      {0,             0,          0},             "智能分布式启动重合"},
+    {0x00,      {0,             0,          0},             "电压解列投入"},
+    {0x00,      {0,             0,          0},             "电压滑差闭锁"},
+    {0x00,      {0,             0,          0},             "频率解列投入"},
+    {0x00,      {0,             0,          0},             "频率滑差闭锁"},
+    {0x00,      {0,             0,          0},             "小电流接地投入"},
+    {0x00,      {0,             0,          0},             "小电流接地启动重合"},
+    {0x00,      {0,             0,          0},             "小电流接地后加速"},
+#endif
 
 	
 /*下面不需要上送后台的操作或提示类的信息*/

+ 84 - 6
dtu/dtu_main_t536/app/Appconfig.h

@@ -63,11 +63,9 @@
 
 
 /*定义事件参数的显示类型*/
-
-#define PARA_TYPE_INT          	(1<<5)//事件显示,类型定义:整数显示
-#define PARA_TYPE_YK          (2<<5)//事件显示,类型定义:通道显示
-#define PARA_TYPE_YB         	(3<<5)//事件显示,类型定义:压板操作
-
+#define PARA_TYPE_INT (1 << 5) // 事件显示,类型定义:整数显示
+#define PARA_TYPE_YK (2 << 5)  // 事件显示,类型定义:通道显示
+#define PARA_TYPE_YB (3 << 5)  // 事件显示,类型定义:压板操作
 
 #define SOE_YX_H	"0->1"
 #define SOE_YX_F	"1->0"
@@ -420,6 +418,7 @@ enum
 
     EV_SW_NUM, //
 };
+
 enum
 {
     EV_PUB_START = EV_SW_NUM * SWITCH_NUM_MAX,
@@ -531,7 +530,86 @@ enum
     EV_LINK_EQU10, // 级联装置10异常
     EV_MB_HZ,      // 面板合闸
     EV_MB_TZ,      // 面板分闸
-    EV_PUB_END,
+
+#if (1)
+    /* 功能遥信 */
+    EV_GENERAL_PRO, /* 总保护运行 */
+    EV_CON_PRO,     /* 常规保护运行 */
+    EV_FA_PRO,      /* FA运行 */
+    EV_DFA_PRO,     /* 智能分布式运行 */
+    EV_CEN_PRO,     /* 集中式运行 */
+    EV_RECLOSE_PRO, /* 重合闸运行 */
+    EV_FUN_ERR,     /* 功能模式异常 */
+
+    /* 软压板 */
+    EV_GPFPRO_SOFT,     /* 常规保护压板 */
+    EV_RECLOSEON_SOFT,  /* 自动重合闸压板  */
+    EV_BAR_TT,          /* 停用重合闸压板 */ 
+    EV_FAPRO_SOFT,      /* 就地馈线自动化压板 */
+    EV_DFAPRO_SOFT,     /* 智能分布式压板 */
+    EV_CTLPRO_SOFT,     /* 集中式压板 */
+    EV_SC_SOFT,         /* 同期合闸压板 */
+    EV_AUTOLIST_SOFT,   /* 自动解列压板 */
+    EV_CERGROUND_SOFT,  /* 小电流接地压板 */
+    EV_BREAKLINE_SOFT,  /* 线路断线告警压板 */
+    EV_PFD_SOFT,        /* 不停电传动压板 */
+    EV_PROALL_SOFT,     /* 功能总投退压板 */
+    EV_LOGICTRIP_SOFT,  /* 功能总出口压板 */
+    EV_LOGICCLOSE_SOFT, /* 重合闸软压板 */
+    EV_YFYT_SOFT,       /* 远程运维压板 */
+
+    EV_OZ_CUR_CTRL,     /* 过流零流告警投入 */
+    EV_JUMP_CTRL,       /* 常规保护跳闸投入 */
+    EV_CON_CTRL_01,     /* 过流一段投入 */
+    EV_CON_CTRL_02,     /* 过流二段投入 */
+    EV_CON_CTRL_03,     /* 过流三段投入 */
+    EV_CON_CTRL_04,     /* 过流一段方向投入 */
+    EV_CON_CTRL_05,     /* 过流二段方向投入 */
+    EV_CON_CTRL_06,     /* 过流三段方向投入 */
+    EV_CON_CTRL_07,     /* 零流一段投入 */
+    EV_CON_CTRL_08,     /* 零流二段投入 */
+    EV_CON_CTRL_09,     /* 零流三段投入 */
+    EV_CON_CTRL_10,     /* PT断线投入 */
+    EV_CON_CTRL_11,     /* 后加速投入 */
+    EV_CON_CTRL_12,     /* 过流启动重合投入 */
+    EV_CON_CTRL_13,     /* 零流启动重合投入 */
+    EV_CON_CTRL_14,     /* 涌流识别投入 */
+    EV_CON_CTRL_15,     /* 零压保护投入 */
+    EV_REC_CTRL_01,     /* 一次重合闸投入 */
+    EV_REC_CTRL_02,     /* 二次重合闸投入 */
+    EV_REC_CTRL_03,     /* 重合闸检同期投入 */
+    EV_REC_CTRL_04,     /* 重合闸检无压投入 */
+    EV_REC_CTRL_05,     /* 大电流闭锁重合投入 */
+    EV_FA_SLMODE,       /* 分段联络模式 */
+    EV_FA_CTRL_01,      /* A侧得电延时合投入 */
+    EV_FA_CTRL_02,      /* B侧得电延时合投入 */
+    EV_FA_CTRL_03,      /* A侧失电延时合投入 */
+    EV_FA_CTRL_04,      /* B侧失电延时合投入 */
+    EV_FA_CTRL_05,      /* 合到故障快速分投入 */
+    EV_FA_CTRL_06,      /* 合成功闭锁失压分 */
+    EV_FA_CTRL_07,      /* FA过流告警投入 */
+    EV_FA_CTRL_08,      /* FA接地告警投入*/
+    EV_FA_CTRL_09,      /* 合到零序电压保护 */
+    EV_FA_CTRL_10,      /* 非遮断投入 */
+    EV_FA_CTRL_11,      /* PT断线投入 */
+    EV_FA_CTRL_12,      /* 多次失压分闭锁合 */
+    EV_FA_CTRL_13,      /* 涌流闭锁投入 */
+    EV_FA_CTRL_14,      /* 硬件残压模快投入 */
+    EV_DFA_CTRL_01,     /* 分布式FA方式 */
+    EV_DFA_CTRL_02,     /* 联络自投投入 */
+    EV_DFA_CTRL_03,     /* 过载闭锁自投投入 */
+    EV_DFA_CTRL_04,     /* 首开关失压保护投入 */
+    EV_DFA_CTRL_05,     /* 智能分布式启动重合 */
+    EV_AL_CTRL_01,      /* 电压解列投入 */
+    EV_AL_CTRL_02,      /* 电压滑差闭锁 */
+    EV_AL_CTRL_03,      /* 频率解列投入 */
+    EV_AL_CTRL_04,      /* 频率滑差闭锁 */
+    EV_LC_CTRL_01,      /* 小电流接地投入 */
+    EV_LC_CTRL_02,      /* 小电流接地启动重合 */
+    EV_LC_CTRL_03,      /* 小电流接地后加速 */  
+#endif
+
+    EV_PUB_END, /* 公共遥信结束 */
 
 
     /*下面不需要上送后台的操作或提示类的信息*/

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

@@ -2744,7 +2744,7 @@ void mmd_GetEventShow(EVENT_SHOW *pe,bool bPDA)
                 }
                 else // Öà 0£¬ÏÔʾ·µ»ØÖµ
                 {
-                    strcat(namestr,ev_back[(psoe->soe_def&0x03)]);
+                    strcat(namestr,ev_back[(psoe->soe_def & SOE_TYPE_QUIT)]);
                 }
 			}
 		}
@@ -3050,7 +3050,7 @@ static int  mmd_GetAllSoePara(EVENT_SHOW *pe)
 			{
 				code = er->ev_code - EV_SW_NUM*(SWITCH_NUM_MAX-1);
 			}
-			if(tAllSOE[code].soe_def&0x10)
+			if(tAllSOE[code].soe_def & SOE_TYPE_VIP)
 			{
 				DATA_MENU_DEF *pt=&g_tDataMenu2;
 				u8 tmpstr[16];

Разница между файлами не показана из-за своего большого размера
+ 1450 - 1480
dtu/dtu_main_t536/app/SOE.c


+ 12 - 8
dtu/dtu_main_t536/app/SOE.h

@@ -36,14 +36,18 @@ enum
 
 #define SOE_TYPE_ACK SOE_TYPE_TST // 类型小于此的都是需要确认的事件 6
 
-#define SOE_TYPE_MASK 		0x0f // 事件类型屏蔽码
-#define SOE_TYPE_VIP 		0x10 //  关键事件 标志  //保存全参数
-#define SOE_TYPE_DELAY_FHZ	0X20//等至开关分/合位,延迟保存SOE//#define SOE_TYPE_RSV2 		0x20 // 保留位2
-#define SOE_TYPE_RSV3 		0x40 // 保留位3  SOE_TYPE_VIP
-#define SOE_TYPE_FAULT 		0x80 // 保留位4
-
-#define SOE_BUF_BITS 		11//9->11 用于雪崩测试缓存不够
-#define SOE_BUF_NUMBER 		(1<<SOE_BUF_BITS) // 512
+#define SOE_TYPE_RET            0x00 // 事件索引 返回 ev_back
+#define SOE_TYPE_VANISH         0x01 // 事件索引 消失
+#define SOE_TYPE_RECOVER        0x02 // 事件索引 恢复
+#define SOE_TYPE_QUIT           0x03 // 事件索引 退出
+#define SOE_TYPE_MASK           0x0f // 事件类型屏蔽码
+#define SOE_TYPE_VIP            0x10 // 关键事件 标志 保存全参数
+#define SOE_TYPE_DELAY_FHZ      0x20 // 等至开关分/合位,延迟保存SOE
+#define SOE_TYPE_RSV3           0x40 // 关键记录 单独保存 保存全参数
+#define SOE_TYPE_FAULT          0x80 // 故障事件上送
+
+#define SOE_BUF_BITS 11                    // 9->11 用于雪崩测试缓存不够
+#define SOE_BUF_NUMBER (1 << SOE_BUF_BITS) // 512
 
 // SOE buffer 索引
 typedef struct soe_buf_index

Разница между файлами не показана из-за своего большого размера
+ 672 - 663
dtu/dtu_main_t536/app/Sys.c


+ 39 - 48
dtu/dtu_main_t536/app/Sys.h

@@ -50,67 +50,58 @@ SOE 512
 每个SOE占28个字节,共计28*512=14k
 */
 
-#define EEP_SET_BASE   (64*1024)
-#define EEP_PRJNAME_ADDR		(0+EEP_SET_BASE)      // 下载参数保存区域
-
-#define EEP_PASSWORD_ADDR		(64+EEP_SET_BASE)       //密码保存 10字节
-#define EEP_PASSWORD2_ADDR	(64+12+EEP_SET_BASE)       //密码保存 10字节
-
-#define EEP_UEUQ_ADDR		(96+EEP_SET_BASE)       //电压合格率 保存地址 16+2 18个字节
-
-
-#define EEP_EQUIP_PARA_ADDR		(128+EEP_SET_BASE)       //装置参数  128字节:(1024-128)/4=224pcs
-
-#define EEP_CSTSET_ADDR			(1024+EEP_SET_BASE)       //内部定值:800/4=200pcs
-
-#define EEP_SETGROUP_ADDR			(1024+800+EEP_SET_BASE)       // 定值索引:(1024-800)/4=56pcs
-
+#define EEP_SET_BASE            (64 * 1024)
+#define EEP_PRJNAME_ADDR        (0 + EEP_SET_BASE)          // 下载参数保存区域
+#define EEP_PASSWORD_ADDR       (64 + EEP_SET_BASE)         // 密码保存 10字节
+#define EEP_PASSWORD2_ADDR      (64 + 12 + EEP_SET_BASE)    // 密码保存 10字节
+#define EEP_UEUQ_ADDR           (96 + EEP_SET_BASE)         // 电压合格率 保存地址 16+2 18个字节
+#define EEP_EQUIP_PARA_ADDR     (128 + EEP_SET_BASE)        // 装置参数  128字节:(1024-128)/4=224pcs
+#define EEP_CSTSET_ADDR         (1024 + EEP_SET_BASE)       // 内部定值:800/4=200pcs
+#define EEP_SETGROUP_ADDR       (1024 + 800 + EEP_SET_BASE) // 定值索引:(1024-800)/4=56pcs
 
 #if defined GD_AREA_ZHONGSHAN_2020
-	#define EEP_PUB_ADDR			((2*1024)+EEP_SET_BASE)     //公共定值开始位置
-	#define EEP_SET_ADDR			((5*1024)+EEP_SET_BASE)     //开关定值开始位置(此值于中山新增备用定值后更改)
+    #define EEP_PUB_ADDR            ((2 * 1024) + EEP_SET_BASE) // 公共定值开始位置
+    #define EEP_SET_ADDR            ((5 * 1024) + EEP_SET_BASE) // 开关定值开始位置(此值于中山新增备用定值后更改)
 #elif defined GD_AREA_ECZD_2020
-	#define EEP_PUB_ADDR			((2*1024)+EEP_SET_BASE)     //公共定值开始位置
-	#define EEP_SET_ADDR			((4*1024)+EEP_SET_BASE)     //开关定值开始位置
+    #define EEP_PUB_ADDR            ((2 * 1024) + EEP_SET_BASE) // 公共定值开始位置
+    #define EEP_SET_ADDR            ((4 * 1024) + EEP_SET_BASE) // 开关定值开始位置
 #else
-	#define EEP_PUB_ADDR			((2*1024)+EEP_SET_BASE)     //公共定值开始位置
-	#define EEP_SET_ADDR			((3*1024)+EEP_SET_BASE)     //开关定值开始位置
-#endif
+    #define EEP_PUB_ADDR            ((2 * 1024) + EEP_SET_BASE) // 公共定值开始位置
+    #define EEP_SET_ADDR            ((3 * 1024) + EEP_SET_BASE) // 开关定值开始位置
+#endif /* GD_AREA_ZHONGSHAN_2020 */
 
-//系统运行信息保存,占用256字节
-#define EEP_SYSTEM_DATA_START 	((63*1024)+EEP_SET_BASE)
-#define EEP_SYSTEM_DATA_END		(256+EEP_SYSTEM_DATA_START)
-#define EEP_SYSTEM_DATA_SIZE 	(EEP_SYSTEM_DATA_END - EEP_SYSTEM_DATA_START)
+// 系统运行信息保存,占用256字节
+#define EEP_SYSTEM_DATA_START   ((63 * 1024) + EEP_SET_BASE)
+#define EEP_SYSTEM_DATA_END     (256 + EEP_SYSTEM_DATA_START)
+#define EEP_SYSTEM_DATA_SIZE    (EEP_SYSTEM_DATA_END - EEP_SYSTEM_DATA_START)
 
 #ifdef SOE_PARA_ALL_SAVE
-#define EEP_SOE_BASE   (128*1024)
-#define EEP_SOE_ADDR			(0*1024+EEP_SOE_BASE)  	// 从0开始32空间
-#define EEP_OPERATE_ADDR		(64*1024+EEP_SOE_BASE)  	// 从32开始14k空间
-#define EEP_VIP_ADDR			(96*1024+EEP_SOE_BASE)  	// 从32开始14k空间
-#else
-#define EEP_SOE_BASE   (0*1024)
-#define EEP_SOE_ADDR			(0*1024)  	// 从0开始32空间
-#define EEP_OPERATE_ADDR		(32*1024)  	// 从32开始14k空间
-
-#define EEP_VIP_ADDR			(48*1024)  	// 从32开始14k空间
-#endif
-
-
-#define IECTABLE_ADDR			(96+EEP_SET_BASE) 	//从64k开始1k空间
+    #define EEP_SOE_BASE            (128 * 1024)
+    #define EEP_SOE_ADDR            (0 * 1024 + EEP_SOE_BASE)   // 从0开始32空间
+    #define EEP_OPERATE_ADDR        (64 * 1024 + EEP_SOE_BASE)  // 从32开始14k空间
+    #define EEP_VIP_ADDR            (96 * 1024 + EEP_SOE_BASE)  // 从32开始14k空间
+#else /* SOE_PARA_ALL_SAVE */
+    #define EEP_SOE_BASE            (0 * 1024)
+    #define EEP_SOE_ADDR            (0 * 1024)  // 从0开始32空间
+    #define EEP_OPERATE_ADDR        (32 * 1024) // 从32开始14k空间
+    #define EEP_VIP_ADDR            (48 * 1024) // 从32开始14k空间
+#endif /* SOE_PARA_ALL_SAVE */
+
+#define IECTABLE_ADDR               (96 + EEP_SET_BASE) // 从64k开始1k空间
 
 #ifdef ADD_DEBUG_RECORD_FUN
-#ifdef SOE_PARA_ALL_SAVE
-#define EEP_OTHER_DATA_SAVE_BASE       (256*1024)    //256k开始位置用于存储其他的数据
-#else
-#define EEP_OTHER_DATA_SAVE_BASE       (128*1024)    //128k开始位置用于存储其他的数据
-#endif
-#define EEP_DEBUG_RECORD_ADDR		   (0*1024+EEP_OTHER_DATA_SAVE_BASE)  //预留32K用于存储调试记录包括全参数或者非全参数
+    #ifdef SOE_PARA_ALL_SAVE
+        #define EEP_OTHER_DATA_SAVE_BASE (256 * 1024) // 256k开始位置用于存储其他的数据
+    #else
+        #define EEP_OTHER_DATA_SAVE_BASE (128 * 1024) // 128k开始位置用于存储其他的数据
+    #endif
+    #define EEP_DEBUG_RECORD_ADDR (0 * 1024 + EEP_OTHER_DATA_SAVE_BASE) // 预留32K用于存储调试记录包括全参数或者非全参数
 #else
-#define EEP_DEBUG_RECORD_ADDR	       EEP_VIP_ADDR   //若无定义调试记录则默认显示关键记录
+    #define EEP_DEBUG_RECORD_ADDR EEP_VIP_ADDR // 若无定义调试记录则默认显示关键记录
 #endif
 
 #ifdef METERING_ENERGY
-#define EEP_DD_DATA 			(260+EEP_SYSTEM_DATA_START)
+#define EEP_DD_DATA (260 + EEP_SYSTEM_DATA_START)
 #endif
 
 #define TEST_MASK_BIT(object, mask) (((object) & (mask))?true:false)

+ 5 - 7
dtu/dtu_main_t536/app/pda.c

@@ -1110,17 +1110,15 @@ static void _pda_get_event_show(EVENT_SHOW *pe,bool bPDA)
 		{
 			if(strlen(psoe->strName)>16)
 			{
-				sprintf((char*)&pe->namestr[len],"%-20.20s",psoe->strName);				
-				sprintf((char*)pe->valuestr,"%-15.15s",ev_back[(psoe->soe_def&0x03)]);
-				strcpy((char*)tmpstr,psoe->strName);  // 添加到PDA显示,没有参数
-
-
+				sprintf((char*)&pe->namestr[len],"%-20.20s",psoe->strName);
+                sprintf((char *)pe->valuestr, "%-15.15s", ev_back[(psoe->soe_def & SOE_TYPE_QUIT)]);
+                strcpy((char*)tmpstr,psoe->strName);  // 添加到PDA显示,没有参数
 			}
 			else
 			{
 				strcpy((char*)&pe->namestr[len],psoe->strName);
-				strcat((char*)pe->namestr,ev_back[(psoe->soe_def&0x03)]);
-			}
+                strcat((char *)pe->namestr, ev_back[(psoe->soe_def & SOE_TYPE_QUIT)]);
+            }
 			strcpy((char *)pe->str[pe->sParaNum++],(char*)pe->namestr);		
 			strcpy((char *)pe->str[pe->sParaNum++],(char *)pe->valuestr);
 		}

+ 606 - 617
dtu/dtu_main_t536/app/plc.c

@@ -109,465 +109,459 @@ struct di_db g_di_db[MAX_DPI_NUMBER];
 */
 void plc_db_soe(EVENT_STRUCT *ev);
 
-
 /*------------------------------ 外部函数 -------------------------------------
 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
 */
 int plc_yx2index(u8 sw, u8 type)
 {
-	if(sw>SWITCH_NUM_MAX)
-	{
-		return -1;
-	}
-	if(type == 0)
-	{
-		return -1;
-	}
-	type--;
-	
-	if(sw == 0)
-	{
-		return type;
-	}
-	else
-	{
-		sw--;
-		return PUB_DI_NUM_ALL+(SW_DI_NUM_ALL*sw) + type;
-	}
-
-	return -2;
+    if (sw > SWITCH_NUM_MAX)
+    {
+        return -1;
+    }
+    if (type == 0)
+    {
+        return -1;
+    }
+    type--;
+
+    if (sw == 0)
+    {
+        return type;
+    }
+    else
+    {
+        sw--;
+        return PUB_DI_NUM_ALL + (SW_DI_NUM_ALL * sw) + type;
+    }
+
+    return -2;
 }
 
 SOE_DEF *plc_yx2soe(u8 sw, u8 type)
 {
-	if(sw>SWITCH_NUM_MAX)
-	{
-		return NULL;
-	}
-	if(type == 0)
-	{
-		return NULL;
-	}
-	type--;
-	
-	if(sw == 0)
-	{
-		if(type >= PUB_DI_NUM && type < PUB_DI_NUM_ALL)
-		{
-			return (SOE_DEF *)&tAllSOE[type - PUB_DI_NUM + EV_SW_NUM];
-		}
-	}
-	else
-	{
-		if(type >= SW_DI_NUM && type < SW_DI_NUM_ALL)
-		{
-			return (SOE_DEF *)&tAllSOE[type - SW_DI_NUM];
-		}
-	}
-
-	return NULL;
+    if (sw > SWITCH_NUM_MAX)
+    {
+        return NULL;
+    }
+    if (type == 0)
+    {
+        return NULL;
+    }
+    type--;
+
+    if (sw == 0)
+    {
+        if (type >= PUB_DI_NUM && type < PUB_DI_NUM_ALL)
+        {
+            return (SOE_DEF *)&tAllSOE[type - PUB_DI_NUM + EV_SW_NUM];
+        }
+    }
+    else
+    {
+        if (type >= SW_DI_NUM && type < SW_DI_NUM_ALL)
+        {
+            return (SOE_DEF *)&tAllSOE[type - SW_DI_NUM];
+        }
+    }
+
+    return NULL;
 }
 
 s32 plc_get_input(u16 ld)
 {
-	u16 type,sw,no;
-	s32 r;
-
-	type = (ld & LP_TYPE);
-	sw	 = (ld & LP_SW)>>8 ;
-	no   = (ld & LP_INDEX);
-
-	r = 0;
-	switch(type)
-	{
-	case LP_TYPE_YX:
-		r = GetRmtYxVal(sw,no);
-		r = (r == SW_DI_TYPE_ON);
-	break;
-	
-	case LP_TYPE_YC:
-		r = GetRmtMeaVal(sw,no,NULL);
-	break;
-	
-	case LP_TYPE_PLC:
-		r = g_plc[no].result;
-	break;
-	
-	case LP_TYPE_PLC_CST:
-	break;
-	}
-
-	return r;
+    u16 type, sw, no;
+    s32 r;
+
+    type = (ld & LP_TYPE);
+    sw = (ld & LP_SW) >> 8;
+    no = (ld & LP_INDEX);
+
+    r = 0;
+    switch (type)
+    {
+    case LP_TYPE_YX:
+        r = GetRmtYxVal(sw, no);
+        r = (r == SW_DI_TYPE_ON);
+        break;
+
+    case LP_TYPE_YC:
+        r = GetRmtMeaVal(sw, no, NULL);
+        break;
+
+    case LP_TYPE_PLC:
+        r = g_plc[no].result;
+        break;
+
+    case LP_TYPE_PLC_CST:
+        break;
+    }
+
+    return r;
 }
 
-
 int plc_init_iec_table(void)
 {
-	u16 i,j,ep;
-	u16 v;
-	int index;
-	SOE_DEF * soe;
-
-	// 处理单点,如果一个逻辑点对应多个通讯点,将除第一个通讯点外的其它通讯点放入PLC逻辑中
-	for(i=0; i<g_table_head->di_num; i++)
-	{
-		index = plc_yx2index(g_di_table[i].owner,g_di_table[i].indexno);
-		if(index < 0)
-		{
-			continue;
-		}
-
-		// 将第一个通讯点滤除
-		if(g_lp[index].cp == g_di_table[i].cp)
-		{
-			continue;
-		}
-
-		// 没有通讯点,不需要
-		if(g_di_table[i].cp == 0)
-		{
-			continue;
-		}
-
-		// 除第一个通讯点外的其它通讯点,放入PLC逻辑中
-		// 检查空间
-		if(g_plc_num >= PLC_EXP_NUM)
-		{
-			rt_printf("g_plc_num单点越限(g_plc_num=%d,i=%d).\r\n",g_plc_num,i);
-			return -1;
-		}
-
-		// 通讯点
-		g_plc[g_plc_num].cp = g_di_table[i].cp;
-
-		// 标志,目前只有故障记录标志
-		soe = plc_yx2soe(g_di_table[i].owner,g_di_table[i].indexno);
-		if(soe)
-		{
-			if(soe->soe_def&0x80)
-			{
-				g_plc[g_plc_num].flag =  (PLC_FLAG_FAULT|(g_di_table[i].owner<<16));
-			}
-		}
-			
-		// 插入操作数
-		ep = 0;
-		v = LP_TYPE_YX;
-		v |=  (g_di_table[i].owner<<8) | g_di_table[i].indexno;
-		g_plc[g_plc_num].exp[ep++] = v;
-
-		//单点取反
-		if(g_di_table[i].is_inverse)
-		{
-			g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_NOT;
-		}
-
-		// 结束符
-		g_plc[g_plc_num].exp[ep++] = 0;
-
-		g_plc_num++;
-		
-	}
-		
-
-	// 处理合并点
-	g_plc_merge_index = g_plc_num;
-	for(i=0;i<g_table_head->dimerge_num;i++) 
-	{
-		if(g_plc_num >= PLC_EXP_NUM)
-		{
-			rt_printf("g_plc_num合并点越限(g_plc_num=%d,i=%d).\r\n",g_plc_num,i);
-			return -2;
-		}
-	
-		g_plc[g_plc_num].cp = g_di_merge_table[i].cp;
-		ep = 0;
-		for(j=0;j<MIX_YX_NUMBER;j++)
-		{
-			u8 no=g_di_merge_table[i].no[j]&0xff;
-			u8 owner=(g_di_merge_table[i].no[j]>>8)&0xff;	
-
-			// 组合点号为空代表结束,退出。
-			if(g_di_merge_table[i].no[j] == 0)
-			{
-				break;
-			}
-
-			// 标志,目前只有故障记录标志
-			soe = plc_yx2soe(owner,no);
-			if(soe)
-			{
-				if(soe->soe_def&0x80)
-				{
-					g_plc[g_plc_num].flag = (PLC_FLAG_FAULT|(owner<<16));
-
-				}
-			}
-
-			// 插入操作数
-			v =  LP_TYPE_YX | (owner<<8) | no;
-			g_plc[g_plc_num].exp[ep++] = v;
-
-			//单点取反
-			if(g_di_merge_table[i].is_inv[j])
-			{
-				g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_NOT;
-			}
-
-			// 插入或运算符
-			if(j)
-			{
-				g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_OR;
-			}
-		}
-
-		// 合并点取反
-		if(g_di_merge_table[i].is_inv_all)
-		{
-			g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_NOT;
-		}
-
-		// 结束符
-		g_plc[g_plc_num].exp[ep++] = 0;
-
-		// 检查长度是否越界
-		if(ep > PLC_EXP_LEN)
-		{
-			rt_printf("plc_iec_table: 表达式太长(i=%d,j=%d,ep=%d).\r\n",i,j,ep);
-			return -3;
-		}
-
-		g_plc_num++;
-	}
-
-	//g_plc[2].do_owner = 0;
-	//g_plc[2].do_index = 1;
-	
-	return 0;
+    u16 i, j, ep;
+    u16 v;
+    int index;
+    SOE_DEF *soe;
+
+    // 处理单点,如果一个逻辑点对应多个通讯点,将除第一个通讯点外的其它通讯点放入PLC逻辑中
+    for (i = 0; i < g_table_head->di_num; i++)
+    {
+        index = plc_yx2index(g_di_table[i].owner, g_di_table[i].indexno);
+        if (index < 0)
+        {
+            continue;
+        }
+
+        // 将第一个通讯点滤除
+        if (g_lp[index].cp == g_di_table[i].cp)
+        {
+            continue;
+        }
+
+        // 没有通讯点,不需要
+        if (g_di_table[i].cp == 0)
+        {
+            continue;
+        }
+
+        // 除第一个通讯点外的其它通讯点,放入PLC逻辑中
+        // 检查空间
+        if (g_plc_num >= PLC_EXP_NUM)
+        {
+            rt_printf("g_plc_num单点越限(g_plc_num=%d,i=%d).\r\n", g_plc_num, i);
+            return -1;
+        }
+
+        // 通讯点
+        g_plc[g_plc_num].cp = g_di_table[i].cp;
+
+        // 标志,目前只有故障记录标志
+        soe = plc_yx2soe(g_di_table[i].owner, g_di_table[i].indexno);
+        if (soe)
+        {
+            if (soe->soe_def & SOE_TYPE_FAULT)
+            {
+                g_plc[g_plc_num].flag = (PLC_FLAG_FAULT | (g_di_table[i].owner << 16));
+            }
+        }
+
+        // 插入操作数
+        ep = 0;
+        v = LP_TYPE_YX;
+        v |= (g_di_table[i].owner << 8) | g_di_table[i].indexno;
+        g_plc[g_plc_num].exp[ep++] = v;
+
+        // 单点取反
+        if (g_di_table[i].is_inverse)
+        {
+            g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_NOT;
+        }
+
+        // 结束符
+        g_plc[g_plc_num].exp[ep++] = 0;
+
+        g_plc_num++;
+    }
+
+    // 处理合并点
+    g_plc_merge_index = g_plc_num;
+    for (i = 0; i < g_table_head->dimerge_num; i++)
+    {
+        if (g_plc_num >= PLC_EXP_NUM)
+        {
+            rt_printf("g_plc_num合并点越限(g_plc_num=%d,i=%d).\r\n", g_plc_num, i);
+            return -2;
+        }
+
+        g_plc[g_plc_num].cp = g_di_merge_table[i].cp;
+        ep = 0;
+        for (j = 0; j < MIX_YX_NUMBER; j++)
+        {
+            u8 no = g_di_merge_table[i].no[j] & 0xff;
+            u8 owner = (g_di_merge_table[i].no[j] >> 8) & 0xff;
+
+            // 组合点号为空代表结束,退出。
+            if (g_di_merge_table[i].no[j] == 0)
+            {
+                break;
+            }
+
+            // 标志,目前只有故障记录标志
+            soe = plc_yx2soe(owner, no);
+            if (soe)
+            {
+                if (soe->soe_def & SOE_TYPE_FAULT)
+                {
+                    g_plc[g_plc_num].flag = (PLC_FLAG_FAULT | (owner << 16));
+                }
+            }
+
+            // 插入操作数
+            v = LP_TYPE_YX | (owner << 8) | no;
+            g_plc[g_plc_num].exp[ep++] = v;
+
+            // 单点取反
+            if (g_di_merge_table[i].is_inv[j])
+            {
+                g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_NOT;
+            }
+
+            // 插入或运算符
+            if (j)
+            {
+                g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_OR;
+            }
+        }
+
+        // 合并点取反
+        if (g_di_merge_table[i].is_inv_all)
+        {
+            g_plc[g_plc_num].exp[ep++] = PLC_LOGIC_NOT;
+        }
+
+        // 结束符
+        g_plc[g_plc_num].exp[ep++] = 0;
+
+        // 检查长度是否越界
+        if (ep > PLC_EXP_LEN)
+        {
+            rt_printf("plc_iec_table: 表达式太长(i=%d,j=%d,ep=%d).\r\n", i, j, ep);
+            return -3;
+        }
+
+        g_plc_num++;
+    }
+
+    // g_plc[2].do_owner = 0;
+    // g_plc[2].do_index = 1;
+
+    return 0;
 }
 
 int plc_init(void)
 {
-	int i, j, k,index,ret;
-	u8 sw, no;
-	u32 timeout[2] = {0};
-	u32 timeout_add;
-	
-	// 初值
-	for(i=0; i< LP_NUM; i++)
-	{
-		g_lp[i].cp =0;
-		g_lp[i].db_index = -1;
-	}
-	if(equ_config_null())
-	{
-		return -1;
-	}	
-	// 单点
-	// 保存第一个单点通讯点号
-	for(i=0; i<g_table_head->di_num; i++)
-	{
-		index = plc_yx2index(g_di_table[i].owner,g_di_table[i].indexno);
-		if(index < 0)
-		{
-			// 跳过备用点
-			continue;
-		}
-
-		if(g_lp[index].cp == 0)
-		{
-			g_lp[index].cp = g_di_table[i].cp;
-		}
-	}
-
-	// 双点
-	if(g_table_head->di_db_num >MAX_DPI_NUMBER)
-	{
-		return -2;
-	}
-	for(i=0; i<g_table_head->di_db_num; i++) 
-	{
-		for (k=0; k<2; k++)
-		{
-			sw = (u8)(g_di_db_table[i].no[k]>>8);
-			no = (u8)(g_di_db_table[i].no[k]);
-
-			// 得到检查索引
-			index = plc_yx2index(sw,no);
-			if(index< 0)
-			{
-				return -3;
-			}
-
-			// 一个逻辑点只能对应一个双点
-			if(g_lp[index].db_index >= 0)
-			{
-				return -4;
-			}
-			g_lp[index].db_index = i;
-
-			// 得到滤波时间
-			for (j=0; j<g_equ_config->di_num; j++)
-			{
-				if ((g_equ_config_di[j].owner == sw)
-					&& (g_equ_config_di[j].type == no))
-				{
-					g_di_db[i].ev_code[k] = (g_equ_config_di[j].slot<<8)|g_equ_config_di[j].index;
-					timeout[k] = g_equ_config_di[j].filter_time*USTIMER_MS;
-					break;
-				}
-			}
-
-			// 初始化双点值
-			if(j != g_equ_config->di_num)
-			{
-				// 双点标准定义中,分位在bit0,合位在bit1.在转发点表中合位在前,分位在后
-				// 所以移位必须取反一下。
-				int sft = !k; 
-				if(dido_di_is_on(g_equ_config_di[j].slot,g_equ_config_di[j].index))
-				{
-					g_di_db[i].value0 |= 1<<sft;
-				}
-				else
-				{
-					g_di_db[i].value0 &= ~(1<<sft);
-				}
-
-				g_di_db[i].value1 = g_di_db[i].value0;
-				if(g_di_db_table[i].is_inv[k])
-				{
-					g_di_db[i].value1 ^= 1<<sft;
-				}
-			}
-			else
-			{
-				rt_printf("双点需要实际通道对应(i=%d)\r\n",i);
-				return -5;
-			}
-		}
-		// 双点确认延时(两点滤波时间差),转化为us,再增加20ms,以确保双点变位成功
-		// 2017-09-05:在电科院测试,遥信10ms滤波,双点没有变位信号。针对此情况修改如下:
-		// 1、附加延时由固定的20ms改为最小滤波时间的1/4,这样10ms的遥信滤波,将有2.5ms的附加延时。
-		//	  初步评估2.5ms的延时相对于5ms的中断间隔是个合适的值,
-		// 2、如果附加延时大于20ms则限制为20ms,防止延时过长。
-		if(timeout[0] >= timeout[1])
-		{
-
-			g_di_db[i].timeout = (timeout[0] - timeout[1]);
-			timeout_add = timeout[1]/4;
-		}
-		else
-		{
-			g_di_db[i].timeout = (timeout[1] - timeout[0]);
-			timeout_add = timeout[0]/4;
-		}
-
-		if(timeout_add >20*USTIMER_MS)
-		{
-			timeout_add = 20*USTIMER_MS;
-		}
-
-		g_di_db[i].timeout += timeout_add;
-	}
-
-	// 解析PLC文件
-
-	// 将转发点表中的多余单点和合并点转入PLC模块
-	ret = plc_init_iec_table();
-	if(ret < 0)
-	{
-		ret -= 10;
-	}
-
-	plc_scan(0);
-
-	return ret;
+    int i, j, k, index, ret;
+    u8 sw, no;
+    u32 timeout[2] = {0};
+    u32 timeout_add;
+
+    // 初值
+    for (i = 0; i < LP_NUM; i++)
+    {
+        g_lp[i].cp = 0;
+        g_lp[i].db_index = -1;
+    }
+    if (equ_config_null())
+    {
+        return -1;
+    }
+    // 单点
+    // 保存第一个单点通讯点号
+    for (i = 0; i < g_table_head->di_num; i++)
+    {
+        index = plc_yx2index(g_di_table[i].owner, g_di_table[i].indexno);
+        if (index < 0)
+        {
+            // 跳过备用点
+            continue;
+        }
+
+        if (g_lp[index].cp == 0)
+        {
+            g_lp[index].cp = g_di_table[i].cp;
+        }
+    }
+
+    // 双点
+    if (g_table_head->di_db_num > MAX_DPI_NUMBER)
+    {
+        return -2;
+    }
+    for (i = 0; i < g_table_head->di_db_num; i++)
+    {
+        for (k = 0; k < 2; k++)
+        {
+            sw = (u8)(g_di_db_table[i].no[k] >> 8);
+            no = (u8)(g_di_db_table[i].no[k]);
+
+            // 得到检查索引
+            index = plc_yx2index(sw, no);
+            if (index < 0)
+            {
+                return -3;
+            }
+
+            // 一个逻辑点只能对应一个双点
+            if (g_lp[index].db_index >= 0)
+            {
+                return -4;
+            }
+            g_lp[index].db_index = i;
+
+            // 得到滤波时间
+            for (j = 0; j < g_equ_config->di_num; j++)
+            {
+                if ((g_equ_config_di[j].owner == sw) && (g_equ_config_di[j].type == no))
+                {
+                    g_di_db[i].ev_code[k] = (g_equ_config_di[j].slot << 8) | g_equ_config_di[j].index;
+                    timeout[k] = g_equ_config_di[j].filter_time * USTIMER_MS;
+                    break;
+                }
+            }
+
+            // 初始化双点值
+            if (j != g_equ_config->di_num)
+            {
+                // 双点标准定义中,分位在bit0,合位在bit1.在转发点表中合位在前,分位在后
+                // 所以移位必须取反一下。
+                int sft = !k;
+                if (dido_di_is_on(g_equ_config_di[j].slot, g_equ_config_di[j].index))
+                {
+                    g_di_db[i].value0 |= 1 << sft;
+                }
+                else
+                {
+                    g_di_db[i].value0 &= ~(1 << sft);
+                }
+
+                g_di_db[i].value1 = g_di_db[i].value0;
+                if (g_di_db_table[i].is_inv[k])
+                {
+                    g_di_db[i].value1 ^= 1 << sft;
+                }
+            }
+            else
+            {
+                rt_printf("双点需要实际通道对应(i=%d)\r\n", i);
+                return -5;
+            }
+        }
+        // 双点确认延时(两点滤波时间差),转化为us,再增加20ms,以确保双点变位成功
+        // 2017-09-05:在电科院测试,遥信10ms滤波,双点没有变位信号。针对此情况修改如下:
+        // 1、附加延时由固定的20ms改为最小滤波时间的1/4,这样10ms的遥信滤波,将有2.5ms的附加延时。
+        //	  初步评估2.5ms的延时相对于5ms的中断间隔是个合适的值,
+        // 2、如果附加延时大于20ms则限制为20ms,防止延时过长。
+        if (timeout[0] >= timeout[1])
+        {
+
+            g_di_db[i].timeout = (timeout[0] - timeout[1]);
+            timeout_add = timeout[1] / 4;
+        }
+        else
+        {
+            g_di_db[i].timeout = (timeout[1] - timeout[0]);
+            timeout_add = timeout[0] / 4;
+        }
+
+        if (timeout_add > 20 * USTIMER_MS)
+        {
+            timeout_add = 20 * USTIMER_MS;
+        }
+
+        g_di_db[i].timeout += timeout_add;
+    }
+
+    // 解析PLC文件
+
+    // 将转发点表中的多余单点和合并点转入PLC模块
+    ret = plc_init_iec_table();
+    if (ret < 0)
+    {
+        ret -= 10;
+    }
+
+    plc_scan(0);
+
+    return ret;
 }
 
 int plc_exit(void)
 {
-	return 0;
+    return 0;
 }
 
 u8 plc_db_value(int index)
 {
-	return g_di_db[index].value1;
+    return g_di_db[index].value1;
 }
 
-void plc_db_init_value(u8 slot,u8 no,u8 v)
+void plc_db_init_value(u8 slot, u8 no, u8 v)
 {
-	int index,db_index;
-	u16 ev_code;
-	
-	ev_code = (slot<<8) | no;
-	
-	// 得到检查逻辑点索引
-	index = plc_yx2index(g_di_st[slot][no].owner,g_di_st[slot][no].type);
-	if(index < 0)
-	{
-		return;
-	}
+    int index, db_index;
+    u16 ev_code;
 
-	// 检查双点索引
-	db_index = g_lp[index].db_index;
-	if(db_index < 0)
-	{
-		return;
-	}
+    ev_code = (slot << 8) | no;
+
+    // 得到检查逻辑点索引
+    index = plc_yx2index(g_di_st[slot][no].owner, g_di_st[slot][no].type);
+    if (index < 0)
+    {
+        return;
+    }
+
+    // 检查双点索引
+    db_index = g_lp[index].db_index;
+    if (db_index < 0)
+    {
+        return;
+    }
 
 #if 1
-	// 取消正在进行的双点处理过程
-	g_di_db[db_index].bChange = 0;
+    // 取消正在进行的双点处理过程
+    g_di_db[db_index].bChange = 0;
 #else
-	// 双点第一次变位,记录时标
-	if (g_di_db[db_index].bChange == 0)
-	{
-		g_di_db[db_index].ts = ev->ts;
-		g_di_db[db_index].bChange = 1;
-	}
+    // 双点第一次变位,记录时标
+    if (g_di_db[db_index].bChange == 0)
+    {
+        g_di_db[db_index].ts = ev->ts;
+        g_di_db[db_index].bChange = 1;
+    }
 #endif
 
-	// 每次变位都重新获取超时起点和双点的值
-	g_di_db[db_index].us0 = ustimer_get_origin(); 
-	if(ev_code == g_di_db[db_index].ev_code[0])
-	{
-		index = 1;
-	}
-	else if(ev_code == g_di_db[db_index].ev_code[1])
-	{
-		index = 0;
-	}
-	else
-	{
-		rt_printf("plc_db_soe:ev_code err!\r\n");
-		return;
-	}
-
-	// 滤波前的值
-	if(v)
-	{
-		g_di_db[db_index].value0 |= 1<<index;
-	}
-	else
-	{
-		g_di_db[db_index].value0 &= ~(1<<index);
-	}
-
-	// 滤波后的值
-	// 双点标准定义中,分位在bit0,合位在bit1.在转发点表中合位在前,分位在后
-	// 所以移位必须取反一下。
-	if(g_di_db_table[db_index].is_inv[!index])
-	{
-		v = !v;
-	}
-	if(v)
-	{
-		g_di_db[db_index].value1 |= (1<<index);
-	}
-	else
-	{
-		g_di_db[db_index].value1 &= ~(1<<index);
-	}
+    // 每次变位都重新获取超时起点和双点的值
+    g_di_db[db_index].us0 = ustimer_get_origin();
+    if (ev_code == g_di_db[db_index].ev_code[0])
+    {
+        index = 1;
+    }
+    else if (ev_code == g_di_db[db_index].ev_code[1])
+    {
+        index = 0;
+    }
+    else
+    {
+        rt_printf("plc_db_soe:ev_code err!\r\n");
+        return;
+    }
+
+    // 滤波前的值
+    if (v)
+    {
+        g_di_db[db_index].value0 |= 1 << index;
+    }
+    else
+    {
+        g_di_db[db_index].value0 &= ~(1 << index);
+    }
+
+    // 滤波后的值
+    // 双点标准定义中,分位在bit0,合位在bit1.在转发点表中合位在前,分位在后
+    // 所以移位必须取反一下。
+    if (g_di_db_table[db_index].is_inv[!index])
+    {
+        v = !v;
+    }
+    if (v)
+    {
+        g_di_db[db_index].value1 |= (1 << index);
+    }
+    else
+    {
+        g_di_db[db_index].value1 &= ~(1 << index);
+    }
 
 #if 0
 	rt_printf("db_init:db=%d,index=%d,is_inv=%d,v0=%d,v1=%d\r\n",
@@ -577,216 +571,211 @@ void plc_db_init_value(u8 slot,u8 no,u8 v)
 				g_di_db[db_index].value1);
 #endif
 
-	return;
+    return;
 }
 
 void plc_db_soe(EVENT_STRUCT *ev)
 {
-	int index,db_index;
-	u8 slot,no;
-
-	slot = (ev->ev_code>>8);
-	no = ev->ev_code&0xff;
-	
-	// 得到检查逻辑点索引
-	index = plc_yx2index(g_di_st[slot][no].owner,g_di_st[slot][no].type);
-	if(index < 0)
-	{
-		return;
-	}
-
-	// 检查双点索引
-	db_index = g_lp[index].db_index;
-	if(db_index < 0)
-	{
-		return;
-	}
-	
-	// 双点第一次变位,记录时标
-	if (g_di_db[db_index].bChange == 0)
-	{
-		g_di_db[db_index].ts = ev->ts;
-		g_di_db[db_index].bChange = 1;
-	}
-
-	// 每次变位都重新获取超时起点和双点的值
-	g_di_db[db_index].us0 = ustimer_get_origin(); 
-	if(ev->ev_code == g_di_db[db_index].ev_code[0])
-	{
-		index = 1;
-	}
-	else if(ev->ev_code == g_di_db[db_index].ev_code[1])
-	{
-		index = 0;
-	}
-	else
-	{
-		rt_printf("plc_db_soe:ev_code err!\r\n");
-		return;
-	}
-	
-	if(ev->ev_value)
-	{
-		g_di_db[db_index].value0 |= 1<<index;
-	}
-	else
-	{
-		g_di_db[db_index].value0 &= ~(1<<index);
-	}
-
-	return;
+    int index, db_index;
+    u8 slot, no;
+
+    slot = (ev->ev_code >> 8);
+    no = ev->ev_code & 0xff;
+
+    // 得到检查逻辑点索引
+    index = plc_yx2index(g_di_st[slot][no].owner, g_di_st[slot][no].type);
+    if (index < 0)
+    {
+        return;
+    }
+
+    // 检查双点索引
+    db_index = g_lp[index].db_index;
+    if (db_index < 0)
+    {
+        return;
+    }
+
+    // 双点第一次变位,记录时标
+    if (g_di_db[db_index].bChange == 0)
+    {
+        g_di_db[db_index].ts = ev->ts;
+        g_di_db[db_index].bChange = 1;
+    }
+
+    // 每次变位都重新获取超时起点和双点的值
+    g_di_db[db_index].us0 = ustimer_get_origin();
+    if (ev->ev_code == g_di_db[db_index].ev_code[0])
+    {
+        index = 1;
+    }
+    else if (ev->ev_code == g_di_db[db_index].ev_code[1])
+    {
+        index = 0;
+    }
+    else
+    {
+        rt_printf("plc_db_soe:ev_code err!\r\n");
+        return;
+    }
+
+    if (ev->ev_value)
+    {
+        g_di_db[db_index].value0 |= 1 << index;
+    }
+    else
+    {
+        g_di_db[db_index].value0 &= ~(1 << index);
+    }
+
+    return;
 }
 
-
 // 双点滤波处理,得到滤波后的值
 static void plc_db_scan(void)
 {
-	int i,value;
-	uint32_t  flags;
-	
-	for(i=0; i<g_table_head->di_db_num; i++)
-	{
-		if (g_di_db[i].bChange)
-		{
-			// 屏蔽中断的情况下检查超时,防止超时和value不对应。
-			value = -1;
-			rt_irq_save(flags);
-			if(ustimer_get_duration(g_di_db[i].us0) >= g_di_db[i].timeout)
-			{
-
-				value = g_di_db[i].value0;
-			}
-			rt_irq_restore(flags);	
-
-			if(value!= -1)
-			{
-				g_di_db[i].bChange = 0;
-				
-				if(g_di_db_table[i].is_inv[0])
-				{
-					value ^= 2;
-				}
-				if(g_di_db_table[i].is_inv[1])
-				{
-					value ^= 1;
-				}
-
-				// 如果和旧值相等,说明信号已返回,不应送SOE。
-				if(value != g_di_db[i].value1)
-				{
-					soe_record_dpi(i,value,&g_di_db[i].ts);
-					g_di_db[i].value1 = value;
-				}
-			}
-		}
-	}
-
-	return;
+    int i, value;
+    uint32_t flags;
+
+    for (i = 0; i < g_table_head->di_db_num; i++)
+    {
+        if (g_di_db[i].bChange)
+        {
+            // 屏蔽中断的情况下检查超时,防止超时和value不对应。
+            value = -1;
+            rt_irq_save(flags);
+            if (ustimer_get_duration(g_di_db[i].us0) >= g_di_db[i].timeout)
+            {
+                value = g_di_db[i].value0;
+            }
+            rt_irq_restore(flags);
+
+            if (value != -1)
+            {
+                g_di_db[i].bChange = 0;
+
+                if (g_di_db_table[i].is_inv[0])
+                {
+                    value ^= 2;
+                }
+                if (g_di_db_table[i].is_inv[1])
+                {
+                    value ^= 1;
+                }
+
+                // 如果和旧值相等,说明信号已返回,不应送SOE。
+                if (value != g_di_db[i].value1)
+                {
+                    soe_record_dpi(i, value, &g_di_db[i].ts);
+                    g_di_db[i].value1 = value;
+                }
+            }
+        }
+    }
+
+    return;
 }
 
-
- int plc_scan(int is_rec)
+int plc_scan(int is_rec)
 {
-	static s32 r[64];
-	u16 *p,i,rp;
-
-	// 双点扫描
-	plc_db_scan();
-
-	// PLC扫描
-	for(i=0;i<g_plc_num;i++)
-	{
-		p = g_plc[i].exp;
-		rp = 0;
-		while(*p)
-		{
-			// 操作数,直接压栈
-			if(((*p)&LP_TYPE) != LP_TYPE_PLC_OPT)
-			{
-				r[rp++] = plc_get_input(*p);
-			}
-			// 运算符,出栈计算,结果压栈
-			else
-			{
-				switch(*p)
-				{
-				case PLC_LOGIC_NOT:
-					r[rp-1] = (~r[rp-1]) & 0x01;
-				break;
-				
-				case PLC_LOGIC_AND:
-					r[rp-2] = r[rp-1] & r[rp-2];
-					rp--;
-				break;
-				
-				case PLC_LOGIC_OR:
-					r[rp-2] = r[rp-1] | r[rp-2];
-					rp--;
-				break;
-				
-				case PLC_LOGIC_XOR:
-					r[rp-2] = r[rp-1] ^ r[rp-2];
-					rp--;
-				break;
-
-				default:
-					return -1;
-				}	
-			}
-
-			p++;
-		}
-
-		// 全部计算完毕,rp应该等1.
-		if(rp != 1)
-		{
-			rt_err_set(ERR_CODE_PLC,0);
-			rt_printf("plc_scan:i=%d,rp=%d\r\n",i,rp);
-		}
-
-		if(g_plc[i].result != r[rp -1])
-		{
-			g_plc[i].result = r[rp -1];
-
-			// 开出
-			if(g_plc[i].do_index)
-			{
-				int type;
-				if(g_plc[i].result)
-				{
-					type = SW_DO_TYPE_ON;
-					soe_record_opt(EV_PLC_HZ,((g_plc[i].do_owner<<8)|g_plc[i].do_index));
-				}
-				else
-				{
-					type = SW_DO_TYPE_OFF;
-					soe_record_opt(EV_PLC_TZ,((g_plc[i].do_owner<<8)|g_plc[i].do_index));
-				}
-				
-				if(g_plc[i].do_owner == 0)
-				{
-					sw_do_pub(g_plc[i].do_index-1,type);
-				}
-				else
-				{
-					sw_do(g_plc[i].do_owner-1,g_plc[i].do_index-1,type);
-				}
- 			}
-
-			// 需要送主站
-			if(g_plc[i].cp && is_rec)
-			{
-				u8 value = g_plc[i].result ? 1:0;
-				soe_record_plc(i,value,g_plc[i].flag);
-			}
-		}
-		
-	}
-
-	return 0;
+    static s32 r[64];
+    u16 *p, i, rp;
+
+    // 双点扫描
+    plc_db_scan();
+
+    // PLC扫描
+    for (i = 0; i < g_plc_num; i++)
+    {
+        p = g_plc[i].exp;
+        rp = 0;
+        while (*p)
+        {
+            // 操作数,直接压栈
+            if (((*p) & LP_TYPE) != LP_TYPE_PLC_OPT)
+            {
+                r[rp++] = plc_get_input(*p);
+            }
+            // 运算符,出栈计算,结果压栈
+            else
+            {
+                switch (*p)
+                {
+                case PLC_LOGIC_NOT:
+                    r[rp - 1] = (~r[rp - 1]) & 0x01;
+                    break;
+
+                case PLC_LOGIC_AND:
+                    r[rp - 2] = r[rp - 1] & r[rp - 2];
+                    rp--;
+                    break;
+
+                case PLC_LOGIC_OR:
+                    r[rp - 2] = r[rp - 1] | r[rp - 2];
+                    rp--;
+                    break;
+
+                case PLC_LOGIC_XOR:
+                    r[rp - 2] = r[rp - 1] ^ r[rp - 2];
+                    rp--;
+                    break;
+
+                default:
+                    return -1;
+                }
+            }
+
+            p++;
+        }
+
+        // 全部计算完毕,rp应该等1.
+        if (rp != 1)
+        {
+            rt_err_set(ERR_CODE_PLC, 0);
+            rt_printf("plc_scan:i=%d,rp=%d\r\n", i, rp);
+        }
+
+        if (g_plc[i].result != r[rp - 1])
+        {
+            g_plc[i].result = r[rp - 1];
+
+            // 开出
+            if (g_plc[i].do_index)
+            {
+                int type;
+                if (g_plc[i].result)
+                {
+                    type = SW_DO_TYPE_ON;
+                    soe_record_opt(EV_PLC_HZ, ((g_plc[i].do_owner << 8) | g_plc[i].do_index));
+                }
+                else
+                {
+                    type = SW_DO_TYPE_OFF;
+                    soe_record_opt(EV_PLC_TZ, ((g_plc[i].do_owner << 8) | g_plc[i].do_index));
+                }
+
+                if (g_plc[i].do_owner == 0)
+                {
+                    sw_do_pub(g_plc[i].do_index - 1, type);
+                }
+                else
+                {
+                    sw_do(g_plc[i].do_owner - 1, g_plc[i].do_index - 1, type);
+                }
+            }
+
+            // 需要送主站
+            if (g_plc[i].cp && is_rec)
+            {
+                u8 value = g_plc[i].result ? 1 : 0;
+                soe_record_plc(i, value, g_plc[i].flag);
+            }
+        }
+    }
+
+    return 0;
 }
 
-
 /*------------------------------ 内部函数 -------------------------------------
 内部函数以下划线‘_’开头,不需要检查参数的合法性.
 */

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

@@ -2199,7 +2199,7 @@ static DWORD GetSetTIME(float ff)
 void fresh_set_soe(WORD soe_no, bool bY, bool bFirst, int sw)
 {
     WORD code = soe_no + EV_SW_NUM * sw;
-    if (bFirst)
+    if (bFirst) // 第一次不上送
     {
         if (bY) // 开出压板状态更新到事件记录中
         {

Разница между файлами не показана из-за своего большого размера
+ 546 - 596
dtu/dtu_main_t536/app/switch.c


Некоторые файлы не были показаны из-за большого количества измененных файлов