ycllzl1314
级别: 探索解密
精华主题: 0
发帖数量: 66 个
工控威望: 196 点
下载积分: 901 分
在线时间: 327(小时)
注册时间: 2013-12-10
最后登录: 2024-04-10
查看ycllzl1314的 主题 / 回贴
楼主  发表于: 2015-08-01 23:24
遇到点问题,请师傅们帮忙看看。

有D1  D2  D3 `````D10    一共10个寄存器数据,有常数K,

10个寄存器数据顺序排放,每次N个相加,要求(D1+D2+DN )最大并且小于 K,求N

如果用PLC写上面的程序,该怎么写,一点思路都没有,PLC用松下的
ycllzl1314
级别: 探索解密
精华主题: 0
发帖数量: 66 个
工控威望: 196 点
下载积分: 901 分
在线时间: 327(小时)
注册时间: 2013-12-10
最后登录: 2024-04-10
查看ycllzl1314的 主题 / 回贴
1楼  发表于: 2015-08-01 23:41
每次从D1开始 N个数相加,结果与K比较,符合条件取最大,这是一个思路,查了下,西门子PLC可以做到,

不知道松下能不能做到
xingzb2
级别: 家园常客
精华主题: 0
发帖数量: 663 个
工控威望: 977 点
下载积分: 1318 分
在线时间: 885(小时)
注册时间: 2015-07-11
最后登录: 2024-05-16
查看xingzb2的 主题 / 回贴
2楼  发表于: 2015-08-02 13:28
用10个d代表是10个相加结果,n位相加结果小于K,且n+1>k,输出结果就行了
(LD  m8000 ,add d1 d2 d32。。。。。。。。。)  意思是 d1+d2=d32   。。。      
   。。。                                                                                                d32+d3=d33
    。。。                                                                                               d33+d4=d34
   。。。                                                                                               。。。。
                                                       D39+D10=d40
条件ld m8000    --   (<D102 Kn)---(>d103 Kn)。。。。             意思是d102小于常数K,而D103大于常数K时,把2传送到d100当中
输出mov k2 d100
最后读出d100的数据就行了xxx
lvpretend
级别: 论坛先锋
精华主题: 0
发帖数量: 1255 个
工控威望: 1425 点
下载积分: 3674 分
在线时间: 322(小时)
注册时间: 2015-07-20
最后登录: 2024-02-20
查看lvpretend的 主题 / 回贴
3楼  发表于: 2015-08-02 14:58
没看懂:
10个寄存器数据顺序排放,每次N个相加,要求(D1+D2+DN )最大并且小于 K,求N。
既然每次有N个数相加,为什么有要求(D1+D2+DN)三个数了。
你是不是说的N个数相加,小于K,最大的组合,要求全部组合还是一个就行(因为可能出现多个结果相同)?
这是个排列组合呀!计算量有点大。
首先,10个数N1,N2,N3,N4,N5,N6,N7,N8,N9,N10。
再定义10个缓冲区A1,,,,,,,,A10,10个缓冲区相加,A1+A2+,,,,,,,+A10
N1,,,,,N10可以对应分别移入A1,,,,A10,具体移动几个数,看情况。不移入的,填写0.
如何确定哪些要移入呢?
设一个可以位操作的16位数D(其实只需使用低10位),对这个数每次加1,直到10位完成,2^10=1024,也就是要做1024次。
每次计算结果判断大于K,丢弃。小于K,结果存放到一个中间暂存变量中(定义MAX),且把这个D也存入一个数据队列中。
D由1开始计算,1的16位二进制编码为0000 0000 0000 0001
先把A1,,,A10清0
那么按位寻址D-M1位1,则把N1移入A1,其它为0则不移动
A1,,,,A10累加,结果与K比较,大于K,不管,小于K,存入。

下一个循环,
A1,,,A10清零
D+1=2,二进制编码为0000 0000 0000 0010
把N2,移入A2,再累加,,,,,

现在你懂了吧,也就是把1024种组合全部计算完,就可以找出全部符合你要求的数。
当然这个算法不够简练,是最笨的方法,但编程会方便些。其它算法会复杂些,计算速度也要快些,但编程不方便。

这个用时间中断来写,比如1mS中断一次,这样在1S多点就能求出结果。
wu32u2
耐得住挫折的打磨,我们将迸发出比钻石还璀璨的光芒——
级别: 论坛先锋
精华主题: 0
发帖数量: 1121 个
工控威望: 1474 点
下载积分: 1780 分
在线时间: 994(小时)
注册时间: 2010-03-01
最后登录: 2024-05-04
查看wu32u2的 主题 / 回贴
4楼  发表于: 2015-08-03 17:24
用变址寄存器累加,直到数值大于常数k停下,变址寄存器的数值减2就是你要求的N
[ 此帖被wu32u2在2015-08-03 17:35重新编辑 ]
本帖最近评分记录:
  • 下载积分:+1(最远是多远) 感谢分享!
  • 成功的路上需要帮助