Hi, I started doing some basic tests with the S7 protocol using a Siemens S7-300, and the latest 0.7.0 release. The tests consist of reading and writing several DB variables. I was able to read different datatypes, for instance:
builder.addItem("mivariable-1", "%DB20:DBX05.0:BOOL"); builder.addItem("mivariable-4", "%DB20:DBW06:INT"); However, when I try to write the same memory addresses I only manage to write BOOL values, for example builderWriter.addItem("mivariable-1", "%DB20:DBX6.7:BOOL", true); //WORKS OK builderWriter.addItem("mivariable-4", "%DB20:DBW06.0:INT", (short)2); // FAILS builderWriter.addItem("mivariable-2", "%DB20:DBB06:BYTE", (byte)0); // FAILS I am unable to write any datatype different than BOOL. I am facing the following Error message: Exception in thread "main" org.apache.plc4x.java.api.exceptions.PlcRuntimeException: Error initializing field class PlcInteger at org.apache.plc4x.java.s7.readwrite.field.S7PlcFieldHandler.internalEncodeInteger(S7PlcFieldHandler.java:394) at org.apache.plc4x.java.s7.readwrite.field.S7PlcFieldHandler.encodeShort(S7PlcFieldHandler.java:86) at org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest$Builder.lambda$build$0(DefaultPlcWriteRequest.java:270) at java.base/java.util.TreeMap.forEach(TreeMap.java:1002) at org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest$Builder.build(DefaultPlcWriteRequest.java:265) at net.zylk.plc4x.test.protocols.WriteS7.main(WriteS7.java:102) Caused by: java.lang.NoSuchMethodException: org.apache.plc4x.java.api.value.PlcInteger.<init>([Ljava.lang.Short;) at java.base/java.lang.Class.getConstructor0(Class.java:3349) at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553) at org.apache.plc4x.java.s7.readwrite.field.S7PlcFieldHandler.internalEncodeInteger(S7PlcFieldHandler.java:392) ... 5 more Maybe I am misunderstanding the sintax and how the values should be written? --- To try to offer some more information about this error: Digging into that class (S7PlcFieldHandler) I saw that there are some fields that are initialized based on the value of the datatype case INT: minValue = BigInteger.valueOf(Short.MIN_VALUE); maxValue = BigInteger.valueOf(Short.MAX_VALUE); fieldType = PlcInteger.class; valueType = Short[].class; castedValues = new Short[values.length]; break; Then, the line that throws the Exception seems to be trying to inferr a PlcInteger class constructor based on the datatype // Create the field item. try { return fieldType.getDeclaredConstructor(valueType).newInstance(castedValues); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw new PlcRuntimeException("Error initializing field class " + fieldType.getSimpleName(), e); } However there appears to be a "mismatch" between the valueType (Short[]) and the constructor (Short) in the PlcInteger class, which leads me to think i am missing something on the write value sintax? Thank you in advance, any help will be welcome. Iñigo ----- the test class code: public class WriteS7 { private static final Logger _log = LoggerFactory.getLogger(WriteS7.class); public static void main(String[] args) throws PlcConnectionException { String connectionString = "s7://10.105.143.1:102?remote-rack=0&remote-slot=0&controller-type=S7_300"; _log.info(String.format("Establishing connection to %s", connectionString));; try (PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionString)) { _log.info("Conecting... " + connectionString); if (!plcConnection.getMetadata().canWrite()) { _log.error(String.format("Connection %s doesn't support writing.", connectionString)); return; } PlcWriteRequest.Builder builderWriter = null; builderWriter = plcConnection.writeRequestBuilder(); // builderWriter.addItem("mivariable-26", "%DB20:DBX6.7:BOOL", false); //OK builderWriter.addItem("mivariable-2", "%DB20:DBB06:BYTE", (byte)0); //FAILS // builderWriter.addItem("mivariable-4", "%DB20:DBW06.0:INT", (short)2); //FAILS PlcWriteRequest writeRequest = builderWriter.build(); PlcWriteResponse writeResponse = writeRequest.execute().get(); GeneralFunctions.printPlc4XWriteReponse(writeResponse); //print response } } } ----------------------------------------- Iñigo Angulo ZYLK.net :: consultoría.openSource Ribera de Axpe, 11 Edificio A, modulo 201-203 48950 Erandio (Bizkaia) +34 944272119 -----------------------------------------