dlt645

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 2, 2026 License: GPL-2.0, GPL-3.0 Imports: 14 Imported by: 0

Documentation

Index

Constants

View Source
const (
	FrameStart    = 0x68
	FrameEnd      = 0x16
	PreambleByte  = 0xFE
	CtrlRead      = 0x11
	CtrlReadResp  = 0x91
	CtrlWrite     = 0x14
	CtrlWriteResp = 0x94
	CtrlErrorMask = 0x40
	AddrLen       = 6
	DataIDLen     = 4
	EncodeOffset  = 0x33
	BroadcastByte = 0xAA
)

Variables

This section is empty.

Functions

func BuildReadFrame

func BuildReadFrame(meterAddr [AddrLen]byte, dataID [DataIDLen]byte) []byte

BuildReadFrame builds a read-data request frame (control 0x11).

func BuildWriteFrame

func BuildWriteFrame(meterAddr [AddrLen]byte, dataID [DataIDLen]byte, payload []byte) []byte

BuildWriteFrame builds a write-data request frame (control 0x14).

func DataIDString

func DataIDString(di [DataIDLen]byte) string

DataIDString formats data identifier bytes as "DI3-DI2-DI1-DI0".

func DecodeValue

func DecodeValue(raw []byte, dataType string, scale float64, offset float64) (any, error)

DecodeValue converts raw meter bytes to a typed value per DL/T 645 BCD encoding.

func EncodeMeterAddress

func EncodeMeterAddress(addr string) ([AddrLen]byte, error)

EncodeMeterAddress converts a 12-digit decimal meter address to 6-byte BCD (low byte first).

func MeterAddressString

func MeterAddressString(addr [AddrLen]byte) string

MeterAddressString converts 6-byte BCD address back to 12-digit string.

func NewDLT645Driver

func NewDLT645Driver() driver.Driver

func ParseDataID

func ParseDataID(di string) ([DataIDLen]byte, error)

ParseDataID parses "DI3-DI2-DI1-DI0" or "DI3DI2DI1DI0" into 4 bytes (DI0 lowest index).

func ParseReadResponse

func ParseReadResponse(frame *Frame) (dataID [DataIDLen]byte, value []byte, err error)

ParseReadResponse extracts data identifier and value bytes from a read response.

Types

type DLT645Decoder

type DLT645Decoder struct {
	// contains filtered or unexported fields
}

DLT645Decoder handles DL/T 645-2007 frame and value encoding/decoding.

func NewDLT645Decoder

func NewDLT645Decoder() *DLT645Decoder

func (*DLT645Decoder) ParseAddress

func (d *DLT645Decoder) ParseAddress(addr string) (*ParsedAddress, error)

ParseAddress parses "meterAddr#DI3-DI2-DI1-DI0[#extension]" or "DI3-DI2-DI1-DI0".

func (*DLT645Decoder) SetDefaultMeterAddress

func (d *DLT645Decoder) SetDefaultMeterAddress(addr string)

type DLT645Driver

type DLT645Driver struct {
	// contains filtered or unexported fields
}

DLT645Driver implements DL/T 645-2007 meter communication over serial or TCP.

func (*DLT645Driver) BindLinkMutex

func (d *DLT645Driver) BindLinkMutex(mu *sync.Mutex)

BindLinkMutex injects channelMu into ConnectionManager for shared-link reconnect.

func (*DLT645Driver) Connect

func (d *DLT645Driver) Connect(ctx context.Context) error

func (*DLT645Driver) Disconnect

func (d *DLT645Driver) Disconnect() error

func (*DLT645Driver) GetConnectionMetrics

func (d *DLT645Driver) GetConnectionMetrics() (connectionSeconds int64, reconnectCount int64, localAddr string, remoteAddr string, lastDisconnectTime time.Time)

func (*DLT645Driver) GetMetrics

func (d *DLT645Driver) GetMetrics() model.ChannelMetrics

func (*DLT645Driver) Health

func (d *DLT645Driver) Health() driver.HealthStatus

func (*DLT645Driver) Init

func (d *DLT645Driver) Init(cfg model.DriverConfig) error

func (*DLT645Driver) ReadPoints

func (d *DLT645Driver) ReadPoints(ctx context.Context, points []model.Point) (map[string]model.Value, error)

func (*DLT645Driver) SetDeviceConfig

func (d *DLT645Driver) SetDeviceConfig(config map[string]any) error

func (*DLT645Driver) SetSlaveID

func (d *DLT645Driver) SetSlaveID(slaveID uint8) error

func (*DLT645Driver) WritePoint

func (d *DLT645Driver) WritePoint(ctx context.Context, p model.Point, value any) error

type DLT645Scheduler

type DLT645Scheduler struct {
	// contains filtered or unexported fields
}

DLT645Scheduler coordinates batch reads grouped by meter address.

func NewDLT645Scheduler

func NewDLT645Scheduler(transport *DLT645Transport, decoder *DLT645Decoder) *DLT645Scheduler

func (*DLT645Scheduler) GetStats

func (s *DLT645Scheduler) GetStats() (totalRequests, successCount, failureCount int64)

func (*DLT645Scheduler) ReadPoints

func (s *DLT645Scheduler) ReadPoints(ctx context.Context, points []model.Point) (map[string]model.Value, error)

ReadPoints reads all points, grouping by meter address when possible.

func (*DLT645Scheduler) WritePoint

func (s *DLT645Scheduler) WritePoint(ctx context.Context, p model.Point, value any) error

WritePoint writes a single point when the meter supports it.

type DLT645Transport

type DLT645Transport struct {
	// contains filtered or unexported fields
}

DLT645Transport manages serial (RTU) or TCP connections and frame I/O.

func NewDLT645Transport

func NewDLT645Transport(cfg map[string]any) *DLT645Transport

func (*DLT645Transport) Connect

func (t *DLT645Transport) Connect(ctx context.Context) error

func (*DLT645Transport) Disconnect

func (t *DLT645Transport) Disconnect() error

func (*DLT645Transport) GetConnectionMetrics

func (t *DLT645Transport) GetConnectionMetrics() (connectionSeconds int64, reconnectCount int64, localAddr string, remoteAddr string, lastDisconnectTime time.Time)

func (*DLT645Transport) IsConnected

func (t *DLT645Transport) IsConnected() bool

func (*DLT645Transport) ReadData

func (t *DLT645Transport) ReadData(ctx context.Context, meterAddr [AddrLen]byte, dataID [DataIDLen]byte) ([]byte, error)

ReadData sends a read request and returns the response value bytes (without DI prefix).

func (*DLT645Transport) RecordFailure

func (t *DLT645Transport) RecordFailure(err error)

func (*DLT645Transport) RecordSuccess

func (t *DLT645Transport) RecordSuccess()

func (*DLT645Transport) WriteData

func (t *DLT645Transport) WriteData(ctx context.Context, meterAddr [AddrLen]byte, dataID [DataIDLen]byte, payload []byte) error

WriteData sends a write request with encoded payload (password + data per meter spec).

type Frame

type Frame struct {
	MeterAddr [AddrLen]byte
	Control   byte
	Data      []byte
}

Frame represents a parsed DL/T 645-2007 response/request frame.

func DecodeFrame

func DecodeFrame(raw []byte) (*Frame, error)

DecodeFrame parses a complete frame (without leading preamble).

func (Frame) ErrorCode

func (f Frame) ErrorCode() byte

func (Frame) IsError

func (f Frame) IsError() bool

type ParsedAddress

type ParsedAddress struct {
	MeterAddr [AddrLen]byte
	DataID    [DataIDLen]byte
	Extension string
}

ParsedAddress holds meter address and data identifier from a point address string.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL