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

📄 com_sub.cpp

📁 《WinCE.NET嵌入式工业用控制器及自动控制系统设计》的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				word_1= IO_DEF[module -1].out_max;
				s2= s1 + word_1;
				if(addr_1>=s1 && addr_1<s2)
				{
					// found slot
					slot= i+1;
					chnl= addr_1 -s1;
					break;
				}
		   }
	   }
	  if(slot==0)  // not H/W Slot
	  {
		  addr_1= output02.addr;
		  if(output02.val == 1) dd= 1;
		  else dd= 0; 
		  bytes= addr_1/8;
		  bitno= addr_1%8;
		  Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
		  return(0);
	  }
    }
   else if(output02.type == AO_TYPE)
    {
	   for(i=0, slot=0, chnl=-1; i<SLOT_MAX_CASE; i++)
	   {
		   if(PARA_IO[i].mod_no == 0) continue;  // empty slot
		   if(PARA_IO[i].mod_no == I8024)
		   {
				module= PARA_IO[i].mod_no;
				addr_1= output02.addr;
				s1= PARA_IO[i].addr_ao -1;
				word_1= IO_DEF[module -1].out_max;
				s2= s1 + word_1;
				if(addr_1>=s1 && addr_1<s2)
				{
					// found slot
					slot= i+1;
					chnl= addr_1 -s1;
					break;
				}
		   }
	   }
	  if(slot==0)  // not H/W Slot
	  {
		  addr_1= output02.addr;
		  Reg.AO_BARE[addr_1]= output02.val;
//		msg.Format(_T("Set AO: %f addr: %d"), output02.val, addr_1);
//		AfxMessageBox(msg, MB_OK);
		  return(0);
	  }
    }
   else return(0);

   if(slot==0 || chnl==-1) return(0);  // slot not found
   if(output02.val == 1) dd= 1;
   else dd= 0; 

   switch(module)
    {
      case I8024:  // write AO value by one channel
        // check bare data high and low
        // it must be long data type
        fl= output02.val;         
		gain= PARA_IO[slot-1].gain_ao;
		if(gain==0)
	        I8024_VoltageOut(slot, chnl, fl);
		else
		    I8024_CurrentOut(slot, chnl, fl);
	    Reg.AO_BARE[addr_1]= output02.val;
        break;
      case I8041:  // 32 DO
        ldata= GetDIOData32(slot);
		memcpy(bf, (unsigned char *)&ldata, 4);
	  msg.Format(_T("I8041 before: %02X %02X %02X %02X"), bf[0], bf[1], bf[2], bf[3]);
//	  AfxMessageBox(msg, MB_OK);
		if(chnl>=0 && chnl<=7)
		  Coil_Bit_Write(&bf[0], chnl, dd);
		else if(chnl>=8 && chnl<=15)
		  Coil_Bit_Write(&bf[1], chnl-8, dd);
		else if(chnl>=16 && chnl<=23)
		  Coil_Bit_Write(&bf[2], chnl-16, dd);
		else if(chnl>=24 && chnl<=31)
		  Coil_Bit_Write(&bf[3], chnl-24, dd);
		memcpy((unsigned char *)&ldata, bf, 4);
        DO_32(slot, ldata);
	  msg.Format(_T("I8041 after: %08X"), ldata);
//	  AfxMessageBox(msg, MB_OK);
	    bytes= addr_1/8;
	    bitno= addr_1%8;
	    Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
        break;
      case I8042:  // 16 DI and 16 DO
        ldata= GetDIOData32(slot);
		memcpy(bf, (unsigned char *)&ldata, 4);
		if(chnl>=0 && chnl<=7)
		  Coil_Bit_Write(&bf[2], chnl, dd);
		else if(chnl>=8 && chnl<=15)
		  Coil_Bit_Write(&bf[3], chnl-8, dd);
		memcpy((unsigned char *)&data, &bf[2], 2);
        DIO_DO_16(slot, data);
	    bytes= addr_1/8;
	    bitno= addr_1%8;
	    Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
        break;
      case I8054:   // 8 DI and 8 DO
      case I8055:
        ldata= GetDIOData32(slot);
		memcpy(bf, (unsigned char *)&ldata, 4);
		Coil_Bit_Write(&bf[1], chnl, dd);  // the last high byte, low byte is DI-8
        DIO_DO_8(slot, bf[1]);
	    bytes= addr_1/8;
	    bitno= addr_1%8;
	    Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
        break;
      case I8063:  // 4 DI and 4 DO
        ldata= GetDIOData32(slot);
		memcpy(bf, (unsigned char *)&ldata, 4);
		Coil_Bit_Write(&bf[0], chnl+4, dd);  // the last low byte
        DIO_DO_8(slot, bf[0]);
	    bytes= addr_1/8;
	    bitno= addr_1%8;
	    Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
        break;
      case I8056:  // 16 channel DO
      case I8057:
        ldata= GetDIOData32(slot);
		memcpy(bf, (unsigned char *)&ldata, 4);
		if(chnl<8)
		  Coil_Bit_Write(&bf[0], chnl, dd);
		else
		  Coil_Bit_Write(&bf[1], chnl-8, dd);
		memcpy((unsigned char *)&data, &bf[0], 2);
        DO_16(slot, data);
	    bytes= addr_1/8;
	    bitno= addr_1%8;
	    Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
        break;
      case I8060:  // 6 channel DO
      case I8064:  // 8 channel DO
      case I8065:  // 8 channel DO
      case I8066:  // 8 channel DO
      case I8068:  // 8 channel DO
      case I8069:  // 8 channel DO
        ldata= GetDIOData32(slot);
		memcpy(bf, (unsigned char *)&ldata, 4);
		Coil_Bit_Write(&bf[0], chnl, dd);  // the last low byte
        DO_8(slot, bf[0]);
	    bytes= addr_1/8;
	    bitno= addr_1%8;
	    Coil_Bit_Write(&Coil.DO_BARE[bytes], bitno, dd);
        break;
    } // switch;

   return(0);
}
/*...........................................................................*/
/* Check output Queue and set DO or AO                                       */
/*...........................................................................*/
void set_AODO_output(int type, int addr, float fl)
{
	AODO_OUTPUT  output;
	float  bare;
	CString  msg;

	if(type == DO_TYPE)
	{
		output.type= type;
		output.addr= addr;
		output.val= fl;
		que_save((char *)QBUFF10, (char *)&output, sizeof(output),
			     QUEUE_MAX_CASE, &AODO_RD_INDEX, &AODO_WT_INDEX);
	}
	else if(type == AO_TYPE)  // original data is Bare data
	{
		output.type= AO_TYPE;
		output.addr= addr;
		output.val= fl;
		que_save((char *)QBUFF10, (char *)&output, sizeof(output),
			     QUEUE_MAX_CASE, &AODO_RD_INDEX, &AODO_WT_INDEX);
//		msg.Format(_T("Set Bare: %f addr: %d"), fl, addr);
//		AfxMessageBox(msg, MB_OK);
	}
	else if(type == AO_TYPE_ENG)  // original data is Eng. data
	{
		bare= eng_to_bare(fl, Reg.AO_BARE[addr], Reg.AO_RH[addr], Reg.AO_RL[addr],
						Reg.AO_BH[addr], Reg.AO_BL[addr]);
		output.type= AO_TYPE;
		output.addr= addr;
		output.val= bare;
		que_save((char *)QBUFF10, (char *)&output, sizeof(output),
			     QUEUE_MAX_CASE, &AODO_RD_INDEX, &AODO_WT_INDEX);
//		msg.Format(_T("Set Eng to Bare: %f %f addr: %d"), fl, bare, addr);
//		AfxMessageBox(msg, MB_OK);
	}

	return;
}
/*...........................................................................*/
/* set Coil On or Off                                       */
/*...........................................................................*/
int set_Coil(int type, int addr, int onoff)
{
	int dd, bytes, bitno;
	unsigned char *cptr;
	float fl;

	bytes= addr/8;
	bitno= addr%8;
	dd= onoff;
	switch(type)
	{
	case DI_BARE_TYPE:
		cptr= &Coil.DI_BARE[bytes];
		break;
	case DI_SOFT_TYPE:
		cptr= &Coil.DI_SOFT[bytes];
		break;
	case DI_PLON_TYPE:
		cptr= &Coil.DI_PLON[bytes];
		break;
	case DI_PLOFF_TYPE:
		cptr= &Coil.DI_PLOFF[bytes];
		break;
	case DO_BARE_TYPE:
		cptr= &Coil.DO_BARE[bytes];
		if(onoff==1) fl= 1;
		else fl= 0;
        set_AODO_output(DO_TYPE, addr, fl);
		break;
	case DO_SOFT_TYPE:
		cptr= &Coil.DO_SOFT[bytes];
		break;
	case DO_PLON_TYPE:
		cptr= &Coil.DO_PLON[bytes];
		break;
	case DO_PLOFF_TYPE:
		cptr= &Coil.DO_PLOFF[bytes];
		break;
	case AI_HH_BIT_TYPE:
	case AI_ENG_HH_BIT_TYPE:
		cptr= &Coil.AI_HH[bytes];
		break;
	case AI_H_BIT_TYPE:
	case AI_ENG_H_BIT_TYPE:
		cptr= &Coil.AI_H[bytes];
		break;
	case AI_L_BIT_TYPE:
	case AI_ENG_L_BIT_TYPE:
		cptr= &Coil.AI_L[bytes];
		break;
	case AI_LL_BIT_TYPE:
	case AI_ENG_LL_BIT_TYPE:
		cptr= &Coil.AI_LL[bytes];
		break;
	case AO_HH_BIT_TYPE:
	case AO_ENG_HH_BIT_TYPE:
		cptr= &Coil.AO_HH[bytes];
		break;
	case AO_H_BIT_TYPE:
	case AO_ENG_H_BIT_TYPE:
		cptr= &Coil.AO_H[bytes];
		break;
	case AO_L_BIT_TYPE:
	case AO_ENG_L_BIT_TYPE:
		cptr= &Coil.AO_L[bytes];
		break;
	case AO_LL_BIT_TYPE:
	case AO_ENG_LL_BIT_TYPE:
		cptr= &Coil.AO_LL[bytes];
		break;
	case AI_SOFT_HH_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AI_HH[bytes];
		break;
	case AI_SOFT_H_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AI_H[bytes];
		break;
	case AI_SOFT_L_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AI_L[bytes];
		break;
	case AI_SOFT_LL_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AI_LL[bytes];
		break;
	case AO_SOFT_HH_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AO_HH[bytes];
		break;
	case AO_SOFT_H_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AO_H[bytes];
		break;
	case AO_SOFT_L_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AO_L[bytes];
		break;
	case AO_SOFT_LL_BIT_TYPE:
		bytes= (addr+ED_MAX)/8;
		bitno= (addr+ED_MAX)%8;
		cptr= &Coil.AO_LL[bytes];
		break;
	case TM_BIT_TYPE:
		cptr= &Coil.TM_BIT[bytes];
		break;
	case CN_BIT_TYPE:
		cptr= &Coil.CN_BIT[bytes];
		break;
	default:
		return(-1);
	}

    Coil_Bit_Write(cptr, bitno, dd);
	return(0);
}
/*...........................................................................*/
/* set Register Data                                       */
/*...........................................................................*/
int set_Register(int type, int addr, float fl)
{
	switch(type)
	{
	case AI_BARE_TYPE:
		Reg.AI_BARE[addr]= fl;
		break;
	case AI_ENG_TYPE:
		Reg.AI_ENG[addr]= fl;
		break;
	case AI_SOFT_TYPE:
		Reg.AI_SOFT[addr]= fl;
		break;
	case AI_RH_TYPE:
		Reg.AI_RH[addr]= fl;
		break;
	case AI_RL_TYPE:
		Reg.AI_RL[addr]= fl;
		break;
	case AI_BH_TYPE:
		Reg.AI_BH[addr]= fl;
		break;
	case AI_BL_TYPE:
		Reg.AI_BL[addr]= fl;
		break;
	case AI_FL_TYPE:
		Reg.AI_FL[addr]= fl;
		break;
	case AI_HH_TYPE:
	case AI_ENG_HH_TYPE:
		Reg.AI_HH[addr]= fl;
		break;
	case AI_H_TYPE:
	case AI_ENG_H_TYPE:
		Reg.AI_H[addr]= fl;
		break;
	case AI_L_TYPE:
	case AI_ENG_L_TYPE:
		Reg.AI_L[addr]= fl;
		break;
	case AI_LL_TYPE:
	case AI_ENG_LL_TYPE:
		Reg.AI_LL[addr]= fl;
		break;
	case AI_DEAD_TYPE:
	case AI_ENG_DEAD_TYPE:
		Reg.AI_DEAD[addr]= fl;
		break;
	case AI_SOFT_HH_TYPE:
		Reg.AI_HH[addr+ED_MAX]= fl;
		break;
	case AI_SOFT_H_TYPE:
		Reg.AI_H[addr+ED_MAX]= fl;
		break;
	case AI_SOFT_L_TYPE:
		Reg.AI_L[addr+ED_MAX]= fl;
		break;
	case AI_SOFT_LL_TYPE:
		Reg.AI_LL[addr+ED_MAX]= fl;
		break;
	case AI_SOFT_DEAD_TYPE:
		Reg.AI_DEAD[addr+ED_MAX]= fl;
		break;
	case AO_BARE_TYPE:
		Reg.AO_BARE[addr]= fl;
        set_AODO_output(AO_TYPE, addr, fl);
		break;
	case AO_ENG_TYPE:
		Reg.AO_ENG[addr]= fl;
        set_AODO_output(AO_TYPE_ENG, addr, fl);
		break;
	case AO_SOFT_TYPE:
		Reg.AO_SOFT[addr]= fl;
		break;
	case AO_RH_TYPE:
		Reg.AO_RH[addr]= fl;
		break;
	case AO_RL_TYPE:
		Reg.AO_RL[addr]= fl;
		break;
	case AO_BH_TYPE:
		Reg.AO_BH[addr]= fl;
		break;
	case AO_BL_TYPE:
		Reg.AO_BL[addr]= fl;
		break;
	case AO_FL_TYPE:
		Reg.AO_FL[addr]= fl;
		break;
	case AO_HH_TYPE:
	case AO_ENG_HH_TYPE:
		Reg.AO_HH[addr]= fl;
		break;
	case AO_H_TYPE:
	case AO_ENG_H_TYPE:
		Reg.AO_H[addr]= fl;
		break;
	case AO_L_TYPE:
	case AO_ENG_L_TYPE:
		Reg.AO_L[addr]= fl;
		break;
	case AO_LL_TYPE:
	case AO_ENG_LL_TYPE:
		Reg.AO_LL[addr]= fl;
		break;
	case AO_DEAD_TYPE:
	case AO_ENG_DEAD_TYPE:
		Reg.AO_DEAD[addr]= fl;
		break;
	case AO_SOFT_HH_TYPE:
		Reg.AO_HH[addr+ED_MAX]= fl;
		break;
	case AO_SOFT_H_TYPE:
		Reg.AO_H[addr+ED_MAX]= fl;
		break;
	case AO_SOFT_L_TYPE:
		Reg.AO_L[addr+ED_MAX]= fl;
		break;
	case AO_SOFT_LL_TYPE:
		Reg.AO_LL[addr+ED_MAX]= fl;
		break;
	case AO_SOFT_DEAD_TYPE:
		Reg.AO_DEAD[addr+ED_MAX]= fl;
		break;
	case TM_PSET_TYPE:
		Reg.TM_PSET[addr]= (short)fl;
		break;
	case TM_CURR_TYPE:
		Reg.TM_CURR[addr]= (short)fl;
		break;
	case CN_PSET_TYPE:
		Reg.CN_PSET[addr]= (short)fl;
		break;
	case CN_CURR_TYPE:
		Reg.CN_CURR[addr]= (short)fl;
		break;
	default:
		return(-1);
	}

	return(0);
}
/*...........................................................................*/
/* get Coil state                                       */
/*...........................................................................*/
int get_Coil(int type, int addr)
{
	int dd, bytes, bitno;
	unsigned char *cptr;

	bytes= addr/8;

⌨️ 快捷键说明

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