You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ntool-biz/nmodbus/modbus_tcp.go

53 lines
1.7 KiB
Go

package nmodbus
import (
"git.noahlan.cn/noahlan/nnet"
"git.noahlan.cn/noahlan/nnet/config"
"git.noahlan.cn/noahlan/nnet/packet"
"git.noahlan.cn/noahlan/ntool-biz/nmodbus/handler"
"git.noahlan.cn/noahlan/ntool-biz/nmodbus/protocol"
"git.noahlan.cn/noahlan/ntool-biz/nmodbus/serialize"
"git.noahlan.cn/noahlan/ntool/npool"
"math"
"time"
)
// NewModbusTCPEngine 新建modbus-tcp服务端引擎
// 默认行为:接收功能码为 0x01 0x02 0x03 0x04 0x05 0x06 0x15 0x16 的消息并自动按照Modbus协议进行处理
//
// Usage:
// ngin, handler := NewModbusTCPEngine(ModbusTCPConf{ByteOrder: binary.BigEndian, Mode: conf.DevMode, Name: "ModbusTCP"})
// defer ngin.Stop()
//
// handler.RegisterFunction(code, func()) // 自定义功能码对应的处理方法
// hr := handler.holdingRegisters[0] // 获取地址为0x00的保持寄存器 2字节 uint16 (也可以设置,但非线程安全的)
//
// ngin.ListenTCP(config.TCPServerConf{Protocol: "tcp", Addr: "0.0.0.0:5502"})
func NewModbusTCPEngine(conf ModbusTCPConf) (*nnet.Engine, *handler.Handler) {
hd := handler.NewHandler(conf.ByteOrder)
opts := []nnet.RunOption{
nnet.WithPoolCfg(npool.Config{
PoolSize: math.MaxInt32,
ExpiryDuration: time.Second,
PreAlloc: false,
MaxBlockingTasks: 0,
Nonblocking: false,
DisablePurge: false,
}),
withPipeline(),
nnet.WithPackerBuilder(func() packet.Packer {
return protocol.NewTCPPacker(conf.ByteOrder)
}),
nnet.WithRouter(protocol.NewRouter(hd)),
}
// 设置字节序
serialize.SetByteOrder(conf.ByteOrder)
ngin := nnet.NewEngine(config.EngineConf{
Mode: conf.Mode,
Name: conf.Name,
}, opts...)
return ngin, hd
}