Search in sources :

Example 1 with PlcWriteResponse

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;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) CANOpenPDOField(org.apache.plc4x.java.canopen.field.CANOpenPDOField) CANOpenField(org.apache.plc4x.java.canopen.field.CANOpenField) CANOpenSDOField(org.apache.plc4x.java.canopen.field.CANOpenSDOField) PlcField(org.apache.plc4x.java.api.model.PlcField) PlcWriteResponse(org.apache.plc4x.java.api.messages.PlcWriteResponse) DefaultPlcWriteResponse(org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse)

Example 2 with PlcWriteResponse

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();
}
Also used : Condition(org.assertj.core.api.Condition) PlcWriteRequest(org.apache.plc4x.java.api.messages.PlcWriteRequest) BigInteger(java.math.BigInteger) PlcWriteResponse(org.apache.plc4x.java.api.messages.PlcWriteResponse) PlcDriverManager(org.apache.plc4x.java.PlcDriverManager) PlcConnection(org.apache.plc4x.java.api.PlcConnection)

Example 3 with PlcWriteResponse

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);
    }
}
Also used : PlcWriteRequest(org.apache.plc4x.java.api.messages.PlcWriteRequest) BigInteger(java.math.BigInteger) PlcWriteResponse(org.apache.plc4x.java.api.messages.PlcWriteResponse) PlcDriverManager(org.apache.plc4x.java.PlcDriverManager) PlcConnection(org.apache.plc4x.java.api.PlcConnection)

Example 4 with PlcWriteResponse

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);
    }
}
Also used : FlowFile(org.apache.nifi.flowfile.FlowFile) ProcessException(org.apache.nifi.processor.exception.ProcessException) PlcWriteRequest(org.apache.plc4x.java.api.messages.PlcWriteRequest) PlcWriteResponse(org.apache.plc4x.java.api.messages.PlcWriteResponse) PlcConnection(org.apache.plc4x.java.api.PlcConnection) ProcessException(org.apache.nifi.processor.exception.ProcessException)

Example 5 with PlcWriteResponse

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));*/
}
Also used : PlcField(org.apache.plc4x.java.api.model.PlcField) PlcWriteResponse(org.apache.plc4x.java.api.messages.PlcWriteResponse)

Aggregations

PlcWriteResponse (org.apache.plc4x.java.api.messages.PlcWriteResponse)10 PlcWriteRequest (org.apache.plc4x.java.api.messages.PlcWriteRequest)7 PlcConnection (org.apache.plc4x.java.api.PlcConnection)6 PlcDriverManager (org.apache.plc4x.java.PlcDriverManager)4 BigInteger (java.math.BigInteger)3 PlcReadRequest (org.apache.plc4x.java.api.messages.PlcReadRequest)3 PlcReadResponse (org.apache.plc4x.java.api.messages.PlcReadResponse)3 PlcField (org.apache.plc4x.java.api.model.PlcField)3 PlcResponseCode (org.apache.plc4x.java.api.types.PlcResponseCode)3 PlcValue (org.apache.plc4x.java.api.value.PlcValue)3 DefaultPlcWriteResponse (org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse)3 CompletableFuture (java.util.concurrent.CompletableFuture)2 ByteBuf (io.netty.buffer.ByteBuf)1 Unpooled (io.netty.buffer.Unpooled)1 ByteBuffer (java.nio.ByteBuffer)1 Duration (java.time.Duration)1 java.util (java.util)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1