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 }