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 + -
显示快捷键?