using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.Beckhoff.IOAxis; using MECF.Framework.Common.Utilities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MECF.Framework.Common.TwinCat { public class BeckhoffAxisManager : Singleton { #region 常量 private string IO_TYPE = "axis"; #endregion #region 内部变量 private Dictionary> _moduleVariableValueDic = new Dictionary>(); private Dictionary _moduleVariableActionDic = new Dictionary(); private Dictionary _moduleAxisDic = new Dictionary(); private int _size = 0; private BeckhoffCfg _cfg; #endregion #region 属性 public int Size { get { return _size; } set { _size = value; } } #endregion /// /// 初始化 /// /// public void Initialize(BeckhoffCfg cfg) { _cfg = cfg; foreach (BeckhoffAxis item in cfg.Controller.Axises) { string moduleName = item.Name; if (!_moduleVariableValueDic.ContainsKey(moduleName)) { _moduleVariableValueDic[moduleName] = new Dictionary(); } foreach (BeckhoffAxisInput input in item.Inputs) { if (!input.Address.StartsWith("0x")) { string inputName = $"{moduleName}.{input.Type}"; _moduleVariableValueDic[moduleName][input.Type] = null; int dataSize = DataTypeUtil.GetDataTypeSize(input.DataType); BeckhoffItemManager.Instance.InitBeckhoffItem(inputName, input.Address, input.DataType, IO_TYPE, dataSize, false, 0,false); _size += dataSize; } else { _moduleVariableValueDic[moduleName][input.Type] = null; } } foreach (BeckhoffAxisOutput output in item.Outputs) { if (!output.Address.StartsWith("0x")) { string outputName = $"{moduleName}.{output.Type}"; _moduleVariableValueDic[moduleName][output.Type] = null; int dataSize = DataTypeUtil.GetDataTypeSize(output.DataType); BeckhoffItemManager.Instance.InitBeckhoffItem(outputName, output.Address, output.DataType, IO_TYPE, dataSize, false, 0,false); BeckhoffItemManager.Instance.InitWriteBeckoffItem(outputName, output.Address, output.DataType, IO_TYPE, dataSize, false, 0,false); _size += dataSize; } } DATA.Subscribe($"{moduleName}.BeckhoffAxis", () => item, SubscriptionAttribute.FLAG.IgnoreSaveDB); _moduleAxisDic[moduleName] = item; } } /// /// 启动coe服务 /// public void StartCoeInterface() { Thread coeSthread = new Thread(new ThreadStart(StartCOEInterfaceThread)); coeSthread.IsBackground = true; coeSthread.Start(); } /// /// 启动COE接口线程 /// private void StartCOEInterfaceThread() { bool isSimulatorMode = SC.GetValue("System.IsSimulatorMode"); foreach (BeckhoffAxis item in _cfg.Controller.Axises) { if (!isSimulatorMode) { TwincatCoeManager.Instance.Initialize(item); } } if (!isSimulatorMode) { TwincatCoeManager.Instance.StartReadInput(); } } /// /// 更新变量数值 /// /// /// public void SetAxisValue(string name,object value) { bool _enableRead = SC.GetValue("Twincat.EnableReadLog"); if (_enableRead) { LOG.WriteBackgroundLog(eEvent.INFO_TWINCAT, "System", $"read {name} value {value}"); } string[] strAry = name.Split('.'); if(strAry.Length<2) { return; } string moduleName = $"{strAry[0]}.{strAry[1]}"; string variableName = name.Replace($"{moduleName}.",""); if(_moduleVariableValueDic.ContainsKey(moduleName)) { if (_moduleVariableValueDic[moduleName].ContainsKey(variableName)) { _moduleVariableValueDic[moduleName][variableName] = value; if(_moduleVariableActionDic.ContainsKey(name)) { _moduleVariableActionDic[name].Invoke(variableName, value); } } } } /// /// 注册变量数值发生变化回调 /// /// /// /// public void SubscribeModuleVariable(string moduleName, string variable, BeckhoffDelegate.OnUpdateModuleVariableValue onUpdateModuleVariableValue) { _moduleVariableActionDic[$"{moduleName}.{variable}"] = onUpdateModuleVariableValue; if (_moduleVariableValueDic.ContainsKey(moduleName)) { if (_moduleVariableValueDic[moduleName].ContainsKey(variable)) { _moduleVariableActionDic[$"{moduleName}.{variable}"].Invoke(variable, _moduleVariableValueDic[moduleName][variable]); } } } /// /// 写入变量数值 /// /// /// /// public bool WriteVariableValue(string name,object setPoint) { return TwincatAdoManager.Instance.WriteValue(name, setPoint); } /// /// 获取Axis对象 /// /// /// public BeckhoffAxis GetAxis(string name) { return _moduleAxisDic.ContainsKey(name) ? _moduleAxisDic[name]:null; } } }