private void SetValues(BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { if (requestedMessage.Header.CommandNumber == (byte)BinaryCommand.ReadWrite) { // Full Binary Mix SetValuesFullBinaryMix(requestedMessage, dataRequestsBytes); //SetValuesEx(requestedMessage, dataRequestsBytes); } else if (requestedMessage.Header.CommandNumber == (byte)BinaryCommand.ReadOperands) { // Partial Binart Mix SetValuesPartialBinaryMix(requestedMessage, dataRequestsBytes); } else if (requestedMessage.Header.CommandNumber == (byte)BinaryCommand.ReadDataTables) { // Read DT SetValuesReadDT(requestedMessage, dataRequestsBytes); } else if (requestedMessage.Header.CommandNumber == (byte)BinaryCommand.ReadPartOfProjectDataTables) { // Read DT SetValuesReadDT(requestedMessage, dataRequestsBytes); } else if (requestedMessage.Header.CommandNumber == (byte)BinaryCommand.WriteDataTables) { // Write DT System.Diagnostics.Debug.Assert(false); } }
private Details GetDetails(List <byte> m_BinaryMessageBytes, BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { Details details = new Details(m_BinaryMessageBytes.ToArray(), requestedMessage, dataRequestsBytes); return(details); }
public Details(byte[] message, BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) : this() { //20 is location in message where I have details length UInt16 length = BitConverter.ToUInt16(message, 20); m_detailsValues = new byte[length]; Array.Copy(message, 24, m_detailsValues, 0, (int)length); m_dataRequests = requestedMessage.Details.m_dataRequests; SetValues(requestedMessage, dataRequestsBytes); }
private void SetValuesReadDT(BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { m_responseValues = new List <object>(); List <object> dtValues = new List <object>(m_detailsValues.Length); for (int iter = 0; iter < m_detailsValues.Length; iter++) { dtValues.Add(m_detailsValues[iter] as object); } m_responseValues.AddRange(dtValues); m_dataRequests[0].ResponseValues = m_responseValues.ToArray(); }
public BinaryMessage(byte[] message, BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { m_BinaryMessageBytes = message.ToList(); BuildMessage(requestedMessage, dataRequestsBytes); }
private void BuildMessage(BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { m_header = GetHeader(m_BinaryMessageBytes); m_details = GetDetails(m_BinaryMessageBytes, requestedMessage, dataRequestsBytes); m_footer = GetFooter(m_BinaryMessageBytes); }
private void SetValuesPartialBinaryMix(BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { m_responseValues = new List <object>(); int index = 0; int bitIndex = 0; if (m_detailsBytes.Count > 0 || requestedMessage.Details.DetailsBytes.Length > 0) { for (int i = 0; i < m_dataRequests.Count; i++) { string operatorName = String.Empty; UInt16 length = 0; int size = 0; operatorName = (dataRequestsBytes[i])[2].GetOperandNameByValue(); size = Utils.OperandTypesDictionary[operatorName].OperandSize; length = BitConverter.ToUInt16(dataRequestsBytes[i].ToArray(), 0); switch (size) { case 1: int NumOfValues = BitConverter.ToInt32( new byte[] { dataRequestsBytes[i][0], dataRequestsBytes[i][1], 0, 0 }, 0); ByteBits bits; bits = new ByteBits(m_detailsValues[index]); for (int iter = 0; iter < NumOfValues; iter++) { if (bits[bitIndex]) { m_responseValues.Add((short)1); } else { m_responseValues.Add((short)0); } bitIndex++; if (bitIndex >= 8) { bitIndex = 0; index++; bits = new ByteBits(m_detailsValues[index]); } } break; case 16: if (bitIndex != 0) { bitIndex = 0; index++; index += (index % 2); } else { index += (index % 2); } for (int j = 0; j < length; j++) { try { m_responseValues.Add(BitConverter.ToInt16( new byte[2] { m_detailsValues[index], m_detailsValues[index + 1] }, 0)); } catch { } finally { index += 2; } } break; case 32: if (bitIndex != 0) { bitIndex = 0; index++; index += (index % 2); } else { index += (index % 2); } for (int j = 0; j < length; j++) { switch (operatorName) { case Utils.Operands.OP_MF: m_responseValues.Add(Utils.HexEncoding.ConvertBytesToSingle(new byte[4] { m_detailsValues[index + 2], m_detailsValues[index + 3], m_detailsValues[index + 0], m_detailsValues[index + 1] })); break; case Utils.Operands.OP_TIMER_CURRENT: case Utils.Operands.OP_TIMER_PRESET: UInt32 uint_Value = BitConverter.ToUInt32(m_detailsValues, index); if ((requestedMessage.Details.m_dataRequests[i] as ReadOperands) .TimerValueFormat.Equals(TimerValueFormat.TimeFormat)) { m_responseValues.Add(Utils.z_GetTimeUnits(Convert.ToInt32(uint_Value))); } else { m_responseValues.Add(uint_Value); } break; case Utils.Operands.OP_ML: case Utils.Operands.OP_XL: case Utils.Operands.OP_SL: Int32 value = BitConverter.ToInt32(m_detailsValues, index); m_responseValues.Add(value); break; case Utils.Operands.OP_DW: case Utils.Operands.OP_XDW: case Utils.Operands.OP_SDW: uint_Value = BitConverter.ToUInt32(m_detailsValues, index); m_responseValues.Add(uint_Value); break; } index += 4; } break; default: System.Diagnostics.Debug.Assert(false); break; } object[] objects = new object[m_responseValues.Count]; Array.Copy(m_responseValues.ToArray(), objects, m_responseValues.Count); m_dataRequests[i].ResponseValues = objects; m_responseValues.Clear(); } } }
private void SetValuesFullBinaryMix(BinaryMessage requestedMessage, List <List <byte> > dataRequestsBytes) { m_responseValues = new List <object>(); int index = 8; if (m_detailsBytes.Count > 0 || requestedMessage.Details.DetailsBytes.Length > 0) { for (int i = 0; i < m_dataRequests.Count; i++) { string operatorName = String.Empty; UInt16 length = 0; int size = 0; operatorName = (dataRequestsBytes[i])[4].GetOperandNameByValueForFullBinary(); size = Utils.FullBinaryOperandTypes[operatorName].OperandSize; length = (dataRequestsBytes[i])[5]; if ((dataRequestsBytes[i])[0] == 1) { // This is a read request switch (size) { case 1: for (int iter = 0; iter < length; iter++) { m_responseValues.Add( (short)(m_detailsValues[index] & 1)); // BitWise And for checking LSB value index++; } index += 4; // jumping over Operand Type, Num Of Operands, Address (2 bytes)... Index will point the next value index += index % 2; // Odd Addresses are not allowed break; case 16: for (int j = 0; j < length; j++) { try { m_responseValues.Add(BitConverter.ToInt16( new byte[2] { m_detailsValues[index], m_detailsValues[index + 1] }, 0)); } catch { } finally { index += 2; } } index += 4; // jumping over Operand Type, Num Of Operands, Address (2 bytes)... Index will point the next value break; case 32: for (int j = 0; j < length; j++) { switch (operatorName) { case Utils.Operands.OP_MF: m_responseValues.Add(Utils.HexEncoding.ConvertBytesToSingle(new byte[4] { m_detailsValues[index + 2], m_detailsValues[index + 3], m_detailsValues[index + 0], m_detailsValues[index + 1] })); break; case Utils.Operands.OP_TIMER_CURRENT: case Utils.Operands.OP_TIMER_PRESET: UInt32 uint_Value = BitConverter.ToUInt32(m_detailsValues, index); if ((requestedMessage.Details.m_dataRequests[i] as ReadOperands) .TimerValueFormat.Equals(TimerValueFormat.TimeFormat)) { m_responseValues.Add(Utils.z_GetTimeUnits(Convert.ToInt32(uint_Value))); } else { m_responseValues.Add(uint_Value); } break; case Utils.Operands.OP_ML: case Utils.Operands.OP_XL: case Utils.Operands.OP_SL: Int32 value = BitConverter.ToInt32(m_detailsValues, index); m_responseValues.Add(value); break; case Utils.Operands.OP_DW: case Utils.Operands.OP_XDW: case Utils.Operands.OP_SDW: uint_Value = BitConverter.ToUInt32(m_detailsValues, index); m_responseValues.Add(uint_Value); break; } index += 4; } index += 4; // jumping over Operand Type, Num Of Operands, Address (2 bytes)... Index will point the next value break; } //end swich(size) } else { //Write request No data arrives from PLC } object[] objects = new object[m_responseValues.Count]; Array.Copy(m_responseValues.ToArray(), objects, m_responseValues.Count); m_dataRequests[i].ResponseValues = objects; m_responseValues.Clear(); } } }