📄 cdt.cpp
字号:
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 打包处理,下发命令主要有以下几个
* COMMAND_SEL_CTRL, //控制选择
* COMMAND_EXE_CTRL, //控制执行
* COMMAND_CANCEL_CTRL, //控制撤消
* COMMAND_BAOHU_RESET, //保护复归
* COMMAND_AMMETER, //冻结电度
* COMMAND_CALI_TIME, //对时
* COMMAND_SET_RYB //软压板
*
* Return :
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
void CCDT::PackData(void)
{
int nResult = 0; //常用变量,返回值
unsigned short nTime = 0; //时间变量
int nOffset = 0; //延时时间
SYSTEMTIME newtime; //时间结构
CTRL_VALUE CtrlValue; //下发命令结构体
PansTime pt; //时间类
memset(&CtrlValue, 0x00, sizeof(CTRL_VALUE));
nResult = TimeCheck();
if (nResult != 0)
{
return;
}
nResult = g_soedata.GetCtrlData(CtrlValue);
if (nResult == 0)
{
m_eCmdCode = COMMAND_NONE;
}
else
{
m_eCmdCode = CtrlValue.eCmdType;
}
switch (m_eCmdCode)
{
case COMMAND_SEL_CTRL: //控制选择
m_bSendBuf[6] = 0x71;
m_bSendBuf[7] = 0x61;
m_bSendBuf[8] = 0x03;
m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??配置
m_bSendBuf[10] = 0x01;//配置??
CheckSendCode(6);
m_bSendBuf[12] = 0xe0;
if (CtrlValue.iValue == 1)
{
m_bSendBuf[13] = 0x33;
}
else if (CtrlValue.iValue == 2)
{
m_bSendBuf[13] = 0xcc;
}
m_bSendBuf[14] = CtrlValue.nPotValue;
m_bSendBuf[15] = m_bSendBuf[13];
m_bSendBuf[16] = m_bSendBuf[14];
CheckSendCode(12);
memcpy(&m_bSendBuf[18], &m_bSendBuf[12], 6); //连送三个相同的信息字
memcpy(&m_bSendBuf[24], &m_bSendBuf[12], 6);
m_wSendLen = 30;
m_nCtrlNumber = CtrlValue.nPotValue;
m_bCtrlType = CtrlValue.iValue;
break;
case COMMAND_EXE_CTRL: //控制执行
m_bSendBuf[6] = 0x71;
m_bSendBuf[7] = 0xc2;
m_bSendBuf[8] = 0x03;
m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??配置
m_bSendBuf[10] = 0x01;//配置??
CheckSendCode(6);
m_bSendBuf[12] = 0xe2;
m_bSendBuf[13] = 0xaa;
m_bSendBuf[14] = CtrlValue.nPotValue;
m_bSendBuf[15] = m_bSendBuf[13];
m_bSendBuf[16] = m_bSendBuf[14];
CheckSendCode(12);
memcpy(&m_bSendBuf[18], &m_bSendBuf[12], 6); //连送三个相同的信息字
memcpy(&m_bSendBuf[24], &m_bSendBuf[12], 6);
m_wSendLen = 30;
m_nCtrlNumber = CtrlValue.nPotValue;
m_bCtrlType = CtrlValue.iValue;
break;
case COMMAND_CANCEL_CTRL: //控制撤消
m_bSendBuf[6] = 0x71;
m_bSendBuf[7] = 0xb3;
m_bSendBuf[8] = 0x03;
m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??配置
m_bSendBuf[10] = 0x01;//配置??
CheckSendCode(6);
m_bSendBuf[12] = 0xe3;
m_bSendBuf[13] = 0x55;
m_bSendBuf[14] = CtrlValue.nPotValue;
m_bSendBuf[15] = m_bSendBuf[13];
m_bSendBuf[16] = m_bSendBuf[14];
CheckSendCode(12);
memcpy(&m_bSendBuf[18], &m_bSendBuf[12], 6); //连送三个相同的信息字
memcpy(&m_bSendBuf[24], &m_bSendBuf[12], 6);
m_wSendLen = 30;
break;
case COMMAND_BAOHU_RESET: //保护复归
m_bSendBuf[6] = 0x31;
m_bSendBuf[7] = 0x3d;
m_bSendBuf[8] = 0x00;
m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??
m_bSendBuf[10] = 0x01;
CheckSendCode(6);
m_wSendLen = 12;
// m_bSendBuf[6] = 0xf0; //自定义格式
// m_bSendBuf[7] = 0x3d;
// m_bSendBuf[8] = 0x01;
// m_bSendBuf[9] = RtuID;
// m_bSendBuf[10] = 0x01;
// Check_SendCode(6);
// m_bSendBuf[12] = 0x9f;
// m_bSendBuf[13] = 0xaa;
// m_bSendBuf[14] = rtu_debug.pdata[0];
// m_bSendBuf[15] = 0xaa;
// m_bSendBuf[16] = SendBuf[14];
// Check_SendCode(12);
// m_wSendLen = 18;
break;
case COMMAND_AMMETER: //冻结电度
m_bSendBuf[6] = 0x21;
m_bSendBuf[7] = 0x9e;
m_bSendBuf[8] = 0x00;
m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??
m_bSendBuf[10] = 0xff; //广播命令
CheckSendCode(6);
m_wSendLen = 12;
break;
case COMMAND_CALI_TIME: //对时
m_bSendBuf[6] = 0x70;
m_bSendBuf[7] = 0x7a;
m_bSendBuf[8] = 0x02;
m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;配置
m_bSendBuf[10]= 0x01; //destination
CheckSendCode(6);
m_bSendBuf[12]= 0xee;
// try
// {
// Fetch_VDTSysInfo(PortNo,BAUD,(void *)&baud);
// msoff= 240000/baud;
// }
// catch( ... ) {}
// SYSTEMTIME newtime;
pt.GetCurTime(&newtime);
nOffset = 240000 / 600;//分母为波特率
newtime.wMilliseconds += nOffset;
if (newtime.wMilliseconds > 999)
{
newtime.wMilliseconds -= 1000;
pt.TimeAdd(&newtime, 1);
}
m_bSendBuf[13] = (BYTE)(newtime.wMilliseconds % 256);
m_bSendBuf[14] = (BYTE)(newtime.wMilliseconds / 256);
m_bSendBuf[15] = (BYTE)newtime.wSecond;;
m_bSendBuf[16] = (BYTE)newtime.wMinute;
CheckSendCode(12);
m_bSendBuf[18] = 0xef;
m_bSendBuf[19] = (BYTE)newtime.wHour;
m_bSendBuf[20] = (BYTE)newtime.wDay;
m_bSendBuf[21] = (BYTE)newtime.wMonth;
m_bSendBuf[22] = (BYTE)(newtime.wYear % 100);
CheckSendCode(18);
m_wSendLen = 24;
break;
case COMMAND_NONE: //空命令
break;
case COMMAND_SET_RYB: //软压板
break;
default:
break;
}
m_ePreCode = m_eCmdCode;
m_eCmdCode = COMMAND_NONE;
#ifdef SYNC_HEADBB
if (m_wSendLen < 1)
{
m_wSendLen = 6;
}
#endif
}
/*====================================================================================
*
* Subroutine : TimeCheck()
*
* Parameters :
*
*
* Called from : PackData()
*
* Description : 超时检测
*
* Return :
*
*
* Modification:
* 2004-08-02:
*
*====================================================================================*/
int CCDT::TimeCheck(void)
{
int nResult = 0; //返回值变量
unsigned long lTimeEnd = 0; //结束时刻
unsigned long lUsingTime = 0; //溢出时间
bool bFlag = false; //失败参数
if ((m_ePreCode == COMMAND_SEL_CTRL) //控制选择
||(m_ePreCode == COMMAND_EXE_CTRL)) //控制执行
{
lTimeEnd = GetTickCount();
lUsingTime = (lTimeEnd - m_lTimeBegin) / 1000;
if (lUsingTime > TIMEOUT)
{
if (m_ePreCode == COMMAND_SEL_CTRL) //控制选择
{
m_ePreCode = COMMAND_NONE;
bFlag = true;
PutYK(INFDATA_YK_SEL, bFlag); //遥控返校失败
}
else if (m_ePreCode == COMMAND_EXE_CTRL) //控制执行
{
// CommandReturn(INF_SWITCH, RESULT_FAIL);
}
}
else
{
nResult = 1;
}
}
else
{
m_lTimeBegin = GetTickCount();
}
return nResult;
}
/*====================================================================================
*
* Subroutine : HexToBCD()
*
* Parameters :
* bHex: 16进制数
*
* Called from :
*
* Description : 16 进制数转换成BCD码。
*
* Return : BCD值,无效返回-1。
*
* Modification:
* 2004-12-28:
*
*====================================================================================*/
int CCDT::HexToBCD(unsigned char bHex)
{
int nResult = -1;
if (((bHex >> 4) < 10)
|| ((bHex & 0x0f) < 10))
{
nResult = ((bHex & 0xf0) /16) * 10 + (bHex & 0x0f);
}
return nResult;
}
/*====================================================================================
*
* Subroutine : TestPutYX()
*
* Parameters :
*
*
* Called from : TimeTest()
*
* Description : 存储遥信值,测试使用
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
void CCDT::TestPutYX(void)
{
int i = 0; //一般变量
SYSTEMTIME systime; //时间结构体
DATAGROUP DataGroup; //存储数据结构体
SOE_STATUS SoeStatus; //事件结构体
memset(&SoeStatus, 0, sizeof(SOE_STATUS));
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
GetLocalTime(&systime);
for (i=0; i<43; i++)
{
SoeStatus.bAddress = 0x01; //固定值??
SoeStatus.nPot = i;
SoeStatus.bStatus = rand()%2+1;
SoeStatus.wMilliseconds = systime.wMilliseconds + (systime.wSecond & 0xff) * 1000;
SoeStatus.bMinute = systime.wMinute & 0x3f;
SoeStatus.bHour = systime.wHour & 0x1f;
SoeStatus.bDay = systime.wDay & 0x3f;
SoeStatus.eType = INFDATA_YX;
SoeStatus.eStation = GATE_REMOTESTATION; //远动站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_OPERATERSTATION; //操作员站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_ENGINEERSTATION; //工程师站
g_soedata.InsSoeData(SoeStatus);
g_devdata.InsDevData(&DataGroup, 1);
}
return;
}
/*====================================================================================
*
* Subroutine : TestPutSOE()
*
* Parameters :
*
*
* Called from : TimeTest()
*
* Description : 存储遥信值,测试使用
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
void CCDT::TestPutSOE(void)
{
SOE_STATUS SoeStatus; //事件结构体
SYSTEMTIME systime; //时间结构体
DATAGROUP DataGroup; //存储数据结构体
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
memset(&SoeStatus, 0, sizeof(SOE_STATUS));
GetLocalTime(&systime);
SoeStatus.bAddress = 0x01; //固定值??
SoeStatus.nPot = 17;//m_bSoeBuf[9] + (m_bSoeBuf[10] & 0x0f) * 256;
SoeStatus.bStatus = rand()%2+1;//m_bSoeBuf[10] & 0x80;
SoeStatus.wMilliseconds = systime.wMilliseconds + (systime.wSecond & 0xff) * 1000;
SoeStatus.bMinute = systime.wMinute & 0x3f;
SoeStatus.bHour = systime.wHour & 0x1f;
SoeStatus.bDay = systime.wDay & 0x3f;
SoeStatus.eType = INFDATA_SOE;
SoeStatus.eStation = GATE_REMOTESTATION; //远动站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_OPERATERSTATION; //操作员站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_ENGINEERSTATION; //工程师站
g_soedata.InsSoeData(SoeStatus);
return;
}
/*====================================================================================
*
* Subroutine : TimeTest()
*
* Parameters :
*
*
* Called from : RuleLoop()
*
* Description : 存储遥信值,如果与内存中的不一致就认为是遥信变位。
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
int CCDT::TimeTest()
{
int i=0;
unsigned long YXend;
//间隔30秒送一次状态
YXend = GetTickCount();
if ((YXend - m_begin)/1000 > 30)
{
m_begin = GetTickCount();
// TestPutYX();
TestPutSOE();
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -