PlcData.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using FreeRedis;
  2. using System.Collections.Generic;
  3. namespace Virtual_PLC
  4. {
  5. /// <summary>
  6. /// plc数据
  7. /// </summary>
  8. public class PlcData
  9. {
  10. private static RedisClient Redis { get; set; }
  11. /// <summary>
  12. /// redis 链接字符串
  13. /// </summary>
  14. /// <param name="redisClient">Redis链接字符串</param>
  15. public PlcData(string redisClient)
  16. {
  17. Redis = new RedisClient(redisClient);
  18. }
  19. /// <summary>
  20. /// redis 链接字符串
  21. /// </summary>
  22. /// <param name="redisClient"></param>
  23. /// <returns></returns>
  24. public static PlcData Init(string redisClient)
  25. {
  26. return new PlcData(redisClient);
  27. }
  28. /// <summary>
  29. /// 初始化PLC数据
  30. /// </summary>
  31. /// <param name="pLCData">一个PLC</param>
  32. public void InitPlcData(PLCData pLCData)
  33. {
  34. //用总长度除以数据长度,再以每断数据的起始位置、IP、DB组成Key
  35. var mun = pLCData.Length / pLCData.DataLength;
  36. int addstart = 0;
  37. for (int i = 0; i < mun; i++)
  38. {
  39. var key = $"{pLCData.IP}:{pLCData.DB}:{addstart}";
  40. if (Redis.Exists(key)) continue;
  41. Redis.Set(key, new byte[pLCData.DataLength]);
  42. addstart = addstart + pLCData.DataLength;
  43. }
  44. }
  45. /// <summary>
  46. /// 初始化PLC数据
  47. /// </summary>
  48. /// <param name="pLCDatas">多个PLC</param>
  49. public void InitPlcData(List<PLCData> pLCDatas)
  50. {
  51. pLCDatas.ForEach(v =>
  52. {
  53. InitPlcData(v);
  54. });
  55. }
  56. /// <summary>
  57. /// 按照DB读取
  58. /// </summary>
  59. /// <param name="pLCData"></param>
  60. /// <returns></returns>
  61. public static byte[] Read(PLCData pLCData)
  62. {
  63. byte[] data = new byte[pLCData.Length];
  64. //用总长度除以数据长度,再以每断数据的起始位置、IP、DB组成Key
  65. var mun = pLCData.Length / pLCData.DataLength;
  66. int addstart = 0;
  67. for (int i = 0; i < mun; i++)
  68. {
  69. var a = Redis.Get<byte[]>($"{pLCData.IP}:{pLCData.DB}:{addstart}");
  70. a.CopyTo(data, addstart);
  71. addstart = addstart + pLCData.DataLength;
  72. }
  73. return data;
  74. }
  75. /// <summary>
  76. /// 按照长度读取
  77. /// </summary>
  78. /// <param name="pLCData"></param>
  79. /// <param name="startLength">起始长度</param>
  80. /// <returns></returns>
  81. public static byte[] Read(PLCData pLCData, int startLength)
  82. {
  83. return System.Text.Encoding.Default.GetBytes(Redis.Get($"{pLCData.IP}:{pLCData.DB}:{startLength}"));
  84. }
  85. /// <summary>
  86. ///
  87. /// </summary>
  88. public static void Write(PLCData pLCData, int startLength, byte[] bytes)
  89. {
  90. Redis.Set($"{pLCData.IP}:{pLCData.DB}:{startLength}", bytes);
  91. }
  92. }
  93. /// <summary>
  94. /// PLC数据结构
  95. /// </summary>
  96. public class PLCData
  97. {
  98. /// <summary>
  99. /// IP
  100. /// </summary>
  101. public string IP { get; set; }
  102. /// <summary>
  103. /// DB
  104. /// </summary>
  105. public string DB { get; set; }
  106. /// <summary>
  107. /// 总长度
  108. /// </summary>
  109. public int Length { get; set; }
  110. /// <summary>
  111. /// 数据长度
  112. /// </summary>
  113. public int DataLength { get; set; }
  114. }
  115. }