RunConfig.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace MV485.model
  7. {
  8. public class RunConfig
  9. {
  10. public byte MeterType { get; set; }
  11. public bool MeterTypeWRFlag { get; set; }
  12. public ushort DnValue { get; set; }
  13. public bool DnValueWRFlag { get; set; }
  14. public byte DigitCount { get; set; }
  15. public bool DigitCountWRFlag { get; set; }
  16. public byte IndCount { get; set; }
  17. public bool IndCountWRFlag { get; set; }
  18. public float BrightValue { get; set; }
  19. public bool BrightValueWRFlag { get; set; }
  20. public byte LastUnitLevel { get; set; }
  21. public bool LastUnitLevelWRFlag { get; set; }
  22. public byte UploadRedind { get; set; }
  23. public bool UploadRedindWRFlag { get; set; }
  24. public ulong LatestValue { get; set; }
  25. public bool LatestValueWRFlag { get; set; }
  26. public DateTime LatestTime { get; set; }
  27. public string LatestTimeStr
  28. {
  29. get
  30. {
  31. if(LatestTime == null)
  32. {
  33. return "";
  34. }
  35. else
  36. {
  37. return LatestTime.ToString("yyyy-MM-dd HH:mm:ss");
  38. }
  39. }
  40. }
  41. public bool LatestTimeWRFlag { get; set; }
  42. //采样间隔(分钟)
  43. public ushort SampleInterval { get; set; }
  44. public bool SampleIntervalFlag { get; set; }
  45. //首采时间(整点时)
  46. public byte FirstHour { get; set; }
  47. public bool FirstHourFlag { get; set; }
  48. public string MeterRegion { get; set; }
  49. public bool MeterRegionWRFlag { get; set; }
  50. public string DigitRegion { get; set; }
  51. public bool DigitRegionWRFlag { get; set; }
  52. public string FTIndRegion { get; set; }
  53. public bool FTIndRegionWRFlag { get; set; }
  54. // 新增属性:按大端序将 LatestValue 转换为 ushort[4]
  55. public ushort[] LatestValues
  56. {
  57. get
  58. {
  59. // 1. 将 ulong 转为大端序的字节数组
  60. byte[] bytes = BitConverter.GetBytes(LatestValue);
  61. if (BitConverter.IsLittleEndian)
  62. {
  63. Array.Reverse(bytes); // 小端系统需反转字节数组
  64. }
  65. // 2. 将字节数组转为 ushort[4](按大端序)
  66. ushort[] result = new ushort[4];
  67. for (int i = 0; i < 4; i++)
  68. {
  69. int offset = i * 2;
  70. result[i] = (ushort)((bytes[offset] << 8) | bytes[offset + 1]);
  71. }
  72. return result;
  73. }
  74. }
  75. public ushort[] LatestTimes
  76. {
  77. get
  78. {
  79. if (LatestTime != null)
  80. {
  81. ushort[] result = new ushort[6];
  82. result[0] = (ushort)(LatestTime.Year - 2000);
  83. result[1] = (ushort)LatestTime.Month;
  84. result[2] = (ushort)LatestTime.Day;
  85. result[3] = (ushort)LatestTime.Hour;
  86. result[4] = (ushort)LatestTime.Minute;
  87. result[5] = (ushort)LatestTime.Second;
  88. return result;
  89. }
  90. else
  91. {
  92. return null;
  93. }
  94. }
  95. }
  96. /*public ushort[] LatestValues
  97. {
  98. get
  99. {
  100. // 1. 手动按大端序提取 ulong 的8个字节
  101. byte[] bytes = new byte[8];
  102. ulong value = LatestValue;
  103. bytes[0] = (byte)(value >> 56); // 最高有效字节
  104. bytes[1] = (byte)(value >> 48);
  105. bytes[2] = (byte)(value >> 40);
  106. bytes[3] = (byte)(value >> 32);
  107. bytes[4] = (byte)(value >> 24);
  108. bytes[5] = (byte)(value >> 16);
  109. bytes[6] = (byte)(value >> 8);
  110. bytes[7] = (byte)value; // 最低有效字节
  111. // 2. 将字节按大端序转为 ushort[4]
  112. ushort[] result = new ushort[4];
  113. for (int i = 0; i < 4; i++)
  114. {
  115. int offset = i * 2;
  116. result[i] = (ushort)((bytes[offset] << 8) | bytes[offset + 1]);
  117. }
  118. return result;
  119. }
  120. }*/
  121. // 反向操作:从大端序 ushort[] 设置 LatestValue
  122. public void SetLatestValueFromShorts(ushort[] values)
  123. {
  124. byte[] bytes = new byte[8];
  125. for (int i = 0; i < 4; i++)
  126. {
  127. bytes[i * 2] = (byte)(values[i] >> 8); // 高8位
  128. bytes[i * 2 + 1] = (byte)(values[i] & 0xFF); // 低8位
  129. }
  130. // 组合为 ulong(手动大端序)
  131. ulong value =
  132. ((ulong)bytes[0] << 56) |
  133. ((ulong)bytes[1] << 48) |
  134. ((ulong)bytes[2] << 40) |
  135. ((ulong)bytes[3] << 32) |
  136. ((ulong)bytes[4] << 24) |
  137. ((ulong)bytes[5] << 16) |
  138. ((ulong)bytes[6] << 8) |
  139. (ulong)bytes[7];
  140. LatestValue = value;
  141. }
  142. public ushort[] MeterRegions
  143. {
  144. get
  145. {
  146. ushort[] result = ConvertStringToUShortArray(MeterRegion, 4);
  147. return result;
  148. }
  149. }
  150. public ushort[] DigitRegions
  151. {
  152. get
  153. {
  154. ushort[] result = ConvertStringToUShortArray(DigitRegion, 8);
  155. return result;
  156. }
  157. }
  158. public ushort[] FTIndRegions
  159. {
  160. get
  161. {
  162. ushort[] result = ConvertStringToUShortArray(FTIndRegion, 4);
  163. return result;
  164. }
  165. }
  166. /// <summary>
  167. /// 将字符串按分隔符(逗号、空格)分割并转换为固定长度的 ushort 数组
  168. /// </summary>
  169. /// <param name="input">输入字符串</param>
  170. /// <param name="expectedLength">期望的数组长度</param>
  171. /// <returns>ushort数组(失败返回null)</returns>
  172. public static ushort[] ConvertStringToUShortArray(string input, int expectedLength)
  173. {
  174. // 1. 分割字符串(支持逗号和空格分隔)
  175. string[] parts = input.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
  176. // 2. 验证分割后的元素数量
  177. if (parts.Length != expectedLength)
  178. {
  179. return null;
  180. }
  181. // 3. 尝试转换为ushort数组
  182. ushort[] array = new ushort[expectedLength];
  183. for (int i = 0; i < expectedLength; i++)
  184. {
  185. if (!ushort.TryParse(parts[i], out array[i]))
  186. {
  187. return null; // 转换失败(非数字或超出ushort范围)
  188. }
  189. }
  190. return array;
  191. }
  192. public RunConfig()
  193. {
  194. MeterTypeWRFlag = false;
  195. DnValueWRFlag = false;
  196. DigitCountWRFlag = false;
  197. IndCountWRFlag = false;
  198. BrightValueWRFlag = false;
  199. LastUnitLevelWRFlag = false;
  200. UploadRedindWRFlag = false;
  201. LatestValueWRFlag = false;
  202. LatestTimeWRFlag = false;
  203. MeterRegionWRFlag = false;
  204. DigitRegionWRFlag = false;
  205. FTIndRegionWRFlag = false;
  206. SampleIntervalFlag = false;
  207. FirstHourFlag = false;
  208. }
  209. //-----------------------------------------------
  210. }
  211. }