diff --git a/api.go b/api.go index fe06ab0..6c77dd1 100644 --- a/api.go +++ b/api.go @@ -46,4 +46,9 @@ type Client interface { //ReadFIFOQueue reads the contents of a First-In-First-Out (FIFO) queue // of register in a remote device and returns FIFO value register. ReadFIFOQueue(address uint16) (results []byte, err error) + + // ReadDeviceId reads the device id contents of the remote device. + ReadDeviceId(deviceid byte, objectid byte) (results []byte, err error) + // UserFunction makes a user defined request of the remote device. + UserFunction(usersubfunc byte, data []byte) (results []byte, err error) } diff --git a/client.go b/client.go index ac3ee2e..dd46730 100644 --- a/client.go +++ b/client.go @@ -432,6 +432,36 @@ func (mb *client) ReadFIFOQueue(address uint16) (results []byte, err error) { return } +func (mb *client) ReadDeviceId(deviceid byte, objectid byte) (results []byte, err error) { + request := ProtocolDataUnit{ + FunctionCode: FuncCodeReadDeviceId, + Data: []byte{MEITypeDeviceId, deviceid, objectid}, + } + response, err := mb.send(&request) + if err != nil { + return + } + if len(response.Data) < 7 { + err = fmt.Errorf("modbus: response data size '%v' is less than minimum '%v'", len(response.Data), 7) + return + } + results = response.Data[2:] + return +} + +func (mb *client) UserFunction(usersubfunc byte, data []byte) (results []byte, err error) { + request := ProtocolDataUnit{ + FunctionCode: FuncCodeUser, + Data: append([]byte{usersubfunc}, data...), + } + response, err := mb.send(&request) + if err != nil { + return + } + results = response.Data[4:] + return +} + // Helpers // send sends request and checks possible exception in the response. diff --git a/modbus.go b/modbus.go index 869473c..7e7cf29 100644 --- a/modbus.go +++ b/modbus.go @@ -26,6 +26,15 @@ const ( FuncCodeReadWriteMultipleRegisters = 23 FuncCodeMaskWriteRegister = 22 FuncCodeReadFIFOQueue = 24 + + // byte access + FuncCodeReadDeviceId = 43 + FuncCodeUser = 100 +) + +const ( + MEITypeCANopen = 13 + MEITypeDeviceId = 14 ) const ( diff --git a/rtuclient.go b/rtuclient.go index ce55bd8..998bd1d 100644 --- a/rtuclient.go +++ b/rtuclient.go @@ -202,6 +202,8 @@ func calculateResponseLength(adu []byte) int { length += 6 case FuncCodeReadFIFOQueue: // undetermined + case FuncCodeReadDeviceId: + length += 3 default: } return length