恭喜,你发布的帖子
发布于 2017-07-28 11:54:27
1楼
//##############################备启设备列表进行排序·#########################################################
//这里采用冒泡算法进行对二维数组排序
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;
//##############################启动设备条件满足时####################################
//启动条件满足且运行总数小于设定的最大运行总数设定值时则产生启动命令
//启动命令产生时则触发一个标志位
IF ST_PN & (RUN_ALL<= INT_TO_DINT(NUM_H-1))& NOT(ST_P_FLAG) THEN
ST_P_FLAG:=1;//启动标志位置1不再执行该段程序直到该标志位复位
FOR CTL_OUT_ST_I:= 1 TO NUM_ALL BY 1 DO
//读取备起列表的第一个设备编号并逐个测试为哪一台设备,符合要求就启动起来
IF (TB_B_ST[1,1]=CTL_OUT_ST_I) & NOT(RUN_STAUS[CTL_OUT_ST_I].NOT_ST_STO) THEN
CTL_OUT[CTL_OUT_ST_I].START_P:=1;
CTL_OUT[CTL_OUT_ST_I].STOP_P:=0;
ELSE
CTL_OUT[CTL_OUT_ST_I].START_P:=0;
CTL_OUT[CTL_OUT_ST_I].STOP_P:=0;
END_IF;
END_FOR;
END_IF;
//##############################停止设备条件满足时####################################
CTL_OUT_STO_I:=0;
IF STO_PN &(RUN_ALL>=INT_TO_DINT(NUM_L)) & NOT(STO_P_FLAG) THEN
STO_P_FLAG:=1;//停止标志位置1不再执行该段程序直到该标志位复位
FOR CTL_OUT_STO_I:= 1 TO NUM_ALL BY 1 DO
IF (TB_B_STO[1,1]=CTL_OUT_STO_I) & NOT(RUN_STAUS[CTL_OUT_STO_I].NOT_ST_STO) THEN
CTL_OUT[CTL_OUT_STO_I].START_P:=0;
CTL_OUT[CTL_OUT_STO_I].STOP_P:=1;
ELSE
CTL_OUT[CTL_OUT_STO_I].START_P:=0;
CTL_OUT[CTL_OUT_STO_I].STOP_P:=0;
END_IF;
END_FOR;
END_IF;
//###############################启动脉冲复位########################################
IF PN & ST_P_FLAG THEN //这里需要注意FOR循环周期不能大于秒脉冲能执行完的时间
ST_COUNT:=ST_COUNT+1;
END_IF;
IF ST_COUNT>=P_WIDE THEN //对启动进行计时超过设定值则复位全部指令
FOR ST_P_REST_I:= 1 TO NUM_ALL BY 1 DO
CTL_OUT[ST_P_REST_I].START_P:=0;
END_FOR;
ST_P_FLAG:=0;
ST_COUNT:=0;
END_IF;
//###############################停止脉冲复位########################################
IF PN & STO_P_FLAG THEN //这里需要注意FOR循环周期不能大于秒脉冲能执行完的时间
STO_COUNT:=STO_COUNT+1;
END_IF;
IF STO_COUNT>=P_WIDE THEN //对启动进行计时超过设定值则复位全部指令
FOR STO_P_REST_I:= 1 TO NUM_ALL BY 1 DO
CTL_OUT[STO_P_REST_I].STOP_P:=0;
END_FOR;
STO_P_FLAG:=0;
STO_COUNT:=0;
END_IF;
//############################单输出指令##########################################
FOR CTL_OUT_START_I:= 1 TO NUM_ALL BY 1 DO
IF CTL_OUT[CTL_OUT_START_I].STOP_P OR RUN_STAUS[CTL_OUT_START_I].NOT_ST_STO THEN
CTL_OUT[CTL_OUT_START_I].START:=0;
ELSE
IF CTL_OUT[CTL_OUT_START_I].START_P THEN
CTL_OUT[CTL_OUT_START_I].START:=1;
END_IF;
END_IF;
//若存在不允许启动的情况则对脉冲指令进行复位操作
IF RUN_STAUS[CTL_OUT_START_I].NOT_ST_STO THEN
CTL_OUT[CTL_OUT_START_I].START_P:=0;
CTL_OUT[CTL_OUT_START_I].STOP_P:=0;
END_IF;
END_FOR;
//##############################复位操作########################################
IF REST THEN
ST_P_FLAG:=0;
ST_COUNT:=0;
STO_P_FLAG:=0;
STO_COUNT:=0;
FOR REST_I:= 1 TO NUM_ALL BY 1 DO
CTL_OUT[REST_I].START:=0;
CTL_OUT[REST_I].START_P:=0;
CTL_OUT[REST_I].STOP_P:=0;
END_FOR;
END_IF;
END_FUNCTION_BLOCK
定义看第一部分http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1411592&b_id=4&s_id=23&num=0
请填写推广理由:
分享
只看
楼主