黃輝馮某某
微信 F1049305119
級別: 家園常客
![]() |
圖片:
![]()
圖片:
![]() 松下的寫法,不知道算不算滿足要求 ![]() |
|
---|---|---|
|
方奇10010
級別: 略有小成
![]() |
牛逼 |
---|---|
|
ljb6688
級別: 論壇先鋒
![]() |
臥虎藏龍啊,開眼長見識了 |
|
---|---|---|
|
source08
級別: 網絡英雄
![]() |
優秀,又學習了。 |
---|---|
|
羅玩玩
級別: 正式會員
![]() |
根據三菱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),可預先計算掩碼值并存入表格,通過查表直接讀取 |
---|---|
|
黃輝馮某某
微信 F1049305119
級別: 家園常客
![]() |
圖片:
![]() 這樣行不行 |
|
---|---|---|
|
gxtmdb82164
級別: 論壇先鋒
![]() |
使用SFR指令應可以3行搞定 初始化0xffff到D0 將目標位數用16相減獲得移位數,比如說sub K16 n D1,n=6時,D1是10 SFR D0 D1,將0xffff右移10位,因為高位補0,最終的結果在D0中是6個1 |
---|---|
|