core_com.c
来自「嵌入式开发 嵌入式开发 嵌入式开发」· C语言 代码 · 共 1,744 行 · 第 1/5 页
C
1,744 行
break;
case 2: // 主界面
if( (VarST3000.SubIDSEL==3) && (rCNL==UnitSEL-1) )
{ // 当前通道
if( unit[rCNL].submenu1.bitfield.hcontrol )
{ DispHErr_M23(vRealErr[rCNL], hRealErr[rCNL]);}
else
{ DispVErr_M23(vRealErr[rCNL]);}
}
break;
default:
break;
}
}
/******************************
描述: 接收通道上报的状态 2005-11-25 最终更新
参数: iCNL通道号; rDAT接收到的CAN信息数据
******************************/
void SyncRcvCmd5(const int rCNL, const unsigned char *rDAT)
{
unsigned char Bjob=unit[rCNL].submenu1.unitworksnum.i;
CtrlUnitFlags[rCNL].B=rDAT[0];
if( WhetherCUAuto(rCNL) && (CtrlUnitFlags[rCNL].bits.bit1) )
{ SetEntireFlags(rCNL, ((Bjob==1) ? 0x30:0x31), 1);}
else
{ SetEntireFlags(rCNL, ((Bjob==1) ? 0x30:0x31), 0);}
// 报警喇叭控制
ST3000AlarmCtrl(Bjob);
// 刷新界面相关
switch(VarST3000.MenuIDSEL)
{
case 3: // 调节界面
case 4: // 误差曲线
SyncLMark_M34(rCNL, CtrlUnitFlags[rCNL].bits.bit1);
break;
case 2: // 主界面
if( (VarST3000.SubIDSEL==3) && (rCNL==UnitSEL-1) )
{ SyncLapseMark(CtrlUnitFlags[rCNL].bits.bit1);}
break;
case 1: // 静止画面
if( CtrlUnitFlags[rCNL].bits.bit1 )
{
DispVLapse_M1(rCNL);
if( unit[rCNL].submenu1.bitfield.hcontrol )
{ DispHLapse_M1(rCNL);}
}
break;
default:
break;
}
}
/******************************
描述: 接收下位机修改的工作设置命令
参数: iCNL通道号; rDAT接收到的CAN信息数据
详细: 由于特别说明过多 60行文字描述 如果要了解详细情况 请查看 [.\附加说明1.txt]
特别声明: 如果在判断的过程中最终对需要判断的状态都一样的话
就认为可能在某些不能被认可的非安全因素存在
按照现在正常的命令强行同步控制单元 (11/26/2005)
(2).之所以分开对屏幕号判断 为了更快的节省处理时间
条件不满足的时候 节省一次条件的与运算.
******************************/
void SyncRcvCmd6(const int rCNL, const unsigned char *rDAT)
{
int jCnl;
int tEntireAuto,tEntireShape;
unsigned char Bjob=unit[rCNL].submenu1.unitworksnum.i; // 记录上报通道的系属
unsigned char arSYNCFlags[MAXCNL_3K]={0};
/* 通道命令需要同步更新的标志 (=0表示不用更新; 否则需要更新) */
unsigned char bREQUEST=0;
/* 设置请求的范围 bit0=1表示要求查询整个系属的状态 */
unsigned char bCtrlUnitTurns,BEntireTurns;
unsigned char ttB1,ttB2;
BITFlags hjBYTE;
/*
B2
包含内容
bit0=系属; bit1=本组智能; bit2=整机智能; bit3=主控机有无
*/
if( (CommandData[rCNL].Cmd6[1]&0x06)!=(rDAT[1]&0x06) )
{
hjBYTE.B=rDAT[1];
/*
检查整机智能状态是否发生改变
*/
ttB1 = ((Bjob==1)? EntireStatus.EntireIntelligent_A : EntireStatus.EntireIntelligent_B);
if( (ttB1!=hjBYTE.bits.bit2) )
{ // 确实发生改变
// 判断更改整机智能是否可以被认可
/*jCnl=hjGetNextProc(Bjob);
if( (jCnl>0) && (jCnl<rCNL) )
{
arSYNCFlags[rCNL]=1;
goto end_ProcCmd61BIT0;
}*/
/*
被认可的情况下
更改整机的智能状态并且同步到其他系属内的通道
*/
if( hjBYTE.bits.bit2 )
{ // 开整机智能
if( Bjob==1 )
{ EntireStatus.EntireIntelligent_A=1;}
else
{ EntireStatus.EntireIntelligent_B=1;}
// 确认更新到每个通道
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j )
{
unit[jCnl].submenu1.bitfield.autowork=1;
hjSACmdBuffers[jCnl]=CommandData[jCnl].Cmd6[1];
hjSACmdBuffers[jCnl]|=0x06; // bit2bit1=11 整机本组智能开
SetwjrSearAddrFlags(jCnl, 1);
}
}
//一次下发给下位机进行智能通知
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j )
{
CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
SendCnlData(jCnl, 0x06);
}
}
}
else
{ // 关整机智能
if( Bjob==1 )
{ EntireStatus.EntireIntelligent_A=0;}
else
{ EntireStatus.EntireIntelligent_B=0;}
// 确认更新到每个通道
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j )
{
unit[jCnl].submenu1.bitfield.autowork=0;
CommandData[jCnl].Cmd6[1]&=0xf9; //bit2bit1=00 整机本组智能关
SetwjrSearAddrFlags(jCnl, 0); //已经处理完成
arSYNCFlags[jCnl]=1;
}
}
}
/*
波形界面所包含的整机和本组 智能状态图标
*/
if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) && (Bjob==VarST3000.jobAB) )
{
_SetCnlSA_M23(); // 本组智能
_SetAllSA_M23(); // 整机智能
}
//end_ProcCmd61BIT0: ;
}
// 判断本组智能状态是否改变
else if( (unit[rCNL].submenu1.bitfield.autowork!=hjBYTE.bits.bit1) )
{ // 确实本组智能发生改变
// 查询本系属等待处理的智能通道
/* jCnl=hjGetNextProc(Bjob);
// 判断是否被认可修改 如果有在做寻址但是还未到此通道 不认可
if( (jCnl>0) && (rCNL>jCnl) )
{
arSYNCFlags[rCNL]=1;
goto end_ProcCmd61BIT1;
}*/
// 更新本组智能状态
unit[rCNL].submenu1.bitfield.autowork=hjBYTE.bits.bit1;
SetwjrSearAddrFlags(rCNL, hjBYTE.bits.bit1);
if( unit[rCNL].submenu1.bitfield.autowork )
{CommandData[rCNL].Cmd6[1]|=0x02;}
else
{CommandData[rCNL].Cmd6[1]&=0x0d;}
// 更新波形界面选中通道的本组智能
if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) &&
(Bjob==VarST3000.jobAB) && (rCNL==(UnitSEL-1) ) )
{ _SetCnlSA_M23();}
// 看是否影响到整机的智能工作
if( GetEntireIntelligent(Bjob) )
{ // 整机智能状态发生改变
ttB1=((Bjob==1) ? EntireStatus.EntireIntelligent_A : EntireStatus.EntireIntelligent_B);
if( ttB1 )
{ // 整机智能开
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j )
{
hjSACmdBuffers[jCnl]=CommandData[jCnl].Cmd6[1];
hjSACmdBuffers[jCnl]|=0x04; //bit2=1 整机智能开
SetwjrSearAddrFlags(jCnl, 1);
}
}
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j )
{
CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
SendCnlData(jCnl, 0x06);
}
}
}
else
{ //整机智能关 保留本组下发给系属内所有通道
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j)
{ CommandData[jCnl].Cmd6[1]&=0xfb; //清bit2整机智能关
SetwjrSearAddrFlags(jCnl, 0);
SendCnlData(jCnl, 0x06);
}
}
}
}
//_____更新主界面整机智能按钮显示
if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) && (Bjob==VarST3000.jobAB) )
{ _SetAllSA_M23();}
//end_ProcCmd61BIT1:;
}
}
/*
B3
包含内容
bit0=本机自/手动; bit1=整机自/手动 (整机优先)
*/
else if( (CommandData[rCNL].Cmd6[2]&0x03)!=(rDAT[2]&0x03) )
{
hjBYTE.B=rDAT[2];
//___判断整机状态是否发生改变
ttB1=((Bjob==1) ? EntireStatus.EntireAuto_A : EntireStatus.EntireAuto_B);
if( (ttB1!=hjBYTE.bits.bit1) )
{ //___确认整机自手动发生改变
if( Bjob==1 )
{ EntireStatus.EntireAuto_A=hjBYTE.bits.bit1;}
else
{ EntireStatus.EntireAuto_B=hjBYTE.bits.bit1;}
//___确认更新每个通道
for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
{
if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
unit[jCnl].submenu1.unitworksnum.j)
{ unit[jCnl].submenu1.bitfield.hand_auto=hjBYTE.bits.bit1;
if(hjBYTE.bits.bit1)
{ CommandData[jCnl].Cmd6[2]|=0x03;} //bit1bit0=11 整机本组自动
else
{ CommandData[jCnl].Cmd6[2]&=0x00;} //bit1bit0=00 整机本组手动
if( unit[jCnl].submenu1.bitfield.hcontrol )
{ unit[jCnl].submenu1.bitfield.h_motorruning=hjBYTE.bits.bit1;
if(hjBYTE.bits.bit1)
{ CommandData[jCnl].Cmd6[6]|=0x20;} //bit5=1 横向自动
else
{ CommandData[jCnl].Cmd6[6]&=0xdf;} //bit5=0 横向手动
}
//___更新和纵横向自手动按钮和图标的刷新
switch(VarST3000.MenuIDSEL)
{
case 3: //误差调节
case 4: //误差曲线
SyncWMark_V34(jCnl);
if(unit[jCnl].submenu1.bitfield.hcontrol)
{ SyncWMark_H34(jCnl);}
break;
case 2: //主界面
if( (VarST3000.SubIDSEL==3) &&
(Bjob==VarST3000.jobAB) )
{ SetWrkMark23(jCnl, 1);}
break;
default:
break;
}
//___
REC_Sub1(jCnl, 8);
//
arSYNCFlags[jCnl]=1;
}
}
//___刷新波形界面的整机自手动按钮状态
if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) && (Bjob==VarST3000.jobAB) )
{ _SetAllWS_M23();
SyncLapseMark(0); //___隐藏丢失色杠
//___刷新本组通道工作状态图标
_SetVWS_M23();
if( unit[UnitSEL-1].submenu1.bitfield.hcontrol )
{ _SetHWS_M23();}
}
}
//___判断本组自动手动是否发生改变
else if( (unit[rCNL].submenu1.bitfield.hand_auto!=hjBYTE.bits.bit0) )
{ //___确认本组自手动发生改变
unit[rCNL].submenu1.bitfield.hand_auto=hjBYTE.bits.bit0;
if(unit[rCNL].submenu1.bitfield.hand_auto)
{ CommandData[rCNL].Cmd6[2]|=0x01;} //bit0=1 本组自动
else
{ CommandData[rCNL].Cmd6[2]&=0xfe;} //bit0=0 本组手动
//___
REC_Sub1(rCNL, 8);
//___由于本组状态和横向自动手动有些地方相关所以一并考虑
if( unit[rCNL].submenu1.bitfield.hcontrol )
{ BITFlags hjBEX;
hjBEX.B=rDAT[6];
if( unit[rCNL].submenu1.bitfield.h_motorruning!=hjBEX.bits.bit5 )
{ unit[rCNL].submenu1.bitfield.h_motorruning=hjBEX.bits.bit5;
if(unit[rCNL].submenu1.bitfield.h_motorruning)
{ CommandData[rCNL].Cmd6[6]|=0x20;} //bit5=1 横向自动
else
{ CommandData[rCNL].Cmd6[6]&=0xdf;} //bit5=0 横向手动
}
}
//___看是否属于智能寻址等待的上报
if( (hjGetNextProc(Bjob)==rCNL) &&
(WhetherCUAuto(rCNL)) )
{ //___是
SetwjrSearAddrFlags(rCNL, 0);
jCnl=hjGetNextProc(Bjob);
if(jCnl)
{ //___表示下一个有效
CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
SendCnlData(jCnl, 0x06);
Do_NextSA_SyncRcvCmd6_002: //循环处理入口
if( WhetherCUAuto(jCnl) )
{ SetwjrSearAddrFlags(jCnl, 0);
jCnl=hjGetNextProc(Bjob);
if(jCnl)
{ CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
SendCnlData(jCnl, 0x06);
goto Do_NextSA_SyncRcvCmd6_002;
}
else
{ bREQUEST|=0x01;} //___请求查询整机的工作状态
}
}
else
{ bREQUEST|=0x01;} //___请求查询整机的工作状态
}
else
{ bREQUEST|=0x01;} //___请求查询整机的工作状态
//___更新和本组工作自手动状态相关的图标和按钮显示
switch
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?