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");
- }
-
- }
- }
- }
|