Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
30 changes: 30 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
9 changes: 9 additions & 0 deletions modbus.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@ const (
FuncCodeReadWriteMultipleRegisters = 23
FuncCodeMaskWriteRegister = 22
FuncCodeReadFIFOQueue = 24

// byte access
FuncCodeReadDeviceId = 43
FuncCodeUser = 100
)

const (
MEITypeCANopen = 13
MEITypeDeviceId = 14
)

const (
Expand Down
2 changes: 2 additions & 0 deletions rtuclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,8 @@ func calculateResponseLength(adu []byte) int {
length += 6
case FuncCodeReadFIFOQueue:
// undetermined
case FuncCodeReadDeviceId:
length += 3
default:
}
return length
Expand Down