MODBUS-TCP
欢迎访问设备云门户网站http://open.iot.10086.cn/注册用户,获取最新文档。 版本号 V1.0 V1.2 V1.3 修订日期 2014.10.30 2015/8/5 2016/02/18 新增 Dtu设备登录传输项目ID 增加接入流程例子 实现01,02,03,04功能码周期查询 通过URL获取服务IP和PORT 设备定时发送心跳包 通过restfull api主动下发在线命令 修订内容 说明 V1.4 2016/07/06 1 说明
基于《modbus协议.pdf》实现01,02,03,04功能码周期查询。
适用于设备云定期主动发送modbus-tcp命令到设备查询寄存器值,设备回复寄存器值的情况。
2 名词解释
项目ID:在平台注册账号后,添加新项目平台生成数字ID; Api-key:管理每个项目下资源,用于restful api鉴权。
3 设备接入
1 2
访问设备云门户注册用户,可以查看(项目ID)和master_key(api-key);
业务平台调用RESTFUL API新增设备,并指定如下设备属性: 设备属性名 interval auth_info 说明 设备云主动查询设备的时间间隔,单位秒 设备鉴权信息,格式如下: {“登录报文的phone字段”:”登录报文的SVRPWD字段”} 3
设备上电,发送登录报文(52字节)到设备云接入服务器进行鉴权,设备通过链接http://api.heclouds.com/s?t=6&v=1拉取服务器IP和PORT,其中格式如下:
登录报文固定格式如下:(其中绿色三项为必填) 报文字段 type name phone svrpwd id 4
设备登录成功后,服务器不会返回数据,如果登录失败,服务器会主动断开连接。
固定长度 11字节 9字节 12字节 9字节 11字节 说明 设备类型字符串,以’\\0’结尾,目前作为保留用途。 设备名称字符串,以’\\0’结尾,目前作为保留用途。 设备通信卡号码,以’\\0’结尾。注册设备时作为auth_info属性子域json对象的key,用于鉴权。 服务器登录密码,以’\\0’结尾。注册设备时作为auth_info属性子域json对象的value,用于鉴权。 项目ID,以’\\0’结尾,平台申请项目时分配的项目ID字符串。 4 数据流
4.1 业务平台调用restfull api为设备新增数据流,数据流需要指定如下属性: 说明 设备云为获取数据定期下发访问寄存器的命令,用十六进制标示。如“83A245”表示三个字节的命令0x83A245。 可选配置。对命令返回各个寄存器值的处理公式,多个公式用分号间隔。例如: \表示对命令返回的前两个寄存器值的和再乘上第三个寄存器的值得到综合结果。 注意:公式不能写成这样 (A0*A1),请去掉最外层的无效括号,否则公式会被认为不合法,不会生效 数据流属性名 cmd formula 4.2
4.3
01、02命令返回结果(不支持formula属性) {“起始地址”:”线圈值1,线圈值2,…,线圈值n”} 其中,每个线圈值对应设备返回数据的一个byte 起始地址、线圈值都以10进制表示 03命令返回结果(支持formula属性)
4.3.1 未设置formula属性
{“地址1”:”寄存器值1”, ”地址2”:”寄存器值2”, … ,”地址n”:”寄存器值n”} 其中,地址、寄存器值都以10进制表示 4.3.2 已设置formula属性
{“1”:”formula计算结果1”, “2”: “formula计算结果2”, … , “n”:”formula计算结果n”}
其中,计算结果为double类型值
formula属性可以有多个计算公式组合在一起,通过”;”隔开。 1、2、…、n,分别表示第1、2、…、n个计算公式 A0、A1、…、An, 分别表示第1、2、…、n个寄存器值 例如:(A0+A1)*A2 – (A3-A4)/A5 + (A6+A7)¨ + A9fA10 目前formula支持运算符如下:
+ - * / % ()
f表示前后操作数作为uint16,然后合并组成float
例如A0fA1
4.4
4.5
union {
uint32_t u32; float f32; } u_f;
u_f.u32 = (((uint32_t)(uint16_t)A0)<<16)|(uint16_t)A1; u_f.f32 即为f运算符运算结果
04命令返回结果(不支持formula属性)
{“地址1”:”寄存器值1”, ”地址2”:”寄存器值2”, ? ,”地址n”:”寄存器值n”}
其中,地址、寄存器值都以10进制表示 注意事项
数据流中定时下发的命令尽量保持不同
5 保持设备在线
当设备处于空闲的时候,为了保持与ONENET平台的连接不断开,需要定期发送心跳包(推荐0x0000),以确保网络连接不断开。其中时间间隔须小于5分钟,推荐1~3分钟。
6 通过restfull api下发在线命令到设备
区别于数据流的定时下发命令到设备,resfull api通过使用HTTP请求的方式,主动下发命令到设备。
其中,通过restfull api主动下发的命令,尽量与数据流中定时下发的命令保持不同。
HTTP方法 URL HTTP头部 URL参数 HTTP内容 POST http://api.heclouds.com/cmds api-key:xxxx-ffff-zzzzz,必须master key device_id = //接收该数据的MODBUS设备ID,必填。 { \:”xxxxxxxx” //需要下发MODBUS设备的命令(16进制字符串) } 成功返回 { \\\succ”, \//不超过64个字符字符串 \\2302-312-FWs” } } 查看命令发送状态 GET HTTP方法 URL HTTP头部 成功返回 http://api.heclouds.com/cmds/
1.利用restfull api创建设备
POST http://api.heclouds.com/devices HTTP/1.1 User-Agent: Fiddler
api-key: nCxNdCoX6eHGfergpyytu66TyuY= /*必须为MasterKey*/ Host: api.heclouds.com Content-Length: 155 注意长度和空行,建议使用fiddler 调试,会自动填充长度 {
\填写MODBUS设备卡号*/ \ \
\填写HTTP协议,没有专门的Modbus协议*/
\这里就是鉴权信息的卡号和密码,长度有限制,参考登录报文格式*/
\命令的查询间隔*/ } 此api没有针对modbus相关配置出错处理返回,必须仔细填写各个字段。 2.为该设备创建数据流
使用restfull api创建,请求数据如下:
POST http://api.heclouds.com/devices/[your_devid]/datastreams HTTP/1.1 User-Agent: Fiddler
api-key: nCxNdCoX6eHGfergpyytu66TyuY= /*设备对应的key或masterkey*/ Host: api.heclouds.com 注意长度和空行,建议使用fiddlerContent-Length: 66
调试,会自动填充长度 {
\
\