Files
WC-CZGKJ/SCADA/MainGuide/MW.OnStart.cs
2026-05-11 11:09:04 +08:00

135 lines
5.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using DC_A95;
using ExternalDataSync;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using SystemFramework;
using WebApi;
namespace MesWork
{
/// <summary>
/// 程式启动
/// </summary>
public partial class MesWorkForm
{
/// <summary>
/// 从这里启动
/// </summary>
/// <param name="e"></param>
protected override void OnShown(EventArgs e)
{
}
public void OnStart(params object[] o)
{
//【1】系统基本参数设定
ThreadPool.SetMaxThreads(workerThreads, completionPortThreads);
Never_Know.Hello_You_All_Never_Know = Hello_You_All_Never_Know;
// 加载信号表(按设备类型对应表展开多工位)
var (dt_Tag_Mes, dt_Device) = BuildSignalTable(BasicDataTableFile);
// 保存工位名称列表及显示名映射供UC_Weighing标题使用
StationOpNames = new System.Collections.Generic.List<string>();
StationDisplayNames = new System.Collections.Generic.Dictionary<string, string>(System.StringComparer.OrdinalIgnoreCase);
int stIdx = 1;
foreach (System.Data.DataRow row in dt_Device.Rows)
{
string opName = row["工位号"].ToString().Trim();
string dataSource = row["数据来源"].ToString().Trim(); // 称重位1, 称重位2
StationOpNames.Add(opName);
// 显示格式:"OP10-称重位1"
StationDisplayNames[opName] = $"{opName}-{dataSource}";
stIdx++;
}
LoadOPCData(dt_Tag_Mes, dt_Device, IsDemoMesServer, IsWriteMonitorLog, true, false, out string error);
if (error.Length > 0)
{
MessageBox.Show($"加载信号产生错误,程序不能启动!!错误:{error}");
Process.GetCurrentProcess().Kill();
}
Thread.Sleep(200);
StartServer();
Thread.Sleep(200);
First_TagMonitor();
var task1 = new Thread(new ThreadStart(Loop_SelectAlarmShow));
task1.IsBackground = true;
task1.Start();
// Loop_ReadRealPageShow 已移除PLC信号显示将在 UC_Weighing 中实现
// var task2 = new Thread(new ThreadStart(Loop_ReadRealPageShow));
// task2.IsBackground = true;
// task2.Start();
initServer = new InitServer(MesWorkForm.WebApi_Port);
B_DB_Opera.SaveLog_Request(Curr_Station, Log_Type.ZK_Login, "", Log_FromAndTo.ZK, Log_FromAndTo.ZK, $"称重系统启动成功WebPort:[{MesWorkForm.WebApi_Port}]", out long AID);
}
/// <summary>
/// 构建信号表读取Excel模板按「设备类型对应表」的工位配置展开
/// 每个工位独立克隆一份模板TagID加工位号前缀如 OP10_TAG_0000001
/// 并填充对应的 工位号、数据来源、IP、DB
/// </summary>
/// <param name="excelFile">信号表Excel文件路径</param>
/// <returns>(展开后的信号表, 设备类型对应表)</returns>
private static (DataTable dtTagMes, DataTable dtDevice) BuildSignalTable(string excelFile)
{
// 读取设备类型对应表(所有启用的工位)
var dtDevice = NPOITest.ExeclHelper.ExcelToDataTable(excelFile, "设备类型对应表", true)
.Select("是否启用='1'").CopyToDataTable();
// 读取 MES_基本变量原始数据 模板(取全部启用行作为模板)
var dtTemplate = NPOITest.ExeclHelper.ExcelToDataTable(excelFile, "MES_基本变量原始数据", true)
.Select("是否启用='1'").CopyToDataTable();
// 按工位数量克隆模板
var dtTagMes = dtTemplate.Clone();
foreach (DataRow devRow in dtDevice.Rows)
{
string stationNo = devRow["工位号"].ToString().Trim(); // OP10, OP20
string dataSource = devRow["数据来源"].ToString().Trim(); // 称重位1, 称重位2
string deviceIP = devRow["设备IP"].ToString().Trim(); // 192.168.0.1
string deviceDB = devRow["DB"].ToString().Trim(); // DB1310, DB1311
// 提取纯DB号 ("DB1310" → "1310",若本身是数字则保持)
//string dbNumber = deviceDB.StartsWith("DB", StringComparison.OrdinalIgnoreCase)
// ? deviceDB.Substring(2) : deviceDB;
string dbNumber = deviceDB;
foreach (DataRow tplRow in dtTemplate.Rows)
{
var newRow = dtTagMes.NewRow();
for (int c = 0; c < dtTemplate.Columns.Count; c++)
newRow[c] = tplRow[c];
// 覆盖关键字段
newRow["TagID"] = $"{stationNo}_{tplRow["TagID"].ToString().Trim()}";
newRow["工位号"] = stationNo;
newRow["数据来源"] = dataSource;
newRow["IP"] = deviceIP;
newRow["DBName"] = dbNumber;
dtTagMes.Rows.Add(newRow);
}
}
return (dtTagMes, dtDevice);
}
}
}