⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yxscantask.cpp

📁 波峰焊后台控制软件-英文版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -