Migrate to .NET8 GenCycleVDP
Migrate generator to .NET8
This commit is contained in:
23
GenCycleVDP/Db/DbCycle.cs
Normal file
23
GenCycleVDP/Db/DbCycle.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace GenCycleVDP.Db
|
||||
{
|
||||
[Table("Cycles")]
|
||||
internal class DbCycle
|
||||
{
|
||||
[Column("idCycle"), Required, Key]
|
||||
public int IdCycle { get; set; }
|
||||
[Column("numVdp")]
|
||||
public int NumVdp { get; set; }
|
||||
[Column("numCycle")]
|
||||
public int NumCycle { get; set; }
|
||||
[Column("factStart")]
|
||||
public DateTime FactStart { get; set; }
|
||||
[Column("thinkEnd")]
|
||||
public DateTime ThinkEnd { get; set; }
|
||||
[Column("factEnd")]
|
||||
public DateTime FactEnd { get; set; }
|
||||
}
|
||||
}
|
23
GenCycleVDP/Db/DbFurnace.cs
Normal file
23
GenCycleVDP/Db/DbFurnace.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace GenCycleVDP.Db
|
||||
{
|
||||
internal class DbFurnace : DbContext
|
||||
{
|
||||
public DbSet<DbCycle> Cycles { get; set; }
|
||||
public DbFurnace()
|
||||
{
|
||||
Database.EnsureCreated();
|
||||
}
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
optionsBuilder.UseMySql("server=127.0.0.1;user=diplom;password=diplom;database=VDPCycles;", new MySqlServerVersion(new Version(8, 0)));
|
||||
}
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
152
GenCycleVDP/GenCycle.cs
Normal file
152
GenCycleVDP/GenCycle.cs
Normal file
@@ -0,0 +1,152 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using GenCycleVDP.Resources;
|
||||
|
||||
namespace GenCycleVDP
|
||||
{
|
||||
internal class GenCycle(int vdp)
|
||||
{
|
||||
private readonly int vdp = vdp;
|
||||
|
||||
private CycleStatus currCycle = CycleStatus.EndTechCycle;
|
||||
private DateTime factStart = DateTime.Now;
|
||||
private DateTime factEnd = DateTime.Now;
|
||||
private DateTime thinkEnd = DateTime.Now;
|
||||
|
||||
private bool cycle = false;
|
||||
private Task taskCycle = Task.CompletedTask;
|
||||
|
||||
public void Start()
|
||||
{
|
||||
cycle = true;
|
||||
taskCycle = this.Cycle();
|
||||
}
|
||||
public void Stop()
|
||||
{
|
||||
cycle = false;
|
||||
taskCycle.Wait();
|
||||
}
|
||||
|
||||
async public Task Cycle()
|
||||
{
|
||||
while (cycle)
|
||||
{
|
||||
if (GetCurrCycle()) //Can get info form DB.
|
||||
{
|
||||
if (DateTime.Now >= factEnd)
|
||||
{
|
||||
GetNextCycle();
|
||||
GetTimeStart();
|
||||
GetTimeThinkEnd();
|
||||
GetTimeFactEnd();
|
||||
while (!SaveToDB())
|
||||
{
|
||||
Console.WriteLine("VDP " + vdp.ToString("D2") + ": Can't connect to DB.");
|
||||
await Task.Delay(5000);
|
||||
}
|
||||
}
|
||||
}
|
||||
else //It's new Cycle.
|
||||
{
|
||||
GetTimeStart();
|
||||
GetTimeThinkEnd();
|
||||
GetTimeFactEnd();
|
||||
while (!SaveToDB())
|
||||
{
|
||||
Console.WriteLine("VDP " + vdp.ToString("D2") + ": Can't connect to DB.");
|
||||
await Task.Delay(5000);
|
||||
}
|
||||
}
|
||||
|
||||
while (cycle && (DateTime.Now < factEnd))
|
||||
{
|
||||
var secAwait = (factEnd - DateTime.Now).TotalSeconds;
|
||||
if (secAwait >= 5)
|
||||
{
|
||||
await Task.Delay(5000);
|
||||
}
|
||||
else
|
||||
{
|
||||
await Task.Delay(Convert.ToInt32(Math.Ceiling(secAwait)) * 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool GetCurrCycle()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var db = new Db.DbFurnace();
|
||||
var tmp = (from u in db.Cycles
|
||||
where
|
||||
u.NumVdp == vdp
|
||||
orderby u.FactStart descending
|
||||
select u).FirstOrDefault();
|
||||
if (tmp == null)
|
||||
{
|
||||
currCycle = CycleStatus.EndTechCycle;
|
||||
return false;
|
||||
}
|
||||
currCycle = Enum.IsDefined(typeof(CycleStatus), tmp.NumCycle)
|
||||
? (CycleStatus)tmp.NumCycle
|
||||
: CycleStatus.EndTechCycle;
|
||||
factStart = tmp.FactStart;
|
||||
factEnd = tmp.FactEnd;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public void GetNextCycle()
|
||||
{
|
||||
currCycle = GenData.GetNextCycle(currCycle);
|
||||
}
|
||||
public void GetTimeStart()
|
||||
{
|
||||
factStart = factEnd;
|
||||
}
|
||||
public void GetTimeThinkEnd()
|
||||
{
|
||||
thinkEnd = factStart.AddMinutes(GenData.GetDuration(currCycle));
|
||||
}
|
||||
public void GetTimeFactEnd()
|
||||
{
|
||||
factEnd = thinkEnd.AddSeconds(GenData.GetDeviation(currCycle));
|
||||
}
|
||||
public bool SaveToDB()
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var db = new Db.DbFurnace())
|
||||
{
|
||||
var tmp = new Db.DbCycle()
|
||||
{
|
||||
NumVdp = vdp,
|
||||
NumCycle = (int)currCycle,
|
||||
FactStart = factStart,
|
||||
FactEnd = factEnd,
|
||||
ThinkEnd = thinkEnd
|
||||
};
|
||||
db.Cycles.Add(tmp);
|
||||
db.SaveChanges();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public string GetStatus()
|
||||
{
|
||||
return vdp.ToString("D2") + "-" + currCycle.ToString();
|
||||
}
|
||||
}
|
||||
}
|
14
GenCycleVDP/GenCycleVDP.csproj
Normal file
14
GenCycleVDP/GenCycleVDP.csproj
Normal file
@@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
54
GenCycleVDP/Program.cs
Normal file
54
GenCycleVDP/Program.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GenCycleVDP
|
||||
{
|
||||
internal class Program
|
||||
{
|
||||
private static bool isExiting = false;
|
||||
private static List<GenCycle> tasks = [];
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
for (var i = 1; i <= 48; i++)
|
||||
{
|
||||
var a = new GenCycle(i);
|
||||
a.Start();
|
||||
tasks.Add(a);
|
||||
}
|
||||
Task.Delay(1000 * 5).Wait();
|
||||
|
||||
int count = 0;
|
||||
while (!isExiting)
|
||||
{
|
||||
if (count > 600)
|
||||
{
|
||||
for (var i = 0; i < tasks.Count; i++)
|
||||
{
|
||||
if (i % 10 == 0 && i != 0)
|
||||
Console.WriteLine();
|
||||
Console.Write(tasks[i].GetStatus() + "|");
|
||||
}
|
||||
Console.WriteLine();
|
||||
count = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
count++;
|
||||
}
|
||||
Task.Delay(1000).Wait();
|
||||
}
|
||||
foreach(var furance in tasks)
|
||||
{
|
||||
furance.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnExit(object sender, ConsoleCancelEventArgs e)
|
||||
{
|
||||
isExiting = true;
|
||||
e.Cancel = true;
|
||||
}
|
||||
}
|
||||
}
|
20
GenCycleVDP/Resources/CycleStatus.cs
Normal file
20
GenCycleVDP/Resources/CycleStatus.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
namespace GenCycleVDP.Resources
|
||||
{
|
||||
public enum CycleStatus : ushort
|
||||
{
|
||||
EndTechCycle = 0,
|
||||
LoadUnload = 1,
|
||||
VacForWelding = 2,
|
||||
Welding = 5,
|
||||
CoolingWelding = 6,
|
||||
CheckWelding = 7,
|
||||
VacForMelting = 8,
|
||||
DilutionVat = 9,
|
||||
Melting = 10,
|
||||
BringShrinkageCavity = 11,
|
||||
CoolingIngot = 12,
|
||||
VacForMeltingScarp = 14,
|
||||
MeltingScarp = 15,
|
||||
CoolingMeltingScarp = 16
|
||||
}
|
||||
}
|
131
GenCycleVDP/Resources/GenData.cs
Normal file
131
GenCycleVDP/Resources/GenData.cs
Normal file
@@ -0,0 +1,131 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace GenCycleVDP.Resources
|
||||
{
|
||||
internal static class GenData
|
||||
{
|
||||
private static readonly Random random = new();
|
||||
private static readonly Dictionary<CycleStatus, (Func<CycleStatus> NextState, int Duration, (int min, int offset))> genDataMap = new()
|
||||
{
|
||||
{
|
||||
CycleStatus.EndTechCycle,
|
||||
(() => random.Next(100) < 50
|
||||
? CycleStatus.VacForMeltingScarp
|
||||
: CycleStatus.VacForWelding,
|
||||
15,
|
||||
(7 * 60, 5 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.LoadUnload,
|
||||
(() => CycleStatus.VacForWelding,
|
||||
15,
|
||||
(3 * 60, 2 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.VacForWelding,
|
||||
(() => CycleStatus.Welding,
|
||||
10,
|
||||
(11 * 60, 1 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.Welding,
|
||||
(() => CycleStatus.CoolingWelding,
|
||||
13,
|
||||
(4 * 60, 3 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.CoolingWelding,
|
||||
(() => CycleStatus.CheckWelding,
|
||||
7,
|
||||
(4 * 60, 3 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.CheckWelding,
|
||||
(() => random.Next(100) < 20
|
||||
? CycleStatus.Welding
|
||||
: CycleStatus.VacForMelting,
|
||||
5,
|
||||
(7 * 60, 2 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.VacForMelting,
|
||||
(() => CycleStatus.DilutionVat,
|
||||
10,
|
||||
(11 * 60, 1 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.DilutionVat,
|
||||
(() => CycleStatus.Melting,
|
||||
5,
|
||||
(2 * 60, 1 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.Melting,
|
||||
(() => CycleStatus.BringShrinkageCavity,
|
||||
60,
|
||||
(40 * 60, 30 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.BringShrinkageCavity,
|
||||
(() => CycleStatus.CoolingIngot,
|
||||
15,
|
||||
(5 * 60, 3 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.CoolingIngot,
|
||||
(() => CycleStatus.EndTechCycle,
|
||||
30,
|
||||
(20 * 60, 10 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.VacForMeltingScarp,
|
||||
(() => CycleStatus.MeltingScarp,
|
||||
10,
|
||||
(11 * 60, 1 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.MeltingScarp,
|
||||
(() => CycleStatus.CoolingMeltingScarp,
|
||||
20,
|
||||
(4 * 60, 3 * 60))
|
||||
},
|
||||
{
|
||||
CycleStatus.CoolingMeltingScarp,
|
||||
(() => CycleStatus.LoadUnload,
|
||||
15,
|
||||
(4 * 60, 3 * 60))
|
||||
},
|
||||
};
|
||||
|
||||
public static CycleStatus GetNextCycle(CycleStatus currCycle)
|
||||
{
|
||||
CycleStatus nextCycle = CycleStatus.EndTechCycle;
|
||||
if(genDataMap.TryGetValue(currCycle, out var data))
|
||||
{
|
||||
nextCycle = data.NextState();
|
||||
}
|
||||
return nextCycle;
|
||||
}
|
||||
|
||||
public static int GetDuration(CycleStatus currCycle)
|
||||
{
|
||||
int duration = 15;
|
||||
if (genDataMap.TryGetValue(currCycle, out var data))
|
||||
{
|
||||
duration = data.Duration;
|
||||
}
|
||||
return duration;
|
||||
}
|
||||
|
||||
public static int GetDeviation(CycleStatus currCycle)
|
||||
{
|
||||
int deviation = random.Next(7 * 60) - (5 * 60);
|
||||
if (genDataMap.TryGetValue(currCycle, out var data))
|
||||
{
|
||||
deviation = random.Next(data.Item3.min) - data.Item3.offset;
|
||||
}
|
||||
return deviation;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user