📄 yxscantask.cpp
字号:
// YxscanTask.cpp: implementation of the CYxscanTask class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FLADS.h"
#include "YxscanTask.h"
#include "MainFrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CFLADSApp theApp;
CYxscanTask::CYxscanTask()
{
int i;
YxRun = FALSE;
if(BeginYxscan()==false) AfxMessageBox(_T("创建遥信模块失败"));
if(InitPostStation()==false) AfxMessageBox(_T("创建邮件栈失败"));
pWnd=(CMainFrame*)AfxGetMainWnd();
for(i=0;i<MAXKRNUM;i++)
{
bvtm[i]=1000;
jgtm[i]=0;
con_in[i].Value=0;
con_out[i].Value=0;
ms_count[i]=0;
mulse[i]=0;
}
for(i=0;i<MAXKRNUM/8;i++)
{
yxbuf[i].Value=0;
krbuf[i].Value=0;
oldkr[i].Value=0;
newkr[i].Value=0;
chgkr[i].Value=0;
ysfg[i].Value=0;
yscon[i]=0;
}
OpenFile();
dms=0;
}
CYxscanTask::~CYxscanTask()
{
EndYxscan();
}
BOOL CYxscanTask::OpenFile()
{
FILE *fp;
int i,j;
fp=fopen("\\diskc\\plc.dat","rb");
if (fp==NULL)
{
SaveFile();
} else
{
for(i=0;i<MAXKRNUM;i++)
{
fread((unsigned int *) &(bvtm[i]), sizeof(unsigned int), 1,fp);
if(bvtm[i]<10) bvtm[i]=100;
fread((unsigned long *)&(con_in[i].Value), sizeof(unsigned long),1,fp);
fread((unsigned long *)&(con_out[i].Value), sizeof(unsigned long),1,fp);
fread((double *) &(etime[i]), sizeof(double), 1,fp);
fread((unsigned int *) &(up_time[i]), sizeof(unsigned int), 1,fp);
fread((unsigned int *) &(dn_time[i]), sizeof(unsigned int), 1,fp);
for(j=0;j<8;j++)
{
fread((unsigned int *)&(us[i][j]), sizeof(unsigned int), 1,fp);
if(us[i][j]>255) us[i][j]=255;
fread((unsigned int *)&(outs[i][j]), sizeof(unsigned int), 1,fp);
if(outs[i][j]>255) outs[i][j]=255;
}
}
fclose(fp);
}
return true;
}
BOOL CYxscanTask::SaveFile()
{
FILE *fp;
int i,j;
fp=fopen("\\diskc\\plc.dat","wb");
for(i=0;i<MAXKRNUM;i++)
{
if(bvtm[i]<10) bvtm[i]=100;
fwrite((unsigned int *) &(bvtm[i]), sizeof(unsigned int), 1,fp);
fwrite((unsigned long *)&(con_in[i].Value), sizeof(unsigned long),1,fp);
fwrite((unsigned long *)&(con_out[i].Value), sizeof(unsigned long),1,fp);
fwrite((double *) &(etime[i]), sizeof(double), 1,fp);
fwrite((unsigned int *) &(up_time[i]), sizeof(unsigned int), 1,fp);
fwrite((unsigned int *) &(dn_time[i]), sizeof(unsigned int), 1,fp);
for(j=0;j<8;j++)
{
fwrite((unsigned int *)&(us[i][j]), sizeof(unsigned int), 1,fp);
if(us[i][j]>255) us[i][j]=255;
fwrite((unsigned int *)&(outs[i][j]), sizeof(unsigned int), 1,fp);
if(outs[i][j]>255) outs[i][j]=255;
}
}
fclose(fp);
return true;
}
BOOL CYxscanTask::BeginYxscan()
{
if (YxRun == FALSE)
{
YxRun = TRUE;
YxscanThreadHandle = CreateThread(
(LPSECURITY_ATTRIBUTES)NULL, // pointer to thread security attributes
0, // initial thread stack size, in bytes
(LPTHREAD_START_ROUTINE)ThreadFunc, // pointer to thread function
this, // argument for new thread
0, // creation flags
&YxscanThreadId // pointer to returned thread identifier
);
}
return TRUE;
}
BOOL CYxscanTask::EndYxscan()
{
if (YxRun == TRUE)
{
YxRun = FALSE;
Sleep(100);
CloseHandle(YxscanThreadHandle);
}
return TRUE;
}
BOOL CYxscanTask::InitPostStation(void)
{
int i; //空邮件栈
struct Mail *TempPtr;
PostStation.MailQueueLength=0;
PostStation.MailQueueHead=NULL;
for(i=0;i<MAXEMPMAIL;i++)
{
TempPtr=&Message[i];
TempPtr->Link=PostStation.MailQueueHead;
PostStation.MailQueueHead=TempPtr;
PostStation.MailQueueLength++;
};
PostStation.TotMailNum=PostStation.MailQueueLength;
return(TRUE);
}
void CYxscanTask::TFreeAMail(struct Mail *p)
{
p->Link=PostStation.MailQueueHead;
PostStation.MailQueueHead=p;
PostStation.MailQueueLength++;
}
struct Mail *CYxscanTask::ReceiveAMail(void)
{
struct Mail *p;
if(MailQueueHead==NULL)
{
return(NULL);
}
p=MailQueueHead;
if((MailQueueHead=MailQueueHead->Link)==NULL)
{
MailQueueTail=NULL;
};
MailQueueLength--;
p->Link=NULL;
return(p);
}
BOOL CYxscanTask::TSendAMail(struct Mail *p)
{
if(MailQueueHead)
{
MailQueueTail->Link=p;
MailQueueTail=p;
p->Link=NULL;
}else
{
MailQueueHead=p;
MailQueueTail=p;
p->Link=NULL;
};
MailQueueLength++;
return(TRUE);
}
struct Mail *CYxscanTask::TGetAEnvelope(void)//获取空邮件
{
struct Mail *p;
if(PostStation.MailQueueHead)//PostStation放空邮箱
{
p=PostStation.MailQueueHead;//使P指向当前邮箱
PostStation.MailQueueHead=PostStation.MailQueueHead->Link;//指向下一个邮箱
PostStation.MailQueueLength--; //空邮箱数-1
p->Link=NULL;
return(p);
}else //--------------------------------------------
{
if(PostStation.TotMailNum>=MAXEMPMAIL)
{
return(NULL);
}else
{
if((p=(struct Mail *)malloc(sizeof(struct Mail)))==NULL)
{
return(NULL);
};
PostStation.TotMailNum++;
p->Link=NULL;
return(p);
}
}
}
BOOL CYxscanTask::TRead(unsigned char *buf)//从邮箱中读取MAIL
{
struct Mail *p;
if((p=ReceiveAMail())!=NULL)
{
memcpy(buf,p->Data,p->Data[0]);
TFreeAMail(p);
return(buf[0]);
}else return(0);
}
BOOL CYxscanTask::TWrite(unsigned char *buf)//将报文写入MAIL--p中并放入邮箱
{
struct Mail *p;
if((p=TGetAEnvelope())!=NULL) //取出空邮件
{
memcpy(p->Data,buf,buf[0]);//将报文写入MAIL--p中
if(TSendAMail(p))
{
return(TRUE); //将当前邮件放入邮件序列中
}else
{
TFreeAMail(p);
return(FALSE);
}
}
return(FALSE);
}
BOOL CYxscanTask::BitTestChar(union KRBUF_STRUCT *p, int num)
{
union KRBUF_STRUCT ch;
int i,j;
i=num/8;
j=num%8;
ch=(*(p+i));
switch(j)
{
case 0: if(ch.B.bit0==0) return false;
else return true;
break;
case 1: if(ch.B.bit1==0) return false;
else return true;
break;
case 2: if(ch.B.bit2==0) return false;
else return true;
break;
case 3: if(ch.B.bit3==0) return false;
else return true;
break;
case 4: if(ch.B.bit4==0) return false;
else return true;
break;
case 5: if(ch.B.bit5==0) return false;
else return true;
break;
case 6: if(ch.B.bit6==0) return false;
else return true;
break;
case 7: if(ch.B.bit7==0) return false;
else return true;
break;
}
return false;
}
void CYxscanTask::BitSetChar(union KRBUF_STRUCT *p, int num)
{
int i,j;
i=num/8;
j=num%8;
switch(j)
{
case 0: (*(p+i)).B.bit0=1;
break;
case 1: (*(p+i)).B.bit1=1;
break;
case 2: (*(p+i)).B.bit2=1;
break;
case 3: (*(p+i)).B.bit3=1;
break;
case 4: (*(p+i)).B.bit4=1;
break;
case 5: (*(p+i)).B.bit5=1;
break;
case 6: (*(p+i)).B.bit6=1;
break;
case 7: (*(p+i)).B.bit7=1;
break;
}
}
void CYxscanTask::BitClrChar(union KRBUF_STRUCT *p, int num)
{
int i,j;
i=num/8;
j=num%8;
switch(j)
{
case 0: (*(p+i)).B.bit0=0;
break;
case 1: (*(p+i)).B.bit1=0;
break;
case 2: (*(p+i)).B.bit2=0;
break;
case 3: (*(p+i)).B.bit3=0;
break;
case 4: (*(p+i)).B.bit4=0;
break;
case 5: (*(p+i)).B.bit5=0;
break;
case 6: (*(p+i)).B.bit6=0;
break;
case 7: (*(p+i)).B.bit7=0;
break;
}
}
void CYxscanTask::BitXorChar(union KRBUF_STRUCT *p, int num)
{
int i,j;
union KRBUF_STRUCT ch;
i=num/8;
j=num%8;
ch=(*(p+i));
switch(j)
{
case 0: if(ch.B.bit0==0) (*(p+i)).B.bit0=1;
else (*(p+i)).B.bit0=0;
break;
case 1: if(ch.B.bit1==0) (*(p+i)).B.bit1=1;
else (*(p+i)).B.bit1=0;
break;
case 2: if(ch.B.bit2==0) (*(p+i)).B.bit2=1;
else (*(p+i)).B.bit2=0;
break;
case 3: if(ch.B.bit3==0) (*(p+i)).B.bit3=1;
else (*(p+i)).B.bit3=0;
break;
case 4: if(ch.B.bit4==0) (*(p+i)).B.bit4=1;
else (*(p+i)).B.bit4=0;
break;
case 5: if(ch.B.bit5==0) (*(p+i)).B.bit5=1;
else (*(p+i)).B.bit5=0;
break;
case 6: if(ch.B.bit6==0) (*(p+i)).B.bit6=1;
else (*(p+i)).B.bit6=0;
break;
case 7: if(ch.B.bit7==0) (*(p+i)).B.bit7=1;
else (*(p+i)).B.bit7=0;
break;
}
}
UINT CYxscanTask::ThreadFunc(LPVOID arg)
{
CYxscanTask *Arg = (CYxscanTask *)arg;
int i,j,k,m,mi;
unsigned int n;
unsigned char buf[MaxMailLength];
union ITEMP_ST ms,temp;
CTime tt;
SYSTEMTIME gmt;
WORD newms,oldms,ms_dx;
double dx,dt,dy;
unsigned long mss,mx,last_dms,new_dms,dms,oldmx,ms_count;
int newsecond,oldsecond;
oldms=0;
newms=0;
ms_dx=0;
j=0;
dms=0;
last_dms=0;
new_dms=0;
mss=0;
new_dms=GetTickCount();
last_dms=new_dms;
mx=new_dms % 100;
oldmx=mx;
while(Arg->YxRun)
{
tt=CTime::GetCurrentTime();
tt.GetAsSystemTime(gmt);
Arg->mYear =(int)gmt.wYear;
Arg->mMonth =(int)gmt.wMonth;
Arg->mDay =(int)gmt.wDay;
j=(int)gmt.wDayOfWeek;
if(j!=0) j--;
else j=6;
Arg->mDayOfWeek =j;
Arg->mHour =(int)gmt.wHour;
Arg->mMinute =(int)gmt.wMinute;
Arg->mSecond =(int)gmt.wSecond;
Arg->mMilliseconds =(int)gmt.wMilliseconds;
theApp.Year = Arg->mYear;
theApp.Month = Arg->mMonth;
theApp.Day = Arg->mDay;
theApp.Hour = Arg->mHour;
theApp.Minute = Arg->mMinute;
theApp.Second = Arg->mSecond;
theApp.Week = Arg->mDayOfWeek;
dx=Arg->mDayOfWeek; dt=dx*24*3600;
dx=Arg->mHour; dt=dt+dx*3600;
dx=Arg->mMinute; dt=dt+dx*60;
dx=Arg->mSecond; dt=dt+dx;
ms_dx=100;
Arg->dms=Arg->dms + (double)ms_dx;
Arg->BitClrChar(Arg->krbuf,MAXKRNUM-1);
for(i=0;i<(MAXKRNUM);i++)
{
switch(Arg->con_in[i].B.type)
{
case 0x00://输入型
switch(Arg->con_in[i].B.log_enable)
{
case 0://0:与门
m=1;
n=Arg->con_in[i].B.unit_num;
for(k=0;k<(int)n+1;k++)
{//与运算
switch(k)
{
case 0:if(Arg->BitTestChar(Arg->krbuf,Arg->us[i][0])==false)
{
if(Arg->con_in[i].B.u0_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u0_kgbf!=0) m=0; //取反
}
break;
case 1:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][1])==false)
{
if(Arg->con_in[i].B.u1_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u1_kgbf!=0) m=0; //取反
}
break;
case 2:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][2])==false)
{
if(Arg->con_in[i].B.u2_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u2_kgbf!=0) m=0; //取反
}
break;
case 3:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][3])==false)
{
if(Arg->con_in[i].B.u3_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u3_kgbf!=0) m=0; //取反
}
break;
case 4:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][4])==false)
{
if(Arg->con_in[i].B.u4_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u4_kgbf!=0) m=0; //取反
}
break;
case 5:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][5])==false)
{
if(Arg->con_in[i].B.u5_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u5_kgbf!=0) m=0; //取反
}
break;
case 6:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][6])==false)
{
if(Arg->con_in[i].B.u6_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u6_kgbf!=0) m=0; //取反
}
break;
case 7:if(Arg->BitTestChar(Arg->yxbuf,Arg->us[i][7])==false)
{
if(Arg->con_in[i].B.u7_kgbf==0) m=0; //不取反
}else
{
if(Arg->con_in[i].B.u7_kgbf!=0) m=0; //取反
}
break;
}
}//与运算
if(m==0) Arg->BitClrChar(Arg->newkr,i);
else Arg->BitSetChar(Arg->newkr,i);
break;
case 1://2:或门
m=0;
n=Arg->con_in[i].B.unit_num;
for(k=0;k<(int)n+1;k++)
{//或运算
switch(k)
{
case 0:if(Arg->BitTestChar(Arg->krbuf,Arg->us[i][0])) //取外部采样值
{
if(Arg->con_in[i].B.u0_kgbf==0) m++; //不取反
}else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -