Thread-X 框架举例:96pCr

本文介绍了Thread-X框架中节点切换的实现,通过SegChangeA函数详细阐述了如何进行节切换操作。
摘要由CSDN通过智能技术生成

结构框架:
在这里插入图片描述

//不同模式下 加热速度控制代码
 不同模式下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] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值