quote:以下是引用无胆英雄在2011-07-30 00:44:52的发言:
背影大侠,我试了一下,LW1000太大了,用不了,程序报错,我用到LW400还可以,如果不复制到L区,直接比较数据块,该怎么写程序,还请多指教,谢谢!
背影大侠的程序你没有看懂才会出现这种疑问。lw1000是存放循环次数的地方。就这段程序而言,你可以改成804以上的任意值,但是不能超过你的plc本地变量的长度。定义100个32位地址是背影大侠为了给你演示思路写的,你需要根据你自己的情况自行更改一下。另外,背影大侠的这段程序是顺序比较,如果你是要求“只要a中的数据,在b中存在,那么这条数据就要写到c内”,你可以根据背影大侠给你的方法构造双层循环。背影给出的方法,我个人认为,能够满足你所说的情况,而且简明有效的避免了只能同时打开2个db的问题。
从西门子plc上面说,个人认为这个问题难点在于如何打开3个db,背影的办法是将用于比较的2个数据块放在本地空间中,当然也可以将用来记录的放在本地空间(用m做中间变量个人觉得不好)中,直接打开2个用于比较的数据块,我推测可能会少一步,未验证。
从工艺上说,楼主给出的条件还是太过笼统。不同的db块可以有不同的处理办法,背影大侠给你的几乎是一个全能的处理办法,无非受限于本地空间的长度。如果你的db块过大,建议你用上位机来处理。plc由于性能的关系,会很慢,也正如背影所写的那样相对复杂。用上位机处理,只需要用一个select in一条语句就可以代替双层循环。
这里根据情况给出几种假设,作为一个借鉴吧。简称用于比较的是a\b数据块,用来记录的是c数据块。
1)a、b长度固定,并且a的长度=b的长度,c需要记录的是:a的第n条与b的第n条相同的值——直接采用背影的方法。
2)a、b长度固定,并且a的长度=b的长度,c需要记录的是:a的记录在b中存在——采用背影的方法改成双循环。
3)a、b长度不固定,a的长度等于b的长度,其他跟上述2种情况相同。用我说过的——sfc24取出来数据块的长度,再采用上述办法。
4)a、b长度不固定,a的长度不一定等于b的长度,其他跟2)所述相同——还是用sfc24取出长度,用长的做外层循环。
5)跟条件4)相同,不过其中a有序(或者b有序)——用单层循环+fc86(TI - S7)试试,或者二分法查找。