Skip to content

Latest commit

 

History

History
168 lines (163 loc) · 6.28 KB

dlt_645.md

File metadata and controls

168 lines (163 loc) · 6.28 KB

dlt645

全局异常回调

当出现报文解析错误或者接收到异常帧的时候会调用这个方法,这个回调需要自己实现,然后在里面编写自己的业务逻辑

  1. 自定义全局异常回调
var errorHandle = func(frame string, address string, errCode byte, err error) {
    if err != nil {
        fmt.Println("错误的frame:", frame)
        fmt.Println("错误:", err.Error())
    } else {
        fmt.Println("表地址:", address)
        fmt.Println("从站异常答复, 异常控制码:", errCode)
    }
}
  1. 注册回调
EnrollFrameDecodeErrorHandle(errorHandle)

读数据

注册处理器(加载需要操作的数据标识)

  1. 创建回调
var MasterReadMeterDataHandler = MasterReadMeterDataHandle(
    func(address string, control byte, ident string, seq byte, param ...byte) {
    fmt.Println("---------收到主站请求帧(功能:请求读电能表数据)---------")
    fmt.Println("address", address)
    fmt.Println("controlCode:", control)
    fmt.Println("ident:", ident)
    fmt.Println("帧序号seq", seq)
    fmt.Println("param:", param)
    })
  1. 注册回调
err := EnrollControlHandle(MasterReadMeterData, MasterReadMeterDataHandler) // MasterReadMeterData -> 控制码:0x11, 功能:请求读取电能表数据 
err := EnrollControlHandle(MasterReadNext, MasterReadMeterDataHandler) // MasterReadNext -> 控制码:0x12, 功能:请求读取后续数据

创建报文

  1. 只有数据标识时
frameBytes, err := MasterReadMeterData1(电能表地址, 标识)
  1. 数据标识 + 读给定块数的负荷记录
frameBytes, err := MasterReadMeterData2(电能表地址, 标识, 负荷记录块数)
  1. 数据标识 +读给定块数的负荷记录 +给定时间
frameBytes, err := MasterReadMeterData3(电能表地址, 标识, 负荷记录块数, , 小时, , , )
  1. 读后续数据
frameBytes, err := CreateMasterReadNext(表地址, 数据标识, 帧序号)

当你拿到<读数据>的报文时,该如何解析

DecodeString("6834121726052468110a33323435343e3e3e3c4bda16")

当你调用改方法时,如果报文正确将会进入你自定义的MasterReadMeterDataHandler,如果报文错误将会进入errorHandle

读数据的应答(目前只支持读float数据)

创建回调函数

var EnrollNormalResponseFloatHandler = EnrollNormalResponseFloatHandle(func(address string, control byte, ident string, seq byte, value ...float64) {
	fmt.Println("address", address)
	fmt.Println("controlCode:", control)
	fmt.Println("ident:", ident)
	fmt.Println("帧序号:", seq)
	fmt.Println("值:", value)
})

创建处理器

err := EnrollNormalResponseFloat(字节长度, 倍率, EnrollNormalResponseFloatHandler, 数据标识)

举例:创建一个字节长度为2,倍率为0,1的处理器

//电压
err := EnrollNormalResponseFloat(2, 0.1, EnrollNormalResponseFloatHandler, "02010100", "02010200", "02010300", "0201FF00")

如何创建一个<读数据的应答>的报文

  1. 正常应答
frameBytes, err := MasterReadMeterDataNormalResponseFloat(表地址, 是否分帧, 数据标识, )
  1. 异常应答
frameBytes, err := CreateMasterReadMeterDataErrorResponse(表地址, 错误信息字)
  1. 读后续数据的正常应答报文
frameBytes, err := MasterReadNextNormalResponseFloat(表地址, 是否分帧, 数据标识, 帧序号, )
  1. 读后续数据的异常应答报文
frameBytes, err := CreateMasterReadNextError(表地址, 错误信息字)

写数据

如何创建一个<写数据>的报文

1.创建权限载体
auth := &WriteAnalyzer{Pa: 密码权限, Password: 密码, OperatorCode: 操作者代码}

举例

auth := &WriteAnalyzer{Pa: 0, Password: []byte{0x00, 0x00, 0x00}, OperatorCode: []byte{0xC1, 0xC2, 0xC3, 0xC4}}
2.加载要设置的数据
  • 如果想要操作一个YYMMDDWW, hhmmss,YYMMDDhhmm,或者byte或byte数组,建议使用数组入参(auth.JoinByteParams(是否翻转数据, ...值))
//数组入参例子,例如 04000102的hhmmss
auth.JoinByteParams(true, 1, 2, 3)
  • 如果想要操作若干个浮点数,建议使用浮点数入参方法(auth.JoinFloatParams(数据所占的字节数量, 倍率, ...值))
// 浮点数入参例子,例如04000D01的A相电导系数 
err := auth.JoinFloatParams(2, 0.1, 220.1)
  • 如果想要操作多个数组,建议使用二维入参(auth.JoinTwoBitArrayParams(是否翻转数据, ...数组))
//todo 二维字节数组入参例子 例如04010000的第一套时区表数据
auth.JoinTwoBitArrayParams(true, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01}, []byte{0x09, 0x19, 0x01})
组建报文
frameBytes, err := MasterRequestMeterSetFloatData(表地址, 数据标识, auth)

如何解析<写数据>的报文

  1. 创建回调函数
var MasterSetMeterDataHandler = MasterReadMeterDataHandle(
	func(address string, control byte, ident string, seq byte, param ...byte) {
		fmt.Println("---------收到主站设置帧---------")
		fmt.Println("address", address)
		fmt.Println("controlCode:", control)
		fmt.Println("ident:", ident)
		fmt.Println("帧序号seq", seq)
		fmt.Println("param:", param)
	})
  1. 注册回调函数
err := EnrollControlHandle(MasterRequestMeterSetData, MasterSetMeterDataHandler)
  1. 解析报文
DecodeString("6812230004232068140f3534333733333333f4f5f6f73635348316")
进入MasterSetMeterDataHandler之后,可能会出现解析浮点数的时候,只需要创建一个解析器即可
floating := &FloatAnalyser{Length: length, Rate: rate}
err := floating.Decode(存储浮点数的那部分数据)
result := floating.GetValue()

如何创建一个写数据之后的应答报文

  1. 正常应答的报文
frameBytes, err := MasterRequestMeterSetFloatDataNormalResponse(表地址)
  1. 异常应答的报文
frameBytes, err := CreateMasterRequestMeterSetFloatDataErrorResponse(表地址, 异常信息字)