Search in sources :

Example 1 with ModelNode

use of com.beanit.iec61850bean.ModelNode in project OpenMUC by isc-konstanz.

the class Iec61850Connection method setChannelHandleWithFcModelNode.

private void setChannelHandleWithFcModelNode(ChannelRecordContainer container) {
    if (container.getChannelHandle() == null) {
        String[] args = container.getChannelAddress().split(":", 3);
        if (args.length != 2) {
            logger.debug("Wrong channel address syntax: {}", container.getChannelAddress());
            container.setRecord(new Record(Flag.DRIVER_ERROR_CHANNEL_WITH_THIS_ADDRESS_NOT_FOUND));
            return;
        }
        ModelNode modelNode = serverModel.findModelNode(args[0], Fc.fromString(args[1]));
        if (modelNode == null) {
            logger.debug("No Basic Data Attribute for the channel address {} was found in the server model.", container.getChannelAddress());
            container.setRecord(new Record(Flag.DRIVER_ERROR_CHANNEL_WITH_THIS_ADDRESS_NOT_FOUND));
            return;
        }
        FcModelNode fcModelNode;
        try {
            fcModelNode = (FcModelNode) modelNode;
        } catch (ClassCastException e) {
            logger.debug("ModelNode with object reference {} was found in the server model but is not a Basic Data Attribute.", container.getChannelAddress());
            container.setRecord(new Record(Flag.DRIVER_ERROR_CHANNEL_WITH_THIS_ADDRESS_NOT_FOUND));
            return;
        }
        container.setChannelHandle(fcModelNode);
    }
}
Also used : FcModelNode(com.beanit.iec61850bean.FcModelNode) Record(org.openmuc.framework.data.Record) BdaVisibleString(com.beanit.iec61850bean.BdaVisibleString) BdaBitString(com.beanit.iec61850bean.BdaBitString) BdaUnicodeString(com.beanit.iec61850bean.BdaUnicodeString) BdaOctetString(com.beanit.iec61850bean.BdaOctetString) FcModelNode(com.beanit.iec61850bean.FcModelNode) ModelNode(com.beanit.iec61850bean.ModelNode)

Example 2 with ModelNode

use of com.beanit.iec61850bean.ModelNode in project OpenMUC by isc-konstanz.

the class Iec61850Connection method setRecordContainerWithSamplingGroup.

private Object setRecordContainerWithSamplingGroup(List<ChannelRecordContainer> containers, Object containerListHandle, String samplingGroup) throws ConnectionException {
    FcModelNode fcModelNode;
    if (containerListHandle != null) {
        fcModelNode = (FcModelNode) containerListHandle;
    } else {
        String[] args = samplingGroup.split(":", 3);
        if (args.length != 2) {
            logger.debug("Wrong sampling group syntax: {}", samplingGroup);
            for (ChannelRecordContainer container : containers) {
                container.setRecord(new Record(Flag.DRIVER_ERROR_SAMPLING_GROUP_NOT_FOUND));
            }
            return null;
        }
        ModelNode modelNode = serverModel.findModelNode(args[0], Fc.fromString(args[1]));
        if (modelNode == null) {
            logger.debug("Error reading sampling group: no FCDO/DA or DataSet with object reference {} was not found in the server model.", samplingGroup);
            for (ChannelRecordContainer container : containers) {
                container.setRecord(new Record(Flag.DRIVER_ERROR_SAMPLING_GROUP_NOT_FOUND));
            }
            return null;
        }
        try {
            fcModelNode = (FcModelNode) modelNode;
        } catch (ClassCastException e) {
            logger.debug("Error reading channel: ModelNode with sampling group reference {} was found in the server model but is not a FcModelNode.", samplingGroup);
            for (ChannelRecordContainer container : containers) {
                container.setRecord(new Record(Flag.DRIVER_ERROR_SAMPLING_GROUP_NOT_FOUND));
            }
            return null;
        }
    }
    try {
        clientAssociation.getDataValues(fcModelNode);
    } catch (ServiceError e) {
        logger.debug("Error reading sampling group: service error calling getDataValues on {}: {}", samplingGroup, e);
        for (ChannelRecordContainer container : containers) {
            container.setRecord(new Record(Flag.DRIVER_ERROR_SAMPLING_GROUP_NOT_ACCESSIBLE));
        }
        return fcModelNode;
    } catch (IOException e) {
        throw new ConnectionException(e);
    }
    long receiveTime = System.currentTimeMillis();
    for (ChannelRecordContainer container : containers) {
        if (container.getChannelHandle() != null) {
            setRecord(container, (BasicDataAttribute) container.getChannelHandle(), receiveTime);
        } else {
            container.setRecord(new Record(Flag.DRIVER_ERROR_CHANNEL_NOT_PART_OF_SAMPLING_GROUP));
        }
    }
    return fcModelNode;
}
Also used : ServiceError(com.beanit.iec61850bean.ServiceError) ChannelRecordContainer(org.openmuc.framework.driver.spi.ChannelRecordContainer) FcModelNode(com.beanit.iec61850bean.FcModelNode) Record(org.openmuc.framework.data.Record) BdaVisibleString(com.beanit.iec61850bean.BdaVisibleString) BdaBitString(com.beanit.iec61850bean.BdaBitString) BdaUnicodeString(com.beanit.iec61850bean.BdaUnicodeString) BdaOctetString(com.beanit.iec61850bean.BdaOctetString) IOException(java.io.IOException) FcModelNode(com.beanit.iec61850bean.FcModelNode) ModelNode(com.beanit.iec61850bean.ModelNode) ConnectionException(org.openmuc.framework.driver.spi.ConnectionException)

Example 3 with ModelNode

use of com.beanit.iec61850bean.ModelNode in project OpenMUC by isc-konstanz.

the class Iec61850Connection method checkParent.

boolean checkParent(ModelNode modelNode, List<FcModelNode> fcNodesToBeRequested, List<FcModelNode> remainingModelNodes, ServerModel serverModel) {
    if (!(modelNode instanceof FcModelNode)) {
        return false;
    }
    FcModelNode fcModelNode = (FcModelNode) modelNode;
    ModelNode parentNode = serverModel;
    for (int i = 0; i < fcModelNode.getReference().size() - 1; i++) {
        parentNode = parentNode.getChild(fcModelNode.getReference().get(i), fcModelNode.getFc());
    }
    List<BasicDataAttribute> basicDataAttributes = parentNode.getBasicDataAttributes();
    for (BasicDataAttribute bda : basicDataAttributes) {
        if (!remainingModelNodes.contains(bda)) {
            return false;
        }
    }
    if (!checkParent(parentNode, fcNodesToBeRequested, remainingModelNodes, serverModel)) {
        for (BasicDataAttribute bda : basicDataAttributes) {
            remainingModelNodes.remove(bda);
        }
        fcNodesToBeRequested.add((FcModelNode) parentNode);
    }
    return true;
}
Also used : FcModelNode(com.beanit.iec61850bean.FcModelNode) BasicDataAttribute(com.beanit.iec61850bean.BasicDataAttribute) FcModelNode(com.beanit.iec61850bean.FcModelNode) ModelNode(com.beanit.iec61850bean.ModelNode)

Example 4 with ModelNode

use of com.beanit.iec61850bean.ModelNode in project OpenMUC by isc-konstanz.

the class Iec61850ConnectionTest method getDataRecursive.

private static void getDataRecursive(ModelNode modelNode, ClientAssociation clientAssociation) throws ServiceError, IOException {
    if (modelNode.getChildren() == null) {
        return;
    }
    for (ModelNode childNode : modelNode) {
        FcModelNode fcChildNode = (FcModelNode) childNode;
        if (fcChildNode.getFc() != Fc.CO) {
            System.out.println("calling GetDataValues(" + childNode.getReference() + ")");
            clientAssociation.getDataValues(fcChildNode);
        }
        // clientAssociation.setDataValues(fcChildNode);
        getDataRecursive(childNode, clientAssociation);
    }
}
Also used : FcModelNode(com.beanit.iec61850bean.FcModelNode) FcModelNode(com.beanit.iec61850bean.FcModelNode) ModelNode(com.beanit.iec61850bean.ModelNode)

Example 5 with ModelNode

use of com.beanit.iec61850bean.ModelNode in project OpenMUC by isc-konstanz.

the class Iec61850Connection method write.

@Override
public Object write(List<ChannelValueContainer> containers, Object containerListHandle) throws UnsupportedOperationException, ConnectionException {
    List<FcModelNode> modelNodesToBeWritten = new ArrayList<>(containers.size());
    for (ChannelValueContainer container : containers) {
        if (container.getChannelHandle() != null) {
            modelNodesToBeWritten.add((FcModelNode) container.getChannelHandle());
            setFcModelNode(container, (FcModelNode) container.getChannelHandle());
        } else {
            String[] args = container.getChannelAddress().split(":", 3);
            if (args.length != 2) {
                logger.debug("Wrong channel address syntax: {}", container.getChannelAddress());
                container.setFlag(Flag.DRIVER_ERROR_CHANNEL_WITH_THIS_ADDRESS_NOT_FOUND);
                continue;
            }
            ModelNode modelNode = serverModel.findModelNode(args[0], Fc.fromString(args[1]));
            if (modelNode == null) {
                logger.debug("No Basic Data Attribute for the channel address {} was found in the server model.", container.getChannelAddress());
                container.setFlag(Flag.DRIVER_ERROR_CHANNEL_WITH_THIS_ADDRESS_NOT_FOUND);
                continue;
            }
            FcModelNode fcModelNode;
            try {
                fcModelNode = (FcModelNode) modelNode;
            } catch (ClassCastException e) {
                logger.debug("ModelNode with object reference {} was found in the server model but is not a Basic Data Attribute.", container.getChannelAddress());
                container.setFlag(Flag.DRIVER_ERROR_CHANNEL_WITH_THIS_ADDRESS_NOT_FOUND);
                continue;
            }
            container.setChannelHandle(fcModelNode);
            modelNodesToBeWritten.add(fcModelNode);
            setFcModelNode(container, fcModelNode);
        }
    }
    // TODO
    // first check all datasets if the are some that contain only requested channels
    // then check all remaining model nodes
    List<FcModelNode> fcNodesToBeRequested = new ArrayList<>();
    while (modelNodesToBeWritten.size() > 0) {
        fillRequestedNodes(fcNodesToBeRequested, modelNodesToBeWritten, serverModel);
    }
    for (FcModelNode fcModelNode : fcNodesToBeRequested) {
        try {
            if (fcModelNode.getFc().toString().equals("CO")) {
                logger.info("writing CO model node");
                fcModelNode = (FcModelNode) fcModelNode.getParent().getParent();
                clientAssociation.operate(fcModelNode);
            } else {
                clientAssociation.setDataValues(fcModelNode);
            }
        } catch (ServiceError e) {
            logger.error("Error writing to channel: service error calling setDataValues on {}: {}", fcModelNode.getReference(), e);
            for (BasicDataAttribute bda : fcModelNode.getBasicDataAttributes()) {
                for (ChannelValueContainer valueContainer : containers) {
                    if (valueContainer.getChannelHandle() == bda) {
                        valueContainer.setFlag(Flag.DRIVER_ERROR_CHANNEL_NOT_ACCESSIBLE);
                    }
                }
            }
            return null;
        } catch (IOException e) {
            throw new ConnectionException(e);
        }
        for (BasicDataAttribute bda : fcModelNode.getBasicDataAttributes()) {
            for (ChannelValueContainer valueContainer : containers) {
                if (valueContainer.getChannelHandle() == bda) {
                    valueContainer.setFlag(Flag.VALID);
                }
            }
        }
    }
    return null;
}
Also used : ServiceError(com.beanit.iec61850bean.ServiceError) ArrayList(java.util.ArrayList) FcModelNode(com.beanit.iec61850bean.FcModelNode) BdaVisibleString(com.beanit.iec61850bean.BdaVisibleString) BdaBitString(com.beanit.iec61850bean.BdaBitString) BdaUnicodeString(com.beanit.iec61850bean.BdaUnicodeString) BdaOctetString(com.beanit.iec61850bean.BdaOctetString) BasicDataAttribute(com.beanit.iec61850bean.BasicDataAttribute) IOException(java.io.IOException) FcModelNode(com.beanit.iec61850bean.FcModelNode) ModelNode(com.beanit.iec61850bean.ModelNode) ConnectionException(org.openmuc.framework.driver.spi.ConnectionException) ChannelValueContainer(org.openmuc.framework.driver.spi.ChannelValueContainer)

Aggregations

FcModelNode (com.beanit.iec61850bean.FcModelNode)5 ModelNode (com.beanit.iec61850bean.ModelNode)5 BdaBitString (com.beanit.iec61850bean.BdaBitString)3 BdaOctetString (com.beanit.iec61850bean.BdaOctetString)3 BdaUnicodeString (com.beanit.iec61850bean.BdaUnicodeString)3 BdaVisibleString (com.beanit.iec61850bean.BdaVisibleString)3 BasicDataAttribute (com.beanit.iec61850bean.BasicDataAttribute)2 ServiceError (com.beanit.iec61850bean.ServiceError)2 IOException (java.io.IOException)2 Record (org.openmuc.framework.data.Record)2 ConnectionException (org.openmuc.framework.driver.spi.ConnectionException)2 ArrayList (java.util.ArrayList)1 ChannelRecordContainer (org.openmuc.framework.driver.spi.ChannelRecordContainer)1 ChannelValueContainer (org.openmuc.framework.driver.spi.ChannelValueContainer)1