程序员开发实例大全宝库

网站首页 > 编程文章 正文

利用云平台脚本解析连接物模型(一)

zazugpt 2024-08-27 00:35:43 编程文章 16 ℃ 0 评论

不久前发布在《串口服务器接入阿里云物模型》一文中通过编写TPC-7062(MCGS脚本)的脚本程序解析Alink JSON数据,从而实现阿里云物模型采集控制RTU设备。

本文将介绍另一种方式实现阿里云物模型控制RTU设备,之前是通过设备进行数据解析,因此开发者既需要了解MCGS脚本程序还需要了解Modbus协议导致使用门槛较高,而本文使用方法无需使用设备解析Alink JSON数据,因此不需要编写MCGS脚本从而降低是使用门槛。

我将通过物模型查询RTU设备的保持寄存器(0x0000)的值讲解如何实现该功能。

一.软硬件准备

1.硬件准备

串口服务器一台用于连接MQTT服务器,本例程的从机将通过Modbus Slave仿真实现(方便观察数据变化);

可上网路由器一台;

网线两根,一根连接串口服务器与路由器,一根连接电脑与路由器;

电脑一台,用于配置串口服务器以及调试云平台;

2.软件准备

MQTTX调试工具(https://mqttx.app/zh),用于接入前数据帧分析;

Modbus Slave仿真工具(https://www.modbustools.com/),用于Modbus RTU从机仿真;

亿佰特网络配置工具(https://www.ebyte.com/product-view-news.html?id=1465,相关下载),用于配置串口服务器,可以不适应软件通过网页配置,由于设备采用DHCP获取本机IP,因此采用上位机配置更为方便;

二.云平台

第一次使用阿里云的数据解析功能,并且这是笔者第一次使用JavaScript(ECMAScript 5)编写脚本,因此接下的云平台配置都将参考阿里云帮助中性的最佳实例下的“设备通过DTU接入物联网平台”进行开发,建议开发者仔细阅读阿里云手册可以发现不一样的世界,活学活用里面案例能对初学者有很好的引导和启发。

三.产品与设备创建

1.产品创建

这次创建的产品和以往的不同不能无脑点击下一步,需要调整数据收发协议为“透传/自定义”,如下图:

其余参数保持默认。

2.设备创建

3.物模型配置

在产品详情下的功能定义目录下点击“编辑草稿”,选择添加自定义功能;

一共需要添加两个自定义功能,一个用于保存寄存器值(左图),一个用于物模型发起读取指令;

这里需要分析下Modbus响应数据帧,0103020064320C,可以看到响应帧只有地址用于标记,未标记寄存器地址,因此只有在平台对收发数据进行标记,本例程重点介绍连接使用不需要考虑标记,保留接口待后续使用。因此在定义功能时使用枚举变量。

脚本语言JavaScript(ECMAScript 5)配置

复制参考实例的脚本,并调整部分配置,如下:

var ALINK_ID = "12345";

var ALINK_VERSION = "1.1";

var ALINK_PROP_POST_METHOD = 'thing.event.property.post';

var ALINK_PROP_SET_METHOD = 'thing.service.property.set';

/*此函数将设备上报数据转换为Alink JSON物模型数据。*/

function rawDataToProtocol(bytes) {

/*将设备上报的原始数据转换为数组。其中bytes对象中存储着设备上报原始数据。*/

var uint8Array = new Uint8Array(bytes.length);

for (var i = 0; i < bytes.length; i++) {

uint8Array[i] = bytes[i] & 0xff;

}

var params = {}; // 定义属性存放对象。

var jsonMap = {}; // 定义模拟Alink数据报对象。

/*填写Alink数据报协议头部分。*/

jsonMap['version'] = ALINK_VERSION; // Alink 协议版本号。

jsonMap['id'] = ALINK_ID; // 消息ID。

jsonMap['method'] = ALINK_PROP_POST_METHOD; // 设备上行数据方法:设备属性上报。

/*填写Alink数据报属性部分。*/

//0103020064320c

params['register'] = uint8Array[3]*265+ uint8Array[4]; // 将收到的第一和第二字节转换为十进制数存储。

jsonMap['params'] = params; // 将参数打包到数据帧中。

return jsonMap; // 返回结果会发送给物联网平台。

}

//以下是部分辅助函数。

function buffer_uint8(value)

{

var uint8Array = new Uint8Array(1);

var dv = new DataView(uint8Array.buffer, 0);

dv.setUint8(0, value);

return [].slice.call(uint8Array);

}

/*此函数实现由物联网平台下发数据转换为设备能识别的16进制数。*/

function protocolToRawData(json)

{

var method = json['method'];

var id = json['id'];

var version = json['version'];

var payloadArray = [];

if (method == ALINK_PROP_SET_METHOD) // 接收来自物联网平台的“设置设备属性”的命令。

{

var send_params = json['params'];

var prop_cur = send_params['READ_R']; // 将设置的具体值抽取出来。

//按照自定义协议格式拼接rawdata。

//0103000000018833

payloadArray = payloadArray.concat(buffer_uint8(0x01));

payloadArray = payloadArray.concat(buffer_uint8(0x03));

payloadArray = payloadArray.concat(buffer_uint8(0x00));

payloadArray = payloadArray.concat(buffer_uint8(0x00));

payloadArray = payloadArray.concat(buffer_uint8(0x00));

payloadArray = payloadArray.concat(buffer_uint8(0x01));

payloadArray = payloadArray.concat(buffer_uint8(0x88));//校验错误,但保留错误,引导学习如何分析问题,见“从机仿真”,正确校验0x840A

payloadArray = payloadArray.concat(buffer_uint8(0x33));//

}

return payloadArray; // 返回时,将数据发送至设备端。

}

function transformPayload(topic, rawData) {

var jsonObj = {};

return jsonObj;

}

将上述脚本粘贴到“产品详情”下的“数据解析”,如图所示:

脚本语言测试与提交

测试数据上报功能,如下图所示:

测试数据下发功能,如下图所示:

测试完成点击“提交”,自此云平台脚本与产品配置完成。

四.软件调试

1.MQTT X软件测试

使用MQTT X软件连接MQTT服务器进行测试,配置如下:

查询“订阅”“发布”的地址,如下图所示:

平台发送读取请求,如下图所示:

MQTT X发送响应帧,如下图所示:

通过调试软件可以更加直观的对数据帧进行分析,若发现数据帧错误可以更加方便定位问题,这里是没有错误的可进入下一步串口服务器演示。

五.设备演示

串口服务器参数配置,如下图所示:

从机仿真

Modbus Slave并非免费软件,可免费试用30天,若有长时间使用需求请购买正版授权。

点击“Connection”配置连接参数,选择“Serial Port”,并配置正确端口与匹配的波特率参数,如下图所示:

配置仿真软件的保持寄存器值,如下图所示:

物模型发送查询指令,仿真从机收到云平台下发指令,仿真设备未响应,检查发现之前使用的校验工具没有配置正确导致校验错误。

修改脚本中关于校验的两位,注意需要先调试才能提交生效。

修改后再次发送,如下图所示:

效果演示,如下图所示:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表