📄 com_sub.cpp
字号:
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 + -