Files
6098/Cowain.Bake.Communication/PLC/PLCManage.cs

97 lines
3.7 KiB
C#
Raw Normal View History


using Cowain.Bake.BLL;
using Cowain.Bake.Common;
using Cowain.Bake.Common.Core;
using Cowain.Bake.Common.Enums;
using Cowain.Bake.Common.Models;
using Cowain.Bake.Communication.Interface;
using Cowain.Bake.Model;
using Cowain.Bake.Model.Models;
using Prism.Ioc;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Unity;
namespace Cowain.Bake.Communication.PLC
{
public class PLCManage
{
IUnityContainer _unityContainer;
private List<TDeviceConfig> plcList;
public PLCManage(IUnityContainer unityContainer)
{
_unityContainer = unityContainer;
plcList = _unityContainer.Resolve<DeviceConfigService>().GetConfig(EDeviceType.PLC);
foreach (var item in plcList)
{
Assembly asm = Assembly.GetExecutingAssembly(); //获得当前程序的绝对路径
Type type = asm.GetType(MyPath.PLC + item.DriverName);
unityContainer.RegisterSingleton(typeof(IPLCDevice), type, item.Name);
var plc = _unityContainer.Resolve<IPLCDevice>(item.Name); //几个PLC就实例化几个
plc.Id = item.Id;
plc.Name = item.Name;
plc.DeviceName = item.DriverName;
plc.GetJsonParam(item.Json);
//2023.3.1修改不需要读取StorageList驱动自己分批读取
var plcTagList = _unityContainer.Resolve<TagListService>().GetTagList(item.Id); //获取PLC的标签和节点
if (plcTagList != null && plcTagList.Count > 0)
{
int q = 0;
plcTagList.ForEach((x) =>
{
plc.TagList.Add(x);
plc.VariableList.Add(new Variable()
{
Id = (int)x.Id,
Quality = false,
VarType = x.VarType,
ArrayLength = x.ArrayLen,
StationId = x.StationId,
ParamName = x.ParamName,
Number = x.Number,
Index = q++,
TrigEnable = x.TirgEnable,
TrigJson = x.TrigJson,
OperType = x.OperType.Value,
Json = x.Json,
VarDesc = x.VarDesc,
VarName = x.VarName,
Address = x.Address,
TagType = x.TagType
});
});
foreach (var v in plc.VariableList)
{
if (!plc.VariableDic.ContainsKey(v.Id))
{
plc.VariableDic.Add(v.Id, v);
}
else
{
LogHelper.Instance.Error($"PLC有相同的节点,Node=[{v.VarName}]");
}
}
}
if (item.Enable)
{
plc.AnalysisAddress(); //把地址拆开,并计算长度
plc.GetStorageArea(); //获取存储区域
//plc.Connect();
//plc.StartRead();
Task t = new Task(() => //var t = Task.Run(async delegate
{
plc.Connect();
});
plc.StartRead();
}
}
}
}
}