SimOmronEJ1.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using MECF.Framework.Simulator.Core.Driver;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Timers;
  6. using Aitex.Core.Util;
  7. namespace MECF.Framework.Simulator.Core.Temperatures
  8. {
  9. class SimOmronEJ1 : SerialPortDeviceSimulator
  10. {
  11. public bool Failed { get; set; }
  12. public bool IsOn { get; set; }
  13. public bool IsHalo { get; set; }
  14. public bool IsContinueAck { get; set; }
  15. Stopwatch _timer = new Stopwatch();
  16. private System.Timers.Timer _tick;
  17. Random _rd = new Random();
  18. private object _locker = new object();
  19. public string ResultValue { get; set; }
  20. Dictionary<int, Dictionary<int, int>> _setpoint = new Dictionary<int, Dictionary<int, int>>();
  21. Dictionary<int, Dictionary<int, int>> _poweron = new Dictionary<int, Dictionary<int, int>>();
  22. Dictionary<int, int> _querySetpointPairs = new Dictionary<int, int>();
  23. Dictionary<int, int> _poweronSetpointPairs = new Dictionary<int, int>();
  24. List<byte> _cached = new List<byte>();
  25. List<byte> _buffer = new List<byte>();
  26. public SimOmronEJ1(string port)
  27. : base(port, -1, "", ' ', false)
  28. {
  29. ResultValue = "";
  30. _tick = new System.Timers.Timer();
  31. _tick.Interval = 200;
  32. _tick.Elapsed += _tick_Elapsed;
  33. _tick.Start();
  34. _setpoint[1] = new Dictionary<int, int>() { { 0xC0, 0 }, { 0xC1, 0 } };
  35. _setpoint[2] = new Dictionary<int, int>() { { 0xC0, 0 }, { 0xC1, 0 }, { 0xC2, 0 }, { 0xC3, 0 } };
  36. _setpoint[3] = new Dictionary<int, int>() { { 0xC0, 0 }, { 0xC1, 0 }, { 0xC2, 0 }, { 0xC3, 0 } };
  37. _poweron[1] = new Dictionary<int, int>() { { 0xC0, 1 }, { 0xC1, 1 } };
  38. _poweron[2] = new Dictionary<int, int>() { { 0xC0, 1 }, { 0xC1, 1 }, { 0xC2, 1 }, { 0xC3, 1 } };
  39. _poweron[3] = new Dictionary<int, int>() { { 0xC0, 1 }, { 0xC1, 1 }, { 0xC2, 1 }, { 0xC3, 1 } };
  40. _querySetpointPairs.Add(0x80, 0xC0);
  41. _querySetpointPairs.Add(0x81, 0xC1);
  42. _querySetpointPairs.Add(0x82, 0xC2);
  43. _querySetpointPairs.Add(0x83, 0xC3);
  44. _poweronSetpointPairs.Add(0x0A00, 0xC0);
  45. _poweronSetpointPairs.Add(0x0A01, 0xC1);
  46. _poweronSetpointPairs.Add(0x0A02, 0xC2);
  47. _poweronSetpointPairs.Add(0x0A03, 0xC3);
  48. _poweronSetpointPairs.Add(0x0B00, 0xC0);
  49. _poweronSetpointPairs.Add(0x0B01, 0xC1);
  50. _poweronSetpointPairs.Add(0x0B02, 0xC2);
  51. _poweronSetpointPairs.Add(0x0B03, 0xC3);
  52. }
  53. private void _tick_Elapsed(object sender, ElapsedEventArgs e)
  54. {
  55. lock (_locker)
  56. {
  57. if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10))
  58. {
  59. _timer.Stop();
  60. }
  61. }
  62. }
  63. protected override void ProcessUnsplitMessage(byte[] message)
  64. {
  65. _buffer.AddRange(message);
  66. if (_buffer.Count < 7)
  67. {
  68. return;
  69. }
  70. message = _buffer.ToArray();
  71. _buffer.Clear();
  72. _cached.Clear();
  73. int slave = message[0];
  74. int cmd = message[1];
  75. if (cmd == 0x06)
  76. {
  77. int address = message[2] * 256 + message[3];
  78. int data = message[4] * 256 + message[5];
  79. if (address == 0xFFFF)
  80. {
  81. if (data == 0x0A00 || data == 0x0A01 || data == 0x0A02 || data == 0x0A03)
  82. {
  83. _poweron[slave][_poweronSetpointPairs[data]] = 0;
  84. }
  85. else if (data == 0x0B00 || data == 0x0B01 || data == 0x0B02 || data == 0x0B03)
  86. {
  87. _poweron[slave][_poweronSetpointPairs[data]] = 1;
  88. }
  89. }
  90. else
  91. {
  92. _setpoint[slave][address] = data;
  93. }
  94. }
  95. if (cmd == 0x03)
  96. {
  97. _cached.Add((byte)slave);
  98. _cached.Add(message[1]);
  99. _cached.Add(32);
  100. int address = message[2] * 256 + message[3];
  101. for (int i = 0; i < 16; i++)
  102. {
  103. int data = 0;
  104. if (i % 3 == 0)
  105. {
  106. var setpointKey = 0;
  107. if (_querySetpointPairs.ContainsKey(address))
  108. {
  109. setpointKey = _querySetpointPairs[address];
  110. data = _setpoint[slave][setpointKey];
  111. }
  112. //data = (50 + slave * 10 + i) * 10;
  113. }
  114. else if ((i - 1) % 3 == 0)
  115. {
  116. }
  117. else if ((i - 2) % 3 == 0)
  118. {
  119. var setpointKey = 0;
  120. if (_querySetpointPairs.ContainsKey(address))
  121. {
  122. setpointKey = _querySetpointPairs[address];
  123. data = _poweron[slave][setpointKey];
  124. }
  125. }
  126. else
  127. {
  128. data = 0;
  129. }
  130. byte dataH = Convert.ToByte((data >> 8) & 0xff);
  131. byte dataL = Convert.ToByte(data & 0xff);
  132. _cached.Add(dataH);
  133. _cached.Add(dataL);
  134. }
  135. _cached.Add(0);
  136. _cached.Add(0);
  137. OnWriteMessage(_cached.ToArray());
  138. return;
  139. }
  140. OnWriteMessage(message);
  141. return;
  142. }
  143. }
  144. }