Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Gliffy Diagram
nameApi Change - Chris Copy
pagePin510

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
languagejava
    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));
					}
				}
			}
                }
            }
        }
    }
}