PLCAddress.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. namespace snap7Enc
  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 "EB":
  74. // Input byte
  75. dataType = DataType.Input;
  76. dbNumber = 0;
  77. address = int.Parse(input.Substring(2));
  78. varType = VarType.Byte;
  79. return;
  80. case "EW":
  81. // Input word
  82. dataType = DataType.Input;
  83. dbNumber = 0;
  84. address = int.Parse(input.Substring(2));
  85. varType = VarType.Word;
  86. return;
  87. case "ED":
  88. // Input double-word
  89. dataType = DataType.Input;
  90. dbNumber = 0;
  91. address = int.Parse(input.Substring(2));
  92. varType = VarType.DWord;
  93. return;
  94. case "AB":
  95. // Output byte
  96. dataType = DataType.Output;
  97. dbNumber = 0;
  98. address = int.Parse(input.Substring(2));
  99. varType = VarType.Byte;
  100. return;
  101. case "AW":
  102. // Output word
  103. dataType = DataType.Output;
  104. dbNumber = 0;
  105. address = int.Parse(input.Substring(2));
  106. varType = VarType.Word;
  107. return;
  108. case "AD":
  109. // Output double-word
  110. dataType = DataType.Output;
  111. dbNumber = 0;
  112. address = int.Parse(input.Substring(2));
  113. varType = VarType.DWord;
  114. return;
  115. case "MB":
  116. // Memory byte
  117. dataType = DataType.Memory;
  118. dbNumber = 0;
  119. address = int.Parse(input.Substring(2));
  120. varType = VarType.Byte;
  121. return;
  122. case "MW":
  123. // Memory word
  124. dataType = DataType.Memory;
  125. dbNumber = 0;
  126. address = int.Parse(input.Substring(2));
  127. varType = VarType.Word;
  128. return;
  129. case "MD":
  130. // Memory double-word
  131. dataType = DataType.Memory;
  132. dbNumber = 0;
  133. address = int.Parse(input.Substring(2));
  134. varType = VarType.DWord;
  135. return;
  136. default:
  137. switch (input.Substring(0, 1))
  138. {
  139. case "E":
  140. case "I":
  141. // Input
  142. dataType = DataType.Input;
  143. varType = VarType.Bit;
  144. break;
  145. case "A":
  146. case "O":
  147. // Output
  148. dataType = DataType.Output;
  149. varType = VarType.Bit;
  150. break;
  151. case "M":
  152. // Memory
  153. dataType = DataType.Memory;
  154. varType = VarType.Byte;
  155. break;
  156. case "T":
  157. // Timer
  158. dataType = DataType.Timer;
  159. dbNumber = 0;
  160. address = int.Parse(input.Substring(1));
  161. varType = VarType.Timer;
  162. return;
  163. case "Z":
  164. case "C":
  165. // Counter
  166. dataType = DataType.Timer;
  167. dbNumber = 0;
  168. address = int.Parse(input.Substring(1));
  169. varType = VarType.Counter;
  170. return;
  171. default:
  172. throw new InvalidAddressException(string.Format("{0} is not a valid address", input.Substring(0, 1)));
  173. }
  174. string txt2 = input.Substring(1);
  175. if (txt2.IndexOf(".") == -1)
  176. throw new InvalidAddressException("To few periods for DB address");
  177. address = int.Parse(txt2.Substring(0, txt2.IndexOf(".")));
  178. bitNumber = int.Parse(txt2.Substring(txt2.IndexOf(".") + 1));
  179. if (bitNumber > 7)
  180. throw new InvalidAddressException("Bit can only be 0-7");
  181. return;
  182. }
  183. }
  184. }
  185. }