至此,我们已经学习了各种数据传送处理的指令,在用户程序项目中,数据传送是最经常用到的,针对不同的数据类型,选用不同的数据传送指令是颇为讲究的。在所有的控制代码实施执行之前,针对某些数据的预处理工作,通常跟控制对象的控制过程有关,跟现场的设备初始状态有关,跟要执行的初始动作有关。
一般数据传送完成的目的是:
●外部数据与内部标签的关联;
●为例程执行代码提供初始数据;
●清除数据的残留状态。
在控制代码执行之前,将所有的外部输入数据映像给具有设备名称的描述性内部标签,这些内部标签也许是独立操作数标签,也许是针对某个控制对象的用户自定义结构数据的子元素,在例程的执行代码中被引用。映像不但将内外数据关系挂接起来,同时给将要执行的控制代码提供了稳定的数据,消除了例程扫描与I/O刷新不同步的隐患。所谓映像就是令这些数据保持一致,用数据传送指令来实现。
有的例程执行代码需要一个初始值,这个初始值可能为0,也可能是一个指定的数值,有时甚至是一个组态数据块的数据设定。在用户项目中,常常可以见到一个称为初始化的例程,初始化例程是由用户编制的,将项目中所有的初始化处理集中在一个例程中,用特定的关键字S∶FS作为梯级条件来调用初始化例程。S∶FS只有在例程第一次扫描时置位,之后便处于复位状态,初始化例程被调用一次之后不再执行。
初始化例程中往往含有清零的操作,这是为整个项目运行做好准备,将过去运行的残留情况统统清除。但是在控制器运行期间,有时也需要清除残留状态,特别是当例程的调用从一个状态切换到另一个状态时,刚刚运行过的数据会残留在不确定状态,尤其是像指针一类的数据,更是影响到操作进程,所以在进入一个新的工作状态时,为确保执行的严谨和精准,一定要清除残留状态。
不管数据传送的目的是什么,不同的数据类型要采用不同的数据传送指令来执行,通常来说,数据传送要处理的对象是:
●位的传递或转换;
●字的传递或转换;
●结构数据的传递或转换;
●数组的传递或转换;
●结构数组中的某个子元素的抽取并集合。
现在,我们归纳在三种数据传送目的的情形下,针对不同的数据类型使用不同数据传送指令编写的梯级逻辑。
关联外部数据与内部数据的映像执行的梯级逻辑如图9-15所示。这些梯级逻辑通常被编写在任务中最先执行的例程里,为后续例程梯级扫描提供稳定的数据,位地址用非保持型的位指令映像;字地址用MOV指令映像;结构数据用COP指令映像,Consume标签则要考虑新旧数据混杂的风险,采用同步复制指令CPS,避免外部数据刷新会中断复制过程。
数据初始化执行的梯级逻辑如图9-16所示。这些梯级逻辑通常被编写在初始化例程中,只在最初一次扫描时调用,位地址用解锁位指令复位;字地址用清除指令CLR复位;数组用充填指令FLL复位或者设置;结构数据子元素用FAL指令抽取并充0复位,控制结构数据指针POS和计数器累加值ACC均给予充0清除。(www.xing528.com)
初始化除了清除残余状态,还可以设定一些初始值,特别是一些组态数据块中的数据,应避免在数据表中直接设置,如果在初始化中用梯级逻辑直接进行设置,一旦出现组态数据混乱,重启运行便可得到解决,是值得推荐的做法。梯级逻辑如图9-17和图9-18所示。
如图9-19所示是初始化例程的调用梯级,首次扫描梯级条件成立,一次性调用初始化例程,所以初始化例程中的梯级几乎都是无条件的,它们只有执行一次的机会。
图9-15 关联外部数据与内部数据映像的梯级逻辑
图9-16 数据初始化的梯级逻辑
除了在特定的例程中对数据进行设定和清除,在某些进程的调用中,同样也需要清除原来的残留状态。如图9-20所示是抽取出来的各个嵌入普通例程梯级逻辑中的设置,同样也是用数据传送指令来实现的,MOV一个立即数1给Buffer_Shift,位移数组获得最初的一个置位状态;FLL一个立即数1给数组Setp_SFC,让每个SFC流程的步都回到初始步;当外部修改的指针到达,判断POS大于等于操作上限时,清除指针回到起始值0。
图9-17 初始值设定的梯级逻辑
图9-18 初始值设定的梯级逻辑
图9-19 初始化例程的调用梯级
图9-20 各个嵌入普通例程梯级逻辑中的设置
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。