前2期,我们发表了“完美的模拟量编程详解——三菱FX2N系列”手把手教学文,发现大家有很多疑惑,我认为很有必要好好为大家打点鸡血,巩固下基础!今天依旧熬夜,把这空缺补上!(熬夜伤身,记得多给我们鸡腿补补) 先把上次的教学文里提到的程序贴出来: 所有留言的朋友(部分没精选留言别见怪哈),疑惑都是来自这段小程序。在此,向大家声明,程序肯定没问题,而且很经典,熟悉的朋友应该也知道,三菱PLC手册里就是这样写的(#^.^#)! 要搞懂这段程序,重点就在于FROM指令,今天就来透彻的讲解一番: 此程序来自于手册~ m1:特殊单元号(特殊模块号),0~7个。 m2:缓冲存储区(BFM)号,16位数据。 传送地点:K4M0,16位数据,从M0到M15,刚好把来自m2(缓冲存储区)送来的数据填满。 n:传送点数,k1=16位,k2 =32位。 回到我们的介绍的程序: 这段程序: m1=k0,代表第一个模块号。 m2=k0,代表读取的缓冲存储器(BFM)的编号为0,也就是从BFM#0开始读。 n=k2,需要读取32位数据。 K2M100,8位数据,代表M100到M107,上回推文里,解释的时候写的是M100到M131,其实是想说:需要读取的缓冲存储器数据是32位的,所以用M100~M131来表示,因此产生了歧义。 读到这里,疑惑就来了,为什么从缓冲存储区读来的32位数据,用K2M100来做传送地点? 不是应该写成K8M100吗(K8M100 是32位)?我想说,这就是它经典的所在。 先来看个表: FX2N-2AD 模块的缓冲存储器分配表。 表里可以得出: 模块是12位的数字值,将模拟量转换成数字量后,将数字量存放在两个16位的BFM里,分别是#0,#1。数字量的高位存于#1的第0~第3位,也就是4位; 数字量的低位存于#0的第0~第7位,也就是8位,高低位加起来妥妥的12位,意思就是说这12位数据合伙霸占了32位地址哈。 那么我们关心的是什么呢?是那12位数据!我们要得到的是什么呢?还是那12位数据! 从表中得知,如果想得到这12位数据,并不容易,因为他们不是连续的!PLC使用时,数据的存放都是有空间规则的,例如8位,16位,32位,你的数据必须是在同一个空间里,例如一个数32700,是需要用一个16位的空间(D0或K4M100)来装它,不能30000装D0里,2700装D10里,这样的话,PLC就没法数据处理了(你估计想说,把D0和D10相加不就行了,如果你这么想,你真是too young too simple,为什么?自己想)。 那么如何才能得到连续的12位数据呢,请看下面的程序: m2=k0,从BFM#0开始读,传送地点是:K2M100。 BFM#0,BFM#1两个缓冲存储器的32位数是这样存的: BFM#0------>K2M100; BFM#1------>K2M108; 为什么是这样,如果你把 K2M100看成是D0,你就会理解: BFM#0------>D0; BFM#1------>D1; 也就是连续的两个缓冲存储器数据(BFM#0,BFM#1)存到连续的两个PLC寄存器里了。而D0,D1分别都是16位的,为什么不是用K4M100? 假如是K4M100: BFM#0------>K4M100; BFM#1------>K4M116; 其实原则是没任何问题的,但是你却无法直接取出前面所述的12位转换后的数据,你还需要再编一些传送指令,才能得到它。 这也就是K2M100的经典所在: 最后我们再看看原程序图: 第4步, K4M100=K2M100+K2M108,而12位呢?当然在M100~M111里啦~ |
|