h30631
级别: 略有小成
精华主题: 0
发帖数量: 90 个
工控威望: 230 点
下载积分: 812 分
在线时间: 339(小时)
注册时间: 2012-09-05
最后登录: 2018-04-17
查看h30631的 主题 / 回贴
楼主  发表于: 2013-12-18 08:23
各位前輩好
小弟寫了一段程序如下



M8002 模擬會不會停,所以先給值

M100 準備啟動一個動作,M500 開始執行動作

M2000 需要動作的位置,M802 動作完觸發

最後是定義位置範圍

現在是因為每作完一次動作會把V0+1,如果M為0就繼續+1
M為1時停止+1並執行動作,旦是這樣感覺很沒效率
有沒有方法,直接判斷有哪些M是ON的,直接讓他丟M是ON的索引值
這樣忽略M=0 ,可以提升效率

懇請前輩們指點
h30631
级别: 略有小成
精华主题: 0
发帖数量: 90 个
工控威望: 230 点
下载积分: 812 分
在线时间: 339(小时)
注册时间: 2012-09-05
最后登录: 2018-04-17
查看h30631的 主题 / 回贴
1楼  发表于: 2013-12-18 08:29
我剛剛新增編碼指令進去



可惜它只能從高位開始動作,不能從低位開始
而且最後所有都變成oFF會出錯
請問各位前輩有其他方法嗎?
感謝~!
litung
臺灣-李同在
级别: VIP会员
精华主题: 2 篇
发帖数量: 578 个
工控威望: 3224 点
下载积分: 14494 分
在线时间: 405(小时)
注册时间: 2009-06-06
最后登录: 2024-11-16
查看litung的 主题 / 回贴
2楼  发表于: 2013-12-18 09:24
ENCO不能全為OFF <會產生操作錯誤>
只要讓其中一個M值一直會ON,就可以解決了。

不知道你這個用途是要應用在那邊?
我是都拿來作異常碼的使用。
若是的話,你也可以用F來試試看。
楼主留言:
感謝回覆
簡單的心,是真正有福
單純的心,是真正的快樂    
T480 i5-8250U,32GB,SSD:2TB+256G
h30631
级别: 略有小成
精华主题: 0
发帖数量: 90 个
工控威望: 230 点
下载积分: 812 分
在线时间: 339(小时)
注册时间: 2012-09-05
最后登录: 2018-04-17
查看h30631的 主题 / 回贴
3楼  发表于: 2013-12-18 09:44
回樓上大哥

其實我這個動作是這樣的

M2000~M2250 其中可能有幾個M是ON的,也可能全部都是OFF的、也可能全部都是ON的

然後我需要作一個判斷,直接把有ON的抓出來,依照順序(編號小的先),讓他去觸發一個動作(另一個M)

等待那ㄧ個動作完成後,會給一個完成訊號,把此次的M復歸掉,然後繼續把下一個M2000~M2250 中有ON的丟進來

例如 : M2000 成立執行M500 ,執行完成復歸M500 復歸M2000,假設M2001為OFF M2002為ON,

他會值接抓M2002進來,再ㄧ次觸發M500,最後直到M2000~M2250都為OFF 就結束整個動作

我這個M2000~M2250 是用來代表位置的,所以必須依照大小順序來觸發M500

請問前輩有沒有好的方法來做呢?

謝謝
john42tw
级别: 网络英雄
精华主题: 0
发帖数量: 1276 个
工控威望: 6107 点
下载积分: 52058 分
在线时间: 1120(小时)
注册时间: 2012-04-24
最后登录: 2024-09-30
查看john42tw的 主题 / 回贴
4楼  发表于: 2013-12-18 13:43
引用
引用第3楼h30631于2013-12-18 09:44发表的  :
回樓上大哥

其實我這個動作是這樣的

M2000~M2250 其中可能有幾個M是ON的,也可能全部都是OFF的、也可能全部都是ON的
.......

用迴圈來做呢?
楼主留言:
真诚感谢!

請問是
for next嗎?
天空流星
SZ-CL
级别: 网络英雄
精华主题: 0
发帖数量: 571 个
工控威望: 6193 点
下载积分: 19843 分
在线时间: 559(小时)
注册时间: 2008-03-17
最后登录: 2024-11-25
查看天空流星的 主题 / 回贴
5楼  发表于: 2013-12-18 15:41
还是没明白你到想要实现的动作,到底光处理数据,还是选取动作
看下SUM这个指令对你有没有用,配合ENCO也行
你所说的效率,其实也就PLC250个扫描周期,就是用1S也就1秒吧,
要是真的有影响,是不是考虑运算和执行同时走,第一个位置出来后,运算继续运行把下一个的位置算出来,
或是一次性把M的地址都运算出来,就是每个M的偏移值都取出来,执行时直接使用
楼主留言:
真诚感谢!

目前我是先依次性把M都算出來

但是就是不知道如何把這些M取出
然後依小到大順序去觸發M500
john42tw
级别: 网络英雄
精华主题: 0
发帖数量: 1276 个
工控威望: 6107 点
下载积分: 52058 分
在线时间: 1120(小时)
注册时间: 2012-04-24
最后登录: 2024-09-30
查看john42tw的 主题 / 回贴
6楼  发表于: 2013-12-18 16:16
參考看看  M500 開始搜尋

M500      
---|^|-------------------------[MOV K0 Z0]
---[> Z0 K249]---|

M500      M0Z0
---||----------||----------------[SET  M0Z0]
         |              |-----------[RST  M500]
         |     M0Z0
         |-------|/|---------------[+ Z0 K1 Z0]
楼主留言:
感謝大哥分享

這段跟我寫的方式一樣

都要全部掃描過

我想說能不能更快的,忽略0
直接抓1出來用
天空流星
SZ-CL
级别: 网络英雄
精华主题: 0
发帖数量: 571 个
工控威望: 6193 点
下载积分: 19843 分
在线时间: 559(小时)
注册时间: 2008-03-17
最后登录: 2024-11-25
查看天空流星的 主题 / 回贴
7楼  发表于: 2013-12-19 12:27
图片:
图片:
引用
引用第5楼king125于2013-12-18 15:41发表的  :
还是没明白你到想要实现的动作,到底光处理数据,还是选取动作
看下SUM这个指令对你有没有用,配合ENCO也行
你所说的效率,其实也就PLC250个扫描周期,就是用1S也就1秒吧,
要是真的有影响,是不是考虑运算和执行同时走,第一个位置出来后,运算继续运行把下一个的位置算出来,
或是一次性把M的地址都运算出来,就是每个M的偏移值都取出来,执行时直接使用


M0    开始运算
M1    开始执行
D100    需要执行的编号


加D2不等于0的条件
就是没有需要执行的
楼主留言:
真诚感谢!

這一開始如果m1999沒有on
就會卡在那邊
這該怎麼辦?
[ 此帖被king125在2013-12-19 14:06重新编辑 ]
h30631
级别: 略有小成
精华主题: 0
发帖数量: 90 个
工控威望: 230 点
下载积分: 812 分
在线时间: 339(小时)
注册时间: 2012-09-05
最后登录: 2018-04-17
查看h30631的 主题 / 回贴
8楼  发表于: 2013-12-19 14:57
引用
引用第7楼king125于2013-12-19 12:27发表的  :


M0    开始运算
M1    开始执行
D100    需要执行的编号
.......


請問為什麼要從M1999和D999開始?
不是從M2000、D1000開始嗎?

您的方法是用D1000到D1250暫存器
依序把需要執行的位置放進去
完成訊號M802 把Z1位置減1

有點看不明白,煩請前輩指點
天空流星
SZ-CL
级别: 网络英雄
精华主题: 0
发帖数量: 571 个
工控威望: 6193 点
下载积分: 19843 分
在线时间: 559(小时)
注册时间: 2008-03-17
最后登录: 2024-11-25
查看天空流星的 主题 / 回贴
9楼  发表于: 2013-12-20 10:31
引用
引用第8楼h30631于2013-12-19 14:57发表的  :


請問為什麼要從M1999和D999開始?
不是從M2000、D1000開始嗎?

.......


从M1999开始是防止有编号1的时候出错,而且D2是需要执行的计数,数量是从1开始的,不能从0开始,所以向前移动了一位
需要执行的编号放到D1000中,放下一个需要执行的编号时先把D1000原来的数据移到D1001 ,字左移指令
D2就是第一个记录的最大那个地址的编号,所以执行一次就减1,来执行下一个,减到0就是完成
楼主留言:
热心助人!

感謝前輩指點

我了解了