11package com .hivemq .edge .adapters .s7 ;
22
33import com .github .xingshuangs .iot .protocol .s7 .enums .EPlcType ;
4- import com .github .xingshuangs .iot .protocol .s7 .service .MultiAddressRead ;
54import com .github .xingshuangs .iot .protocol .s7 .service .S7PLC ;
6- import com .github .xingshuangs .iot .protocol .s7 .utils .AddressUtil ;
75import com .hivemq .adapter .sdk .api .data .DataPoint ;
86import com .hivemq .adapter .sdk .api .factories .DataPointFactory ;
97import com .hivemq .edge .adapters .s7 .config .S7AdapterConfig ;
1715import java .util .stream .Collectors ;
1816import java .util .stream .IntStream ;
1917
20- import static com .hivemq .edge .adapters .s7 .config .S7Versions .S7_1200 ;
21- import static com .hivemq .edge .adapters .s7 .config .S7Versions .S7_1500 ;
22- import static com .hivemq .edge .adapters .s7 .config .S7Versions .S7_300 ;
23- import static com .hivemq .edge .adapters .s7 .config .S7Versions .S7_400 ;
24-
2518public class S7Client {
2619
2720 private static final Logger log = LoggerFactory .getLogger (S7Client .class );
@@ -40,29 +33,29 @@ public List<DataPoint> read(final @NotNull S7DataType type, final @NotNull List<
4033 log .trace ("Reading data from addresses {} with type {}" , addresses , type );
4134 }
4235 switch (type ) {
43- case BOOL : return combine (dataPointFactory , addresses , s7PLC .readBoolean (addresses ));
36+ case BOOL : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readBoolean (addresses ));
4437 case BYTE : return addresses .stream ().map (address -> dataPointFactory
4538 .create (address , s7PLC .readByte (address )))
4639 .collect (Collectors .toList ());
47- case WORD : return combine (dataPointFactory , addresses , s7PLC . readInt16 (addresses ));
48- case DWORD : return combine (dataPointFactory , addresses , s7PLC . readInt32 (addresses ));
49- case LWORD : return combine (dataPointFactory , addresses , s7PLC . readInt64 (addresses ));
40+ case WORD : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , readBytes (addresses , 2 ));
41+ case DWORD : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , readBytes (addresses , 4 ));
42+ case LWORD : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , readBytes (addresses , 8 ));
5043 case USINT : return addresses .stream ().map (address -> dataPointFactory
5144 .create (address , Byte .toUnsignedInt (s7PLC .readByte (address ))))
5245 .collect (Collectors .toList ());
53- case UINT : return combine (dataPointFactory , addresses , s7PLC .readUInt16 (addresses ));
54- case UDINT : return combine (dataPointFactory , addresses , s7PLC .readUInt32 (addresses ));
46+ case UINT : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readUInt16 (addresses ));
47+ case UDINT : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readUInt32 (addresses ));
5548 case ULINT : return addresses .stream ()
5649 .map (address -> dataPointFactory .create (address , new BigInteger (Long .toUnsignedString (s7PLC .readInt64 (address )))))
5750 .collect (Collectors .toList ());
5851 case SINT : return addresses .stream ().map (address -> dataPointFactory
5952 .create (address , ((Byte )s7PLC .readByte (address )).shortValue ()))
6053 .collect (Collectors .toList ());
61- case INT : return combine (dataPointFactory , addresses , s7PLC .readInt16 (addresses ));
62- case DINT : return combine (dataPointFactory , addresses , s7PLC .readInt32 (addresses ));
63- case LINT : return combine (dataPointFactory , addresses , s7PLC .readInt64 (addresses ));
64- case REAL : return combine (dataPointFactory , addresses , s7PLC .readFloat32 (addresses ));
65- case LREAL : return combine (dataPointFactory , addresses , s7PLC .readFloat64 (addresses ));
54+ case INT : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readInt16 (addresses ));
55+ case DINT : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readInt32 (addresses ));
56+ case LINT : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readInt64 (addresses ));
57+ case REAL : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readFloat32 (addresses ));
58+ case LREAL : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readFloat64 (addresses ));
6659 case CHAR : return addresses .stream ().map (address -> dataPointFactory
6760 .create (address , s7PLC .readByte (address )))
6861 .collect (Collectors .toList ());
@@ -74,11 +67,11 @@ public List<DataPoint> read(final @NotNull S7DataType type, final @NotNull List<
7467 })
7568 .collect (Collectors .toList ());
7669 case STRING :
77- case WSTRING : return combine (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readString ).collect (Collectors .toList ()));
78- case TIME : return combine (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readTime ).collect (Collectors .toList ()));
79- case LTIME : return combine (dataPointFactory , addresses , s7PLC .readInt64 (addresses ));
80- case DATE : return combine (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readDate ).collect (Collectors .toList ()));
81- case TOD : return combine (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readTimeOfDay ).collect (Collectors .toList ()));
70+ case WSTRING : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readString ).collect (Collectors .toList ()));
71+ case TIME : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readTime ).collect (Collectors .toList ()));
72+ case LTIME : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readInt64 (addresses ));
73+ case DATE : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readDate ).collect (Collectors .toList ()));
74+ case TOD : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readTimeOfDay ).collect (Collectors .toList ()));
8275 case LTOD : return addresses .stream ()
8376 .map (address -> dataPointFactory .create (address , new BigInteger (Long .toUnsignedString (s7PLC .readInt64 (address )))))
8477 .collect (Collectors .toList ());
@@ -88,16 +81,19 @@ public List<DataPoint> read(final @NotNull S7DataType type, final @NotNull List<
8881 case LDT :return addresses .stream ()
8982 .map (address -> dataPointFactory .create (address , new BigInteger (Long .toUnsignedString (s7PLC .readInt64 (address )))))
9083 .collect (Collectors .toList ());
91- case DTL : return combine (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readDTL ).collect (Collectors .toList ()));
92- case ARRAY : throw new IllegalArgumentException ("Arrays not supported" );
84+ case DTL : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , addresses .stream ().map (s7PLC ::readDTL ).collect (Collectors .toList ()));
9385 default : {
9486 log .error ("Unspported tag-type {} at address {}" , type , addresses );
9587 throw new IllegalArgumentException ("Unspported tag-type " + type + " at address " + addresses );
9688 }
9789 }
9890 }
99-
100- public static List <DataPoint > combine (final @ NotNull DataPointFactory dataPointFactory , final @ NotNull List <String > addresses , final @ NotNull List <?> values ) {
91+
92+ public List <byte []> readBytes (final List <String > addresses , final int count ) {
93+ return addresses .stream ().map (address -> s7PLC .readByte (address , count )).collect (Collectors .toList ());
94+ }
95+
96+ public static List <DataPoint > createDatapointsFromAddressesAndValues (final @ NotNull DataPointFactory dataPointFactory , final @ NotNull List <String > addresses , final @ NotNull List <?> values ) {
10197 return IntStream
10298 .range (0 , addresses .size ())
10399 .mapToObj (i -> dataPointFactory .create (addresses .get (i ), values .get (i )))
0 commit comments