工控组态
工控组态
级别: 论坛先锋
精华主题: 0
发帖数量: 250 个
工控威望: 1159 点
下载积分: 2943 分
在线时间: 325(小时)
注册时间: 2009-09-03
最后登录: 2024-12-05
查看工控组态的 主题 / 回贴
楼主  发表于: 2023-10-21 08:36
比如说我在D0里面输入4,D2里面低4位全被置位1,;如果在在D0里面输入5,D2里面低5位回全置位1。
罗玩玩
级别: 正式会员
精华主题: 0
发帖数量: 14 个
工控威望: 60 点
下载积分: 433 分
在线时间: 27(小时)
注册时间: 2022-12-01
最后登录: 2025-02-18
查看罗玩玩的 主题 / 回贴
1楼  发表于: 5天前
根据三菱PLC的指令特性,可以通过以下步骤实现D2低N位置位的需求:

数学原理验证
公式D2 = 2^D0 -1在数学上是成立的。例如:

当D0=4时,2^4 -1 = 15(二进制00001111),低4位全为1。
当D0=5时,2^5 -1 = 31(二进制00011111),低5位全为1。
三菱PLC实现方法
由于三菱PLC没有直接的指数运算指令,需通过移位指令或循环乘法实现幂运算:

方法一:使用移位指令(推荐)
若PLC支持以寄存器值作为移位次数,可用以下代码:
     MOV K1 D10     ; 将1存入临时寄存器D10[[2]]
     SFL  D10 D0    ; 将D10左移D0次(需确认指令支持寄存器指定次数)[[16]]
     SUB  D10 K1 D2 ; D2 = 2^D0 -1[[8]]
方法二:循环乘法(通用方案)
通过循环实现2的D0次方计算:
     MOV K1 D10     ; 初始化D10=1
     MOV D0 D11     ; 设置循环次数为D0
     LOOP:
     CMP  D11 K0    ; 检查循环次数是否完成
     JLE  EXIT      ; 若D11≤0则跳转退出[[12]]
     MUL  D10 K2 D10; D10 *=2(等价于左移1位)[[13]]
     DEC  D11       ; 循环次数减1
     JMP  LOOP      ; 继续循环
     EXIT:
     SUB  D10 K1 D2 ; D2 = D10 -1[[8]]
注意事项
寄存器位数限制:若D0值较大(如≥16),需使用32位寄存器(如D1:D0组合)避免溢出。
指令兼容性:不同型号PLC支持的指令可能略有差异,需参考具体手册调整语法。
效率优化:对于固定范围D0值(如≤16),可预先计算掩码值并存入表格,通过查表直接读取