循环运行

有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日

相关推荐

  • 请问四层电梯的PLC程序是不是比三层的复杂很多啊?

    那如果要是三十或四十层的电梯,用PLC的话,那工作量不是相当的大啊?可能需要几个编程人员才能完成吧? 最佳答案 1、用PLC的话,那工作量不是相当的大啊?可能需要几个编程人员才能完…

    SIMATIC S7-200 2020年10月31日
  • 自由口与多个仪表通信的问题

    用自由口与多个仪表进行通信 SMB87设置为2#10110100 通过定时用一个XMT对仪表进行轮询,利用发送完成中断来进行接收,在执行XMT前对SM87.7进…

    SIMATIC S7-200 2021年7月4日
  • PID向导控制设定

    我想用PID控制制高温房加热,假如温度传感器的测温范围为-20至400度,输出4-20mA电流,工作温度要求在120正负5度之间。 那么我在回路给定值标定里,底限和高限应…

    SIMATIC S7-200 2021年7月4日
  • S7200与扫描枪如何通讯

    请问:S7200与扫描枪通讯程序如何编写(型号为美国产IT3800),具体是这样的,用扫描枪扫描四种不同的条码,每一种产品对应一个条码,四种条码对应PLC四个输出信号,操作工可以判…

    SIMATIC S7-200 2021年7月5日
  • 定时中断的SMB34,SMB35的问题?

    程序中利用了2个定时中断,分别处理2个中断程序,也分别调用了SMB34,SMB35,但是又准备加个PID的程序,但是PID指令中也会使用SMB34定时中断(配置PID中有说明),这…

    SIMATIC S7-200 2020年11月5日
  • s7-200 300 伺服 运动控制

    我要做一个类似火焰切割机的设备(2轴伺服 在电脑设计图形,设备按照轨迹切出图形实物)1.哪个型号PLC可以做到?2.用什么软件生成NC代码? 最佳答案 200-CPU26…

    SIMATIC S7-200 2017年10月24日
  • 为何笔记本原装RS232-PPI电缆连接不上S7200

    点击双击刷新  就看到电缆的指示灯TX和RX灯闪了几下PPI灯不亮  然后就通信超时接口是pc/ppi cable CO…

    SIMATIC S7-200 2021年7月5日
  • 用高速计数器怎样设定长度”

    用高速计数器怎样设定长度”我用一个编码器安装在电机的轴上。;输入值用毫米作单位。怎样精确计算它的长度 最佳答案 这个必须知道电机旋转一圈对应的机械位移为多少.比如一圈位移为1米,使…

    SIMATIC S7-200 2021年7月4日
  • 关于西门子s7200,226CN,远程监控现场数据问题

    西门子s7200,226CN已用一个端口,想用另一个作为通信端口,怎么走modbus通信,现在模块已扩到最大无法再加模块,还怎么实现通信,需要加什么转换器,要用什么线作为通信线 问…

    SIMATIC S7-200 2017年8月18日
  • S7-200的AI模块的地址问题

    主机用S7-200 CPU226,前面用了4个EM231的AI模块,最后一个是EM235模块,排到EM235的AI四个点的地址是AIW32,AIW34,AIW36,AIW…

    SIMATIC S7-200 2021年7月5日

发表回复

登录后才能评论