diff --git a/CMS_CORE_Application/Form1.cs b/CMS_CORE_Application/Form1.cs index 03fdd11..d3adc92 100644 --- a/CMS_CORE_Application/Form1.cs +++ b/CMS_CORE_Application/Form1.cs @@ -118,14 +118,25 @@ namespace CMS_CORE_Application ////////////////////////////////////////////////////////////// TEST Stopwatch st = new Stopwatch(); sw.Restart(); - N.NC_Connect(); - Dictionary b = new Dictionary(); - N.AXES_RInterpPosition(1, ref b); + + List lists = new List(); - List ints = new List(); - N.MEM_RWIntegerList(false, 1, Nc.MEMORY_TYPE.Siemens_DB, 258, 0, 256, ref ints); - List counters = new List(); - N.PLC_RMachineCounters(ref counters); + cmsError = N.PLC_RM156Data(ref lists); + if (cmsError.IsError()) { error = true; SetError(Lines, cmsError); } + + if(lists.Count() > 0) + { + cmsError = N.PLC_WM156Response(1, 12.23); + if(cmsError.IsError()) + { error = true; SetError(Lines, cmsError); } + } + + ToolMovementModel mov = new ToolMovementModel(); + cmsError = N.PLC_RToolMovement(ref mov); + if (cmsError.IsError()) { error = true; SetError(Lines, cmsError); } + + + N.PLC_WTerminateMovementProcedure(MOVEMENT_RESPONSE.OK); sw.Stop(); Console.WriteLine("TEMPO PER FUNZIONE " + sw.ElapsedMilliseconds); @@ -247,6 +258,10 @@ namespace CMS_CORE_Application if (t != null) t.Abort(); + + t = new Thread(new ThreadStart(ReadBasicData)); + t.Start(); + TXTPath1.Text = ""; TXTStat1.Text = ""; TXTNProcess.Text = ""; diff --git a/CMS_CORE_Library/Demo/Nc_Demo.cs b/CMS_CORE_Library/Demo/Nc_Demo.cs index c05fbf8..81c1cef 100644 --- a/CMS_CORE_Library/Demo/Nc_Demo.cs +++ b/CMS_CORE_Library/Demo/Nc_Demo.cs @@ -911,6 +911,16 @@ namespace CMS_CORE_Library.Demo return NO_ERROR; } + public override CmsError PLC_RM156Data(ref List value) + { + return NO_ERROR; + } + + public override CmsError PLC_WM156Response(int process, double responseVal) + { + return NO_ERROR; + } + public override CmsError PLC_RScadaValue(string memIndex, SCADA_MEM_TYPE memType, ref object value) { string[] index = memIndex.Split('.'); @@ -1248,6 +1258,16 @@ namespace CMS_CORE_Library.Demo return NO_ERROR; } + public override CmsError PLC_RToolMovement(ref ToolMovementModel toolMovement) + { + return NO_ERROR; + } + + public override CmsError PLC_WTerminateMovementProcedure(MOVEMENT_RESPONSE resp) + { + return NO_ERROR; + } + #endregion PLC High-level data /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs b/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs index eede606..0fe2c91 100644 --- a/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs +++ b/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs @@ -563,22 +563,10 @@ namespace CMS_CORE_Library.Fanuc return cmsError; if (plcWatchdog) - { - plcWatchdog = false; - cmsError = MEM_RWBoolean(W, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, 1, ref plcWatchdog); - if (cmsError.IsError()) - return cmsError; - - cmsError = MEM_RWBoolean(R, 0, ACTIVE_WATCHDOG.MemType, ACTIVE_WATCHDOG.Address, 1, ref plcWatchdog); - if (cmsError.IsError()) - return cmsError; - } - else - { return PLC_NOT_RUNNING_ERROR; - } - return NO_ERROR; + plcWatchdog = true; + return MEM_RWBoolean(W, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, 1, ref plcWatchdog); } // Get PMC Messages @@ -1057,7 +1045,7 @@ namespace CMS_CORE_Library.Fanuc // Read value from custom macro double macroVal = 0; - ReadMacroValue((int)processId, 955, true, ref macroVal); + ReadMacroValue((int)processId, M155_RESPONSE_MEMORY, true, ref macroVal); value.Add(new M155InputIsNeededModel() { @@ -1092,13 +1080,60 @@ namespace CMS_CORE_Library.Fanuc public override CmsError PLC_WOperatorInputResponse(int processId, double responseVal) { - CmsError cmsError = WriteMacroValue(processId, 955, responseVal); + CmsError cmsError = WriteMacroValue(processId, M155_RESPONSE_MEMORY, responseVal); if (cmsError.IsError()) return cmsError; return PLC_WStrobe(M155_INPUT_ACK, M155_INPUT_STROBE, (uint)processId); } + public override CmsError PLC_RM156Data(ref List value) + { + byte val = 0; + List vals = new List(); + CmsError cmsError = MEM_RWByte(R, 0, M156_INPUT_NEEDED.MemType, M156_INPUT_NEEDED.Address, 0, ref val); + if (cmsError.IsError()) + return cmsError; + + cmsError = MEM_RWByteList(R, 0, M156_INPUT_ID_LIST.MemType, M156_INPUT_ID_LIST.Address, 0, M156_INPUT_ID_LIST.Size, ref vals); + if (cmsError.IsError()) + return cmsError; + + bool[] bits = ByteToBits(val); + + for (int processId = 1; processId <= MAX_PROCESS_NUMBER; processId++) + { + if (bits[processId - 1]) + { + double responseVal = 0; + // Read machine variable + cmsError = + ReadMacroValue((int)processId, M156_RESPONSE_MEMORY, true, ref responseVal); + if (cmsError.IsError()) + return cmsError; + + // Parse line & get parameters + value.Add(new M156InputIsNeededModel() + { + Process = (uint)processId, + Id = vals.ElementAt(processId - 1), + Value = responseVal + }); + } + } + + return NO_ERROR; + } + + public override CmsError PLC_WM156Response(int process, double responseVal) + { + CmsError cmsError = MEM_RWDouble(W, 0, MEMORY_TYPE.Osai_GD, 900 + (process - 1), ref responseVal); + if (cmsError.IsError()) + return cmsError; + + return PLC_WStrobe(M156_INPUT_ACK, M156_INPUT_STROBE, (uint)process); + } + private CmsError WriteMacroValue(int processId, int memIndex, double val) { int num = 1; @@ -1489,6 +1524,39 @@ namespace CMS_CORE_Library.Fanuc return NO_ERROR; } + public override CmsError PLC_RToolMovement(ref ToolMovementModel toolMovement) + { + List values = new List(); + CmsError cmsError = MEM_RWWordList(R, 0, TOOL_MOVEMENT_AREA.MemType, TOOL_MOVEMENT_AREA.Address, TOOL_MOVEMENT_AREA.Size/2, ref values); + if (cmsError.IsError()) + return cmsError; + + if (GetBitValue(values[0], 8)) + { + toolMovement = new ToolMovementModel() + { + NewMagazineId = values[1], + NewPositionId = values[2], + OldMagazineId = values[3], + OldPositionId = values[4], + Action = (MOVEMENT_TYPE)BitConverter.GetBytes(values[5])[0] + }; + } + + return NO_ERROR; + } + + + public override CmsError PLC_WTerminateMovementProcedure(MOVEMENT_RESPONSE resp) + { + byte val = (byte)resp; + CmsError cmsError = MEM_RWByte(W, 0, TOOL_MOVEMENT_HMI_RESPONSE.MemType, TOOL_MOVEMENT_HMI_RESPONSE.Address, 0, ref val); + if (cmsError.IsError()) + return cmsError; + + return PLC_ManageActiveAck(TOOL_MOVEMENT_AREA.Address + 1, 0, TOOL_MOVEMENT_AREA.Address, 0, TOOL_MOVEMENT_AREA.MemType); + } + #endregion PLC High-level data /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -5351,6 +5419,14 @@ namespace CMS_CORE_Library.Fanuc internal static MEMORY_CELL M154_SWITCH_ONOFF = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS, 1, 2); internal static MEMORY_CELL M154_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 3031, 1); internal static MEMORY_CELL M154_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 3032, 1); + + internal static MEMORY_CELL M156_INPUT_NEEDED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 23053, 1); + internal static MEMORY_CELL M156_INPUT_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 23054, 1); + internal static MEMORY_CELL M156_INPUT_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 23055, 1); + internal static MEMORY_CELL M156_INPUT_ID_LIST = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 23056, 8); + + internal static int M155_RESPONSE_MEMORY = 955; + internal static int M156_RESPONSE_MEMORY = 956; internal static MEMORY_CELL AXES_BUTTON_VISIBLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 3033, 16); @@ -5384,6 +5460,10 @@ namespace CMS_CORE_Library.Fanuc internal static MEMORY_CELL PLC_ASSISTED_TOOLING_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 4234, 1, 1); internal static MEMORY_CELL PLC_ASSISTED_TOOLING_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 4234, 1, 1); + + internal static MEMORY_CELL TOOL_MOVEMENT_AREA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 4019, 1, 12); + internal static MEMORY_CELL TOOL_MOVEMENT_HMI_RESPONSE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, STARTING_ADDRESS + 4030, 1, 12); + // Tool table indexes internal static MEMORY_CELL TOOL_TABLE_INDEX = new MEMORY_CELL(MEMORY_TYPE.Fanuc_D, 10000, 6900); diff --git a/CMS_CORE_Library/Models/DataStructures.cs b/CMS_CORE_Library/Models/DataStructures.cs index 41f1fbb..7fc8dc3 100644 --- a/CMS_CORE_Library/Models/DataStructures.cs +++ b/CMS_CORE_Library/Models/DataStructures.cs @@ -318,6 +318,13 @@ namespace CMS_CORE_Library.Models public Dictionary Buttons; } + public class M156InputIsNeededModel + { + public uint Process; + public int Id; + public double Value; + } + public struct M154DataModel { public uint Process; @@ -438,6 +445,34 @@ namespace CMS_CORE_Library.Models public ASSISTED_TOOLING_ACTION Action { get; set; } } + public class ToolMovementModel + { + public ushort NewMagazineId { get; set; } + public ushort NewPositionId { get; set; } + public ushort OldMagazineId { get; set; } + public ushort OldPositionId { get; set; } + public MOVEMENT_TYPE Action { get; set; } + } + + public enum MOVEMENT_TYPE + { + NONE = 0, + TRANSFER = 1, + TRANSFER_WITHOUT_ORIG = 2, + SWITCH = 3 + } + + public enum MOVEMENT_RESPONSE + { + NONE = 0, + OK = 1, + TOOL_NOT_FOUND = 2, + MAGAZINE_NOT_FOUND = 3, + POSITION_NOT_FOUND = 4, + POSITION_OCCUPIED = 5, + POSITION_INCOMPATIBLE = 6 + } + public enum ORIGIN { NONE = 0, diff --git a/CMS_CORE_Library/Nc.cs b/CMS_CORE_Library/Nc.cs index 98ea7d2..f694488 100644 --- a/CMS_CORE_Library/Nc.cs +++ b/CMS_CORE_Library/Nc.cs @@ -579,6 +579,10 @@ namespace CMS_CORE_Library public abstract CmsError PLC_W154ManageAck(int processId); + public abstract CmsError PLC_RM156Data(ref List value); + + public abstract CmsError PLC_WM156Response(int process, double responseVal); + public abstract CmsError PLC_RScadaValue(string memIndex, SCADA_MEM_TYPE memType, ref object value); public abstract CmsError PLC_WScadaValue(string memIndex, SCADA_MEM_TYPE memType, object value); @@ -601,6 +605,10 @@ namespace CMS_CORE_Library public abstract CmsError PLC_RActiveClient(ref int clientId); + public abstract CmsError PLC_RToolMovement(ref ToolMovementModel toolMovement); + + public abstract CmsError PLC_WTerminateMovementProcedure(MOVEMENT_RESPONSE resp); + #endregion PLC High-level data (to override) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/CMS_CORE_Library/Osai/Nc_Osai.cs b/CMS_CORE_Library/Osai/Nc_Osai.cs index d446369..8afdeaf 100644 --- a/CMS_CORE_Library/Osai/Nc_Osai.cs +++ b/CMS_CORE_Library/Osai/Nc_Osai.cs @@ -14,6 +14,7 @@ using System.ServiceModel; using System.Text; using System.Text.RegularExpressions; using System.Threading; +using System.Windows.Forms; using static CMS_CORE_Library.Models.DataStructures; using static CMS_CORE_Library.Nc; using static CMS_CORE_Library.Osai.MEMORY_ADDRESS; @@ -522,18 +523,10 @@ namespace CMS_CORE_Library.Osai return cmsError; if (plcWatchdog) - { - plcWatchdog = false; - cmsError = MEM_RWBoolean(W, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, 1, ref plcWatchdog); - if (cmsError.IsError()) - return cmsError; + return PLC_NOT_RUNNING_ERROR; - cmsError = MEM_RWBoolean(R, 0, ACTIVE_WATCHDOG.MemType, ACTIVE_WATCHDOG.Address, 1, ref plcWatchdog); - if (cmsError.IsError()) - return cmsError; - } - - return NO_ERROR; + plcWatchdog = true; + return MEM_RWBoolean(W, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, 1, ref plcWatchdog); } public override CmsError PLC_RActiveMessages(ref List alarms) @@ -1058,7 +1051,7 @@ namespace CMS_CORE_Library.Osai IsNeeded = bits[processId - 1], Message = parameters[1] ?? "", Type = M155_TYPE.SHOW_VAL, - Value = val, + Value = responseVal, Buttons = buttons }); } @@ -1092,6 +1085,52 @@ namespace CMS_CORE_Library.Osai return PLC_WStrobe(M155_INPUT_ACK, M155_INPUT_STROBE, (uint)process); } + public override CmsError PLC_RM156Data(ref List value) + { + byte val = 0; + List vals = new List(); + CmsError cmsError = MEM_RWByte(R, 0, M156_INPUT_NEEDED.MemType, M156_INPUT_NEEDED.Address, 0, ref val); + if (cmsError.IsError()) + return cmsError; + + cmsError = MEM_RWByteList(R, 0, M156_INPUT_ID_LIST.MemType, M156_INPUT_ID_LIST.Address, 0, M156_INPUT_ID_LIST.Size, ref vals); + if (cmsError.IsError()) + return cmsError; + + bool[] bits = ByteToBits(val); + + for (int processId = 1; processId <= MAX_PROCESS_NUMBER; processId++) + { + if (bits[processId - 1]) + { + double responseVal = 0; + // Read machine variable + cmsError = MEM_RWDouble(R, 0, MEMORY_TYPE.Osai_GD, M156_RESPONSE_MEMORY + (int)processId - 1, ref responseVal); + if (cmsError.IsError()) + return cmsError; + + // Parse line & get parameters + value.Add(new M156InputIsNeededModel() + { + Process = (uint)processId, + Id = vals.ElementAt(processId - 1), + Value = responseVal + }); + } + } + + return NO_ERROR; + } + + public override CmsError PLC_WM156Response(int process, double responseVal) + { + CmsError cmsError = MEM_RWDouble(W, 0, MEMORY_TYPE.Osai_GD, M156_RESPONSE_MEMORY + (process - 1), ref responseVal); + if (cmsError.IsError()) + return cmsError; + + return PLC_WStrobe(M156_INPUT_ACK, M156_INPUT_STROBE, (uint)process); + } + public override CmsError PLC_RM154Data(ref List data, ref bool MTCOnOff) { MTCOnOff = false; @@ -1588,6 +1627,34 @@ namespace CMS_CORE_Library.Osai return NO_ERROR; } + public override CmsError PLC_RToolMovement(ref ToolMovementModel toolMovement) + { + //List values = new List(); + //CmsError cmsError = MEM_RWWordList(R, 0, TOOL_MOVEMENT_AREA.MemType, TOOL_MOVEMENT_AREA.Address, TOOL_MOVEMENT_AREA.Size / 2, ref values); + //if (cmsError.IsError()) + // return cmsError; + + //if (GetBitValue(values[0], 8)) + //{ + // toolMovement = new ToolMovementModel() + // { + // NewMagazineId = values[1], + // NewPositionId = values[2], + // OldMagazineId = values[3], + // OldPositionId = values[4], + // Action = (MOVEMENT_TYPE)BitConverter.GetBytes(values[5])[0] + // }; + //} + + return NO_ERROR; + } + + public override CmsError PLC_WTerminateMovementProcedure(MOVEMENT_RESPONSE resp) + { + //return PLC_ManageActiveAck(TOOL_MOVEMENT_AREA.Address + 1, 0, TOOL_MOVEMENT_AREA.Address, 0, TOOL_MOVEMENT_AREA.MemType); + return NO_ERROR; + } + #endregion PLC High-level data /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -4021,6 +4088,7 @@ namespace CMS_CORE_Library.Osai return cmsError; string backupFilePath = TOOL_MANAGER_BACKUP_DIRECTORY_PATH + "{0}.csv"; + // Read families if (File.Exists(string.Format(backupFilePath, FAMILIES_FILE_NAME))) { families = File.ReadAllLines(string.Format(backupFilePath, FAMILIES_FILE_NAME)) // Read file @@ -4046,7 +4114,7 @@ namespace CMS_CORE_Library.Osai ReviveDelta = ushort.Parse(x[15]) }).ToList(); } - + // Read families sizes (family file is splitted) if (File.Exists(string.Format(backupFilePath, FAM_SIZE_FILE_NAME))) { List familiesSize = File.ReadAllLines(string.Format(backupFilePath, FAM_SIZE_FILE_NAME)) // Read file @@ -4060,6 +4128,7 @@ namespace CMS_CORE_Library.Osai }).ToList(); } + // Read tools if (File.Exists(string.Format(backupFilePath, TOOLS_FILE_NAME))) { tools = File.ReadAllLines(string.Format(backupFilePath, TOOLS_FILE_NAME)) @@ -4080,6 +4149,7 @@ namespace CMS_CORE_Library.Osai }).ToList(); } + // Read shanks if (File.Exists(string.Format(backupFilePath, SHANKS_FILE_NAME))) { shanks = File.ReadAllLines(string.Format(backupFilePath, SHANKS_FILE_NAME)) @@ -4601,7 +4671,7 @@ namespace CMS_CORE_Library.Osai //Manage the Exception Launch private CmsError ManageException(Exception ex) - { + { Connected = false; @@ -4609,7 +4679,15 @@ namespace CMS_CORE_Library.Osai if (ex is EndpointNotFoundException || ex is TimeoutException || ex is CommunicationException) return NOT_CONNECTED_ERROR; else - return CmsError.InternalError(ex.Message); + { + string message = ex.Message; + if(ex.InnerException != null) + { + message += " / " + ex.Message + " / " + ex.GetType(); + } + + return CmsError.InternalError(message); + } } private CmsError GetNCError(uint errorClass, uint errorNum) @@ -4951,6 +5029,13 @@ namespace CMS_CORE_Library.Osai internal static MEMORY_CELL M155_INPUT_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4308, 1); internal static MEMORY_CELL M155_INPUT_STROBE = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4310, 1); + internal static MEMORY_CELL M156_INPUT_NEEDED = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4333, 1); + internal static MEMORY_CELL M156_INPUT_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4335, 1); + internal static MEMORY_CELL M156_INPUT_STROBE = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4337, 1); + internal static MEMORY_CELL M156_INPUT_ID_LIST = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4338, 8); + + internal static int M156_RESPONSE_MEMORY = 910; + internal static MEMORY_CELL M154_SWITCH_ONOFF = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4000, 1, 2); internal static MEMORY_CELL M154_STROBE = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4314, 1); internal static MEMORY_CELL M154_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4312, 1); diff --git a/CMS_CORE_Library/Siemens/Nc_Siemens.cs b/CMS_CORE_Library/Siemens/Nc_Siemens.cs index 6b3f28d..b1d2c3f 100644 --- a/CMS_CORE_Library/Siemens/Nc_Siemens.cs +++ b/CMS_CORE_Library/Siemens/Nc_Siemens.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; +using System.Windows.Forms; using System.Xml.Linq; using static CMS_CORE_Library.Models.DataStructures; using static CMS_CORE_Library.Nc; @@ -128,9 +129,9 @@ namespace CMS_CORE_Library.Siemens private static Dictionary InterpAxesPosition = new Dictionary(); private static Dictionary ProgrammedAxisPosition = new Dictionary(); - Boolean EnableAxes; - Boolean EnableAlarms; - Boolean EnableTools; + private bool EnableAxes; + private bool EnableAlarms; + private bool EnableTools; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -166,7 +167,7 @@ namespace CMS_CORE_Library.Siemens * Enable Tools Svc * */ - public Nc_Siemens(ushort ConnectionTimeOut, Boolean EnableAxes, Boolean EnableAlarms, Boolean EnableTools) + public Nc_Siemens(ushort ConnectionTimeOut, bool EnableAxes, bool EnableAlarms, bool EnableTools) { //Setup options this.EnableAxes = EnableAxes; @@ -254,7 +255,6 @@ namespace CMS_CORE_Library.Siemens } catch (Exception ex) { - Connected = false; return ManageException(ex); } @@ -396,12 +396,14 @@ namespace CMS_CORE_Library.Siemens dataSvc.Read(itemToRead); MAX_MULTITOOLS_LOCATIONS = (int)itemToRead.Value; - // SETUP options, read variables from NC - itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MM_TOOL_MANAGEMENT_MASK"); - dataSvc.Read(itemToRead); + // Read Life option + //itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MM_TOOL_MANAGEMENT_MASK"); // MULTITOOL_OPTION_ACTIVE = GetBitValue(Convert.ToInt32(itemToRead.Value), 10); MULTITOOL_OPTION_ACTIVE = false; - LIFE_OPTION_ACTIVE = GetBitValue(Convert.ToInt32(itemToRead.Value), 5); + + itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MNS_ACCESS_WRITE_TM_SUPVIS"); + dataSvc.Read(itemToRead); + LIFE_OPTION_ACTIVE = Convert.ToInt32(itemToRead.Value) == 7; // If not active remove fields from config if (!LIFE_OPTION_ACTIVE) RemoveLifeParamsFromConfig(); @@ -635,11 +637,7 @@ namespace CMS_CORE_Library.Siemens try { // Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.lowPriority - }; + DataSvc Data = LowPriorityDataSvc(); Item itemRead = new Item(NC_TIME_PATH); // Read Data @@ -771,28 +769,18 @@ namespace CMS_CORE_Library.Siemens /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region PLC High-level data - public override CmsError PLC_RWManageWatchdog() { bool plcWatchdog = false; - CmsError cmsError = MEM_RWBoolean(R, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, NC_WATCHDOG.SubAddress, 1, ref plcWatchdog); + CmsError cmsError = MEM_RWBoolean(R, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, 1, ref plcWatchdog); if (cmsError.IsError()) return cmsError; if (plcWatchdog) - { - plcWatchdog = false; - cmsError = MEM_RWBoolean(W, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, NC_WATCHDOG.SubAddress, 1, ref plcWatchdog); - if (cmsError.IsError()) - return cmsError; + return PLC_NOT_RUNNING_ERROR; - plcWatchdog = true; - cmsError = MEM_RWBoolean(R, 0, ACTIVE_WATCHDOG.MemType, ACTIVE_WATCHDOG.Address, ACTIVE_WATCHDOG.SubAddress, 1, ref plcWatchdog); - if (cmsError.IsError()) - return cmsError; - } - - return NO_ERROR; + plcWatchdog = true; + return MEM_RWBoolean(W, 0, NC_WATCHDOG.MemType, NC_WATCHDOG.Address, 1, ref plcWatchdog); } public override CmsError PLC_RActiveMessages(ref List alarms) @@ -1504,6 +1492,45 @@ namespace CMS_CORE_Library.Siemens return PLC_ManageActiveAck(M154_STROBE.Address, M154_STROBE.SubAddress, processId - 1, M154_ACK.Address, M154_ACK.SubAddress, processId - 1, M154_STROBE.MemType); } + public override CmsError PLC_RM156Data(ref List value) + { + byte val = 0; + List vals = new List(); + CmsError cmsError = MEM_RWByte(R, 0, M156_INPUT_NEEDED.MemType, M156_INPUT_NEEDED.Address, 0, ref val); + if (cmsError.IsError()) + return cmsError; + + cmsError = MEM_RWByteList(R, 0, M156_INPUT_ID_LIST.MemType, M156_INPUT_ID_LIST.Address, 0, M156_INPUT_ID_LIST.Size, ref vals); + if (cmsError.IsError()) + return cmsError; + + bool[] bits = ByteToBits(val); + + for (int processId = 1; processId <= MAX_PROCESS_NUMBER; processId++) + { + if (bits[processId - 1]) + { + // Parse line & get parameters + value.Add(new M156InputIsNeededModel() + { + Process = (uint)processId, + Id = vals.ElementAt(processId - 1) + }); + } + } + + return NO_ERROR; + } + + public override CmsError PLC_WM156Response(int process, double responseVal) + { + CmsError cmsError = MEM_RWDouble(W, 0, MEMORY_TYPE.Osai_GD, 900 + (process - 1), ref responseVal); + if (cmsError.IsError()) + return cmsError; + + return PLC_WStrobe(M156_INPUT_ACK, M156_INPUT_STROBE, (uint)process); + } + public override CmsError PLC_RScadaValue(string memIndex, SCADA_MEM_TYPE memType, ref object value) { string[] index = memIndex.Split('.'); @@ -1848,6 +1875,16 @@ namespace CMS_CORE_Library.Siemens return NO_ERROR; } + public override CmsError PLC_RToolMovement(ref ToolMovementModel toolMovement) + { + return FUNCTION_NOT_ALLOWED_ERROR; + } + + public override CmsError PLC_WTerminateMovementProcedure(MOVEMENT_RESPONSE resp) + { + return FUNCTION_NOT_ALLOWED_ERROR; + } + #endregion PLC High-level data /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1866,11 +1903,7 @@ namespace CMS_CORE_Library.Siemens try { // Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); Item itemRead = new Item(NC_GENERIC_MODE_PATH + "[u" + ProcNumber + "]"); Item itemReadIncr = new Item(JOG_INCR_PATH + "[u" + ProcNumber + "]"); Item itemReadAdv = new Item(ADVANCED_JOG_PATH + "[u" + ProcNumber + "]"); @@ -1903,11 +1936,7 @@ namespace CMS_CORE_Library.Siemens try { // Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); Item itemRead = new Item(NC_GENERIC_STATE_PATH + "[u" + ProcNumber + "]"); // Read Data @@ -1937,11 +1966,7 @@ namespace CMS_CORE_Library.Siemens try { // Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); Item itemRead = new Item(ACT_PROG_LINES_PATH + "[u" + ProcNumber + "]"); // Read Data @@ -1982,7 +2007,7 @@ namespace CMS_CORE_Library.Siemens try { // Setup variables - DataSvc Data = new DataSvc { Timeout = TimeoutConn, PriorityFlag = SlPriority.highPriority }; + DataSvc Data = HighPriorityDataSvc(); Item itemRead = new Item(ACT_PROG_NAME_PATH + "[u" + ProcNumber + "]"); // Read Data @@ -2582,11 +2607,7 @@ namespace CMS_CORE_Library.Siemens try { //Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, MemBit, 1, 'X', out string itemString); if (cmsError.IsError()) @@ -2683,11 +2704,7 @@ namespace CMS_CORE_Library.Siemens try { // Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); cmsError = ConvertMemToPath(memType, memTable, memIndex, 0, 1, 'D', out string itemString); if (cmsError.IsError()) @@ -2809,11 +2826,7 @@ namespace CMS_CORE_Library.Siemens try { //Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc dataSvc = HighPriorityDataSvc(); cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'B', out string itemString); if (cmsError.IsError()) @@ -2824,11 +2837,11 @@ namespace CMS_CORE_Library.Siemens if (bWrite) { item.Value = Value.ToArray(); - Data.Write(item); + dataSvc.Write(item); } else { - Data.Read(item); + dataSvc.Read(item); if (item.Value.GetType().IsArray) Value = ((object[])item.Value).Cast().ToList(); else @@ -2857,11 +2870,7 @@ namespace CMS_CORE_Library.Siemens try { //Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'W', out string itemString); if (cmsError.IsError()) @@ -2905,11 +2914,7 @@ namespace CMS_CORE_Library.Siemens try { //Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'W', out string itemString); if (cmsError.IsError()) @@ -2953,11 +2958,7 @@ namespace CMS_CORE_Library.Siemens try { //Setup variables - DataSvc Data = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'D', out string itemString); if (cmsError.IsError()) @@ -3000,10 +3001,7 @@ namespace CMS_CORE_Library.Siemens try { //Setup variables - DataSvc Data = new DataSvc - { - PriorityFlag = SlPriority.highPriority - }; + DataSvc Data = HighPriorityDataSvc(); cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'D', out string itemString); if (cmsError.IsError()) return cmsError; @@ -4513,23 +4511,28 @@ namespace CMS_CORE_Library.Siemens // Setup dimensions byte ushort dimensions = (ushort)(((tool.LeftSize << 4) + tool.RightSize) << 8); DataSvc dataSvc = new DataSvc(); - // Data + // Main data + byte[] familyName = Encoding.ASCII.GetBytes(tool.FamilyName); List items = new List { - new Item(){ Path = string.Format("DB{0}.DBB10", BALLUF_EMPTY_TABLE.Address), Value = 0 }, - new Item(){ Path = string.Format("DB{0}.DBB12", BALLUF_EMPTY_TABLE.Address), Value = 0 }, - new Item(){ Path = string.Format("DB{0}.DBW44", BALLUF_EMPTY_TABLE.Address), Value = dimensions }, - new Item(){ Path = string.Format("DB{0}.DBW46", BALLUF_EMPTY_TABLE.Address), Value = tool.MagazinePositionType }, - new Item(){ Path = string.Format("DB{0}.DBW48", BALLUF_EMPTY_TABLE.Address), Value = statusArray[0] }, - new Item(){ Path = string.Format("DB{0}.DBW50", BALLUF_EMPTY_TABLE.Address), Value = (int)tool.LifeType }, - new Item(){ Path = string.Format("DB{0}.DBW52", BALLUF_EMPTY_TABLE.Address), Value = tool.MaxSpeed }, - new Item(){ Path = string.Format("DB{0}.DBD56", BALLUF_EMPTY_TABLE.Address), Value = tool.Load }, - new Item(){ Path = string.Format("DB{0}.DBD60", BALLUF_EMPTY_TABLE.Address), Value = tool.Gamma }, - new Item(){ Path = string.Format("DB{0}.DBB64:STRING", BALLUF_EMPTY_TABLE.Address), Value = tool.FamilyName }, + new Item(){ Path = string.Format("DB{0}.DBB0", BALLUF_EMPTY_TABLE.Address), Value = tool.ChildId }, + new Item(){ Path = string.Format("DB{0}.DBB2[" + familyName.Length +"]", BALLUF_EMPTY_TABLE.Address), Value = familyName }, + new Item(){ Path = string.Format("DB{0}.DBW34", BALLUF_EMPTY_TABLE.Address), Value = dimensions }, + new Item(){ Path = string.Format("DB{0}.DBW36", BALLUF_EMPTY_TABLE.Address), Value = tool.MagazinePositionType }, + new Item(){ Path = string.Format("DB{0}.DBW38", BALLUF_EMPTY_TABLE.Address), Value = statusArray[0] }, + new Item(){ Path = string.Format("DB{0}.DBW40", BALLUF_EMPTY_TABLE.Address), Value = (int)tool.LifeType }, + new Item(){ Path = string.Format("DB{0}.DBD42", BALLUF_EMPTY_TABLE.Address), Value = tool.MaxSpeed }, + new Item(){ Path = string.Format("DB{0}.DBD46", BALLUF_EMPTY_TABLE.Address), Value = tool.Load }, + new Item(){ Path = string.Format("DB{0}.DBD50", BALLUF_EMPTY_TABLE.Address), Value = tool.Gamma }, + new Item(){ Path = string.Format("DB{0}.DBD54", BALLUF_EMPTY_TABLE.Address), Value = tool.MaxLoadPctAutoload }, + new Item(){ Path = string.Format("DB{0}.DBD58", BALLUF_EMPTY_TABLE.Address), Value = tool.MinLoadPctAutoload }, + new Item(){ Path = string.Format("DB{0}.DBD62", BALLUF_EMPTY_TABLE.Address), Value = tool.ToolTypeCode }, + //new Item(){ Path = string.Format("DB{0}.DBB64:STRING", BALLUF_EMPTY_TABLE.Address), Value = tool.FamilyName }, - // EDGE - new Item(){ Path = string.Format("DB{0}.DBW96", BALLUF_EMPTY_TABLE.Address), Value = tool.ToolType }, - new Item(){ Path = string.Format("DB{0}.DBW98", BALLUF_EMPTY_TABLE.Address), Value = 9 }, - new Item(){ Path = string.Format("DB{0}.DBW80", BALLUF_EMPTY_TABLE.Address), Value = 1}, + new Item(){ Path = string.Format("DB{0}.DBW70", BALLUF_EMPTY_TABLE.Address), Value = 1 }, + + // Edge data + new Item(){ Path = string.Format("DB{0}.DBW86", BALLUF_EMPTY_TABLE.Address), Value = tool.ToolType }, + new Item(){ Path = string.Format("DB{0}.DBW88", BALLUF_EMPTY_TABLE.Address), Value = 9 }, }; EdgeModel edge = tool.EdgesData[0]; @@ -4548,8 +4551,7 @@ namespace CMS_CORE_Library.Siemens }); } } - - + // Life Parameters switch (tool.LifeType) { @@ -4557,26 +4559,26 @@ namespace CMS_CORE_Library.Siemens { items.AddRange(new List() { - new Item() { Path = string.Format("DB{0}.DBD196", BALLUF_EMPTY_TABLE.Address), Value = edge.ResidualLife }, // MOP2 - new Item() { Path = string.Format("DB{0}.DBD204", BALLUF_EMPTY_TABLE.Address), Value = edge.NominalLife }, // MOP11 - new Item() { Path = string.Format("DB{0}.DBD192", BALLUF_EMPTY_TABLE.Address), Value = edge.PreAlmLife } // MOP1 + new Item() { Path = string.Format("DB{0}.DBD186", BALLUF_EMPTY_TABLE.Address), Value = edge.ResidualLife }, // MOP2 + new Item() { Path = string.Format("DB{0}.DBD194", BALLUF_EMPTY_TABLE.Address), Value = edge.NominalLife }, // MOP11 + new Item() { Path = string.Format("DB{0}.DBD182", BALLUF_EMPTY_TABLE.Address), Value = edge.PreAlmLife } // MOP1 }); } break; case SIEMENS_LIFE_TYPE.COUNT: { - items.Add(new Item() { Path = string.Format("DB{0}.DBW202", BALLUF_EMPTY_TABLE.Address), Value = edge.ResidualLife }); // MOP4 - items.Add(new Item() { Path = string.Format("DB{0}.DBW208", BALLUF_EMPTY_TABLE.Address), Value = edge.NominalLife }); // MOP13 - items.Add(new Item() { Path = string.Format("DB{0}.DBW200", BALLUF_EMPTY_TABLE.Address), Value = edge.PreAlmLife }); // MOP3 + items.Add(new Item() { Path = string.Format("DB{0}.DBW192", BALLUF_EMPTY_TABLE.Address), Value = edge.ResidualLife }); // MOP4 + items.Add(new Item() { Path = string.Format("DB{0}.DBW198", BALLUF_EMPTY_TABLE.Address), Value = edge.NominalLife }); // MOP13 + items.Add(new Item() { Path = string.Format("DB{0}.DBW190", BALLUF_EMPTY_TABLE.Address), Value = edge.PreAlmLife }); // MOP3 } break; case SIEMENS_LIFE_TYPE.WEAR: { - items.Add(new Item() { Path = string.Format("DB{0}.DBD214", BALLUF_EMPTY_TABLE.Address), Value = edge.ResidualLife }); // MOP6 - items.Add(new Item() { Path = string.Format("DB{0}.DBD218", BALLUF_EMPTY_TABLE.Address), Value = edge.NominalLife }); // MOP15 - items.Add(new Item() { Path = string.Format("DB{0}.DBD210", BALLUF_EMPTY_TABLE.Address), Value = edge.PreAlmLife }); // MOP5 + items.Add(new Item() { Path = string.Format("DB{0}.DBD204", BALLUF_EMPTY_TABLE.Address), Value = edge.ResidualLife }); // MOP6 + items.Add(new Item() { Path = string.Format("DB{0}.DBD208", BALLUF_EMPTY_TABLE.Address), Value = edge.NominalLife }); // MOP15 + items.Add(new Item() { Path = string.Format("DB{0}.DBD200", BALLUF_EMPTY_TABLE.Address), Value = edge.PreAlmLife }); // MOP5 } break; } @@ -4836,6 +4838,33 @@ namespace CMS_CORE_Library.Siemens #region Subordinate Private Functions + private DataSvc HighPriorityDataSvc() + { + return new DataSvc() + { + PriorityFlag = SlPriority.highPriority, + Timeout = TimeoutConn + }; + } + + private DataSvc DefaultPriorityDataSvc() + { + return new DataSvc() + { + PriorityFlag = SlPriority.defaultPriority, + Timeout = TimeoutConn + }; + } + + private DataSvc LowPriorityDataSvc() + { + return new DataSvc() + { + PriorityFlag = SlPriority.lowPriority, + Timeout = TimeoutConn + }; + } + // Manage the Alarms - Called automatically on changes private void AlarmsChanged(Guid guid, Alarm[] alarms) { @@ -4992,11 +5021,7 @@ namespace CMS_CORE_Library.Siemens //Try to get information try { - DataSvc ReadStaticData = new DataSvc - { - Timeout = TimeoutConn, - PriorityFlag = SlPriority.defaultPriority - }; + DataSvc ReadStaticData = DefaultPriorityDataSvc(); Item ItemNcType = new Item(NC_TYPE_PATH); Item ItemNcVersion = new Item(NC_VERSION_PATH); Item ItemMaxChannelNo = new Item(MAX_CHANNEL_NO_PATH); @@ -6711,6 +6736,11 @@ namespace CMS_CORE_Library.Siemens internal static MEMORY_CELL M155_INPUT_ACK = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, TABLE, 3015, 1); internal static MEMORY_CELL M155_INPUT_STROBE = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, TABLE, 3016, 1); + internal static MEMORY_CELL M156_INPUT_NEEDED = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4333, 1); + internal static MEMORY_CELL M156_INPUT_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4335, 1); + internal static MEMORY_CELL M156_INPUT_STROBE = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4337, 1); + internal static MEMORY_CELL M156_INPUT_ID_LIST = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 4339, 8); + internal static MEMORY_CELL M154_ACK = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, TABLE, 3042, 1); internal static MEMORY_CELL M154_STROBE = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, TABLE, 3043, 1); internal static MEMORY_CELL M154_SWITCH_ONOFF = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, TABLE, 0, 2); diff --git a/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs b/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs index 563be0f..bdadfd9 100644 --- a/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs +++ b/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs @@ -447,31 +447,33 @@ namespace CMS_CORE_Library.Siemens }, }; + + public static int ADDITIONAL_PARAMS_START_INDEX = 90; public Dictionary TDIEdgeFields = new Dictionary() { - { "$TC_DP3[", "DB{0}.DBD100"}, - { "$TC_DP4[", "DB{0}.DBD104"}, - { "$TC_DP5[", "DB{0}.DBD108"}, - { "$TC_DP6[", "DB{0}.DBD112"}, - { "$TC_DP7[", "DB{0}.DBD116"}, - { "$TC_DP8[", "DB{0}.DBD120"}, - { "$TC_DP9[", "DB{0}.DBD124"}, - { "$TC_DP10[", "DB{0}.DBD128"}, - { "$TC_DP11[", "DB{0}.DBD132"}, - { "$TC_DP12[", "DB{0}.DBD136"}, - { "$TC_DP13[", "DB{0}.DBD140"}, - { "$TC_DP14[", "DB{0}.DBD144"}, - { "$TC_DP15[", "DB{0}.DBD148"}, - { "$TC_DP16[", "DB{0}.DBD152"}, - { "$TC_DP17[", "DB{0}.DBD156"}, - { "$TC_DP18[", "DB{0}.DBD160"}, - { "$TC_DP19[", "DB{0}.DBD164"}, - { "$TC_DP20[", "DB{0}.DBD168"}, - { "$TC_DP21[", "DB{0}.DBD172"}, - { "$TC_DP22[", "DB{0}.DBD176"}, - { "$TC_DP23[", "DB{0}.DBD180"}, - { "$TC_DP24[", "DB{0}.DBD184"}, - { "$TC_DP25[", "DB{0}.DBD188"}, + { "$TC_DP3[", "DB{0}.DBD" + ADDITIONAL_PARAMS_START_INDEX}, + { "$TC_DP4[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 4)}, + { "$TC_DP5[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 8)}, + { "$TC_DP6[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 12)}, + { "$TC_DP7[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 16)}, + { "$TC_DP8[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 20)}, + { "$TC_DP9[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 24)}, + { "$TC_DP10[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 28)}, + { "$TC_DP11[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 32)}, + { "$TC_DP12[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 36)}, + { "$TC_DP13[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 40)}, + { "$TC_DP14[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 44)}, + { "$TC_DP15[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 48)}, + { "$TC_DP16[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 52)}, + { "$TC_DP17[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 56)}, + { "$TC_DP18[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 60)}, + { "$TC_DP19[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 64)}, + { "$TC_DP20[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 68)}, + { "$TC_DP21[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 72)}, + { "$TC_DP22[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 76)}, + { "$TC_DP23[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 80)}, + { "$TC_DP24[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 84)}, + { "$TC_DP25[", "DB{0}.DBD" + (ADDITIONAL_PARAMS_START_INDEX + 88)} }; } } \ No newline at end of file