TWDLC*A10DRF单字乘除扩展功能

2017/1/10 11:52:17

1.概述

  本文介绍无双字功能的CPU如何实现类似双字乘除运算的方法.

  Twido CPU中仅TWDLC*A10DRF无双字功能,虽然应用该型号CPU一般都是纯逻辑控制,没有高精度乘除运算的需求,但有时用到高速计数.电位器.操作终端输入等情况,需要运算来判断位置或设定值参与运算时则很不方便.

  主要问题有:

  1.)运算时可能要改比例

  2.)系统控制精度降低

  2 具体描述

  1.) 运算时可能要改比例,因为有可能发生溢出错误.

  下图为Twido字对象格式:

  从图中可看到10进制整数介于 -32768 和 32767 ,如果应用中有10进制运算328*100时就发生溢出,结果不是预期中的32800,而是-32;

  要想避免计算出错,防止溢出,就必须使乘积结果小于32767,也就要改变乘数或被乘数的比例,如将328*100改为328*10=3280,这样改后虽然不会出错,但可能带来了我们前面提到的第2.)个问题;

  2.)系统控制精度降低

  假设上述举例为位置控制,328表示高速计数输入,100表示单位脉冲长度输入范围,即可从0到100,如果这时单位脉冲长度为0.1毫米,那么当范围由0到100改为0到10时,单位脉冲长度相当于1毫米了,这种只有舍弃精度才能保证正确的乘法运算是我们不愿见到的;

  再假设上述举例中的高速计数输入值大到20000,则根本无法乘运算了,因此有必要扩展乘除运算功能;

  3 单字乘除扩展功能的实现

  根据乘法原理:乘法表示相同的几个数相加;即3*2=2+2+2, 相当于3个2相加,因此可把积(结果)=被乘数*乘数相当于=被乘数+…+被乘数,共乘数个被乘数相加,但这样做当乘数很大时算会很麻烦,如乘数为1234时被乘数加1234次才有结果, 程序量大不易实现;

  根据10进制数定义, 1234=1*1000+2*100+3*10+4*1,这样拆解乘数以后用1,2,3,4分别乘以乘数再累加求和,将大于32767的累加值的进位放到高字,小于32767的放在低字存储,用连续的两个高低字实现,这样运算程序容易编且执行速度快.

  详细说明可参考以下程序:

  程序要求:被乘数与乘数,其中一个不能大于3640(因3640*9<32767),另外一个不能大于32767(因为单字定义不能大于32767),否则结果无意义

  乘积范围:(0 到3640)*32767=119271880

  除法是乘法的反过程不作详细说明,除数要求<=3640;

  程序(TXT类型,可在下拉菜单选:程序à导入àASCII程序,打开梯形图)

  (* %MW300,%MW301是乘数、被乘数(范围:0 - 3640*32767=119271880),其中一个〈3640 *)

  (* %MW333是除数《=3640 *****下面还有说明***** *)

  (* %MW320,MW321是乘法扩展低、高位 *)

  (* %MW340,MW341是除法扩展低、高位 *)

  LD 1

  SR0

  END

  (* 乘法扩展子程序(范围:0 - 3640*32767=119271880) *)

  (* (算法要求:被乘数与乘数,其中一个不能大于3640,另外一个不能大于32767,否则结果无意义) *)

  SR0:

  LD 1

  [ %MW320 := 0 ]

  [ %MW321 := 0 ]

  [ %MW322 := 0 ]

  [ %MW323 := 0 ]

(* 乘法计算初步分析 *)

  (* %MW300被乘数 %MW301乘数 %MW302临时寄存器 *)

  LD 1

  [ %MW302 := %MW300 * %MW301 ]

  (* 没有溢出,则处理高低位后,直接输出 *)

  LDN %S18

  JMPC %L0

  (* 结果溢出,则复位溢出寄存器 *)

  LD %S18

  R %S18

  (* 比较被乘数与乘数,被乘数要求:小于等于乘数,不能大于3640 *)

  LD [ %MW300 <= %MW301 ]

  JMPC %L1

  (* 被乘数大于乘数,则交换被乘数与乘数 *)

  LD 1

  [ %MW302 := %MW300 ]

  [ %MW300 := %MW301 ]

  [ %MW301 := %MW302 ]

  %L1:

  LD 1

  [ %MW303 := %MW301 ]

  (* 计算乘数个位与被乘数的积 *)

  LD 1

  [ %MW304 := %MW303 REM 10 ]

  [ %MW313 := %MW304 * %MW300 ]

  [ %MW305 := %MW303 / 10 ]

  LD [ %MW305 = 0 ]

  JMPC %L2

  (* 计算乘数十位与被乘数的积 *)

  LD 1

  [ %MW306 := %MW305 REM 10 ]

  [ %MW314 := %MW306 * %MW300 ]

  [ %MW307 := %MW305 / 10 ]

  LD [ %MW307 = 0 ]

  JMPC %L3

  (* 计算乘数百位与被乘数的积 *)

  LD 1

  [ %MW308 := %MW307 REM 10 ]

  [ %MW315 := %MW308 * %MW300 ]

  [ %MW309 := %MW307 / 10 ]

  LD [ %MW309 = 0 ]

  JMPC %L4

  (* 计算乘数千位与被乘数的积 *)

  LD 1

  [ %MW310 := %MW309 REM 10 ]

  [ %MW316 := %MW310 * %MW300 ]

  [ %MW311 := %MW309 / 10 ]

  LD [ %MW311 = 0 ]

  JMPC %L5

  (* 计算乘数的万位与被乘数的积之和 *)

  LD 1

  [ %MW312 := %MW311 REM 10 ]

  [ %MW317 := %MW312 * %MW300 ]

  [ %MW318 := 0 ]

  [ %MW319 := %MW317 ]

  [ %MW320 := %MW320 + %MW318 ]

  [ %MW321 := %MW321 + %MW319 ]

  (* 计算乘数的万、千位与被乘数的积之和 *)

  %L5:

  LD 1

  [ %MW318 := %MW316 REM 10 ]

  [ %MW318 := %MW318 * 1000 ]

  [ %MW319 := %MW316 / 10 ]

  [ %MW320 := %MW320 + %MW318 ]

  [ %MW321 := %MW321 + %MW319 ]

  (* 计算乘数的万、千、百位与被乘数的积之和 *)

  %L4:

  LD 1

  [ %MW318 := %MW315 REM 100 ]

[ %MW318 := %MW318 * 100 ]

  [ %MW319 := %MW315 / 100 ]

  [ %MW320 := %MW320 + %MW318 ]

  [ %MW321 := %MW321 + %MW319 ]

  (* 计算乘数的万、千、百、十位与被乘数的积之和 *)

  %L3:

  LD 1

  [ %MW318 := %MW314 REM 1000 ]

  [ %MW318 := %MW318 * 10 ]

  [ %MW319 := %MW314 / 1000 ]

  [ %MW320 := %MW320 + %MW318 ]

  [ %MW321 := %MW321 + %MW319 ]

  (* 计算乘数的万、千、百、十、个位与被乘数的积之和 *)

  %L2:

  LD 1

  [ %MW318 := %MW313 REM 10000 ]

  [ %MW319 := %MW313 / 10000 ]

  [ %MW320 := %MW320 + %MW318 ]

  [ %MW302 := %MW320 ]

  [ %MW320 := %MW302 REM 10000 ]

  [ %MW302 := %MW302 / 10000 ]

  (* 计算最终结果 *)

  LD 1

  [ %MW321 := %MW321 + %MW302 ]

  [ %MW321 := %MW321 + %MW319 ]

  JMPC %L6

  (* 高低位处理直接计算结果 *)

  %L0:

  LD 1

  [ %MW320 := %MW302 REM 10000 ]

  [ %MW321 := %MW302 / 10000 ]

  (* 最终计算结果输出 *)

  %L6:

  LD 1

  [ %MW322 := %MW320 ]

  [ %MW323 := %MW321 ]

  (* 高位除法得到高位商值,余数,%MW333为除数必须小于3640 *)

  (* 否则结果错误 *)

  LD 1

  [ %MW341 := %MW321 / %MW333 ]

  [ %MW342 := %MW321 REM %MW333 ]

  (* 高位余数加低位千位数除 *)

  LD 1

  [ %MW332 := %MW320 / 1000 ]

  [ %MW331 := %MW320 REM 1000 ]

  [ %MW343 := %MW342 * 10 ]

  [ %MW344 := %MW343 + %MW332 ]

  [ %MW345 := %MW344 / %MW333 ]

  [ %MW346 := %MW344 REM %MW333 ]

  (* 千位除法余数加百位数除 *)

  LD 1

  [ %MW347 := %MW331 / 100 ]

  [ %MW348 := %MW331 REM 100 ]

  [ %MW349 := %MW346 * 10 ]

  [ %MW350 := %MW349 + %MW347 ]

  [ %MW351 := %MW350 / %MW333 ]

  [ %MW352 := %MW350 REM %MW333 ]

  (* 百位除法余数加十位数除 *)

  LD 1

  [ %MW353 := %MW348 / 10 ]

  [ %MW354 := %MW348 REM 10 ]

[ %MW355 := %MW352 * 10 ]

  [ %MW356 := %MW355 + %MW353 ]

  [ %MW357 := %MW356 / %MW333 ]

  [ %MW358 := %MW356 REM %MW333 ]

  (* 十位除法余数加个位数除 *)

  LD 1

  [ %MW359 := %MW358 * 10 ]

  [ %MW360 := %MW359 + %MW354 ]

  [ %MW361 := %MW360 / %MW333 ]

  [ %MW362 := %MW360 REM %MW333 ]

  (* 千、百、十、个位商值求和 *)

  LD 1

  [ %MW363 := %MW345 * 1000 ]

  [ %MW364 := %MW351 * 100 ]

  [ %MW365 := %MW357 * 10 ]

  [ %MW366 := %MW363 + %MW364 ]

  [ %MW367 := %MW365 + %MW361 ]

  [ %MW340 := %MW366 + %MW367 ]

  (* 个位余数如果大于除数一半,即四舍五入到商数低位%MW340 *)

  LD 1

  [ %MW368 := %MW333 / 2 ]

  AND [ %MW362 >= %MW368 ]

  [ %MW340 := %MW340 + 1 ]

  RET

施耐德电气技术文摘:
wido plc 在某些有特殊控制规律设备中的使用技巧
施耐德电气变频器故障代码及处理方法
变频协调控制技术在引风变频系统改造中的应用
TWIDO一种简洁的实现点动开关自锁方式
光电传感器选型需要哪些主要参数?
IT 与 OT 的融合如何推动智能电网发展
在Twido PLC的通讯程序中巧用常量字KW
施耐德电气变频器故障代码及处理方法
施耐德电气Twido系列PLC数据掉电保存的应用
施耐德断路器进水怎么维修
两种TWIDO PLC在线修改程序错误的解决方法
施耐德电气PLC通过CANopen的SDO报文控制SD388B
昆钢25MW发电机组煤气锅炉引送风机变频改造实施经验
施耐德电气ATV31变频器电机自整定注意事项
Twdio PLC无法自动运行解决方法
施耐德电气变频器常见问题解析
Twido PLC的数据保持
利用Twido的周期事件打造超级定时器
更多施耐德电气技术文摘...

通过中华工控网在线联系施耐德电气有限公司:

免费注册为中华工控网会员