• PLC连接库MCProtocolLibrary


    1. using System.Net.Sockets;
    2. using System.Net;
    3. using System.Text;
    4. using System.Xml.Linq;
    5. using System;
    6. using System.Collections.Generic;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Threading;
    10. using System.Threading.Tasks;
    11. using System.Data.Common;
    12. using System.Data.SqlClient;
    13. using System.Data;
    14. namespace MCProtocolLibrary
    15. {
    16. public class ConnectPLC
    17. {
    18. private string connection_String;
    19. private string nameFuntion;
    20. public string Connection_String { get => connection_String; set => connection_String = value; }
    21. public string NameFuntion { get => nameFuntion; set => nameFuntion = value; }
    22. //public string TableSaveData { get => tableSaveData; set => tableSaveData = value; }
    23. public ConnectPLC(string inputconnectionstring, string inputNameMachine)
    24. {
    25. connection_String = inputconnectionstring;
    26. nameFuntion = inputNameMachine;
    27. }
    28. public static byte[] Converttextdevicetohexdevice(string namedevice)
    29. {
    30. byte[] bytereturn = null;
    31. byte[] X = { 0x9C };
    32. byte[] Y = { 0x9D };
    33. byte[] M = { 0x90 };
    34. byte[] L = { 0x92 };
    35. byte[] B = { 0xA0 };
    36. byte[] D = { 0xA8 };
    37. byte[] W = { 0xB4 };
    38. byte[] ZR = { 0xB0 };
    39. Dictionary<string, byte[]> data = new Dictionary<string, byte[]>();
    40. data.Add("X", X);
    41. data.Add("Y", Y);
    42. data.Add("M", M);
    43. data.Add("L", L);
    44. data.Add("B", B);
    45. data.Add("D", D);
    46. data.Add("W", W);
    47. data.Add("ZR", ZR);
    48. foreach (var item in data)
    49. {
    50. if (namedevice == item.Key)
    51. {
    52. bytereturn = item.Value;
    53. }
    54. }
    55. return bytereturn;
    56. }
    57. public TemplateData GetTemplateDatas()
    58. {
    59. TemplateData Data = new TemplateData();
    60. // GetConfig
    61. using (SqlConnection conn = new SqlConnection(Connection_String))
    62. {
    63. conn.Open();
    64. SqlCommand cmd = new SqlCommand($"Select * from ConfigConnectToServerNew Where NameFunction = '{nameFuntion}'", conn);
    65. SqlDataAdapter adap = new SqlDataAdapter(cmd);
    66. DataTable dt = new DataTable();
    67. adap.Fill(dt);
    68. if (dt.Rows.Count > 0)
    69. {
    70. Data.NameFunction = (string)dt.Rows[0]["NameFunction"];
    71. Data.IpAddressServer = (string)dt.Rows[0]["IpAddressServer"];
    72. Data.PortServer = (int)dt.Rows[0]["PortServer"];
    73. Data.TypeTriger = (string)dt.Rows[0]["TypeTriger"];
    74. Data.DeviceTriger = (int)dt.Rows[0]["DeviceTriger"];
    75. Data.TypeCompleted = (string)dt.Rows[0]["TypeCompleted"];
    76. Data.DeviceCompleted = (int)dt.Rows[0]["DeviceCompleted"];
    77. for (int i = 7; i < dt.Columns.Count; i += 4)
    78. {
    79. if (dt.Rows[0][i].ToString() != "" && dt.Rows[0][i + 1].ToString() != "0" && dt.Rows[0][i + 2].ToString() != "0" && dt.Rows[0][i + 3].ToString() != "")
    80. Data.Listdataread.Add(new TemplateDataRead()
    81. {
    82. TypeData = (string)dt.Rows[0][i],
    83. DeviceData = (int)dt.Rows[0][i + 1],
    84. LengthData = (int)dt.Rows[0][i + 2],
    85. DataType = (string)dt.Rows[0][i + 3]
    86. });
    87. }
    88. }
    89. conn.Close();
    90. };
    91. return Data;
    92. }
    93. public async Task<string> TempleReadDataPLCASCII(TemplateData DataTemplete, string NameMachine, int Timeout)
    94. {
    95. try
    96. {
    97. using (TcpClient client = new TcpClient())
    98. {
    99. //CMD Get Data Result
    100. byte[] FinalCmdGetData = new byte[21];
    101. byte[] PathCmdGetData = { 0x50, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00 };
    102. //CMD Check Exist Data
    103. byte[] FinalCmdCheckExistData = new byte[21];
    104. byte[] PathCmdCheckExistData = { 0x50, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x00 };
    105. byte[] DeviceCheckExistData = BitConverter.GetBytes(DataTemplete.DeviceTriger);
    106. byte[] TypeDeviceCheckExistData = Converttextdevicetohexdevice(DataTemplete.TypeTriger);
    107. byte[] NumberofDeviceCheckExistData = BitConverter.GetBytes(1);
    108. Buffer.BlockCopy(PathCmdCheckExistData, 0, FinalCmdCheckExistData, 0, PathCmdCheckExistData.Length);
    109. Buffer.BlockCopy(DeviceCheckExistData, 0, FinalCmdCheckExistData, PathCmdCheckExistData.Length, 3);
    110. Buffer.BlockCopy(TypeDeviceCheckExistData, 0, FinalCmdCheckExistData, PathCmdCheckExistData.Length + 3, 1);
    111. Buffer.BlockCopy(NumberofDeviceCheckExistData, 0, FinalCmdCheckExistData, PathCmdCheckExistData.Length + 4, 2);
    112. //CMD Clear Data
    113. byte[] On = { 0x10 };
    114. byte[] FinalCmdClearData = new byte[22];
    115. byte[] PathCmdClearData = { 0x50, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x14, 0x01, 0x00 };
    116. byte[] DeviceClearData = BitConverter.GetBytes(DataTemplete.DeviceCompleted);
    117. byte[] TypeDeviceClearData = Converttextdevicetohexdevice(DataTemplete.TypeCompleted);
    118. byte[] NumberofDeviceClear = { 0x01, 0x00 };
    119. Buffer.BlockCopy(PathCmdClearData, 0, FinalCmdClearData, 0, PathCmdClearData.Length);
    120. Buffer.BlockCopy(DeviceClearData, 0, FinalCmdClearData, PathCmdClearData.Length, 3);
    121. Buffer.BlockCopy(TypeDeviceClearData, 0, FinalCmdClearData, PathCmdClearData.Length + 3, 1);
    122. Buffer.BlockCopy(NumberofDeviceClear, 0, FinalCmdClearData, PathCmdClearData.Length + 4, 2);
    123. Buffer.BlockCopy(On, 0, FinalCmdClearData, PathCmdClearData.Length + 6, 1);
    124. // cancell
    125. CancellationTokenSource writeCancellationToken = new CancellationTokenSource();
    126. CancellationTokenSource readCancellationToken = new CancellationTokenSource();
    127. List<string> listdataread = new List<string>();
    128. int checkexist = 0;
    129. byte[] DataCheckExist = new byte[100];
    130. byte[] BuffData = new byte[100];
    131. byte[] DataClear = new byte[100];
    132. int savedata = 0;
    133. //OpenConnect
    134. CancellationTokenSource connectCancellationToken = new CancellationTokenSource();
    135. Task connectTask = client.ConnectAsync(IPAddress.Parse(DataTemplete.IpAddressServer), DataTemplete.PortServer);
    136. if (await Task.WhenAny(connectTask, Task.Delay(Timeout, connectCancellationToken.Token)) != connectTask)
    137. {
    138. connectCancellationToken.Cancel();
    139. throw new TimeoutException("Error timed out Open Connection .");
    140. }
    141. await connectTask;
    142. NetworkStream stream = client.GetStream();
    143. //Check Exist Data
    144. //
    145. Task writeTask = stream.WriteAsync(FinalCmdCheckExistData, 0, FinalCmdCheckExistData.Length, writeCancellationToken.Token);
    146. if (await Task.WhenAny(writeTask, Task.Delay(Timeout, writeCancellationToken.Token)) != writeTask)
    147. {
    148. writeCancellationToken.Cancel();
    149. throw new TimeoutException("Error Trigger Exist Send timed out.");
    150. }
    151. await writeTask;
    152. Task<int> readTask = stream.ReadAsync(DataCheckExist, 0, DataCheckExist.Length, readCancellationToken.Token);
    153. if (await Task.WhenAny(readTask, Task.Delay(Timeout, readCancellationToken.Token)) != readTask)
    154. {
    155. readCancellationToken.Cancel();
    156. throw new TimeoutException("Error Trigger Exist Receive timed out.");
    157. }
    158. int bytesRead = await readTask;
    159. if (DataCheckExist[9] == 0 && DataCheckExist[10] == 0)
    160. {
    161. checkexist = BitConverter.ToInt32(DataCheckExist, 11);
    162. }
    163. if (checkexist != 0)
    164. {
    165. listdataread.Clear();
    166. foreach (TemplateDataRead item in DataTemplete.Listdataread)
    167. {
    168. Array.Clear(BuffData, 0, BuffData.Length);
    169. byte[] DeviceStoreResult = BitConverter.GetBytes(item.DeviceData);
    170. byte[] TypeDeviceStoreResult = Converttextdevicetohexdevice(item.TypeData);
    171. byte[] LengthDeviceStoreResult = BitConverter.GetBytes(item.LengthData);
    172. Buffer.BlockCopy(PathCmdGetData, 0, FinalCmdGetData, 0, PathCmdGetData.Length);
    173. Buffer.BlockCopy(DeviceStoreResult, 0, FinalCmdGetData, PathCmdGetData.Length, 3);
    174. Buffer.BlockCopy(TypeDeviceStoreResult, 0, FinalCmdGetData, PathCmdGetData.Length + 3, 1);
    175. Buffer.BlockCopy(LengthDeviceStoreResult, 0, FinalCmdGetData, PathCmdGetData.Length + 4, 2);
    176. Task writeTaskCabi = stream.WriteAsync(FinalCmdGetData, 0, FinalCmdGetData.Length, writeCancellationToken.Token);
    177. if (await Task.WhenAny(writeTask, Task.Delay(Timeout, writeCancellationToken.Token)) != writeTask)
    178. {
    179. writeCancellationToken.Cancel();
    180. throw new TimeoutException("Error Data Cabi Send timed out.");
    181. }
    182. await writeTaskCabi;
    183. Task<int> readTaskCabi = stream.ReadAsync(BuffData, 0, BuffData.Length, readCancellationToken.Token);
    184. if (await Task.WhenAny(readTask, Task.Delay(Timeout, readCancellationToken.Token)) != readTask)
    185. {
    186. readCancellationToken.Cancel();
    187. throw new TimeoutException("Error Data Cabi Receive timed out.");
    188. }
    189. int bytesReadCabi = await readTaskCabi;
    190. if (BuffData[9] == 0 && BuffData[10] == 0)
    191. {
    192. if (item.DataType == "Float")
    193. {
    194. byte[] buff1 = new byte[] { BuffData[11], BuffData[12], BuffData[13], BuffData[14]};
    195. float fl = BitConverter.ToSingle(buff1, 0);
    196. listdataread.Add(fl.ToString());
    197. }
    198. else if (item.DataType == "DEC")
    199. {
    200. byte[] buff1 = new byte[] { BuffData[11], BuffData[12], BuffData[13], BuffData[14] };
    201. int Dec = BitConverter.ToInt32(buff1,0);
    202. listdataread.Add(Dec.ToString());
    203. }
    204. else
    205. {
    206. string datastr = Encoding.ASCII.GetString(BuffData, 11, findnull(BuffData)).Trim('\0').Trim('\r').Trim('\n');
    207. listdataread.Add(datastr);
    208. }
    209. }
    210. }
    211. if (listdataread.Count > 0)
    212. {
    213. int countdata = listdataread.Count;
    214. if (countdata < 20)
    215. {
    216. for (int i = countdata; i < 20; i++)
    217. {
    218. listdataread.Add("");
    219. }
    220. }
    221. // lưu dữ liệu
    222. using (SqlConnection conn = new SqlConnection(Connection_String))
    223. {
    224. conn.Open();
    225. string query = "";
    226. //if (listdataread[0].Length >= 19 && listdataread[0].Contains("NR"))
    227. //{
    228. // query = $"Insert into {DataTemplete.NameFunction} (Data1, Data2, Data3, Data4, Data5,Data6,Data7,Data8, Data9, Data10, Data11, Data12,Data13,Data14,Data15, Data16, Data17, Data18, Data19,Data20, TimeUpdate) Values('{listdataread[0].Substring(0, 12)}','{listdataread[1]}','{listdataread[2]}','{listdataread[3]}','{listdataread[4]}','{listdataread[5]}','{listdataread[6]}','{listdataread[7]}','{listdataread[8]}','{listdataread[9]}','{listdataread[10]}','{listdataread[11]}','{listdataread[12]}','{listdataread[13]}','{listdataread[14]}','{listdataread[15]}','{listdataread[16]}','{listdataread[17]}','{listdataread[18]}','{listdataread[19]}','{DateTime.Now}') ";
    229. //}
    230. //else
    231. //{
    232. query = $"Insert into {DataTemplete.NameFunction} (Data1, Data2, Data3, Data4, Data5,Data6,Data7,Data8, Data9, Data10, Data11, Data12,Data13,Data14,Data15, Data16, Data17, Data18, Data19,Data20, TimeUpdate) Values('{listdataread[0]}','{listdataread[1]}','{listdataread[2]}','{listdataread[3]}','{listdataread[4]}','{listdataread[5]}','{listdataread[6]}','{listdataread[7]}','{listdataread[8]}','{listdataread[9]}','{listdataread[10]}','{listdataread[11]}','{listdataread[12]}','{listdataread[13]}','{listdataread[14]}','{listdataread[15]}','{listdataread[16]}','{listdataread[17]}','{listdataread[18]}','{listdataread[19]}','{DateTime.Now}') ";
    233. //}
    234. SqlCommand cmd = new SqlCommand(query, conn);
    235. savedata = cmd.ExecuteNonQuery();
    236. conn.Close();
    237. };
    238. // Xóa dữ liệu PLC
    239. if (savedata > 0)
    240. {
    241. Task writeTaskClear = stream.WriteAsync(FinalCmdClearData, 0, FinalCmdClearData.Length, writeCancellationToken.Token);
    242. if (await Task.WhenAny(writeTask, Task.Delay(Timeout, writeCancellationToken.Token)) != writeTask)
    243. {
    244. writeCancellationToken.Cancel();
    245. throw new TimeoutException("Error Confirm Completed Send timed out.");
    246. }
    247. await writeTaskClear;
    248. Task<int> readTaskClear = stream.ReadAsync(DataClear, 0, DataClear.Length, readCancellationToken.Token);
    249. if (await Task.WhenAny(readTask, Task.Delay(Timeout, readCancellationToken.Token)) != readTask)
    250. {
    251. readCancellationToken.Cancel();
    252. throw new TimeoutException("Error Confirm Completed Receive timed out.");
    253. }
    254. int bytesReadClear = await readTaskClear;
    255. }
    256. }
    257. }
    258. client.Close();
    259. }
    260. }
    261. catch (Exception ex)
    262. {
    263. return DateTime.Now.ToString() + "," + NameMachine + "," + ex.Message;
    264. }
    265. return "Finish";
    266. }
    267. public int findnull(byte[] input)
    268. {
    269. int index = 0;
    270. for (int i = 11; i < input.Length; i++)
    271. {
    272. if (input[i] < 33 || input[i] > 126 )
    273. {
    274. return index;
    275. }
    276. index++;
    277. }
    278. return 80;
    279. }
    280. }
    281. }

  • 相关阅读:
    电脑是怎样上网的 (二) 从网线到网络设备
    【Linux学习笔记】代码编辑工具vim
    GitHub验证的2FA
    【数据分享】厦门市共享单车数据
    操作DAC模块
    Selenium自动访问Firefox和Chrome并实现搜索截图
    Python大作业——爬虫+可视化+数据分析+数据库(可视化篇)
    只许州官放火不许百姓点灯--CSDN博客停更并陆续删除通知
    Python语言程序设计 习题3
    Flink实时数仓之用户埋点系统(一)
  • 原文地址:https://blog.csdn.net/xdpcxq1029/article/details/134475657