📄 9311db.c
字号:
control = pCode->Control;
real_control = (control >> 6) & 0x03;
if (real_control == 0x03)
{
pCode->Status = BORCERROR;
return ;
}
else
{
if (pCode->Control & BOCLOSE)
on_off = TRUE;
else if (pCode->Control & BOOPEN)
on_off = FALSE;
}
if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC) //不可能为逻辑库
{
pCode->Status = BORCERROR;
return ;
}
/* flag = FALSE;
for (i=0; i<DBCfgs[pInfo->DevID].YKNum; i++)
{
if (DBCfgs[pInfo->DevID].Info.Real.pBO[i].ID == pInfo->Start)
{
attr = DBCfgs[pInfo->DevID].Info.Real.pBO[i].Status & 0x03;
if (attr == real_control)
{
flag = TRUE;
base = i;
if (DBCfgs[pInfo->DevID].Info.Real.LogDevID[0] == pInfo->SuperID)
id = DBCfgs[pInfo->DevID].Info.Real.pBO[i].Index[0];
else if (DBCfgs[pInfo->DevID].Info.Real.LogDevID[1] == pInfo->SuperID)
id = DBCfgs[pInfo->DevID].Info.Real.pBO[i].Index[1];
else
id = DBCfgs[pInfo->DevID].Info.Real.pBO[i].ID;
break;
}
}
}
if (!flag)
{
pCode->Status = BORCERROR;
return ;
}
*/
//记录操作,不再判断正确性
i = DBCommQs.Cur;
DBCommQs.Cur = (DBCommQs.Cur + 1) % DBCommQs.Max;
DBCommQs.Info[i].DevID = pInfo->DevID;
DBCommQs.Info[i].ID = pInfo->Start;
DBCommQs.Info[i].Status = control;
if (pInfo->Num & BOSELECT)
DBCommQs.Info[i].Flag = BOOPSELECT;
else if (pInfo->Num & BOOPERATE)
DBCommQs.Info[i].Flag = BOOPOPERATE;
else
{
pCode->Status = BORCERROR;
return ;
}
if (pInfo->Num & BOOPFAIL)
DBCommQs.Info[i].Flag |= BOOPERROR;
if (control & BODEL)
DBCommQs.Info[i].Flag |= BOOPDEL;
if (i == 0)
j = DBCommQs.Max - 1;
else
j = i - 1;
flag = FALSE;
for ( ; j!=i; j--)
{
if (DBCommQs.Info[j].DevID == DBCommQs.Info[i].DevID)
if (DBCommQs.Info[j].ID == DBCommQs.Info[i].ID)
if (DBCommQs.Info[j].Status == DBCommQs.Info[i].Status)
if ((DBCommQs.Info[j].Flag & 0x7) == (DBCommQs.Info[i].Flag & 0x07))
{
flag = TRUE;
DBCommQs.Info[i].SuperID = DBCommQs.Info[j].SuperID;
DBCommQs.Info[i].SID = DBCommQs.Info[j].SID;
break;
}
if (j == 0)
j = DBCommQs.Max - 1;
}
if (!flag)
{
pCode->Status = BORCERROR;
return ;
}
rc = GetPortofDB(DBCommQs.Info[i].SuperID);
if (rc != 0xFFFF)
{
err = OSQPostFront (SysPorts[rc].CommQ, &DBCommQs.Info[i]);
if (err != OS_NO_ERR)
{
if (err == OS_Q_FULL)
{
OSQFlush (SysPorts[rc].CommQ);
OSQPostFront (SysPorts[rc].CommQ, &DBCommQs.Info[i]);
}
else
ErrorInfo(OSPrioCur, "数据库发送消息失败1400");
}
OSFlagPost (SysPorts[rc].Event, FBOOP, OS_FLAG_SET, &err);
if (err != OS_NO_ERR)
ErrorInfo(OSPrioCur, "数据库发送失败");
}
pCode->Status = BORCOK;
}
/*------------------------------------------------------------------*/
/*函数名称:DBMsgSend() */
/*函数功能:向应用层发送信息 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
void DBMsgSend(struct DBMSGCheck *Msg, INT16U Flag)
{
INT8U err;
INT16U i, rc;
for (i=0; i<Msg->Num; i++)
{
rc = GetPortofDB(Msg->DevID[i]);
if ((rc != 0xFFFF) && SysPorts[rc].Flag)
{
OSFlagPost (SysPorts[rc].Event, Flag, OS_FLAG_SET, &err);
if (err != OS_NO_ERR)
ErrorInfo(OSPrioCur, "数据库发送失败");
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:GetPortofDB() */
/*函数功能:获得设备所在系统端口地址 */
/*输入说明:设备号 */
/*输出说明:所在端口,错误返回0xFFFF */
/*------------------------------------------------------------------*/
INT16U GetPortofDB(INT16U DevID)
{
INT16U i, j;
if (DevID >= SysCfg.DBAllNum)
return (0xFFFF);
for (i=1; i<SysCfg.PortNum; i++)
for (j=0; j<SysPorts[i].DevNum; j++)
if (SysPorts[i].DBCfgs[j].DevID == DevID)
return (i);
return (0);
}
/*------------------------------------------------------------------*/
/*函数名称:GetX1226Time(void) */
/*函数功能:读取硬时钟,直接写入软时钟 */
/*------------------------------------------------------------------*/
void GetX1226Time(void)
{
struct X1226Time_t XTime;
INT8U i;
INT16U mm[12] = {44640, 28, 44640, 43200, 44640, 43200, 44640, 44640, 43200, 44640, 43200, 44640};
INT8U rxBuffer[8];
INT32U t;
//读取硬时钟
ReadSysTime((TSysTime*)(&rxBuffer));
XTime.Second = rxBuffer[0]%16 + rxBuffer[0]/16*10;
XTime.Minute = rxBuffer[1]%16 + rxBuffer[1]/16*10;
if(rxBuffer[2] & MIL)
XTime.Hour = rxBuffer[2]%16 + (rxBuffer[2]&0x7F)/16*10;
else //防止底层读取非24小时制
{
XTime.Hour = rxBuffer[2]%16 + (rxBuffer[2]&0x1F)/16*10;
if(rxBuffer[2] & H21)
XTime.Hour += 12;
}
XTime.Day = rxBuffer[3]%16 + rxBuffer[3]/16*10;
XTime.Month = rxBuffer[4]%16 + rxBuffer[4]/16*10;
XTime.Year = rxBuffer[5]%16 + rxBuffer[5]/16*10;
XTime.Week = rxBuffer[6]%16 + rxBuffer[6]/16*10;
XTime.YearH = rxBuffer[7]%16 + rxBuffer[7]/16*10;
if ((XTime.Year & 0x03) == 0)
mm[1] = 41760;
else
mm[1] = 40320;
t = 0;
if(XTime.YearH == 19)
{
for(i=70; i<XTime.Year; i++)
{
if((i & 0x03) == 0)
t += 527040; //366*24*60
else
t += 525600; //365*24*60
}
}
else
{
t += 0xF0C120;
for(i=00; i<XTime.Year; i++)
{
if((i & 0x03) == 0)
t += 527040; //366*24*60
else
t += 525600; //365*24*60
}
}
for(i=1; i<XTime.Month; i++)
t += mm[i-1]; //24*60;
if(XTime.Day == 0)
XTime.Day = 1;
t += (XTime.Day-1) * 1440; //24*60;
t += XTime.Hour * 60; //60;
t += XTime.Minute;
pAbsTime.Minute = t;
pAbsTime.Msecond %= 1000;
pAbsTime.Msecond += (INT16U)XTime.Second * 1000;
}
/*------------------------------------------------------------------*/
/*函数名称:GetTime(void *Time, INT8U Format) */
/*函数功能:读取时钟 */
/*------------------------------------------------------------------*/
void GetTime(void *Time, INT8U Format)
{
struct AbsTime_t time;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
memcpy ((INT8U*)&time, (INT8U*)&pAbsTime, sizeof (struct AbsTime_t));
OS_EXIT_CRITICAL();
TimeChangeAbs(Time, Format, (void*)&time);
}
/*------------------------------------------------------------------*/
/*函数名称:SetTime(void *Time, INT8U Format) */
/*函数功能:对时,同时对硬时钟(没有毫秒,采取在秒上加1秒的方式) */
/* 和软时钟对钟 */
/*------------------------------------------------------------------*/
void SetTime(void *Time, INT8U Format)
{
struct SysTime_t SysTime;
struct AbsTime_t AbsTime;
struct X1226Time_t XTime;
TimeChangeToAbs((void*)&AbsTime, Time, Format);
TimeChangeToSYS((void*)&SysTime, (void*)&AbsTime, ABSTIME);
XTime.Second = SysTime.Second%10 + SysTime.Second/10*16;
XTime.Minute = SysTime.Minute%10 + SysTime.Minute/10*16;
XTime.Hour = SysTime.Hour%10 + SysTime.Hour/10*16;
XTime.Day = SysTime.Day%10 + SysTime.Day/10*16;
XTime.Month = SysTime.Month%10 + SysTime.Month/10*16;
XTime.Year = SysTime.Year%100;
XTime.YearH = SysTime.Year/100;
XTime.Year = XTime.Year%10 + XTime.Year/10*16;
XTime.YearH = XTime.YearH%10 + XTime.YearH/10*16;
//软时钟对钟
pAbsTime.Minute = AbsTime.Minute;
pAbsTime.Msecond = AbsTime.Msecond;
//硬时钟对钟
at91_irq_close ( WDI_ID );
TimeCounter2 = TIMECYC_READ;
WriteSysTime((TSysTime*)(&XTime));
at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);
}
/*------------------------------------------------------------------*/
/*函数名称:TimeChange() */
/*函数功能:时间格式的相互转换 */
/*输入说明:DTime:期望时间格式的输出内容;DFormat:期望的时间格式 */
/* STime:输入时间格式的输入内容;SFormat:输入的时间格式 */
/*------------------------------------------------------------------*/
void TimeChange(void* DTime, INT8U DFormat, void* STime, INT8U SFormat)
{
struct AbsTime_t time;
switch (SFormat)
{
case ABSTIME:
TimeChangeAbs(DTime, DFormat, STime);
break;
case SYSTIME:
break;
default :
if (DFormat == ABSTIME)
TimeChangeToAbs(DTime, STime, SFormat);
else if (DFormat == SYSTIME)
TimeChangeToSYS(DTime, STime, SFormat);
else
{
TimeChangeToAbs((void*)&time, STime, SFormat);
TimeChangeAbs(DTime, DFormat, (void*)&time);
}
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:TimeChangeAbs() */
/*函数功能:将绝对时间转换成期望的时间格式 */
/*输入说明:DTime:期望时间格式的输出内容;DFormat:期望的时间格式 */
/* STime:输入绝对时间格式的输入内容 */
/*------------------------------------------------------------------*/
void TimeChangeAbs(void* DTime, INT8U DFormat, void* STime)
{
struct SysTime_t SysTime;
long long dd;
INT16U t;
switch (DFormat)
{
case SYSTIME:
TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, &SysTime);
t = ((struct AbsTime_t*)STime)->Msecond;
SysTime.Second = (INT8U)(t / 1000);
SysTime.MSecond = (INT16U)(t % 1000);
((struct SysTime_t*)DTime)->Year = SysTime.Year;
((struct SysTime_t*)DTime)->Month = SysTime.Month;
((struct SysTime_t*)DTime)->Day = SysTime.Day;
((struct SysTime_t*)DTime)->Hour = SysTime.Hour;
((struct SysTime_t*)DTime)->Minute = SysTime.Minute;
((struct SysTime_t*)DTime)->Second = SysTime.Second;
((struct SysTime_t*)DTime)->MSecond = SysTime.MSecond;
break;
case ABSTIME:
memcpy (DTime, STime, sizeof (struct AbsTime_t));
break;
case DNPTIME:
dd = ((struct AbsTime_t*)STime)->Minute;
dd = dd * 60000 + ((struct AbsTime_t*)STime)->Msecond;
for (t=0; t<6; t++)
{
((struct DnpTime_t *)DTime)->Times[t] = (INT8U)dd;
dd = dd>>8;
}
break;
case IEC101TIME:
TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, &SysTime);
t = ((struct AbsTime_t*)STime)->Msecond;
SysTime.Second = (INT8U)(t / 1000);
SysTime.MSecond = (INT16U)(t % 1000);
((struct IEC101Time_t*)DTime)->MSecond = SysTime.Second*1000 + SysTime.MSecond;
((struct IEC101Time_t*)DTime)->Minute = SysTime.Minute;
((struct IEC101Time_t*)DTime)->Hour = SysTime.Hour;
((struct IEC101Time_t*)DTime)->Day = SysTime.Day;
((struct IEC101Time_t*)DTime)->Month = SysTime.Month;
((struct IEC101Time_t*)DTime)->Year = SysTime.Year % 100;
break;
case IEC101EXTTIME:
TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, &SysTime);
t = ((struct AbsTime_t*)STime)->Msecond;
SysTime.Second = (INT8U)(t / 1000);
SysTime.MSecond = (INT16U)(t % 1000);
((struct IEC101Time_t*)DTime)->MSecond = SysTime.Second*1000 + SysTime.MSecond;
((struct IEC101Time_t*)DTime)->Minute = SysTime.Minute;
((struct IEC101Time_t*)DTime)->Hour = SysTime.Hour;
((struct IEC101Time_t*)DTime)->Day = SysTime.Day;
((struct IEC101Time_t*)DTime)->Month = SysTime.Month + (SysTime.Year / 0x100) * 0x10;
((struct IEC101Time_t*)DTime)->Year = SysTime.Year % 0x100;
break;
default:
ErrorInfo(ROOTID, "未知的时间格式!");
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:TimeChangeToAbs() */
/*函数功能:将输入的时间格式内容转换成绝对时间格式 */
/*输入说明:DTime:绝对时间格式的输出内容; */
/* STime:输入时间格式的输入内容;SFormat:输入的时间格式 */
/*------------------------------------------------------------------*/
void TimeChangeToAbs(void* DTime, void* STime, INT8U SFormat)
{
long long dd;
struct SysTime_t SysTime;
switch (SFormat)
{
case SYSTIME:
((struct AbsTime_t*)DTime)->Minute = TimeSysToAbs((struct SysTime_t*)STime);
((struct AbsTime_t*)DTime)->Msecond = ((struct SysTime_t*)STime)->MSecond + ((struct SysTime_t*)STime)->Second * 1000;
break;
case ABSTIME:
memcpy (DTime, STime, sizeof (struct AbsTime_t));
break;
case DNPTIME:
dd = ((struct DnpTime_t*)STime)->Times[5];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[4];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[3];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[2];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[1];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[0];
((struct AbsTime_t*)DTime)->Minute = (INT32U)(dd / 60000);
((struct AbsTime_t*)DTime)->Msecond = (INT16U)(dd % 60000);
break;
case IEC101TIME:
TimeChangeToSYS((void*)&SysTime, STime, IEC101TIME);
((struct AbsTime_t*)DTime)->Minute = TimeSysToAbs(&SysTime);
((struct AbsTime_t*)DTime)->Msecond = SysTime.MSecond + SysTime.Second * 1000;
break;
case IEC101EXTTIME:
TimeChangeToSYS((void*)&SysTime, STime, IEC101EXTTIME);
((struct AbsTime_t*)DTime)->Minute = TimeSysToAbs(&SysTime);
((struct AbsTime_t*)DTime)->Msecond = SysTime.MSecond + SysTime.Second * 1000;
break;
default:
ErrorInfo(ROOTID, "未知的时间格式!");
break;
}
}
/*------------------------------------------------------------------*/
/*函数名称:TimeChangeToSYS() */
/*函数功能:将输入的时间格式内容转换成系统时间格式 */
/*输入说明:DTime:系统时间格式的输出内容; */
/* STime:输入时间格式的输入内容;SFormat:输入的时间格式 */
/*------------------------------------------------------------------*/
void TimeChangeToSYS(void* DTime, void* STime, INT8U SFormat)
{
long long dd;
INT16U tmp;
switch (SFormat)
{
case SYSTIME:
memcpy (DTime, STime, sizeof (struct SysTime_t));
break;
case ABSTIME:
((struct SysTime_t*)DTime)->Second = (INT8U)(((struct AbsTime_t*)STime)->Msecond / 1000);
((struct SysTime_t*)DTime)->MSecond = (INT16U)(((struct AbsTime_t*)STime)->Msecond % 1000);
TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, (struct SysTime_t*)DTime);
break;
case DNPTIME:
dd = ((struct DnpTime_t*)STime)->Times[5];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[4];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[3];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[2];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[1];
dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[0];
((struct SysTime_t*)DTime)->Second = (INT8U)((INT16U)(dd % 60000) / 1000);
((struct SysTime_t*)DTime)->MSecond = (INT16U)((INT16U)(dd % 60000) % 1000);
TimeAbsToSys((INT32U)(dd / 60000), (struct SysTime_t*)DTime);
break;
case IEC101TIME:
((struct SysTime_t*)DTime)->MSecond = ((struct IEC101Time_t*)STime)->MSecond % 1000;
((struct SysTime_t*)DTime)->Second = ((struct IEC101Time_t*)STime)->MSecond / 1000;
((struct SysTime_t*)DTime)->Minute = ((struct IEC101Time_t*)STime)->Minute & 0x3F;
((struct SysTime_t*)DTime)->Hour = ((struct IEC101Time_t*)STime)->Hour & 0x1F;
((struct SysTime_t*)DTime)->Day = ((struct IEC101Time_t*)STime)->Day & 0x1F;
((struct SysTime_t*)DTime)->Month = ((struct IEC101Time_t*)STime)->Month & 0x0F;
tmp = ((struct IEC101Time_t*)STime)->Year & 0x7F;
if (tmp < 70)
((struct SysTime_t*)DTime)->Year
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -