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