/* * Copyright 2012 Mario Vernari (http://cetdevelop.codeplex.com/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ModbusLib.Protocols { /// /// Modbus client proxy /// public class ModbusClient : IProtocol { public ModbusClient(IProtocolCodec codec) { Codec = codec; } /// /// The reference to the codec to be used /// public IProtocolCodec Codec { get; private set; } public event ModbusCommand.OutgoingData OutgoingData; public event ModbusCommand.IncommingData IncommingData; public void OnOutgoingData(byte[] data) { if (OutgoingData != null) OutgoingData(data); } public void OnIncommingData(byte[] data, int len) { if (IncommingData != null) IncommingData(data, len); } /// /// The address of the remote device /// public byte Address { get; set; } /// /// Entry-point for submitting any command /// /// The client port for the transport /// The command to be submitted /// The result of the query public CommResponse ExecuteGeneric( ICommClient port, ModbusCommand command) { var data = new ClientCommData(this); data.UserData = command; Codec.ClientEncode(data); var rVal = port.Query(data); if (data.OutgoingData != null) OnOutgoingData(data.OutgoingData.ToArray()); if (data.IncomingData != null) OnIncommingData(data.IncomingData.ToArray(), data.IncomingData.Length); return rVal; } public void ExecuteAsync( ICommClient port, ModbusCommand command) { var data = new ClientCommData(this); data.UserData = command; Codec.ClientEncode(data); port.QueryAsync(data); } } }