【联锁消息结构】
This commit is contained in:
parent
cb950c8e58
commit
e057d8ec3a
@ -1 +1 @@
|
|||||||
Subproject commit f5e9aeecc88bc2c60aac21b98e6f0b40d297d4ca
|
Subproject commit 3c65650745096e41bb008c74db31aa943e41285a
|
109
third_party/message/interlock.go
vendored
Normal file
109
third_party/message/interlock.go
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package message
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// 消息包头解析
|
||||||
|
type InterlockMsgPkgHeader struct {
|
||||||
|
Header1 byte //包头1 1个字节
|
||||||
|
Header2 byte //包头2 1个字节
|
||||||
|
TypeCode uint8 //类型码 1个字节 0x02
|
||||||
|
SerialNumber uint8 //序列号 1个字节 序列号0~255
|
||||||
|
Reserve1 byte //预留 1个字节
|
||||||
|
Reserve2 byte //预留 1个字节
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *InterlockMsgPkgHeader) Encode() []byte {
|
||||||
|
return []byte{h.Header1, h.Header2, h.TypeCode, h.SerialNumber, h.Reserve1, h.Reserve2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *InterlockMsgPkgHeader) Decode(buf []byte) error {
|
||||||
|
if len(buf) < 6 {
|
||||||
|
return fmt.Errorf("数据少于6个字节")
|
||||||
|
}
|
||||||
|
h.Header1 = buf[0]
|
||||||
|
h.Header2 = buf[1]
|
||||||
|
h.TypeCode = buf[2]
|
||||||
|
h.SerialNumber = buf[3]
|
||||||
|
h.Reserve1 = buf[4]
|
||||||
|
h.Reserve2 = buf[5]
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 消息包尾解析
|
||||||
|
type InterlockMsgPkgTail struct {
|
||||||
|
Tail []byte // 包尾2个字节
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *InterlockMsgPkgTail) Encode() []byte {
|
||||||
|
if len(t.Tail) == 0 {
|
||||||
|
return make([]byte, 2)
|
||||||
|
}
|
||||||
|
return t.Tail
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *InterlockMsgPkgTail) Decode(buf []byte) error {
|
||||||
|
if len(buf) < 2 {
|
||||||
|
return fmt.Errorf("数据少于2个字节")
|
||||||
|
}
|
||||||
|
t.Tail = buf[len(buf)-2:]
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送给联锁的采集数据
|
||||||
|
type InterlockSendMsgPkg struct {
|
||||||
|
Header *InterlockMsgPkgHeader // 包头
|
||||||
|
Info []byte // 发给联锁的状态数据
|
||||||
|
Tail *InterlockMsgPkgTail // 包尾
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *InterlockSendMsgPkg) Encode() []byte {
|
||||||
|
var data []byte
|
||||||
|
data = append(data, m.Header.Encode()...)
|
||||||
|
data = append(data, m.Info...)
|
||||||
|
data = append(data, m.Tail.Encode()...)
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收到联锁发来的驱动数据
|
||||||
|
type InterlockReceiveMsgPkg struct {
|
||||||
|
toagent_len int32
|
||||||
|
et_out_num int32
|
||||||
|
tcc_output_len int32
|
||||||
|
Header *InterlockMsgPkgHeader // 包头
|
||||||
|
syncZone []byte // 同步区状态
|
||||||
|
driveInfo []byte // 驱动数据
|
||||||
|
tccInfo []byte // 应答器报文
|
||||||
|
Tail *InterlockMsgPkgTail // 包尾
|
||||||
|
}
|
||||||
|
|
||||||
|
// ET_OUT_NUM、TOAGENTLEN、TCC_OUTPUT_LEN(应答器数量*131)的具体数值取决于数据配置。
|
||||||
|
func NewInterlockReceiveMsgPkg(tlen, etLen, tccLen int32) *InterlockReceiveMsgPkg {
|
||||||
|
return &InterlockReceiveMsgPkg{
|
||||||
|
toagent_len: tlen,
|
||||||
|
et_out_num: etLen,
|
||||||
|
tcc_output_len: tccLen,
|
||||||
|
Header: &InterlockMsgPkgHeader{},
|
||||||
|
Tail: &InterlockMsgPkgTail{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *InterlockReceiveMsgPkg) Decode(buf []byte) error {
|
||||||
|
var preIndex, lastIndex int32 = 0, 6
|
||||||
|
// 包头
|
||||||
|
t.Header.Decode(buf[preIndex:lastIndex])
|
||||||
|
// 同步区状态
|
||||||
|
preIndex = lastIndex
|
||||||
|
lastIndex = lastIndex + t.toagent_len
|
||||||
|
t.syncZone = buf[preIndex:lastIndex]
|
||||||
|
// 驱动数据
|
||||||
|
preIndex = lastIndex
|
||||||
|
lastIndex = lastIndex + t.et_out_num
|
||||||
|
t.driveInfo = buf[preIndex:lastIndex]
|
||||||
|
// 应答器报文
|
||||||
|
preIndex = lastIndex
|
||||||
|
lastIndex = lastIndex + t.tcc_output_len
|
||||||
|
t.tccInfo = buf[preIndex:lastIndex]
|
||||||
|
// 包尾
|
||||||
|
t.Tail.Decode(buf)
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user