using System.Threading.Tasks;
public class DisconnectedEventArgs : EventArgs
public class PlcErrorEventArgs : EventArgs
public abstract class Register
public string Id{get;set;}
public dynamic Value{get;set;}
public Type Type{get;set;}
public class AllenBradleyModelXYZ : Register
public interface IPlcCommunicator<T> where T : Register
EventHandler OnConnected{get;set;}
EventHandler<DisconnectedEventArgs> OnDisconnected{get;set;}
EventHandler<PlcErrorEventArgs> OnError{get;set;}
Task<bool> Write<T>(T val, T register);
Task<T> Read<T>(T register);
Task<bool> WriteString(string val, T register);
Task<string> ReadString(T register);
public class AllenBradleyXYZ_Communicator : IPlcCommunicator<AllenBradleyModelXYZ>
public AllenBradleyXYZ_Communicator(string location, int port)
public Task<bool> Open() => throw new NotImplementedException();
public Task Close() => throw new NotImplementedException();
public bool IsConnected{get;}
public EventHandler OnConnected{get;set;}
public EventHandler<DisconnectedEventArgs> OnDisconnected{get;set;}
public EventHandler<PlcErrorEventArgs> OnError{get;set;}
public Task<bool> Write<AllenBradleyModelXYZ>(AllenBradleyModelXYZ val, AllenBradleyModelXYZ register) => throw new NotImplementedException();
public Task<AllenBradleyModelXYZ> Read<AllenBradleyModelXYZ>(AllenBradleyModelXYZ register) => throw new NotImplementedException();
public Task<bool> WriteString(string val, AllenBradleyModelXYZ register) => throw new NotImplementedException();
public Task<string> ReadString(AllenBradleyModelXYZ register) => throw new NotImplementedException();
var allenBradley = new AllenBradleyXYZ_Communicator("localhost", 502);
await allenBradley.Open();
if(allenBradley.IsConnected)
allenBradley.Read<AllenBradleyModelXYZ>(