private void SplitAndWriteDataTableRowSizeExceedPLCBuffer(ref List <ReadWriteRequest> joinRequests, ushort maximumAvailableBytesNo, string parentID) { WriteDataTables wdt = joinRequests[0] as WriteDataTables; List <ReadWriteRequest> splitWDTList = new List <ReadWriteRequest>(); ushort remainingRowsNo = wdt.NumberOfRowsToWrite; ushort maxAvailableWriteRowBytesNo = maximumAvailableBytesNo; ushort remainingWriteRowByteNo = (ushort)wdt.NumberOfBytesToWriteInRow; uint startAddress = wdt.StartAddress; int sourceIndex = 0; wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.SetMinMax, 0, ""); wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.ProgressChanged, 0, ""); while (remainingRowsNo > 0) { while (remainingWriteRowByteNo > 0) { byte[] values = new byte[maxAvailableWriteRowBytesNo]; Array.Copy(wdt.Values.ToArray(), sourceIndex, values, 0, maxAvailableWriteRowBytesNo); sourceIndex += maxAvailableWriteRowBytesNo; WriteDataTables tmpWDT = new WriteDataTables(startAddress, maxAvailableWriteRowBytesNo, 1, (ushort)wdt.RowSizeInBytes, values.ToList(), wdt.SubCommand); splitWDTList.Add(tmpWDT); ReadWriteDataTable(ref splitWDTList, parentID); splitWDTList.Clear(); startAddress += maxAvailableWriteRowBytesNo; remainingWriteRowByteNo -= maxAvailableWriteRowBytesNo; if (remainingWriteRowByteNo < maxAvailableWriteRowBytesNo && remainingWriteRowByteNo > 0) { maxAvailableWriteRowBytesNo = remainingWriteRowByteNo; } } remainingRowsNo--; maxAvailableWriteRowBytesNo = maximumAvailableBytesNo; remainingWriteRowByteNo = (ushort)wdt.NumberOfBytesToWriteInRow; startAddress = (uint)(wdt.StartAddress + (wdt.NumberOfRowsToWrite - remainingRowsNo) * wdt.RowSizeInBytes); wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.ProgressChanged, (wdt.NumberOfRowsToWrite - remainingRowsNo) * wdt.NumberOfBytesToWriteInRow, ""); } wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.Completed, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, ""); joinRequests[0].ResponseValues = String.Empty; }
private void SplitAndWriteDataTableRows(ref List <ReadWriteRequest> joinRequests, ushort maximumAvailableBytesNo, string parentID) { WriteDataTables wdt = joinRequests[0] as WriteDataTables; List <ReadWriteRequest> splitWDTList = new List <ReadWriteRequest>(); int sourceIndex = 0; int length = 0; ushort availableRowsNo = (ushort)(maximumAvailableBytesNo / wdt.NumberOfBytesToWriteInRow); int remainingRowsNo = wdt.NumberOfRowsToWrite; uint startAddress = wdt.StartAddress; wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.SetMinMax, 0, ""); wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.ProgressChanged, 0, ""); while (remainingRowsNo > 0) { length = wdt.NumberOfBytesToWriteInRow * availableRowsNo; byte[] writeValues = new byte[length]; Array.Copy(wdt.Values.ToArray(), sourceIndex, writeValues, 0, length); sourceIndex += length; WriteDataTables tmpWDT = new WriteDataTables(startAddress, wdt.NumberOfBytesToWriteInRow, availableRowsNo, (ushort)(wdt.RowSizeInBytes), writeValues.ToList(), wdt.SubCommand); splitWDTList.Add(tmpWDT); ReadWriteDataTable(ref splitWDTList, parentID); splitWDTList.Clear(); startAddress += (uint)(availableRowsNo * wdt.RowSizeInBytes); remainingRowsNo -= availableRowsNo; if (remainingRowsNo < availableRowsNo && remainingRowsNo > 0) { availableRowsNo = (ushort)remainingRowsNo; } wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.ProgressChanged, (wdt.NumberOfRowsToWrite - remainingRowsNo) * wdt.NumberOfBytesToWriteInRow, ""); } wdt.RaiseProgressEvent(0, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, RequestProgress.en_NotificationType.Completed, wdt.NumberOfRowsToWrite * wdt.NumberOfBytesToWriteInRow, ""); joinRequests[0].ResponseValues = String.Empty; }
private void ReadWriteDataTable(ref List <ReadWriteRequest> dataTableDRs, string parentID) { PComB pComB = new PComB(); BinaryCommand binaryCommand; ReadDataTables rdt = null; WriteDataTables wdt = null; if (this.BreakFlag) { throw new ComDriveExceptions("Request aborted by user", ComDriveExceptions.ComDriveException.AbortedByUser); } foreach (ReadWriteRequest rwr in dataTableDRs) { if (this.BreakFlag) { throw new ComDriveExceptions("Request aborted by user", ComDriveExceptions.ComDriveException.AbortedByUser); } if (rwr is ReadDataTables) { binaryCommand = BinaryCommand.ReadDataTables; rdt = rwr as ReadDataTables; rdt.RaiseProgressEvent(0, rdt.NumberOfBytesToReadInRow * rdt.NumberOfRowsToRead, RequestProgress.en_NotificationType.SetMinMax, 0, ""); rdt.RaiseProgressEvent(0, rdt.NumberOfBytesToReadInRow * rdt.NumberOfRowsToRead, RequestProgress.en_NotificationType.ProgressChanged, 0, ""); if (rdt.PartOfProject) { binaryCommand = BinaryCommand.ReadPartOfProjectDataTables; } List <List <byte> > readDataTablesDataRequestBytes = new List <List <byte> >(); readDataTablesDataRequestBytes.Add(GetDataRequestBytesForReadDataTables(rdt)); if (rdt != null) { byte[] cmdDetails = new byte[6]; Array.Copy(BitConverter.GetBytes(rdt.StartAddress), cmdDetails, 4); pComB.BuildBinaryCommand((byte)UnitId, binaryCommand, cmdDetails, dataTableDRs, readDataTablesDataRequestBytes, (byte)rdt.SubCommand); BinaryMessage receivedMessage = ReceiveMessage(pComB, readDataTablesDataRequestBytes, parentID) as BinaryMessage; } rdt.RaiseProgressEvent(0, rdt.NumberOfBytesToReadInRow * rdt.NumberOfRowsToRead, RequestProgress.en_NotificationType.Completed, rdt.NumberOfBytesToReadInRow * rdt.NumberOfRowsToRead, ""); } if (rwr is WriteDataTables) { binaryCommand = BinaryCommand.WriteDataTables; wdt = rwr as WriteDataTables; wdt.RaiseProgressEvent(0, wdt.NumberOfBytesToWriteInRow * wdt.NumberOfRowsToWrite, RequestProgress.en_NotificationType.SetMinMax, 0, ""); wdt.RaiseProgressEvent(0, wdt.NumberOfBytesToWriteInRow * wdt.NumberOfRowsToWrite, RequestProgress.en_NotificationType.ProgressChanged, 0, ""); List <List <byte> > writeDataTablesDataRequestBytes = new List <List <byte> >(); writeDataTablesDataRequestBytes.Add(GetDataRequestBytesForWriteDataTables(wdt)); if (wdt != null) { byte[] cmdDetails = new byte[6]; Array.Copy(BitConverter.GetBytes(wdt.StartAddress), cmdDetails, 4); pComB.BuildBinaryCommand((byte)UnitId, binaryCommand, cmdDetails, dataTableDRs, writeDataTablesDataRequestBytes, (byte)wdt.SubCommand); BinaryMessage receivedMessage = ReceiveMessage(pComB, null, parentID) as BinaryMessage; } wdt.RaiseProgressEvent(0, wdt.NumberOfBytesToWriteInRow * wdt.NumberOfRowsToWrite, RequestProgress.en_NotificationType.ProgressChanged, wdt.NumberOfBytesToWriteInRow * wdt.NumberOfRowsToWrite, ""); } } }