McAddressData.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace TFT_MelsecMcNet
  5. {
  6. /// <summary>
  7. /// 三菱的数据地址表示形式
  8. /// </summary>
  9. public class McAddressData : DeviceAddressDataBase
  10. {
  11. #region Constructor
  12. /// <summary>
  13. /// 实例化一个默认的对象
  14. /// </summary>
  15. public McAddressData()
  16. {
  17. McDataType = MelsecMcDataType.D;
  18. }
  19. #endregion
  20. /// <summary>
  21. /// 三菱的数据地址信息
  22. /// </summary>
  23. public MelsecMcDataType McDataType { get; set; }
  24. /// <summary>
  25. /// 从指定的地址信息解析成真正的设备地址信息,默认是三菱的地址
  26. /// </summary>
  27. /// <param name="address">地址信息</param>
  28. /// <param name="length">数据长度</param>
  29. public override void Parse(string address, ushort length)
  30. {
  31. OperateResult<McAddressData> addressData = ParseMelsecFrom(address, length);
  32. if (addressData.IsSuccess)
  33. {
  34. AddressStart = addressData.Content.AddressStart;
  35. Length = addressData.Content.Length;
  36. McDataType = addressData.Content.McDataType;
  37. }
  38. }
  39. #region Static Method
  40. /// <summary>
  41. /// 从实际三菱的地址里面解析出
  42. /// </summary>
  43. /// <param name="address">三菱的地址数据信息</param>
  44. /// <param name="length">读取的数据长度</param>
  45. /// <returns>是否成功的结果对象</returns>
  46. public static OperateResult<McAddressData> ParseMelsecFrom(string address, ushort length)
  47. {
  48. McAddressData addressData = new McAddressData
  49. {
  50. Length = length
  51. };
  52. try
  53. {
  54. switch (address[0])
  55. {
  56. case 'M':
  57. case 'm':
  58. {
  59. addressData.McDataType = MelsecMcDataType.M;
  60. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.M.FromBase);
  61. break;
  62. }
  63. case 'X':
  64. case 'x':
  65. {
  66. addressData.McDataType = MelsecMcDataType.X;
  67. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.X.FromBase);
  68. break;
  69. }
  70. case 'Y':
  71. case 'y':
  72. {
  73. addressData.McDataType = MelsecMcDataType.Y;
  74. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Y.FromBase);
  75. break;
  76. }
  77. case 'D':
  78. case 'd':
  79. {
  80. addressData.McDataType = MelsecMcDataType.D;
  81. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.D.FromBase);
  82. break;
  83. }
  84. case 'W':
  85. case 'w':
  86. {
  87. addressData.McDataType = MelsecMcDataType.W;
  88. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.W.FromBase);
  89. break;
  90. }
  91. case 'L':
  92. case 'l':
  93. {
  94. addressData.McDataType = MelsecMcDataType.L;
  95. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.L.FromBase);
  96. break;
  97. }
  98. case 'F':
  99. case 'f':
  100. {
  101. addressData.McDataType = MelsecMcDataType.F;
  102. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.F.FromBase);
  103. break;
  104. }
  105. case 'V':
  106. case 'v':
  107. {
  108. addressData.McDataType = MelsecMcDataType.V;
  109. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.V.FromBase);
  110. break;
  111. }
  112. case 'B':
  113. case 'b':
  114. {
  115. addressData.McDataType = MelsecMcDataType.B;
  116. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.B.FromBase);
  117. break;
  118. }
  119. case 'R':
  120. case 'r':
  121. {
  122. addressData.McDataType = MelsecMcDataType.R;
  123. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.R.FromBase);
  124. break;
  125. }
  126. case 'S':
  127. case 's':
  128. {
  129. if (address[1] == 'N' || address[1] == 'n')
  130. {
  131. addressData.McDataType = MelsecMcDataType.SN;
  132. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.SN.FromBase);
  133. break;
  134. }
  135. else if (address[1] == 'S' || address[1] == 's')
  136. {
  137. addressData.McDataType = MelsecMcDataType.SS;
  138. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.SS.FromBase);
  139. break;
  140. }
  141. else if (address[1] == 'C' || address[1] == 'c')
  142. {
  143. addressData.McDataType = MelsecMcDataType.SC;
  144. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.SC.FromBase);
  145. break;
  146. }
  147. else
  148. {
  149. addressData.McDataType = MelsecMcDataType.S;
  150. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.S.FromBase);
  151. break;
  152. }
  153. }
  154. case 'Z':
  155. case 'z':
  156. {
  157. if (address.StartsWith("ZR") || address.StartsWith("zr"))
  158. {
  159. addressData.McDataType = MelsecMcDataType.ZR;
  160. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.ZR.FromBase);
  161. break;
  162. }
  163. else
  164. {
  165. addressData.McDataType = MelsecMcDataType.Z;
  166. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Z.FromBase);
  167. break;
  168. }
  169. }
  170. case 'T':
  171. case 't':
  172. {
  173. if (address[1] == 'N' || address[1] == 'n')
  174. {
  175. addressData.McDataType = MelsecMcDataType.TN;
  176. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.TN.FromBase);
  177. break;
  178. }
  179. else if (address[1] == 'S' || address[1] == 's')
  180. {
  181. addressData.McDataType = MelsecMcDataType.TS;
  182. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.TS.FromBase);
  183. break;
  184. }
  185. else if (address[1] == 'C' || address[1] == 'c')
  186. {
  187. addressData.McDataType = MelsecMcDataType.TC;
  188. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.TC.FromBase);
  189. break;
  190. }
  191. else
  192. {
  193. throw new Exception(StringResources.Language.NotSupportedDataType);
  194. }
  195. }
  196. case 'C':
  197. case 'c':
  198. {
  199. if (address[1] == 'N' || address[1] == 'n')
  200. {
  201. addressData.McDataType = MelsecMcDataType.CN;
  202. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.CN.FromBase);
  203. break;
  204. }
  205. else if (address[1] == 'S' || address[1] == 's')
  206. {
  207. addressData.McDataType = MelsecMcDataType.CS;
  208. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.CS.FromBase);
  209. break;
  210. }
  211. else if (address[1] == 'C' || address[1] == 'c')
  212. {
  213. addressData.McDataType = MelsecMcDataType.CC;
  214. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.CC.FromBase);
  215. break;
  216. }
  217. else
  218. {
  219. throw new Exception(StringResources.Language.NotSupportedDataType);
  220. }
  221. }
  222. default: throw new Exception(StringResources.Language.NotSupportedDataType);
  223. }
  224. }
  225. catch (Exception ex)
  226. {
  227. return new OperateResult<McAddressData>(ex.Message);
  228. }
  229. return OperateResult.CreateSuccessResult(addressData);
  230. }
  231. /// <summary>
  232. /// 从实际基恩士的地址里面解析出
  233. /// </summary>
  234. /// <param name="address">基恩士的地址数据信息</param>
  235. /// <param name="length">读取的数据长度</param>
  236. /// <returns>是否成功的结果对象</returns>
  237. public static OperateResult<McAddressData> ParseKeyenceFrom(string address, ushort length)
  238. {
  239. McAddressData addressData = new McAddressData();
  240. addressData.Length = length;
  241. try
  242. {
  243. switch (address[0])
  244. {
  245. case 'M':
  246. case 'm':
  247. {
  248. addressData.McDataType = MelsecMcDataType.Keyence_M;
  249. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_M.FromBase);
  250. break;
  251. }
  252. case 'X':
  253. case 'x':
  254. {
  255. addressData.McDataType = MelsecMcDataType.Keyence_X;
  256. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_X.FromBase);
  257. break;
  258. }
  259. case 'Y':
  260. case 'y':
  261. {
  262. addressData.McDataType = MelsecMcDataType.Keyence_Y;
  263. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_Y.FromBase);
  264. break;
  265. }
  266. case 'B':
  267. case 'b':
  268. {
  269. addressData.McDataType = MelsecMcDataType.Keyence_B;
  270. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_B.FromBase);
  271. break;
  272. }
  273. case 'L':
  274. case 'l':
  275. {
  276. addressData.McDataType = MelsecMcDataType.Keyence_L;
  277. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_L.FromBase);
  278. break;
  279. }
  280. case 'S':
  281. case 's':
  282. {
  283. if (address[1] == 'M' || address[1] == 'm')
  284. {
  285. addressData.McDataType = MelsecMcDataType.Keyence_SM;
  286. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_SM.FromBase);
  287. break;
  288. }
  289. else if (address[1] == 'D' || address[1] == 'd')
  290. {
  291. addressData.McDataType = MelsecMcDataType.Keyence_SD;
  292. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_SD.FromBase);
  293. break;
  294. }
  295. else
  296. {
  297. throw new Exception(StringResources.Language.NotSupportedDataType);
  298. }
  299. }
  300. case 'D':
  301. case 'd':
  302. {
  303. addressData.McDataType = MelsecMcDataType.Keyence_D;
  304. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_D.FromBase);
  305. break;
  306. }
  307. case 'R':
  308. case 'r':
  309. {
  310. addressData.McDataType = MelsecMcDataType.Keyence_R;
  311. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_R.FromBase);
  312. break;
  313. }
  314. case 'Z':
  315. case 'z':
  316. {
  317. if (address[1] == 'R' || address[1] == 'r')
  318. {
  319. addressData.McDataType = MelsecMcDataType.Keyence_ZR;
  320. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_ZR.FromBase);
  321. break;
  322. }
  323. else
  324. {
  325. throw new Exception(StringResources.Language.NotSupportedDataType);
  326. }
  327. }
  328. case 'W':
  329. case 'w':
  330. {
  331. addressData.McDataType = MelsecMcDataType.Keyence_W;
  332. addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_W.FromBase);
  333. break;
  334. }
  335. case 'T':
  336. case 't':
  337. {
  338. if (address[1] == 'N' || address[1] == 'n')
  339. {
  340. addressData.McDataType = MelsecMcDataType.Keyence_TN;
  341. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_TN.FromBase);
  342. break;
  343. }
  344. else if (address[1] == 'S' || address[1] == 's')
  345. {
  346. addressData.McDataType = MelsecMcDataType.Keyence_TS;
  347. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_TS.FromBase);
  348. break;
  349. }
  350. else
  351. {
  352. throw new Exception(StringResources.Language.NotSupportedDataType);
  353. }
  354. }
  355. case 'C':
  356. case 'c':
  357. {
  358. if (address[1] == 'N' || address[1] == 'n')
  359. {
  360. addressData.McDataType = MelsecMcDataType.Keyence_CN;
  361. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_CN.FromBase);
  362. break;
  363. }
  364. else if (address[1] == 'S' || address[1] == 's')
  365. {
  366. addressData.McDataType = MelsecMcDataType.Keyence_CS;
  367. addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_CS.FromBase);
  368. break;
  369. }
  370. else
  371. {
  372. throw new Exception(StringResources.Language.NotSupportedDataType);
  373. }
  374. }
  375. default: throw new Exception(StringResources.Language.NotSupportedDataType);
  376. }
  377. }
  378. catch (Exception ex)
  379. {
  380. return new OperateResult<McAddressData>(ex.Message);
  381. }
  382. return OperateResult.CreateSuccessResult(addressData);
  383. }
  384. /// <summary>
  385. /// 计算松下的MC协议的偏移地址的机制
  386. /// </summary>
  387. /// <param name="address">字符串形式的地址</param>
  388. /// <returns>实际的偏移地址</returns>
  389. public static int GetPanasonicAddress(string address)
  390. {
  391. if (address.IndexOf('.') > 0)
  392. {
  393. string[] values = address.Split('.');
  394. return Convert.ToInt32(values[0]) * 16 + Convert.ToInt32(values[1]);
  395. }
  396. else
  397. {
  398. return Convert.ToInt32(address.Substring(0, address.Length - 1)) * 16 + Convert.ToInt32(address.Substring(address.Length - 1), 16);
  399. }
  400. }
  401. /// <summary>
  402. /// 从实际松下的地址里面解析出
  403. /// </summary>
  404. /// <param name="address">松下的地址数据信息</param>
  405. /// <param name="length">读取的数据长度</param>
  406. /// <returns>是否成功的结果对象</returns>
  407. public static OperateResult<McAddressData> ParsePanasonicFrom(string address, ushort length)
  408. {
  409. McAddressData addressData = new McAddressData();
  410. addressData.Length = length;
  411. try
  412. {
  413. switch (address[0])
  414. {
  415. case 'R':
  416. case 'r':
  417. {
  418. int add = GetPanasonicAddress(address.Substring(1));
  419. if (add < 14400)
  420. {
  421. addressData.McDataType = MelsecMcDataType.Panasonic_R;
  422. addressData.AddressStart = add;
  423. }
  424. else
  425. {
  426. addressData.McDataType = MelsecMcDataType.Panasonic_SM;
  427. addressData.AddressStart = add - 14400;
  428. }
  429. break;
  430. }
  431. case 'X':
  432. case 'x':
  433. {
  434. addressData.McDataType = MelsecMcDataType.Panasonic_X;
  435. addressData.AddressStart = GetPanasonicAddress(address.Substring(1));
  436. break;
  437. }
  438. case 'Y':
  439. case 'y':
  440. {
  441. addressData.McDataType = MelsecMcDataType.Panasonic_Y;
  442. addressData.AddressStart = GetPanasonicAddress(address.Substring(1));
  443. break;
  444. }
  445. case 'L':
  446. case 'l':
  447. {
  448. if (address[1] == 'D' || address[1] == 'd')
  449. {
  450. addressData.McDataType = MelsecMcDataType.Panasonic_LD;
  451. addressData.AddressStart = Convert.ToInt32(address.Substring(2));
  452. break;
  453. }
  454. else
  455. {
  456. addressData.McDataType = MelsecMcDataType.Panasonic_L;
  457. addressData.AddressStart = GetPanasonicAddress(address.Substring(1));
  458. }
  459. break;
  460. }
  461. case 'D':
  462. case 'd':
  463. {
  464. int add = Convert.ToInt32(address.Substring(1));
  465. if (add < 90000)
  466. {
  467. addressData.McDataType = MelsecMcDataType.Panasonic_DT;
  468. addressData.AddressStart = Convert.ToInt32(address.Substring(1));
  469. }
  470. else
  471. {
  472. addressData.McDataType = MelsecMcDataType.Panasonic_SD;
  473. addressData.AddressStart = Convert.ToInt32(address.Substring(1)) - 90000;
  474. }
  475. break;
  476. }
  477. case 'T':
  478. case 't':
  479. {
  480. if (address[1] == 'N' || address[1] == 'n')
  481. {
  482. addressData.McDataType = MelsecMcDataType.Panasonic_TN;
  483. addressData.AddressStart = Convert.ToInt32(address.Substring(2));
  484. break;
  485. }
  486. else if (address[1] == 'S' || address[1] == 's')
  487. {
  488. addressData.McDataType = MelsecMcDataType.Panasonic_TS;
  489. addressData.AddressStart = Convert.ToInt32(address.Substring(2));
  490. break;
  491. }
  492. else
  493. {
  494. throw new Exception(StringResources.Language.NotSupportedDataType);
  495. }
  496. }
  497. case 'C':
  498. case 'c':
  499. {
  500. if (address[1] == 'N' || address[1] == 'n')
  501. {
  502. addressData.McDataType = MelsecMcDataType.Panasonic_CN;
  503. addressData.AddressStart = Convert.ToInt32(address.Substring(2));
  504. break;
  505. }
  506. else if (address[1] == 'S' || address[1] == 's')
  507. {
  508. addressData.McDataType = MelsecMcDataType.Panasonic_CS;
  509. addressData.AddressStart = Convert.ToInt32(address.Substring(2));
  510. break;
  511. }
  512. else
  513. {
  514. throw new Exception(StringResources.Language.NotSupportedDataType);
  515. }
  516. }
  517. default: throw new Exception(StringResources.Language.NotSupportedDataType);
  518. }
  519. }
  520. catch (Exception ex)
  521. {
  522. return new OperateResult<McAddressData>(ex.Message);
  523. }
  524. return OperateResult.CreateSuccessResult(addressData);
  525. }
  526. #endregion
  527. }
  528. }