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);
}
}
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;
}
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;
}
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);
}
}
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;
}
Aggregations