github.com/simpleiot/simpleiot@v0.18.3/modbus/modbus.go (about)

     1  package modbus
     2  
     3  import "fmt"
     4  
     5  // FunctionCode represents a modbus function code
     6  type FunctionCode byte
     7  
     8  // Defined valid function codes
     9  const (
    10  	// Bit access
    11  	FuncCodeReadDiscreteInputs FunctionCode = 2
    12  	FuncCodeReadCoils          FunctionCode = 1
    13  	FuncCodeWriteSingleCoil    FunctionCode = 5
    14  	FuncCodeWriteMultipleCoils FunctionCode = 15
    15  
    16  	// 16-bit access
    17  	FuncCodeReadInputRegisters         FunctionCode = 4
    18  	FuncCodeReadHoldingRegisters       FunctionCode = 3
    19  	FuncCodeWriteSingleRegister        FunctionCode = 6
    20  	FuncCodeWriteMultipleRegisters     FunctionCode = 16
    21  	FuncCodeReadWriteMultipleRegisters FunctionCode = 23
    22  	FuncCodeMaskWriteRegister          FunctionCode = 22
    23  	FuncCodeReadFIFOQueue              FunctionCode = 24
    24  )
    25  
    26  // ExceptionCode represents a modbus exception code
    27  type ExceptionCode byte
    28  
    29  // Defined valid exception codes
    30  const (
    31  	ExcIllegalFunction              ExceptionCode = 1
    32  	ExcIllegalAddress               ExceptionCode = 2
    33  	ExcIllegalValue                 ExceptionCode = 3
    34  	ExcServerDeviceFailure          ExceptionCode = 4
    35  	ExcAcknowledge                  ExceptionCode = 5
    36  	ExcServerDeviceBusy             ExceptionCode = 6
    37  	ExcMemoryParityError            ExceptionCode = 8
    38  	ExcGatewayPathUnavilable        ExceptionCode = 0x0a
    39  	ExcGatewayTargetFailedToRespond ExceptionCode = 0x0b
    40  )
    41  
    42  // define valid values for write coil
    43  const (
    44  	WriteCoilValueOn  uint16 = 0xff00
    45  	WriteCoilValueOff uint16 = 0
    46  )
    47  
    48  // minRequestLen is the minimum number of PDU bytes for a request with
    49  // the given function code (not including slave address or checksum,
    50  // which are part of the ADU).
    51  var minRequestLen = map[FunctionCode]int{
    52  	FuncCodeReadDiscreteInputs:         5,
    53  	FuncCodeReadCoils:                  5,
    54  	FuncCodeWriteSingleCoil:            5,
    55  	FuncCodeWriteMultipleCoils:         7,
    56  	FuncCodeReadInputRegisters:         5,
    57  	FuncCodeReadHoldingRegisters:       5,
    58  	FuncCodeWriteSingleRegister:        5,
    59  	FuncCodeWriteMultipleRegisters:     8,
    60  	FuncCodeReadWriteMultipleRegisters: 12,
    61  	FuncCodeMaskWriteRegister:          7,
    62  	FuncCodeReadFIFOQueue:              3,
    63  }
    64  
    65  func (e ExceptionCode) Error() string {
    66  	switch e {
    67  	case 1:
    68  		return "ILLEGAL FUNCTION"
    69  	case 2:
    70  		return "ILLEGAL DATA ADDRESS"
    71  	case 3:
    72  		return "ILLEGAL DATA VALUE"
    73  	case 4:
    74  		return "SERVER DEVICE FAILURE"
    75  	case 5:
    76  		return "ACKNOWLEDGE"
    77  	case 6:
    78  		return "SERVER DEVICE BUSY"
    79  	case 8:
    80  		return "MEMORY PARITY ERROR"
    81  	case 0x0a:
    82  		return "GATEWAY PATH UNAVAILABLE"
    83  	case 0x0B:
    84  		return "GATEWAY TARGET DEVICE FAILED TO RESPOND"
    85  	}
    86  	return fmt.Sprintf("unknown exception code %x", int(e))
    87  }