📱 手机上看不到完整课程(数字人讲师需要电脑浏览器的 3D 支持)。下面是这节课的图文讲解 + 音频,内容完全一样,手机上也能完整学完。想体验完整课程,用电脑打开这一页即可。
仍然在手机上试试完整课程
本节要做什么
0:34三个操作数:结果等于 S1 加 S2
- 三个操作数ADD S1 S2 D —— 结果 = S1 + S2
- 减法一样换个符号就是 SUB,120 − 45 = 75
- 改成两百加法得 320,减法得 −80
- 负数合法十六位的数是带符号的,结果可以是负的
加减法:三个操作数
前面几节一直在比大小,这一节开始让 PLC 真的会算数。算术指令长这样:ADD 后面三个操作数 —— 第一个数、第二个数、结果放到哪儿。说白了就是一句话:结果等于第一个数加第二个数。图上一百二十加四十五得一百六十五,落在第三个操作数上。减法完全一样,换个符号,一百二十减四十五得七十五。把第二个数改成两百再看:加法得三百二十,减法得负八十。负数在这儿合法,十六位的数是带符号的。
乘法:结果占两个字
0:38乘法:结果占两个字
- 结果占两个字MUL 的低位放 D,高位放紧跟着的 D+1
- 三百乘三百等于九万,一个字最多装三万二千七百六十七
- 两万四千多那是九万的低位;紧跟着那个是一,就是高位
- 高位变回零改成一百 → 三万,一个字装得下了
乘法:结果占两个字
乘法写成 MUL,操作数还是三个,但它有个特别的地方:两个十六位的数相乘,结果可能就超过十六位了,所以手册规定结果占两个字 —— 低位放在你指定的寄存器,高位放在紧跟着的下一个。图上是三百乘三百等于九万,一个字最多装三万二千七百六十七,装不下。你看结果位置上是两万四千多,那是九万的低位;紧跟着那个寄存器是一,就是高位。记住:乘法结果吃掉两个字。把第二个数改成一百再看,三万装得下了,高位变回零。
除法:商和余数各有一个家
0:32除法:商和余数各有一个家
- 给出两个数商和余数,两个都给你留着
- 商放这儿商放在你指定的那个寄存器
- 余数放下一个余数放在紧跟着的下一个 —— 不是被丢掉
- 二十除以五商是四,余数正好是零
除法:商和余数各有一个家
除法也是三个操作数,但它给出两个数:商和余数。手册写得很清楚,商放在你指定的寄存器,余数放在紧跟着的下一个 —— 跟乘法一样占两个字。图上是十七除以五,商是三,余数是二,两个数都给你留着,不用自己再算一遍。做平均、做分摊的时候这一点特别有用:余数不是被丢掉的,它就摆在余数位上。把被除数改成二十,二十除以五,商是四,余数正好是零。
坑:除数为零,结果停在旧值
0:32坑:除数为零,结果停在旧值
- 它就是零了除数是人数、是计数 —— 都可能变成零
- 不能执行手册原话:发生运算错误,这条指令不能执行
- 还停在二十不是算出个零,是上一轮那个数还在
- 灯还亮着下游照着旧值判断 —— 看着正常,数已不对
坑:除数为零,结果停在旧值
这里有个坑,现场真能碰到。假设除数是当班人数,某一天没人上班,它就是零了。除数为零的时候手册写得很明白:发生运算错误,这条指令不能执行。注意,是不能执行,不是算出一个零来 —— 结果寄存器里还是上一轮算出来的那个数。图上就是这样:除数改成零以后,结果还停在二十,下面那句判断照着二十去比,灯还亮着。看着一切正常,其实这个数早就不是这一轮的了。
正解:先判除数,再算
0:32正解:先判除数,再算
- 先看一眼除数比较触点把关:不等于零才做除法
- 清成零除数等于零 → 结果清成零,别留旧数
- 报警灯灭着除数正常 → 结果照常算出来
- 报警灯亮除数为零 → 除法被拦住、结果清零、灯亮
正解:先判除数,再算
怎么办?算之前先看一眼除数。前面讲过的比较触点正好用上:除数不等于零,才让它去做除法;另外再接一条,除数等于零,就把结果清成零,同时点亮一盏报警灯。这样一切都清楚了:除数正常的时候结果照常算出来,报警灯灭着;一旦除数变成零,除法被拦住、结果清零、报警灯亮。现场看到这盏灯,第一件事就是去查除数为什么是零,而不是拿着旧数继续往下算。
收尾:装不下会绕回负数
0:34装不下会绕回负数
- 最多装三万二千七百六十七十六位的老问题,超了就绕回负数
- 绕回去了三万加三万得六万 → 结果变成负的
- 进位标志手册专门有这一栏,溢出时自己置一
- 改成两千三万两千装得下 → 灯灭;更大的数用双字
装不下会绕回负数
最后说一个十六位的老问题:它最多装三万二千七百六十七。图上是三万加三万,得六万,装不下,结果就绕回去了,变成一个负数。这时候进位标志会自己置一,手册里专门有这一栏,叫进位。我们把这个标志接到一盏报警灯上,数一溢出,灯就亮。把第二个数改成两千,三万两千,装得下了,灯就灭了。要算更大的数,用双字版本,前面加个 D,那是后面要说的内容。下一节讲自加自减,按一下加一个数。