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

📄 com_sub.cpp

📁 《WinCE.NET嵌入式工业用控制器及自动控制系统设计》的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// common subroutine 
#include "stdafx.h"
#include "com_sub.h" 
static  int  MINUTE, SECOND, NSEC, OLD_NSEC=-1, INIT_FLAG=-1;
static DWORD OLD_MS;
static  WCHAR  *DEMO_SYS_TBL=  _T("\\Compact Flash\\Demo8000\\DEMO8000.TBL");
/*...........................................................................*/
/* display TAG in the listview                                            */
/*...........................................................................*/
void display_TAG(CListCtrl *list, int type, int addr)
{
	CString msg;
	int rc, bytes, bitno, addr_1;

	switch(type)
	{
	case DI_BARE_TYPE:
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.DI_BARE[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 2, msg);
		break;
	case DO_BARE_TYPE:
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.DO_BARE[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 2, msg);
		break;
	case AI_BARE_TYPE:
		msg.Format(_T("%10g"), Reg.AI_BARE[addr]);
		list->SetItemText(addr, 2, msg);
		msg.Format(_T("%10g"), Reg.AI_ENG[addr]);
		list->SetItemText(addr, 3, msg);

		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AI_HH[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 4, msg);
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AI_H[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 5, msg);
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AI_L[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 6, msg);
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AI_LL[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 7, msg);

		msg.Format(_T("%10g"), Reg.AI_RH[addr]);
		list->SetItemText(addr, 8, msg);
		msg.Format(_T("%10g"), Reg.AI_RL[addr]);
		list->SetItemText(addr, 9, msg);
		msg.Format(_T("%10g"), Reg.AI_BH[addr]);
		list->SetItemText(addr, 10, msg);
		msg.Format(_T("%10g"), Reg.AI_BL[addr]);
		list->SetItemText(addr, 11, msg);
		msg.Format(_T("%6.3f"), Reg.AI_FL[addr]);
		list->SetItemText(addr, 12, msg);
		msg.Format(_T("%10g"), Reg.AI_HH[addr]);
		list->SetItemText(addr, 13, msg);
		msg.Format(_T("%10g"), Reg.AI_H[addr]);
		list->SetItemText(addr, 14, msg);
		msg.Format(_T("%10g"), Reg.AI_L[addr]);
		list->SetItemText(addr, 15, msg);
		msg.Format(_T("%10g"), Reg.AI_LL[addr]);
		list->SetItemText(addr, 16, msg);
		msg.Format(_T("%6.3f"), Reg.AI_DEAD[addr]);
		list->SetItemText(addr, 17, msg);
		break;
	case AO_BARE_TYPE:
		msg.Format(_T("%10g"), Reg.AO_BARE[addr]);
		list->SetItemText(addr, 2, msg);
		msg.Format(_T("%10g"), Reg.AO_ENG[addr]);
		list->SetItemText(addr, 3, msg);

		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AO_HH[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 4, msg);
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AO_H[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 5, msg);
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AO_L[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 6, msg);
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.AO_LL[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 7, msg);

		msg.Format(_T("%10g"), Reg.AO_RH[addr]);
		list->SetItemText(addr, 8, msg);
		msg.Format(_T("%10g"), Reg.AO_RL[addr]);
		list->SetItemText(addr, 9, msg);
		msg.Format(_T("%10g"), Reg.AO_BH[addr]);
		list->SetItemText(addr, 10, msg);
		msg.Format(_T("%10g"), Reg.AO_BL[addr]);
		list->SetItemText(addr, 11, msg);
		msg.Format(_T("%6.3f"), Reg.AO_FL[addr]);
		list->SetItemText(addr, 12, msg);
		msg.Format(_T("%10g"), Reg.AO_HH[addr]);
		list->SetItemText(addr, 13, msg);
		msg.Format(_T("%10g"), Reg.AO_H[addr]);
		list->SetItemText(addr, 14, msg);
		msg.Format(_T("%10g"), Reg.AO_L[addr]);
		list->SetItemText(addr, 15, msg);
		msg.Format(_T("%10g"), Reg.AO_LL[addr]);
		list->SetItemText(addr, 16, msg);
		msg.Format(_T("%6.3f"), Reg.AO_DEAD[addr]);
		list->SetItemText(addr, 17, msg);
		break;
	case DI_SOFT_TYPE:
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.DI_SOFT[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 2, msg);
		break;
	case DO_SOFT_TYPE:
		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.DO_SOFT[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 2, msg);
		break;
	case AI_SOFT_TYPE:
		msg.Format(_T("%10g"), Reg.AI_SOFT[addr]);
		list->SetItemText(addr, 2, msg);

		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		rc= Coil_Bit_Read(&Coil.AI_HH[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 3, msg);

		rc= Coil_Bit_Read(&Coil.AI_H[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 4, msg);

		rc= Coil_Bit_Read(&Coil.AI_L[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 5, msg);

		rc= Coil_Bit_Read(&Coil.AI_LL[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 6, msg);

		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AI_HH[addr_1]);
		list->SetItemText(addr, 7, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AI_H[addr_1]);
		list->SetItemText(addr, 8, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AI_L[addr_1]);
		list->SetItemText(addr, 9, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AI_LL[addr_1]);
		list->SetItemText(addr, 10, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%6.3f"), Reg.AI_DEAD[addr_1]);
		list->SetItemText(addr, 11, msg);
		break;
	case AO_SOFT_TYPE:
		msg.Format(_T("%10g"), Reg.AO_SOFT[addr]);
		list->SetItemText(addr, 2, msg);

		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		rc= Coil_Bit_Read(&Coil.AO_HH[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 3, msg);

		rc= Coil_Bit_Read(&Coil.AO_H[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 4, msg);

		rc= Coil_Bit_Read(&Coil.AO_L[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 5, msg);

		rc= Coil_Bit_Read(&Coil.AO_LL[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 6, msg);

		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AO_HH[addr_1]);
		list->SetItemText(addr, 7, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AO_H[addr_1]);
		list->SetItemText(addr, 8, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AO_L[addr_1]);
		list->SetItemText(addr, 9, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%10g"), Reg.AO_LL[addr_1]);
		list->SetItemText(addr, 10, msg);
		addr_1= addr + ED_MAX;
		msg.Format(_T("%6.3f"), Reg.AO_DEAD[addr_1]);
		list->SetItemText(addr, 11, msg);
		break;
	case TM_PSET_TYPE:
		msg.Format(_T("%6d"), Reg.TM_PSET[addr]);
		list->SetItemText(addr, 2, msg);
		msg.Format(_T("%6d"), Reg.TM_CURR[addr]);
		list->SetItemText(addr, 4, msg);

		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.TM_BIT[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 6, msg);
		break;
	case CN_PSET_TYPE:
		msg.Format(_T("%6d"), Reg.CN_PSET[addr]);
		list->SetItemText(addr, 2, msg);
		msg.Format(_T("%6d"), Reg.CN_CURR[addr]);
		list->SetItemText(addr, 4, msg);

		bytes= addr/8;
		bitno= addr%8;
		rc= Coil_Bit_Read(&Coil.CN_BIT[bytes], bitno);
		if(rc==0)
			msg.Format(_T("Off"));
		else
			msg.Format(_T("On"));
		list->SetItemText(addr, 6, msg);
		break;
	}
}
/*-------------------------------------------------------------------------*/
/* get system tick and set NSEC SECOND                                     */
/*-------------------------------------------------------------------------*/
void get_nsec_time(void)
{
    DWORD  ms, max;
    unsigned char *cptr;
    int  delta;

    ms= GetTimeTicks();
	if(INIT_FLAG==-1)  // initial set, when program start
	{
		OLD_MS= ms;
		NSEC= 0;
		SECOND= 0;
		MINUTE= 0;
		INIT_FLAG=0;
		return;
	}

    if(ms >= OLD_MS)  delta= (int)(ms - OLD_MS);
    else
     {
       cptr= (unsigned char *)&max;
       *(cptr)= 0xFF;
       *(cptr+1)= 0xFF;
       *(cptr+2)= 0xFF;
       *(cptr+3)= 0xFF;
       delta= (int) ((max- OLD_MS) + ms);
     }

    NSEC= NSEC + delta;
    if(NSEC >= 1000)
     {
       SECOND= SECOND + NSEC/1000;
       if(SECOND >=60) 
        {
          SECOND= SECOND - 60;
          MINUTE= MINUTE+1;
          if(MINUTE >= 60) MINUTE= MINUTE - 60;
        }

       NSEC= NSEC % 1000;
     }

   OLD_MS= ms;
}
/*...........................................................................*/
/* calulation new value of TAG                                            */
/*...........................................................................*/
void  control_calc()
{
	int i, nsec;
// get system time
    get_nsec_time();
	NSEC= NSEC;
	if(OLD_NSEC==-1) OLD_NSEC= NSEC;  // when program start
	nsec= NSEC - OLD_NSEC;
	if(nsec<0) nsec= nsec + 1000;
	nsec= nsec /10;

// AI bare data to eng. data
	for(i=0; i<ED_MAX; i++)
	 	Reg.AI_ENG[i]=bare_to_eng(Reg.AI_ENG[i], Reg.AI_BARE[i], Reg.AI_RH[i], Reg.AI_RL[i], Reg.AI_BH[i], Reg.AI_BL[i], Reg.AI_FL[i]);  

// check Alarm 
	calc_alarm();
	calc_timer(nsec);  
	calc_plus_onoff();

// move DI to DI_OLD 
	memcpy(Coil.DI_OLD, Coil.DI_BARE, DI_MAX_PLUS_BYTE);
// move DO to DO_OLD 
	memcpy(Coil.DO_OLD, Coil.DO_BARE, DO_MAX_PLUS_BYTE);

// save system time
	OLD_NSEC= NSEC;
}
/*...........................................................................*/
/* calcluation alarm                                            */
/*...........................................................................*/
void calc_alarm(void)
{
	int i, rc, bytes, bitno, addr;
// check AI alarm
   for(i=0; i<ED_MAX; i++)
   {
	   rc= check_alarm(0, Reg.AI_ENG[i], Reg.AI_HH[i], Reg.AI_DEAD[i], Reg.AI_RH[i], Reg.AI_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AI_HH[bytes], bitno, rc);

	   rc= check_alarm(0, Reg.AI_ENG[i], Reg.AI_H[i], Reg.AI_DEAD[i], Reg.AI_RH[i], Reg.AI_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AI_H[bytes], bitno, rc);

	   rc= check_alarm(1, Reg.AI_ENG[i], Reg.AI_L[i], Reg.AI_DEAD[i], Reg.AI_RH[i], Reg.AI_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AI_L[bytes], bitno, rc);

	   rc= check_alarm(1, Reg.AI_ENG[i], Reg.AI_LL[i], Reg.AI_DEAD[i], Reg.AI_RH[i], Reg.AI_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AI_LL[bytes], bitno, rc);
   }

// check AI Soft ALARM
   for(i=0; i<ED_MAX*4; i++)
   {
	   addr= ED_MAX +i;
	   rc= check_alarm(0, Reg.AI_SOFT[i], Reg.AI_HH[addr], Reg.AI_DEAD[addr], Reg.AI_SOFT[i], 0.0);
	   bytes= addr/8;
	   bitno= addr%8;
	   Coil_Bit_Write(&Coil.AI_HH[bytes], bitno, rc);

	   rc= check_alarm(0, Reg.AI_SOFT[i], Reg.AI_H[addr], Reg.AI_DEAD[addr], Reg.AI_SOFT[i], 0.0);
	   bytes= addr/8;
	   bitno= addr%8;
	   Coil_Bit_Write(&Coil.AI_H[bytes], bitno, rc);

	   rc= check_alarm(1, Reg.AI_SOFT[i], Reg.AI_L[addr], Reg.AI_DEAD[addr], Reg.AI_SOFT[i], 0.0);
	   bytes= addr/8;
	   bitno= addr%8;
	   Coil_Bit_Write(&Coil.AI_L[bytes], bitno, rc);

	   rc= check_alarm(1, Reg.AI_SOFT[i], Reg.AI_LL[addr], Reg.AI_DEAD[addr], Reg.AI_SOFT[i], 0.0);
	   bytes= addr/8;
	   bitno= addr%8;
	   Coil_Bit_Write(&Coil.AI_LL[bytes], bitno, rc);
   }

// check AO Alarm
   for(i=0; i<ED_MAX; i++)
   {
	   rc= check_alarm(0, Reg.AO_ENG[i], Reg.AO_HH[i], Reg.AO_DEAD[i], Reg.AO_RH[i], Reg.AO_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AO_HH[bytes], bitno, rc);

	   rc= check_alarm(0, Reg.AO_ENG[i], Reg.AO_H[i], Reg.AO_DEAD[i], Reg.AO_RH[i], Reg.AO_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AO_H[bytes], bitno, rc);

	   rc= check_alarm(1, Reg.AO_ENG[i], Reg.AO_L[i], Reg.AO_DEAD[i], Reg.AO_RH[i], Reg.AO_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AO_L[bytes], bitno, rc);

	   rc= check_alarm(1, Reg.AO_ENG[i], Reg.AO_LL[i], Reg.AO_DEAD[i], Reg.AO_RH[i], Reg.AO_RL[i]);
	   bytes= i/8;
	   bitno= i%8;
	   Coil_Bit_Write(&Coil.AO_LL[bytes], bitno, rc);
   }

// check AO Soft ALARM
   for(i=0; i<ED_MAX*4; i++)
   {
	   addr= ED_MAX +i;
	   rc= check_alarm(0, Reg.AO_SOFT[i], Reg.AO_HH[addr], Reg.AO_DEAD[addr], Reg.AO_SOFT[i], 0.0);
	   bytes= addr/8;
	   bitno= addr%8;
	   Coil_Bit_Write(&Coil.AO_HH[bytes], bitno, rc);

	   rc= check_alarm(0, Reg.AO_SOFT[i], Reg.AO_H[addr], Reg.AO_DEAD[addr], Reg.AO_SOFT[i], 0.0);
	   bytes= addr/8;
	   bitno= addr%8;
	   Coil_Bit_Write(&Coil.AO_H[bytes], bitno, rc);

⌨️ 快捷键说明

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