You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于运行时长与跳闸状态的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:06:17