DLT645网关功能支持对电表数据的自动读写、转换,直接上传json到服务器;
通用DLT645 JSON采集上传指南视频介绍: [在线观看]
最新版本现在已经支持整点时间采集,自动对齐到基站时间0s
现在已经支持广播地址抄读采集
如果读取设备过程中,某一条采集指令无回复或者数据错误,会重复读取3次,若3次都错误,DTU上传时会忽略该指令对应的字段
关于数据源的说明:定义数据源是DLT645模块输出结果的名称,需要唯一选择,不要和其他功能的定义重复;输入数据源则是从机数据来源,可以是串口、网络、其他自定义,可以多选;要上传DLT645的结果,一般情况下网络通道数据源请选自定义4(就是DLT645设置的定义数据源)
属性 | 说明 | 必填 |
---|---|---|
读取超时 | 串口数据返回超时,单位秒 | 是 |
定义数据源 | 定义当前功能的数据源名称,需要唯一,用在其他模块如网络配置的数据源需要选择当前的名称 | 是 |
输入数据源 | 当前功能的数据来源,可以多选,一般是串口,网络,自定义数据源 | 是 |
用户参数 | 在结果里面携带用户参数,用户参数支持魔法值,用户参数名称自己填写,值写这些可以自动替换: ${ts} 时间戳,${date} 格式时间字符串,${imei} ,${iccid} ,${csq} 动态信号,${vbat} 动态电源电压,${lon} 动态经度(有GPS用gps没有就是基站位置),${lat} 动态纬度,${alt} 动态GPS海拔(From V42),${geo} 动态阿里云GPS信息结构体(From V42),${ip} 动态IP , 新增支持表id(接一个表)${pmid} |
否 |
时间戳 | 将会在数据里面插入为ts的时间戳 | 是 |
数据结构 | 混合模式或者设备模式,混合模式下所有采集指令键值会组合成一个json对象(键值必须全局唯一):{“a”:1,“b”:2}, 设备模式下每个设备按照ID排序组成json数组(每个指令下键值唯一):[{“i”:“id1”, “c”:“func”,v:{“a”:1,“b”:2}},{“i”:“id2”, “c”:“func”,v:{“a”:1,“b”:2}}] ; 模板模式支持简易语法构造自定义数据格式,使用比较复杂,后续单独说明 | 是 |
指令间隔 | 一条指令读写完了等待延迟的时间,防止太快了传感器反应不过来 | 是 |
唤醒长度 | 唤醒码FE的数量 | 是 |
整点对齐 | 采集周期会自动对齐到0s,必须输入10的倍数,采集时间将从00:00开始计时 | 是 |
属性 | 说明 | 必填 |
---|---|---|
周期 | 采集指令读取周期,单位秒 | 是 |
单独上传 | 勾选后,此采集指令读取成功即上传,会组成单独的json;而其他没有勾选的指令会组成一条json | 是 |
变化上传 | 读取的数据和上次比较,发生变化则上传;多条指令有一条发生变化也会上传 | 是 |
协议版本 | 可选DLT645 97/07, DLT698 | 是 |
表地址 | 电表地址,常见于电表正面标签,对于只接一块表,填入${AUTO}自动读取表ID,读取不到使用广播地址not ok | 是 |
键值 | 数据映射,结果键值(别名),字符串, 转换成json使用的名称 | 是 |
命令(功能码) | 采集指令,如果没有可以选的,可以勾上自定义,输入16进制采集功能码 | 是 |
比例 | 数据转换,公式为 y = ax + b , a是比例 | 是 |
偏移 | 数据转换,公式为 y = ax + b , b是偏移 | 是 |
自定义 | 如果没有可以选的采集指令,可以勾上自定义,输入16进制采集功能码 | 是 |
数据块 | 对于自定义指令,勾上数据块设置提取数据用的报文偏移和长度 | 是 |
Modbus结果支持3种数据结构; 一般情况下,以及自适应对接内置的平台格式,请选择混合模式;想要简单的自定义上传格式请选择模板模式。
所有映射的键值全局唯一,结果将是一个只有一层的JSON Map
设置两条指令,指令一添加映射a,指令二添加映射b,输出结果:
{"va":10, "ia":11,"power":220}
所有映射的键值按设备唯一,结果将是一个有两层的JSON Array
设置两条指令,输出结果:
[{"i":"000001544993","v":{"a":220,"b":10}}]
v表示映射列表,i表示表id
DL645目前不支持写入数据,但是可以从平台下发主动抄读指令
下发格式:
{devid="1234556", tab=["va", "vb"]}
或者
{id="1234556", tab=["va", "vb"]}
或者支持msgid
{"id":"1234556", "tab":["va", "vb"],"msgid":"1232435"}
支持msgid需要sbl版本V93以上
DL645目前可以从平台下发JSON实现开合闸指令
下发格式:
{"devid":"01", "hz":"35444444333333334D334A8453433556", "msgid":"21424"}
其中hz
字段包含指令内容,注意不包含校验字节; msgid为流水号
"35444444333333334D334A8453433556" 翻译后就是
02 111111 00000000 1A 00 175120100223
密码权限 密码 操作者 控制命令 保留 时间20230211-104925
控制指令: 1A跳闸, 1B合闸
目前可以从平台下发JSON实现水表开合闸指令
下发格式:
{"devid":"2016022601", "hz":"2A04A0170055", "msgid":"21424"}
其中hz
字段包含指令内容,注意不包含校验字节; msgid为流水号
某品牌水表非标协议返回
6810c967000010e8c18112901f00 000003a6 00079e92 0007a238 01 0000 6516
读取水量的时候映射选Hex可以得到原始值,在模板模式里面解析数据000003a6 00079e92 0007a238 010000
string.unpack 使用见文档 http://www.lua.org/manual/5.4/manual.html#6.4.2
在模板里面解析old
属性的hex值
function(tm,td,ex)
local hexval = tm.old
if hexval then
local v1, v2, v3, v4 = string.unpack(">LLLxH", hexval)
if v1 and v2 and v3 then
tm.v1 = v1 * 0.01
tm.v2 = v2 * 0.01
tm.v3 = v3 * 0.01
tm.v4 = v4
tm.old = nil
end
end
return tm
end
```![水表1.png](/645/img/水表1.png)
## 采集冻结数据
- 配置好映射,指令选择上一日冻结电能量
- 只需要设置第一个总电能的键值,其中尖峰平谷等费率数据是自动生成的
- 如费率1键值为`总电能键值`+“_1”
- 如费率2键值为`总电能键值`+“_2”
- 其他费率同理,部分表是4个费率,也有表是5个费率
```json
若设置的键值为fryall
采集结果为:
{"fryall":123.12, "fryall_1":123.12, "fryall_2":123.12, "fryall_3":123.12, "fryall_4":123.12}
需量键值
+“_ts”若设置的键值为de
采集结果为:
{"de":123.12, "de_ts":23042130}
总电能键值
+"_1"总电能键值
+"_2"若设置的键值为fryall
采集结果为:
{"fryall":123.12, "fryall_1":123.12, "fryall_2":123.12, "fryall_3":123.12, "fryall_4":123.12}
单表
的情况下才能使用广播地址抄读,同时可以解析到表ID,可以通过用户参数里面获取表ID
配置示例:
${pmid}
获取表idfunction(tm,td,ex)
-- 这里获取表id使用用户参数, ex.dbid
return tm
end
数据结构切换到模板模式,需要设置上下行模板,也可以只设置一个。这里最后直接lua函数的方式实现模板,输入格式:
function(tm,td,ex) return tm end
,
function(sub,ex) return sub end
,
function(reply,ex) return reply end
新增的第三个回复模板是从V93以后才支持
输入的含义是三个函数
-- 输入参数分别是: tm=混合结构table,td=设备模式table,ex=用户参数
-- 返回一个table
function(tm,td,ex)
return tm
end
-- 输入参数分别是: 下行的数据table, 用户参数ex
-- 返回可以是4个值:
-- 第一个是table结果,数量列表
-- 第二个是bool,代表是否主动读取,而不写入;
-- 第三个是串口命令,会将这个数据直接发到串口,用于某些自定义指令;
-- 第四个是msgid,用于标记此消息;
function(sub, ex)
return sub, read, nil, msgid
end
-- 输入参数分别是: reply=回复的table,ex=用户参数(如果有msgid会在ex里面,在加上其他的用户参数)
-- 如果是modbus, reply的属性{ suc = suc, props = props, errlist = errlist }
-- 如果是645,reply的属性{ suc = suc, add = add }
-- 返回一个table
function(reply,ex)
return reply
end
模板使用可以参考Modbus,实例更加丰富,这里仅仅设备模式输入td参数格式略有不同
function(tm,td,ex)
tm.c = (tm.a or 0) + (tm.b or 0)
return table.merge(tm, ex)
end
若混合模式上传{"a":10, "b":11}
这里模板处理后上传{"a":10, "b":11, "c":21}
若服务器下发数据{"devid":"12345678909", "ts":123456778, "read":["va", "vb"]}
这里是需要读取参数a和b,但是数据在第二层嵌套里面,如果采用混合模式,这里将不能识别到写入指令;
使用下行模板:
function(tm,td,ex)
return table.merge(tm, ex)
end,
function(sub)
local temp ={
devid = sub.devid
tab = sub.read
}
return sub.read, true
end
下行结果为{devid="12345678909", tab=["va", "vb"]}
,设备将触发一次对表12345678909的属性va和vb的读取
多表上传,按表ID区分,需要对设备模式输入td进行处理:
设备模式采集到:
[{"i":"000001544993","v":{"va":220,"vb":10}}, {"i":"000001544995","v":{"va":220,"vb":10}}]
设置上行模板:
-- td就是设备模式结果
function(tm,td,ex)
if not td or #td < 1 then return {} end
local template = {}
for index, value in ipairs(td) do
local id = value.i
template[id] = value.v
end
return template
end
输出结果:
{"000001544993":{"va":220,"vb":10}, "000001544995":{"va":220,"vb":10}}
设置上行模板:
注意这里只写了单表, tid为自增id
function (tm, td, ex)
if not td or #td < 1 then
return
end
sys.tid = (sys.tid or os.time()) + 1
local template = {
tid = misc.getImei()..tostring(sys.tid),
sendTp = tostring(os.time()),
tp = tostring(os.time()),
pt = {
{
id = misc.getImei(),
product = "DAQ-IR-1",
meterSn = td[1].i,
data = td[1].v
}
}
}
return template
end