소스 검색

增加 : 录波开入防抖投退;

lch 8 달 전
부모
커밋
fac9bb57f9

+ 2 - 1
README.md

@@ -88,4 +88,5 @@
 12. 修改 : TSETTABLE 结构,增加定值步长;
 13. 修改 : 遥测配置了故障电流之后一直突发的问题;
 14. 修改 : 自动复归复归遥测上送的故障电流;
-15. 修改 : 一些默认点表的额定值为1,避免配置转发的时候导致极值文件因系数错误无法初始化;
+15. 修改 : 一些默认点表的额定值为1,避免配置转发的时候导致极值文件因系数错误无法初始化;
+16. 增加 : 录波开入防抖投退;

+ 1 - 0
app_public/fuxi_public/fuxi_bsp/include/dido.h

@@ -122,6 +122,7 @@ int dido_do_kz(int on, unsigned int i);
 #if !defined CPU_FUXI
 int dido_di_update(uint32_t _value_new, uint8_t _index, struct timespec *ts);
 #endif
+int get_shm_dintdata(void);
 int get_shm_didata(void);
 
 #endif //_DIDO_H

+ 10 - 0
app_public/fuxi_public/fuxi_bsp/include/shm_api.h

@@ -34,6 +34,7 @@
 
 /* linux核读 RV核写 */
 #define SHM_ADDR_W_DI                   0x00000000 /* 开入量数据 */
+#define SHM_ADDR_W_DI_NT                0x00000800 /* 开入量数据 原始数据 未经防抖处理的 */
 #define SHM_ADDR_W_FREQ                 0x00001000 /* 频率 */
 #define SHM_ADDR_W_U_ADC_1              0x00020000 /* 第一片ADC采样数据区 */
 #define SHM_ADDR_W_U_ADC_2              0x00040000 /* 第二片ADC采样数据区 */
@@ -146,6 +147,15 @@ struct t_shmdata_di
     uint16_t us_crc;                  /* crc 应用不用处理 底层接口处理 */
 }__attribute__ ((packed)); /* 大小504个字节 */
 
+struct t_shmdata_dint
+{
+    uint16_t us_updata;               /* 数据更新标志 */
+    uint16_t us_op;                   /* 操作标志 */
+    uint16_t us_op_bk;                /* 操作标志备份 */
+    uint8_t di[DI_MAX];               /* 数据 */
+    uint16_t us_crc;                  /* crc 应用不用处理 底层接口处理 */
+}__attribute__ ((packed)); /* 大小504个字节 */
+
 /* 频率 */
 struct t_shmdata_freq
 {

+ 71 - 10
app_public/fuxi_public/fuxi_bsp/source/dido.c

@@ -679,6 +679,61 @@ int dido_di_update(uint32_t _value_new, uint8_t _index, struct timespec *ts)
 }
 #endif
 
+/**
+ * @brief          Get the shm didata object
+ * @return         * int
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+int get_shm_dintdata(void)
+{
+    uint8_t b_on = 0;
+    u32 ul_di_state = 0, dt = 0;
+    int l_read_ret = 0, l_cnt = 0;
+    struct t_shmdata_dint shm_data_dint = {0};
+    static uint8_t suca_dint[DI_MAX] = {0}, suca_dint_bk[DI_MAX] = {0}; /* 数据 */
+    struct timespec ts;
+    struct di_struct *pt_di = NULL;
+
+    l_read_ret = shm_packet_read_v2(SHM_ADDR_W_DI_NT, sizeof(shm_data_dint), (uint8_t *)&shm_data_dint, sizeof(struct t_shmdata_dint));
+
+    if (l_read_ret < 0)
+    {
+        return -1;
+    }
+
+    if (l_read_ret > 0)
+    {
+        memcpy((void *)&suca_dint, (void *)&shm_data_dint.di, sizeof(uint8_t) * DI_MAX);
+
+        for (uint8_t i = 0; i < DI_MAX; i++)
+        {
+            pt_di = &g_di_st[g_di_slot][i];
+            b_on = suca_dint[i];
+            if (g_di[g_di_slot].inv[0] & (1 << i))
+            {
+                b_on = !b_on;
+            }
+            pt_di->b_on = b_on;
+            ul_di_state |= b_on << i;
+
+            if (suca_dint_bk[i] != suca_dint[i])
+            {
+                // 更新记录
+                dt = g_adc_dots_count;
+                g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = dt;
+                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
+                g_di[g_di_slot].ts_i[i].n++;
+                suca_dint_bk[i] = suca_dint[i];
+            }
+        }
+    }
+
+    return l_read_ret;
+}
+
 /**
  * @brief          Get the shm didata object
  * @return         * int
@@ -726,10 +781,13 @@ int get_shm_didata(void)
                           b_on ? SW_DI_TYPE_ON : SW_DI_TYPE_OFF);
                 // 双点的值也需要重新初始化
                 plc_db_init_value(g_di_slot, i, b_on);
-                // 遥信时标
-                g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = 0;
-                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
-                g_di[g_di_slot].ts_i[i].n++;
+                if (!pRunSet->lb_dint)
+                {
+                    // 遥信时标
+                    g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = 0;
+                    g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
+                    g_di[g_di_slot].ts_i[i].n++;
+                }
             }
             memcpy((void *)&smt_di_bk, (void *)&shm_data_di.di, sizeof(struct t_sd_di_status) * DI_MAX);
             g_di[g_di_slot].bInited = TRUE;
@@ -758,12 +816,15 @@ int get_shm_didata(void)
                           pt_di->type,
                           (b_on) ? SW_DI_TYPE_ON : SW_DI_TYPE_OFF);
 
-                // 更新记录
-                dt = g_adc_dots_count;
-                g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = dt;
-                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
-                g_di[g_di_slot].ts_i[i].n++;
-                smt_di_bk[i].uc_state = smt_di[i].uc_state;
+                if (!pRunSet->lb_dint)
+                {
+                    // 更新记录
+                    dt = g_adc_dots_count;
+                    g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = dt;
+                    g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
+                    g_di[g_di_slot].ts_i[i].n++;
+                    smt_di_bk[i].uc_state = smt_di[i].uc_state;
+                }
                 // dp_err_n_c_rt("change smt_di[%02d].uc_state = %d", i, b_on);
                 // dp_err_n_c_rt("dt = %d", dt);
             }

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

@@ -1303,6 +1303,7 @@ const TSETTABLE tCstSetTable[] =
     {SETTYPE_LIST,  SET_NULL,   0,      LB_VOL_ListNum - 1, 0,      LB_VOL_List,LB_VOL_ListNum, GROUP_CSTSET_RECORD,    1,      "电压选择"},
     {SETTYPE_LIST,  SET_NULL,   0,      TTListNum - 1,      0,      TTList,     TTListNum,      GROUP_CSTSET_RECORD,    1,      "虚拟遥信记录"},
     {SETTYPE_LIST,  SET_NULL,   0,      RCL_ListNum - 1,    0,      RCL_List,   RCL_ListNum,    GROUP_CSTSET_RECORD,    1,      "遥信描述类型"},
+    {SETTYPE_LIST,  SET_NULL,   0,      TTListNum - 1,      1,      TTList,     TTListNum,      GROUP_CSTSET_RECORD,    1,      "开入数据未防抖"},
     {SETTYPE_UINT,  SET_NULL,   1,      32,                 1,      0,          0,              GROUP_CSTSET_RECORD,    1,      "本开关间隔号"},
 
     {SETTYPE_LABEL, SET_NULL,   0,      0,                  0,      0,          0,              GROUP_CSTSET_OTHERS,    0,      "辅助定值"},
@@ -2512,6 +2513,7 @@ bool MakeRunSet(bool bFirst)
     ptSet->lb_vol_type = (WORD)psetbuf[CSTSET_WAVE_VOL_TYPE].ff;                          // 录波 电压选择 0 第一组 1第二组 2全部
     ptSet->lb_xyx = (((WORD)psetbuf[CSTSET_WAVE_XNYX].ff == 1) ? true : false);           // 虚拟遥信记录
     ptSet->lb_yx_type = (((WORD)psetbuf[CSTSET_WAVE_YXDES_TYPE].ff == 1) ? true : false); // 遥信描述类型
+    ptSet->lb_dint = (((WORD)psetbuf[CSTSET_WAVE_DINT].ff == 1) ? true : false); // 开入数据未防抖
     ptSet->lb_sw_num = (WORD)psetbuf[CSTSET_WAVE_SWNUM].ff;                               // 本开关间隔号
 
     ptSet->dWCN_T = GetSetTIME(psetbuf[CSTSET_WCNALARM_T].ff);   // 未储能告警时间

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

@@ -1044,6 +1044,7 @@ enum
     CSTSET_WAVE_VOL_TYPE,     // 电压选择
     CSTSET_WAVE_XNYX,         // 虚拟遥信记录
     CSTSET_WAVE_YXDES_TYPE,   // 遥信描述类型
+    CSTSET_WAVE_DINT,         // 开入数据未防抖
     CSTSET_WAVE_SWNUM,        // 本开关间隔号
 
     CSTSET_LABEL_OTHERS,         // 列表名 辅助定值
@@ -1584,6 +1585,7 @@ typedef struct TSET
     DWORD lb_vol_type;            // 录波 电压选择 0 第一组 1第二组 2全部
     bool lb_xyx;                  // 虚拟遥信记录
     bool lb_yx_type;              // 遥信描述类型
+    bool lb_dint;                 // 开入数据未防抖
     DWORD lb_sw_num;              // 本开关间隔号
 
     DWORD dWCN_T;                 // 未储能告警时间

+ 4 - 0
dtu/dtu_main_t536/main_mod.c

@@ -414,6 +414,10 @@ int di_do_adc(void *unused)
 #ifdef CPU_FUXI
         if (0 == l_retrv_di)
         {
+            if (pRunSet->lb_dint)
+            {
+                get_shm_dintdata();
+            }
             get_shm_didata();
         }
 #endif