我们首先讨论最常见的单一的字对字传输的MOV指令。它的操作对象限于字,可以是短整型字、整型字、双整型字和实数字,也可以是立即数。不管是源字还是目标字,特别提倡使用双整型字和实数字,因为它们是32位的数据单元,恰恰是Logix控制器数据处理的基本单元,是最为节省运行时间和内存空间的选择。同样的道理,在算术逻辑运算章节中已经有过解释,MOV指令也是如此,在指令集的指令参数描述中,你仍然可以看到MOV指令的数据类型也是用黑体字表现了双整型字和实数字,这是推荐使用的数据类型。
MOV指令是不能够直接对结构数据标签操作的,但可以对结构数据标签中的子元素操作,如果这个子元素正好是一个字的话。
相同的数据类型或不同的数据类型之间的数据传送,结果会是怎样的呢?现在我们将双整型字和实数字传送的4种组合编写4条指令,进行对比,如图8-1所示。控制器运行后观察的结果是:
●实数字传送到实数字,不改变;
●双整型字传送到双整型字,不改变;
●双整型字传送到实数字,目标地址实数字,小数部分补零;
●实数字传送到双整型字,目标地址双整型字,小数四舍五入到双整型字。
使用不同类型的数据传送,要注意小数点后面的数据处理,如果这个数正好是用于累积的话,有可能造成累积误差。积累误差的影响对于计算指令来说也会有类似的情况。
很多人编程时不加思索地给予MOV指令无条件梯级,这样可以令源标签和目标标签保持高度一致。如果你的需求源数据和目标数据无须时刻保持一致,建议你编写成梯级条件控制,只有必要时执行MOV指令传送数据,这样可以节约梯级逻辑扫描时间,减少无效或无意义操作,个别MOV操作虽耗时不多,但会积少成多,这是系统优化要注意的细节之一。有的时候不仅仅是节约了梯级扫描时间,甚至可以节约更多的系统资源,比如,在冗余控制系统中,减少数据刷新次数就可大大缩减冗余控制系统用于的冗余数据备份的时间,这可是非常宝贵的系统资源。如图8-2所示是受条件限制的MOV传送。
MOV指令也可以直接将一个立即数传送到目标标签,但要注意到MOV指令所传送的立即数在默认的情况下是一个十进制的数。如果MOV传送的是一个状态的设置字,不妨借助于数据文件的DINT字来换算,先在二进制形式下将状态位设置好,然后转为十进制数,此值即为MOV指令要传送的立即数。当然,如果特别地将立即数书写成十六进制和八进制的形式(16#26或8#46),指令也是接受的,但最好将数据库中目标标签的数据表达式也改为同样的数据形式,这样可以直观地看到传送的结果。通常标签默认的数据形式是十进制形式,数据形式的不一致可能会让你感到困惑。
图8-2 有条件的MOV传送
关于数据表达形式的细节,平时人们不太留意,一旦面对这些问题却往往大惑不解,其实这就是一个计算机数据表达形式的规定而已,当你主观地用某种进制的数据键入时,数据单元的32位寄存器会客观地用0或1状态记录下来,当你换另外一个进制主观地去读,表达形式已经变了,但量值没有改变。如图8-3所示的例子是在十进制的形态下键入45后,分别在八进制、十六进制和二进制下的数据表达形态,读数变了,量值却没有变。
(www.xing528.com)
图8-3 不同进制的数据表达形式
MOV指令的用法是比较灵活的,常见的还有传送一个0到目标标签,达到清零的效果。尽管清零已有专用的指令CLR,它的执行时间更短,清零意义明确,也许是出于习惯,还是有不少人喜欢用MOV指令。我建议对一个字清零最好使用CLR,这符合尽可能使用指令功能的原则,且表意明确,对比如图8-4所示。
图8-4 两条清零指令的对比
最常见的MOV指令的运用,还会出现在初始化的例程里,用于初始化字的传送,为某些标签数据设置初始值或者清零,用立即数传送到目标标签。系统中我们常常需要对某些特定的数据块进行组态设置,如果直接在数据表中进行设置,万一出现扰动改变了数据就可能带来混乱,对于非项目开发人员来说,难以恢复原来的设置。有经验的项目开发人员为了提高系统的可靠性,会将这些要设置的数据用MOV立即数操作,直接将组态数据置入数据单元,通常在控制器的初始化例程中统一设置,这样,一旦出现设置数据混乱的局面,只需重新启动运行便可恢复正常。配合实例运用的数据设置我们将在后面的章节讨论。
屏蔽传送指令MVM主要用于局部地对字进行传送,只能对整型字传送,实数字不能传送。MVM指令是用屏蔽码(可以是立即数或整型数标签)针对位来屏蔽的,一般来说,用于位传送的屏蔽。梯级逻辑编写如图8-5所示。梯级执行的结果是只将源标签的低8位传送到目标标签,目标标签的其他位不受影响,这两条指令分别使用了不同的屏蔽码的表达方式,二进制的屏蔽码较为直观,十六进制的屏蔽码较为简洁。对于按字节的屏蔽,用十六进制的屏蔽码表达会更简单。
图8-5 屏蔽传送的梯级逻辑
屏蔽码最终表现在屏蔽位上,屏蔽位决定数据是否能够传送,每个对应位的关系就像通过与门传递,对应位为1,表示数据可传送通过;对应位为0,数据被屏蔽不能传送,如图8-6所示。不仅仅是屏蔽传送指令MVM的屏蔽码才具有这样的含义,屏蔽码的屏蔽方式同样也适用于其他指令,以后遇到指令中的屏蔽码不再赘述。
图8-6 屏蔽关系图
MVM指令经常会用于I/O模块的数据传送,因为这样的传送可以屏蔽无须传送的点,只对部分相关的点传送状态,避免了干扰和冲突。如图8-7所示就是只传送输入模块的低6位进入缓冲字Buffer_SQI,防止了高位无关数据的干扰。十六进制屏蔽码的译读也很简便,屏蔽码3F一看便知是允许通过低6位。
图8-7 只传送输入模块的低6位进入缓冲字
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。