机械工程软件领域正面临着一个转折点:传统的面向问题的编程代码与更现代的面向对象的语言发生了冲突,这导致了调试问题和CAD/CAM开发者技能集的不兼容。智能制造技术(SMT)通过将其应用程序转换为C#来解决这一问题,以实现更高的速度、更好的兼容性和更易于维护。转换过程中的关键工具是Red Gate的自动化.NET分析器ANTS Profiler,它帮助公司优化其代码。
SMT为汽车和越野车辆制造商提供了一系列技术,专注于传动、轴和传动系统组件。公司的主要目标是快速变化的中国市场。“在中国,有很大的改进动力,但时间很短,”SMT的高级分析顾问Owen Harris说。“提供硬件、咨询服务和软件分析工具,使客户能够快速改进设计、开发和制造。”
SMT的基于PC的机械工程软件结合了计算机辅助设计(CAD)的元素,用于定义组件和装配,以及计算机辅助工程(CAE)的元素,用于分析可制造性和性能,优化设计,并报告结果。公司专注于设计和制造齿轮——任何传统传动或轴系统的关键组件。
“尽管齿轮自工业革命初期就开始使用,但围绕它们的正确设计和制造仍然存在许多问题,”Harris说。设计和工程分析软件需要确保齿轮至少能够承受10万英里的驾驶。设计不当或制造不良的齿轮可能会导致噪音和机械故障。由于糟糕的工程导致的弯曲和压缩应力可能会导致齿轮齿断裂和凹坑。
设计和分析齿轮所需的计算涉及大量使用详细代数、迭代和重复评估三角函数的专家输入,”Harris说。“由于产品的技术性质,代码的清晰度和质量至关重要。”
SMT之前使用了混合的老式数学强大的Fortran进行后端的数字计算,以及更现代的开发语言,如Visual Basic用于前端应用程序。“这导致了困难的调试和不是所有开发者都能理解的代码库,”Harris说。“它还需要大量的额外工作来获取一种语言到另一种语言的数据,这取决于语言分割的位置。”
Fortran在解决工程或科学问题方面非常高效,但对于系统级工作来说可能有些抽象。或者,C++在处理硬件/软件接口方面强大且灵活,但有些复杂;必须识别对象及其相关操作,例如,并且必须构建所有必要的类和子类。Harris和他的团队相信他们在C#中找到了两者的最佳结合。
“希望避免在编写代码时尝试微观优化代码的小部分并在此过程中妥协代码清晰度的常见错误,”Harris说。“由于C#提供了良好的性能,生产力高且得到良好支持,因此完全使用它是明智的。”
清晰的编程节省了时间。第一个用C#编写的程序是SMT的新直齿斜齿轮设计和制造应用程序。完成后,它将用于设计新齿轮并为现有设计解决制造和性能问题。该程序目前处于测试的最后阶段,将在发布前完成,完全用C#编写,只调用Fortran数学库的几个函数。图形用户界面是标准的.NET,除了图表是用一个名为Nevron Chart的程序创建的,3D图形是用免费的OpenGL包装器Tao和免费的HTMLEdit程序生产的。
使用Hasp硬件加密狗实现安全性,用户文件加载/保存是使用自定义创建的XML完成的;这允许Harris和他的团队密切关注所写内容,并保持与未来版本的文件兼容性。程序使用的数据库(包含轴承、材料等列表)是用.NET序列化编写的,然后使用加密狗加密。这使得黑客攻击程序变得困难,并防止竞争对手读取数据库文件。
“所有类都必须有明确理解的角色,所有函数都必须简短且有明确定义的目的,”Harris说。
程序编写完成后,Harris使用ANTS Profiler识别代码中的慢行。ANTS Profiler的摘要文档揭示了隐藏在C#代码中的函数运行时间太长。例如,以下代码使用二维点(X,Y)的轮廓来创建绘图。轮廓关于X轴对称,因此绘图是在两个循环中创建的:连接每个点的线,以及连接每个点的线,以X轴为镜像反向顺序。
Polyline polyline = new Polyline();
foreach (Vector2D vec in Profile)
polyline.Points.Add(vec.X);
for (int i = Profile.Count - 1; i >= 0; i--)
polyline.Points.Add(new Vector2D(Profile[i].X, Profile[i].Y / -2));
ANTS揭示了属性“Profile”的值是从应用程序中的其他属性派生的。这些其他属性必须在每次迭代中Profile被调用四次时访问——仅在第二个循环中就连续两次,如上述代码的最后一行所示。虽然计算出的值总是相同的,但调用它的过程却花费了很多时间。
一旦问题被识别出来,解决方案就很简单:在函数开始时将Profile属性值存储在局部变量中:
Vector2D[] storedProfile = Profile;
Polyline polyline = new Polyline();
foreach (Vector2D vec in storedProfile)
polyline.Points.Add(vec.X);
for (int i = storedProfile.Count - 1; i >= 0; i--)
polyline.Points.Add(new Vector2D(storedProfile[i].X, storedProfile[i].Y / -2));
问题在大约10分钟内被识别和解决——这使得那段代码的性能提高了100%。Harris估计,将GUI和分析代码转换为C#,使新应用程序比他的团队坚持使用单独语言快三倍。