protected override void EncodeWrite(byte[] request, WriteOperation writeOperation) { //uid request[0] = Convert.ToByte(writeOperation.UnitId); //Body //function code request[m_dataBodyOffset] = writeOperation.FunctionCode; //address byte[] address_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)(writeOperation.Address))); request[this.m_dataBodyOffset + 1] = address_byte[0]; request[this.m_dataBodyOffset + 2] = address_byte[1]; //value UInt16 value_int = writeOperation.IntValueToWrite; if (writeOperation.Address == '0' && value_int == 1) { request[this.m_dataBodyOffset + 3] = 0xFF; request[this.m_dataBodyOffset + 4] = 0x00; } else { byte[] val_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)value_int)); request[this.m_dataBodyOffset + 3] = val_byte[0]; request[this.m_dataBodyOffset + 4] = val_byte[1]; } if (this.GetCRC(request, 6, out UInt16 crc)) { byte[] crc_byte = BitConverter.GetBytes(crc); request[this.m_dataBodyOffset + 5] = crc_byte[0]; request[this.m_dataBodyOffset + 6] = crc_byte[1]; } }
private async Task WriteCBAsync(WriteOperation operation) { byte[] writeRequest = new byte[this.RequestSize]; this.EncodeWrite(writeRequest, operation); await this.SendRequestAsync(writeRequest).ConfigureAwait(false); }
public async Task WriteCB(WriteOperation operation) { byte[] writeRequest = new byte[m_bufSize]; byte[] writeResponse = null; int reqLen = this.m_reqSize; this.EncodeWrite(writeRequest, operation); writeResponse = await this.SendRequest(writeRequest, reqLen); }
protected override void EncodeWrite(byte[] request, WriteOperation writeOperation) { //MBAP //transaction id 2 bytes request[0] = 0; request[1] = 0; //protocol id 2 bytes request[2] = 0; request[3] = 0; //length const int requestLength = 6; byte[] requestLengthBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)requestLength)); request[4] = requestLengthBytes[0]; request[5] = requestLengthBytes[1]; //uid request[6] = Convert.ToByte(writeOperation.UnitId); //Body //function code request[this.FunctionCodeOffset] = (byte)writeOperation.FunctionCode; //address byte[] addressBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)(writeOperation.Address))); request[this.FunctionCodeOffset + 1] = addressBytes[0]; request[this.FunctionCodeOffset + 2] = addressBytes[1]; //value UInt16 valueToWrite = writeOperation.IntValueToWrite; if (writeOperation.Entity == '0' && valueToWrite == 1) { request[this.FunctionCodeOffset + 3] = 0xFF; request[this.FunctionCodeOffset + 4] = 0x00; } else { byte[] valueBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)valueToWrite)); request[this.FunctionCodeOffset + 3] = valueBytes[0]; request[this.FunctionCodeOffset + 4] = valueBytes[1]; } }
protected override void EncodeWrite(byte[] request, WriteOperation writeOperation) { //MBAP //transaction id 2 bytes request[0] = 0; request[1] = 0; //protocol id 2 bytes request[2] = 0; request[3] = 0; //length byte[] len_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)6)); request[4] = len_byte[0]; request[5] = len_byte[1]; //uid request[6] = Convert.ToByte(writeOperation.UnitId); //Body //function code request[m_dataBodyOffset] = writeOperation.FunctionCode; //address byte[] address_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)(writeOperation.Address))); request[this.m_dataBodyOffset + 1] = address_byte[0]; request[this.m_dataBodyOffset + 2] = address_byte[1]; //value UInt16 value_int = writeOperation.IntValueToWrite; if (writeOperation.Entity == '0' && value_int == 1) { request[this.m_dataBodyOffset + 3] = 0xFF; request[this.m_dataBodyOffset + 4] = 0x00; } else { byte[] val_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)value_int)); request[this.m_dataBodyOffset + 3] = val_byte[0]; request[this.m_dataBodyOffset + 4] = val_byte[1]; } }
public async Task WriteMessage(WriteOperation operation) { if (operation.ValueType != ModbusValueType.Basic) { //Handling complex value //Obtain value split into several int values var valuesToBeWritten = ModbusComplexValuesHandler.SplitComplexValue(operation.Value, operation.ValueType); //We need to write each part of complex value to separate registry foreach (var v in valuesToBeWritten) { operation.IntValueToWrite = Convert.ToUInt16(operation.Value); await WriteCB(operation); operation.StartAddress = (Convert.ToInt32(operation.StartAddress) + 1).ToString(); } } else { operation.IntValueToWrite = Convert.ToUInt16(operation.Value); await WriteCB(operation); } }
protected abstract void EncodeWrite(byte[] writeRequest, WriteOperation readOperation);