长治西门子PLC代理商
生产设备常常要求具有上下、左右、前后等正反方向的运动,这就要求电动机能正反向工作,对于交流感应电动机,一般借助接触器改变定子绕组相序来实现。常规继电控制线路如下图所示。
在该控制线路中,KM1 为正转交流接触器,KM2 为反转交流接触器,SB1 为停止按钮、SB2 为正转控制按钮,SB3为反转控制按钮。KM1、KM2 常闭触点相互闭锁,当按下SB2 正转按钮时,KM1 得电,电机正转;KM1的常闭触点断开反转控制回路,此时当按下反转按钮,电机运行方式不变;若要电机反转,必须按下SB1停止按钮,正转交流接触器失电,电机停止,再按下反转按钮,电机反转。若要电机正转,也必须先停下来,再来改变运行方式。这样的控制线路的好处在于避免误操作等引起的电源短路故障。
PLC 控制电机正反转I/O分配及硬件接线
1、接线:按照控制线路的要求,将正转按纽、反转按纽和停止按纽接入PLC 的输入端,将正转继电器和反转继电器接入PLC的输出端。注意正转、反转控制继电器必须有互锁。
2、编程和下载:在个人计算机运行编程软件STEP 7 Micro-WIN4.0,对电机正反转控制程序的I/O及存储器进行分配和符号表的编辑,实现电机正反转控制程序的编制,并通过编程电缆传送到PLC 中。在STEP 7Micro-WIN4.0中,单击“查看”视图中的“符号表”,弹出图所示窗口,在符号栏中输入符号名称,中英文都可以,在地址栏中输入寄存器地址。
3、图符号表定义完符号地址后,在程序块中的主程序内输入如下图程序。注意当菜单“察看”中“√符号寻址”选项选中时,输入地址,程序中自动出现的是符号编址。若选中“查看”菜单的“符号信息表”选项,每一个网络中都有程序中相关符号信息。
4、程序监控与调试:通过个人计算机运行编程软件STEP 7Micro-WIN4.0,在软件中应用程序监控功能和状态监视功能,监测PLC中的各按纽的输入状态和继电器的输出状态。
5、电机的正反转控制项目结果分析表:注意在硬件接线中必须实现互锁!在PLC的梯形图中也应实现互锁。试分析仅在梯形图中实现的互锁能否真正避免电源的短路?
有电机的正反转控制项目的基础,可以用西门子S7-200实现小车往返的自动控制。控制过程为:按下启动按钮,小车从左边往右边(右边往左边运动)当运动到右边(左边)碰到右边(左边)的行程开关后小车自动做返回运动,当碰到另一边的行程开关后又做返回运动。如此的往返运动,直到当按下停车按钮后小车停止运动。
设计思路:可以按照电气接线图中的思路来进行编写程序。即可以利用下一个状态来封闭前一个状态。使其两个线圈不会动作。把行程开关作为一个状态的转换条件。电气接线图如下:
进行程序的编写,要进行 I/O口的分配。根据要求,I/O口的分配如下表所示。
I/O口分配好后可以根据上面的电气接线图进行程序的编写。参考程序如下:
在S7-200编程中,子程序想必大家都用过,使用子程序可以更好地组织程序结构,便于阅读和调试,也可以缩短程序代码。使用子程序也有一些需要注意的地方,除了子程序在同一周期内被多次调用时,不能使用上升沿、下降沿、定时器和计数器之外,还有子程序中局部变量的特点,在编程多次调用带参数子程序时要特别注意。下面就是前些天热线上遇到的一个Case,非常有代表性,在这里跟大家分享。
E:西门子技术支持。
C:我想问下,200子程序是不是多次调用时会不好使?
E:不会啊,您是不是在子程序里使用了沿指令或者定时器?
C:没有啊,我就编了一句很简单的开关程序,开关闭合,线圈导通,主程序里调用了两次这个子程序,结果个I点闭合了,两个Q点都导通了。
E:(心里活动:看来是和子程序的局部变量有关了,估计客户程序逻辑有问题)那请您描述一下您的子程序吧,我帮您看看。
于是客户描述了一下自己的程序,大致了解了之后告知客户我这边测试下,稍后回复。
客户的程序是这样的:
子程序:是个常见的自保持逻辑,接口参数如红框所示。
图. 01
主程序:调用了两次上面的子程序,实现I0.0和I0.1控制Q0.0的闭合和断开,I0.2和I0.3控制Q0.1的闭合和断开。
图. 02
那么在线测试下程序执行情况,发现果然如客户所描述的,I0.0为1后,Q0.0和Q0.1都为1了。见下图.03所示。而如果闭合I0.2,则Q0.0和Q0.1都断开。
图. 03
为什么会这样呢?我们先明确子程序局部变量的特点。局部变量的变量类型分为四种:IN,IN_OUT,OUT和TEMP,局部变量存储区是在子程序调用时开辟的,子程序调用完成,局部变量占用的存储空间释放。
我们来分析下客户的子程序。
在主程序次调用子程序时,如果I0.0为1,I0.1为0,它们将自身值分别传给输入局部变量#AA和#BB,子程序中程序逻辑执行如下图.04所示。此时局部变量#CC值为1,子程序完成,#CC将值传送到输出参数Q0.0上,使其置1。根据局部变量的特点,子程序次调用完成后,局部变量存储区释放。
图.04
那么当主程序第二次调用该子程序时,开辟临时存储空间,此时的存储空间与次调用时开辟的不一定一致。可是,也有可能由于程序简单,仍然使用次调用时占用的存储空间。如果这种情况发生了,那么次调用时已经将#CC的L0.2置了1,而此值依旧存在,那么第二次调用时输入参数I0.2和I0.3为0,#CC(L0.2)为1,由于客户的子程序逻辑有自保持部分,后L0.2的逻辑结果仍然是1。子程序完成后,#CC将值传送到输出参数Q0.1上,使其置1。就会出现客户反映的那种问题。
那么该如何避免这种情况呢?
大家是否还记得刚刚介绍局部变量参数类型时除了IN,OUT类型外,还有一种类型叫IN_OUT,这种类型的参数是先读入,再写出,这里我们就可以利用它的特点解决上面的问题。
下面对子程序的参数进行修改,将原先的#CC变量类型改为IN_OUT。如下图所示:
图.05
主程序结构不变,如下所示,可以看到由于#CC的类型是IN-OUT,它在子程序块的接口位置也转到了左侧输入侧。
图.06
下面将I0.0置1,其他输入都为0,监控程序状态,如图.07所示,可以看到只有Q0.0为1,Q0.1状态为0。而如果将I0.1置1,Q0.0被复位,Q0.1还是0,这样就符合客户的控制要求了。
图.07
同样,如果只给I0.2置1,那么也只有Q0.1会亮,不会再影响Q0.0。
了解了IN_OUT类型变量的特点,就不难分析以上的结果。因为每次调用子程序时,局部变量#CC都会先去读取输入参数Q0.0或Q0.1的状态,两次调用子程序时,#CC变量使用的同一区域,该区域的值也会在开始被Q点的状态所修改,就不存在两次调用相互影响的情况了。
如果在子程序一开始就添加一条指令,对局部变量#CC进行赋初值(如图.08),也可以避免临时变量区数值不定的问题,您可以尝试测试下。
图.08
在编写200子程序时要特别注意局部变量的特点,一旦出现多次调用不正常的情况,就可以从局部变量的特点出发分析,看看是不是存在隐患。善加利用IN_OUT变量也许可以解决许多问题