我正在使用一些旧版软件(不要问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编程的主要规则之一,即永远不要使用循环,因为如果有人不经意地修改了索引计数器,您可能会陷入无限循环,并且机器会发疯或发生不可恢复的故障。加号循环很难维护以进行故障排除。另外,我什至没有循环说明,我必须使用标签和跳转。真是的
因此,我想知道是否有人比这两个更聪明的数学技巧或更聪明的模数实现方式。我可以访问+-* /,指数,sqrt,触发函数,日志,绝对值和AND / OR / NOT / XOR。