跳到主要内容

2.12_JavaScript脚本编辑

功能简介

IoT 网关支持 JavaScript 脚本编辑功能,允许用户通过编写自定义脚本实现灵活的逻辑控制和数据处理。用户可以根据业务需求编写脚本,并设置脚本的开机启动或定时启动,满足复杂场景下的定制化需求。内置的 JavaScript 脚本编辑器提供了丰富的功能函数,帮助用户快速实现脚本开发。

功能配置

具体操作如下:
  1. 单击“添加”按钮;
  2. 在弹出的编辑框中添加唯一的js名称,执行方式总共有三种:开机运行、循环和定时。
    • 开机运行:程序启动时运行JS脚本;
    • 循环:根据配置的执行周期(ms)循环执行JS脚本;(已删除,请使用开机运行加上while(true)
    • 定时:每天规定的时间(时:分:秒)执行JS脚本;
  3. 单击选中需要运行的函数;
  4. 点击“Add”按钮,在弹窗中选择一个需要读取或者设置的点;
  5. 单击“插入”按钮,将新建的函数添加到js编辑框的光标后面;
  6. 可重复3,4,5的步骤进行多个函数的添加;
  7. 点击”确定“按钮完成js脚本的编辑。

图113 JavaScript脚本编辑 用户可以在编辑框中自行添加符合js语法的脚本,如while、if、else等。

函数说明

JS 脚本编辑器内置的函数说明如下:

读写函数

ReadBit函数 从指定Tag点读取Boolean,输入参数为Tag点名称的字符串,如果该点不存在或者质量戳不为Good,返回undefined。

示例: var tagValueBit = ReadBit('Device1.tag0001');

ReadStatus函数 从指定Tag点读取状态,,输入参数为Tag点名称的字符串,返回为Boolean,True为采集成功,False为采集失败,如果该点不存在或者质量戳不为Good,返回undefined。

示例: var tagStatus = ReadStatus('Device1.tag0001');

ReadInt函数 从指定Tag点读取整数,输入参数为Tag点名称的字符串,如果该点不存在或者质量戳不为Good,返回undefined。

示例: var tagValueInt = ReadInt('Device1.tag0001');

ReadFloat函数 从指定Tag点读取浮点数,如果该点不存在或者质量戳不为Good,返回undefined。

示例: var tagValueFloat = ReadFloat('Device1.tag0001');

WriteBit函数 向指定Tag点写入布尔型,参数依次为:Tag点名称(类型为字符串),需要写入Tag点的值(类型为布尔型),无返回值。

示例: var value = true;
WriteBit('Device1.tag0001', value);

WriteInt函数 向指定Tag点写入整型,参数依次为:Tag点名称(类型为字符串),需要写入Tag点的值(类型为整型),无返回值。

示例: var value = 10;
WriteInt('Device1.tag0001', value);

WriteFloat函数 向指定Tag点写入浮点型,参数依次为:Tag点名称(类型为字符串),需要写入Tag点的值(类型为浮点型),无返回值。

示例: var value = 1.23;
WriteFloat('Device1.tag0001', value);

WriteString函数 向指定Tag点写入字符串,参数依次为:Tag点名称(类型为字符串),需要写入Tag点的值(类型为字符串),无返回值。

示例: var value = "String";
WriteString('Device1.tag0001', value);

通讯函数

SendMsgToPort函数 向指定串口发送报文,并返回接收到的报文,参数依次为:串口号,波特率,数据位,停止位,奇偶校验( 0:N,1:O,2:E),超时时间(单位毫秒:1000毫秒=1秒),发送的报文,等待接收的字节数。返回值为字符串型。

示例:
while(true){ //1个不会结束的循环
var A = [0x17, 0x03, 0x00, 0x00, 0x00, 0x04, 0x46, 0xff]; //报文内容
var rs = SendMsgToPort('com1',9600,8,1,0,2000,A,0); //向串口发送报文
//console.log(rs); //打印出返回值
if(rs){ //判断返回值是否为空
var str=rs.slice(7,8); //按报文说明截取数据
//console.log(str); //打印出str的内容
reint = parseInt(str,16); //把字符串转成int16
WriteFloat('user.tag0001',reint); //把值写入指定的用户点
}
Sleep(1000); //等待1秒后再次执行循环体
}

SendMsgToTCP函数 向指定网口发送指定报文,并返回接收到的报文。参数依次为:IP地址,端口,超时时间(单位毫秒:1000毫秒=1秒),发送的报文。返回值为字符串型。

示例:
while(true){ //1个不会结束的循环
var A = [0x17, 0x03, 0x00, 0x00, 0x00, 0x04, 0x46, 0xff]; //报文内容
var rs = SendMsgToTCP('192.168.1.88',81,2000,A); //向网口发送报文
//console.log(rs); //打印出返回值
if(rs){ //判断返回值是否为空
var str = rs.slice(7,8); //按报文说明截取数据
//console.log(str); //打印出str的内容
reint = parseInt(str,16); //把字符串转成int16
WriteFloat('user.tag0001',reint); //把值写入指定的用户点
}
Sleep(1000); //等待1秒后再次执行循环体
}

系统函数

Sleep函数 延迟执行,输入参数值为毫秒,无返回值。

示例:
Sleep(1000);//延迟等待1000mS

使用示例

开机运行示例

while (true) {
var status;
status = ReadStatus('system.TIME_SECOND'); //ReadStatus:读取数据点质量戳
console.log('system.TIME_SECOND status is ', status);
if(status){ // 如果该点存在并且质量戳为Good
var curVal;
curVal = ReadInt('system.TIME_SECOND'); //ReadInt:从指定数据点读取整数
console.log('system.TIME_SECOND value is ', status);
WriteInt('user.test',curVal); //WriteInt:向指定数据点写入整数
}
Sleep(1000); //休眠1秒钟
}

定时示例

var status;
status = ReadStatus('system.TIME_SECOND'); //ReadStatus:读取数据点质量戳
console.log('system.TIME_SECOND status is ', status);
if(status){
var curVal;
curVal = ReadInt('system.TIME_SECOND'); //ReadInt:从指定数据点读取整数
console.log('system.TIME_SECOND value is ', status);
WriteInt('user.test',curVal); //WriteInt:向指定数据点写入整数
}

编写JS脚本实现网关定时重启

Sleep(1000); //延时1000毫秒启动循环
var i = 0;
while(true){
if(i==72) {
Reboot();
}
i++;
Sleep(1000*60*60); //循环延时1小时
}