@Override public Collection<String> getFieldNames() { return request.getFieldNames(); }
@Override public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) { if(!(readRequest instanceof InternalPlcReadRequest)) { throw new IllegalArgumentException("Read request doesn't implement InternalPlcReadRequest"); } InternalPlcReadRequest request = (InternalPlcReadRequest) readRequest; Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> fields = new HashMap<>(); for (String fieldName : request.getFieldNames()) { TestField field = (TestField) request.getField(fieldName); Optional<BaseDefaultFieldItem> fieldItemOptional = device.get(field); ImmutablePair<PlcResponseCode, BaseDefaultFieldItem> fieldPair; boolean present = fieldItemOptional.isPresent(); fieldPair = present ? new ImmutablePair<>(PlcResponseCode.OK, fieldItemOptional.get()) : new ImmutablePair<>(PlcResponseCode.NOT_FOUND, null); fields.put(fieldName, fieldPair); } PlcReadResponse response = new DefaultPlcReadResponse(request, fields); return CompletableFuture.completedFuture(response); }
@Override public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) { InternalPlcReadRequest request = checkInternal(readRequest, InternalPlcReadRequest.class); Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> fields = new HashMap<>(); for (String fieldName : request.getFieldNames()) { TestField field = (TestField) request.getField(fieldName); Optional<BaseDefaultFieldItem> fieldItemOptional = device.get(field); ImmutablePair<PlcResponseCode, BaseDefaultFieldItem> fieldPair; boolean present = fieldItemOptional.isPresent(); fieldPair = present ? new ImmutablePair<>(PlcResponseCode.OK, fieldItemOptional.get()) : new ImmutablePair<>(PlcResponseCode.NOT_FOUND, null); fields.put(fieldName, fieldPair); } PlcReadResponse response = new DefaultPlcReadResponse(request, fields); return CompletableFuture.completedFuture(response); }
Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> values = new HashMap<>(); for (String fieldName : request.getFieldNames()) { MessageRouterResponse cipResponse = MessageRouterResponse.decode(data); short value;
private void encodeReadRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) { if (!supportsCipEncapsulation) { LOGGER.warn("CIP Encapsulation not supported by remote, payload encapsulation must be handled by target and originator"); } InternalPlcReadRequest request = (InternalPlcReadRequest) msg.getRequest(); for (String fieldName : request.getFieldNames()) { PlcField field = request.getField(fieldName); // CIP Part EtherNetIpField enipField = (EtherNetIpField) field; EPath.PaddedEPath path = new EPath.PaddedEPath(new LogicalSegment.ClassId(enipField.getObjectNumber()), new LogicalSegment.InstanceId(enipField.getInstanceNumber()), new LogicalSegment.AttributeId(enipField.getAttributeNumber())); GetAttributeSingleService service = new GetAttributeSingleService(path); // ENIP Part EnipPacket packet = new EnipPacket(CommandCode.SendRRData, sessionHandle, EnipStatus.EIP_SUCCESS, messageId.getAndIncrement(), new SendRRData(new CpfPacket( new NullAddressItem(), new UnconnectedDataItemRequest(service::encodeRequest) ))); requestsMap.put(packet.getSenderContext(), msg); out.add(packet); } }
List<VarPayloadItem> payloadItems = payload.getItems(); int index = 0; for (String fieldName : plcReadRequest.getFieldNames()) { S7Field field = (S7Field) plcReadRequest.getField(fieldName); VarPayloadItem payloadItem = payloadItems.get(index);