📄 9311yx.c
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311yx.c */
/*模块功能:创建YX任务,主要完成维护底层硬件和数据库 */
/* 完成9311的YX处理;完成9311的YK处理 */
/*编写日期:2004年8月 */
/*编写者: dingding */
/*------------------------------------------------------------------*/
#include "includes.h"
//全局变量
extern struct SysConfig SysCfg;
extern struct MyConfig MyCfg;
extern struct SysPort *SysPorts;
extern struct DBConfig *DBCfgs;
extern struct DBInitInfo *DBInfos;
extern INT8U TGSH;
extern INT16U Frequency;
extern struct AbsTime_t pAbsTime;
extern OS_EVENT *SemTimerTenMS;
extern OS_EVENT *SemTimerOneS;
//OS_STK YXTaskStack[OS_TASK_DEF_STK_SIZE*8];
extern void Time0_Test(void);
//变量定义
BOOL ACTING = FALSE;
INT8U YXCYC;
INT16U CellYX, CellYXPre; //按位的实遥信
INT16U YKArmCounter, YKOnCounter; //遥控计数器
INT16U TimeCounter1, TimeCounter2; //时间计数器
INT16U TmpCounter; //温度计数器
SOEtmp_t *SOEtmp;
BItmp_t *BItmp;
/*------------------------------------------------------------------*/
/*函数名称:void YXTask(void *pdata) */
/*函数功能:遥信任务 */
/*------------------------------------------------------------------*/
void YXTask(void *pdata)
{
BOOL dd = FALSE;
INT8U err;
INT16U tmp;
struct DBInfo info;
struct AbsTime_t time;
YKArmCounter = 0;
YKOnCounter = 1;
TimeCounter1 = TIMECYC_STORAGE/2;
TimeCounter2 = TIMECYC_READ/2;
TmpCounter = TMPCYC_READ/2;
//遥信初始化
dd = YXInit();
if (!dd)
ErrorInfo(YXID, "遥信任务初始化失败");
OSTimeDlyHMSM(0, 0, 0, 10);
while (1)
{
OSTimeDlyHMSM(0, 0, 0, 10);
Time0_Test();
YXMean();
if (YKOnCounter)
{
ACTING = TRUE;
YKOnCounter--;
if (YKOnCounter == 0)
{
YKDone();
ACTING = FALSE;
}
}
else
ACTING = FALSE;
if (YKArmCounter)
{
YKArmCounter--;
if (YKArmCounter == 0)
YKDel();
}
err = OSSemAccept(SemTimerOneS);
if (err != OS_NO_ERR)
{
Frequency_Treatment();
info.DevID = ROOTID;
info.Type = YCDATA;
info.Num = 1;
if (TGSH)
info.Start = 27;
else
info.Start = 14;
DBWrite((INT8U*)&Frequency, &info);
//存储时间
if (TimeCounter1)
{
TimeCounter1--;
if (TimeCounter1 == 0)
{
TimeCounter1 = TIMECYC_STORAGE;
info.DevID = ROOTID;
info.Type = ABSTIME;
info.Start = 0;
info.Num = 1;
GetTime((void*)&time, ABSTIME);
DBWrite((INT8U*)&time, &info);
}
}
//对软时钟对钟
if (TimeCounter2)
{
TimeCounter2--;
if (TimeCounter2 == 0)
{
TimeCounter2 = TIMECYC_READ;
GetX1226Time();
}
}
//读取温度
if (TmpCounter)
{
TmpCounter--;
if (TmpCounter == 0)
{
TmpCounter = TMPCYC_READ;
tmp = ReadTemperature();
info.DevID = ROOTID;
info.Type = YCDATA;
info.Num = 1;
if (TGSH)
info.Start = 26;
else
info.Start = 13;
DBWrite((INT8U*)&tmp, &info);
}
}
}
}//while
}
/*------------------------------------------------------------------*/
/*函数名称:YxInit(void) */
/*函数功能:初始化遥信任务,将参数付值 */
/*输出说明:成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL YXInit(void)
{
INT8U i, dd[16];
struct DBInfo info;
//初始化遥信参数--由数据库完成
//创建临时数据的存储结构
BItmp = malloc (sizeof(BItmp_t) * MyCfg.BINum);
SOEtmp = malloc (sizeof(SOEtmp_t));
if (!(BItmp && SOEtmp))
return (FALSE);
else
{
memset ((INT8U *)BItmp, 0, MyCfg.BINum * sizeof (BItmp_t));
memset ((INT8U *)SOEtmp, 0, sizeof (SOEtmp_t));
/* //从库里读取作为初始化
info.DevID = ROOTID;
info.Type = BIDATA;
info.Num = MyCfg.BINum;
rc = DBRead((INT8U*)&CellYX, &info);
CellYXPre = CellYX;*/
}
//初始化
YXCYC = MyCfg.Yxcyc;
YXRead();
for (i=0; i<MyCfg.BINum; i++)
{
if ((CellYXPre>>i) & 0x01)
{
if (MyCfg.Bi[i].Mode & BI_REVERSE)
dd[i] = YX_F;
else
dd[i] = YX_H;
}
else
{
if (MyCfg.Bi[i].Mode & BI_REVERSE)
dd[i] = YX_H;
else
dd[i] = YX_F;
}
}
CellYX = CellYXPre;
info.DevID = ROOTID;
info.Type = YXDATA;
info.Start = 0;
info.Num = MyCfg.BINum;
DBWrite(dd, &info);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:YxRead(void) */
/*函数功能:实遥信的采集,1MS中断进入 */
/*------------------------------------------------------------------*/
void YXRead(void)
{
INT8U i;
INT16U yx_tmp = 0, yx_cur = 0, xxor;
//判断遥信扫描周期
YXCYC++;
if (YXCYC < MyCfg.Yxcyc)
return;
YXCYC = 0;
yx_tmp = (*ZK1_YX) & 0xFF;
yx_tmp = yx_tmp ^ 0xFF;
yx_cur = yx_tmp;
if (TGSH)
{
yx_tmp = 0;
yx_tmp = (*ZK2_YX) & 0xFF;
yx_tmp = yx_tmp ^ 0xFF;
yx_cur |= (yx_tmp << 8);
}
if (yx_cur != CellYXPre)
{
for (i=0; i<MyCfg.BINum; i++)
{
xxor = yx_cur ^ CellYXPre;
if ((xxor & (0x01<<i)) != 0) //记录变化遥信
{
BItmp[i].DTime = MyCfg.Bi[i].DTime;
GetTime((void*)(&BItmp[i].Time), ABSTIME);
BItmp[i].Status = yx_cur & (0x0001<<i);
}
}
CellYXPre = yx_cur;
}
}
/*------------------------------------------------------------------*/
/*函数名称:YxMean(void) */
/*函数功能:防抖,确认遥信 */
/*------------------------------------------------------------------*/
void YXMean(void)
{
register INT8U i;
register BOOL rc = FALSE;
struct DBInfo info;
for (i=0; i<MyCfg.BINum; i++)
{
if (BItmp[i].DTime > 0)
{
BItmp[i].DTime--;
if (BItmp[i].DTime == 0)
{
if (BItmp[i].Status != (CellYX & (0x0001<<i))) //遥信变化有效
{
CellYX = (CellYX & (~(0x0001<<i))) | BItmp[i].Status;
SOE[HEAD].No = i;
if (BItmp[i].Status)
SOE[HEAD].Status = YX_H;
else
SOE[HEAD].Status = YX_F;
SOE[HEAD].Time = BItmp[i].Time;
HEAD++;
if (HEAD >= SOE_NUM_TMP)
HEAD = 0;
rc = TRUE;
}
}
}
}
if (rc)
{
info.DevID = ROOTID;
info.Type = BIDATA;
info.Num = MyCfg.BINum;
DBWrite((INT8U*)&CellYX, &info);
SOETask(ROOTID, FALSE);
}
}
/*------------------------------------------------------------------*/
/*函数名称:SOETask() */
/*函数功能:遥信判断,将需要的遥信、SOE、COS写入数据库中 */
/*------------------------------------------------------------------*/
void SOETask(INT16U DevID, BOOL SOEYES)
{
INT8U i, j, num, rc, k;
INT16U ID;
struct COS_t cos[10];
struct DBInfo info;
num = 0;
rc = 0;
while (HEAD != FAIL)
{
num = (HEAD >= FAIL) ? (HEAD - FAIL) : (SOE_NUM_TMP + HEAD - FAIL);
for (i=0; i<num; i++)
{
k = (FAIL + i) % SOE_NUM_TMP;
ID = SOE[k].No;
if (ID < MyCfg.BINum)
{
if (MyCfg.Bi[ID].Mode & BI_REVERSE)
{
if (SOE[k].Status == YX_H)
SOE[k].Status = YX_F;
else
SOE[k].Status = YX_H;
}
//DoneYK
if (YKOnCounter)
{
for (j=0; j<MyCfg.FDNum; j++)
if (MyCfg.Fd[j].Yxzt == ID)
YKOKDone(ID);
}
if ((MyCfg.Bi[ID].Mode & BI_ENABLE) == BI_ENABLE)
{
//写YX
cos[rc].No = ID;
cos[rc].Status = SOE[k].Status;
rc++;
if (rc == 10)
{
info.DevID = DevID;
info.Type = YXDOTDATA;
info.Num = rc;
DBWrite((INT8U*)cos, &info);
rc = 0;
}
//写SOE
if ((MyCfg.Bi[ID].Mode & BI_SOEYES) == BI_SOEYES)
{
info.DevID = DevID;
info.Type = SOEDATA;
info.Num = 1;
DBWrite((INT8U*)&(SOE[k].No), &info);
}
}
}
else //虚拟遥信
{
cos[rc].No = ID;
cos[rc].Status = SOE[k].Status;
rc++;
if (rc == 10)
{
info.DevID = DevID;
info.Type = YXDOTDATA;
info.Num = rc;
DBWrite((INT8U*)cos, &info);
rc = 0;
}
if (SOEYES)
{
info.DevID = DevID;
info.Type = SOEDATA;
info.Num = 1;
DBWrite((INT8U*)&(SOE[k].No), &info);
}
}
}
if (rc)
{
info.DevID = DevID;
info.Type = YXDOTDATA;
info.Num = rc;
DBWrite((INT8U*)cos, &info);
rc = 0;
}
FAIL = (FAIL + num) % SOE_NUM_TMP;
}
}
/*------------------------------------------------------------------*/
/*函数名称:YKSet(INT8U No, BOOL ON_OFF, INT16U Time) */
/*函数功能:遥控预置(不支持同时多路遥控) */
/*输入说明:No-遥控号;ON_OFF-合/分;Time-预置时间(10MS),为0时取默认*/
/*输出说明:成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL YKSet(INT8U No, BOOL ON_OFF, INT16U Time)
{
INT16U tmp, number, rc;
if ((No>3) && (!TGSH))
return (FALSE);
//正在执行时无法预置
rc = ((*ZK1_YKFX) & FYKFE);
if (TGSH)
rc |= ((*ZK2_YKFX) & FYKFE);
if (rc != 0)
return (FALSE);
number = (No - 1) * 2;
if (!ON_OFF)
number += 1;
if (No > 3)
{
number -= 6;
tmp = (0x0001 << number);
*ZK2_YKHF = tmp;
OSTimeDly(1);
rc = ((*ZK2_YKFX) & FYKFS);
if (rc != tmp)
return (FALSE);
}
else
{
tmp = (0x0001 << number);
*ZK1_YKHF = tmp;
OSTimeDly(1);
rc = ((*ZK1_YKFX) & FYKFS);
if (rc != tmp)
return (FALSE);
}
if (Time == 0)
YKArmCounter = MyCfg.Bo[No-1].ArmTime;
else
YKArmCounter = Time;
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:YKDel(void) */
/*函数功能:遥控预置撤销,失败时再执行一边 */
/*------------------------------------------------------------------*/
void YKDel(void)
{
INT16U rc, tmp;
tmp = 0x0000;
rc = ((*ZK1_YKFX) & FYKFE);
if (TGSH)
rc |= ((*ZK2_YKFX) & FYKFE);
if (rc != tmp)
{
YKArmCounter = YKOnCounter + 1; //dingding??
return;
}
*ZK1_YKHF = tmp;
if (TGSH)
*ZK2_YKHF = tmp;
OSTimeDly(1);
rc = ((*ZK1_YKFX) & FYKFS);
if (rc != tmp)
*ZK1_YKHF = tmp;
if (TGSH)
{
rc = ((*ZK2_YKFX) & FYKFS);
if (rc != tmp)
*ZK2_YKHF = tmp;
}
OSTimeDly(2);
}
/*------------------------------------------------------------------*/
/*函数名称:YKExe(INT8U No, BOOL ON_OFF, INT16U Time) */
/*函数功能:遥控执行 */
/*输入说明:No-遥控号;ON_OFF-合/分;Time-执行时间(10MS),为0时取默认*/
/*输出说明:成功返回TRUE */
/*------------------------------------------------------------------*/
BOOL YKExe(INT8U No, BOOL ON_OFF, INT16U Time)
{
INT16U tmp, number, rc;
number = (No - 1) * 2;
if (!ON_OFF)
number += 1;
if (No > 3)
{
number -= 6;
tmp = (0x0001 << number);
rc = ((*ZK2_YKFX) & FYKF);
if (rc != tmp)
return (FALSE);
*ZK2_YKS = FYKS;
*ZK2_YKHF = FYKE | tmp;
OSTimeDly(1);
rc = ((*ZK2_YKFX) & FYKFE);
if (rc != FYKSE)
return (FALSE);
}
else
{
tmp = (0x0001 << number);
rc = ((*ZK1_YKFX) & FYKF);
if (rc != tmp)
return (FALSE);
*ZK1_YKS = FYKS;
*ZK1_YKHF = FYKE | tmp;
OSTimeDly(1);
rc = ((*ZK1_YKFX) & FYKFE);
if (rc != FYKSE)
return (FALSE);
}
if (Time == 0)
YKOnCounter = MyCfg.Bo[No-1].OnTime;
else
YKOnCounter = Time;
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:YKDone(void) */
/*函数功能:遥控执行完成 */
/*------------------------------------------------------------------*/
void YKDone(void)
{
INT16U rc, tmp;
tmp = 0x0000;
if (TGSH)
{
*ZK2_YKS = tmp;
*ZK2_YKHF = tmp;
}
*ZK1_YKS = tmp;
*ZK1_YKHF = tmp;
OSTimeDly(1);
if (TGSH)
{
rc = ((*ZK2_YKFX) & FYKF);
if (rc != tmp)
{
*ZK2_YKS = tmp;
*ZK2_YKHF = tmp;
}
}
rc = ((*ZK1_YKFX) & FYKF);
if (rc != tmp)
{
*ZK1_YKS = tmp;
*ZK1_YKHF = tmp;
}
OSTimeDly(2);
}
/*------------------------------------------------------------------*/
/*函数名称:YKOKDone() */
/*函数功能:遥控提前完成 */
/*------------------------------------------------------------------*/
void YKOKDone(INT16U No)
{
//MyCfg.Fd[i].Control & DOUBLEBI))
//if (MyCfg.Fd[j].Yxzt2 == cos[dd].No)
if (YKOnCounter)
{
YKDone();
YKOnCounter = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -