结构框架:
//不同模式下 加热速度控制代码
不同模式下Run_Rate[i]/*0~6*/ 不同speedvol
UCHAR Control_Status[CONTROL_CHANNEL];// 6通道控温状态 1-达到温控点 0-没达到
//运行信息
typedef struct
{
short RunSeg; //当前运行的节点
short RunCycle; //当前运行的循环 循环下标 3
short RunCycleNum; //当前运行到循环哪次 循环了 30次
short RunInnerCycleNum; //保存内循环的值
short RunOutsideCycleRunNum; //保存外循环的值
short Null[3];
} StructSector;
//运行文件信息
typedef struct
{
short RunNow; //运行标志(正常开机,断电后重启)没设0xffff 结束了 1
short RunEnd; //运行结束标志
short FolderName[12]; //目录名
short FileName[12]; //文件名
short SaveYear; //年(文件的保存时间)
short SaveMonth; //月(文件的保存时间)
short SaveDate; //日(文件的保存时间)
short SaveHour; //时(文件的保存时间)
short SaveMinute; //分(文件的保存时间)
short SaveSecond; //秒(文件的保存时间)
short HotlidSet; //热盖设置温度
short VolumeSet; //样本容量
short ModeSet; //运行的模式
short TestModeSet; //模拟模式
short FirstPause; //首节暂停
short EditSeg; //节点个数
short EditCycle; //循环个数 总共有多少个循环
short TempSet[MAX_SEG]; //各节点温度 温度为实际温度*10
short HourSet[MAX_SEG]; //节点时间---时
short MinuteSet[MAX_SEG]; //节点时间---分钟
short SecondSet[MAX_SEG]; //节点时间---秒
short SpeedSet[MAX_SEG]; //速度 默认40
short TempCYCSet[MAX_SEG]; //每个循环节点提升温度
short MinuteCYCSet[MAX_SEG]; //分――每个循环节点增加时间
short SecondCYCSet[MAX_SEG]; //秒――每个循环节点增加时间
short GradSet[MAX_SEG]; //梯度
short CycleSet[MAX_CYCLE]; //每个循环次数 每个循环里的次数
short CycleBeginSet[MAX_CYCLE]; //循环开始节点 循环结束结束 2 4 (2~3 5次 4~5 10次)
short CycleEndSet[MAX_CYCLE]; //循环终止节点 循环开始节点 1 3
short GradExtSet[6][MAX_SEG]; //独立运行信息
//short AloneSet[MAX_SEG]; //分区设置
short TubeVolSet; //试管体积
short TubeTypeSet; //试管类型
short Fill[580]; //用于填充,结构总长度2Kwords
}StructFile;
//剩余时间计算
typedef struct
{
unsigned long File_Add;//文件地址
short Seg; //运行节
short cyc_inside; //运行内循环数
short cyc_outside; //运行外循环数
short outside_flag; //内/外循标志
short OverShootFlag; //过冲标志 1-过冲,0-不过冲
short OverTime; //过冲时间,根据不同样本容量,过冲时间不同
short Now_Temp; //当前温度
}StructCalTime;
StructFile Cal_RunFile;
StructCalTime *Cal_Point;
StructFile Run_FileA,*Run_File_p;//A模块运行文件及指针
StructSector * RunNodeInfoA; //A模块运行节点信息
if( 1 == actual_flags)
{
//Cal_RemainTime((StructFile *)(Cal_Time.File_Add),Cal_Time.Seg,
// Cal_Time.cyc_inside,Cal_Time.cyc_outside,Cal_Time.outside_flag);
Cal_Point = &Cal_TimeA;
Cal_RemainTime();
CalTimeValue.Calaute_Time = CalculateTime;
CalTimeValue.block_id = 0; // 单模块 双模块 A
CalTimeValue.SoakFlag = T_SoakFlag;
tx_queue_send(&CALSEND_QUEUE,&CalTimeValue,TX_NO_WAIT);
}
void thread_caltime_entry(ULONG thread_input)
{
while(1)
{
status=tx_event_flags_get(&event_flags_caltime_set, 0x7, TX_OR_CLEAR, &actual_flags, TX_WAIT_FOREVER);
{
if( 1 == actual_flags)
{
Cal_Point = &Cal_TimeA;
Cal_RemainTime();
}
2
Cal_Point = &Cal_TimeB;
Cal_RemainTime();
3
Cal_Point = &Cal_TimeC;
Cal_RemainTime();
}
}
}
UCHAR Control_Dir[CONTROL_CHANNEL];//0-制冷 1-制热
int CONVOL[CONTROL_CHANNEL]; //写入DAC的值 控制量输出
UCHAR Over_Finish[CONTROL_CHANNEL];//过冲标志 0-未开始 1-过冲开始但没结束 2-过冲结束
UCHAR Control_Status[CONTROL_CHANNEL];//6通道控温状态 1-达到温控点 0-没达到
UCHAR Run_Seg_Begin[CONTROL_CHANNEL]; //6路TE片是否达到温度点 0-没达到温控点 1-达到温控点(与设置温度差0.5℃)
UCHAR BlockNum;//几个模块 96Vx2为两个模块
UCHAR Current_Channel;//多少个通道 96Vx2为6
signed int Lid_temp[3];//热盖实际温度 实际温度*100
signed int HotlidSet[3]; //热盖设置温度 实际温度*100
signed int block_temp[CONTROL_CHANNEL];// 6路TE片模块实际温度 实际温度*100
UCHAR Control_Flag[3]; //开始控温标志 0-关闭控制 1-开启控制 当该模块热盖温度差5°达到时开始控制
UCHAR CurrentNum=3; //CurrentNum=Current_Channel/BlockNum=3
int TempRun[CONTROL_CHANNEL];//设置的温度,如果设置了梯度需要加上梯度温度 实际温度*10
int Current_Temp;//6通道中某通道的当前温度 实际温度*10
num_i 0~1
signed int Run_Rate[CONTROL_CHANNEL];// 控制速率 默认400
{
Run_Rate[i] = (Run_FileA.SpeedSet[RunSegA])*10=400;//SpeedSet 默认40 //经济模式
if (Run_FileA.TestModeSet == 0)= Run_Rate[i]= 220;// 标准模式
if (Run_FileA.TestModeSet == 0)= Run_Rate[i]= 350 制冷 400 制热;// 快速模式
if (TempRun[i]<(block_temp[i]/10)) //制冷
{
Control_Dir[i] = 0;
SpeedVol=Run_Rate*10-Cool_Bios //温度越高 值越小
}
else //制热
SpeedVol=(-1)*Run_Rate[i]*10-Heat_Bios(block_temp[i]);//温度越高,值越大
}
int TempSRun[CONTROL_CHANNEL];Run_Rate//节运行温度设置
{
如果不过冲:ModeSet=0
TempSRun[i]=TempRun[i];
如果有过冲:ModeSet=1
降温:TempSRun[i]=TempRun[i] - OverTempDown; //根据加液量不同而不同
升温:TempSRun[i]=TempRun[i] + OverTempUp; //根据加液量不同而不同
}
// 温度控制进程
void TX_Temp_Control_Entry(ULONG thread_input)
{
while(1)
{
//200ms 由定时器 事件生成
ad_status=tx_event_flags_get(&TempSampleEvent,0x01, TX_OR_CLEAR,&ad_actual_event,TX_WAIT_FOREVER);
if (ad_status == TX_SUCCESS)
{
//1、接收STM32的数据,各个温度模块目前温度
//2、控制风扇,根据接收的温度值,修改写入DAC的值DacWrite();
//3、控制热盖温度,根接收温度与设置温度,STM32控制温度
//如果达到温控点 发送事件 tx_event_flags_set(&LidHeatTempReach, 0x1, TX_OR);
CurrentNum=Current_Channel/BlockNum;//6/2=3 表示一个模块多少个通道
for(num_i = 0;num_i<BlockNum;num_i++) //0~2 num_i 多少个模块
{
for (loc_i = CurrentNum*num_i;loc_i<CurrentNum*(num_i+1);loc_i++)
{
//填充采集上来的温度到 block_temp[loc_i]
}
if( Err_Code )//有错误检测代码
{
tx_event_flags_set(&Err_Set, 0x1, TX_OR);//0x2 0x4
}
if(Control_Flag[num_i])//热盖温度快要到达,开始温控 热盖温度与实际温度有5℃差值时
{
for (loc_i = CurrentNum*num_i;loc_i<CurrentNum*(num_i+1);loc_i++)//0-2 3-6
{
if( Run_Seg_Begin[] )//TE片达到控制温度 偏差小于0.5
{
Control_Status[loc_i] = 1;
TempControl(TempRun[loc_i]);
CON_VOL = abs(CONVOL[control_channel]);
DacWrite(loc_i,CON_VOL);
}
else//控速
{
TempControl(TempRun[loc_i]);
if (TempRun[loc_i]>=block_temp[loc_i]/10)// 加热
{
HeatSpeedCon();
if (abs(TempRun[loc_i]-block_temp[loc_i]/10)<10)//偏差小于1度
{
CON_VOL = abs(CONVOL[control_channel]);
DacWrite(loc_i,CON_VOL);
}
else if (SpeedVol[control_channel]>CONVOL[control_channel])
{
CON_VOL = abs(SpeedVol[control_channel]);
DacWrite(loc_i,CON_VOL);
}
else
{
CON_VOL = abs(CONVOL[control_channel]);
DacWrite(loc_i,CON_VOL);
}
}
else
{
CoolSpeedCon();//制冷
if (abs(TempRun[loc_i]-block_temp[loc_i]/10)<10) // 偏差小于1度
{
CON_VOL = abs(CONVOL[control_channel]);
DacWrite(loc_i,CON_VOL);
}
else if(SpeedVol[control_channel]<CONVOL[control_channel])
{
CON_VOL = abs(SpeedVol[control_channel]);
DacWrite(loc_i,CON_VOL);
}
else
{
CON_VOL = abs(CONVOL[control_channel]);
DacWrite(loc_i,CON_VOL);
}
}
}
}
}
else//热盖温度没有到达
{
if()//运行中
{
TempControl(TempSoak);
CON_VOL = abs(CONVOL[control_channel]);
DacWrite(loc_i,CON_VOL);
}
else
{
//没在运行 DAC写入0
}
}
}
}
}
}
//* 功能:模块TE温度升温速率控制
void HeatSpeedCon()
{
如果升温速度> 设置升温速度,SpeedVol 变大,升温变慢 //升温,SpeedVol为负数
如果升温速度< 设置升温速度,SpeedVol 变小,升温变快
}
//* 功能:模块TE温度制冷速率控制
void CoolSpeedCon()
{
如果制冷过快,SpeedVol变小,降温变慢//降温,SpeedVol为正数
如果制冷过慢,SpeedVol变小,降温变慢//降温,SpeedVol为正数
}
//* 功能: 模块温度控制
void TempControl(int new_Temp_Run)
{
TempEn=实际温度-设置温度
TdControlPar(); // 获得控制pid 参数 P_DATA,I_DATA,BIOS
DATA;//计算微分
if()//全功率
{
制冷: CONVOL=4095
制热: CONVOL=-4095
如果制冷并且设置温度小于40℃ 实际温度大于45摄氏度,75%功率CONVOL=0xc00,
如果制冷并且设置温度小于40℃ 实际温度小于45设置都,50%功率CONVOL=0x800,
IDATA[control_channel] = 0;// 积分量清零
}
else//非全功率
{
IDATA[control_channel]