第16课 · 数据搬家(传送家族)

信捷指令讲堂 · 6 段 · 共 3:00 · 正文 930 字 · 完全免费

前面算出来的数怎么送出去?这节课把 MOV 和它的兄弟们一次讲清。学会这一族,后面所有"传参数"的活都是它。

完整课程 · 智慧屏 + 数字人讲师加载较慢?先看下面的图文
正在加载数字人讲师 …
首次打开约需 30~60 秒(3D 模型较大,只在电脑上加载)
加载期间可以先往下看图文讲解
这台设备暂时跑不了完整课程需要支持 WebGL 的浏览器(多数电脑浏览器都支持)
下面是同一节课的图文讲解 + 音频,内容完全一样

📱 手机上看不到完整课程(数字人讲师需要电脑浏览器的 3D 支持)。下面是这节课的图文讲解 + 音频,内容完全一样,手机上也能完整学完。想体验完整课程,用电脑打开这一页即可。
仍然在手机上试试完整课程

1/6

本节要做什么:传送不是只有一条 MOV

0:29

传送:原样搬一份

  • 十来条名字长得像,分工其实很清楚
  • 把 D0 的数搬到 D10原样抄一份,一个格子对一个格子
  • 改成 250源头一变,目标跟着变
  • 数据不变化条件断开是保持原样,不是清成零
数据搬家(传送家族) · 本节要做什么:传送不是只有一条 MOV 梯形图 传送:原样搬一份

传送:原样搬一份

前面十几课,数据都是算出来的。这一节讲怎么把它搬走。传送家族的指令有十来条,名字长得像,分工其实很清楚。先看最基本的一条:把 D0 的数搬到 D10,D0 是多少,D10 就是多少,原样抄一份。现在把源头改成 250,目标跟着变 250。手册还特意提醒一句,条件断开的时候数据不变化,是保持原样,不是清成零。

2/6

块搬:一次搬一摞,一个萝卜一个坑

0:28

块搬:一摞整体搬过去

  • 一次搬一摞BMOV 把一片软元件整体搬过去
  • 一个萝卜一个坑四个各不相同的数,搬过去各自对上号
  • 改成 77只有第一格跟着变,后面三格不动
  • 点数写几就搬几格源和目标一一对应
数据搬家(传送家族) · 块搬:一次搬一摞,一个萝卜一个坑 梯形图 块搬:一摞整体搬过去

块搬:一摞整体搬过去

一条一条搬太慢,所以有块传送:BMOV,一次搬一摞。图上这条把 D0 开头的四个格子,整体搬到 D10 开头。注意看过程:源头是四个各不相同的数,搬过去以后各自对上号,一个萝卜一个坑。现在把源头的第一个数改成 77,只有目标的第一格跟着变,后面三格还是原来的数,点数写几就搬几格,源和目标一一对应。

3/6

铺开:一个数复制一片(最容易跟块搬混的一条)

0:32

铺开:一个数复制四格

  • 只差一个字母FMOV 与 BMOV 名字只差一字母,源也一模一样
  • 四格全是一模一样的十一它只认源的那一个值,复制几份铺开
  • 四个格子一起变这正是与上一帧最大的区别
  • 别弄反搬一摞不同的数用 BMOV,铺满一片用 FMOV
数据搬家(传送家族) · 铺开:一个数复制一片(最容易跟块搬混的一条) 梯形图 铺开:一个数复制四格

铺开:一个数复制四格

接下来这条最容易跟块传送混,因为名字只差一个字母:FMOV,多点重复传送。它跟刚才那一条,程序里只有一个字母不一样,源头的数也完全一样。可是结果差得远:它只认源的那一个值,然后复制几份铺开,目标四格全是一模一样的十一。再把源头改成 77,这回是四个格子一起变。要搬一摞不同的数用 BMOV,要把一个数铺满一片用 FMOV,别弄反。

4/6

批量:一片全置上、一片全清掉

0:30

批量:一片置上、一片清零

  • 按一下 X0MSET 一次把 M10 到 M13 全部置上
  • 区间外的两位不动它只碰区间内,区间外一个都不动
  • 起点和终点不是起点和个数 —— 写法跟块传送不一样
  • 初始化数据区按一下 X1,ZRST 把这一片全清零
数据搬家(传送家族) · 批量:一片全置上、一片全清掉 梯形图 批量:一片置上、一片清零

批量:一片置上、一片清零

前面几条搬的都是数据,位元件也能整片操作。按一下 X0,MSET 一次把 M10 到 M13 全部置上,只碰这个区间,区间外的两位不动。这里要留意,它的两个参数是起点和终点,不是起点和个数,写法跟块传送不一样。按一下 X1,ZRST 把 D20 到 D29 这一片数据全部清零,程序开头初始化数据区经常用它。

5/6

就地调头:一个寄存器内部换高低字节

0:29

高低字节:一个寄存器内部对调

  • 调个个儿高八位与低八位换位置
  • 就地改自己指令里只写一个软元件,不往外送
  • 3053618551 换完变成 30536
  • 再按一下又换回来边沿触发,按一下换一次
数据搬家(传送家族) · 就地调头:一个寄存器内部换高低字节 梯形图 高低字节:一个寄存器内部对调

高低字节:一个寄存器内部对调

换一个方向的问题:一个十六位寄存器里装着高八位和低八位两组数据,想把它俩调个个儿。SWAP 就是干这个的,指令里只写一个软元件,它就地改自己,不往外送。手册举的例子很好记:原来的数是 18551,换完变成 30536。要留意它是边沿触发的,现场都配上升沿的触点,按一下换一次,再按一下又换回来。

6/6

两个对调:XCH 与 SWAP 的分界 + 本课收尾

0:33

两个寄存器整体对调

  • 整体对调XCH 把两个寄存器的内容互换
  • 数变了SWAP 是寄存器内部换高低字节,值变了
  • 挪了地方XCH 各家的数一个都没变,只是换了位置
  • 都见过了块搬、铺开、批量、交换
数据搬家(传送家族) · 两个对调:XCH 与 SWAP 的分界 + 本课收尾 梯形图 两个寄存器整体对调

两个寄存器整体对调

最后一条 XCH,是把两个寄存器的内容整体对调。它跟刚才的 SWAP 名字很像,做的事情完全不一样:SWAP 是在一个寄存器内部换高低字节,数变了;XCH 是在两个寄存器之间换位置,各家原来的数一个都没变,只是挪了地方。图上按一下,一百和二百换了个位置,再按一下又换回来。传送家族到这里,块搬、铺开、批量、交换就都见过了。

想亲手试一下?

这门课的电路,已经给你摆好了。不用装软件,点开就能按按钮、看线圈亮。