PLCAddress.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. namespace S7.Net
  2. {
  3. internal class PLCAddress
  4. {
  5. private DataType dataType;
  6. private int dbNumber;
  7. private int startByte;
  8. private int bitNumber;
  9. private VarType varType;
  10. public DataType DataType
  11. {
  12. get => dataType;
  13. set => dataType = value;
  14. }
  15. public int DbNumber
  16. {
  17. get => dbNumber;
  18. set => dbNumber = value;
  19. }
  20. public int StartByte
  21. {
  22. get => startByte;
  23. set => startByte = value;
  24. }
  25. public int BitNumber
  26. {
  27. get => bitNumber;
  28. set => bitNumber = value;
  29. }
  30. public VarType VarType
  31. {
  32. get => varType;
  33. set => varType = value;
  34. }
  35. public PLCAddress(string address)
  36. {
  37. Parse(address, out dataType, out dbNumber, out varType, out startByte, out bitNumber);
  38. }
  39. public static void Parse(string input, out DataType dataType, out int dbNumber, out VarType varType, out int address, out int bitNumber)
  40. {
  41. bitNumber = -1;
  42. dbNumber = 0;
  43. switch (input.Substring(0, 2))
  44. {
  45. case "DB":
  46. string[] strings = input.Split(new char[] { '.' });
  47. if (strings.Length < 2)
  48. throw new InvalidAddressException("To few periods for DB address");
  49. dataType = DataType.DataBlock;
  50. dbNumber = int.Parse(strings[0].Substring(2));
  51. address = int.Parse(strings[1].Substring(3));
  52. string dbType = strings[1].Substring(0, 3);
  53. switch (dbType)
  54. {
  55. case "DBB":
  56. varType = VarType.Byte;
  57. return;
  58. case "DBW":
  59. varType = VarType.Word;
  60. return;
  61. case "DBD":
  62. varType = VarType.DWord;
  63. return;
  64. case "DBX":
  65. bitNumber = int.Parse(strings[2]);
  66. if (bitNumber > 7)
  67. throw new InvalidAddressException("Bit can only be 0-7");
  68. varType = VarType.Bit;
  69. return;
  70. default:
  71. throw new InvalidAddressException();
  72. }
  73. case "IB":
  74. case "EB":
  75. // Input byte
  76. dataType = DataType.Input;
  77. dbNumber = 0;
  78. address = int.Parse(input.Substring(2));
  79. varType = VarType.Byte;
  80. return;
  81. case "IW":
  82. case "EW":
  83. // Input word
  84. dataType = DataType.Input;
  85. dbNumber = 0;
  86. address = int.Parse(input.Substring(2));
  87. varType = VarType.Word;
  88. return;
  89. case "ID":
  90. case "ED":
  91. // Input double-word
  92. dataType = DataType.Input;
  93. dbNumber = 0;
  94. address = int.Parse(input.Substring(2));
  95. varType = VarType.DWord;
  96. return;
  97. case "QB":
  98. case "AB":
  99. case "OB":
  100. // Output byte
  101. dataType = DataType.Output;
  102. dbNumber = 0;
  103. address = int.Parse(input.Substring(2));
  104. varType = VarType.Byte;
  105. return;
  106. case "QW":
  107. case "AW":
  108. case "OW":
  109. // Output word
  110. dataType = DataType.Output;
  111. dbNumber = 0;
  112. address = int.Parse(input.Substring(2));
  113. varType = VarType.Word;
  114. return;
  115. case "QD":
  116. case "AD":
  117. case "OD":
  118. // Output double-word
  119. dataType = DataType.Output;
  120. dbNumber = 0;
  121. address = int.Parse(input.Substring(2));
  122. varType = VarType.DWord;
  123. return;
  124. case "MB":
  125. // Memory byte
  126. dataType = DataType.Memory;
  127. dbNumber = 0;
  128. address = int.Parse(input.Substring(2));
  129. varType = VarType.Byte;
  130. return;
  131. case "MW":
  132. // Memory word
  133. dataType = DataType.Memory;
  134. dbNumber = 0;
  135. address = int.Parse(input.Substring(2));
  136. varType = VarType.Word;
  137. return;
  138. case "MD":
  139. // Memory double-word
  140. dataType = DataType.Memory;
  141. dbNumber = 0;
  142. address = int.Parse(input.Substring(2));
  143. varType = VarType.DWord;
  144. return;
  145. default:
  146. switch (input.Substring(0, 1))
  147. {
  148. case "E":
  149. case "I":
  150. // Input
  151. dataType = DataType.Input;
  152. varType = VarType.Bit;
  153. break;
  154. case "Q":
  155. case "A":
  156. case "O":
  157. // Output
  158. dataType = DataType.Output;
  159. varType = VarType.Bit;
  160. break;
  161. case "M":
  162. // Memory
  163. dataType = DataType.Memory;
  164. varType = VarType.Bit;
  165. break;
  166. case "T":
  167. // Timer
  168. dataType = DataType.Timer;
  169. dbNumber = 0;
  170. address = int.Parse(input.Substring(1));
  171. varType = VarType.Timer;
  172. return;
  173. case "Z":
  174. case "C":
  175. // Counter
  176. dataType = DataType.Counter;
  177. dbNumber = 0;
  178. address = int.Parse(input.Substring(1));
  179. varType = VarType.Counter;
  180. return;
  181. default:
  182. throw new InvalidAddressException(string.Format("{0} is not a valid address", input.Substring(0, 1)));
  183. }
  184. string txt2 = input.Substring(1);
  185. if (txt2.IndexOf(".") == -1)
  186. throw new InvalidAddressException("To few periods for DB address");
  187. address = int.Parse(txt2.Substring(0, txt2.IndexOf(".")));
  188. bitNumber = int.Parse(txt2.Substring(txt2.IndexOf(".") + 1));
  189. if (bitNumber > 7)
  190. throw new InvalidAddressException("Bit can only be 0-7");
  191. return;
  192. }
  193. }
  194. }
  195. }