| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 | using Aitex.Common.Util;using Aitex.Core.RT.DataCenter;using Aitex.Core.RT.Log;using Aitex.Core.RT.SCCore;using Aitex.Core.Util;using DocumentFormat.OpenXml.Wordprocessing;using MECF.Framework.Common.Beckhoff.ModuleIO;using MECF.Framework.Common.Layout;using MECF.Framework.Common.TwinCat;using MECF.Framework.Common.Utilities;using System;using System.Collections.Generic;using System.IO;using System.IO.Ports;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Markup;namespace MECF.Framework.Common.Device.LinMot{    public class LinMotDeviceConfigManager : Singleton<LinMotDeviceConfigManager>    {        #region 常量        private string LINMOT_DEVICELIST = "LinMotDeviceList";        #endregion        /// <summary>        /// 模块数据更新委托字典        /// </summary>        private Dictionary<string, LinMotDelegate.OnUpdateModuleVariableValue> _linmotActionDic = new Dictionary<string, LinMotDelegate.OnUpdateModuleVariableValue>();        /// <summary>        /// 模块设备字典        /// </summary>        private Dictionary<string, LinMotDevice> _linmotDeviceDic = new Dictionary<string, LinMotDevice>();        /// <summary>        /// 模块串口设备字典        /// </summary>        private Dictionary<string, LinMotSerialDevice> _linmotSerialDevice = new Dictionary<string, LinMotSerialDevice>();        /// <summary>        /// 地址模块字典(key-母级模块,value-linmot device模块名称        /// </summary>        private Dictionary<string, string> _linmotDeviceAddressModuleDic = new Dictionary<string, string>();        /// <summary>        /// 配置文件对象        /// </summary>        private LinMotDeviceConfigCfg linMotDeviceConfigCfg = new LinMotDeviceConfigCfg();        /// <summary>        /// 初始化        /// </summary>        public void Initialize()        {            bool isSimulate = SC.GetValue<bool>("System.IsSimulatorMode");            string xmlPath = "";            if (isSimulate)            {                xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg-Simulator.xml";            }            else            {                xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg.xml";            }            try            {                linMotDeviceConfigCfg = CustomXmlSerializer.Deserialize<LinMotDeviceConfigCfg>(new FileInfo(xmlPath));                if (linMotDeviceConfigCfg != null)                {                    foreach (LinmotDeviceConfig config in linMotDeviceConfigCfg.LinmotDeviceConfigs)                    {                        DATA.Subscribe($"{config.Name}.{LINMOT_DEVICELIST}", () => config, SubscriptionAttribute.FLAG.IgnoreSaveDB);                        LinMotSerialDevice linMotSerialDevice = new LinMotSerialDevice(config.Name, config.Port, config.BaudRate, (StopBits)config.StopBit,                            config.Data, SerialPortUtil.GetParity(config.Parity), true);                        linMotSerialDevice.Initialize();                        InitialLinMotDevice(config, linMotSerialDevice);                    }                    LinMotErrorCodeManager.Instance.Initialize();                }            }            catch            {                LOG.WriteLog(eEvent.ERR_LINMOT, "Linmot", "Load linmot xml failed");            }        }        /// <summary>        /// 初始化LinMot设备        /// </summary>        /// <param name="config"></param>        private void InitialLinMotDevice(LinmotDeviceConfig config,LinMotSerialDevice linMotSerialDevice)        {            if(config.LinmotDevices!=null)            {                foreach(LinMotDevice device in config.LinmotDevices)                {                    _linmotSerialDevice[device.Name] = linMotSerialDevice;                                        _linmotDeviceDic[device.Name] = device;                    _linmotDeviceAddressModuleDic[$"{config.Name}_{device.Address}"] = device.Name;                    _linmotActionDic[device.Name] = null;                }            }        }        /// <summary>        /// 获取所有LinMot设备集合        /// </summary>        /// <returns></returns>        public List<string> GetLinMotDeviceList()        {            return _linmotDeviceDic.Keys.ToList();        }        /// <summary>        /// 初始化设备        /// </summary>        /// <param name="name"></param>        public void InitialDevice(string name)        {            if(_linmotSerialDevice.ContainsKey(name))            {                _linmotSerialDevice[name].Start();            }        }        /// <summary>        /// 查询连接状态        /// </summary>        /// <param name="name"></param>        /// <returns></returns>        public bool GetDeviceConnect(string name)        {            if(_linmotDeviceDic.ContainsKey(name))            {                return _linmotSerialDevice[name].Connected;            }            return false;        }        /// <summary>        /// 发送指令        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <param name="linMotOperation"></param>        public bool SendOperation(string name,byte id,LinMotOperation linMotOperation)        {            if(_linmotSerialDevice.ContainsKey(name))            {                if (linMotOperation != LinMotOperation.ReadStatus)                {                    LOG.WriteBackgroundLog(eEvent.INFO_LINMOT, name, $"{name} execute {linMotOperation}");                }                return _linmotSerialDevice[name].SendOperation(id, linMotOperation);            }            else            {                LOG.WriteBackgroundLog(eEvent.ERR_LINMOT, name, $"dictionary does not contain {name}");            }            return false;        }        /// <summary>        /// 发送Curve指令        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <param name="autoCount"></param>        /// <param name="curveId"></param>        /// <param name="timeScale"></param>        public bool SendCurveOperation(string name, byte id,ushort curveId, ushort timeScale)        {            if(_linmotSerialDevice.ContainsKey(name))            {                return _linmotSerialDevice[name].SendCurveOperation(id, curveId, timeScale);            }            return false;        }        /// <summary>        /// 发送CommandTable指令        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <param name="autoCount"></param>        /// <param name="entryId"></param>        /// <returns></returns>        public bool SendCommandTable(string name,byte id,short entryId)        {            if (_linmotSerialDevice.ContainsKey(name))            {                return _linmotSerialDevice[name].SendCommandTableOpertaion(id, entryId);            }            else            {                LOG.WriteLog(eEvent.ERR_LINMOT, name, $"{name} linmot is not in dictionary");            }            return false;        }        /// <summary>        /// 更新RAM变量        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <param name="lowByte"></param>        /// <param name="highByte"></param>        /// <param name="intValue"></param>        /// <returns></returns>        public bool SendWriteRamIntValue(string name, byte id, byte lowByte,byte highByte, int intValue)        {            if (_linmotSerialDevice.ContainsKey(name))            {                return _linmotSerialDevice[name].SendWriteRamIntValue(id,lowByte,highByte, intValue);            }            return false;        }        /// <summary>        /// 发送GAI GotoPosition        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <param name="autoCount"></param>        /// <param name="position"></param>        /// <param name="velocilty"></param>        /// <param name="accel"></param>        /// <param name="decel"></param>        /// <returns></returns>        public bool SendVAIGotoPosition(string name,byte id,int position,int velocilty,int accel,int decel)        {            if(_linmotSerialDevice.ContainsKey(name))            {                return _linmotSerialDevice[name].SendVAIGoToPositionOpertaion(id,position, velocilty,accel,decel);            }            return false;        }        /// <summary>        /// 发送GAI GotoPosition After Actual Command        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <param name="autoCount"></param>        /// <param name="position"></param>        /// <param name="velocilty"></param>        /// <param name="accel"></param>        /// <param name="decel"></param>        /// <returns></returns>        public bool SendVAIGotoPositionAfterActualCommand(string name, byte id, int position, int velocilty, int accel, int decel)        {            if (_linmotSerialDevice.ContainsKey(name))            {                return _linmotSerialDevice[name].SendVAIGoToPositionAfterAutalCommandOpertaion(id, position, velocilty, accel, decel);            }            return false;        }        /// <summary>        /// 获取LinMot设备        /// </summary>        /// <param name="name"></param>        /// <returns></returns>        public LinMotDevice GetLinMotDevice(string name)        {            if(_linmotDeviceDic.ContainsKey(name))            {                return _linmotDeviceDic[name];            }            return null;        }        /// <summary>        /// 获取Id         /// </summary>        /// <param name="name"></param>        /// <returns></returns>        public int GetAddress(string name)        {            if(_linmotDeviceDic.ContainsKey(name))            {                if(int.TryParse(_linmotDeviceDic[name].Address,out var address))                {                    return address;                }            }            return -1;        }        /// <summary>        /// 根据地址获取模块名称        /// </summary>        /// <param name="name"></param>        /// <param name="id"></param>        /// <returns></returns>        public string GetModuleNameByAddress(string name,byte id)        {            if(_linmotDeviceAddressModuleDic.ContainsKey($"{name}_{id}"))            {                return _linmotDeviceAddressModuleDic[$"{name}_{id}"];            }            return "";        }        /// <summary>        /// 注册变量数值发生变化回调        /// </summary>        /// <param name="moduleName"></param>        /// <param name="variable"></param>        /// <param name="onUpdateModuleVariableValue"></param>        public void SubscribeModuleVariable(string moduleName, LinMotDelegate.OnUpdateModuleVariableValue onUpdateModuleVariableValue)        {            _linmotActionDic[moduleName] = onUpdateModuleVariableValue;        }        /// <summary>        /// 更新数据        /// </summary>        /// <param name="moduleName"></param>        /// <param name="statusWord"></param>        /// <param name="errorCode"></param>        /// <param name="position"></param>        public void UpdateModuleData(string moduleName,short statusWord,short errorCode,int position)        {            if(_linmotActionDic.ContainsKey(moduleName))            {                _linmotActionDic[moduleName].Invoke(statusWord, errorCode, position);            }        }        /// <summary>        /// 更新linmot速度相关的参数        /// </summary>        /// <param name="deviceName"></param>        /// <param name=""></param>        public void UpdateSpeedData(string deviceName, string direction, double maxSpeed, int maxAcceleration,int maxDeceleration)        {                      if (linMotDeviceConfigCfg != null)            {                foreach (LinmotDeviceConfig config in linMotDeviceConfigCfg.LinmotDeviceConfigs)                {                    if (deviceName.Contains(config.Name))                    {                        foreach(var item in config.LinmotDevices)                        {                            if(item.Name == deviceName)                            {                                if ("up".Equals(direction))                                {                                    item.LinMotDeviceData.UpMaxSpeed = maxSpeed * 1000;                                    item.LinMotDeviceData.UpMaxAcceleration = maxAcceleration * 1000;                                    item.LinMotDeviceData.UpMaxDeceleration = maxDeceleration * 1000;                                }                                else                                {                                    item.LinMotDeviceData.DownMaxSpeed = maxSpeed * 1000;                                    item.LinMotDeviceData.DownMaxAcceleration = maxAcceleration * 1000;                                    item.LinMotDeviceData.DownMaxDeceleration = maxDeceleration * 1000;                                }                            }                        }                    }                }            }            bool isSimulate = SC.GetValue<bool>("System.IsSimulatorMode");            string xmlPath = "";            if (isSimulate)            {                xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg-Simulator.xml";            }            else            {                xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg.xml";            }            try            {                CustomXmlSerializer.Serialize(linMotDeviceConfigCfg, xmlPath);            }            catch            {                LOG.WriteLog(eEvent.ERR_LINMOT, "Linmot", "Save linmot xml failed");            }                    }    }}
 |