前段时间不是要研究依照时间来启停设备的程序么
程序编写完成 初步测试已经OK,发了很多贴子,不晓得多少人能够看得明白SCL程序,以下附部分代码(核心代码)供大家参考。
//#############################初始化设备状态表格(结构体数组)####################################
//对符合要求数量的计数清零操作
TB_B_ST_I:=0;
TB_B_STO_I:=0;
//清空要排序的列表
FOR CLEAR_TB_I:= 1 TO NUM_ALL BY 1 DO
TB_B_ST[1,CLEAR_TB_I]:=0;
TB_B_ST[2,CLEAR_TB_I]:=0;
TB_B_STO[1,CLEAR_TB_I]:=0;
TB_B_STO[2,CLEAR_TB_I]:=0;
END_FOR;
//设备的总状态表格(结构体数组)有条件进行更新(总运行数量产生变化时或者任意一台设备手自动变化时)
FOR Initialization_TB_I:= 1 TO NUM BY 1 DO
RUN_STAUS[Initialization_TB_I].ID:=WORD_TO_INT(RUN_STATUS_DB.DW[8*(Initialization_TB_I-1)]);
RUN_STAUS[Initialization_TB_I].SS:=DWORD_TO_DINT(RUN_STATUS_DB.DD[8*(Initialization_TB_I-1)+2]);
RUN_STAUS[Initialization_TB_I].REMOTE:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,0];
RUN_STAUS[Initialization_TB_I].RUN:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,1];
RUN_STAUS[Initialization_TB_I].FAULT:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,2];
RUN_STAUS[Initialization_TB_I].TRIP:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,3];
RUN_STAUS[Initialization_TB_I].AM:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,4];
//不能启动停止的设备:没有在自动状态或者有故障或者有跳闸的均不能启停。
RUN_STAUS[Initialization_TB_I].NOT_ST_STO:=NOT(RUN_STAUS[Initialization_TB_I].AM) OR RUN_STAUS[Initialization_TB_I].FAULT OR RUN_STAUS[Initialization_TB_I].TRIP OR NOT(RUN_STAUS[Initialization_TB_I].REMOTE);
//符合备用启动的条件:设备没有运行且 能启停的状态
RUN_STAUS[Initialization_TB_I].STANDBY_ST:=NOT(RUN_STAUS[Initialization_TB_I].RUN) & NOT(RUN_STAUS[Initialization_TB_I].NOT_ST_STO) ;
//符合备用停止的条件:设备运行且 能启停的状态
RUN_STAUS[Initialization_TB_I].STANDBY_STO:=RUN_STAUS[Initialization_TB_I].RUN & NOT(RUN_STAUS[Initialization_TB_I].NOT_ST_STO);
//将设备编号赋值给控制输出的ID编号
CTL_OUT[Initialization_TB_I].ID:=RUN_STAUS[Initialization_TB_I].ID;
//判断是否符合备用启动条件,符合即将该设备的ID,SS,加入备用启动的列表
IF RUN_STAUS[Initialization_TB_I].STANDBY_ST THEN
//统计符合备用启动要求的台数
TB_B_ST_I:=TB_B_ST_I+1;
//将符合条件的设备加入备启数组
TB_B_ST[1,TB_B_ST_I]:=RUN_STAUS[Initialization_TB_I].ID;//原数据是INT类型存在隐性转换为DINT
TB_B_ST[2,TB_B_ST_I]:=RUN_STAUS[Initialization_TB_I].SS;
END_IF;
//判断是否符合备用停止条件,符合即将该设备的ID,SS,加入备用停止的列表
IF RUN_STAUS[Initialization_TB_I].STANDBY_STO THEN
//统计符合备用停止要求的台数
TB_B_STO_I:=TB_B_STO_I+1;
//将符合条件的设备加入备启数组
TB_B_STO[1,TB_B_STO_I]:=RUN_STAUS[Initialization_TB_I].ID;//原数据是INT类型存在隐性转换为DINT
TB_B_STO[2,TB_B_STO_I]:=RUN_STAUS[Initialization_TB_I].SS;
END_IF;
END_FOR;
//##############################备启设备列表进行排序·#########################################################
//这里采用冒泡算法进行对二维数组排序
REPEAT
ST_FLAG:=FALSE;
FOR PX_ST_I:= TB_B_ST_I TO 1 BY -1 DO
IF TB_B_ST[2,PX_ST_I-1]>TB_B_ST[2,PX_ST_I] THEN//从小到大排序
//对时间进行排序
PX_ST_TEMP1:=TB_B_ST[2,PX_ST_I];
TB_B_ST[2,PX_ST_I]:=TB_B_ST[2,PX_ST_I-1];
TB_B_ST[2,PX_ST_I-1]:=PX_ST_TEMP1;
//交换设备编号的位置和排序的时间一致
PX_ST_TEMP2:=TB_B_ST[1,PX_ST_I];
TB_B_ST[1,PX_ST_I]:=TB_B_ST[1,PX_ST_I-1];
TB_B_ST[1,PX_ST_I-1]:=PX_ST_TEMP2;
ST_FLAG:=TRUE;
END_IF;
END_FOR;
UNTIL NOT ST_FLAG
END_REPEAT;
//##############################备停设备列表进行排序#########################################################
//目前没有运行的设备的运行时间长短进行排序(按照时间最少的顺序排序)
//这里采用冒泡算法进行对二维数组排序
REPEAT
STO_FLAG:=FALSE;
FOR PX_STO_I:= 1 TO TB_B_STO_I BY 1 DO
IF TB_B_STO[2,PX_STO_I+1]>TB_B_STO[2,PX_STO_I] THEN//从大到小排序
//对时间进行排序
PX_STO_TEMP1:=TB_B_STO[2,PX_STO_I];
TB_B_STO[2,PX_STO_I]:=TB_B_STO[2,PX_STO_I+1];
TB_B_STO[2,PX_STO_I+1]:=PX_STO_TEMP1;
//交换设备编号的位置和排序的时间一致
PX_STO_TEMP2:=TB_B_STO[1,PX_STO_I];
TB_B_STO[1,PX_STO_I]:=TB_B_STO[1,PX_STO_I+1];
TB_B_STO[1,PX_STO_I+1]:=PX_STO_TEMP2;
STO_FLAG:=TRUE;
END_IF;
END_FOR;
UNTIL NOT STO_FLAG
END_REPEAT;