core_com.c

来自「嵌入式开发 嵌入式开发 嵌入式开发」· C语言 代码 · 共 1,744 行 · 第 1/5 页

C
1,744
字号
    case 7: //bitStand
        fseek(DataFile, fBaseOffset+3*sizeof(unsigned)+3*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.bitStand, sizeof(unsigned char), 1, DataFile);
        break;
    case 8: //bitShape
        fseek(DataFile, fBaseOffset+3*sizeof(unsigned)+4*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.bitShape, sizeof(unsigned char), 1, DataFile);
        break;
    case 9: //bitTurns
        fseek(DataFile, fBaseOffset+3*sizeof(unsigned)+5*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.bitTurns, sizeof(unsigned char), 1, DataFile);
        break;
    case 10://v调整系数
        fseek(DataFile, fBaseOffset+3*sizeof(unsigned)+6*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.VCoef, sizeof(unsigned), 1, DataFile);
        break;
    case 11://h调整系数
        fseek(DataFile, fBaseOffset+4*sizeof(unsigned)+6*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.HCoef, sizeof(unsigned), 1, DataFile);
        break;
    case 12://A系色标间距
        fseek(DataFile, fBaseOffset+5*sizeof(unsigned)+6*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.ColorWidthA, sizeof(unsigned), 1, DataFile);
        break;
    case 13://B系色标间距
        fseek(DataFile, fBaseOffset+6*sizeof(unsigned)+6*sizeof(unsigned char), SEEK_SET);
        fwrite(&SysSet.ColorWidthB, sizeof(unsigned), 1, DataFile);
        break;
    default:
        break;
    }
    VarST3000.FILE_REC=1; tmsLastREC=time(NULL);
}

/******************************
 描述: 换屏存储文件
******************************/
void ConfirmREC_Scr(void)
{
    if( VarST3000.FILE_REC )
    {   VarST3000.FILE_REC=0;
        fclose(DataFile);
        DataFile=fopen("sysdata.dat", "rb+");
    }
}

/******************************
 描述: 随机保存参数
 利用最后一次更改的时间计时开始3分钟
******************************/
void ConfirmREC_Tms(void)
{
    if( VarST3000.FILE_REC )
    {
        if( (time(NULL)-tmsLastREC)>=180 )
        {
            VarST3000.FILE_REC=0;
            fclose(DataFile);
            DataFile=fopen("sysdata.dat", "rb+");
        }
    }
}

/******************************
 描述: 设置单通道的标记形式
 参数:
    iCNL 通道号
    vSHAPE 标记形式ID
******************************/
void UpdateCmd6Shape(const int iCNL, const unsigned char iSHAPE)
{
    CommandData[iCNL].Cmd6[4]&=0xf8; //___Clear B5.bit2 bit1 bit0
    if(iSHAPE==0)
    {   CommandData[iCNL].Cmd6[4]|=0x04;}   //T 纵前左正
    else if(iSHAPE==1)
    {   CommandData[iCNL].Cmd6[4]|=0x05;}   //T 纵前左负
    else if(iSHAPE==2)
    {   CommandData[iCNL].Cmd6[4]|=0x06;}   //T 纵后左正
    else if(iSHAPE==3)
    {   CommandData[iCNL].Cmd6[4]|=0x07;}   //T 纵后左负
    else if(iSHAPE==4)
    {   CommandData[iCNL].Cmd6[4]|=0x01;}   //I
    else if(iSHAPE==5)
    {   CommandData[iCNL].Cmd6[4]|=0x03;}   //S 尖向左
    else if(iSHAPE==6)
    {   CommandData[iCNL].Cmd6[4]|=0x02;}   //S 尖向右
}

/******************************
 描述: 填充整机的正逆序和本组的正逆序
 参数:
    iCNL 通道号
    inEntireTurns 整机的正逆序设置
******************************/
void UpdateCmd6Turns(const int iCNL, const int inEntireTurns)
{
    unsigned char bTurns=((unit[iCNL].submenu1.unitworksnum.i==2) ? unit[iCNL].submenu1.bitTurns.turnsoflabsB : unit[iCNL].submenu1.bitTurns.turnsoflabsA);
    CommandData[iCNL].Cmd6[4]&=0xc7; //___Clear B5.bit5 bit4 bit3
    /*
    纵/横排
    */
    if( (bTurns==4) || (bTurns==5) )
    {   CommandData[iCNL].Cmd6[4]|=0x08;}
    /*
    正/逆序
    */
    if( inEntireTurns==1 )
    {   CommandData[iCNL].Cmd6[4]|=0x00;} // 整机正序
    else if( inEntireTurns==2 )
    {   CommandData[iCNL].Cmd6[4]|=0x10;} // 整机逆序
    else
    {   // 不能被设置成整机 则显示本组正/逆序
        if( (bTurns==2) || (bTurns==5) )
        {   CommandData[iCNL].Cmd6[4]|=0x30;} // 本组逆序
        else
        {   CommandData[iCNL].Cmd6[4]|=0x20;} // 本组正序
    }
}

/******************************
Func: 重新排列标准色序
******************************/
void ReOrderCtrlUnit(void)
{
    int tCnl;
    unsigned char aOD=1,bOD=1;
    unit[0].submenu1.unitworksnum.j=0; //___ASEr BSEr Share Use it.
    for(tCnl=1; tCnl<VarST3000.UnitCounts; tCnl++)
    {
        switch( unit[tCnl].submenu1.unitworksnum.i )
        {
        case 1: // A系属
            unit[tCnl].submenu1.unitworksnum.j = aOD++;
            unit[tCnl].submenu1.ColorNum = unit[tCnl].submenu1.unitworksnum.j;
            break;
        case 2: // B系属
            unit[tCnl].submenu1.unitworksnum.j = bOD++;
            unit[tCnl].submenu1.ColorNum = unit[tCnl].submenu1.unitworksnum.j;
            break;
        default:
            unit[tCnl].submenu1.unitworksnum.i = 0;
            break;
        }
        REC_Sub1(tCnl, 1); // (unitworksnum)
        REC_Sub1(tCnl, 9); // (ColorNum)

    }
}

/******************************
 描述: 对单个通道的6号工作命令
 参数: 
 	iCNL通道号
 	inEntireIntelligent 整机的智能状态
 	inEntireAuto 整机的自动手动状态
 	iwholeTurnset 整机的正逆序设置
******************************/
void ReUpdateCmd6(const int iCNL, const int inEntireIntelligent, const int inEntireAuto, const int inEntireTurns)
{
    unsigned char bCUTurns,bCUShape;
    if(unit[iCNL].submenu1.unitworksnum.i==1)
    {   bCUShape=SysSet.bitShape.ShapeA; bCUTurns=unit[iCNL].submenu1.bitTurns.turnsoflabsA;}
    else
    {   bCUShape=SysSet.bitShape.ShapeB; bCUTurns=unit[iCNL].submenu1.bitTurns.turnsoflabsB;}
    memset(CommandData[iCNL].Cmd6, 0x00, 7); //___先将命令缓冲区归零
    /*
    B1 色组
    */
    CommandData[iCNL].Cmd6[0] = unit[iCNL].submenu1.unitworksnum.j+1;
    /*
    B2 工作系属 主控机是否存在 整机/本组 智能状态
    */
    if( unit[iCNL].submenu1.unitworksnum.i==2 )
    {   CommandData[iCNL].Cmd6[1]|=0x01;} // B系
    CommandData[iCNL].Cmd6[1]|=0x08; // 上位机主控
    if( unit[iCNL].submenu1.bitfield.autowork )
    {   CommandData[iCNL].Cmd6[1]|=0x02;} // 本组智能
    if( inEntireIntelligent )
    {   CommandData[iCNL].Cmd6[1]|=0x04;} // 整机智能
    /*
    B3 自/手动 整机/本组
    */
    if( unit[iCNL].submenu1.bitfield.hand_auto )
    {   CommandData[iCNL].Cmd6[2]|=0x01;} // 本组自动
    if( inEntireAuto )
    {   CommandData[iCNL].Cmd6[2]|=0x02;} // 整机自动
    /*
    B4 正常工作 单标记 预套准等
    */
    if( bCUTurns==3 )
    {   CommandData[iCNL].Cmd6[3]=0x01;} // 单标记
    /*
    B5 标记形式 二次印刷 标记排列等
    */
    UpdateCmd6Shape(iCNL, bCUShape); // 标记形式
    UpdateCmd6Turns(iCNL, inEntireTurns); // 标记排列
    if( unit[iCNL].submenu1.bitfield.secondprint )
    {   CommandData[iCNL].Cmd6[4]|=0x40;} // 二次印刷
    /*
    B6 跟踪色序
    */
    CommandData[iCNL].Cmd6[5] = unit[iCNL].submenu1.ColorNum;
    /*
    总横向电机开关 电机正反转 屏幕保护
    */
    if(bCUTurns==3)
    {   // 单标记的纵向电机正反转
        if(unit[iCNL].submenu1.bitTurns.omk_motorreverse)
        {   CommandData[iCNL].Cmd6[6]|=0x04;}
    }
    else
    {   // 正常套色的纵向电机正反转
        if(unit[iCNL].submenu1.bitfield.vmotorreverse)
        {   CommandData[iCNL].Cmd6[6]|=0x04;}
    }
    if( unit[iCNL].submenu1.bitfield.v_motorruning )
    {   CommandData[iCNL].Cmd6[6]|=0x08;} // 纵向电机的开关
    if( GetSCRPROT(iCNL) )
    {   CommandData[iCNL].Cmd6[6]|=0x40;} // 控制单元的屏幕保护
    if( unit[iCNL].submenu1.bitfield.hmotorreverse )
    {   CommandData[iCNL].Cmd6[6]|=0x10;} // 横向电机的正反转
    if( unit[iCNL].submenu1.bitfield.hcontrol )
    {   CommandData[iCNL].Cmd6[6]|=0x02;} // 横向控制的开关
    if( unit[iCNL].submenu1.bitfield.h_motorruning )
    {   CommandData[iCNL].Cmd6[6]|=0x20;} // 横向电机的开关
}

/******************************
 描述: 发送指定通道的指定命令
 参数: iCNL通道号 iCMD命令号
******************************/
void SendCnlData(const int iCNL, const int iCMD)
{
    smsg1.id =iCMD;
    smsg1.id+=( (iCNL<<6)&0x7C0 );
    smsg1.rtr=0;
    #ifndef ST3000_TMODE
    switch(iCMD)
    {
    case 0x06:	//工作命令
        smsg1.dlen=7;
        memcpy(smsg1.data, CommandData[iCNL].Cmd6, smsg1.dlen);
        CAN_SendMsg(smsg1);
        break;
    case 0x07: // 版辊周长
        {
            unsigned nCBanREC=0;
            if( unit[iCNL].submenu1.unitworksnum.i==1 )
            {   nCBanREC=SysSet.CofBanA;}
            else if( unit[iCNL].submenu1.unitworksnum.i==2 )
            {   nCBanREC=SysSet.CofBanB;}
            else
            {   break;}
            CommandData[iCNL].Cmd7[0] = (unsigned char)((nCBanREC>>8)&0xff);
            CommandData[iCNL].Cmd7[1] = (unsigned char)(nCBanREC&0xff);
            smsg1.dlen=2;
            memcpy(smsg1.data, CommandData[iCNL].Cmd7, smsg1.dlen);
            CAN_SendMsg(smsg1);
        }
        break;
    case 0x08: // 波门属性
        {
            unsigned tVAL,markDist,gateDist; // 色标间距 门间距
            if( unit[iCNL].submenu1.unitworksnum.i==1 )
            {   markDist=SysSet.ColorWidthA;}
            else if( unit[iCNL].submenu1.unitworksnum.i==2 )
            {   markDist=SysSet.ColorWidthB;}
            else
            {   break;}
            gateDist = markDist-unit[iCNL].submenu2.ValueWidth*100; // gate-gap.
            tVAL=unit[iCNL].submenu1.addressofwav;
            CommandData[iCNL].Cmd8[0]=(unsigned char)((tVAL>>8)&0xff);
            CommandData[iCNL].Cmd8[1]=(unsigned char)(tVAL&0xff);
            tVAL=unit[iCNL].submenu2.ValueWidth;
            CommandData[iCNL].Cmd8[2]=(unsigned char)((tVAL>>8)&0xff);
            CommandData[iCNL].Cmd8[3]=(unsigned char)(tVAL&0xff);
            CommandData[iCNL].Cmd8[4]=(unsigned char)((gateDist>>8)&0xff);
            CommandData[iCNL].Cmd8[5]=(unsigned char)(gateDist&0xff);
            CommandData[iCNL].Cmd8[6]=(unsigned char)((markDist>>8)&0xff);
            CommandData[iCNL].Cmd8[7]=(unsigned char)(markDist&0xff);
            smsg1.dlen=8;
            memcpy(smsg1.data, CommandData[iCNL].Cmd8, smsg1.dlen);
            CAN_SendMsg(smsg1);
        }
        break;
    case 0x09: // 微调 报警
        {
            int vINT;
            vINT=unit[iCNL].submenu1.v_adjust;
            if(vINT>=0)
            {
                CommandData[iCNL].Cmd9[0]=(unsigned char)(vINT/256);
                CommandData[iCNL].Cmd9[1]=(unsigned char)(vINT%256);
            }
            else
            {
                vINT*=-1;
                CommandData[iCNL].Cmd9[0]=(unsigned char)(vINT/256)+0x80;
                CommandData[iCNL].Cmd9[1]=(unsigned char)(vINT%256);
            }
            vINT=unit[iCNL].submenu1.h_adjust;
            if(vINT>=0)
            {
                CommandData[iCNL].Cmd9[2]=(unsigned char)(vINT/256);
                CommandData[iCNL].Cmd9[3]=(unsigned char)(vINT%256);
            }
            else
            {
                vINT*=-1;
                CommandData[iCNL].Cmd9[2]=(unsigned char)(vINT/256)+0x80;
                CommandData[iCNL].Cmd9[3]=(unsigned char)(vINT%256);
            }
            CommandData[iCNL].Cmd9[4]=(unsigned char)(unit[iCNL].submenu1.v_alarm&0xff);
            CommandData[iCNL].Cmd9[5]=(unsigned char)(unit[iCNL].submenu1.h_alarm&0xff);
            smsg1.dlen=6;
            memcpy(smsg1.data, CommandData[iCNL].Cmd9, smsg1.dlen);
            CAN_SendMsg(smsg1);
        }
        break;
    case 0x0A: // 纵向控制信息
        {
            int ID=0;
            unsigned char Bjob=unit[iCNL].submenu1.unitworksnum.i;
            if( Bjob==1 )
            {
                if( unit[iCNL].submenu1.bitTurns.turnsoflabsA==3 )
                {   ID=2;}
                else
                {   ID=SysSet.bitStand.AsetStandard;}
            }
            else if( Bjob==2 )
            {
                if( unit[iCNL].submenu1.bitTurns.turnsoflabsB==3 )
                {   ID=2;}
                else
                {   ID=SysSet.bitStand.BsetStandard;}
            }
            else
            {   break;}
            CommandData[iCNL].CmdA[0]=unit[iCNL].submenu2.VDeadZone[ID];
            CommandData[iCNL].CmdA[1]=unit[iCNL].submenu2.VHaver[ID].VAver;
            CommandData[iCNL].CmdA[2]=unit[iCNL].submenu2.VPlus_P[ID];
            CommandData[iCNL].CmdA[3]=unit[iCNL].submenu2.VPlus_D[ID];
            CommandData[iCNL].CmdA[4]=unit[iCNL].submenu2.VFps[ID];
            smsg1.dlen=5;
            memcpy(smsg1.data, CommandData[iCNL].CmdA, smsg1.dlen);
            CAN_SendMsg(smsg1);
        }
        break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?