当出现报文解析错误或者接收到异常帧的时候会调用这个方法,这个回调需要自己实现,然后在里面编写自己的业务逻辑
- 自定义全局异常回调
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)
}
}
- 注册回调
EnrollFrameDecodeErrorHandle(errorHandle)
- 创建回调
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)
})
- 注册回调
err := EnrollControlHandle(MasterReadMeterData, MasterReadMeterDataHandler) // MasterReadMeterData -> 控制码:0x11, 功能:请求读取电能表数据
err := EnrollControlHandle(MasterReadNext, MasterReadMeterDataHandler) // MasterReadNext -> 控制码:0x12, 功能:请求读取后续数据
- 只有数据标识时
frameBytes, err := MasterReadMeterData1(电能表地址, 标识)
- 数据标识 + 读给定块数的负荷记录
frameBytes, err := MasterReadMeterData2(电能表地址, 标识, 负荷记录块数)
- 数据标识 +读给定块数的负荷记录 +给定时间
frameBytes, err := MasterReadMeterData3(电能表地址, 标识, 负荷记录块数, 分, 小时, 日, 月, 年)
- 读后续数据
frameBytes, err := CreateMasterReadNext(表地址, 数据标识, 帧序号)
DecodeString("6834121726052468110a33323435343e3e3e3c4bda16")
当你调用改方法时,如果报文正确将会进入你自定义的MasterReadMeterDataHandler,如果报文错误将会进入errorHandle
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")
- 正常应答
frameBytes, err := MasterReadMeterDataNormalResponseFloat(表地址, 是否分帧, 数据标识, 值)
- 异常应答
frameBytes, err := CreateMasterReadMeterDataErrorResponse(表地址, 错误信息字)
- 读后续数据的正常应答报文
frameBytes, err := MasterReadNextNormalResponseFloat(表地址, 是否分帧, 数据标识, 帧序号, 值)
- 读后续数据的异常应答报文
frameBytes, err := CreateMasterReadNextError(表地址, 错误信息字)
auth := &WriteAnalyzer{Pa: 密码权限, Password: 密码, OperatorCode: 操作者代码}
举例
auth := &WriteAnalyzer{Pa: 0, Password: []byte{0x00, 0x00, 0x00}, OperatorCode: []byte{0xC1, 0xC2, 0xC3, 0xC4}}
- 如果想要操作一个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)
- 创建回调函数
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)
})
- 注册回调函数
err := EnrollControlHandle(MasterRequestMeterSetData, MasterSetMeterDataHandler)
- 解析报文
DecodeString("6812230004232068140f3534333733333333f4f5f6f73635348316")
floating := &FloatAnalyser{Length: length, Rate: rate}
err := floating.Decode(存储浮点数的那部分数据)
result := floating.GetValue()
- 正常应答的报文
frameBytes, err := MasterRequestMeterSetFloatDataNormalResponse(表地址)
- 异常应答的报文
frameBytes, err := CreateMasterRequestMeterSetFloatDataErrorResponse(表地址, 异常信息字)