Cognex In-Sight中JS切换配方后文本框内容无法恢复的问题
Cognex In-Sight JS配方切换后文本框内容无法保留的解决方法
问题场景
开发Cognex In-Sight程序时,通过读取文本框内容匹配并切换对应配方,但切换完成后文本框中的字符串会失效。尝试将文本框内容存入变量,待配方切换完成后写回,配方切换功能正常,但文本框内容始终无法恢复。
原代码如下:
const aql = ['AQL17012', 'AQL17016', 'AQL33024' , 'AQL17112' , 'AQL17116' , 'AQL33124']; const aqlHT = ['AQL17012HT', 'AQL17016HT', 'AQL33024HT']; const aqxB = ['AQX17012', 'AQX17016', 'AQX33024']; const aqxI = ['AQX22012', 'AQX22016', 'AQX44024']; const aqxBHT = ['AQX17012HT', 'AQX17016HT', 'AQX33024HT']; const aqxIHT = ['AQX22012HT', 'AQX22016HT', 'AQX44024HT']; var textBox = $WebPages.HMI.CurrentPartTextB.Text if ( aql.includes($WebPages.HMI.CurrentPartTextB.Text) === true) { $System.Recipes.Products.Load('AQL'); $WebPages.HMI.CurrentPartTextB.Text = textBox } else if ( aqlHT.includes($WebPages.HMI.CurrentPartTextB.Text) === true) { $System.Recipes.Products.Load('AQLHT'); $WebPages.HMI.CurrentPartTextB.Text = textBox } else if ( aqxB.includes($WebPages.HMI.CurrentPartTextB.Text) === true) { $System.Recipes.Products.Load('AQX BODY'); $WebPages.HMI.CurrentPartTextB.Text = textBox } else if ( aqxI.includes($WebPages.HMI.CurrentPartTextB.Text) === true) { $System.Recipes.Products.Load('AQX INS'); $WebPages.HMI.CurrentPartTextB.Text = textBox } else if ( aqxBHT.includes($WebPages.HMI.CurrentPartTextB.Text) === true) { $System.Recipes.Products.Load('AQXHT BODY'); $WebPages.HMI.CurrentPartTextB.Text = textBox } else if ( aqxIHT.includes($WebPages.HMI.CurrentPartTextB.Text) === true) { $System.Recipes.Products.Load('AQXHT INS'); $WebPages.HMI.CurrentPartTextB.Text = textBox }
问题原因
- 异步操作覆盖:
$System.Recipes.Products.Load是异步执行的,同步写回文本框的代码会先于配方加载完成执行,后续配方加载后的UI重置操作会覆盖你设置的文本内容。 - 重复逻辑冗余:多次重复读取文本框属性,增加了逻辑疏漏的概率。
解决方案
1. 利用配方加载回调执行文本回写
Cognex In-Sight的Load方法支持传入回调函数,确保文本框回写操作在配方加载完成后执行:
// 构建配方映射表,简化匹配逻辑 const recipeMap = new Map([ [['AQL17012', 'AQL17016', 'AQL33024', 'AQL17112', 'AQL17116', 'AQL33124'], 'AQL'], [['AQL17012HT', 'AQL17016HT', 'AQL33024HT'], 'AQLHT'], [['AQX17012', 'AQX17016', 'AQX33024'], 'AQX BODY'], [['AQX22012', 'AQX22016', 'AQX44024'], 'AQX INS'], [['AQX17012HT', 'AQX17016HT', 'AQX33024HT'], 'AQXHT BODY'], [['AQX22012HT', 'AQX22016HT', 'AQX44024HT'], 'AQXHT INS'] ]); const textBoxContent = $WebPages.HMI.CurrentPartTextB.Text; let targetRecipe = null; // 遍历映射表找到匹配的配方 for (const [partNumbers, recipeName] of recipeMap) { if (partNumbers.includes(textBoxContent)) { targetRecipe = recipeName; break; } } if (targetRecipe) { // 传入回调函数,配方加载完成后恢复文本框内容 $System.Recipes.Products.Load(targetRecipe, function() { $WebPages.HMI.CurrentPartTextB.Text = textBoxContent; }); }
2. 延迟执行文本回写(回调不可用的备选方案)
如果Load方法不支持回调,可以通过setTimeout延迟写回操作,确保配方加载完成:
// 映射表部分同上 if (targetRecipe) { $System.Recipes.Products.Load(targetRecipe); // 根据实际情况调整延迟时间(如200ms) setTimeout(function() { $WebPages.HMI.CurrentPartTextB.Text = textBoxContent; }, 200); }
3. 检查文本框绑定设置
确认文本框是否绑定了配方中的变量,如果是,配方加载时会自动覆盖该值。可以在配方编辑器中取消该文本框与配方变量的绑定,或者在配方加载后手动覆盖绑定值。
内容的提问来源于stack exchange,提问作者Ryan000
相关产品推荐
相关产品推荐

