|
void CTryDlg::receive_char(unsigned char * ch)
{
VARIANT m_input1;
if(m_Comm.GetInBufferCount())
{
m_input1=m_Comm.GetInput();//读取缓冲区内的数据
ch=m_input1.bstrVal;//将VARIANT型变量转换为CString型变量
return 1;
}
else return 0;
}
mian()
{和应用系统相关的公共初使化程序段;
Updata=false;Failure=true;
Delay(500);/* 等待与对方建立通信连接,通信由定时器1的中断例程完成 */
If(Failure)/* 在定时器1的中断例程判断出初使主备状态后 */
{CpuStatus=MAIN;和应用系统实现相关的主机初使化程序断;
while(1)/* 主机单元的前台例行监控循环 */
{和应用系统实现相关的主机应用功能例程;
if(应用例程修改了需要备份的数据) Update;
if((Update)&&(!Failure)&&send_frame()) Update=false;
if(Failure){给出备机故障通知信号;Update=true;}
}}
else
{CpuStatus=STANDBY;和应用系统实现相关的备机初使化程序段;
while(1)/* 备机单元的前台例行监控循环*/
{if(CpuStatus= =STANDBY)
while(CpuStatus= =STANDBY)/* 在备机状态中循环 */
{和应用系统实现相关的备机例程;
if((!Failure)&&(Update)&&receive_frame()) Update=false;
}
else
{Update=true;/* 以便在未来的备机联机后再次发送备份数据 */
while(1)/* 切换到主机的前台监控循环中 */
{和应用系统实现相关的主机应用功能例程;
if(应用例程修改了需要备份的数据) Update;
if((Update)&&(!Failure)&&send_frame()) Update=false;
if(Failure){给出备机故障通知信号;Update=YES;}
}}}}}
void CTryDlg::OnTimer(UINT nIDEvent) /* 定时器1的55ms中断服务程序 */
{int count=0;
if(receive_char(&ch)= =NULL)
{count++;
if(count= =3)/* 三次接收字符不成功*/
{count=0; Failure=true;/* 对方单元故障,如果本方为备机,准备切换 */
if(CpuStatus= =STANDBY) CpuStatus= MAIN;
}}
else
{count=0;Failure=false;
if((ch= =REQ)&&(CpuStatus= =STANDBY))/* 如果备机接收到主机的备份数据帧 */
{Update=true;return;} /* 发送请求字符,立即返回,接收此备份数据帧 */
}
send_char(OK);/* 发送本单元工作正常的状态数据字符 */
应用系统和55ms定时相关的例程;
}
5、结束语
以上改进的冗余系统设计具有结构简单,可靠性高,易于实现等显著特点。不足之处是通信协议太简单,因此,系统仅适用于通信质量比较可靠的应用场合,通过引入滑动窗口流协议或其它更为完善的通信协议,可大大提高通信可靠性,从而使系统具有更广泛的适应性。
|