日期:2014-05-17  浏览次数:20869 次

关于RSLinx OPC批量读写问题
各位有没有做过AB PLC的OPC数据通讯软件?我现在使用RSLinx来组态AB PLC的OPC服务,使用c#来编写界面数据采集软件,动态链接库是RsiOPCAuto.dll。但使用批量读功能SyncRead函数时,总是提示出错,单个读写又没什么问题,特来请教这方面的高手。


            grp = grps.Item("ReadParaS1");
            int counts = grp.OPCItems.Count;
            Array svHandles = Array.CreateInstance(typeof(Int32), grp.OPCItems.Count);
            Array er = Array.CreateInstance(typeof(Int32), counts);
            Array v = Array.CreateInstance(typeof(object), counts);
            object q = new object(), t = new object();
            
            Int32 hd;
            for (int i = 0; i < counts; ++i)
            {
                hd = (Int32)grp.OPCItems.Item(opcPrefix + readParaPrefix + "1[" + i.ToString() + "]").ServerHandle;
                svHandles.SetValue(hd, i);
            }
            //在这一行出错,提示“值不在预期的范围内”。
            grp.SyncRead((short)RsiOPCAuto.OPCDataSource.OPCCache, counts, ref svHandles, out v, out er, out q, out t);

------解决方案--------------------
这么久才看到,因为你读取的是OPCCache, “值不在预期的范围内”可能是读取的tag超出了OPC server 设定的tag范围。 
------解决方案--------------------
ServerHandles数组从1开始
                 
 for (int i = 1; i <= itemCount; i++)
                {
                    ServerHandles.SetValue(KepItem[i-1].ServerHandle, i);
                }