一,先来认识下SFTL(P)指令
SFTL(P):位左移指令,使指定位长度的位软元件每次左移指定的位长度的指令。
移动后,从最低位开始传送n2点长度的S位软元件。
下面是FX3U编程手册中的指令截图:
举个例子好理解:
上面这行程序的意思是,当M0导通后,首先M20为起始地址的K8个M软元件,即M20-M27先往左移动K1位,然后将M10开始的K1位的位状态赋值给M20。
大家最好在编程软件上模拟仿真一下,看看具体是怎么移位和赋值的,比如把K1改成K2试试效果。
二,转盘机构:转盘是由分割器带动旋转的,每旋转一个分度就等于到了一个工位,例如8个分度盘,那么每个工位呈45°均匀分布。每个工位或者部分工位上都有气缸或者其他机构需要对工件进行装配打孔等操作。
要控制好转盘机构,最简单的办法就是同步动作,也就是,转盘每转动一次,所有的工位上的执行机构都动作一遍,等所有工位动作一遍完后,转盘再旋转一个分度,然后所有工位再动作一遍,这样周而复始。虽然这样做不存在什么问题 ,但是有时候却不能这么做,比如,因为没有工件,气缸动作时,会检测不到磁性开关信号,导致动作停滞等。
所以,当工位上没有产品时,相应的执行机构就不需要动作,这样既节省了节拍,又避免了误动作的问题。
三,SFTL(P)的记忆功能
那么如何知道当前工位上是否存在工件呢?
要么在每个工位上装一个传感器,这样每个工位就能知道是否存在工件,当有信号时,执行机构就会动作;反之就直接跳过去,直接输出完成信号。这么做的好处就是程序简单,只看信号的有无动作即可。但是这么做,却要花费大量的传感器,那么有什么办法可以既节省传感器,又可以记住工位上是否存在工件呢?
答案就是使用SFTL(P)。
那么它是如何来记忆呢?
有了第一部分的指令解释,那么我们具体来实际应用并验证一下。
首先我们先看下下面这个转盘机构,它的上面有8个模具,其中0为上料位,1为打孔位,2为上铆钉位,3为空,4为压铆钉位,5为下料位,6为空,7为空。
然后我们将这几个位进行编码,其中上料位是自动上料,此位不需要记忆,因为它需要一直给转盘供料,因此上料位不需要进入编码。另外,虽然里面有空位,但是我们也需要将它一起编码,这样可以保持连续性。当空位出现有料时,因为没有机构,所以空位是没有程序的,因此即使状态位是1也没关系。
下面对1到7个工位进行编码,我们用M21-M27分别表示这7个工位,然后我们就可以写出位左移指令:
SFLTP M20 M21 K7 K1
结合这个转盘机构,我们再看下这条语句的意思:
M20表示的是上料位,上料位装了一个感应开关,当有料来且上到位时,就触发转盘转动一次,且此时M20置位1,当分割器到位信号来要给上升沿时,M20复位0。
M21表示工位1,实际是打孔。
M22表示工位2,实际是上铆钉。
M23表示工位3,空位没有动作机构。
M24表示工位4,实际是压铆钉。
M25表示工位5,实际是下料。
M26表示工位6,空位没有动作机构。
M27表示工位6,空位没有动作机构。
当相应的M软元件置位1时,表示当前工位有料,然后开始执行机构开始动作。
我们再根据指令来分析这条语句的执行过程:
当M0导通时,先将M21-M27的K7个整体往左移动K1位,然后将M20开始的K1位,也就是一个M20,它的当前状态赋值到M21。此时M21-M217的二进制值为1000000。那么此时,除了工位1需要动作外,其他工位还是处于不动状态。
当又上料后,触发M0第二次导通,那么先将1000000左移1位,变成0100000,然后再将M20=1的值,赋值给M21,然后M21-M27变成了1100000,此时工位1和工位2需要动作。
依次类推。你只需要根据相应M软元件的状态来确定是否执行动作,1就动作,0就不动作。
下面的表格有助于大家好好理解:
无动作 | 无动作 | 无动作 | 后面的都移出去了 | |||||||
有料检测 | 打孔 | 上铆钉 | 空 | 压铆 | 下料 | 空 | 空 | |||
步骤 | 上料位 | 工位1 | 工位2 | 工位3 | 工位4 | 工位5 | 工位6 | 工位7 | ||
1 | 人工上料 | 料1 | ||||||||
2 | 转盘转动一次 | 料1 | 0 | 0 | 0 | 0 | 0 | 0 | ||
3 | 人工上料 | 料2 | ||||||||
4 | 转盘转动一次 | 料2 | 料1 | 0 | 0 | 0 | 0 | 0 | ||
5 | 人工上料 | 料3 | ||||||||
6 | 转盘转动一次 | 料3 | 料2 | 料1 | 0 | 0 | 0 | 0 | ||
7 | 人工上料 | 料4 | ||||||||
8 | 转盘转动一次 | 料4 | 料3 | 料2 | 料1 | 0 | 0 | 0 | ||
9 | 人工上料 | 料5 | ||||||||
10 | 转盘转动一次 | 料5 | 料4 | 料3 | 料2 | 料1 | 0 | 0 | ||
11 | 不上料 | 料6 | ||||||||
12 | 转盘转动一次 | 料6 | 料5 | 料4 | 料3 | 料2 | 料1 | 0 | ||
13 | 人工上料 | 料7 | ||||||||
14 | 转盘转动一次 | 料7 | 料6 | 料5 | 料4 | 料3 | 料2 | 料1 | ||
15 | 人工上料 | 料8 | ||||||||
16 | 转盘转动一次 | 料8 | 料7 | 料6 | 料5 | 料4 | 料3 | 料2 | ||
17 | 人工上料 | 料9 | ||||||||
18 | 转盘转动一次 | 料9 | 料8 | 料7 | 料6 | 料5 | 料4 | 料3 | ||
19 | 不上料 | 料10 | ||||||||
20 | 转盘转动一次 | 料10 | 料9 | 料8 | 料7 | 料6 | 料5 | 料4 | ||
21 | 不上料 | 料11 | ||||||||
22 | 转盘转动一次 | 料11 | 料10 | 料9 | 料8 | 料7 | 料6 | 料5 |
经过以上分析,大家是否了解了SFTL(P)指令的记忆功能呢?
四,通过上面的分析,我们可以看到,在刚开始做的时候,由于后面几个工位上是没有料的,此时状态位为0,因此机构不会动作,这样的话,就可以避免因为感应器没感应到而导致停机。
五,在这个基础上,我们还可以给设备做一套清料程序。也就是说,当工人要下班了,那么选择清料功能,此时,不再上料,然后将余下的料做完后再停机。
那么具体如何做呢?
我给个思路,看下面的SFC图
总结:使用SFTL(P)位左移指令时,它是先把原来工件的状态向左移动1位,然后最前面那位填入当前工件的状态,这样每个工位就能知道当前工位上工件的状态了。
另外,位移指令只适合固定工位数量的情况,如果是输送带流水的话,由于上面没有固定工位,并且过来的产品数量也不固定,间距也不固定,因此这种情况只能用WSFL(P)字左移指令配合寻址指针Z0来做,比如:
MOV K1 D0/ MOV K0 D0:检测完成后,将检测结果存到D0中,1表示合格,0表示不合格。
WSFLP D0 D11 K100 K1:将D11开始的K100个D寄存器,也就是D11-D110先左移K1,也就是将D11-D110的当前状态向左移动到D12-D111中,这样就把当前的状态值转存了。注意:这里的K100表示的是,从检测口到下料口之间,传送带上所能容纳的最大产品数量,这个K100一定要比最大产品数量要大!
INC Z0:同时,Z0自增1,用来对产品进行计数,这样就知道检测了多少个产品。
MOV K0 D0:转存之后,当产品离开检测传感器后,就要将D0清零,以便存储下一个产品的状态。
[= D0Z0 K1]/[= D0Z0 K0]:这里是出口处的判断,产品如果是K1,也就是合格,那么就做相应的动作;如果是K0,表示不合格,就对应做相应的动作。
DEC Z0:当产品被分选后,或者剔除后,Z0自减1,这样出口处就可以对后面的那个D0Z0进行判断并分拣了。
最后,本人水平有限,本文有任何不正之处,请大家指正,谢谢!