hexagon logo

CMM Automation Speed C# versus VB6

Hi,

I am currently converting an application that automated PC-DMIS in VB6 over to C#. Our application does the following:


1) Ask the user what PC-DMIS program (i.e. a PRG file) they want to run
2) Launch PC-DMIS passing in the name of the program file selected
3) Get PC-DMIS to run a series of measurements on a Scirocco machine
4) Import the measurements from PC-DMIS into the application for processing
5) Process the results (basically we compare the measurements to a baseline, then insert the deviation into a database)

What I observed is that for any program (we've tried quite a few and this seems to be consistently happening), the VB6 application takes approximately 30 seconds to perform step 4, whereas the C# application takes around 2.5 minutes.

Can anyone help with the following questions please?

1) We directly ported the code from the legacy VB6 application to C# so the new program isn't doing anything different from what the old VB6 one used to do, so why does C# take so much longer than VB6 to perform the import?
2) Is there any way to speed it up, e.g. I think I read something on a forum that VB.NET may be faster, but I can't find anything technical from Microsoft to support that so I can't really justify burning a lot of hours to convert from C# to VB.NET in case it is the same speed?

Thanks!
Parents
  • Thanks again for all responses. I'll post an update soon on how it all works out!


    Thanks to y'all the time to produce the text file has gone from approx. 2.5 minutes to a little over 1 minute. This is the final code in case it helps anyone else or if anyone has further suggestions to make it even faster:

    
            private void OutputPcDmisDataToTextFile()
            {
                StringBuilder sb = new StringBuilder();
    
                //these strings will hold the pc-dmis trace data
                string dieNumber = string.Empty;
                string partNumber = string.Empty;            
                string productType = string.Empty;
                string castingMachine = string.Empty;
                string cmmOperator = string.Empty;
                //other strings go here
    
                var PCCommands = PCPart.Commands;
    
                string pcCommandId = string.Empty;
    
                var pcDmisOutputList = new List<PcDmisOutput>(); //PcDmisOutput is just a small class that holds command ID and measurement/deviation data to allow us to go from 2 loops through the pc-dmis data down to 1
    
                var commandsCount = PCPart.Commands.Count;
    
                for (int i = 1; i <= commandsCount; i++)
                {
                    PCCommand = PCPart.Commands.Item(i);
    
                    if (PCCommand != null)
                    {
                        if (PCCommand.IsTraceField)
                        {
                            traceName = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_NAME, 0);
    
                            switch (traceName)
                            {
                                case "Die Number":
                                    dieNumber = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Part Number":  //All
                                    partNumber = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Cast Date":    //All
                                    this.CastDate = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Product Type": //All
                                    productType = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Casting Machine":  //puma cast
                                    castingMachine = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "CMM Operator": //All
                                    cmmOperator = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                //other trace info is brought back here
                            }                        
                        }
    
                        if (PCCommand.IsDimension)
                        {
                            //sometimes we have a command id but no axis so these statements ensure we have both
                            if (!string.IsNullOrEmpty(PCCommand.ID) && !string.IsNullOrEmpty(PCCommand.DimensionCommand.AxisLetter))
                            {
                                pcDmisOutputList.Add(new PcDmisOutput(PCCommand.ID, PCCommand.DimensionCommand.Deviation, PCCommand.DimensionCommand.Measured));
    
                            }
                            else if (!string.IsNullOrEmpty(PCCommand.ID) && string.IsNullOrEmpty(PCCommand.DimensionCommand.AxisLetter))
                            {
                                pcCommandId = PCCommand.ID;                            
                            }
                            else if (string.IsNullOrEmpty(PCCommand.ID) && !string.IsNullOrEmpty(PCCommand.DimensionCommand.AxisLetter))
                            {                            
                                pcDmisOutputList.Add(new PcDmisOutput(pcCommandId, PCCommand.DimensionCommand.Deviation, PCCommand.DimensionCommand.Measured));
                            }                        
                        }
                    }
                }
    
                foreach (var pcDmisOutput in pcDmisOutputList)
                {
                    sb.AppendLine(string.Format(//omitting my code but this is where we build up a string with the following: dieNumber partNumber productType castingMachine cmmOperator, pcDmisOutput.CommandId, pcDmisOutput.GetDeviationOrMeasurement()
                    //note: the GetDeviationOrMeasurement() method returns either the deviation or measurement based on the one that pc-dmis populated when it performed the measurement
                }
    
                writeToDataFile(sb.ToString());
            }
    
    
Reply
  • Thanks again for all responses. I'll post an update soon on how it all works out!


    Thanks to y'all the time to produce the text file has gone from approx. 2.5 minutes to a little over 1 minute. This is the final code in case it helps anyone else or if anyone has further suggestions to make it even faster:

    
            private void OutputPcDmisDataToTextFile()
            {
                StringBuilder sb = new StringBuilder();
    
                //these strings will hold the pc-dmis trace data
                string dieNumber = string.Empty;
                string partNumber = string.Empty;            
                string productType = string.Empty;
                string castingMachine = string.Empty;
                string cmmOperator = string.Empty;
                //other strings go here
    
                var PCCommands = PCPart.Commands;
    
                string pcCommandId = string.Empty;
    
                var pcDmisOutputList = new List<PcDmisOutput>(); //PcDmisOutput is just a small class that holds command ID and measurement/deviation data to allow us to go from 2 loops through the pc-dmis data down to 1
    
                var commandsCount = PCPart.Commands.Count;
    
                for (int i = 1; i <= commandsCount; i++)
                {
                    PCCommand = PCPart.Commands.Item(i);
    
                    if (PCCommand != null)
                    {
                        if (PCCommand.IsTraceField)
                        {
                            traceName = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_NAME, 0);
    
                            switch (traceName)
                            {
                                case "Die Number":
                                    dieNumber = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Part Number":  //All
                                    partNumber = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Cast Date":    //All
                                    this.CastDate = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Product Type": //All
                                    productType = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "Casting Machine":  //puma cast
                                    castingMachine = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                case "CMM Operator": //All
                                    cmmOperator = PCCommand.GetText(PCDLRN.ENUM_FIELD_TYPES.TRACE_VALUE, 0);
                                    break;
                                //other trace info is brought back here
                            }                        
                        }
    
                        if (PCCommand.IsDimension)
                        {
                            //sometimes we have a command id but no axis so these statements ensure we have both
                            if (!string.IsNullOrEmpty(PCCommand.ID) && !string.IsNullOrEmpty(PCCommand.DimensionCommand.AxisLetter))
                            {
                                pcDmisOutputList.Add(new PcDmisOutput(PCCommand.ID, PCCommand.DimensionCommand.Deviation, PCCommand.DimensionCommand.Measured));
    
                            }
                            else if (!string.IsNullOrEmpty(PCCommand.ID) && string.IsNullOrEmpty(PCCommand.DimensionCommand.AxisLetter))
                            {
                                pcCommandId = PCCommand.ID;                            
                            }
                            else if (string.IsNullOrEmpty(PCCommand.ID) && !string.IsNullOrEmpty(PCCommand.DimensionCommand.AxisLetter))
                            {                            
                                pcDmisOutputList.Add(new PcDmisOutput(pcCommandId, PCCommand.DimensionCommand.Deviation, PCCommand.DimensionCommand.Measured));
                            }                        
                        }
                    }
                }
    
                foreach (var pcDmisOutput in pcDmisOutputList)
                {
                    sb.AppendLine(string.Format(//omitting my code but this is where we build up a string with the following: dieNumber partNumber productType castingMachine cmmOperator, pcDmisOutput.CommandId, pcDmisOutput.GetDeviationOrMeasurement()
                    //note: the GetDeviationOrMeasurement() method returns either the deviation or measurement based on the one that pc-dmis populated when it performed the measurement
                }
    
                writeToDataFile(sb.ToString());
            }
    
    
Children
No Data