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