TubePro-脚本功能使用

脚本功能的基本介绍

现有的PLC已经提供了一套简单实用的自动化应用框架,但针对一些非标应用的开发存在如下问题:

1. 现有的PLC编辑器,缺乏基本的条件判断、跳转等;

2. 增加新的device或复合动作等,必须修改Delphi代码并重新编译;

诸多自动化应用平台,提供了底层库函数和用户程序接口,允许客户根据特定场景修改代码。TubePro通过开放NC的部分功能,注册到脚本宿主里,然后加载执行外部脚本,从而允许客户根据现有函数控制外设。

**目标**:

1. 开放NC层的控制接口,允许脚本访问和执行;

2. 增加脚本编辑与运行的交互界面;

3. 提供脚本编程框架:NC给脚本发指令,脚本反馈执行状态;脚本执行过程中,查看NC是否有停止请求;

# TubePro的CNC脚本使用说明

1、在平台配置工具高级配置里“启用脚本功能”;

2、脚本编辑;

​ 可以使用记事本和vscode等工具,或者TubePro自带脚本编辑器,他的主要功能是脚本编辑与执行(空闲且无报警状态):

- 自定义脚本1-10执行时出现语法错误或返回异常时,均会报警(允许PLC里面调用);

- demo脚本屏蔽了所有执行异常引起的脚本报警;

- 文件保存目录为fsdataCypTube2016js;

3、PLC编辑器里面调用脚本并执行;

- “执行脚本”,允许传入参数,脚本可以根据参数做不同的动作,执行立即返回;

- ”等待脚本执行结束“,允许传入超时时间,大于0才会启用超时报警;

- ”停止脚本执行“,停止脚本,fsHost.IsReqStop()为true;

​ 另外,脚本执行与等待执行结束,支持并行PLC,允许在某个并行PLC里面触发脚本执行,然后再主PLC等待执行结束;

# 编程说明

1. 脚本的执行入口为Run函数,Run函数的返回值true,表示执行正常,false表示执行失败,TubePro将报警;

2. 脚本的执行是单线程的,脚本执行时只能外部发停止请求,脚本接收到请求之后,自行响应停止;

3. js发送的日志格式为”js: XXX“;

4. 出现语法不正确时,日志部分将打印错误信息并报警(fsdemo.js屏蔽了所有执行时出现的报警),其中Line3表示第三行出错;

5. 脚本执行时可以通过RunError直接汇报报警信息;

脚本案例:不同零件长度执行不同plc过程

function Run(cmd)

{  

  return GetPartLengthToPLC();

}

function GetPartLengthToPLC()

{

var PartLength;

PartLength = fsCAD.GetCurrentPartLength();

if (PartLength <= 600) //判断零件长度小于等于600就会执行下面语句,可以通过改这句话来修改判断条件

{

fsHost.Log('零件长度小于600,不做任何动作')

}

else if (PartLength > 600 && PartLength <= 1400) //判断零件长度大于600且小于1400就会执行下面语句,可以通过改这句话来修改判断条件

{

var ATask = 

{

doExec: function ()

{

log('开始执行');

fsNc.RunCustomStep(49); //执行自定义过程49,修改数字可以改变执行的自定义过程

},

isEnd: function ()

{ return fsNc.CustomStepIsEnd(); },

timeout: 1000*1000,

doSuccess: function (){ log('执行成功');},

doFailed: function (){log('执行失败');}

};

if (!doTask(ATask))

{

return false;

}

}

else if (PartLength > 1400 && PartLength <= 2000)//判断零件长度大于1400且小于2000就会执行下面语句,可以通过改这句话来修改判断条件

{

var ATask = 

{

doExec: function ()

{

log('开始执行');

fsNc.RunCustomStep(48); //执行自定义过程48,修改数字可以改变执行的自定义过程

},

isEnd: function ()

{ return fsNc.CustomStepIsEnd(); },

timeout: 1000*1000,

doSuccess: function (){ log('执行成功');},

doFailed: function (){log('执行失败');}

};

if (!doTask(ATask))

{

return false;

}

}

else //零件大于2000时直接打印

fsHost.Log('零件长度大于2000,不做任何动作')

  return true;

}