| | |
| | | using LB_SmartVision.Forms.Pages; |
| | | using LB_SmartVision.Forms.Pages.CameraPage; |
| | | using LB_SmartVision.Forms.Pages.CommunicatorPage; |
| | | using LB_SmartVision.Forms.Pages.HistoricalData; |
| | | using LB_SmartVision.Forms.Pages.MESPage; |
| | | using LB_SmartVision.Forms.Pages.MotionControlPage; |
| | | using LB_SmartVision.Forms.Pages.ProcessPage; |
| | |
| | | using LB_VisionProcesses.Cameras; |
| | | using LB_VisionProcesses.Cameras.HRCameras; |
| | | using LB_VisionProcesses.Communicators; |
| | | using LB_VisionProcesses.Communicators.SiemensS7; |
| | | using LB_VisionProcesses.Communicators.TCom; |
| | | using LB_VisionProcesses.Forms; |
| | | using log4net.Config; |
| | |
| | | { |
| | | public partial class VisionForm : Form |
| | | { |
| | | AllProcessesPage AllProcessesPage = new AllProcessesPage(); |
| | | AllProcessesPage AllProcessesPages = new AllProcessesPage(); |
| | | CamerasEditPage CamerasEditPage = new CamerasEditPage(); |
| | | HistoricalDataEditPage HistoricalDataEditPage = new HistoricalDataEditPage(); |
| | | CommunicatorsEditPage CommunicatorsEditPage = new CommunicatorsEditPage(); |
| | | SettingEditPage SettingEditPage = new SettingEditPage(); |
| | | MESEditPage MESEditPage = new MESEditPage(); |
| | |
| | | |
| | | //最开始就清空所有Tab页 |
| | | materialTabControl.TabPages.Clear(); |
| | | materialTabControl.Controls.Add(AllProcessesPage); |
| | | AllProcessesPages.controlsPanel.Dock = DockStyle.Fill; |
| | | materialTabControl.Controls.Add(AllProcessesPages); |
| | | |
| | | HistoricalDataEditPage.LogInfo += LogInfo; |
| | | materialTabControl.Controls.Add(new MyPage(HistoricalDataEditPage)); |
| | | |
| | | CamerasEditPage.LogInfo += LogInfo; |
| | | materialTabControl.Controls.Add(new MyPage(CamerasEditPage)); |
| | |
| | | { |
| | | //materialTabControl.TabPages[i].Font= new Font("Microsoft YaHei UI", 18F, FontStyle.Regular, GraphicsUnit.Point, 0); |
| | | } |
| | | |
| | | materialTabSelector.BaseTabControl = materialTabControl; |
| | | //materialTabSelector.Font = new Font("Microsoft YaHei UI", 18F, FontStyle.Regular, GraphicsUnit.Point, 0); |
| | | } |
| | |
| | | { |
| | | return; |
| | | } |
| | | string strInfo = DateTime.Now.ToString("[yyyy:MM:HH:mm:ss:fff] "); |
| | | string strInfo = DateTime.Now.ToString("[yyyy:MM:dd:HH:mm:ss:fff] "); |
| | | strInfo += strLog; |
| | | if (infoType != LogInfoType.NOSHOW) |
| | | { |
| | |
| | | switch (infoType) |
| | | { |
| | | case LogInfoType.INFO: |
| | | this.rich_Info.SelectionColor = Color.Wheat; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Wheat; |
| | | AsyncLogHelper.Info(strLog); |
| | | break; |
| | | } |
| | | case LogInfoType.WARN: |
| | | this.rich_Info.SelectionColor = Color.LightGoldenrodYellow; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Yellow; |
| | | AsyncLogHelper.Warn(strLog); |
| | | break; |
| | | } |
| | | case LogInfoType.PASS: |
| | | this.rich_Info.SelectionColor = Color.Green; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Green; |
| | | AsyncLogHelper.Info(strLog); |
| | | break; |
| | | } |
| | | case LogInfoType.ERROR: |
| | | this.rich_Info.SelectionColor = Color.Red; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Red; |
| | | AsyncLogHelper.Error(strLog); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // 更新 UI 控件,比如显示接收到的消息 |
| | | this.rich_Info.AppendText(strInfo); |
| | | this.rich_Info.AppendText("\r\n"); |
| | |
| | | { |
| | | |
| | | if (this.rich_Info.Lines.Length > 1000) |
| | | { |
| | | this.rich_Info.Clear(); |
| | | |
| | | } |
| | | // 如果已经在 UI 线程上,直接更新 UI |
| | | switch (infoType) |
| | | { |
| | | case LogInfoType.INFO: |
| | | this.rich_Info.SelectionColor = Color.Wheat; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Wheat; |
| | | AsyncLogHelper.Info(strLog); |
| | | break; |
| | | } |
| | | case LogInfoType.WARN: |
| | | this.rich_Info.SelectionColor = Color.Yellow; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Yellow; |
| | | AsyncLogHelper.Warn(strLog); |
| | | break; |
| | | } |
| | | case LogInfoType.PASS: |
| | | this.rich_Info.SelectionColor = Color.Green; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Green; |
| | | AsyncLogHelper.Info(strLog); |
| | | break; |
| | | } |
| | | case LogInfoType.ERROR: |
| | | this.rich_Info.SelectionColor = Color.Red; |
| | | break; |
| | | { |
| | | this.rich_Info.SelectionColor = Color.Red; |
| | | AsyncLogHelper.Error(strLog); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | this.rich_Info.AppendText(strInfo); |
| | | this.rich_Info.AppendText("\r\n"); |
| | | this.rich_Info.SelectionStart = this.rich_Info.Text.Length; |
| | | this.rich_Info.ScrollToCaret(); |
| | | } |
| | | } |
| | | AsyncLogHelper.Info(strLog); |
| | | } |
| | | |
| | | public static bool SaveAllLayout() |
| | |
| | | { |
| | | XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config")); |
| | | string[] paths = { |
| | | @"生产日志\Run_Log", |
| | | @"生产日志\Debug_Log", |
| | | @"生产日志\Error_Log", |
| | | @"生产日志\Run", |
| | | @"生产日志\Debug", |
| | | @"生产日志\Error", |
| | | @"生产日志\Fatal", |
| | | @"生产日志\Warn", |
| | | }; |
| | |
| | | } |
| | | com_ProductName.Items.Add("新增"); |
| | | com_ProductName.Text = GlobalVar.strProductName; |
| | | this.WindowState = FormWindowState.Maximized; |
| | | } |
| | | |
| | | public void SaveAllSetting() |
| | |
| | | { |
| | | string CommunicatorName = CommunicatorConnectionString.Key; |
| | | string CommunicatorAddress = CommunicatorConnectionString.Value; |
| | | |
| | | // 定义正则表达式以提取协议、IP 地址和端口 |
| | | //1. \((.*?)\):\(和 \) 是用于匹配括号的转义字符。 |
| | | // (.*?) 是一个非贪婪的匹配,用来匹配类名(MyProcesses.Communicators.TCPServer 或 MyProcesses.Communicators.UARTPort)。 |
| | | //2. ([^:] +):匹配冒号之前的部分,即地址(127.0.0.1 或 COM5)。这里使用了[^:] 来匹配除了冒号之外的任意字符。 |
| | | //3. (\d +) :匹配端口号,确保它匹配一个或多个数字。 |
| | | |
| | | string pattern = @"^\((?<ClassName>[^)]+)\)\[(?<IP>[^]]+)\]\[(?<PORT>[^]]+)\]$"; |
| | | Match match = Regex.Match(CommunicatorAddress, pattern); |
| | | |
| | | if (match.Success) |
| | | if (!string.IsNullOrEmpty(CommunicatorAddress) && CommunicatorAddress.Contains("SiemensLBS7")) |
| | | { |
| | | string ClassName = match.Groups["ClassName"].Value; // "TCP" |
| | | string IP = match.Groups["IP"].Value; // "127.0.0.1" |
| | | string PORT = match.Groups["PORT"].Value; // "1111" |
| | | // 定义正则表达式以提取协议、IP 地址和端口 |
| | | //1. \((.*?)\):\(和 \) 是用于匹配括号的转义字符。 |
| | | // (.*?) 是一个非贪婪的匹配,用来匹配类名(MyProcesses.Communicators.TCPServer 或 MyProcesses.Communicators.UARTPort)。 |
| | | //2. ([^:] +):匹配冒号之前的部分,即地址(127.0.0.1 或 COM5)。这里使用了[^:] 来匹配除了冒号之外的任意字符。 |
| | | //3. (\d +) :匹配端口号,确保它匹配一个或多个数字。 |
| | | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) |
| | | break; |
| | | string pattern = @"^\((?<ClassName>[^)]+)\)\[(?<IP>[^]]+)\]\[(?<Slot>[^]]+)\]\[(?<CpuType>[^]]+)\]\[(?<PlcAddress>[^]]+)\]$"; |
| | | Match match = Regex.Match(CommunicatorAddress, pattern); |
| | | |
| | | //利用反射创建实例 |
| | | Type type = IProcess.GetExecutingAssembly().GetType(ClassName); |
| | | if (type == null) |
| | | if (match.Success) |
| | | { |
| | | Debug.WriteLine("Class not found."); |
| | | return false; |
| | | } |
| | | var Communicator = Activator.CreateInstance(type, CommunicatorName) as BaseCommunicator; |
| | | string ClassName = match.Groups["ClassName"].Value; // "TCP" |
| | | string IP = match.Groups["IP"].Value; // "127.0.0.1" |
| | | string Slot = match.Groups["Slot"].Value; // "1111" |
| | | string CpuType= match.Groups["CpuType"].Value; |
| | | string PlcAddress = match.Groups["PlcAddress"].Value; |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(Slot) || string.IsNullOrEmpty(CpuType) || string.IsNullOrEmpty(PlcAddress)) |
| | | break; |
| | | |
| | | if (Communicator == null) |
| | | { |
| | | Debug.WriteLine("BaseCommunicator not found."); |
| | | return false; |
| | | } |
| | | //利用反射创建实例 |
| | | Type type = IProcess.GetExecutingAssembly().GetType(ClassName); |
| | | if (type == null) |
| | | { |
| | | Debug.WriteLine("Class not found."); |
| | | return false; |
| | | } |
| | | var Communicator = Activator.CreateInstance(type, CommunicatorName) as BaseCommunicator; |
| | | |
| | | //TCP客户端最后再连接 |
| | | if (Communicator is TCPClient) |
| | | { |
| | | clientsCommunicatorsConnectionString.TryAdd(CommunicatorConnectionString.Key, CommunicatorConnectionString.Value); |
| | | continue; |
| | | } |
| | | if (Communicator == null) |
| | | { |
| | | Debug.WriteLine("BaseCommunicator not found."); |
| | | return false; |
| | | } |
| | | |
| | | Communicator.CommunicatorConnections.Add("地址", IP); |
| | | Communicator.CommunicatorConnections.Add("端口", PORT); |
| | | Communicator.CommunicatorName = CommunicatorName; |
| | | if (!Communicator.Connect()) |
| | | { |
| | | LogInfo($"初始化通讯口[{CommunicatorName}]失败,原因是{Communicator.Msg}", LogInfoType.ERROR); |
| | | Communicator.CommunicatorConnections.Add("地址", IP); |
| | | Communicator.CommunicatorConnections.Add("端口", Slot); |
| | | Communicator.CommunicatorConnections.Add("型号", CpuType); |
| | | Communicator.CommunicatorConnections.Add("变量地址", PlcAddress); |
| | | Communicator.CommunicatorName = CommunicatorName; |
| | | if (!Communicator.Connect()) |
| | | { |
| | | LogInfo($"初始化通讯口[{CommunicatorName}]失败,原因是{Communicator.Msg}", LogInfoType.ERROR); |
| | | } |
| | | else |
| | | { |
| | | LogInfo($"初始化通讯口[{CommunicatorName}]成功", LogInfoType.PASS); |
| | | } |
| | | GlobalVar.dicCommunicators.TryAdd(CommunicatorName, Communicator); |
| | | } |
| | | else |
| | | { |
| | | LogInfo($"初始化通讯口[{CommunicatorName}]成功", LogInfoType.PASS); |
| | | Debug.WriteLine("No match found."); |
| | | } |
| | | GlobalVar.dicCommunicators.TryAdd(CommunicatorName, Communicator); |
| | | } |
| | | else |
| | | { |
| | | Debug.WriteLine("No match found."); |
| | | } |
| | | // 定义正则表达式以提取协议、IP 地址和端口 |
| | | //1. \((.*?)\):\(和 \) 是用于匹配括号的转义字符。 |
| | | // (.*?) 是一个非贪婪的匹配,用来匹配类名(MyProcesses.Communicators.TCPServer 或 MyProcesses.Communicators.UARTPort)。 |
| | | //2. ([^:] +):匹配冒号之前的部分,即地址(127.0.0.1 或 COM5)。这里使用了[^:] 来匹配除了冒号之外的任意字符。 |
| | | //3. (\d +) :匹配端口号,确保它匹配一个或多个数字。 |
| | | |
| | | string pattern = @"^\((?<ClassName>[^)]+)\)\[(?<IP>[^]]+)\]\[(?<PORT>[^]]+)\]$"; |
| | | Match match = Regex.Match(CommunicatorAddress, pattern); |
| | | |
| | | if (match.Success) |
| | | { |
| | | string ClassName = match.Groups["ClassName"].Value; // "TCP" |
| | | string IP = match.Groups["IP"].Value; // "127.0.0.1" |
| | | string PORT = match.Groups["PORT"].Value; // "1111" |
| | | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) |
| | | break; |
| | | |
| | | //利用反射创建实例 |
| | | Type type = IProcess.GetExecutingAssembly().GetType(ClassName); |
| | | if (type == null) |
| | | { |
| | | Debug.WriteLine("Class not found."); |
| | | return false; |
| | | } |
| | | var Communicator = Activator.CreateInstance(type, CommunicatorName) as BaseCommunicator; |
| | | |
| | | if (Communicator == null) |
| | | { |
| | | Debug.WriteLine("BaseCommunicator not found."); |
| | | return false; |
| | | } |
| | | |
| | | //TCP客户端最后再连接 |
| | | if (Communicator is TCPClient) |
| | | { |
| | | clientsCommunicatorsConnectionString.TryAdd(CommunicatorConnectionString.Key, CommunicatorConnectionString.Value); |
| | | continue; |
| | | } |
| | | |
| | | Communicator.CommunicatorConnections.Add("地址", IP); |
| | | Communicator.CommunicatorConnections.Add("端口", PORT); |
| | | Communicator.CommunicatorName = CommunicatorName; |
| | | if (!Communicator.Connect()) |
| | | { |
| | | LogInfo($"初始化通讯口[{CommunicatorName}]失败,原因是{Communicator.Msg}", LogInfoType.ERROR); |
| | | } |
| | | else |
| | | { |
| | | LogInfo($"初始化通讯口[{CommunicatorName}]成功", LogInfoType.PASS); |
| | | } |
| | | GlobalVar.dicCommunicators.TryAdd(CommunicatorName, Communicator); |
| | | } |
| | | else |
| | | { |
| | | Debug.WriteLine("No match found."); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //TCP客户端最后连接 |
| | |
| | | string ClassName = item.Value.GetType().FullName;// "TCP" |
| | | string IP = item.Value.CommunicatorConnections["地址"].ToString();//"127.0.0.1" |
| | | string PORT = item.Value.CommunicatorConnections["端口"].ToString();//"1111" |
| | | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) |
| | | if (!string.IsNullOrEmpty(ClassName) && ClassName.Contains("SiemensLBS7")) |
| | | { |
| | | break; |
| | | string CpuType = item.Value.CommunicatorConnections["型号"].ToString(); |
| | | string PlcAddress = item.Value.CommunicatorConnections["变量地址"].ToString(); |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT) || string.IsNullOrEmpty(CpuType) || string.IsNullOrEmpty(PlcAddress)) |
| | | { |
| | | break; |
| | | } |
| | | string CommunicatorConnectionString = $"({ClassName})[{IP}][{PORT}][{CpuType}][{PlcAddress}]"; |
| | | GlobalVar.allCommunicatorsConnectionString.TryAdd(item.Key, CommunicatorConnectionString); |
| | | } |
| | | string CommunicatorConnectionString = $"({ClassName})[{IP}][{PORT}]"; |
| | | GlobalVar.allCommunicatorsConnectionString.TryAdd(item.Key, CommunicatorConnectionString); |
| | | else |
| | | { |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) |
| | | { |
| | | break; |
| | | } |
| | | string CommunicatorConnectionString = $"({ClassName})[{IP}][{PORT}]"; |
| | | GlobalVar.allCommunicatorsConnectionString.TryAdd(item.Key, CommunicatorConnectionString); |
| | | } |
| | | } |
| | | var settings = new JsonSerializerSettings |
| | | { |
| | |
| | | { |
| | | string title = layout.Title; |
| | | string strImagePath = layout.SaveImageDir; |
| | | if (!AllProcessesPage.dicProcessControls.ContainsKey(title)) |
| | | if (!AllProcessesPages.dicProcessControls.ContainsKey(title)) |
| | | { |
| | | continue; |
| | | } |
| | | RunBll.GetImage(layout, out InputImage, out RecordImage); |
| | | AllProcessesPage.dicProcessControls[title].ShowHoImage(RecordImage); |
| | | AllProcessesPages.dicProcessControls[title].ShowHoImage(RecordImage); |
| | | if (!string.IsNullOrEmpty(layout.SaveImageDir)) |
| | | { |
| | | string fileNameHead = layout.SaveImageHead; |