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

📄 server3.cpp

📁 DCOM 上位机和嵌入式系统通信
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// Server3.cpp : Implementation of CComServerApp and DLL registration.

#include "stdafx.h"
#include "ComServer.h"
#include "Server3.h"
#include "Server1.h"
#include "Server2.h"
#include "Eval.h"
extern HANDLE termhd;
static WCHAR  gwszTemp[128];
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP Server3::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_IDataProcess,
		&IID_IProcControl,
	};

	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
			return S_OK;
	}
	return S_FALSE;
}


STDMETHODIMP Server3::iflag(int i, int* rb)
{
	// TODO: Add your implementation code here
	if((File4.flag[stations[i].stno]&0x80)!=0)
	{
		if(stations[i].flag) stations[i].flag=0;
		*rb=0;
	}
	else
     if(stations[i].flag) *rb=1; else *rb=0;
	return S_OK; 
}

STDMETHODIMP Server3::getype(int i, int j, int *sensor,int* xing,int* rule,int* position)
{
	// TODO: Add your implementation code here
  BYTE m,n,h;
  int k;

     m=File4.info[stations[i].stno].fzindex;
	 n=File4.info[stations[i].stno].state_type&0xf;
 	 h=(File4.info[stations[i].stno].state_type&0xf0)>>4;
     k=Files.st[h].inport;
     get_stcfg(i,n,j,k,m,sensor,xing,rule,position);
     if(*xing==0)
		return E_FAIL;
	 else
	    return S_OK;
}


STDMETHODIMP Server3::setktp(int i, int j,int addr_sensor)
{
	// TODO: Add your implementation code here
    int k,n,rx,vl;
    SYSTEMTIME pdt;
    DWORD dw;
    n=0;
	while((n<ktp.numb)&&(ktp.kaijutu[n].addr_sensor!=addr_sensor))
		n++;
    GetLocalTime(&pdt);
	if(ktp.kaijutu[n].addr_sensor!=addr_sensor)
	{
		ktp.kaijutu[n].addr_sensor=addr_sensor;
        ktp.kaijutu[n].timenow=pdt.wHour;
		for(k=0;k<=3;k++)
		 ktp.kaijutu[n].kjt[k]=0xFFFFFFFF;
		ktp.numb++;
	}
	rx=pdt.wMinute % 16; 
	k=(pdt.wMinute-rx)/16;
    dw=(ktp.kaijutu[n].kjt[k]>>(2*rx))&0x3;
	if(addr_sensor>=0)
	{
		int m=0;
		while((m<Timedata.DataNum)&&(Timedata.NowdataRec[m].addr_sensor!=addr_sensor))
			 m++;
		if(Timedata.NowdataRec[m].addr_sensor==addr_sensor)
			vl=Timedata.NowdataRec[m].nowdata;
	}
	else  //he add 2005-4-15
	{
		vl=kch[j].nowdata;
		if (vl==1)
			vl=0;
		else if(vl==0)
			vl=1;
	}

	switch(dw)
	{
	case 00:
        if(vl!=0)
          ktp.kaijutu[n].kjt[k]^=2<<(2*rx);
		break;
	case 01:
		if(vl!=1)
		{
			ktp.kaijutu[n].kjt[k]&=~(3<<(2*rx));
            ktp.kaijutu[n].kjt[k]^=2<<(2*rx);
		}
		break;
	case 3:
		ktp.kaijutu[n].kjt[k]&=~(3<<(2*rx));
        if(vl!=0)
          ktp.kaijutu[n].kjt[k]^=1<<(2*rx);
		break;
	}
	return S_OK;
}

STDMETHODIMP Server3::clearflag(int i)
{
	// TODO: Add your implementation code here
    stations[i].flag=false;
	return S_OK;
}
STDMETHODIMP Server3::setnowdata(int i, int j, int sensor,int xing,int rule,int position, int *addr_sensor)
{
	// TODO: Add your implementation code here
	int k,n;
    long vl;

	k=position*50+File2.file2[sensor].su_index;
	n=0;
	while((n<Timedata.DataNum)&&(Timedata.NowdataRec[n].addr_sensor!=k))
	     n++;
    if(Timedata.NowdataRec[n].addr_sensor!=k)
	{
		Timedata.NowdataRec[n].data1 = 0;
        Timedata.NowdataRec[n].data2 = 0;
        Timedata.NowdataRec[n].data3 = 0;
        Timedata.NowdataRec[n].data4 = 0;
        if(xing == 3) //开关量
           Timedata.NowdataRec[n].nowdata = -1;
        else
           Timedata.NowdataRec[n].nowdata = 0;
        Timedata.NowdataRec[n].timeflag = 0;   //开关量计时用
		Timedata.DataNum++;
	}
   if(i==1)
   {
       switch(stations[i].vl[j].vt)
	   {
	   case VT_I2:
	   case VT_I4:
		   vl=stations[i].vl[j].lVal;
		   switch(xing)
		   {
	         case 1:
               setmnl(n,sensor,vl);
			   break;
	         case 2:
	           if (vl>=Timedata.NowdataRec[n].nowdata)
			      Timedata.NowdataRec[n].nowdata=vl* File2.file2[sensor].scale_data;
		       else 
                  Timedata.NowdataRec[n].nowdata+=vl* File2.file2[sensor].scale_data;
			   break;
			 case 3:
               setkgl(n,vl);
               break;
		   }
		   break;
	   case VT_R4:
	   case VT_R8:
		   if(xing==1)
		   {
             Timedata.NowdataRec[n].nowdata=stations[i].vl[j].fltVal;
		     if(Timedata.NowdataRec[n].data1<Timedata.NowdataRec[n].nowdata)
			    Timedata.NowdataRec[n].data1=Timedata.NowdataRec[n].nowdata;
		     if((Timedata.NowdataRec[n].data2>Timedata.NowdataRec[n].nowdata)||(Timedata.NowdataRec[n].data2==0))
			    Timedata.NowdataRec[n].data2=Timedata.NowdataRec[n].nowdata;
             Timedata.NowdataRec[n].data3+=Timedata.NowdataRec[n].nowdata;
             Timedata.NowdataRec[n].data4++;
		   }
		   break;
	   case VT_BOOL:
		   if(xing==3)
		   {
		     if(stations[i].vl[j].boolVal)
			   vl=1;
		     else
			   vl=0;
		     setkgl(n,vl);
		   }
		   break;
	   }
	   Timedata.NowdataRec[n].addr_sensor=k;
	   return S_OK;
   }
   vl=stations[i].vl[j].iVal;
   Timedata.NowdataRec[n].rcdw=vl;
	switch(xing)
	{
	case 1:
		if (initmnl(n,sensor,vl))
           setmnl(n,sensor,vl);
		break;
    case 2:
	//	if (vl>=Timedata.NowdataRec[n].nowdata)///2002.11.13 深圳改
	//		Timedata.NowdataRec[n].nowdata=vl* File2.file2[sensor].scale_data;
	//	else 
            Timedata.NowdataRec[n].nowdata+=vl* File2.file2[sensor].scale_data;
		break;
	case 3:
	    if((rule&4)!=0)
		 if(vl==0) vl=1; else vl=0;
        setkgl(n,vl);
	    break;
	}
	Timedata.NowdataRec[n].addr_sensor=k;
    *addr_sensor=k;
	return S_OK;
}

void Server3::get_stcfg(int i,int n,int j,int k,int m, int *sensor, int *xing, int *rule, int *position)
{
  int t,l;
  *xing=0;
  system_station_cfg stncfg;
  if(i==1)
  {
    stncfg=Cfg4.cfg4[m][j];
    *sensor=stncfg.sensor;
    *xing=stncfg.xing;
    *rule=stncfg.rule;
    *position=stncfg.position;
  }else{
	 if (j<k)
		 {
		   switch(n)
		   {
		   case 0:
			   stncfg=Cfg0.cfg0[m][j];
			   break;
		   case 1:
			   stncfg=Cfg1.cfg1[m][j];
			   break;
		   case 2:
			   stncfg=Cfg2.cfg2[m][j];
			   break;
		   case 3:
			   stncfg=Cfg3.cfg3[m][j];
			   break;
		   case 4:
			   stncfg=Cfg4.cfg4[m][j];
			   break;
		   }
		   if(stncfg.xing==3)
		   {
             *sensor=stncfg.sensor;
             *xing=stncfg.xing;
             *rule=stncfg.rule;
             *position=stncfg.position;
		   }
		 }else{
			 t=0;
			 for(l=0;l<k;l++)
			 {
			   switch(n)
			   {
		         case 0:
		    	   stncfg=Cfg0.cfg0[m][l];
		    	   break;
		         case 1:
		    	   stncfg=Cfg1.cfg1[m][l];
		    	   break;
		         case 2:
		    	   stncfg=Cfg2.cfg2[m][l];
		    	   break;
		         case 3:
		    	   stncfg=Cfg3.cfg3[m][l];
		    	   break;
	    	   case 4:
    			   stncfg=Cfg4.cfg4[m][l];
	    		   break;
			   }
				 if((stncfg.xing==1)||(stncfg.xing==2))
				 {
				  if(j==t+k)
				  {
			       *sensor=stncfg.sensor;
                   *xing=stncfg.xing;
                   *rule=stncfg.rule;
                   *position=stncfg.position;
				   break;
				  }
				  t++;
				 }
			 }
		 }
  }
}

STDMETHODIMP Server3::ifdel(int *bl)
{
	// TODO: Add your implementation code here
	if(con_del) 
		*bl=1; 
	else 
		*bl=0;
	return S_OK;
}

STDMETHODIMP Server3::setdel()
{
	// TODO: Add your implementation code here
    dat_del=true;
	return S_OK;
}

STDMETHODIMP Server3::ifclear(int *ml, int *hl)
{
	// TODO: Add your implementation code here
	if(minute_flg) 
		*ml=1; 
	else 
		*ml=0;
	if(hour_flg) 
		*hl=1; 
	else 
		*hl=0;    
	return S_OK;
}

STDMETHODIMP Server3::deltab(int *delct)
{
	// TODO: Add your implementation code here
   int i,j,k,n;

    n=0;
    for(i=0;i<delflg.count;i++)
	{
		j=0;
		while((j<Timedata.DataNum)&&(delflg.addr_sensor[i]!=Timedata.NowdataRec[j].addr_sensor))
				j++;
        if(delflg.addr_sensor[i]==Timedata.NowdataRec[j].addr_sensor)
		{
			n++;
			for(k=j;k<Timedata.DataNum-1;k++)
			   Timedata.NowdataRec[k]=Timedata.NowdataRec[k+1];
			Timedata.DataNum--;
		}
		if((File3.file3[(delflg.addr_sensor[i] % 50)].property&0xf)==3)
		{
		  j=0;
		  while((j<ktp.numb)&&(delflg.addr_sensor[i]!=ktp.kaijutu[j].addr_sensor))
				j++;
          if(delflg.addr_sensor[i]==ktp.kaijutu[j].addr_sensor)
		  {
			for(k=j;k<ktp.numb-1;k++)
			   ktp.kaijutu[k]=ktp.kaijutu[k+1];
			ktp.numb--;
		  }
		}
	}
    con_del=false;
	*delct=n;
	return S_OK;
}

STDMETHODIMP Server3::cleartab()
{
	// TODO: Add your implementation code here
  int i;
    
    for(i=0;i<Timedata.DataNum;i++)
	{
		if((File3.file3[(Timedata.NowdataRec[i].addr_sensor % 50)].property&0xf)==1)
		{
			Timedata.NowdataRec[i].data1=0;
			Timedata.NowdataRec[i].data2=0;
			Timedata.NowdataRec[i].data3=0;
			Timedata.NowdataRec[i].data4=0;
		}
	}
    minute_flg=0;
	return S_OK;
}

STDMETHODIMP Server3::clearhour()
{
	// TODO: Add your implementation code here
  int i,j,tm;
  SYSTEMTIME pdt;

    for(i=0;i<Timedata.DataNum;i++)
	{
		if(((File3.file3[(Timedata.NowdataRec[i].addr_sensor % 50)].property&0xf)==1)
			||((File3.file3[(Timedata.NowdataRec[i].addr_sensor % 50)].property&0xf)==3))
		{
			Timedata.NowdataRec[i].data1=0;
			Timedata.NowdataRec[i].data2=0;
			Timedata.NowdataRec[i].data3=0;
			Timedata.NowdataRec[i].data4=0;
		}
		if((File3.file3[(Timedata.NowdataRec[i].addr_sensor % 50)].property&0xf)==2)
			Timedata.NowdataRec[i].nowdata=0;
	}
    GetLocalTime(&pdt);
	tm=pdt.wHour;
     for(i=0;i<ktp.numb;i++)
	{
		for(j=0;j<4;j++)
		{
		  ktp.kaijutu[i].kjt[j]=0xffffffff;
		  ktp.kaijutu[i].timenow=tm;
		}
    }
	hour_flg=0;
	return S_OK;
}

STDMETHODIMP Server3::getstct(int i, int *ct)
{
	// TODO: Add your implementation code here
	int h;

 	 //h=File4.info[stations[i].stno].state_type&0xf;
  	 h=(File4.info[stations[i].stno].state_type&0xf0)>>4;
     *ct=Files.st[h].inport;
	return S_OK;
}

void Server3::setkgch(short addr_sensor,DATE starttime,DATE steptime,long addtime,long staus)
{
	short num;
	num=kgch.num;
	kgch.bh[num].addr_sensor=addr_sensor;
	kgch.bh[num].starttime=starttime;
	kgch.bh[num].steptime=steptime;
	kgch.bh[num].addtime=addtime;
	kgch.bh[num].status=staus;
	num+=1;
	kgch.num=num;
}

STDMETHODIMP Server3::setkz(int i)
{
	// TODO: Add your implementation code here 
	DATE st_time;
    SYSTEMTIME pdt;
   	
    byte tmpkckhval;//标记开出口状态变化
	kckz[stations[i].stno]=stations[i].kz;
    /********************he增加2005-4-15******************/
    short j,kckznum;
	int addr_sensor;
	byte fz,kckh,ival;

	GetLocalTime(&pdt);
	st_time=Server2::dateCal(pdt.wYear,pdt.wMonth,pdt.wDay,pdt.wHour,pdt.wMinute,pdt.wSecond);


	kckznum=KAI_CHUSBpz.KCKZNum;
	ival=stations[i].kz;
    for(j=0;j<kckznum;j++)
	{
		kckh=KAI_CHUSBpz.kcpz[j].KCKZ;
        fz=KAI_CHUSBpz.kcpz[j].fz;
		if(stations[i].stno==fz)
		{
			if ((kch[j].nowdata!=0) || (kch[j].nowdata!=1)) 
				kch[j].nowdata=0;
			tmpkckhval=kch[j].nowdata;
			kch[j].addr_sensor=(fz*50 + kckh) *(-1);
    		kch[j].nowdata=(ival>>kckh) & 0x1;
			setktp(0,j,kch[j].addr_sensor); //处理开矩图
			if(tmpkckhval==1)  //处理开出口状态变化
			{
				if(kch[j].nowdata==0)
					setkgch(kch[j].addr_sensor,st_time,st_time,0,1);
			}
            else if(tmpkckhval==0)  //处理开出口状态变化
			{
				if(kch[j].nowdata==1)
					setkgch(kch[j].addr_sensor,st_time,st_time,0,0);
			}
		}
	}

	return S_OK;
}

STDMETHODIMP Server3::clear_con_del()
{
	// TODO: Add your implementation code here
    delflg.count=0;
	return S_OK;
}

STDMETHODIMP Server3::addonetodeltab(int addr_sensor, int *ct)
{
	// TODO: Add your implementation code here
    if(delflg.count<299) 
	{
		delflg.addr_sensor[delflg.count]=addr_sensor;
		delflg.count++;
		*ct=delflg.count;
	}else{
		*ct=0;
	}
	return S_OK;
}

STDMETHODIMP Server3::set_del_flag()
{
	// TODO: Add your implementation code here
    con_del=true;
	return S_OK;
}

STDMETHODIMP Server3::set_ini_st(int stnum)
{
	// TODO: Add your implementation code here
	if(!console0out.flag)
	{
     console0out.stno=stnum;
	 console0out.ordercode=1;
	 console0out.flag=1;
	 return S_OK; 
	}else{
	 return S_OK;
	}
}

STDMETHODIMP Server3::set_only_st(int stnum,int state)
{
	// TODO: Add your implementation code here

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -