📄 stepcali.cpp
字号:
/ 静态增益校正参数及效果参数写入fp文件 /
/==============================================*/
void Gain_Disp(CString Cali_Title,FILE *fp)
{
//从上传效果参数中提取底层实际使用的静态增益参数
for (int i=0;i<32;i++)
Def_Stp_Para[i+150+64]=Stp_Cai_XGP[i+64]; //以上传值更新保存参数值
int JZP,XGP; //对应校正步号返回的校正参数及效果参数的位置
fprintf(fp," \n");
fprintf(fp," \n");
fprintf(fp,"========================================================== %s ======================================================\n",Cali_Title);
fprintf(fp," \n");
fprintf(fp," 增益目标码: %d 偏色系数下限: %d 偏色系数上限: %d\n",((Def_Stp_Para[152]<<8) | (Def_Stp_Para[153])),(Def_Stp_Para[274]-100),(Def_Stp_Para[273]-100));
fprintf(fp," \n");
fprintf(fp," ==偏色调整系数==\n");
fprintf(fp," R通道 G通道 B通道\n");
i=150+120; //
fprintf(fp," 整体:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+96;
fprintf(fp," CCD1:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+99;
fprintf(fp," CCD2:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+102;
fprintf(fp," CCD3:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+105;
fprintf(fp," CCD4:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+108;
fprintf(fp," CCD5:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
/* i=150+111;
fprintf(fp," CCD6:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+114;
fprintf(fp," CCD7:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+117;
fprintf(fp," CCD8:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
*/
JZP=214; //CCD头静态增益校正参数在Def_Stp_Para缓冲区中的起始位置=214
XGP=150+720; //CCD头静态增益校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+720
fprintf(fp," \n");
fprintf(fp," ==静态增益校正参数及校正效果参数==\n");
Cali_Disp(JZP,XGP,fp); //静态增益校正参数及校正效果参数格式化写入
JZP=1; //CCD头动态偏移参数没有上传,设置JZP=1,决定在写入时单另处理。
XGP=150+960; //CCD头动态偏移状况参数在Stp_Cai_XGP缓冲区中的起始位置=150+960
fprintf(fp," \n");
fprintf(fp," ==动态偏移状况参数==\n");
Cali_Disp(JZP,XGP,fp); //动态偏移状况参数格式化写入
JZP=1; //CCD头动态增益参数没有上传,设置JZP=1,决定在写入时单另处理。
XGP=150+1200; //CCD头动态增益校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+1200
fprintf(fp," \n");
fprintf(fp," ==动态增益校正效果参数==\n");
Cali_Disp(JZP,XGP,fp); //动态增益校正参数及校正效果参数格式化写入
JZP=150+88; //CCD头增益范围参数在Def_Stp_Para缓冲区中的起始位置=150+88
XGP=150+1440; //CCD头动态增益校正状况参数在Stp_Cai_XGP缓冲区中的起始位置=150+1440
fprintf(fp," \n");
fprintf(fp," ==动态增益校正状况参数==\n");
Cali_DGain_Dsp(JZP,XGP,fp); //动态增益校正状况参数格式化写入
}
/*==========================================================================/
/ *****动态增益校正状况参数显示格式行写入***** /
/ 将Def_Stp_Para数组JZP开始的校正参数及Stp_Cai_XGP数组XGP开始的 /
/ 效果参数写入fp文件 /
/==========================================================================*/
void Cali_DGain_Dsp(int JZP,int XGP,FILE *fp)
{
int HEADnum=5; //扫描头的个数
//状况参数值在Stp_Cai_XGP缓冲区为每头14字节,2字节总数+3通道各4字节状况值。显示时先将2字节的参数转换成1个字。
int XGbuf[56]; //5个头共35个字。
//写入显示格式行
fprintf(fp," ---------- R通道 --------- ---------- G通道 --------- ---------- B通道 --------- \n");
fprintf(fp,"增益范围 有效像点总数 校正不足的像点数 校正过量的像点数 校正不足的象点数 校正过量的象点数 校正不足的象点数 校正过量的象点数 \n");
int i;
double Range;
for(i=0;i<7*HEADnum;i++) //将上传的2字节效果参数值转换成1个字
XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);
for(i=0;i<HEADnum;i++) //将HEADnum个头的校正参数和效果参数写入fp文件
{
if (Def_Stp_Para[JZP]==1) Range=1.5;
if (Def_Stp_Para[JZP]==2) Range=2.0;
if (Def_Stp_Para[JZP]==3) Range=3.0;
if ((Def_Stp_Para[JZP]<1) || (Def_Stp_Para[JZP]>3)) Range=9.9;
fprintf(fp,"%6.1f%12d%16d%18d%18d%18d%18d%18d\n",Range,XGbuf[7*i+0],XGbuf[7*i+1],XGbuf[7*i+2],XGbuf[7*i+3],XGbuf[7*i+4],XGbuf[7*i+5],XGbuf[7*i+6]);
JZP=JZP+1;
}
}
/*==========================================================================/
/ *****分步校正效果参数显示格式行写入***** /
/ 将Def_Stp_Para数组JZP开始的校正参数及Stp_Cai_XGP数组XGP开始的 /
/ 效果参数写入fp文件 /
/==========================================================================*/
void Cali_Disp(int JZP,int XGP,FILE *fp)
{
int HEADnum=5; //扫描头的个数
//效果参数值在Stp_Cai_XGP缓冲区为每通道10字节,每个头为3*10字节。显示时先将2字节的效果参数转换成1个字。
int XGbuf[120]; //5个头的效果参数值缓冲区,每通道5个字,每头3*5个字,5个头共75个字。
//写入显示格式行
fprintf(fp," --------------- R通道 ---------------- ----------------- G通道 ----------------- ----------------- B通道 ----------------- \n");
fprintf(fp,"参数值 最大值 象点数 最小值 象点数 平均值 大÷小 参数值 最大值 象点数 最小值 象点数 平均值 大÷小 参数值 最大值 象点数 最小值 象点数 平均值 大÷小\n");
int i;
double Max_div_Min;
for(i=0;i<15*HEADnum;i++) //将上传的2字节效果参数值转换成1个字
XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);
if (JZP==1) //校正效果参数写入fp文件
{
for(i=0;i<HEADnum;i++) //将HEADnum个头的校正参数和效果参数写入fp文件
{
Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
fprintf(fp,"%11d%7d%7d%7d%7d%8.2f",XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min); //R
Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
fprintf(fp,"%14d%7d%7d%7d%7d%8.2f",XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min); //G
Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
fprintf(fp,"%14d%7d%7d%7d%7d%8.2f\n",XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min); //B
}
}
else
for(i=0;i<HEADnum;i++) //将HEADnum个头的校正参数和效果参数写入fp文件
{
Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
fprintf(fp,"%4d%7d%7d%7d%7d%7d%8.2f",Def_Stp_Para[JZP],XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);
JZP=JZP+1; //指向G通道
Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f",Def_Stp_Para[JZP],XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);
JZP=JZP+1; //指向B通道
Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f\n",Def_Stp_Para[JZP],XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);
JZP=JZP+1; //指向下一头的R通道
}
}
/*==========================================================================/
/ *****静态偏移分步校正效果参数显示格式行写入***** /
/ 将Def_Stp_Para数组JZP开始的校正参数及Stp_Cai_XGP数组XGP开始的 /
/ 效果参数写入fp文件 /
/==========================================================================*/
void Cali_OFF_Dsp(int JZP,int XGP,FILE *fp)
{
int HEADnum=5; //扫描头的个数
//效果参数值在Stp_Cai_XGP缓冲区为每通道10字节,每个头为3*10字节。显示时先将2字节的效果参数转换成1个字。
int XGbuf[120]; //5个头的效果参数值缓冲区,每通道5个字,每头3*5个字,5个头共75个字。
//写入显示格式行
fprintf(fp," --------------- R通道 ---------------- ----------------- G通道 ----------------- ----------------- B通道 ----------------- \n");
fprintf(fp,"参数值 最大值 象点数 最小值 象点数 平均值 大÷小 参数值 最大值 象点数 最小值 象点数 平均值 大÷小 参数值 最大值 象点数 最小值 象点数 平均值 大÷小\n");
int i;
double Max_div_Min;
for(i=0;i<15*HEADnum;i++) //将上传的2字节效果参数值转换成1个字
XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);
int R,G,B;
for(i=0;i<HEADnum;i++) //将HEADnum个头的校正参数和效果参数写入fp文件
{
R=Def_Stp_Para[JZP];
G=Def_Stp_Para[JZP+1];
B=Def_Stp_Para[JZP+2];
JZP=JZP+3; //指向下一头的R通道
if (R>31) R=32-R;
if (G>31) G=32-G;
if (B>31) B=32-B;
Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
fprintf(fp,"%4d%7d%7d%7d%7d%7d%8.2f",R,XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);
Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f",G,XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);
Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f\n",B,XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);
}
}
/*---------------------------两整数相除-------------------------------------/
/ 若除数为零,则结果=99.99 /
/--------------------------------------------------------------------------*/
double M_Div_N(int A,int B)
{
double C;
if (B==0) C=99.99;
else C=1.0*A/(B*1.0);
return(C);
}
/*=====================2004年2月18日增加====================================/
/ *****初始化Def_Stp_Para数组内的缺省参数及分步参数***** /
/ 从jiaose.ini中读取并初始化Def_Stp_Para数组内的300字节下传参数 /
/ 在校正设置界面打开及每次扫描前调用 /
/==========================================================================*/
void Stp_Para_INI()
{
Stp_DefuP_INI(); //读取jiaose.ini文件内的缺省参数初始化Def_Stp_Para缓冲区中下传参数包的前150字节
Stp_GanG_INI(); //初始化Def_Stp_Para数组后150字节中的感光参数
Stp_Offset_INI(); //初始化Def_Stp_Para数组后150字节中的静态偏移参数
Stp_GanPs_INI(); //初始化Def_Stp_Para数组后150字节中的静态增益及偏色系数参数
Stp_Cai_CtrP_INI(); //初始化分步校正控制参数及动态增益均值滤波控制参数
}
//---------------- 2004.3.24 初始化缺省参数 ------------//
// 读jiaose.ini文件,初始化Def_Stp_Para数组中0~149单元的150字节的缺省参数 //
//----------------------------------------------------------------------------------//
void Stp_DefuP_INI()
{
int i,Tmp;
// ***CCD线阵缺省参数***
Tmp=GetPrivateProfileInt("CCD_Para","CCD_DefP_Ena",0,InitDir2);
Def_Stp_Para[0] =LOBYTE(Tmp); //CCD缺省参数有效标志:有效=0xA5
Tmp=GetPrivateProfileInt("CCD_Para","Max_Pixel",10708,InitDir2);
Def_Stp_Para[1] =HIBYTE(Tmp); //CCD线阵象点数
Def_Stp_Para[2] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("CCD_Para","Dmp_Pixel",46,InitDir2);
Def_Stp_Para[3] =LOBYTE(Tmp); //CCD线阵头部哑元数
Tmp=GetPrivateProfileInt("CCD_Para","Blk_Pixel",34,InitDir2);
Def_Stp_Para[4] =LOBYTE(Tmp); //CCD线阵头部黑点数
Tmp=GetPrivateProfileInt("CCD_Para","Add_Pixel",12,InitDir2);
Def_Stp_Para[5] =HIBYTE(Tmp); //CCD线阵的附加感光象点数
Def_Stp_Para[6] =LOBYTE(Tmp);
// ***LM9812时序缺省参数***
i=8;
int j;
char TmpStr[10];
strcpy(TmpStr,"LM98_CCD1");
for (j=1;j<=8;j++)
{
TmpStr[8]=LOBYTE(0x30+j);
Tmp=GetPrivateProfileInt(TmpStr,"Reg16",10,InitDir2);
Def_Stp_Para[i+0] =LOBYTE(Tmp); //TR脉冲的宽度
Tmp=GetPrivateProfileInt(TmpStr,"Reg18",10,InitDir2);
Def_Stp_Para[i+1] =LOBYTE(Tmp); //TR沿距Q1沿的距离
Tmp=GetPrivateProfileInt(TmpStr,"Reg19",10,InitDir2);
Def_Stp_Para[i+2] =LOBYTE(Tmp); //光学黑点钳位的开始时刻
Tmp=GetPrivateProfileInt(TmpStr,"Reg20",22,InitDir2);
Def_Stp_Para[i+3] =LOBYTE(Tmp); //光学黑点钳位的开始时刻
Tmp=GetPrivateProfileInt(TmpStr,"Reg21",0xad,InitDir2);
Def_Stp_Para[i+4] =LOBYTE(Tmp); //RS脉冲的宽度及位置
Tmp=GetPrivateProfileInt(TmpStr,"Reg22",10,InitDir2);
Def_Stp_Para[i+5] =LOBYTE(Tmp); //参考电平采样的位置
Tmp=GetPrivateProfileInt(TmpStr,"Reg23",22,InitDir2);
Def_Stp_Para[i+6] =LOBYTE(Tmp); //信号电平采样的位置
Tmp=GetPrivateProfileInt(TmpStr,"Reg27",0x40,InitDir2);
Def_Stp_Para[i+7] =LOBYTE(Tmp); //测试波形输出(CDS/Clamp)
i=i+8;
}
// ***** 头尾重叠下传参数 *****
int Head,End,Adj;
char HStr[10],EStr[9],AStr[9];
i=72;
strcpy(HStr,"Head_CNT1");
strcpy(EStr,"End_CNT1");
strcpy(AStr,"END1_Adj");
for (j=1;j<=8;j++)
{
HStr[8]=LOBYTE(0x30+j);
EStr[7]=LOBYTE(0x30+j);
AStr[3]=LOBYTE(0x30+j);
Head=GetPrivateProfileInt("CCD_Pj",HStr,10,InitDir2);
End=GetPrivateProfileInt("CCD_Pj",EStr,10,InitDir2);
Adj=GetPrivateProfileInt("CCD_Adjust",AStr,0,InitDir2);
Def_Stp_Para[i+0]=HIBYTE(Head); //头部重叠区象素数
Def_Stp_Para[i+1]=LOBYTE(Head);
Def_Stp_Para[i+2]=HIBYTE(End+Adj); //尾部重叠区象素数
Def_Stp_Para[i+3]=LOBYTE(End+Adj);
i=i+4;
}
//修改第一头的头部重叠数:将头部剪切量加进去
Head=GetPrivateProfileInt("CCD_Pj","Head_CNT1",10,InitDir2);
Adj=GetPrivateProfileInt("CCD_Adjust","Head_Adj",10,InitDir2);
Def_Stp_Para[72]=HIBYTE(Head+Adj); //头部重叠区象素数+头部剪切量
Def_Stp_Para[73]=LOBYTE(Head+Adj);
//A0扫描仪:将尾部修改剪切量加到第五头的尾部剪切值中去
//A1扫描仪:将尾部修改剪切量加到第三头的尾部剪切值中去
End=GetPrivateProfileInt("CCD_Pj","End_CNT5",10,InitDir2);
Adj=GetPrivateProfileInt("CCD_Adjust","END5_Adj",10,InitDir2);
Def_Stp_Para[90]=HIBYTE(End+Adj); //第5头尾部重叠区象素数+尾部剪切量
Def_Stp_Para[91]=LOBYTE(End+Adj);
//***分步校正缺省参数***
i=104;
Tmp=GetPrivateProfileInt("Step_JZ","Beg_CCD",1,InitDir2);
Def_Stp_Para[i+0] =LOBYTE(Tmp); //开始的CCD号
Tmp=GetPrivateProfileInt("Step_JZ","End_CCD",3,InitDir2);
Def_Stp_Para[i+1] =LOBYTE(Tmp); //结束的CCD号
Tmp=GetPrivateProfileInt("Step_JZ","Exp_ContFLG",0,InitDir2);
Def_Stp_Para[i+2] =LOBYTE(Tmp); //强制感光控制标志:=0xA5-->关闭感光;=其它-->扫描仪控制
Tmp=GetPrivateProfileInt("Step_JZ","Lin_Num",8,InitDir2);
Def_Stp_Para[i+3] =LOBYTE(Tmp); //校正扫描行
Tmp=GetPrivateProfileInt("Step_JZ","Lin_Num_Mi",3,InitDir2);
Def_Stp_Para[i+4] =LOBYTE(Tmp); //校正扫描行数的幂
Tmp=GetPrivateProfileInt("Step_JZ","Step_Vec",30000,InitDir2);
Def_Stp_Para[i+5] =HIBYTE(Tmp); //校正步进速度
Def_Stp_Para[i+6] =LOBYTE(Tmp);
//***电机速度控制缺省参数***
/*
i=114; //零位搜索
Tmp=GetPrivateProfileInt("Motor_Zero","Start_Vec",25000,InitDir2);
Def_Stp_Para[i+0] =HIBYTE(Tmp); //启动速度
Def_Stp_Para[i+1] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("Motor_Zero","Max_Vec",2500,InitDir2);
Def_Stp_Para[i+2] =HIBYTE(Tmp); //最高速度
Def_Stp_Para[i+3] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("Motor_Zero","Max_Acc",100,InitDir2);
Def_Stp_Para[i+4] =HIBYTE(Tmp); //加速度最大值
Def_Stp_Para[i+5] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("Motor_Zero","Max_Acc_Stp",500,InitDir2);
Def_Stp_Para[i+6] =HIBYTE(Tmp); //最大加速步数
Def_Stp_Para[i+7] =LOBYTE(Tmp);
*/
i=122; //移动定位
Tmp=GetPrivateProfileInt("Motor_Move","Start_Vec",25000,InitDir2);
Def_Stp_Para[i+0] =HIBYTE(Tmp); //启动速度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -