using System; using System.Collections.Generic; using static Step.Utils.Constants; using static Step.Config.StartupConfig; using CMS_CORE; using CMS_CORE.Demo; using CMS_CORE.Fanuc; using CMS_CORE.Siemens; using CMS_CORE.Osai; using Step.Model.DTOModels; using System.Globalization; using static Step.Utils.ExceptionManager; using static CMS_CORE.Nc; namespace Step.NC { public class NcHandler : IDisposable { public Nc numericalControl; public NcHandler() { // Choose NC numericalControl = SetNumericalControl(); } public CmsError Connect() { // Connect NC if (!numericalControl.NC_IsConnected()) return numericalControl.NC_Connect(); return null; } public Nc SetNumericalControl() { // Return new Numerical control instance choosed from the configuration switch (NcConfig.NcVendor) { case NC_VENDOR.DEMO: return new Nc_Demo(NcConfig.NcIpAddress, NcConfig.NcPort); case NC_VENDOR.FANUC: return new Nc_Fanuc(NcConfig.NcIpAddress, NcConfig.NcPort, 2000); case NC_VENDOR.SIEMENS: return new Nc_Siemens(2000); case NC_VENDOR.OSAI: return new Nc_Osai(NcConfig.NcIpAddress, NcConfig.NcPort, 2000); } return null; } public CmsError GetNcGenericData(out DTONcGenericDataModel genericData) { genericData = new DTONcGenericDataModel(); // Get date time DateTime dateTime = new DateTime(); CmsError cmsError = numericalControl.NC_RDateTime(ref dateTime); if (cmsError.errorCode != 0) return cmsError; genericData.DateTime = dateTime; // Get language CultureInfo lang = new CultureInfo("en"); cmsError = numericalControl.NC_RLanguage(ref lang); if (cmsError.errorCode != 0) return cmsError; genericData.Language = lang; string tmpInfo = ""; // Get serial number cmsError = numericalControl.NC_RSerialNumber(ref tmpInfo); if (cmsError.errorCode != 0) return cmsError; genericData.SerialNumber = tmpInfo; // Get software version numericalControl.NC_RSoftwareVersion(ref tmpInfo); if (cmsError.errorCode != 0) return cmsError; genericData.SoftwareVersion = tmpInfo; // Get model name numericalControl.NC_RModelName(ref tmpInfo); if (cmsError.errorCode != 0) return cmsError; genericData.Model = tmpInfo; // Get machine number numericalControl.NC_RMachineNumber(ref tmpInfo); if (cmsError.errorCode != 0) return cmsError; genericData.MachineNumber = tmpInfo; // Get max process number ushort procNum = 0; numericalControl.NC_RProcessesNum(ref procNum); if (cmsError.errorCode != 0) return cmsError; genericData.ProcessNumber = procNum; return cmsError; } public CmsError GetNcAlarms(out DTOAlarmsModel alarms) { alarms = new DTOAlarmsModel(); List tmpAlarms = new List(); // Read NC active alarms CmsError cmsError = numericalControl.NC_RActiveAlarms(ref tmpAlarms); if (cmsError.errorCode != 0) return cmsError; // Create response list from strings foreach (string alarmMessage in tmpAlarms) { alarms.NcAlarms.Add(new GenericAlarmModel() { alarmMessage = alarmMessage, }); } // Get NC max process number ushort maxProcNumber = 0; cmsError = numericalControl.NC_RProcessesNum(ref maxProcNumber); if (cmsError.errorCode != 0) return cmsError; // For each process for (ushort i = 1; i <= maxProcNumber; i++) { // Get process active alarms numericalControl.PROC_RActiveAlarms(i, ref tmpAlarms); // Create response list from strings foreach (string alarmMessage in tmpAlarms) { alarms.ProcessAlarms.Add(new ProcessAlarmModel() { alarmMessage = alarmMessage, process = i }); } } // Read PLC Active Messages cmsError = numericalControl.PLC_RActiveMessages(ref tmpAlarms); if (cmsError.errorCode != 0) return cmsError; // Formatting response list from strings foreach (string alarmMessage in tmpAlarms) { alarms.PlcAlarms.Add(new GenericAlarmModel() { alarmMessage = alarmMessage, }); } return cmsError; } public CmsError GetAxesPositions(out List axes) { axes = new List(); // Get NC max process number ushort maxProcNumber = 0; CmsError cmsError = numericalControl.NC_RProcessesNum(ref maxProcNumber); if (cmsError.errorCode != 0) return cmsError; // For each process for (ushort i = 1; i <= maxProcNumber; i++) { cmsError = GetAxesPositionsByProcess(i, out DTOAxesModel axis); if (cmsError.errorCode != 0) return cmsError; axes.Add(axis); } return cmsError; } public CmsError GetAxesPositionsByProcess(ushort processNum, out DTOAxesModel axes) { axes = new DTOAxesModel(); CmsError cmsError = numericalControl.AXES_RInterpPosition(processNum, ref axes.interpolated); if (cmsError.errorCode != 0) return cmsError; numericalControl.AXES_RMachinePosition(processNum, ref axes.machine); if (cmsError.errorCode != 0) return cmsError; numericalControl.AXES_RProgrPosition(processNum, ref axes.programmePos); if (cmsError.errorCode != 0) return cmsError; numericalControl.AXES_RDistanceToGo(processNum, ref axes.toGo); if (cmsError.errorCode != 0) return cmsError; //numericalControl.AXES_RFollowingError(1, ref axes.followingErr); return cmsError; } public void Dispose() { numericalControl.NC_Disconnect(); } } }