| Gliffy Diagram |
|---|
| name | Api Change - Chris Copy |
|---|
| pagePin | 510 |
|---|
|
General
- I ensured all of our classes have the "Plc" prefix, as I did encounter situations in which very generic type names had collisions and I had to use the fully qualified class name (including the package name). The "Plc" prefix reduces this risk.
- This model is now simplified as it currently doesn't support reading of multi-values. There are multiple options to add Multi-Values, but I haven't decided on which option I like best:
- Rename PlcRequest/ResponseItem to PlcSingleValueRequest/ResponseItem and add a Multi-Value counterpart, wich handles the multi-value.
- Add a PlcMultiValueRequest/ResponseItem, which simply references multiple PlcRequest/ResponseItem objects and provides a "get(index)" method.
- Add a getNumValues() (Not insisting on this name) method and give each of the accessors an "index" property (eventually additionally a no-args version which defaults to index 0) (I think I prefer this one but didn't want to blow up the class-diagram too much).
...
Here comes some example code to demonstrate how a Programm using this API could look like.
| Code Block |
|---|
|
public static void main(String[] args) throws Exception {
PlcDriverManager manager = new PlcDriverManager();
try (PlcConnection conn = manager.getConnection("s7://192.168.167.211/0/0")) {
Optional<PlcReader> optionalReader = conn.getReader();
if (!optionalReader.isPresent()) {
return;
}
PlcReader Reader = optionalReader.get();
PlcReadRequest request = new PlcReadRequest(
new PlcReadRequestItem("parameterX", conn.prepareQuery("%DB8.DBX3:INT")),
new PlcReadRequestItem("parameterY", conn.prepareQuery("%DB9.DBW4:DOUBLE")),
new PlcReadRequestItem("others", conn.prepareQuery("%DB2.DBW2:BYTE[10]")));
CompletableFuture<PlcReadResponse> future = reader.read(request);
PlcReadResponse response = future.get();
// Access an item by it's name.
System.out.println("Parameter X: " + response.getInteger("parameterX"));
// Iterate over all items
for(PlcReadResponseItem item: response.getItems()) {
// Conditionally handle an item by it's name.
if("parameterY".equals(item.getName()) {
// If using getInteger without an index, the index 0 is used.
System.out.println("Parameter y: " + item.getDouble());
}
}
else if("others".equals(item.getName()) {
System.out.println("Others:");
// Handle multi-value items.
for(int i = 0; i < item.getNumValues(); i++) {
// Intentionally using short instead of byte
// In this case it will return Byte[i] but convert that into a Short.
System.out.println(" - " + item.getShort(i));
}
}
}
}
}
}
}
} |