Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Implementation of Function Code FC23 (0x17) - Read/Write Multiple Registers #132

Open
wants to merge 125 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
2723204
feat: implement send/receive custom buffer
thr2240 Dec 6, 2023
30463e6
Merge pull request #1 from thr2240/boris/custom-buffer
biancode Dec 6, 2023
3a07ec1
chore: fix client and server ports for Unix-based architectures with …
dkoehler-dev Jan 17, 2024
c9c7923
chore: Implement placeholder commands for read/write custom function …
dkoehler-dev Jan 18, 2024
ad140d6
feat: Implement request building for custom function code
dkoehler-dev Jan 18, 2024
bc84c5e
feat: Declare custom function code module
dkoehler-dev Jan 18, 2024
e42d375
feat: Add 'write custom function code' as function code
dkoehler-dev Jan 18, 2024
6288b90
feat: Implement 'write custom function code' functionality into the m…
dkoehler-dev Jan 18, 2024
284e8d9
feat: Implement 'write custom function code' in channel handler
dkoehler-dev Jan 18, 2024
d0b381f
feat: Implement 'write custom function code' in client example
dkoehler-dev Jan 18, 2024
fc3d8b4
feat: Implement 'write custom function code' in server request handler
dkoehler-dev Jan 18, 2024
10c81d9
feat: Implement 'write custom function code' in server handler & serv…
dkoehler-dev Jan 18, 2024
a232ef3
feat: Implement 'write custom function code' in frame handler
dkoehler-dev Jan 18, 2024
d6c7a31
feat: Add CustomFC type; Implement client request for CustomFC type
dkoehler-dev Jan 19, 2024
6d6d916
feat: Implement CustomFC Display trait
dkoehler-dev Jan 19, 2024
90744c1
feat: Implement CustomFC type in client-side request
dkoehler-dev Jan 19, 2024
38b3404
fix: Implement UnitId Display trait
dkoehler-dev Jan 22, 2024
fa71af4
chore: Replace write custom FC client request parameter
dkoehler-dev Jan 22, 2024
788be9f
fix: Implement BitIterator parse_all fn
dkoehler-dev Jan 22, 2024
1934f3d
fix: Implement missing documentation for CustomFunctionCode fn
dkoehler-dev Jan 22, 2024
476e5ea
chore: Set tracing level to DEBUG
dkoehler-dev Jan 22, 2024
ea4f641
fix: Implement customFC type in server-side request
dkoehler-dev Jan 22, 2024
debeaa1
feat: Implement custom function code parser
dkoehler-dev Jan 22, 2024
9a9eaf4
feat: Implement Serialize & Loggable traits for CustomFunctionCode
dkoehler-dev Jan 22, 2024
c1d5e68
fix: Replace Vec<u16> with a fixed-size array for now, to work around…
dkoehler-dev Jan 23, 2024
d71bf86
fix: Implement missing customFC request in server-side request handling
dkoehler-dev Jan 23, 2024
5bd36f1
fix: Implement correct CustomFunctionCode value parsing
dkoehler-dev Jan 24, 2024
bff9685
fix: Implement customFC length attribute
dkoehler-dev Jan 24, 2024
8954e36
feat: Improved server and client examples for custom function code fe…
dkoehler-dev Jan 24, 2024
2719e74
chore: Improve type naming of the custom function code feature
dkoehler-dev Jan 24, 2024
be8eba7
chore: Improve server and client examples for write custom function c…
dkoehler-dev Jan 24, 2024
6438e99
chore: Set server and client port in examples >1024 for non-root linu…
dkoehler-dev Jan 25, 2024
8ae0812
fix: Authorize Write Custom Function Code Request in server handler (…
dkoehler-dev Jan 25, 2024
3504b1d
fix: Correct logged offset server PDU TX values for the Custom Functi…
dkoehler-dev Jan 25, 2024
21413af
test: Add Custom Function Code feature parsing unit test
dkoehler-dev Jan 25, 2024
570aefb
test: Add Custom Function Code parsing unit test for invalid values
dkoehler-dev Jan 25, 2024
7479461
test: Add Custom Function Code serializing unit test
dkoehler-dev Jan 25, 2024
7248688
test: Add Custom Function Code integration test
dkoehler-dev Jan 25, 2024
116c97b
refactor: Improve client example script for the Custom Function Code …
dkoehler-dev Jan 26, 2024
51cd999
test: Add integration test for the Custom Function Code feature
dkoehler-dev Jan 26, 2024
e2c80ce
fix: Resolve immutable server handler value for the Custom Function C…
dkoehler-dev Jan 26, 2024
15dd7e6
refactor(client): code cleanup
dkoehler-dev Jan 26, 2024
6e4f068
refactor(server): code cleanup
dkoehler-dev Jan 26, 2024
28d4381
refactor(parse): code cleanup
dkoehler-dev Jan 26, 2024
81f6188
docs(write_custom_function_code): Add documentation for write custom …
dkoehler-dev Jan 26, 2024
4a9ce9b
Merge pull request #3 from dkoehler-dev/development
biancode Jan 27, 2024
1926d68
chore(send_cfc): Rename CFC README.me
dkoehler-dev Jan 29, 2024
cf2a350
fix(examples): Adjust TCP & TLS port for non-root Unix users
dkoehler-dev Jan 29, 2024
fcb4beb
refactor(custom_fc): Rename WriteCustomFC to SendCustomFC
dkoehler-dev Jan 29, 2024
7054730
refactor(custom_fc): Remove SendCustomBuffer functionality (PR 2 on I…
dkoehler-dev Jan 29, 2024
699c3d4
Revert "refactor(custom_fc): Remove SendCustomBuffer functionality (P…
dkoehler-dev Jan 30, 2024
a74d50f
Revert "refactor(custom_fc): Rename WriteCustomFC to SendCustomFC"
dkoehler-dev Jan 30, 2024
07e0703
Revert "fix(examples): Adjust TCP & TLS port for non-root Unix users"
dkoehler-dev Jan 30, 2024
3a4715f
Revert "chore(send_cfc): Rename CFC README.me"
dkoehler-dev Jan 30, 2024
068b7af
refactor(send_custom_buffer): Remove Send Custom Buffer functionality
dkoehler-dev Jan 30, 2024
112face
feat(function): add FC23 to FunctionCode enum
dkoehler-dev Jan 30, 2024
ec9b803
feat(client): add FC23 feature to client example
dkoehler-dev Jan 30, 2024
684229a
feat(message): add FC23 request to client message handler
dkoehler-dev Jan 30, 2024
47ffc89
feat(mod): add FC23 to client requests mod file
dkoehler-dev Jan 30, 2024
82537ba
feat(channel): add FC23 feature to channel request
dkoehler-dev Jan 30, 2024
47d3aff
feat(read_write_multiple): add FC23 requests file
dkoehler-dev Jan 30, 2024
8a071b8
feat(serialize): add serialize trait for FC23
dkoehler-dev Jan 30, 2024
3aa288a
refactor(channel): correct FC23 channel request parameters
dkoehler-dev Jan 30, 2024
99f9e09
fix(message): resolve client message request error (iter() not defined)
dkoehler-dev Jan 30, 2024
6c5abc2
chore(serialize): Remove serialization logic for ReadWriteMultiple<Re…
dkoehler-dev Jan 30, 2024
611d872
feat(types): add ReadWriteMultipleRegistersRange type
dkoehler-dev Jan 31, 2024
c192005
refactor(message): refactor read_write_multiple imports
dkoehler-dev Jan 31, 2024
6c8ac0a
fix(read_write_multiple): fix read_write_multiple client request types
dkoehler-dev Jan 31, 2024
bc32138
fix(channel): fix channel input parameters for read_write_multiple re…
dkoehler-dev Jan 31, 2024
c52d33c
fix(serialize): resolve wrong variable call when serializing read_wri…
dkoehler-dev Jan 31, 2024
1c44640
fix(message): resolve type mismatch in ReadWriteMultipleRegisters req…
dkoehler-dev Jan 31, 2024
69a0af7
fix(read_write_multiple): Fix incorrect ReadWriteMultiple initialization
dkoehler-dev Jan 31, 2024
3cb58e5
fix(channel): fix read_write_multiple channel request parameters
dkoehler-dev Jan 31, 2024
cc76e50
fix(serial frame): Implement serial request/response lengthmode for R…
dkoehler-dev Jan 31, 2024
9d4139e
feat(request): add ReadWriteMultipleRegisters FC to server request ha…
dkoehler-dev Jan 31, 2024
049f321
fix(types): remove ReadWriteMultipleRegistersRange from types (new fn…
dkoehler-dev Jan 31, 2024
0295bca
fix(read_write_multiple): remove ReadWriteMultipleIterator implementa…
dkoehler-dev Jan 31, 2024
545a393
fix(client): fix incorrect request parameters for ReadWriteMultipleRe…
dkoehler-dev Jan 31, 2024
1bcec6f
fix(read_write_multiple): fix return type and struct access for ReadW…
dkoehler-dev Jan 31, 2024
1f61df7
fix(client): correct channel request parameters and return values for…
dkoehler-dev Jan 31, 2024
451c64f
refactor(channel): change channel Result type from Indexed<u16> to Ve…
dkoehler-dev Feb 1, 2024
020ae45
refactor(read_write_multiple): change Promise and Result type from In…
dkoehler-dev Feb 1, 2024
ab2daf0
feat(handler): add FC23 request authorization to server handler
dkoehler-dev Feb 1, 2024
0d15398
feat(server types): add ReadWriteRegisters struct to server-side type…
dkoehler-dev Feb 1, 2024
7994ed2
feat(server types): add ReadWriteRegisters type to server handler (FC23)
dkoehler-dev Feb 1, 2024
b8f21e3
feat(server types): add ReadWriteRegisters type to server-side reques…
dkoehler-dev Feb 1, 2024
b77d5dc
fix(client): fix missing ReadWriteMultiple import in client mod
dkoehler-dev Feb 2, 2024
10dd7f8
feat(examples): set TCP port to 10502 and TLS port to 10802 for non-r…
dkoehler-dev Feb 2, 2024
a6e1e5b
fix(read_write_multiple): fix invalid ReadWriteMultiple request initi…
dkoehler-dev Feb 2, 2024
5bff927
fix(message): reference the correct Iterator for the ReadWriteMultipl…
dkoehler-dev Feb 2, 2024
028bb37
fix(client example): supply correct input parameters for the ReadWrit…
dkoehler-dev Feb 2, 2024
723bd77
fix(message): add proper PDU TX formatting for the ReadWriteMultipleR…
dkoehler-dev Feb 2, 2024
c0ba984
chore(client example): expand log output decoding
dkoehler-dev Feb 2, 2024
610b779
chore(message): correct PDU TX log output for the ReadWriteMultipleRe…
dkoehler-dev Feb 2, 2024
5eaf82d
chore(server example): expand log output decoding
dkoehler-dev Feb 2, 2024
841391e
fix(server handler): authorize read_write_multiple_registers request …
dkoehler-dev Feb 2, 2024
03bb731
fix(server request): add correct parsing for the server-side ReadWrit…
dkoehler-dev Feb 2, 2024
03bda0d
refactor(server request): correct ReadWriteMultipleRequest
dkoehler-dev Feb 2, 2024
a27c66b
chore(client example): set response timeout to 15min for debugging pu…
dkoehler-dev Feb 2, 2024
f304fbe
chore(client example): adjusted FC23 example request parameters
dkoehler-dev Feb 5, 2024
95b333d
refactor(channel): change Result type of FC23 request to AddressRange
dkoehler-dev Feb 5, 2024
87f2903
refactor(server request): modify FC23 server request handler for easi…
dkoehler-dev Feb 5, 2024
483637a
refactor(read_write_multiple): change Promise type of FC23 request to…
dkoehler-dev Feb 5, 2024
25e0c6a
test(client example): adjust test parameters for FC23 request (ReadWr…
dkoehler-dev Feb 5, 2024
8ab0da9
fix(server request): fix incorrect FC23 (ReadWriteMultiple) server re…
dkoehler-dev Feb 5, 2024
93c6d8b
refactor(read_write_multiple request): remove unnecessary write respo…
dkoehler-dev Feb 6, 2024
ee93153
fix(read_write_multiple): implement correct response parsing for FC23…
dkoehler-dev Feb 6, 2024
eac7e6a
fix(channel): add correct Result type for FC23 request type
dkoehler-dev Feb 6, 2024
5fa8c8b
refactor(request): ignore write result from FC23 (ReadWriteMultiple)
dkoehler-dev Feb 6, 2024
c88fafa
test(client example): adjust example parameters for FC23 request
dkoehler-dev Feb 6, 2024
3235826
fix(client example): fix invalid input parameter `count`
dkoehler-dev Feb 7, 2024
d3f18a1
feat(server example): add a separate read_write_multiple server handl…
dkoehler-dev Feb 7, 2024
ce640f6
fix(server request): add read_write_multiple_registers server request…
dkoehler-dev Feb 7, 2024
bad8533
fix(request): fix incorrect read_write_multiple server request handle…
dkoehler-dev Feb 7, 2024
4beabe2
refactor(read_write_multiple): change InvalidRequest Result to Reques…
dkoehler-dev Feb 7, 2024
7208b18
feat(parse): implement parsing for FC23 request and add unit test for…
dkoehler-dev Feb 7, 2024
653d598
test(serialize): add FC23 (ReadWriteMultipleRegisters) unit tests for…
dkoehler-dev Feb 8, 2024
355537a
refactor(serialize): improve naming of unit tests for FC23
dkoehler-dev Feb 8, 2024
76dfc66
test(parse): add FC23 (ReadWriteMultipleRegisters) unit tests for suc…
dkoehler-dev Feb 8, 2024
50881ab
test(integration_test): add integration test for the FC23 (ReadWriteM…
dkoehler-dev Feb 9, 2024
c0337b3
chore: clean up code, improve code documentation
dkoehler-dev Feb 9, 2024
e29a69c
doc(read_write_multiple): add request documentation for FC23 (ReadWri…
dkoehler-dev Feb 9, 2024
aa3e323
test(request): add read_write_multiple request parsing unit test cases
dkoehler-dev Feb 13, 2024
b6d913f
test(read_write_multiple): fix integration test for FC23 read_write_m…
dkoehler-dev Feb 14, 2024
2b00be8
Merge pull request #5 from dkoehler-dev/feature-fc23-read-write-multi…
grewek Feb 19, 2024
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
Prev Previous commit
Next Next commit
feat: Implement 'write custom function code' in server request handler
dkoehler-dev committed Jan 18, 2024
commit fc3d8b487fbc9e62e9d91577149a7b99370cf088
5 changes: 5 additions & 0 deletions rodbus/src/server/handler.rs
Original file line number Diff line number Diff line change
@@ -67,6 +67,11 @@ pub trait RequestHandler: Send + 'static {
fn write_multiple_registers(&mut self, _values: WriteRegisters) -> Result<(), ExceptionCode> {
Err(ExceptionCode::IllegalFunction)
}

/// Write a custom function code
fn write_custom_function_code(&mut self, _value: Indexed<u16>) -> Result<(), ExceptionCode> {
Err(ExceptionCode::IllegalFunction)
}
}

/// Trait useful for converting None into IllegalDataAddress
16 changes: 16 additions & 0 deletions rodbus/src/server/request.rs
Original file line number Diff line number Diff line change
@@ -22,6 +22,7 @@ pub(crate) enum Request<'a> {
WriteSingleRegister(Indexed<u16>),
WriteMultipleCoils(WriteCoils<'a>),
WriteMultipleRegisters(WriteRegisters<'a>),
WriteCustomFunctionCode(Indexed<u16>),
}

/// All requests that support broadcast
@@ -66,6 +67,7 @@ impl<'a> Request<'a> {
Request::WriteSingleRegister(_) => FunctionCode::WriteSingleRegister,
Request::WriteMultipleCoils(_) => FunctionCode::WriteMultipleCoils,
Request::WriteMultipleRegisters(_) => FunctionCode::WriteMultipleRegisters,
Request::WriteCustomFunctionCode(_) => FunctionCode::WriteCustomFunctionCode,
}
}

@@ -80,6 +82,7 @@ impl<'a> Request<'a> {
Request::WriteSingleRegister(x) => Some(BroadcastRequest::WriteSingleRegister(x)),
Request::WriteMultipleCoils(x) => Some(BroadcastRequest::WriteMultipleCoils(x)),
Request::WriteMultipleRegisters(x) => Some(BroadcastRequest::WriteMultipleRegisters(x)),
Request::WriteCustomFunctionCode(_) => None,
}
}

@@ -148,6 +151,10 @@ impl<'a> Request<'a> {
.map(|_| items.range);
write_result(function, header, writer, result, level)
}
Request::WriteCustomFunctionCode(request) => {
let result = handler.write_custom_function_code(*request).map(|_| *request);
write_result(function, header, writer, result, level)
}
}
}

@@ -213,6 +220,12 @@ impl<'a> Request<'a> {
RegisterIterator::parse_all(range, cursor)?,
)))
}
FunctionCode::WriteCustomFunctionCode => {
let x =
Request::WriteCustomFunctionCode(Indexed::<u16>::parse(cursor)?);
cursor.expect_empty()?;
Ok(x)
}
}
}
}
@@ -269,6 +282,9 @@ impl std::fmt::Display for RequestDisplay<'_, '_> {
RegisterIteratorDisplay::new(self.level, items.iterator)
)?;
}
Request::WriteCustomFunctionCode(request) => {
write!(f, " {request}")?;
}
}
}