js倒计时3s自动关闭窗口, 封装弹窗开关函数,好用

在这里插入图片描述

		
        var timer = 0;
        
 		// 倒计时函数
        _jisuan (elementId, valueElem, count=3) {
            // 选择弹框id   填值元素 计时时间
            var sum = count;
            timer = setInterval(function () {
                count--;
                document.getElementById(valueElem).innerHTML = "请取走卡片 (" + count +"S)";

                <!-- 值为0 就销毁计时器 避免计算错乱  -->
                if (count <= 0) {
                    clearInterval(timer);
                    // timer = null;
                    // console.log('销毁');
                    document.getElementById(elementId).style.display = 'none'
                }
            }, 1000);

            document.getElementById(valueElem).innerHTML ="请取走卡片 ("+ sum+ "S)"; //还原数值 每次点击进去的初始数字是 sum
        }

还需要在不需要的时候,清除timer! 避免计数错乱

		 
         // 封装弹窗 -- 显示/隐藏
        _hiddenTheWindowContainer(name) {
            clearInterval(timer)   //清除timer 
            let container = $($(document)[0]).find('div.' + name);
            if (container.css('display') === "none") {
                // 显示
                container.css('display', 'block');
            } else {
                // 关闭
                container.css('display', 'none');
            }

        }
<think>好的,用户想了解西门子S7-1200红绿灯编程梯形图的另一种方法。首先,我需要回忆一下通常的做法。传统的红绿灯控制可能使用定时器和顺序控制,比如用多个定时器串联,每个定时器控制一个阶段的持续时间,然后根据定时器的状态切换信号灯。 用户可能已经掌握了基础的方法,现在想寻求更高效或者结构不同的解决方案。可能的替代方法包括使用计数器替代定时器,或者使用结构化编程如函数块(FB)、状态控制(比如GRAPH语言),或者使用S7-1200的特定功能如时间中断组织块(OB10)等。 另一个可能性是用户希望简化程序结构,比如使用移位寄存器或者比较指令来管理不同的阶段。或者采用面向对象的方法,将每个方向的灯组作为一个实例来处理,提高代码复用性。 需要考虑红绿灯的逻辑通常有固定的周期,比如东西绿灯30秒,黄灯3秒,红灯43秒,同时南北红灯43秒,之后切换。所以可能需要循环控制,确保各阶段的正确交替。 可能还需要考虑使用S7-1200的PLC数据类型(UDT)来组织数据,或者使用配方功能来存储不同的定时参数,便于调整。 用户可能对传统的梯形图感到繁琐,想要更模块化的设计。因此,使用函数封装每个阶段的逻辑,然后在主程序中调用,可能是一个好方法。此外,使用状态变量或者枚举类型来管理当前状态,结合比较指令来触发状态转移,可能更清晰。 还要注意资源优化,避免过多的定时器同时运行,合理分配内存。另外,错误处理,比如某个灯故障时的检测,是否需要加入监控逻辑,但用户可能暂时不需要。 总结可能的替代方法: 1. 使用计数器与比较指令结合,替代多个定时器。 2. 使用状态编程(如使用位状态或状态字),通过不同状态切换信号灯。 3. 应用函数块(FB)进行模块化设计,每个交通方向作为一个实例。 4. 利用时间中断OB块定期触发状态切换。 5. 使用移位寄存器或序列发生器的方法逐步激活各个阶段。 6. 采用S7-GRAPH进行状态编程,但需要确认S7-1200是否支持,可能需要额外安装。 需要详细解释其中一种或几种方法的实现步骤,并给出梯形图的示例结构。同时,考虑用户可能对某些术语不熟悉,需用中文简明解释,并确保逻辑清晰,步骤可行。</think>针对西门子S7-1200红绿灯编程,除了传统的定时器串联方法,还可以通过以下两种结构化方法实现。以下为具体方案及梯形图逻辑说明: --- ### **方法一:状态字+循环计时控制** #### **核心思路** 利用一个状态字(如`MW100`)表示红绿灯的不同阶段,结合单一计时器和比较指令实现循环切换,减少定时器数量。 #### **步骤说明** 1. **定义状态与时间参数**: - **状态1**:东西绿灯30秒,南北红灯。 - **状态2**:东西黄灯3秒,南北红灯。 - **状态3**:南北绿灯30秒,东西红灯。 - **状态4**:南北黄灯3秒,东西红灯。 2. **梯形图逻辑**: ```ladder // 主循环计时器 TON(T#1s, // 基础时钟(每秒触发) Timer_DB, Preset:=76); // 总周期76秒(30+3+30+3+10缓冲) // 状态切换逻辑 CASE MW100 OF 0: // 初始状态→状态1 IF Timer_DB.ET >= 0 AND Timer_DB.ET < 30 THEN 东西绿灯=ON; 南北红灯=ON; ELSE MW100 := 1; END_IF; 1: // 状态1→状态2(黄灯) IF Timer_DB.ET >=30 AND Timer_DB.ET <33 THEN 东西黄灯=ON; 南北红灯=ON; ELSE MW100 := 2; END_IF; 2: // 状态2→状态3(切换方向) IF Timer_DB.ET >=33 AND Timer_DB.ET <63 THEN 南北绿灯=ON; 东西红灯=ON; ELSE MW100 := 3; END_IF; 3: // 状态3→状态4(黄灯) IF Timer_DB.ET >=63 AND Timer_DB.ET <66 THEN 南北黄灯=ON; 东西红灯=ON; ELSE MW100 := 0; // 复位循环 Timer_DB.RESET; END_IF; END_CASE; ``` --- ### **方法二:模块化函数块(FB)设计** #### **核心思路** 将单个方向的灯组控制封装为可复用的函数块,通过参数配置实现多方向协调。 1. **创建FB“TrafficLight_FB”**: ```ladder FUNCTION_BLOCK TrafficLight_FB VAR_INPUT GreenTime: TIME := T#30s; // 绿灯时间 YellowTime: TIME := T#3s; // 黄灯时间 RedTime: TIME := T#43s; // 红灯时间 Start: BOOL; // 启动信号 END_VAR VAR_OUTPUT Green, Yellow, Red: BOOL; // 输出信号 END_VAR VAR CycleTimer: TON; // 周期计时器 CurrentState: INT := 0; // 状态机 END_VAR ``` 2. **FB内部逻辑**: ```ladder IF Start THEN CycleTimer(IN:=NOT CycleTimer.Q, PT:=GreenTime + YellowTime + RedTime); CASE CurrentState OF 0: // 绿灯阶段 Green := TRUE; IF CycleTimer.ET >= GreenTime THEN CurrentState := 1; END_IF; 1: // 黄灯阶段 Yellow := TRUE; IF CycleTimer.ET >= (GreenTime + YellowTime) THEN CurrentState := 2; END_IF; 2: // 红灯阶段(等待其他方向完成) Red := TRUE; IF CycleTimer.ET >= (GreenTime + YellowTime + RedTime) THEN CurrentState := 0; CycleTimer.RESET; END_IF; END_CASE; END_IF; ``` 3. **主程序调用FB**: ```ladder // 实例化东西&南北方向 TrafficLight_FB( Start:=TRUE, GreenTime:=T#30s, YellowTime:=T#3s, RedTime:=T#43s, Green=>东西绿灯, Yellow=>东西黄灯, Red=>东西红灯 ); TrafficLight_FB( Start:=东西红灯, // 当东西红灯结束时触发南北绿灯 GreenTime:=T#30s, YellowTime:=T#3s, RedTime:=T#43s, Green=>南北绿灯, Yellow=>南北黄灯, Red=>南北红灯 ); ``` --- ### **优势对比** - **状态字法**:节省硬件资源,仅需1个定时器,适合简单循环场景。 - **模块化FB**:提升代码复用性,扩展性强(如新增行人信号灯),适合多路口协调。 通过上述方法,可根据项目需求选择更高效的编程模式,优化PLC资源利用率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值