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 
----------------------------------------- 

Reply via email to