Probleme mit PrepareReadrequest und mehren Variablen

Jochen Kühner

Level-3
Beiträge
4.291
Reaktionspunkte
527
Zuviel Werbung?
-> Hier kostenlos registrieren
[solved] Probleme mit PrepareReadrequest und mehren Variablen

Habe noch Probleme mit PrepareReadrequest und addVarToReadRequest

Habe dieses Problem nur beim 2ten Aufruf der Funktionen. Es gehen ja mit einem Read Request bis zu 20 Variablen (nutze gearde max. 18). D.h. nach 18 Variablen führen Ich den Request aus, und starte dann mit einer neuen PDU! Die 18 liest er auch fehlerfrei, aber der 19ten kommt dann:

The desired Adress is beyond limit for this PLC
oder
The desired item is not available in the PLC

Hier noch ein Ausschnitt aus meinem Code:

Code:
 //Count how Many Bytes from the PLC should be read and create a Byte Array for the Values
            int completeReadSize = 0;
            foreach (var libNoDaveValue in valueList)
            {
                completeReadSize += libNoDaveValue._internalGetReadSize();
            }
            byte[] completeData = new byte[completeReadSize];


            //Get the Maximum Answer Len for One PDU
            int maxReadSize = _dc.getMaxPDULen() - 18;


            int akReadSize = 0;
            int positionInCompleteData = 0;
            int akVar = 0;
            int anzVar = 0;
            int anzReadVar = 0;
           
            libnodave.PDU myPDU = _dc.prepareReadRequest();
            
            //Todo Split the Read Value, if it does not fit into one PDU
            foreach (var libNoDaveValue in valueList)
            {
                if (libNoDaveValue.LibNoDaveDataSource != LibNoDaveDataSource.Datablock && libNoDaveValue.LibNoDaveDataSource != LibNoDaveDataSource.InstanceDatablock)
                    libNoDaveValue.DatablockNumber = 0;

                int readSize = libNoDaveValue._internalGetReadSize();
                if (readSize + akReadSize > maxReadSize || anzReadVar == 18)
                {                    
                    var rs = new libnodave.resultSet();
                    int res = _dc.execReadRequest(myPDU, rs);
                    if (res != 0)
                        throw new Exception("Error: " + libnodave.daveStrerror(res));

                   

                    //Save the Read Data to a User Byte Array (Because we use this in the libnodavevalue class!)
                    int akres = 0;
                    for (; akVar < anzVar; akVar++)
                    {                       
                        res = _dc.useResult(rs, akres++);
                        if (res != 0)
                            throw new Exception("Error: " + libnodave.daveStrerror(res));

                        for (int n = 0; n < valueList[akVar]._internalGetReadSize(); n++)
                        {
                            completeData[positionInCompleteData++] = Convert.ToByte(_dc.getU8());
                        }
                    }
                    rs = null;
                    myPDU = null;
                    myPDU = _dc.prepareReadRequest();
                    readSize = 0;
                    anzReadVar = 0;
                }

                akReadSize = akReadSize + readSize;
                anzVar++;
                anzReadVar++;
                myPDU.addVarToReadRequest(Convert.ToInt32(libNoDaveValue.LibNoDaveDataSource), libNoDaveValue.DatablockNumber, libNoDaveValue.ByteAddress, readSize);
            }

            if(akReadSize>0)
            {
                var rs = new libnodave.resultSet();
                int res = _dc.execReadRequest(myPDU, rs);
                if (res != 0)
                    throw new Exception("Error: " + libnodave.daveStrerror(res));                

                //Save the Read Data to a User Byte Array (Because we use this in the libnodavevalue class!)
                int akres = 0;
                for (; akVar < anzVar; akVar++)
                {                    
                    res = _dc.useResult(rs, akres++);
                    if (res != 0)
                        throw new Exception("Error: " + libnodave.daveStrerror(res));

                    for (int n = 0; n < valueList[akVar]._internalGetReadSize(); n++)
                    {
                        completeData[positionInCompleteData++] = Convert.ToByte(_dc.getU8());
                    }
                }
                rs = null;
            }
 
Zuletzt bearbeitet:
Zurück
Oben