using MECF.Framework.Simulator.Core.Driver; using System; using System.Collections.Generic; using System.Diagnostics; using System.Timers; using Aitex.Core.Util; namespace MECF.Framework.Simulator.Core.Temperatures { class SimOmronEJ1 : SerialPortDeviceSimulator { public bool Failed { get; set; } public bool IsOn { get; set; } public bool IsHalo { get; set; } public bool IsContinueAck { get; set; } Stopwatch _timer = new Stopwatch(); private System.Timers.Timer _tick; Random _rd = new Random(); private object _locker = new object(); public string ResultValue { get; set; } Dictionary> _setpoint = new Dictionary>(); Dictionary> _poweron = new Dictionary>(); Dictionary _querySetpointPairs = new Dictionary(); Dictionary _poweronSetpointPairs = new Dictionary(); List _cached = new List(); List _buffer = new List(); public SimOmronEJ1(string port) : base(port, -1, "", ' ', false) { ResultValue = ""; _tick = new System.Timers.Timer(); _tick.Interval = 200; _tick.Elapsed += _tick_Elapsed; _tick.Start(); _setpoint[1] = new Dictionary() { { 0xC0, 0 }, { 0xC1, 0 } }; _setpoint[2] = new Dictionary() { { 0xC0, 0 }, { 0xC1, 0 }, { 0xC2, 0 }, { 0xC3, 0 } }; _setpoint[3] = new Dictionary() { { 0xC0, 0 }, { 0xC1, 0 }, { 0xC2, 0 }, { 0xC3, 0 } }; _poweron[1] = new Dictionary() { { 0xC0, 1 }, { 0xC1, 1 } }; _poweron[2] = new Dictionary() { { 0xC0, 1 }, { 0xC1, 1 }, { 0xC2, 1 }, { 0xC3, 1 } }; _poweron[3] = new Dictionary() { { 0xC0, 1 }, { 0xC1, 1 }, { 0xC2, 1 }, { 0xC3, 1 } }; _querySetpointPairs.Add(0x80, 0xC0); _querySetpointPairs.Add(0x81, 0xC1); _querySetpointPairs.Add(0x82, 0xC2); _querySetpointPairs.Add(0x83, 0xC3); _poweronSetpointPairs.Add(0x0A00, 0xC0); _poweronSetpointPairs.Add(0x0A01, 0xC1); _poweronSetpointPairs.Add(0x0A02, 0xC2); _poweronSetpointPairs.Add(0x0A03, 0xC3); _poweronSetpointPairs.Add(0x0B00, 0xC0); _poweronSetpointPairs.Add(0x0B01, 0xC1); _poweronSetpointPairs.Add(0x0B02, 0xC2); _poweronSetpointPairs.Add(0x0B03, 0xC3); } private void _tick_Elapsed(object sender, ElapsedEventArgs e) { lock (_locker) { if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10)) { _timer.Stop(); } } } protected override void ProcessUnsplitMessage(byte[] message) { _buffer.AddRange(message); if (_buffer.Count < 7) { return; } message = _buffer.ToArray(); _buffer.Clear(); _cached.Clear(); int slave = message[0]; int cmd = message[1]; if (cmd == 0x06) { int address = message[2] * 256 + message[3]; int data = message[4] * 256 + message[5]; if (address == 0xFFFF) { if (data == 0x0A00 || data == 0x0A01 || data == 0x0A02 || data == 0x0A03) { _poweron[slave][_poweronSetpointPairs[data]] = 0; } else if (data == 0x0B00 || data == 0x0B01 || data == 0x0B02 || data == 0x0B03) { _poweron[slave][_poweronSetpointPairs[data]] = 1; } } else { _setpoint[slave][address] = data; } } if (cmd == 0x03) { _cached.Add((byte)slave); _cached.Add(message[1]); _cached.Add(32); int address = message[2] * 256 + message[3]; for (int i = 0; i < 16; i++) { int data = 0; if (i % 3 == 0) { var setpointKey = 0; if (_querySetpointPairs.ContainsKey(address)) { setpointKey = _querySetpointPairs[address]; data = _setpoint[slave][setpointKey]; } //data = (50 + slave * 10 + i) * 10; } else if ((i - 1) % 3 == 0) { } else if ((i - 2) % 3 == 0) { var setpointKey = 0; if (_querySetpointPairs.ContainsKey(address)) { setpointKey = _querySetpointPairs[address]; data = _poweron[slave][setpointKey]; } } else { data = 0; } byte dataH = Convert.ToByte((data >> 8) & 0xff); byte dataL = Convert.ToByte(data & 0xff); _cached.Add(dataH); _cached.Add(dataL); } _cached.Add(0); _cached.Add(0); OnWriteMessage(_cached.ToArray()); return; } OnWriteMessage(message); return; } } }