using HH.WCS.Mobox3.DoubleCoin.core;
|
using HH.WCS.Mobox3.DoubleCoin.device;
|
using HH.WCS.Mobox3.DoubleCoin.util;
|
using Microsoft.Owin.Hosting;
|
using System;
|
using System.Collections.Generic;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using Topshelf;
|
using Monitor = HH.WCS.Mobox3.DoubleCoin.core.Monitor;
|
|
namespace HH.WCS.Mobox3.DoubleCoin
|
{
|
internal class Program
|
{
|
static void Main(string[] args)
|
{
|
//基础设置信息初始化
|
Settings.Init();
|
//1.0 开启api
|
Startup();
|
//2.0 开启tcp
|
StartTcp();
|
//3.0 开启S7
|
StartS7();
|
//4.0 开启Modbus
|
//StartModbus();
|
|
//5.0 开启线程
|
var rc = HostFactory.Run(x =>
|
{
|
x.Service<WorkThread>(s =>
|
{
|
s.ConstructUsing(name => new WorkThread());
|
s.WhenStarted(tc => tc.Start());
|
s.WhenStopped(tc => tc.Stop());
|
});
|
x.RunAsLocalSystem();
|
|
x.SetDescription("hh123");
|
x.SetDisplayName("hh123.wms");
|
x.SetServiceName("hh123.wms");
|
});
|
|
var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
|
Environment.ExitCode = exitCode;
|
}
|
|
/// <summary>
|
/// 开启API协议通讯
|
/// </summary>
|
private static void Startup()
|
{
|
Console.WriteLine("Startup ApiController");
|
Task.Run(() =>
|
{
|
var url = Settings.WebApiUrl;
|
Console.WriteLine(url);
|
using (WebApp.Start<Startup>(url))
|
{
|
Console.WriteLine("API,Running on {0}", url);
|
Console.ReadLine();
|
}
|
});
|
}
|
|
/// <summary>
|
/// 开启TCP协议通讯,服务端
|
/// </summary>
|
private static void StartTcp()
|
{
|
var tcpServerIP = Settings.TCPServerIP;
|
var tcpServerPort = Settings.TCPServerPort;
|
new TcpServer(tcpServerIP, tcpServerPort);
|
|
}
|
|
/// <summary>
|
/// 开启S7协议通讯
|
/// </summary>
|
private static void StartS7()
|
{
|
//所有的S7设备
|
var allPLCDevice = Settings.ProductionLines;
|
|
if (allPLCDevice.Count > 0)
|
{
|
foreach (var item in allPLCDevice)
|
{
|
new S7Helper(item.ProductionLine_IP, (short)item.ProductionLine_Rack, (short)item.ProductionLine_Slot);
|
Console.WriteLine("S7ProductionLineHelper," + item.ProductionLine_IP);
|
}
|
}
|
|
//称重的S7设备
|
var weightPLCDevice = Settings.WeightDevices;
|
|
if (weightPLCDevice.Count > 0)
|
{
|
foreach (var item in weightPLCDevice)
|
{
|
new S7Helper(item.WeightDevice_IP, (short)item.WeightDevice_Rack, (short)item.WeightDevice_Slot);
|
Console.WriteLine("S7WeightDeviceHelper," + item.WeightDevice_Name);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 开启Modbus协议通讯
|
/// </summary>
|
private static void StartModbus()
|
{
|
//所有的Modbus设备
|
//var allPLCDevice = Settings.SafeDoorDevices;
|
|
//if (allPLCDevice.Count > 0)
|
//{
|
// foreach (var item in allPLCDevice)
|
// {
|
// new ModbusHelper(item.IPAddress, item.Port);
|
// Console.WriteLine("ModbusHelper," + item.IPAddress);
|
// }
|
//}
|
}
|
|
public class WorkThread
|
{
|
public void Start()
|
{
|
List<Task> tasks = new List<Task>();
|
//添加任务推送线程
|
tasks.Add(GetTask(WCSCore.Dispatch));
|
|
//添加自定义线程
|
tasks.Add(GetTask(Monitor.CheckEmptyCnt));//检测空托盘
|
|
tasks.Add(GetTask(Monitor.CheckCntAndBoard));//同步 TN_Container 均要实时显示
|
|
tasks.Add(GetTask(Monitor.CheckNoOkCg));//检测满托缓存库区不合格的物品,满托出库复检
|
|
//根据S7/Modbus协议判断输送线的信号 原材料产线库区=>满托缓存库区,空托缓存库区=>原材料产线库区
|
tasks.Add(GetTask(Monitor.CheckS7Devices));
|
|
tasks.Add(GetTask(Monitor.SynchronizationEquipPro));//同步 TN_EquipProDetail TN_InventoryM 年月日重量表
|
|
tasks.Add(GetTask(Monitor.FullOutTime));//满托过期出库 过期合格回库,过期次品回炉
|
|
tasks.Add(GetTask(Monitor.CGOkCheck));// 在复检区检测物品合格,合格的物品自动回库
|
|
Task.WaitAll(tasks.ToArray());
|
}
|
public void Stop() { Console.WriteLine("work stopped"); }
|
private Task GetTask(Action action)
|
{
|
var task = Task.Run(() =>
|
{
|
while (true)
|
{
|
try
|
{
|
action();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
}
|
Thread.Sleep(3000);
|
}
|
});
|
return task;
|
}
|
}
|
}
|
}
|