首页 理论教育 位域传送BTD指令和字节交换指令SWPB的编程实践

位域传送BTD指令和字节交换指令SWPB的编程实践

时间:2026-01-26 理论教育 小霍霍 版权反馈
【摘要】:编写4条BTD指令来分别完成4个字节的顺序改变,即一个双整字的处理,用来实现图8-18中的传送。考虑到这是跳转的循环操作,BTD指令前面无须设置梯级条件。如图8-19所示的梯级逻辑执行结果,改变了字节的顺序,如图8-21所示,摘取了被操作数组的前3个双整字,对比BTD指令执行前后的数据存在状态。

以上的传送都是数据单元的传送,不管是字对字的传送,数组对数组的传送,抑或结构数据对结构数据的传送,在传送的时候,每个元素都是毫无选择地位对位地进行传递,如果字与字之间需要错位传送就不得不使用位域传送指令BTD了。在某些情况下,这可能是最好的解决方案。

BTD指令是选取一段位域传送到一段指定的位域,位域的传送可以是字内的传送,也可以是字与字之间的传送,传送源和传送目标不得跨越字的范围。

当BTD指令的执行将一段位域的位置从一个字搬到同一个字或另一个字的位置,指令参数的源字和目标字为同一标签名将完成字内传送;源字和目标字为不同标签名将完成字间传送。被操作位域的长度要适合目标字的放置空间,如果目标字空间不够,将造成前端位域数据的丢失,溢出的位是不会转移到下一个字的。

如图8-16所示的指令参数键入所表示的是,在梯级条件成立时,指令执行将源字Dint-Source_BTD从03位起始的10个位传送到目标字DintDest_BTD从05位起始的范围,这是一个字间传送的例子,如图8-17所示。

图示

图8-16 字间的位域传送

图示

图8-17 字间传送示意图

这里提到的字实际上指的是基本数据单元,不同时期的控制器产品,数据处理的基本单元是不同的,这取决于CPU的处理芯片,最早期的PLC,处理芯片是8位,后来发展到16位,现在我们使用的Logix控制器CPU芯片处理的是32位。32位理所应当地成为基本数据处理单元,这些都是我们要关注的,这就是为什么我们前面编程一直强调要使用DINT和REAL数据类型,只有直截了当的使用基本数据单元,才是最节省计算机资源的,不论是时间还是空间。

但是对于通信而言,基本传递单位却是字节,所以在建立通信数据时需识别字节的放置关系。说起来很有趣,欧洲产品的习惯在字节传送到达时,按照从低字节到高字节的顺序排列来放置;北美产品的习惯在字节传送到达时,按照从高字节到低字节的顺序排列来放置。不幸的是,这种放置顺序在产品技术手册中并不常出现或没有特别强调,当这两种不同习惯的产品相遇,现场调试的工程师们便大受其害,连呼上当。所以无论使用哪家公司的产品,一定要留意这点,当数据传送出现谬误时,首先应当想到可能是字节的顺序出了问题。如果凑巧找不到资料,最好的办法就是测试一下。

不管是使用Logix控制器作为信息发送者要与第三方设备通信需要满足排列顺序的规则,或是Logix控制器从第三方设备接收到的字节顺序不符合Logix控制器数据的排列顺序,字节排列顺序的重新安排都必不可少,编写梯级逻辑来改变字节或字的排列顺序的工作就责无旁贷了。

假定我们要不断地传送一个双整字DINT的数组的处理结果到一台第三方外部设备,并要求将每个双整字的字节顺序颠倒了传送出去。

如图8-18所示,将源字的最低字节传送到目标字的最高字节;源字的次低字节传送到目标字的次高字节;源字的次高字节传送到目标字的次低字节;源字的最高字节传送到目标字的最低字节。注意到,这里所说的一个双整字右边是低字节,左边是高字节。

图示

图 8-18

假定我们需要处理的数据块有40个双整字,我们将编写梯级逻辑为40个双整字转换字节的顺序,采用循环40次执行的办法来完成。这可能是比较麻烦的处理方式,编写的梯级逻辑如图8-19所示。

编写4条BTD指令来分别完成4个字节的顺序改变,即一个双整字的处理,用来实现图8-18中的传送。请注意指令参数源字和目标字的每个起始位都在字节的起始位,这是字节的位置调整。考虑到这是跳转的循环操作,BTD指令前面无须设置梯级条件。BTD指令的处理对象是数组元素号所指向的字,数组元素号采用间接寻址的方式,利用指针加1的修改来实现,随着指针的增加元素号偏移,从0开始到39结束,40个元素的数组每个元素字逐一被处理。

一个双整字处理完毕,对循环的指针Position_BTD加1,进入下一个循环,处理下一个元素字。每次进入循环之前,要经过比较判定决定是否跳回到前面继续循环,直到指针为40时,表示该数据块处理完毕,不再跳回前面的梯级。这里要注意,判断条件是小于40,也就是0~39都会跳回前级处理,待第39字处理完毕,指针加1为40,不再满足循环的条件,离开跳转循环。

离开跳转循环后,程序扫描下一个梯级,进行最后的数据块传送处理。此时等于指令EQU(也可使用大于等于指令GEQ)的Position_BTD=40的判断能够满足梯级条件,将处理缓冲区数组的数据COP给目标数组,然后清零指针Position_BTD,准备下一轮的处理。如果没有清除指针,非但不能进行下一轮的处理,控制器还将报错,并呈现故障状态,停止运行。

显然循环指针同时也是间接寻址的元素号,每个40个字长的双整字数据块的处理都是从0元素开始的,不但在每个循环结束的时候需要对指针清零,在程序的初始化例程中,也要编写清除指针的操作,如图8-20所示。因为我们不能确定上一次程序停止运行时,指针是否在0的位置,当第一个BTD指令的梯级开始被扫描时,双整字数据块必须从0元素开始处理。

这里我们讨论一下,为什么顺序改换的中间处理结果要暂存在缓冲区ArrayTo_Buffer数组,待所有的处理全部完成之后再复制给目标数组。因为在执行数据顺序交换处理的梯形逻辑的时候,如果逻辑扫描被中断,正在处理的数据必然是残缺的,也许影响使用,在使用条件苛刻复杂的地方,有时甚至连COP指令的执行都有可能被中断,这时就强调要使用同步复制指令CPS了。

图示(https://www.xing528.com)

图8-19 改变字节顺序的循环操作

图示

图8-19 改变字节顺序的循环操作(续)

图示

图8-20 清除指针的操作

将正在处理的一批数据,尤其是关系紧密的数据,暂时存放在缓冲区,等待处理结束后再复制给目标数据,之后的任何执行代码的数据引用只使用目标数据,这也是编程的良好习惯之一,可以帮助你避过数据新旧混杂的陷阱,否则你将看到程序运行结果是不可预料的。

如图8-19所示的梯级逻辑执行结果,改变了字节的顺序,如图8-21所示,摘取了被操作数组的前3个双整字,对比BTD指令执行前后的数据存在状态。

以上是早期的字节换序的解决方案,第二代PLC产品不得不利用BTD指令来解决字节换序的问题,需要编出不止一条梯级来完成,Logix控制器则增加了一条指令专用来做此事,那就是SWPB指令,即字节交换指令,该指令有一个参数为Order Mode的选项,可确定三种交换形式:

●选项:REVERSE颠倒顺序,如ABCD转为DCBA;

●选项:WORD字交换,即单整字的交换,如ABCD转为CDAB;

●选项:HIGH/LOW单整字的高低字节交换,如ABCD转为BADC。

一般来说,现场设备使用单整字的情况比较多,所以字节顺序更改还有针对单整字的,这三种交换形式,足以处理字节换序的各种情况。

编程时指令参数键入的三种情形如图8-22所示。这里为了表示清楚,特地将DINT_Byte、Result_Reverse、Result_Word、Result_HighLow的数据标签选用ASCII码数据表达形式。

图示

图8-21 BTD指令执行前后的数据对比

图示

图8-22 字节换序的三种情形

刚才的字节换序的需求实例就可以通过简单地编写SWPB指令解决了,梯级逻辑编写如图8-23所示。

仅1条SWPB指令就代替了需要4条BTD指令才能完成的工作,并且清楚明了了字节顺序的安排。这里,我们又一次见证了实际需求转为系统指令功能,无须编程技巧而使用指令功能直接实现。这并不能说明BTD指令就没有意义了,就字节顺序调整而言,SWPB指令可以代替BTD指令,BTD指令仍可用来完成不按字节调整的位域变化。

图示

图8-23 使用字节交换指令的梯级逻辑

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈