1
1
package com .hivemq .edge .adapters .s7 ;
2
2
3
3
import com .github .xingshuangs .iot .protocol .s7 .enums .EPlcType ;
4
- import com .github .xingshuangs .iot .protocol .s7 .service .MultiAddressRead ;
5
4
import com .github .xingshuangs .iot .protocol .s7 .service .S7PLC ;
6
- import com .github .xingshuangs .iot .protocol .s7 .utils .AddressUtil ;
7
5
import com .hivemq .adapter .sdk .api .data .DataPoint ;
8
6
import com .hivemq .adapter .sdk .api .factories .DataPointFactory ;
9
7
import com .hivemq .edge .adapters .s7 .config .S7AdapterConfig ;
17
15
import java .util .stream .Collectors ;
18
16
import java .util .stream .IntStream ;
19
17
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
-
25
18
public class S7Client {
26
19
27
20
private static final Logger log = LoggerFactory .getLogger (S7Client .class );
@@ -40,29 +33,29 @@ public List<DataPoint> read(final @NotNull S7DataType type, final @NotNull List<
40
33
log .trace ("Reading data from addresses {} with type {}" , addresses , type );
41
34
}
42
35
switch (type ) {
43
- case BOOL : return combine (dataPointFactory , addresses , s7PLC .readBoolean (addresses ));
36
+ case BOOL : return createDatapointsFromAddressesAndValues (dataPointFactory , addresses , s7PLC .readBoolean (addresses ));
44
37
case BYTE : return addresses .stream ().map (address -> dataPointFactory
45
38
.create (address , s7PLC .readByte (address )))
46
39
.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 ));
50
43
case USINT : return addresses .stream ().map (address -> dataPointFactory
51
44
.create (address , Byte .toUnsignedInt (s7PLC .readByte (address ))))
52
45
.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 ));
55
48
case ULINT : return addresses .stream ()
56
49
.map (address -> dataPointFactory .create (address , new BigInteger (Long .toUnsignedString (s7PLC .readInt64 (address )))))
57
50
.collect (Collectors .toList ());
58
51
case SINT : return addresses .stream ().map (address -> dataPointFactory
59
52
.create (address , ((Byte )s7PLC .readByte (address )).shortValue ()))
60
53
.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 ));
66
59
case CHAR : return addresses .stream ().map (address -> dataPointFactory
67
60
.create (address , s7PLC .readByte (address )))
68
61
.collect (Collectors .toList ());
@@ -74,11 +67,11 @@ public List<DataPoint> read(final @NotNull S7DataType type, final @NotNull List<
74
67
})
75
68
.collect (Collectors .toList ());
76
69
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 ()));
82
75
case LTOD : return addresses .stream ()
83
76
.map (address -> dataPointFactory .create (address , new BigInteger (Long .toUnsignedString (s7PLC .readInt64 (address )))))
84
77
.collect (Collectors .toList ());
@@ -88,16 +81,19 @@ public List<DataPoint> read(final @NotNull S7DataType type, final @NotNull List<
88
81
case LDT :return addresses .stream ()
89
82
.map (address -> dataPointFactory .create (address , new BigInteger (Long .toUnsignedString (s7PLC .readInt64 (address )))))
90
83
.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 ()));
93
85
default : {
94
86
log .error ("Unspported tag-type {} at address {}" , type , addresses );
95
87
throw new IllegalArgumentException ("Unspported tag-type " + type + " at address " + addresses );
96
88
}
97
89
}
98
90
}
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 ) {
101
97
return IntStream
102
98
.range (0 , addresses .size ())
103
99
.mapToObj (i -> dataPointFactory .create (addresses .get (i ), values .get (i )))
0 commit comments