我正在用一些遗留软件(RSLogix 500,别问)对 PLC 进行编程,它本身不支持模数运算,但我需要一个。我无权访问:模数、整数除法、局部变量、截断操作(尽管我可以通过舍入来破解它)。此外,我可以使用的所有变量都按数据类型排列在表格中。最后,它应该适用于浮点小数,例如12345.678 MOD 10000 = 2345.678
.
如果我们做我们的等式:
dividend / divisor = integer quotient, remainder
有两个明显的实现。
实现1:进行浮点除法:dividend / divisor = decimal quotient
. 然后拼凑一个截断操作,这样你就可以找到integer quotient
. 将它乘以divisor
并找到 和 之间的差异dividend
,从而得到remainder
。
我不喜欢这样,因为它涉及到一堆不同类型的变量。我不能将变量“传递”给子程序,所以我只需要分配位于多个不同变量表中的一些全局变量,这很难理解。不幸的是,“难以理解”很重要,因为它需要足够简单,让维护人员可以搞砸。
实现 2:创建一个循环,使得 while dividend > divisor
divisor = dividend - divisor
. 这是非常干净的,但它违反了 PLC 编程的一条重要规则,即永远不要使用循环,因为如果有人无意中修改了索引计数器,你可能会陷入无限循环,机器会发疯或出现不可恢复的故障。Plus 回路很难进行维护故障排除。另外,我什至没有循环指令,我必须使用标签和跳转。哇。
所以我想知道是否有人有任何聪明的数学技巧或比这些更聪明的模数实现。我可以访问 + - * /、指数、sqrt、三角函数、日志、abs 值和 AND/OR/NOT/XOR。