我正在从事一个CNC(计算机数控)项目,该项目借助激光将形状切割成金属。
现在我的问题是,有时(每20天奇数次要1-2次)切割是否出错,取决于设置的是什么。
但这会造成损失,因此客户对此并不满意。
我试图找出原因
- 包括日志文件
- 调试
- 重复相同的环境。
但不会重复。
暂停并继续操作将再次使其平稳运行,而不会再次出现该错误。
我该如何解决这个问题?我应该将其声明为硬件问题吗?
我正在从事一个CNC(计算机数控)项目,该项目借助激光将形状切割成金属。
现在我的问题是,有时(每20天奇数次要1-2次)切割是否出错,取决于设置的是什么。
但这会造成损失,因此客户对此并不满意。
我试图找出原因
但不会重复。
暂停并继续操作将再次使其平稳运行,而不会再次出现该错误。
我该如何解决这个问题?我应该将其声明为硬件问题吗?
Answers:
正如ChrisF所建议的那样,务实的短期解决方案可能是使用暂停和恢复技巧,但是您必须与客户交谈以了解应优先考虑的事项。例如:
如果故障会浪费£1000的零件或每周导致4个小时的停机,而暂停恢复修复会使生产减少1%,则他们现在可能会更喜欢修复。
如果故障每周浪费一次£1零件或导致4分钟的停机,但是暂停恢复修复将生产减少了1%,则他们可能更愿意等待不会影响生产率的修复。
我在激光微加工行业工作了多年,我知道您需要承受多少压力才能优化工艺,并使您的机器每小时生产尽可能多的零件,所以无论哪种方式正确解决问题的压力。
以我的经验,有效跟踪Heisenbug的唯一方法是大量日志记录。在可能导致错误的代码部分及其周围记录所有内容。了解如何有效地读取日志文件,确保您正在监视电动机上的跟随错误(您的载物台在应该移动的位置移动了?)。查看机器上的内存使用情况,是否是内存泄漏导致关键进程饿死了?
确保您也记录了用户的操作,是否确定操作员没有按下紧急停止按钮,以便他们可以在固定过程中突然冒出烟头休息?我已经看到了这种情况!
另外,还要寻找在特定模式的划线与或多或少被触发的错误之间的相关性。如果您找到触发问题的频率更高(或从不触发)的模式,则可能表明您的问题。
尝试使触发问题的模式更加频繁。如果您找到一种可靠地触发问题的方法,那么您就可以找到解决方案的一半。
最后,不要很快责怪硬件,但不要以为它是完美的。很多次我被归咎于实际上是电气或机械问题,因此您始终必须将这些问题放在脑后。
即使您通常可能无法使用机器,也请记住,某些问题只能在机器上有效解决。有时,通过远程桌面在现场几天可以花上几个星期,而在离线状态下则可以花上数月。如果您用完了脱机选项,请不要害怕提出现场访问,他们只能说不。
您可能还想看看“ 如何使用heisenbug?”的问题和答案。和如何处理无法复制的错误?但是这些可能对您的情况没有太大帮助。
我将提出一个建议。
转到工厂经理,要求查看发生该故障的时间该工具或该区域的电源线监视器记录。还要问他在那个时候是否有焊接或其他异常活动。
几十年前,我父亲曾经与一台无缘无故崩溃的小型计算机混在一起。他们致电制造商的客户代表。
销售代表来到他们工厂区的办公室,将电压表插入迷你旁边的墙上,然后说:“注意这一点”。
几分钟后,电压表突然下陷,明显地,然后又回来了。代表说:“那是他打击测试弧线。请稍等。” 此后不久,电压表再次下沉,这次保持下垂。
代表说:“那是您的问题。您在工厂车间焊接了一个家伙,而他与您的功率相同。在我走进去时,我看到他正在安装。”
他们必须为办公室运行完全独立的电源。
我在一个游戏中遇到了一个错误,该错误只发生了十亿次。幸运的是,这意味着我每15到30分钟就会看到一次,但是单步调试一下调试器中的代码将无法正常工作。我最终输入了调试消息。他们需要使用精美的if语句,因为我只在出现问题时才需要某些东西。在大多数情况下,调试代码是在常规代码中重复计算,但是使用了不同的技术。重复不必很精确。如果我知道一个数字应始终小于10,000,并且有时看起来会达到150,000,那么我只想检查一个大于100,000的值。每次发生此错误时,我都会研究我的结果,设计更复杂的调试消息(或更准确地说,进行更复杂的检查以查看是否应该显示一条消息),然后等待问题再次出现。
您的周期将比我的周期长很多,但是最终您将解决这个问题。我确实希望您可以通过其他更快的方法找到解决方案,但是如果没有其他措施,最终还是可以找到解决方案的,并且可以让您感觉到您正在做某事,直到您提出一个更好的主意。
(在有帮助的情况下,我最终通过清理最终确定为问题的几行代码解决了我的问题。我发誓它们没什么问题,但是我认为优化器和CPU都在重新排序指令以用于在性能方面,我认为它们有时会偶尔获得一些额外的速度,即使是现在单核也要进行多进程,而且我认为每一次出色的工作都会在寄存器写入之前被读取。我将所有计算都切换为使用局部变量,“实例字段”值从一开始就移至局部变量,而局部值仅在同步块内最后才移回局部变量。方法的返回值,而不是“实例字段”我一直在使用。)
调试中的规则1第一:您需要可重现的方案。
如果您没有,请先进行处理。您是否可以在机器的某种“模拟模式”下重现该错误,而实际上并未切割任何金属?这似乎很有意义。您能否在几分钟内模拟20天的过程来快速,自动地运行几种不同的切割程序?这可能会增加出现问题的可能性。
然后,当您遇到这种情况时,下一步就是收集尽可能多的信息并真正开始调试。
RalphChapin答案的扩展:
多年来,我不得不寻找大量的错误,这些错误只能在由于附加硬件而无法复制的系统上显示出来。
除了疯狂地记录日志之外,我还发现了另一件事:将信息放在屏幕上,显示代码在哪里以及一些相关变量的值。当问题出现时,甚至工厂的工作人员都可以阅读我的信息。
通常需要经过几轮改进才能将其精确定位,但是非常有效。