use of org.apache.plc4x.java.api.messages.PlcWriteResponse in project plc4x by apache.
the class CANOpenProtocolLogic method write.
public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
CompletableFuture<PlcWriteResponse> response = new CompletableFuture<>();
if (writeRequest.getFieldNames().size() != 1) {
response.completeExceptionally(new IllegalArgumentException("You can write only one field at the time"));
return response;
}
PlcField field = writeRequest.getFields().get(0);
if (!(field instanceof CANOpenField)) {
response.completeExceptionally(new IllegalArgumentException("Only CANOpenField instances are supported"));
return response;
}
if (field instanceof CANOpenSDOField) {
writeInternally((DefaultPlcWriteRequest) writeRequest, (CANOpenSDOField) field, response);
return response;
}
if (field instanceof CANOpenPDOField) {
writeInternally((DefaultPlcWriteRequest) writeRequest, (CANOpenPDOField) field, response);
return response;
}
response.completeExceptionally(new IllegalArgumentException("Only CANOpenSDOField instances are supported"));
return response;
}
use of org.apache.plc4x.java.api.messages.PlcWriteResponse in project plc4x by apache.
the class OpcuaPlcDriverTest method writeVariables.
@Test
public void writeVariables() throws Exception {
PlcConnection opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
Condition<PlcConnection> is_connected = new Condition<>(PlcConnection::isConnected, "is connected");
assertThat(opcuaConnection).is(is_connected);
PlcWriteRequest.Builder builder = opcuaConnection.writeRequestBuilder();
builder.addItem("Bool", BOOL_IDENTIFIER_READ_WRITE, true);
builder.addItem("Byte", BYTE_IDENTIFIER_READ_WRITE + ";BYTE", (short) 3);
builder.addItem("Double", DOUBLE_IDENTIFIER_READ_WRITE, 0.5d);
builder.addItem("Float", FLOAT_IDENTIFIER_READ_WRITE, 0.5f);
// builder.addItem("Int16", INT16_IDENTIFIER_READ_WRITE + "", (short) 1);
builder.addItem("Int32", INT32_IDENTIFIER_READ_WRITE, 42);
builder.addItem("Int64", INT64_IDENTIFIER_READ_WRITE, 42L);
builder.addItem("Integer", INTEGER_IDENTIFIER_READ_WRITE, 42);
builder.addItem("SByte", SBYTE_IDENTIFIER_READ_WRITE + ";SINT", -127);
builder.addItem("String", STRING_IDENTIFIER_READ_WRITE, "Helllo Toddy!");
builder.addItem("UInt16", UINT16_IDENTIFIER_READ_WRITE + ";UINT", 65535);
builder.addItem("UInt32", UINT32_IDENTIFIER_READ_WRITE + ";UDINT", 101010101L);
builder.addItem("UInt64", UINT64_IDENTIFIER_READ_WRITE + ";ULINT", new BigInteger("1337"));
builder.addItem("UInteger", UINTEGER_IDENTIFIER_READ_WRITE + ";UDINT", 102020202L);
builder.addItem("BooleanArray", BOOL_ARRAY_IDENTIFIER, new Boolean[] { true, true, true, true, true });
builder.addItem("ByteArray", BYTE_ARRAY_IDENTIFIER + ";BYTE", new Short[] { 1, 100, 100, 255, 123 });
builder.addItem("DoubleArray", DOUBLE_ARRAY_IDENTIFIER, new Double[] { 1.0, 2.0, 3.0, 4.0, 5.0 });
builder.addItem("FloatArray", FLOAT_ARRAY_IDENTIFIER, new Float[] { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F });
builder.addItem("Int16Array", INT16_ARRAY_IDENTIFIER, new Short[] { 1, 2, 3, 4, 5 });
builder.addItem("Int32Array", INT32_ARRAY_IDENTIFIER, new Integer[] { 1, 2, 3, 4, 5 });
builder.addItem("Int64Array", INT64_ARRAY_IDENTIFIER, new Long[] { 1L, 2L, 3L, 4L, 5L });
builder.addItem("IntegerArray", INT32_ARRAY_IDENTIFIER, new Integer[] { 1, 2, 3, 4, 5 });
builder.addItem("SByteArray", SBYTE_ARRAY_IDENTIFIER, new Byte[] { 1, 2, 3, 4, 5 });
builder.addItem("StringArray", STRING_ARRAY_IDENTIFIER, new String[] { "1", "2", "3", "4", "5" });
builder.addItem("UInt16Array", UINT16_ARRAY_IDENTIFIER + ";UINT", new Short[] { 1, 2, 3, 4, 5 });
builder.addItem("UInt32Array", UINT32_ARRAY_IDENTIFIER + ";UDINT", new Integer[] { 1, 2, 3, 4, 5 });
builder.addItem("UInt64Array", UINT64_ARRAY_IDENTIFIER + ";ULINT", new Long[] { 1L, 2L, 3L, 4L, 5L });
builder.addItem("DoesNotExists", DOES_NOT_EXIST_IDENTIFIER_READ_WRITE, "11");
PlcWriteRequest request = builder.build();
PlcWriteResponse response = request.execute().get();
assertThat(response.getResponseCode("Bool")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Byte")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Double")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Float")).isEqualTo(PlcResponseCode.OK);
// assertThat(response.getResponseCode("Int16")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Int32")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Int64")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Integer")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("SByte")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("String")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInt16")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInt32")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInt64")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInteger")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("BooleanArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("ByteArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("DoubleArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("FloatArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Int16Array")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Int32Array")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("Int64Array")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("IntegerArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("SByteArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("StringArray")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInt16Array")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInt32Array")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("UInt64Array")).isEqualTo(PlcResponseCode.OK);
assertThat(response.getResponseCode("DoesNotExists")).isEqualTo(PlcResponseCode.NOT_FOUND);
opcuaConnection.close();
assert !opcuaConnection.isConnected();
}
use of org.apache.plc4x.java.api.messages.PlcWriteResponse in project plc4x by apache.
the class Plc4xWriteClient method main.
public static void main(String[] args) throws Exception {
try (final PlcConnection connection = new PlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
final PlcWriteRequest.Builder requestBuilder = connection.writeRequestBuilder();
requestBuilder.addItem("test-BOOL", "STDOUT/foo:BOOL", true);
requestBuilder.addItem("test-BYTE", "STDOUT/foo:BYTE", new boolean[] { true, true, false, true, false, true, false, true });
requestBuilder.addItem("test-WORD", "STDOUT/foo:WORD", new boolean[] { true, true, false, true, false, true, false, true, false, false, false, false, true, true, true, true });
requestBuilder.addItem("test-DWORD", "STDOUT/foo:DWORD", new boolean[] { true, true, false, true, false, true, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false });
requestBuilder.addItem("test-USINT", "STDOUT/foo:USINT", 12);
requestBuilder.addItem("test-UINT", "STDOUT/foo:UINT", 12345);
requestBuilder.addItem("test-UDINT", "STDOUT/foo:UDINT", 1234567890);
requestBuilder.addItem("test-ULINT", "STDOUT/foo:ULINT", new BigInteger("12345678901234567"));
requestBuilder.addItem("test-SINT", "STDOUT/foo:SINT", -12);
requestBuilder.addItem("test-INT", "STDOUT/foo:INT", -12345);
requestBuilder.addItem("test-DINT", "STDOUT/foo:DINT", -1234567890);
requestBuilder.addItem("test-LINT", "STDOUT/foo:LINT", new BigInteger("-12345678901234567"));
requestBuilder.addItem("test-REAL", "STDOUT/foo:REAL", 3.14159f);
requestBuilder.addItem("test-LREAL", "STDOUT/foo:LREAL", 2.71828182845904523536028747135d);
requestBuilder.addItem("test-CHAR", "STDOUT/foo:CHAR", "P");
requestBuilder.addItem("test-WCHAR", "STDOUT/foo:WCHAR", "Ϡ");
final PlcWriteRequest writeRequest = requestBuilder.build();
final PlcWriteResponse writeResponse = writeRequest.execute().get();
System.out.println(writeResponse);
}
}
use of org.apache.plc4x.java.api.messages.PlcWriteResponse in project plc4x by apache.
the class Plc4xSinkProcessor method onTrigger.
@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
FlowFile flowFile = session.get();
// Abort if there's nothing to do.
if (flowFile == null) {
return;
}
// Get an instance of a component able to write to a PLC.
try (PlcConnection connection = getDriverManager().getConnection(getConnectionString())) {
if (!connection.getMetadata().canWrite()) {
throw new ProcessException("Writing not supported by connection");
}
// Prepare the request.
PlcWriteRequest.Builder builder = connection.writeRequestBuilder();
flowFile.getAttributes().forEach((field, value) -> {
String address = getAddress(field);
if (address != null) {
// TODO: Convert the String into the right type ...
builder.addItem(field, address, Boolean.valueOf(value));
}
});
PlcWriteRequest writeRequest = builder.build();
// Send the request to the PLC.
try {
final PlcWriteResponse plcWriteResponse = writeRequest.execute().get();
// TODO: Evaluate the response and create flow files for successful and unsuccessful updates
session.transfer(flowFile, SUCCESS);
} catch (Exception e) {
flowFile = session.putAttribute(flowFile, "exception", e.getLocalizedMessage());
session.transfer(flowFile, FAILURE);
}
} catch (ProcessException e) {
throw e;
} catch (Exception e) {
throw new ProcessException("Got an error while trying to get a connection", e);
}
}
use of org.apache.plc4x.java.api.messages.PlcWriteResponse in project plc4x by apache.
the class PlcConnectionAdapterTest method checkWrite.
private <T> void checkWrite(MockConnection connection, PlcWriteRequest request, T value) throws InterruptedException, ExecutionException {
// this is really a tests of our mock tooling but knowing it's behaving as expected
// will help identify problems in the adapter/supplier/consumer
PlcField plcField = request.getFields().get(0);
connection.setPlcValue(plcField, new PlcLong(0L));
CompletableFuture<PlcWriteResponse> cf = connection.write(request);
assertThat(cf.isDone(), is(true));
PlcWriteResponse response = cf.get();
assertThat(response, notNullValue());
// TODO: fixme
/*
Object writtenData = connection.getDataValue(request.getRequestItems().get(0).getField());
if (writtenData.getClass().isArray()) {
writtenData = Array.get(writtenData, 0);
}
if (List.class.isAssignableFrom(writtenData.getClass())) {
@SuppressWarnings("unchecked")
List<Object> writtenDataList = (List<Object>) writtenData;
writtenData = writtenDataList.get(0);
}
assertThat(value, equalTo(writtenData));*/
}
Aggregations