Jochen Kühner
Level-3
- Beiträge
- 4.599
- Reaktionspunkte
- 817
-> 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:
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: