using Opc.Ua; using Opc.Ua.Client; using System; using System.Collections.Generic; using System.Linq; using SinumerikOpcUaAPI; using System.Text; namespace OPCUA.Device { public class DeviceOPCUat { Server opcserver; EndpointDescription endpointDescription; public bool IsOn { get; set; } = false; public DeviceOPCUat(string url, string username = "OpcUaClient", string pwd = "12345678") { if (opcserver == null || !opcserver.Session.Connected) { IsOn = OpcUa_Connection(url, username, pwd); YG.Log.Instance.WriteLogAdd("OPCUA 连接是否成功===>>" + IsOn); } } public bool IsConnection { get; set; } = false; private void Notification_KeepAlive(Session sender, KeepAliveEventArgs e) { try { if (sender != this.opcserver.Session || !ServiceResult.IsBad(e.Status)) return; this.opcserver.Session.Reconnect(); YG.Log.Instance.WriteLogAdd($"35----->>----->>----->>----->>----->>----->>----->>----->>----->>----->>----->>Notification_KeepAlive"); IsConnection = true; } catch (Exception ex) { IsConnection = false; YG.Log.Instance.WriteLogAdd($"41-->>{ex.Message}"); } } /// /// 获取NC下边的文件列表 /// /// public ReferenceDescriptionCollection OpcUa_BrowseNode() { return opcserver.BrowseNode(new NodeId("Sinumerik/FileSystem/NCExtend/webApiMESFILE/", (ushort)2).ToString()); } #region 终止连接 public void OpcUa_Close() { if (OpcUa_ConState()) { opcserver.Disconnect(); } } private bool OpcUa_ConState() { if (opcserver != null && opcserver.Session.Connected) { return true; } else { YG.Log.Instance.WriteLogAdd("OPC没有连接"); } return false; } #endregion #region 写入 public bool OpcUa_Write(string address, object value) { try { if (OpcUa_ConState()) { opcserver.WriteValues(new List() { value.ToString() }, new List() { address }); return true; } return false; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"92-->{ex.Message}"); return false; } } public bool OpcUa_WriteValue(string address, object value) { try { string str = new NodeId(address, (ushort)2).ToString(); if (OpcUa_ConState()) { opcserver.WriteValues(new List() { value.ToString() }, new List() { str }); return true; } return false; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"110->{ex.Message}"); return false; } } public bool OpcUa_WriteValue(List addresses, List values) { try { if (OpcUa_ConState()) { opcserver.WriteValues(addresses, values); return true; } return false; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"110->{ex.Message}"); return false; } } #endregion #region 选中 public bool OpcUa_Select(string filename) { bool result = false; try { if (OpcUa_ConState()) { string extension = System.IO.Path.GetExtension(filename); if (string.IsNullOrWhiteSpace(extension) || !extension.ToUpper().Equals(".MPF")) { // System.Windows.Forms.MessageBox.Show("请选择要上传的文件"); return false; } try { string value = opcserver.MethodCallSelectProgram(filename, Convert.ToUInt32(1)).status; if (value.Equals("Good")) { result = true; } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"{ex.Message}"); //System.Windows.Forms.MessageBox.Show($"{ex.Message}"); } } return result; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"154--->{ex.Message}"); return false; } } public bool OpcUa_Select(string path, string filename) { bool result = false; try { if (OpcUa_ConState()) { string extension = System.IO.Path.GetExtension(filename); if (string.IsNullOrWhiteSpace(extension) || !extension.ToUpper().Equals(".MPF")) { //System.Windows.Forms.MessageBox.Show("请选择要上传的文件"); return false; } try { string value = opcserver.MethodCallSelectProgram(path + filename, Convert.ToUInt32(1)).status; if (value.Equals("Good")) { result = true; } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"182-->{ex.Message}"); //System.Windows.Forms.MessageBox.Show($"{ex.Message}"); } } return result; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"192-->{ex.Message}"); return false; } } #endregion #region 读取 public bool OpcUa_Read(string address, out string value) { bool result = false; value = ""; if (OpcUa_ConState()) { try { string itemaddress = $"/Plc/{address}"; string str = new NodeId(itemaddress, (ushort)2).ToString(); if (opcserver != null && opcserver.Session.Connected) { value = opcserver.ReadValues(new List() { str })[0]; } result = true; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"{ex.Message}"); //System.Windows.Forms.MessageBox.Show($"{ex.Message}"); } } return result; } /// /// /// /// list里边的地址格式为I2.0,I2.1,DB2.DBX35.0等格式 /// 查询出来的值和上面的值是一一对应的关系 /// public bool OpcUa_Read(List address, out List value) { value = new List(); try { List nodeIdStrings = new List(); foreach (string s in address) { nodeIdStrings.Add(new NodeId($"/Plc/{s}", (ushort)2).ToString()); } if (opcserver != null && opcserver.Session.Connected) { value = opcserver.ReadValues(nodeIdStrings); } return true; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"{ex.Message}"); //System.Windows.Forms.MessageBox.Show($"{ex.Message}"); return false; } } public List OpcUa_Read(List address) { List value = new List(); try { List nodeIdStrings = new List(); if (opcserver != null && opcserver.Session != null && opcserver.Session.Connected) { value = opcserver.ReadValues(nodeIdStrings); } return value; } catch (Exception ex) { try { OpcUa_Connection(opcserver.Session.ConfiguredEndpoint.ToString()); } catch (Exception esx) { YG.Log.Instance.WriteLogAdd($"284------->>esx---->{esx.Message} {ex.Message}--->>>"); } return value; } } public bool OpcUa_Read(List address, out Dictionary value) { value = new Dictionary(); try { List nodeIdStrings = new List(); foreach (string s in address) { nodeIdStrings.Add(new NodeId($"/Plc/{s}", (ushort)2).ToString()); value.Add(s, ""); } if (opcserver != null && opcserver.Session.Connected) { List Keys = value.Keys.ToList(); List items = opcserver.ReadValues(nodeIdStrings); for (int i = 0; i < items.Count; i++) { value[Keys[i]] = items[i]; } } return true; } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"{ex.Message}"); //System.Windows.Forms.MessageBox.Show($"{ex.Message}"); return false; } } #endregion #region OPCUA连接 /// /// 连接opcua /// /// /// /// public bool OpcUa_Connection(string url, string username = "OpcUaClient", string pwd = "12345678") { bool result = false; try { opcserver = new Server(); ApplicationDescriptionCollection applicationDescriptions = opcserver.FindServers(url); if (applicationDescriptions.Count == 0) { YG.Log.Instance.WriteLogAdd("没有找到服务!"); } else if (applicationDescriptions.Count == 1) { applicationDescriptions[0].DiscoveryUrls.Where(m => m.Equals(url)).FirstOrDefault().FirstOrDefaultYG( (t) => { try { var cc = opcserver.GetEndpoints(t); opcserver.GetEndpoints(t).Where(n => n.EndpointUrl.Equals(url)).FirstOrDefault().FirstOrDefaultYG((tt) => { try { endpointDescription = tt; opcserver.KeepAliveNotification += new KeepAliveEventHandler(this.Notification_KeepAlive); opcserver.Connect(tt, true, username, pwd); if (opcserver.Session.Connected) { IsConnection = true; result = true; } else { result = false; } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"355-->{ex.Message}"); result = false; } }); } catch (Exception ext) { YG.Log.Instance.WriteLogAdd($"362-->{ext.Message}"); } }); } } catch (Exception eex) { YG.Log.Instance.WriteLogAdd($"368-->{eex.Message}-->{url}"); } return result; } /// /// 连接opcua /// /// /// /// public static Server OpcUa_Connection1(string url, string username = "OpcUaClient", string pwd = "12345678") { Server serverOpcUa = new Server(); try { ApplicationDescriptionCollection applicationDescriptions = serverOpcUa.FindServers(url); if (applicationDescriptions.Count == 0) { YG.Log.Instance.WriteLogAdd("没有找到服务!"); } else if (applicationDescriptions.Count == 1) { applicationDescriptions[0].DiscoveryUrls.Where(m => m.Equals(url)).FirstOrDefault().FirstOrDefaultYG( (t) => { try { var cc = serverOpcUa.GetEndpoints(t); serverOpcUa.GetEndpoints(t).Where(n => n.EndpointUrl.Equals(url)).FirstOrDefault().FirstOrDefaultYG((tt) => { try { serverOpcUa.Connect(tt, true, username, pwd); } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"355-->{ex.Message}"); } }); } catch (Exception ext) { YG.Log.Instance.WriteLogAdd($"362-->{ext.Message}"); } }); } } catch (Exception eex) { YG.Log.Instance.WriteLogAdd($"368-->{eex.Message}-->{url}"); } return serverOpcUa; } #endregion #region 添加用户权限 /// /// 添加用户权限 /// /// public bool OpcUa_Access(string username = "OpcUaClient") { bool resultb = true; if (OpcUa_ConState()) { try { string result = ""; string strValue = "StateRead,StateWrite,FrameRead,FrameWrite,SeaRead,SeaWrite,TeaRead,TeaWrite,ToolRead,ToolWrite,DriveRead,DriveWrite,GudRead,GudWrite,PlcRead,PlcWrite,AlarmRead,FsRead,FsWrite,ApWrite,CsomReadx,CsomWritex,PlcReadDBx,PlcWriteDBx,SinuReadAll,SinuWriteAll"; { string[] vs = strValue.Split(new string[] { "," }, StringSplitOptions.None); foreach (string s in vs) { Server.MethodCallResult methodCallResult = opcserver.MethodCall("/Methods/GiveUserAccess", username, s); if (methodCallResult != null && !methodCallResult.status.Equals("Good")) { result += s + methodCallResult.status; } } } if (result.Length > 0) { resultb = false; YG.Log.Instance.WriteLogAdd($"执行权限添加是出现异常:{result}"); } } catch (Exception ex) { resultb = false; YG.Log.Instance.WriteLogAdd($"409-->{ex.Message}"); } } return resultb; } #endregion #region 上传文件 /// /// 上传文件,不能是文件夹,只能是一个文件,已经默认了一个文件位置, 如果有其他需求后期做调整 /// /// 需要上传的文件的名字,这个名字是有后缀的, public void OpcUa_UpLoadFile(string file) { try { string extension = System.IO.Path.GetExtension(file); if (string.IsNullOrWhiteSpace(extension)) { //System.Windows.Forms.MessageBox.Show("请选择要上传的文件"); return; } try { opcserver.MethodCallCreateNewFile("Sinumerik/FileSystem/NCExtend/webApiMESFILE/", System.IO.Path.GetFileName(file), true); byte[] data = opcserver.ReadFile(file); int copylen = 5000; bool isover = true; byte[] bt = new byte[copylen]; if (data.Length > copylen) { int runcount = data.Length / copylen; for (int i = 0; i < runcount; i++) { Array.Copy(data, i * copylen, bt, 0, copylen); if (i > 0) { isover = false; } var cc = opcserver.MethodCallCopyFileToServer($"/Methods/CopyFileToServer", $"Sinumerik/FileSystem/NCExtend/webApiMESFILE/{System.IO.Path.GetFileName(file)}", data, isover); System.Console.WriteLine($"当前循环到的位置:{i}-->>{cc.status}"); } int lastleng = data.Length % copylen; bt = new byte[lastleng]; Array.Copy(data, runcount * copylen, bt, 0, lastleng); Server.MethodCallResult methodCallResult = opcserver.MethodCallCopyFileToServer($"/Methods/CopyFileToServer", $"Sinumerik/FileSystem/NCExtend/webApiMESFILE/{System.IO.Path.GetFileName(file)}", data, isover); if (methodCallResult.status.ToUpper().Equals("GOOD")) { YG.Log.Instance.WriteLogAdd("上传文件成功"); } else { YG.Log.Instance.WriteLogAdd("上传文件失败"); } } else { Server.MethodCallResult methodCallResult = opcserver.MethodCallCopyFileToServer($"/Methods/CopyFileToServer", $"Sinumerik/FileSystem/NCExtend/webApiMESFILE/{System.IO.Path.GetFileName(file)}", data, isover); if (methodCallResult.status.ToUpper().Equals("GOOD")) { YG.Log.Instance.WriteLogAdd("上传文件成功"); } else { YG.Log.Instance.WriteLogAdd("上传文件失败"); } } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"{ex.Message}"); //System.Windows.Forms.MessageBox.Show($"{ex.Message}"); } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}"); } } #endregion #region 删除文件 /// /// 删除文件,只能是一个文件,已经默认了一个文件位置, 如果有其他需求后期做调整 /// /// 需要删除的文件的名字,这个名字是有后缀的 public void OpcUa_DeleteFile(string file) { try { Server.MethodCallResult methodCallResult = opcserver.MethodCallDeleteFile($"Sinumerik/FileSystem/NCExtend/webApiMESFILE/{file}"); if (methodCallResult.status.ToUpper().Equals("GOOD")) { YG.Log.Instance.WriteLogAdd("删除文件成功"); } else { YG.Log.Instance.WriteLogAdd("删除文件失败"); } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"519-->{ex.Message}"); } } public string OpcUa_DeleteFile(string path, string file) { string status = ""; try { status = opcserver.MethodCallDeleteFile(path + file).status; if (status.ToUpper().Equals("GOOD")) { YG.Log.Instance.WriteLogAdd("删除文件成功"); } else { YG.Log.Instance.WriteLogAdd("删除文件失败"); } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"539-->{ex.Message}"); } return status; } #endregion #region 创建文件目录 /// /// 创建文件目录,, /// /// 类似于文件夹名称 public void OpcUa_CreateNewFile(string file = "webApiMESFILE") { try { Server.MethodCallResult methodCallResult = opcserver.MethodCallCreateNewDir($"Sinumerik/FileSystem/NCExtend", file); if (methodCallResult.status.ToUpper().Equals("GOOD")) { YG.Log.Instance.WriteLogAdd("删除文件成功"); } else { YG.Log.Instance.WriteLogAdd("删除文件失败"); } } catch (Exception ex) { YG.Log.Instance.WriteLogAdd($"565-->{ex.Message}"); } } #endregion public void disConnect() { if (opcserver.Session.Connected) { opcserver.Disconnect(); } } } }