Documentation
¶
Overview ¶
Package modbus provides a pure Go implementation of Modbus protocol supporting both RTU and TCP modes without requiring RS485 ioctl.
This package is designed to work with USB-to-Serial converters (like CH340) that handle RS485 direction control in hardware.
Index ¶
- Constants
- Variables
- func AppendCRC(data []byte) []byte
- func BuildReadFileRecordRequest(slaveID byte, fileNumber, recordNumber, recordLength uint16) []byte
- func BuildReadRequest(slaveID, funcCode byte, address, quantity uint16) []byte
- func BuildWriteFileRecordRequest(slaveID byte, fileNumber, recordNumber uint16, data []byte) []byte
- func BuildWriteMultipleCoilsRequest(slaveID byte, address uint16, values []bool) []byte
- func BuildWriteMultipleRegistersRequest(slaveID byte, address uint16, values []byte) []byte
- func BuildWriteSingleRequest(slaveID, funcCode byte, address, value uint16) []byte
- func BytesToFloat32(data []byte, endianness Endianness) (float32, error)
- func BytesToInt16(data []byte) int16
- func BytesToInt32(data []byte, endianness Endianness) (int32, error)
- func BytesToUint16(data []byte) uint16
- func BytesToUint32(data []byte, endianness Endianness) (uint32, error)
- func CalculateCRC(data []byte) uint16
- func EncodeMBAP(header *MBAPHeader) []byte
- func Float32ToBytes(value float32, endianness Endianness) ([]byte, error)
- func Int16ToBytes(value int16) []byte
- func Int32ToBytes(value int32, endianness Endianness) ([]byte, error)
- func ParseResponse(response []byte, expectedFuncCode byte) ([]byte, error)
- func Uint16ToBytes(value uint16) []byte
- func Uint32ToBytes(value uint32, endianness Endianness) ([]byte, error)
- func VerifyCRC(data []byte) bool
- type Client
- type Endianness
- type MBAPHeader
- type ModbusError
- type RTUClient
- func (c *RTUClient) Close() error
- func (c *RTUClient) Connect() error
- func (c *RTUClient) GetCommEventCounter() (uint16, error)
- func (c *RTUClient) IsConnected() bool
- func (c *RTUClient) ReadCoils(address, quantity uint16) ([]byte, error)
- func (c *RTUClient) ReadDiscreteInputs(address, quantity uint16) ([]byte, error)
- func (c *RTUClient) ReadExceptionStatus() (byte, error)
- func (c *RTUClient) ReadFileRecord(fileNumber, recordNumber, recordLength uint16) ([]byte, error)
- func (c *RTUClient) ReadHoldingRegisters(address, quantity uint16) ([]byte, error)
- func (c *RTUClient) ReadInputRegisters(address, quantity uint16) ([]byte, error)
- func (c *RTUClient) SetSlaveID(slaveID byte)
- func (c *RTUClient) SetTimeout(timeout time.Duration)
- func (c *RTUClient) WriteFileRecord(fileNumber, recordNumber uint16, data []byte) error
- func (c *RTUClient) WriteMultipleCoils(address uint16, values []bool) error
- func (c *RTUClient) WriteMultipleRegisters(address uint16, values []byte) error
- func (c *RTUClient) WriteSingleCoil(address, value uint16) error
- func (c *RTUClient) WriteSingleRegister(address, value uint16) error
- type RTUConfig
- type Request
- type Response
- type TCPClient
- func (c *TCPClient) Close() error
- func (c *TCPClient) Connect() error
- func (c *TCPClient) GetCommEventCounter() (uint16, error)
- func (c *TCPClient) IsConnected() bool
- func (c *TCPClient) ReadCoils(address, quantity uint16) ([]byte, error)
- func (c *TCPClient) ReadDiscreteInputs(address, quantity uint16) ([]byte, error)
- func (c *TCPClient) ReadExceptionStatus() (byte, error)
- func (c *TCPClient) ReadFileRecord(fileNumber, recordNumber, recordLength uint16) ([]byte, error)
- func (c *TCPClient) ReadHoldingRegisters(address, quantity uint16) ([]byte, error)
- func (c *TCPClient) ReadInputRegisters(address, quantity uint16) ([]byte, error)
- func (c *TCPClient) SetSlaveID(slaveID byte)
- func (c *TCPClient) SetTimeout(timeout time.Duration)
- func (c *TCPClient) WriteFileRecord(fileNumber, recordNumber uint16, data []byte) error
- func (c *TCPClient) WriteMultipleCoils(address uint16, values []bool) error
- func (c *TCPClient) WriteMultipleRegisters(address uint16, values []byte) error
- func (c *TCPClient) WriteSingleCoil(address, value uint16) error
- func (c *TCPClient) WriteSingleRegister(address, value uint16) error
- type TCPConfig
Constants ¶
const ( ExceptionIllegalFunction byte = 0x01 ExceptionIllegalDataAddress byte = 0x02 ExceptionIllegalDataValue byte = 0x03 ExceptionSlaveDeviceFailure byte = 0x04 ExceptionAcknowledge byte = 0x05 ExceptionSlaveDeviceBusy byte = 0x06 ExceptionMemoryParityError byte = 0x08 ExceptionGatewayTargetFailed byte = 0x0B )
Modbus 异常码
const ( // 位访问 FuncCodeReadCoils byte = 0x01 FuncCodeReadDiscreteInputs byte = 0x02 FuncCodeWriteSingleCoil byte = 0x05 FuncCodeWriteMultipleCoils byte = 0x0F // 16位寄存器访问 FuncCodeReadHoldingRegisters byte = 0x03 FuncCodeReadInputRegisters byte = 0x04 FuncCodeWriteSingleRegister byte = 0x06 FuncCodeWriteMultipleRegisters byte = 0x10 // 文件记录 FuncCodeReadFileRecord byte = 0x14 FuncCodeWriteFileRecord byte = 0x15 // 诊断 FuncCodeReadExceptionStatus byte = 0x07 FuncCodeDiagnostics byte = 0x08 FuncCodeGetCommEventCounter byte = 0x0B FuncCodeGetCommEventLog byte = 0x0C FuncCodeReportSlaveID byte = 0x11 // 高级操作 FuncCodeMaskWriteRegister byte = 0x16 FuncCodeReadWriteMultipleRegisters byte = 0x17 FuncCodeReadFIFOQueue byte = 0x18 FuncCodeReadDeviceIdentification byte = 0x2B )
Modbus 功能码常量
const Version = "1.0.0"
Version 包版本
Variables ¶
var ( ErrNotConnected = fmt.Errorf("client not connected") ErrInvalidSlaveID = fmt.Errorf("invalid slave ID") ErrInvalidQuantity = fmt.Errorf("invalid quantity") ErrInvalidAddress = fmt.Errorf("invalid address") ErrInvalidData = fmt.Errorf("invalid data") ErrResponseTooShort = fmt.Errorf("response too short") ErrCRCCheckFailed = fmt.Errorf("CRC check failed") ErrUnexpectedResponse = fmt.Errorf("unexpected response") ErrTimeout = fmt.Errorf("timeout") )
自定义错误
Functions ¶
func BuildReadFileRecordRequest ¶
BuildReadFileRecordRequest 构建读文件记录请求 (功能码 20)
func BuildReadRequest ¶
BuildReadRequest 构建读请求 (功能码 1, 2, 3, 4)
func BuildWriteFileRecordRequest ¶
BuildWriteFileRecordRequest 构建写文件记录请求 (功能码 21)
func BuildWriteMultipleCoilsRequest ¶
BuildWriteMultipleCoilsRequest 构建写多个线圈请求 (功能码 15)
func BuildWriteMultipleRegistersRequest ¶
BuildWriteMultipleRegistersRequest 构建写多个寄存器请求 (功能码 16)
func BuildWriteSingleRequest ¶
BuildWriteSingleRequest 构建写单个请求 (功能码 5, 6)
func BytesToFloat32 ¶
func BytesToFloat32(data []byte, endianness Endianness) (float32, error)
BytesToFloat32 字节转 Float32(支持字节序)
func BytesToInt32 ¶
func BytesToInt32(data []byte, endianness Endianness) (int32, error)
BytesToInt32 字节转 Int32(支持字节序)
func BytesToUint32 ¶
func BytesToUint32(data []byte, endianness Endianness) (uint32, error)
BytesToUint32 字节转 Uint32(支持字节序)
func Float32ToBytes ¶
func Float32ToBytes(value float32, endianness Endianness) ([]byte, error)
Float32ToBytes Float32 转字节(支持字节序)
func Int32ToBytes ¶
func Int32ToBytes(value int32, endianness Endianness) ([]byte, error)
Int32ToBytes Int32 转字节(支持字节序)
func ParseResponse ¶
ParseResponse 解析响应
func Uint32ToBytes ¶
func Uint32ToBytes(value uint32, endianness Endianness) ([]byte, error)
Uint32ToBytes Uint32 转字节(支持字节序)
Types ¶
type Client ¶
type Client interface {
// 基础读操作
ReadCoils(address, quantity uint16) ([]byte, error)
ReadDiscreteInputs(address, quantity uint16) ([]byte, error)
ReadHoldingRegisters(address, quantity uint16) ([]byte, error)
ReadInputRegisters(address, quantity uint16) ([]byte, error)
// 基础写操作
WriteSingleCoil(address, value uint16) error
WriteSingleRegister(address, value uint16) error
WriteMultipleCoils(address uint16, values []bool) error
WriteMultipleRegisters(address uint16, values []byte) error
// 文件记录操作
ReadFileRecord(fileNumber, recordNumber, recordLength uint16) ([]byte, error)
WriteFileRecord(fileNumber, recordNumber uint16, data []byte) error
// 诊断功能
ReadExceptionStatus() (byte, error)
GetCommEventCounter() (uint16, error)
// 连接管理
Connect() error
Close() error
IsConnected() bool
// 配置
SetTimeout(timeout time.Duration)
SetSlaveID(slaveID byte)
}
Client Modbus 客户端接口
type Endianness ¶
type Endianness int
Endianness 字节序类型
const ( // LittleEndian 小端模式(低地址寄存器为数据低16位) LittleEndian Endianness = 1 // BigEndian 大端模式(低地址寄存器为数据高16位) BigEndian Endianness = 2 // LittleEndianSwap 小端字节交换(小端模式 + 寄存器内部字节交换) LittleEndianSwap Endianness = 3 // BigEndianSwap 大端字节交换(大端模式 + 寄存器内部字节交换) BigEndianSwap Endianness = 4 )
type MBAPHeader ¶
MBAPHeader MBAP 头(Modbus Application Protocol Header)
type ModbusError ¶
ModbusError Modbus 错误
func (*ModbusError) Error ¶
func (e *ModbusError) Error() string
func (*ModbusError) ExceptionString ¶
func (e *ModbusError) ExceptionString() string
ExceptionString 返回异常描述
type RTUClient ¶
type RTUClient struct {
// contains filtered or unexported fields
}
RTUClient Modbus RTU 客户端
func NewRTUClient ¶
NewRTUClient 创建 RTU 客户端
func (*RTUClient) GetCommEventCounter ¶
func (*RTUClient) ReadDiscreteInputs ¶
func (*RTUClient) ReadExceptionStatus ¶
func (*RTUClient) ReadFileRecord ¶
func (*RTUClient) ReadHoldingRegisters ¶
func (*RTUClient) ReadInputRegisters ¶
func (*RTUClient) SetTimeout ¶
SetTimeout 设置超时
func (*RTUClient) WriteFileRecord ¶
func (*RTUClient) WriteMultipleCoils ¶
func (*RTUClient) WriteMultipleRegisters ¶
func (*RTUClient) WriteSingleCoil ¶
func (*RTUClient) WriteSingleRegister ¶
type RTUConfig ¶
type RTUConfig struct {
// 串口配置
PortName string // 串口名称,如 "/dev/ttyUSB0", "COM1"
BaudRate int // 波特率:9600, 19200, 38400, 115200 等
DataBits int // 数据位:7, 8
StopBits int // 停止位:1, 2
Parity string // 校验位:"N"(None), "E"(Even), "O"(Odd)
// Modbus 配置
SlaveID byte // 从站地址:1-247
Timeout time.Duration // 超时时间,默认 1 秒
// 高级配置
MinInterval time.Duration // 最小请求间隔,默认 10ms
// 调试选项
Debug bool // 是否启用调试日志
}
RTUConfig RTU 模式配置
func DefaultRTUConfig ¶
DefaultRTUConfig 返回默认 RTU 配置
type TCPClient ¶
type TCPClient struct {
// contains filtered or unexported fields
}
TCPClient Modbus TCP 客户端
func NewTCPClient ¶
NewTCPClient 创建 TCP 客户端
func (*TCPClient) GetCommEventCounter ¶
func (*TCPClient) ReadDiscreteInputs ¶
func (*TCPClient) ReadExceptionStatus ¶
func (*TCPClient) ReadFileRecord ¶
func (*TCPClient) ReadHoldingRegisters ¶
func (*TCPClient) ReadInputRegisters ¶
func (*TCPClient) SetSlaveID ¶
SetSlaveID 设置从站地址(Unit ID)
func (*TCPClient) SetTimeout ¶
SetTimeout 设置超时
func (*TCPClient) WriteFileRecord ¶
func (*TCPClient) WriteMultipleCoils ¶
func (*TCPClient) WriteMultipleRegisters ¶
func (*TCPClient) WriteSingleCoil ¶
func (*TCPClient) WriteSingleRegister ¶
type TCPConfig ¶
type TCPConfig struct {
// 网络配置
Host string // 主机地址,如 "192.168.1.100"
Port int // 端口,默认 502
// Modbus 配置
SlaveID byte // 从站地址(Unit ID):0-255
Timeout time.Duration // 超时时间,默认 1 秒
// 连接池配置
MaxIdleConns int // 最大空闲连接数
MaxOpenConns int // 最大打开连接数
ConnMaxLifetime time.Duration // 连接最大生命周期
// 调试选项
Debug bool // 是否启用调试日志
}
TCPConfig TCP 模式配置
func DefaultTCPConfig ¶
DefaultTCPConfig 返回默认 TCP 配置
