Imports System.Text Imports System.Threading Imports Microsoft.VisualBasic.Devices Imports UTS_Core.DebugLog Imports UTS_Core.UTSModule Imports UTS_Core.UTSModule.Station Imports UTS_Core.UTSModule.Test Imports UTS_Core.UTSModule.Test.Controls Imports UTS_Core.UTSModule.Test.StatusMonitor Imports UTS_Core.UTSModule.Test.StatusMonitor.ComportStatusMonitor Imports UTS_Core.UTSModule.Test.StatusMonitor.DatabaseStatusMonitor Imports UTS_Core.UTSModule.Test.StatusMonitor.StationEditStatusMonitor Imports UTS_Core.UTSModule.Test.StatusMonitor.TestStatusMonitor Public Class FrmMain Implements IProcessStation Implements IProductionLine Private _utsApp As UtsAppForm #Region "网络检测模块" Enum NetWorkStatusEnum Connected UnConnected End Enum Private _networkStatus As NetWorkStatusEnum = NetWorkStatusEnum.Connected ''' ''' 根据网络状态修改页面提示 ''' ''' Private Sub UpdateNetWorkStatus(netStatus As NetWorkStatusEnum) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of NetWorkStatusEnum)(AddressOf UpdateNetWorkStatus), New Object() {netStatus}) Return End If If netStatus = NetWorkStatusEnum.Connected Then TssLblNetWorkStatus.Image = ImgMainStatus.Images("网络-绿色64x64.png") TssLblNetWorkStatus.ToolTipText = $"网络已连接" ApplicationLog.WriteInfoLog("网络连接状态变更,网络已连接。") Else TssLblNetWorkStatus.Image = ImgMainStatus.Images("网络-红色64x64.png") TssLblNetWorkStatus.ToolTipText = $"网络未连接" ApplicationLog.WriteWarningLog("网络连接状态变更,网络未连接。") End If End Sub ''' ''' 网络状态变化修改处理事件 ''' ''' ''' Private Sub NetworkAvailabilityChanged(sender As Object, e As NetworkAvailableEventArgs) If e.IsNetworkAvailable Then _networkStatus = NetWorkStatusEnum.Connected Else _networkStatus = NetWorkStatusEnum.UnConnected End If UpdateNetWorkStatus(_networkStatus) End Sub ''' ''' 开始监听网络状态 ''' Private Sub StartMonitorNetworkStatus() '网络监控 Dim netStatus As New Network If netStatus.IsAvailable Then _networkStatus = NetWorkStatusEnum.Connected Else _networkStatus = NetWorkStatusEnum.UnConnected End If UpdateNetWorkStatus(_networkStatus) '刷新界面网络状态提示 AddHandler netStatus.NetworkAvailabilityChanged, AddressOf NetworkAvailabilityChanged End Sub #End Region #Region "数据库同步状态检测模块" Private Sub UpdateDatabaseStatus(dbStatus As DatabaseSyncStatusEnum) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of DatabaseSyncStatusEnum)(AddressOf UpdateDatabaseStatus), New Object() {dbStatus}) Return End If Select Case dbStatus Case DatabaseSyncStatusEnum.Unknown TssLblDatabaseStatus.Image = ImgMainStatus.Images("数据同步-灰色64x64.png") TssLblDatabaseStatus.ToolTipText = $"数据库同步信息未知" ApplicationLog.WriteWarningLog("数据库同步状态变更,未知。") Case DatabaseSyncStatusEnum.Completed TssLblDatabaseStatus.Image = ImgMainStatus.Images("数据同步-绿色64x64.png") TssLblDatabaseStatus.ToolTipText = $"数据库已同步" ApplicationLog.WriteInfoLog("数据库同步状态变更,已同步。") Case DatabaseSyncStatusEnum.UnCompleted TssLblDatabaseStatus.Image = ImgMainStatus.Images("数据同步-红色64x64.png") TssLblDatabaseStatus.ToolTipText = $"数据库未同步" ApplicationLog.WriteWarningLog("数据库同步状态变更,未同步。") Case Else Console.WriteLine($"数据库同步状态变更,未知类型:{dbStatus}") ApplicationLog.WriteErrorLog($"数据库同步状态变更,未知类型:{dbStatus}。") End Select End Sub ''' ''' 数据库同步状态修改处理事件 ''' ''' ''' Private Sub DatabaseStatusChanged(sender As Object, e As DatabaseStatusChangedEventArgs) UpdateDatabaseStatus(e.Status) End Sub ''' ''' 开始监控数据库状态 ''' Private Sub StartMonitorDatabaseStatus() UpdateDatabaseStatus(DatabaseSyncStatus) AddHandler DatabaseStatusMonitor.DatabaseSyncStatusChanged, AddressOf DatabaseStatusChanged End Sub #End Region #Region "测试状态检测模块" ''' ''' 测试状态改变处理事件 ''' ''' ''' Private Sub TestStatusChanged(sender As Object, e As TestStatusChangedEventArgs) UtsComportTask.TestStatusChanged = True UpdateTestStatus(e.Status) End Sub ''' ''' 根据测试状态,更新界面UI显示 ''' ''' Private Sub UpdateTestStatus(status As TestStatusEnum) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of TestStatusEnum)(AddressOf UpdateTestStatus), New Object() {status}) Return End If 'Select Case status ' Case TestStatusEnum.WaitForTest ' TssLblTestStatus.Image = ImgMainStatus.Images("server_green_25x25.png") ' TssLblTestStatus.ForeColor = Color.Gray ' TssLblTestStatus.Text = $"未测试" ' Case TestStatusEnum.Testing ' TssLblTestStatus.Image = ImgMainStatus.Images("server_yellow_27x27.png") ' TssLblTestStatus.ForeColor = Color.Blue ' TssLblTestStatus.Text = $"测试中" ' Case TestStatusEnum.TestPass ' TssLblTestStatus.Image = ImgMainStatus.Images("server_green_25x25.png") ' TssLblTestStatus.ForeColor = Color.Green ' TssLblTestStatus.Text = $"测试成功" ' Case TestStatusEnum.TestFail ' TssLblTestStatus.Image = ImgMainStatus.Images("server_red_27x27.png") ' TssLblTestStatus.ForeColor = Color.Red ' TssLblTestStatus.Text = $"测试失败" ' Case TestStatusEnum.DeviceError ' TssLblTestStatus.Image = ImgMainStatus.Images("server_red_27x27.png") ' TssLblTestStatus.ForeColor = Color.DarkRed ' TssLblTestStatus.Text = $"设备错误" ' Case Else ' Console.WriteLine($"UpdateTestStatus Unknown:{status}") 'End Select ' End Sub ''' ''' 开始监听测试状态 ''' Public Sub StartMonitorTestStatus() UpdateTestStatus(TestStatus) '刷新项目站测试状态提示 AddHandler TestStatusMonitor.TestStatusChanged, AddressOf TestStatusChanged End Sub #End Region #Region "项目站信息修改监测模块" Private Sub UpdateStationEditStatus(status As StationEditStatusEnum) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of StationEditStatusEnum)(AddressOf UpdateStationEditStatus), New Object() {status}) Return End If Select Case status Case StationEditStatusEnum.None TssLblEditStatus.Image = ImgMainStatus.Images("编辑保存-绿色64x64.png") TssLblEditStatus.ToolTipText = $"测试流程未修改" ApplicationLog.WriteInfoLog("测试流程编辑状态变更,未修改。") Case StationEditStatusEnum.Changed TssLblEditStatus.Image = ImgMainStatus.Images("编辑保存-红色64x64.png") TssLblEditStatus.ToolTipText = $"测试流程已修改" ApplicationLog.WriteInfoLog("测试流程编辑状态变更,已修改。") Case StationEditStatusEnum.Saved TssLblEditStatus.Image = ImgMainStatus.Images("编辑保存-绿色64x64.png") TssLblEditStatus.ToolTipText = $"测试流程已保存" ApplicationLog.WriteInfoLog("测试流程编辑状态变更,已保存。") Case Else Console.WriteLine($"测试流程编辑状态变更,未知状态:{status}。") ApplicationLog.WriteErrorLog($"测试流程编辑状态变更,未知状态:{status}。") End Select End Sub Private Sub StationEditStatusChanged(sender As Object, e As StationEditStatusChangedEventArgs) UpdateStationEditStatus(e.Status) End Sub Private Sub StartMonitorStationEditStatus() UpdateStationEditStatus(StationEditStatus) AddHandler StationEditStatusMonitor.StationEditStatusChanged, AddressOf StationEditStatusChanged End Sub #End Region #Region "测试串口连接状态检测模块" Private Sub UpdateComPortStatus(comPortStatus As ComPortConnectStatusEnum) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of ComPortConnectStatusEnum)(AddressOf UpdateComPortStatus), New Object() {comPortStatus}) Return End If Select Case comPortStatus Case ComPortConnectStatusEnum.Connected TssLblComPortStatus.Image = ImgMainStatus.Images($"测试设备-绿色64x64.png") TssLblComPortStatus.ToolTipText = $"测试设备已连接" ApplicationLog.WriteInfoLog("测试设备连接状态变更,已连接。") Case ComPortConnectStatusEnum.Connecting TssLblComPortStatus.Image = ImgMainStatus.Images($"测试设备-灰色64x64.png") TssLblComPortStatus.ToolTipText = $"测试设备连接中" ApplicationLog.WriteInfoLog("测试设备连接状态变更,连接中。") Case ComPortConnectStatusEnum.UnConnected TssLblComPortStatus.Image = ImgMainStatus.Images($"测试设备-红色64x64.png") TssLblComPortStatus.ToolTipText = $"测试设备已断接" ApplicationLog.WriteWarningLog("测试设备连接状态变更,已断接。") Case Else Console.WriteLine($"测试设备连接状态变更,未知的状态:{comPortStatus}") ApplicationLog.WriteErrorLog($"测试设备连接状态变更,未知的状态:{comPortStatus}") End Select End Sub Private Sub ComPortStatusChanged(sender As Object, e As ComportStatusChangedEventArgs) UpdateComPortStatus(e.Status) '刷新串口状态提示 End Sub Private Sub ComportThreadCallback() UtsComportTask.StartTask() End Sub Private Sub StartMonitorComPortStatus() UpdateComPortStatus(ComportStatus) '刷新串口状态提示 AddHandler ComportStatusMonitor.ComportStatusChanged, AddressOf ComPortStatusChanged '自动检测串口 _threadComport = New Thread(AddressOf ComportThreadCallback) _threadComport.IsBackground = True _threadComport.Start() End Sub #End Region #Region "控制串口连接状态检测模块" Private Sub UpdateControlPortStatus(comPortStatus As ComPortConnectStatusEnum) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of ComPortConnectStatusEnum)(AddressOf UpdateControlPortStatus), New Object() {comPortStatus}) Return End If Select Case comPortStatus Case ComPortConnectStatusEnum.Connected TssLblControllerStatus.Image = ImgMainStatus.Images($"控制器-绿色64x64.png") TssLblControllerStatus.ToolTipText = $"控制器已连接" ApplicationLog.WriteInfoLog("控制设备连接状态变更,已连接。") Case ComPortConnectStatusEnum.Connecting TssLblControllerStatus.Image = ImgMainStatus.Images($"控制器-灰色64x64.png") TssLblControllerStatus.ToolTipText = $"控制器连接中" ApplicationLog.WriteInfoLog("控制设备连接状态变更,连接中。") Case ComPortConnectStatusEnum.UnConnected TssLblControllerStatus.Image = ImgMainStatus.Images($"控制器-红色64x64.png") TssLblControllerStatus.ToolTipText = $"控制器已断接" ApplicationLog.WriteWarningLog("控制设备连接状态变更,已断接。") Case Else Console.WriteLine($"控制设备连接状态变更,未知的状态:{comPortStatus}。") ApplicationLog.WriteErrorLog($"控制设备连接状态变更,未知的状态:{comPortStatus}。") End Select End Sub Private Sub ControlPortStatusChanged(sender As Object, e As ComportStatusChangedEventArgs) UpdateControlPortStatus(e.Status) '刷新串口状态提示 End Sub Private Sub ControlPortThreadCallback() Static controllerTask As ControllerComPortTask = ControllerComPortTask.CreateControllerPortTask() controllerTask.StartTask() End Sub Private Sub StartMonitorControlPortStatus() UpdateControlPortStatus(ControllerComPortStatusMonitor.ComportStatus) '刷新串口状态提示 AddHandler ControllerComPortStatusMonitor.ComportStatusChanged, AddressOf ControlPortStatusChanged '自动检测串口 _threadComport = New Thread(AddressOf ControlPortThreadCallback) _threadComport.IsBackground = True _threadComport.Start() End Sub #End Region #Region "更新时间显示模块" Private Sub StartMonitorTimeStatus(state As Object) While True UpdateTime(Now) Thread.Sleep(500) End While End Sub ''' ''' 更新时间 ''' ''' Private Sub UpdateTime(time As DateTime) Try If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of DateTime)(AddressOf UpdateTime), New Object() {time}) Return End If TsLblTime.Text = $"{time:yyyy-MM-dd HH:mm:ss}" Catch ex As Exception End Try End Sub #End Region #Region "更新数据库链接状态模块" ''' ''' 更新数据库状态 ''' ''' Private Sub UpdateDBStatus(dbStatus As Integer) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of Integer)(AddressOf UpdateDBStatus), New Object() {dbStatus}) Return End If Select Case dbStatus Case 0 TslblDbStatus.Image = ImgMainStatus.Images("数据库-红色64x64.png") TslblDbStatus.ToolTipText = $"数据库连接异常" ApplicationLog.WriteWarningLog($"数据库状态变更,数据库连接异常。") Case 1 TslblDbStatus.Image = ImgMainStatus.Images("数据库-绿色64x64.png") TslblDbStatus.ToolTipText = $"数据库连接正常" ApplicationLog.WriteInfoLog($"数据库状态变更,数据库连接正常。") Case Else TslblDbStatus.Image = ImgMainStatus.Images("数据库-灰色64x64.png") TslblDbStatus.ToolTipText = $"数据库连接未知" ApplicationLog.WriteErrorLog($"数据库状态变更,数据库连接未知。") End Select End Sub ''' ''' 更新Ftp连接状态 ''' ''' Private Sub UpdateFtpStatus(ftpStatus As Integer) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of Integer)(AddressOf UpdateFtpStatus), New Object() {ftpStatus}) Return End If Select Case ftpStatus Case 0 TslblFtpStatus.Image = ImgMainStatus.Images("FTP-红色64x64.png") TslblFtpStatus.ToolTipText = "Ftp连接异常" ApplicationLog.WriteWarningLog($"Ftp状态变更,Ftp连接异常。") Case 1 TslblFtpStatus.Image = ImgMainStatus.Images("FTP-绿色64x64.png") TslblFtpStatus.ToolTipText = $"Ftp连接正常" ApplicationLog.WriteInfoLog($"Ftp状态变更,Ftp连接正常。") Case Else TslblFtpStatus.Image = ImgMainStatus.Images("FTP-灰色64x64.png") TslblFtpStatus.ToolTipText = "Ftp连接未知" ApplicationLog.WriteErrorLog($"Ftp状态变更,Ftp连接未知。") End Select End Sub ''' ''' 更新同步时间 ''' ''' Private Sub UpdateSyncTime(txt As String) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of String)(AddressOf UpdateSyncTime), New Object() {txt}) Return End If If String.IsNullOrEmpty(txt) Then TssLblDatabaseStatus.Text = "未知" ApplicationLog.WriteWarningLog($"数据库同步时间变更,未知的同步时间。") Else TssLblDatabaseStatus.Text = txt ApplicationLog.WriteInfoLog($"数据库同步时间变更,最新时间:{txt}。") End If End Sub ''' ''' 更新网上邻居 ''' ''' Private Sub UpdateNetworkNeiborhood(txt As String) If StuMain.InvokeRequired Then '判断是否需要开委托 StuMain.Invoke(New Action(Of String)(AddressOf UpdateNetworkNeiborhood), New Object() {txt}) Return End If If String.IsNullOrEmpty(txt) Then TsLblGroupServices.Text = "无" ApplicationLog.WriteWarningLog($"网上邻居变更,无网上邻居。") Else TsLblGroupServices.Text = txt ApplicationLog.WriteInfoLog($"网上邻居变更,当前组网上邻居:{txt}。") End If End Sub #End Region ''' ''' 分页控件包含的页面 ''' Enum TabControlEnum TpStationDesign TpStationPlan TpStationTest TpSettings TpHelp TpAbout End Enum Public Event StationChanged(station As ProcessStation) '项目变更事件 Public Event StationRelease(station As ProcessStation) '项目发布事件 Private _threadMonitorStatus As Thread '状态检测线程 Private _threadComport As Thread '串口相关线程 Private _staionType As ProcessStation.StationTypeEnum = ProcessStation.StationTypeEnum.Test ''' 修改窗体标题 Private Sub ShowFormTitle(Optional station As ProcessStation = Nothing) 'Dim str As New StringBuilder 'str.Append(Application.ProductName) 'str.Append(String.Empty.PadRight(8, " "c)) 'str.Append(Application.ProductVersion) 'If _utsApp.Account IsNot Nothing Then ' str.Append(String.Empty.PadRight(8, " "c)) ' str.Append(_utsApp.Account.UserName) 'End If 'If station IsNot Nothing AndAlso station.Packet IsNot Nothing Then ' str.Append(String.Empty.PadRight(8, " "c)) ' str.Append($"{station.ParentProject.Name} - {station.Name}") ' str.Append(String.Empty.PadRight(8, " "c)) ' str.Append(station.Packet.Name) 'End If 'Text = Str.ToString() 'Momo 2022-0919 修改窗口标题文字 Dim myTitle As String = "AUTS_Win( Build:" & Application.ProductVersion If _utsApp.Account IsNot Nothing Then myTitle = myTitle & ",用户: " & _utsApp.Account.UserName End If If station IsNot Nothing AndAlso station.Packet IsNot Nothing Then 'myTitle = myTitle & " , 项目 : " & station.ParentProject.Name 'myTitle = myTitle & " , 站序 : " & station.ArtworkOrder 'myTitle = myTitle & " , 站位 : " & station.Name 'myTitle = myTitle & " , 站名 : " & station.Description 'myTitle = myTitle & " , 配置文件 : " & station.Packet.FileName myTitle = myTitle & "-" & station.Packet.FileName ' myTitle = myTitle & " ,项目: " & station.ParentProject.Name myTitle = myTitle & "-[" & station.ArtworkOrder myTitle = myTitle & "]" ' myTitle = myTitle & ",站位:" & station.Name 'myTitle = myTitle & ",站名:" & station.Description End If myTitle = myTitle & ")" Text = myTitle End Sub ''' ''' 添加项目设计窗体到分页控件中 ''' Private Sub AddStationDesignFormToTabControl(pageName As String, pageText As String) If TabMain.TabPages.ContainsKey(pageName) Then Return Dim page As New TabPage With {.Name = pageName, .Text = pageText} Dim frm As New FrmStationDesign AddHandler frm.StationRelease, AddressOf Station_Released frm.ShowForm(page) TabMain.TabPages.Add(page) End Sub Private Sub AddStationPlanFormToTabControl(pageName As String, pageText As String) If TabMain.TabPages.ContainsKey(pageName) Then Return Dim page As New TabPage With {.Name = pageName, .Text = pageText} Dim frm As New FrmStationPlan frm.ShowForm(page) TabMain.TabPages.Add(page) End Sub Private Sub AddStationTestFormToTabControl(pageName As String, pageText As String) If TabMain.TabPages.ContainsKey(pageName) Then Return Dim page As New TabPage With {.Name = pageName, .Text = pageText} Dim frm As New FrmStationTest frm.ShowForm(page) TabMain.TabPages.Add(page) End Sub Private Sub AddSettingsFormToTabControl(pageName As String, pageText As String) Dim frm As New FrmSettings If TabMain.TabPages.ContainsKey(pageName) Then Return Dim page As New TabPage With {.Name = pageName, .Text = pageText} frm.ShowForm(page) TabMain.TabPages.Add(page) End Sub Private Sub InitTabMain() TabMain.SizeMode = TabSizeMode.Fixed '隐藏TabControl的表头 TabMain.ItemSize = New Size(0, 1) '根据枚举顺序添加所需页面 ApplicationLog.WriteInfoLog($"运行程序装载发布页面中。") AddStationDesignFormToTabControl(TabControlEnum.TpStationDesign.ToString(), "StationDesign") ApplicationLog.WriteInfoLog($"运行程序装载发布页面完成。") ApplicationLog.WriteInfoLog($"运行程序装载编辑页面中。") AddStationPlanFormToTabControl(TabControlEnum.TpStationPlan.ToString(), "StationPlan") ApplicationLog.WriteInfoLog($"运行程序装载编辑页面完成。") ApplicationLog.WriteInfoLog($"运行程序装载测试页面中。") AddStationTestFormToTabControl(TabControlEnum.TpStationTest.ToString(), "StationTest") ApplicationLog.WriteInfoLog($"运行程序装载测试页面完成。") ApplicationLog.WriteInfoLog($"运行程序装载设置页面中。") AddSettingsFormToTabControl(TabControlEnum.TpSettings.ToString(), "Settings") ApplicationLog.WriteInfoLog($"运行程序装载设置页面完成。") '设置初始页面 TabMain.SelectedIndex = TabControlEnum.TpStationTest End Sub Private Sub Station_Released(station As ProcessStation) ApplicationLog.WriteInfoLog($"主页面站位发布中,TP:{station.Packet.Name}") ShowFormTitle(station) RaiseEvent StationRelease(station) ApplicationLog.WriteInfoLog($"主页面站位发布完成。") End Sub Private Sub InitializingForm() lblServiceID.Text = _utsApp.ServiceIndex.ToString LblServiceAlias.Text = _utsApp.ServiceAlias.ToString TsLblService.Text = $"[{IIf(_utsApp.ServiceRoles = 0, "C", "S")}]{_utsApp.License.VendorName}-{_utsApp.ServiceGroup}" End Sub ''' ''' 校验文件夹,若文件夹不存在则创建 ''' Private Sub CheckDirectory() UtsPath.CheckDirectory() End Sub Private Sub LoadSettings() My.Settings.Reload() '读取Setting中的内容 WinSettings.LastProjectName = My.Settings.LastProjectName WinSettings.LastStationName = My.Settings.LastProcessStationName End Sub Private Sub SaveSettings() ApplicationLog.WriteInfoLog($"运行程序设置保存中。") My.Settings.LastProjectName = WinSettings.LastProjectName My.Settings.LastProcessStationName = WinSettings.LastStationName My.Settings.Save() ApplicationLog.WriteInfoLog($"运行程序设置保存完成。") End Sub ''' ''' 开启所有状态监听线程 ''' Private Sub StartStatusMonitorThread() StartMonitorNetworkStatus() '开始监听网络状态 'StartMonitorTestStatus() '开始监听测试状态 StartMonitorStationEditStatus() '开始监听测试站编辑状态 StartMonitorDatabaseStatus() '开始监听数据库同步状态 StartMonitorComPortStatus() '开始监听测试串口连接状态 StartMonitorControlPortStatus() '开始监听控制串口连接状态 '定期更新时间 ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf StartMonitorTimeStatus)) End Sub Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load AddHandler AppDomain.CurrentDomain.UnhandledException, Sub(s As Object, ea As UnhandledExceptionEventArgs) Dim ex As Exception = CType(ea.ExceptionObject, Exception) MsgBox($"UTS未处理异常,{ex}") End Sub AddHandler Application.ThreadException, Sub(s As Object, ea As System.Threading.ThreadExceptionEventArgs) MsgBox($"UTS线程异常,{ea.Exception}") End Sub ApplicationLog.WriteInfoLog($"{Application.ProductName} {Application.ProductVersion} 运行程序加载中。") '更新一切路径信息与连接信息 CheckDirectory() '读取系统缓存设置 LoadSettings() '初始化UTS窗体信息,失败则关闭窗体 If InitializeUtsApp() = False Then Return ApplicationLog.WriteInfoLog($"服务基础信息:{_utsApp.License.VendorName}-{_utsApp.ServiceGroup}({IIf(_utsApp.ServiceRoles = 0, "C", "S")})-{_utsApp.ServiceAlias}({_utsApp.Register.ServiceIndex})") '填充程序可操作页面 InitTabMain() '获取上一次可操作页面 LoadLastStation() '初始化窗体页面 InitializingForm() '开始状态检测线程 StartStatusMonitorThread() ApplicationLog.WriteInfoLog("运行程序加载完成。") End Sub Private Sub LoadLastStation() '获取上一次打开信息 ApplicationLog.WriteInfoLog($"PN:{WinSettings.LastProjectName} SN:{WinSettings.LastStationName} 站位信息加载中。") _utsApp.LoadStation(WinSettings.LastProjectName, WinSettings.LastStationName) ApplicationLog.WriteInfoLog("站位信息加载完成。") End Sub Private Function InitializeUtsApp() As Boolean _utsApp = UtsAppForm.CreateSingleton() _utsApp.AddStatisticsObserver(Me) AddHandler _utsApp.DbStatusChanged, AddressOf UpdateDBStatus AddHandler _utsApp.FtpStatusChanged, AddressOf UpdateFtpStatus AddHandler _utsApp.SyncTimeChanged, AddressOf UpdateSyncTime AddHandler _utsApp.ServicesChanged, AddressOf UpdateNetworkNeiborhood Try If _utsApp.IsInitialized = False Then _utsApp.Initialize(ProcessStation.StationTypeEnum.Test) 'Todo:可根据需要限定可选站位 End If Catch ex As Exception ApplicationLog.WriteErrorLog($"初始化窗体失败,原因:{ex.Message}。") MsgBox($"初始化窗体失败,原因:{ex.Message}") Close() Return False End Try Return True End Function Private Sub UtsKeyDownCallback(sender As Object, e As UtsKeyDownEventArgs) If StuMain.InvokeRequired Then StuMain.Invoke(New Action(Of UtsKeyValueMonitor.UtsKeyValueEnum)(AddressOf UpdateKey), New Object() {e.KeyValue}) Else UpdateKey(e.KeyValue) End If End Sub Private Sub UpdateKey(key As UtsKeyValueMonitor.UtsKeyValueEnum) TssLblKeyDown.Text = $"{key}" ApplicationLog.WriteInfoLog($"控制器按键按下,键值:{key}。") End Sub Private Sub FrmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown AddHandler UtsKeyValueMonitor.UtsKeyDown, AddressOf UtsKeyDownCallback End Sub Private Sub TsmStation_Click(sender As Object, e As EventArgs) Handles MsiStationDesign.Click 'TabMain.SelectedIndex = TabControlEnum.TpStationDesign End Sub Private Sub MsiStationPlan_Click(sender As Object, e As EventArgs) Handles MsiStationPlan.Click 'TabMain.SelectedIndex = TabControlEnum.TpStationPlan End Sub ''' ''' 打开或切换项目 Momo 2023-12-15:打开或切换项目前先进行权限验证 ''' ''' ''' Private Sub TsBtnOpenStation_Click(sender As Object, e As EventArgs) Handles TsBtnOpenStation.Click Dim failCount As Integer = 0 Dim tmpPwd As String = "123456" If _utsApp.ProcessStation Is Nothing Then tmpPwd = "123456" Else tmpPwd = _utsApp.ProcessStation.Packet.EditPwd End If Dim pwd As String = UtsInputBox.ShowDialog("请输入编辑密码(新项目第一次密码 123456)", $"第{failCount}次解锁", "", True) If pwd Is Nothing Then Return If String.Compare(pwd, tmpPwd, True) = 0 Then ApplicationLog.WriteInfoLog($"解锁打开项目。") failCount = 0 _utsApp.ChangeStation() Else failCount += 1 ApplicationLog.WriteWarningLog($"打开项目第[{failCount}]次解锁失败。") If failCount > 3 Then ApplicationLog.WriteFatalLog($"打开项目第[{failCount}]次解锁失败,程序关闭。") Application.Exit() Return End If End If End Sub Private Sub MsiSettings_Click(sender As Object, e As EventArgs) Handles MsiSettings.Click 'TabMain.SelectedIndex = TabControlEnum.TpSettings End Sub Private Sub TsBtnStationTest_Click(sender As Object, e As EventArgs) Handles TsBtnStationTest.Click TabMain.SelectedIndex = TabControlEnum.TpStationTest End Sub Private Sub TsBtnStationDesign_Click(sender As Object, e As EventArgs) Handles TsBtnStationDesign.Click TabMain.SelectedIndex = TabControlEnum.TpStationDesign End Sub Private Sub TsBtnStationPlan_Click(sender As Object, e As EventArgs) Handles TsBtnStationPlan.Click TabMain.SelectedIndex = TabControlEnum.TpStationPlan End Sub Private Sub TabMain_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabMain.SelectedIndexChanged Select Case TabMain.SelectedIndex Case TabControlEnum.TpStationTest TsBtnStationTest.BackColor = Color.ForestGreen TsBtnStationDesign.BackColor = Color.Transparent TsBtnStationPlan.BackColor = Color.Transparent TsBtnStationTest.ForeColor = Color.White TsBtnStationDesign.ForeColor = Color.Black TsBtnStationPlan.ForeColor = Color.Black ApplicationLog.WriteInfoLog($"当前页面:测试页面。") Case TabControlEnum.TpStationDesign TsBtnStationTest.BackColor = Color.Transparent TsBtnStationDesign.BackColor = Color.ForestGreen TsBtnStationPlan.BackColor = Color.Transparent TsBtnStationTest.ForeColor = Color.Black TsBtnStationDesign.ForeColor = Color.White TsBtnStationPlan.ForeColor = Color.Black ApplicationLog.WriteInfoLog($"当前页面:发布页面。") Case TabControlEnum.TpStationPlan TsBtnStationTest.BackColor = Color.Transparent TsBtnStationDesign.BackColor = Color.Transparent TsBtnStationPlan.BackColor = Color.ForestGreen TsBtnStationTest.ForeColor = Color.Black TsBtnStationDesign.ForeColor = Color.Black TsBtnStationPlan.ForeColor = Color.White ApplicationLog.WriteInfoLog($"当前页面:编辑页面。") End Select End Sub Private Sub MsiAbout_Click(sender As Object, e As EventArgs) Handles MsiAbout.Click End Sub Private Sub FrmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing ApplicationLog.WriteInfoLog($"{Application.ProductName} {Application.ProductVersion} 运行程序关闭中。") If StationEditStatus = StationEditStatusEnum.Changed Then If MessageBox.Show($"检测到未保存的测试流程,是否继续退出?", $"Tip", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2) = DialogResult.Cancel Then e.Cancel = True ApplicationLog.WriteInfoLog($"运行程序已取消关闭。") End If End If SaveSettings() ApplicationLog.WriteInfoLog($"运行程序已关闭。") End Sub Private Sub TsBtnEditLock_Click(sender As Object, e As EventArgs) Handles TsBtnEditLock.Click Static failCount As Integer = 1 If TsBtnStationPlan.Visible = False Then If _utsApp.ProcessStation Is Nothing Then UtsMsgBox.ShowDialog("请选择项目后再解锁编辑功能!") Return End If Dim pwd As String = UtsInputBox.ShowDialog("请输入编辑密码(新项目第一次编辑密码 123456)", $"第{failCount}次编辑解锁", "", True) If pwd Is Nothing Then Return If String.Compare(pwd, _utsApp.ProcessStation.Packet.EditPwd, True) = 0 Then ApplicationLog.WriteInfoLog($"编辑页面已解锁。") failCount = 0 TsBtnEditLock.Text = "编辑加锁" TsBtnStationPlan.Visible = True TabMain.SelectedIndex = TabControlEnum.TpStationPlan Else failCount += 1 ApplicationLog.WriteWarningLog($"编辑页面第[{failCount}]次解锁失败。") If failCount > 3 Then ApplicationLog.WriteFatalLog($"编辑页面第[{failCount}]次解锁失败,程序关闭。") Application.Exit() End If End If Else If UtsMsgBox.ShowDialog("为防止误操作,请确定关闭编辑功能!", UtsMsgBox.UtsMsgBoxTypeEnum.YesNo) = DialogResult.OK Then ApplicationLog.WriteInfoLog($"编辑页面已加锁。") TsBtnEditLock.Text = "编辑解锁" TsBtnStationPlan.Visible = False TabMain.SelectedIndex = TabControlEnum.TpStationTest End If End If End Sub Private Sub TsBtnReleaseLock_Click(sender As Object, e As EventArgs) Handles TsBtnReleaseLock.Click Static failCount As Integer = 1 Static isLock As Boolean = True If TsBtnStationDesign.Visible = False Then If _utsApp.ProcessStation Is Nothing Then UtsMsgBox.ShowDialog("请选择项目后再发布编辑功能!") Return End If Dim pwd As String = UtsInputBox.ShowDialog("请输入发布密码(新项目第一次发布密码 00803)", $"第{failCount}次发布解锁", "", True) If pwd Is Nothing Then Return If String.Compare(pwd, _utsApp.ProcessStation.Packet.ReleasePwd, True) = 0 Then ApplicationLog.WriteInfoLog($"发布页面已解锁。") failCount = 0 isLock = False TsBtnReleaseLock.Text = "发布加锁" TsBtnStationDesign.Visible = True TabMain.SelectedIndex = TabControlEnum.TpStationDesign Else failCount += 1 ApplicationLog.WriteWarningLog($"发布页面第[{failCount}]次解锁失败。") If failCount > 3 Then ApplicationLog.WriteFatalLog($"发布页面第[{failCount}]次解锁失败,程序关闭。") Application.Exit() End If End If Else If UtsMsgBox.ShowDialog("为防止误操作,请确定关闭发布功能!", UtsMsgBox.UtsMsgBoxTypeEnum.YesNo) = DialogResult.OK Then ApplicationLog.WriteInfoLog($"发布页面已加锁。") isLock = True TsBtnReleaseLock.Text = "发布解锁" TsBtnStationDesign.Visible = False TabMain.SelectedIndex = TabControlEnum.TpStationTest End If End If End Sub ''' ''' 站位修改处理函数 ''' Private Sub IProcessStation_StationChanged() Implements IProcessStation.StationChanged ApplicationLog.WriteInfoLog($"主页面站位变更中,PN:{_utsApp.ProcessStation.ParentProject.Name} - SN:{_utsApp.ProcessStation.Name} - TP:{_utsApp.ProcessStation.Packet.Name}。") WinSettings.LastProjectName = _utsApp.ProcessStation.ParentProject.Name WinSettings.LastStationName = _utsApp.ProcessStation.Name '项目站包路径 Dim packetName As String = _utsApp.ProcessStation.Packet.Name UtsPath.StationPacketDirPath = UtsPath.GetStationPacketDirPath(packetName) UtsPath.StationPacketInfoPath = UtsPath.GetStationPacketInfoPath(packetName) UtsPath.StationPacketResourceDirPath = UtsPath.GetStationPacketResourceDirPath(packetName) UtsPath.StationPacketTestPlanDirPath = UtsPath.GetStationPacketTestPlanDirPath(packetName) TsBtnStationPlan.Visible = False TsBtnEditLock.Text = "编辑解锁" TsBtnStationDesign.Visible = False TsBtnReleaseLock.Text = "发布解锁" TabMain.SelectedIndex = TabControlEnum.TpStationTest ShowFormTitle(_utsApp.ProcessStation) ApplicationLog.WriteInfoLog($"主页面站位变更完成。") End Sub ''' ''' 产线修改后处理函数 ''' Public Sub ProductionLineChanged() Implements IProductionLine.ProductionLineChanged ApplicationLog.WriteInfoLog($"主页面生产线变更中。") ApplicationLog.WriteInfoLog($"主页面生产线变更完成。") End Sub Private Sub MsiUser_Click(sender As Object, e As EventArgs) Handles MsiUser.Click 'ThreadPool.QueueUserWorkItem(Sub() ' Throw New Exception("自定义线程错误") ' End Sub) End Sub Private Sub MsiHelp_Click(sender As Object, e As EventArgs) Handles MsiHelp.Click 'Throw New Exception("自定义UI线程错误") End Sub End Class