基于运行时长与跳闸状态的19台电机轮换控制逻辑需求
适配19台电机的TIA Portal控制逻辑改造
关键修改说明
- 所有循环边界从
0 TO 9改为0 TO 18,对应19台电机的索引范围 - 新增
#MotorTripSignal[18..0]布尔数组,用于标记每台电机的跳闸状态 - 新增2小时周期定时器触发轮换信号
- 所有涉及轮换的逻辑均过滤跳闸电机
完整改造后代码
// -------------------------- // 1. 电机运行时长统计(仅统计未跳闸且运行的电机) // -------------------------- FOR #index := 0 TO 18 DO // 跳过跳闸电机,不统计其运行时长 IF #MotorTripSignal[#index] = false THEN // 电机运行时,每秒累加时长(边沿触发避免重复计数) IF #MotorRunSignal[#index] = true THEN IF #M_Clockbit1s = true THEN IF #LoopOnce[#index] = false THEN #WorkingTimes[#index]."Time" := #WorkingTimes[#index]."Time" + 1; #LoopOnce[#index] := true; END_IF; ELSE #LoopOnce[#index] := false; END_IF; END_IF; END_IF; END_FOR; // -------------------------- // 2. 筛选未跳闸电机的时长并排序(升序:时长少的在前) // -------------------------- // 初始化排序数组,跳闸电机用极大值标记,排序时自动排到最后 FOR #k := 0 TO 18 DO IF #MotorTripSignal[#k] = true THEN #OrdenedList[#k] := 999999; ELSE #OrdenedList[#k] := #WorkingTimes[#k]."Time"; END_IF; END_FOR; // 冒泡排序:按时长升序排列 FOR #i := 0 TO 18 DO FOR #j := #i + 1 TO 18 DO IF #OrdenedList[#i] > #OrdenedList[#j] THEN #temp1 := #OrdenedList[#i]; #OrdenedList[#i] := #OrdenedList[#j]; #OrdenedList[#j] := #temp1; END_IF; END_FOR; END_FOR; // -------------------------- // 3. 2小时轮换触发定时器 // -------------------------- // TON定时器,预设值为2小时,循环计时 #Timer_2h.IN := true; #Timer_2h.PT := T#2H; #Timer_2h(); // 捕获定时器上升沿,生成单次触发的轮换信号 #CHNGOVER := #Timer_2h.Q AND NOT #Timer_2h_Prev; #Timer_2h_Prev := #Timer_2h.Q; // -------------------------- // 4. 分配启动优先级(仅未跳闸电机参与) // -------------------------- IF #CHNGOVER = true THEN // 初始化所有优先级为-1(未分配状态) FOR #l := 0 TO 18 DO #WorkingTimes[#l].PriorityNo := -1; END_FOR; // 按排序后的时长分配优先级:0为最高优先(运行时长最少) FOR #m := 0 TO 18 DO FOR #l := 0 TO 18 DO IF #OrdenedList[#m] = #WorkingTimes[#l]."Time" AND #WorkingTimes[#l].PriorityNo = -1 AND #MotorTripSignal[#l] = false THEN #WorkingTimes[#l].PriorityNo := #m; EXIT; // 找到匹配项后退出内层循环 END_IF; END_FOR; END_FOR; END_IF;
变量说明
#MotorRunSignal[18..0]:布尔数组,每台电机的运行状态信号(true=运行)#MotorTripSignal[18..0]:布尔数组,每台电机的跳闸状态信号(true=跳闸)#WorkingTimes[18..0]:结构体数组,包含Time(运行时长,整数)和PriorityNo(优先级,整数)#LoopOnce[18..0]:布尔数组,用于时长统计的边沿触发标记#OrdenedList[18..0]:整数数组,存储排序后的运行时长#Timer_2h:TON类型定时器,用于2小时周期触发#Timer_2h_Prev:布尔变量,用于捕获定时器的上升沿
内容的提问来源于stack exchange,提问作者Lalit Pandey
相关产品推荐
相关产品推荐

