分享

精解——三菱FROM指令 与 模拟量数据处理的要点!

 叶子的时候回来 2017-12-09

前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里啦~ 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多