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.
53 lines
1.7 KiB
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,
|
|
}),
|
|
withEvents(),
|
|
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
|
|
}
|