循环运行

有5指示灯,任意选取只数,选取完后任意循环运行。还得开几秒停几秒后再运行。
模式一
选取1、2、4,号指示灯,一只循环, 开两秒停三秒,
1 开两秒停三秒   / 2 开两秒停三秒 /4开两秒停三秒 /1 开两秒停三秒   / 2 开两秒停三秒………..
模式二
选取1、2、4、5,三只循环,开两秒停三秒
1、2、4开两秒停三秒,2、4、5开两秒停三秒,4、5、1开两秒停三秒,5、1、2开两秒停三秒。。。。。
用s7200写,怎么写呢?谢谢。求大神。

最佳答案

提供一个思路
 1先判断第一个灯是否选择,是3,否判断下一个灯是否选择,反复执行判断,直到有灯被选择
 

3开灯,延时开灯时间,4
4关灯,延时关灯时间  1


TYPE "light"
VERSION : 0.1
   STRUCT
      select : Bool;
      out : Bool;
      open : Time := T#2s;
      close : Time := T#3s;
   END_STRUCT;

END_TYPE

FUNCTION_BLOCK "块_2"
{ S7_Optimized_Access := ””TRUE”” }
VERSION : 0.1
   VAR 
      step : Int;
      no : Int;
      i : Int;
      count : Int;
      open : Int;
      close : Int;
      start : Bool;
      stop : Bool;
      light : Array[0..10] of "light";
      OpenTime {InstructionName := ””TON_TIME””; LibVersion := ””1.0””} : TON_TIME;
      closeTime {InstructionName := ””TON_TIME””; LibVersion := ””1.0””} : TON_TIME;
   END_VAR


BEGIN
 
 #OpenTime(IN:=#step=3,
           PT:=#light[#no].open);
 
 #closeTime(IN := #step = 4,
            PT := #light[#no].close);
 
 
 
 IF #start THEN  //启动循环
     #start := FALSE;
     #step := 1;
     #no := 1;
 END_IF;
 IF #stop THEN // 停止循环
     #stop := FALSE;
     #step := 0;
     #no := 1;
     FOR #i := 0 TO 10 DO
         #light[#i].out := FALSE;
     END_FOR;
     
 END_IF;
 
 CASE #step OF
     1://判断本次要开的灯
         #i := #no;
         IF #light[#i].select THEN //直接找到本次要开的灯
             #step := 2;//进入开灯流程
         ELSE
             WHILE NOT #light[#i].select DO //找下一个被选择的灯
                 #i := #i + 1;
                 IF #i > 5 THEN
                     EXIT;
                 END_IF;
             END_WHILE;
         END_IF;
         #no := #i;
         IF #no > 5 THEN
             #no := 1;
             #count := #count + 1;
         END_IF;
         IF #count > 1 THEN
             #step := 0;
             #no := 1;
             #count := 0;
         END_IF;
         
     2:
         #count := 0;
         #light[#no].out := true; //开本次灯
         #step := 3;
     3://开启时间判断
         IF #OpenTime.Q THEN
             #light[#no].out := FALSE; //关本次灯
             #step := 4;
         END_IF;
     4:// 关闭时间
         IF #closeTime.Q THEN
             #step := 1;
             #no := #no + 1; //指向下一个灯
         END_IF;
 END_CASE;
 
END_FUNCTION_BLOCK

提问者对于答案的评价:
不是我想要的,还是受教

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc361695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月5日 下午12:00
下一篇 2021年7月5日

相关推荐

  • 200 smart 变量取值问题

    料罐下有称重仪表4-20mA信号,料罐放料是用触摸屏按钮手动的,我需要在放料开始的一刻取一个重量 ,去进行计算放了多少料。如何取这个初始重量? 最佳答案 1、4-20&n…

    SIMATIC S7-200 2021年7月5日
  • 模拟量输入模块

    EM235模拟量输入地址 AIW0的最大数字地址不是32768吗?我用200的仿真软件看,输入最大值是32768啊。不是32000,吗 问题补充:可是我把模拟量的输入调到…

    2019年6月10日
  • 误将s7USB删除了怎么办?

    在与s7-200通讯时,由于通讯不上,而将s7USB给误删了,如何恢复? 问题补充:注:是与pc机通过编程电缆通讯 图片说明:       …

    2017年7月25日
  • 如何用USB网卡连接S7-200 smart PLC

    由于本人新购一台没有网络接口的超极本,所以另购一个USB3.0的网卡。但在与S7-200smart以及Smart1000触摸屏的通讯过程中,一个无法建立连接,一个查找不到PLC,不…

    SIMATIC S7-200 2017年6月24日
  • 用Scale_I_to_R这个库做一个控制水温的程序,发现用比较指令不会做,求教。

    用了比较指令后,上面的VD200跟下面的VD200在监控情况下数据会不一样,而且相差太大。(有图) 最佳答案 没有见到图。注意数据格式和上面的VD200跟下面的VD200是否有经过…

    SIMATIC S7-200 2017年6月1日
  • 200编程软件英文界面的应用问题

    使用STEP7 Micro/Win v4.0 SP6中文界面编写程序,完成后保存下载到CPU224CN RELA V2.01中,然…

    SIMATIC S7-200 2021年7月5日
  • S7-200与触摸屏通信1

    请问大家,S7-200与3个西门子触摸屏能通信吗,要走什么协议,如果屏和PLC的距离有200米能通信上吗? 最佳答案 触摸屏的型号是?1、如果屏支持以太网,那就在PLC上加一个通讯…

    SIMATIC S7-200 2017年5月29日
  • PLC 罗茨泵

    您好!      我是PLC新手。有这样一个实验:用PLC控制罗茨泵对炉内抽真空。   &…

    SIMATIC S7-200 2021年7月5日
  • MicroWIN V4.0 SP9老安装不上,是什么原因?

    老提示这段话,以前装过。重装系统后,就装不上了。 问题补充:在添加删除里,也找不到可以删除的东西?难道是要在注册表里删?具体用什么软件,删哪条? 最佳答案 参考:《如何卸载中止安装…

    SIMATIC S7-200 2018年12月5日
  • 关于200联网的问题

    小弟刚上班接触PLC,下载有这么一个问题请教大神们原来公司100多个西门子200PLC通过modbus协议、无线DTU方式传到调度室组态王软件,现在有几个站点由于在地下没信号,必须…

    SIMATIC S7-200 2017年11月12日

发表回复

登录后才能评论