不久前太阳集团tcy8722小编发布在《串口服务器接入阿里云物模型》一文中通过编写TPC-7062(MCGS脚本)的脚本程序解析Alink JSON数据,从而实现阿里云物模型采集控制RTU设备。
本文将介绍另一种方式实现阿里云物模型控制RTU设备,之前是通过设备进行数据解析,因此开发者既需要了解MCGS脚本程序还需要了解Modbus协议导致使用门槛较高,而本文使用方法无需使用设备解析Alink JSON数据,因此不需要编写MCGS脚本从而降低是使用门槛。
小编将通过物模型查询RTU设备的保持寄存器(0x0000)的值讲解如何实现该功能。
串口服务器一台用于连接MQTT服务器,本例程的从机将通过Modbus Slave仿真实现(方便观察数据变化);
可上网路由器一台;
网线两根,一根连接串口服务器与路由器,一根连接电脑与路由器;
电脑一台,用于配置串口服务器以及调试云平台;
MQTTX调试工具(http://mqttx.app/zh),用于接入前数据帧分析;
Modbus Slave仿真工具(http://www.modbustools.com/),用于Modbus RTU从机仿真;
太阳集团tcy8722网络配置工具(http://www.hanzaichips.com/product/1465.html,相关下载),用于配置串口服务器,可以不适应软件通过网页配置,由于设备采用DHCP获取本机IP,因此采用上位机配置更为方便;
第一次使用阿里云的数据解析功能,并且这是笔者第一次使用JavaScript(ECMAScript 5)编写脚本,因此接下的云平台配置都将参考阿里云帮助中性的最佳实例下的“设备通过DTU接入物联网平台”进行开发,建议开发者仔细阅读阿里云手册可以发现不一样的世界,活学活用里面案例能对初学者有很好的引导和启发。
1.产品创建
这次创建的产品和以往的不同不能无脑点击下一步,需要调整数据收发协议为“透传/自定义”,如下图:
其余参数保持默认。
2.设备创建
在产品详情下的功能定义目录下点击“编辑草稿”,选择添加自定义功能;
一共需要添加两个自定义功能,一个用于保存寄存器值(左图),一个用于物模型发起读取指令;
这里需要分析下Modbus响应数据帧,0103020064320C,可以看到响应帧只有地址用于标记,未标记寄存器地址,因此只有在平台对收发数据进行标记,本例程重点介绍连接使用不需要考虑标记,保留接口待后续使用。因此在定义功能时使用枚举变量。
复制参考实例的脚本,并调整部分配置,如下:
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;
}
将上述脚本粘贴到“产品详情”下的“数据解析”,如图所示:
脚本语言测试与提交
测试数据上报功能,如下图所示:
测试数据下发功能,如下图所示:
测试完成点击“提交”,自此云平台脚本与产品配置完成。
使用MQTT X软件连接MQTT服务器进行测试,配置如下:
查询“订阅”“发布”的地址,如下图所示:
平台发送读取请求,如下图所示:
MQTT X发送响应帧,如下图所示:
通过调试软件可以更加直观的对数据帧进行分析,若发现数据帧错误可以更加方便定位问题,这里是没有错误的可进入下一步串口服务器演示。
串口服务器参数配置,如下图所示:
从机仿真
Modbus Slave并非免费软件,可免费试用30天,若有长时间使用需求请购买正版授权。
点击“Connection”配置连接参数,选择“Serial Port”,并配置正确端口与匹配的波特率参数,如下图所示:
配置仿真软件的保持寄存器值,如下图所示:
物模型发送查询指令,仿真从机收到云平台下发指令,仿真设备未响应,检查发现之前使用的校验工具没有配置正确导致校验错误。
修改脚本中关于校验的两位,注意需要先调试才能提交生效。
修改后再次发送,如下图所示:
效果演示,如下图所示:
7 X 24 销售服务热线
4000-330-990深圳办事处柯经理:18218726658 杭州办事处戴经理:17512568697
常州办事处崔经理:15906110783 南京办事处葛经理:17626012283
业务邮箱:support@cdhanzaichips.com
全国销售投诉电话:19934352316
地址:四川省成都市高新西区西区大道199号B5栋(前台座机:028-61543675)
©© 成都太阳集团tcy8722电子科技有限公司【版权所有】 蜀ICP备27697263号-3