You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    
}      

问题原因

  1. 异步操作覆盖:$System.Recipes.Products.Load是异步执行的,同步写回文本框的代码会先于配方加载完成执行,后续配方加载后的UI重置操作会覆盖你设置的文本内容。
  2. 重复逻辑冗余:多次重复读取文本框属性,增加了逻辑疏漏的概率。

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:33:12