|
@@ -2,7 +2,9 @@ using Helper;
|
|
|
using HZY.Framework.DependencyInjection;
|
|
|
using IoTClient.Clients.PLC;
|
|
|
using IoTClient.Common.Enums;
|
|
|
+using IoTClient.Enums;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
+using Microsoft.Extensions.Logging;
|
|
|
using MiniExcelLibs;
|
|
|
using Model;
|
|
|
using Scada.Page;
|
|
@@ -13,10 +15,13 @@ namespace Scada
|
|
|
public partial class FormMain : UIHeaderAsideMainFooterFrame,IScopedSelfDependency
|
|
|
{
|
|
|
private bool plcIsConnected;
|
|
|
+ private readonly ILogger<FormMain> _logger;
|
|
|
+ private Point mPoint;
|
|
|
+ private CancellationTokenSource cts = new CancellationTokenSource();
|
|
|
|
|
|
- public FormMain()
|
|
|
+ public FormMain(ILogger<FormMain> logger)
|
|
|
{
|
|
|
-
|
|
|
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
|
|
InitializeComponent();
|
|
|
InitAsideUI();
|
|
|
InitHeaderUI();
|
|
@@ -28,8 +33,8 @@ namespace Scada
|
|
|
|
|
|
private void InitConfig()
|
|
|
{
|
|
|
- //读取PLC配置
|
|
|
- Globals.IpAddress = Globals.IniFile.ReadString("PLC参数", "IP", "192.168.1.180");
|
|
|
+ //读取PLC配置 192.168.1.180 127.0.0.1
|
|
|
+ Globals.IpAddress = Globals.IniFile.ReadString("PLC参数", "IP", "127.0.0.1");
|
|
|
Globals.Port = Globals.IniFile.ReadInt("PLC参数", "Port", 102);
|
|
|
Globals.CpuType = Enum.Parse<SiemensVersion>(Globals.IniFile.ReadString("PLC参数", "CpuType", SiemensVersion.S7_1200.ToString()));
|
|
|
Globals.Slot = Globals.IniFile.ReadByte("PLC参数", "Slot", 0);
|
|
@@ -38,17 +43,117 @@ namespace Scada
|
|
|
Globals.ConnectTimeOut = Globals.IniFile.ReadInt("PLC参数", "ConnectTimeOut", 3000);
|
|
|
Globals.ReadTimeInterval = Globals.IniFile.ReadInt("PLC参数", "ReadTimeInterval", 300);
|
|
|
Globals.ReConnectTimeInterval = Globals.IniFile.ReadInt("PLC参数", "ReConnectTimeInterval", 3000);
|
|
|
- }
|
|
|
|
|
|
+ //PLC变量表路径
|
|
|
+ Globals.PlcVarConfigPath = Globals.IniFile.ReadString("PLC参数", "变量表地址", Path.Combine(Application.StartupPath, "PLC_Var_Config.xlsx"));
|
|
|
+
|
|
|
+ //删除文件夹路径
|
|
|
+ Globals.DelFilePath = Globals.IniFile.ReadString("系统参数", "删除文件夹路径", Path.Combine(Application.StartupPath, "Logs"));
|
|
|
+ //保存天数
|
|
|
+ Globals.SaveDay = Globals.IniFile.ReadString("系统参数", "保存天数", "30");
|
|
|
+
|
|
|
+ //试用时长
|
|
|
+ Globals.SYTime = Globals.IniFile.ReadInt("软件参数", "试用时间", 100);
|
|
|
+
|
|
|
+ //软件版本
|
|
|
+ Globals.SoftwareVersion = Globals.IniFile.ReadString("软件参数", "软件版本", "V1.0");
|
|
|
+
|
|
|
+ _logger.LogInformation("读取配置文件成功");
|
|
|
+ }
|
|
|
private void InitPlcClient()
|
|
|
{
|
|
|
- Globals.PlcVarConfigPath = Globals.IniFile.ReadString("PLC参数", "变量表地址",Application.StartupPath+"\\config.ini");
|
|
|
var plcVarList = MiniExcel.Query<PLCVarConfigModel>(Globals.PlcVarConfigPath).ToList();
|
|
|
|
|
|
Globals.SiemensClient = new SiemensClient(Globals.CpuType, Globals.IpAddress, Globals.Port, Globals.Slot, Globals.Rack, Globals.ConnectTimeOut);
|
|
|
var connectResult = Globals.SiemensClient.Open();
|
|
|
- }
|
|
|
|
|
|
+ if(connectResult.IsSucceed)
|
|
|
+ {
|
|
|
+ plcIsConnected = true;
|
|
|
+ this.led_PlcState.On = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ plcIsConnected = false;
|
|
|
+ this.led_PlcState.On = false;
|
|
|
+ }
|
|
|
+ for (int i = 0; i < plcVarList.Count; i++)
|
|
|
+ {
|
|
|
+ //初始化PLC变量地址字典 地址-类型
|
|
|
+ Globals.ReadDic.Add(plcVarList[i].PLC地址, Enum.Parse<DataTypeEnum>(plcVarList[i].变量类型, true));//忽略大小写
|
|
|
+ //初始化PLC变量写入 名称-地址 //初始化PLC变量值字典 名称-值
|
|
|
+ Globals.WriteDic.Add(plcVarList[i].名称, plcVarList[i].PLC地址);
|
|
|
+ //初始化PLC变量值字典 名称-值
|
|
|
+ Globals.DataDic.Add(plcVarList[i].名称, "NA");
|
|
|
+ if (plcVarList[i].是否保存.ToLower() == "true")
|
|
|
+ {
|
|
|
+ Globals.SaveList.Add(plcVarList[i].名称);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _logger.LogInformation("初始化PLC客户端成功");
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Task.Run(async () =>
|
|
|
+ {
|
|
|
+ while (!cts.IsCancellationRequested)
|
|
|
+ {
|
|
|
+ if (plcIsConnected)
|
|
|
+ {
|
|
|
+ //这个方法的目的是将大量的数据读取请求分批处理,以提高性能和可管理性。
|
|
|
+ var readResult = Globals.SiemensClient.BatchRead(Globals.ReadDic);
|
|
|
+ if (readResult.IsSucceed)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < plcVarList.Count; i++)
|
|
|
+ {
|
|
|
+ Globals.DataDic[plcVarList[i].名称] = readResult.Value[plcVarList[i].PLC地址];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Globals.SiemensClient.Close();
|
|
|
+ plcIsConnected = false;
|
|
|
+
|
|
|
+ this.Invoke(() =>
|
|
|
+ {
|
|
|
+ this.led_PlcState.On = false;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ await Task.Delay(Globals.ReadTimeInterval);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //重连PLC
|
|
|
+ var reConnectResult = Globals.SiemensClient.Open();
|
|
|
+ if (reConnectResult.IsSucceed)
|
|
|
+ {
|
|
|
+ plcIsConnected = true;
|
|
|
+ this.Invoke(() =>
|
|
|
+ {
|
|
|
+ this.led_PlcState.On = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ plcIsConnected = false;
|
|
|
+ this.Invoke(() =>
|
|
|
+ {
|
|
|
+ this.led_PlcState.On = false;
|
|
|
+ });
|
|
|
+ await Task.Delay(Globals.ReConnectTimeInterval);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ await Task.Delay(1000);
|
|
|
+ }, cts.Token);
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+ }
|
|
|
private void InitAsideUI()
|
|
|
{
|
|
|
int pageIndex = 1000;
|
|
@@ -152,5 +257,18 @@ namespace Scada
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private void Panel_MouseDown(object sender, MouseEventArgs e)
|
|
|
+ {
|
|
|
+ mPoint = new Point(e.X, e.Y);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Panel_MouseMove(object sender, MouseEventArgs e)
|
|
|
+ {
|
|
|
+ if (e.Button == MouseButtons.Left)
|
|
|
+ {
|
|
|
+ this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|