全国服务热线 15221406036

西门子模块6ES7231-0HC22-0XA8

发布:2023-03-21 16:47,更新:2024-05-08 07:10

西门子模块6ES7231-0HC22-0XA8

plc的上升沿、下降沿检测指令的功能需要至少两个扫描循环周期才能完成,即通过比较前后两个扫描周期同一个BOOL变量或RLO(逻辑运算结果)的状态来判断是否是上升沿、下降沿。
    同一级的逻辑块的临时(TEMP)局部数据区是公用的,结束对FB、FC的调用后,它们的临时变量的值可能被别的逻辑块的临时变量覆盖掉。网友youhm的测试验证了这一结论。他说:“如果仅仅调用一个FC,代码放在FC里测试实现了存储的功能,当调用多个FC,并且FC里都使用了临时变量,我在另外一个FC变量里把所有的临时变量都复位为0,这时在个FC里调用的这段代码就不能实现这个功能了,另外也测试了,在OB35里同时使用临时变量也是一样的效果”。
    因此用块的临时变量作上升沿、下降沿检测指令的边沿存储位来保存变量的状态是极其危险的,稍有不慎,可能会出现灾难性的后果。
    网友xiaode说:“好还是不要用(临时变量作边沿存储器位),我以前使用过,造成的后果很严重。后来就学乖啦!”
    边沿存储位虽然允许使用L区(局部数据区),但是请注意,FB的L区包括静态变量和临时变量等,允许用L区并不说明用临时变量作边沿存储位是合理的。
    编程的高境界是在FB、FC中全部使用局部变量,不使用像M这样的全局变量。这样的块不需作任何修改,就可以移植到其他项目。为此可以使用功能块的静态变量来作上升沿、下降沿检测指令的边沿存储位。这样不会出现使用临时变量带来的问题,也解决了块的可移植性问题。
    有个德国人作的符合IEC  61131-3标准的编程软件干脆就把边沿检测指令做成功能块(也可能是IEC 61131-3规定的指令),把使用临时变量作边沿存储位的路彻底堵死了。

 关于plc,我是个初学者,在此对自己前一段时间的学习做个总结,以备后用。由于本人水平有限,本文一定还存在不少错误和不妥之处,敬请大家批评指正。
     本文所有程序,均在Step7Template.mwp中编写,CPU类型选西门子 S7—200系列226 CN。
     先说程序,测低速(每分钟1000转以下) :   LD    I0.0
                                                                         LD    M20.1
                                                                        CTU   C0,+5000    //设定增计数器上限
                                                                        
                                                                        LD    SM0.0
                                                                         A     M20.0
                                                                       TON   T37,+30      //立即接通,延时三秒断开

                                                                        LD    SM0.0
                                                                         O     M20.0#p#分页标题#e#
                                                                         AN    T37
                                                                         =     M20.0         //设定T37定时器复位信号

                                                                        LD    M20.0
                                                                        LD    M20.1
                                                                       CTU   C1,+20     //设定增计数器C1上限

                                                                       LD      C1
                                                                      MOVW  C0,VW200     
                                                                        =     M20.2

                                                                      LD    M20.2

                                                                      =     M20.1       //设定增计数器C1的复位信号
外围电路下面介绍,先讲程序。由I0.0作输入口,T37延时三秒后给C1一个信号,C1计1,然后T37被复位,再延时,3秒后C1计2,…
直到C1计到20。20个三秒就是一分钟 ,期间I0.0口的脉冲信号由C0计数器计数,计满一分钟就把结果移到VW200中。脉冲信号由外围电路得到。
       以上程序能测一千以下的转速,实验时上限是一千四百多吧。由于该程序用的是低速计数器,转速较高时,受PLC时钟周期影响,在一分钟时转速还未记好,C0就被清零,所以会有上限。接下来我们用PLC内部不受时钟周期影响的高速计数器来测高速(一千转以上):
                                                           LD     SM0.1
                                                          CALL   SBR_0               //调用高速计数器初始化子程序
 
                                                          LD     SM0.0
                                                           A      M20.0
                                                          TON   T37,+100           //设定计时器值,延时10秒
                                                      
                                                         LD    SM0.0
                                                          O     M20.0

                                                         AN    T37
                                                          =     M20.0                   //立即接通延时十秒断开

                                                         LD     T37                       
                                                         MOVD   HC0, VD100               //I0.0为高速计数器HC0输入口,计数结果移入VD100
                                                         MOVD   VD100, VD200
                                                         MUL    +6, VD200                  //计数结果乘以6,放入VD200
                                                        LD     T37
                                                        CALL   SBR_0                      //T37计时到,调用高速计数器初始化子程序
 
                                                           SBR_0                              //高速计数器初始化子程序#p#分页标题#e#
                                                    
                                                       LD     SM0.0
                                                       MOVB   16#F8, SMB37                //设置控制位:增计数;已使能;
                                                       MOVD   +0, SMD38                   //装载 CV
                                                       MOVD   +0, SMD42                   //装载 PV
                                                       HDEF   0, 0
                                                       HSC    0
       以上程序测速范围为1000转以上,实验时测得高为2500+,因实验条件有限,上限未知。有人会有疑问:你怎么采用的是测10秒,然后将计数结果乘以6当做一分钟的转速,而不直接测一分钟的转速呢? 因为转速结果后要用数码管显示出来,对观察者来说,10秒以后显示与一分钟后显示相比,前者更好一些。后我们采用的是6乘以10的策略。
      后来说说外围电路吧。外围电路把转速转换成脉冲信号输入PLC,上面两段程序用的都是I0.0口。信号的转换和采集用霍尔传感器,
图片    
接法如图:VCC接24V,GND接电源负极,A接信号输入端I0.0,A端和24V间接电阻。接好后将霍尔元件平的一面朝被测物体固定好,如一个轮子,在轮子面上霍尔对应位置安装霍尔磁体。测速原理:轮子每转一圈,磁体和霍尔元件接触一次(其实是接近),它们接触时带来A端电压的降低,由此给PLC一个脉冲信号。磁体和霍尔之间间距3至5mm。安装时注意磁体的正反面。
      好了,测转速就先说这么多。经过以上这些,测得的数据只是放在PLC的内存里,我们可以在软件里监测PLC运行情况,看到这些数据。是不是有点麻烦,有没有更好的方法能看到这些数据?当然,可以用LED数码管来把数据显示出来


联系方式

  • 地址:上海松江 上海市松江区石湖荡镇塔汇路755弄29号1幢一层A区213室
  • 邮编:201600
  • 联系电话:未提供
  • 经理:聂航
  • 手机:15221406036
  • 微信:15221406036
  • QQ:3064686604
  • Email:3064686604@qq.com