代码拉取完成,页面将自动刷新
// Package mbserver implments a Modbus server (slave).
package mbserver
import (
"errors"
"io"
"net"
)
// Server is a Modbus slave with allocated memory for discrete inputs, coils, etc.
type Server struct {
// Debug enables more verbose messaging.
ID uint8
Debug bool
listeners []net.Listener
ports []io.ReadWriteCloser
requestChan chan *Request
function [256](func(*Server, Framer) ([]byte, *Exception))
DiscreteInputs []byte
Coils []byte
HoldingRegisters []uint16
InputRegisters []uint16
}
// Request contains the connection and Modbus frame.
type Request struct {
conn io.ReadWriteCloser
frame Framer
}
// NewServer creates a new Modbus server (slave).
func NewServer() *Server {
s := &Server{}
// Allocate Modbus memory maps.
s.DiscreteInputs = make([]byte, 65536)
s.Coils = make([]byte, 65536)
s.HoldingRegisters = make([]uint16, 65536)
s.InputRegisters = make([]uint16, 65536)
// Add default functions.
s.function[1] = ReadCoils
s.function[2] = ReadDiscreteInputs
s.function[3] = ReadHoldingRegisters
s.function[4] = ReadInputRegisters
s.function[5] = WriteSingleCoil
s.function[6] = WriteHoldingRegister
s.function[15] = WriteMultipleCoils
s.function[16] = WriteHoldingRegisters
s.requestChan = make(chan *Request)
go s.handler()
return s
}
func (s *Server) SetID(id uint8) {
s.ID = id
}
// RegisterFunctionHandler override the default behavior for a given Modbus function.
func (s *Server) RegisterFunctionHandler(funcCode uint8, function func(*Server, Framer) ([]byte, *Exception)) {
s.function[funcCode] = function
}
func (s *Server) handle(request *Request) (Framer, error) {
var exception *Exception
var data []byte
response := request.frame.Copy()
//检查ID
slaveid := request.frame.GetID()
if slaveid != 0 {
if (s.ID != 0) && (slaveid != s.ID) {
return nil, errors.New("ID Error")
}
}
function := request.frame.GetFunction()
if s.function[function] != nil {
data, exception = s.function[function](s, request.frame)
response.SetData(data)
} else {
exception = &IllegalFunction
}
if exception != &Success {
response.SetException(exception)
}
return response, nil
}
// All requests are handled synchronously to prevent modbus memory corruption.
func (s *Server) handler() {
for {
request := <-s.requestChan
response, err := s.handle(request)
if err == nil {
request.conn.Write(response.Bytes())
}
}
}
// Close stops listening to TCP/IP ports and closes serial ports.
func (s *Server) Close() {
for _, listen := range s.listeners {
listen.Close()
}
for _, port := range s.ports {
port.Close()
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。