| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 | using Aitex.Core.RT.Device;using MECF.Framework.Common.Communications;using MECF.Framework.Common.Event;using System;using System.Xml;namespace MECF.Framework.Common.PLC{    public class WcfPlc : BaseDevice, IConnection, IConnectable, IPlc    {        private WcfPlcServiceClient _plcClient;        public AlarmEventItem AlarmConnectFailed { get; set; }        public AlarmEventItem AlarmCommunicationError { get; set; }        public event Action OnConnected;        public event Action OnDisconnected;        private FsmConnection _connection;        private int _heartbeat = 1;        private string _wcfConfigName;        public WcfPlc(string module, XmlElement node, string ioModule = "")        {            var attrModule = node.GetAttribute("module");            Module = string.IsNullOrEmpty(attrModule) ? module : attrModule;            Name = node.GetAttribute("id");            _wcfConfigName = node.GetAttribute("wcf");        }        public WcfPlc(string module, string name, string wcfConfigName)        {            Module = module;            Name = name;            _wcfConfigName = wcfConfigName;        }        public bool Initialize()        {            if (string.IsNullOrEmpty(_wcfConfigName))            {                _plcClient = new WcfPlcServiceClient();            }            else            {                _plcClient = new WcfPlcServiceClient(_wcfConfigName);            }            AlarmConnectFailed = SubscribeAlarm($"{Module}.{Name}.ConnectionError", $"Can not connect with {Address}", null);            AlarmCommunicationError = SubscribeAlarm($"{Module}.{Name}.CommunicationError", $"Can not Communication {Address}", null);            _connection = new FsmConnection();            IConnectionContext contex = new StaticConnectionContext()            {                IsEnabled = true,                Address = "WCF PLC",                EnableCheckConnection = false,                EnableLog = false,                MaxRetryConnectCount = 3,                IsAscii = false,                NewLine = string.Empty,                RetryConnectIntervalMs = 1000,            };            _connection.OnConnected += _connection_OnConnected;            _connection.OnDisconnected += _connection_OnDisconnected;            _connection.OnError += _connection_OnError;            _connection.Initialize(50, this, contex);            return true;        }        private void _connection_OnError(string error)        {            AlarmConnectFailed.Set(error);        }        private void _connection_OnDisconnected()        {            if (OnDisconnected != null)                OnDisconnected();        }        private void _connection_OnConnected()        {            if (OnConnected != null)                OnConnected();        }        public void Monitor()        {        }        public void Terminate()        {        }        public void Reset()        {            ResetAlarm();            _connection.InvokeReset();        }        #region IConnection        public string Address { get; }        public bool IsConnected { get; set; }        public bool Connect()        {            _connection.InvokeConnect();            return true;        }        public bool Disconnect()        {            _connection.InvokeDisconnect();            return true;        }        #endregion        #region IConnectable#pragma warning disable 0067        public event Action<string> OnCommunicationError;        public event Action<string> OnAsciiDataReceived;        public event Action<byte[]> OnBinaryDataReceived;#pragma warning restore 0067        public bool Connect(out string reason)        {            reason = string.Empty;            return true;        }        public bool Disconnect(out string reason)        {            reason = string.Empty;            return true;        }        public bool CheckIsConnected()        {            if (_plcClient == null)                return false;            _heartbeat++;            if (_plcClient.Heartbeat(_heartbeat) > 0 && !_plcClient.ActionFailed)                return true;            return false;        }        public bool ReadBool(string address, out bool[] data, int length, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            data = _plcClient.ReadDi(0, length, out reason);            if (data == null || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed read PLC data";                AlarmCommunicationError.Set();                return false;            }            return true;        }        public bool ReadInt16(string address, out short[] data, int length, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            data = _plcClient.ReadAiInt16(0, length, out reason);            if (data == null || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed read PLC data";                AlarmCommunicationError.Set();                return false;            }            return true;        }        public bool WriteBool(string address, bool[] data, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            bool result = _plcClient.WriteDo(0, data, out reason);            if (!result || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed write PLC data";                AlarmCommunicationError.Set();                return false;            }            return true;        }        public bool WriteInt16(string address, short[] data, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            bool result = _plcClient.WriteAoInt16(0, data, out reason);            if (!result || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed write PLC data";                AlarmCommunicationError.Set();                return false;            }            return true;        }        public bool SendBinaryData(byte[] data)        {            return true;        }        public bool SendAsciiData(string data)        {            return true;        }        #endregion        public bool Read(string variable, out object data, string type, int length, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            bool result = _plcClient.Read(variable, out data, type, length, out reason);            if (data == null || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed read PLC data";                AlarmCommunicationError.Set();                return false;            }            return result;        }        public bool WriteArrayElement(string variable, int index, object value, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    return false;            //}            bool result = _plcClient.WriteArrayElement(variable, index, value, out reason);            if (_plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed read PLC data";                AlarmCommunicationError.Set();                return false;            }            return result;        }        public bool ReadFloat(string address, out float[] data, int length, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            data = _plcClient.ReadAiFloat(0, length, out reason);            if (data == null || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed read PLC data";                AlarmCommunicationError.Set();                return false;            }            return true;        }        public bool WriteFloat(string address, float[] data, out string reason)        {            if (!_connection.IsConnected)            {                reason = "Not connected with PLC";                data = null;                return false;            }            //if (HasAlarm)            //{            //    reason = "Has alarm";            //    data = null;            //    return false;            //}            bool result = _plcClient.WriteAoFloat(0, data, out reason);            if (!result || _plcClient.ActionFailed)            {                AlarmCommunicationError.Description = "Failed write PLC data";                AlarmCommunicationError.Set();                return false;            }            return true;        }        public bool Write(string variable, object value, out string reason)        {            throw new NotImplementedException();        }        public bool ReadInt32(string address, out int[] data, int length, out string reason)        {            throw new NotImplementedException();        }    }}
 |