protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List <object> output) { //Transaction Identifier + Protocol Identifier + Length + Unit Identifier + Function Code if (input.Capacity < 2 + 2 + 2 + 1 + 1) { return; } ModbusHeader header = new ModbusHeader(input); short functionCode = input.ReadByte(); ModbusFunction function = null; if (Enum.IsDefined(typeof(ModbusCommand), functionCode)) { var command = Enum.GetName(typeof(ModbusCommand), functionCode); function = (ModbusFunction)Activator.CreateInstance(Type.GetType(string.Format(typeName, isServerMode ? "Request" : "Response", command))); } if (functionCode >= maxFunctionCode) { function = new ExceptionFunction(functionCode); } else if (function == null) { function = new ExceptionFunction(functionCode, 0x01); } function.Decode(input); ModbusFrame frame = new ModbusFrame(header, function); output.Add(frame); }
/// <summary> /// This Task handles all the types of Modbus Functions /// </summary> /// <returns>The operation.</returns> /// <param name="functionType">Function type.</param> /// <param name="slaveAddress">Slave address.</param> /// <param name="nrRegisters">Nr registers.</param> /// <param name="selectedRegisterAddress">Selected register address.</param> /// <param name="dataToWrite">Data to write.</param> public async Task <ReceivedData> ModbusOperation(ModbusFunctionType functionType, byte slaveAddress, byte[] nrRegisters, byte[] selectedRegisterAddress, byte[] dataToWrite) { frameToSend = new ModbusFrame(); if (functionType == ModbusFunctionType.WriteCoil || functionType == ModbusFunctionType.WriteHoldingRegister) { frameToSend = new ModbusFrame(slaveAddress, functionType, selectedRegisterAddress, null, dataToWrite); } else { frameToSend = new ModbusFrame(slaveAddress, functionType, selectedRegisterAddress, nrRegisters, null); } //We send the message to the Slave Device TransmissionState b = await SendMessage(frameToSend.BytePacketToSend); sizeOfMessage = CalculateExpectedSize(); ReceivedData responseData = new ReceivedData(); //If the message was transmitted right, then proceed with the listening //of the response if (b == TransmissionState.OK) { System.Diagnostics.Debug.WriteLine("MessageSended: " + b.ToString()); //TO-DO Implement the retry mechanism //int retries = 3; //responseData = await ListenMessages(); responseData = await ListenMessages(); } else { responseData.state = TransmissionState.ErrorSendMessage; } if (responseData.state == TransmissionState.OK) { frameReceived = new ModbusFrame(responseData.data); } else { frameReceived = new ModbusFrame(); } return(responseData); }
public ushort CallModbusFunction(ModbusFunction function) { if (ConnectionState.Connected != connectionState || Channel == null) { throw new Exception("Not connected!"); } SetTransactionIdentifier(); ModbusHeader header = new ModbusHeader(transactionIdentifier, UnitIdentifier); ModbusFrame frame = new ModbusFrame(header, function); Channel.WriteAndFlushAsync(frame); return(transactionIdentifier); }