This is an automated email from the ASF dual-hosted git repository.
cgarcia pushed a commit to branch feature/merlot
in repository https://gitbox.apache.org/repos/asf/plc4x-extras.git
The following commit(s) were added to refs/heads/feature/merlot by this push:
new 2b4cc65 Adds driver status quality support to DBRecords. Adds support
for S7 counters.
2b4cc65 is described below
commit 2b4cc65796657f79e04ab6b4b3a1c16d419f6974
Author: César García <[email protected]>
AuthorDate: Mon Oct 28 08:49:46 2024 -0400
Adds driver status quality support to DBRecords. Adds support for S7
counters.
---
.../merlot/org.apache.plc4x.merlot.das.api/pom.xml | 5 +
.../java/org/apache/plc4x/merlot/api/PlcItem.java | 7 +
.../apache/plc4x/merlot/api/PlcItemListener.java | 4 +
.../plc4x/merlot/api/command/DemoCommand004.java | 17 +-
.../plc4x/merlot/api/impl/PlcDeviceImpl.java | 7 +-
.../apache/plc4x/merlot/api/impl/PlcGroupImpl.java | 33 +
.../apache/plc4x/merlot/api/impl/PlcItemImpl.java | 22 +-
.../merlot/org.apache.plc4x.merlot.db/pom.xml | 6 -
.../org/apache/plc4x/merlot/db/api/DBRecord.java | 41 +-
.../plc4x/merlot/db/core/DBBooleanFactory.java | 8 +-
.../plc4x/merlot/db/impl/DBCollectorImpl.java | 738 ---------------------
.../apache/plc4x/merlot/db/impl/DBControlImpl.java | 106 ---
.../resources/OSGI-INF/blueprint/db-service.xml | 4 +-
.../merlot/org.apache.plc4x.merlot.drv.s7/pom.xml | 5 +
.../merlot/drv/s7/core/DBS7CounterFactory.java} | 128 ++--
.../OSGI-INF/blueprint/s7-drv-service.xml | 13 +-
16 files changed, 212 insertions(+), 932 deletions(-)
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
index 1c087f8..5042c9d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/pom.xml
@@ -208,5 +208,10 @@
<artifactId>sqlite-jdbc</artifactId>
<version>3.46.1.0</version>
</dependency>
+ <dependency>
+ <groupId>org.epics</groupId>
+ <artifactId>epics-pvdata</artifactId>
+ <version>${epics.pvdata.version}</version>
+ </dependency>
</dependencies>
</project>
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
index 89a8c2b..c37edfb 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
@@ -29,6 +29,8 @@ import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.api.types.PlcValueType;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.merlot.api.impl.PlcDeviceWriteEvent;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
public interface PlcItem {
@@ -224,4 +226,9 @@ public interface PlcItem {
*/
public void itemWrite(final ByteBuf byteBuf, int byteOffset, byte
bitOffset);
+ /*
+ *
+ */
+ public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus,
String alrmMsg);
+
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
index 909c8eb..caeffc1 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItemListener.java
@@ -19,6 +19,8 @@
package org.apache.plc4x.merlot.api;
import io.netty.buffer.ByteBuf;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
public interface PlcItemListener {
@@ -29,4 +31,6 @@ public interface PlcItemListener {
void update();
+ public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus,
String alrmMsg);
+
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
index 31d9e11..e90a0eb 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand004.java
@@ -122,7 +122,22 @@ public class DemoCommand004 implements Action {
optPlcItem.get().enable();
System.out.println(optPlcItem.get().getItemUid().toString()+ " : " +
optPlcItem.get().getItemName());
}
- }
+ }
+
+ for (int i= 1; i < 10; i++) {
+ Optional<PlcItem> optPlcItem =
plcGeneralFunction.createItem(UUID.randomUUID().toString(),
+ optPlcGroup.get().getGroupUid().toString(),
+ optPlcDevice.get().getUid().toString(),
+ "S7COUNTERS_" + i,
+ "Item description _" + i,
+ "%C0:COUNTER[20]",
+ "true");
+ if (optPlcItem.isPresent()){
+ optPlcItem.get().enable();
+
System.out.println(optPlcItem.get().getItemUid().toString()+ " : " +
optPlcItem.get().getItemName());
+ }
+ }
+
}
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
index b92e4d3..07fd60b 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
@@ -57,6 +57,8 @@ import org.apache.plc4x.merlot.api.PlcTagFunction;
import org.apache.plc4x.merlot.scheduler.api.Job;
import org.apache.plc4x.merlot.scheduler.api.JobContext;
import org.apache.plc4x.merlot.scheduler.api.Scheduler;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
@@ -183,17 +185,20 @@ public class PlcDeviceImpl implements PlcDevice {
try {
final PlcReadResponse syncResponse =
readRequest.execute().get();
event.getPlcGroup().getGroupItems().forEach((u,i) -> {
+
final PlcValue plcValue =
syncResponse.getPlcValue(i.getItemName());
if (null == plcValue) {
LOGGER.debug("Item[{}] = {} ",
i.getItemName(),"Null value");
+ i.setStaus(AlarmSeverity.MAJOR,
AlarmStatus.DEVICE, "The DEVICE don't return value.");
} else {
LOGGER.debug("Item[{}] Read ",
i.getItemName());
i.setPlcValue(plcValue);
}
+
});
} catch (Exception ex) {
- LOGGER.error("Read ringbuffer: " +
ex.getMessage());
+ LOGGER.error("Read ringbuffer: " +
ex.getMessage());
}
watch.stop();
LOGGER.debug("Elapse time Group[{}] time:
{}",event.getPlcGroup().getGroupName(), watch.getTime());
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
index 5dec6e1..e2e3199 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
@@ -36,6 +36,8 @@ import org.osgi.framework.BundleContext;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcGroup;
import org.apache.plc4x.merlot.api.core.PlcItemClientService;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
import org.osgi.framework.ServiceReference;
import org.slf4j.LoggerFactory;
@@ -53,6 +55,7 @@ public class PlcGroupImpl implements PlcGroup, Job {
private boolean enable = false;
private boolean isFirtsRun = true;
+ private boolean updateItemStatus = false;
private long groupTransmit = 0;
private long groupReceives = 0;
@@ -258,27 +261,57 @@ public class PlcGroupImpl implements PlcGroup, Job {
Optional<PlcTag> refPlcTag =
refPlcConnection.get().parseTagAddress(i.getItemId());
if (refPlcTag.isPresent()) {
i.setItemPlcTag(refPlcTag.get());
+ i.setStaus(AlarmSeverity.NONE,
AlarmStatus.NONE, "");
} else {
i.disable();
+ i.setStaus(AlarmSeverity.MAJOR,
AlarmStatus.CONF, "Tag incorrect.");
}
});
isFirtsRun = false;
+ updateItemStatus = true;
}
//executeReadAllItems();
+ if (!isFirtsRun && !updateItemStatus) {
+ groupItems.forEach((u,i) -> {
+ if (i.isEnable())
+ i.setStaus(AlarmSeverity.NONE,
AlarmStatus.NONE, "");
+ });
+ updateItemStatus = true;
+ };
long sequenceId = readRingBuffer.next();
final PlcDeviceReadEvent readEvent =
readRingBuffer.get(sequenceId);
readEvent.setPlcGroup(this);
readRingBuffer.publish(sequenceId);
} else {
LOGGER.info("The driver is disconnected.");
+ if (updateItemStatus) {
+ groupItems.forEach((u,i) -> {
+ if (i.isEnable())
+ i.setStaus(AlarmSeverity.MAJOR,
AlarmStatus.DRIVER, "Driver is disconnected.");
+ });
+ updateItemStatus = false;
+ };
}
} else {
LOGGER.info("Unassigned or null PlcConnection connection.");
+ if (updateItemStatus) {
+ groupItems.forEach((u,i) -> {
+ i.setStaus(AlarmSeverity.MAJOR, AlarmStatus.DRIVER,
"Driver don't exist.");
+ });
+ updateItemStatus = false;
+ };
}
} else {
LOGGER.info("The group {}:{} is disable.",
((String) groupProperties.get(PlcGroup.GROUP_NAME)),
((String) groupProperties.get(PlcGroup.GROUP_UID)));
+ if (updateItemStatus) {
+ groupItems.forEach((u,i) -> {
+ if (i.isEnable())
+ i.setStaus(AlarmSeverity.MAJOR, AlarmStatus.CONF,
"Group ["+ groupProperties.get(PlcGroup.GROUP_NAME)+"] is disable.");
+ });
+ updateItemStatus = false;
+ }
}
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
index bff0b88..46e09fa 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
@@ -31,10 +31,13 @@ import java.util.concurrent.locks.ReentrantLock;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
import org.apache.plc4x.java.api.model.PlcTag;
import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.types.PlcValueType;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.java.spi.values.PlcList;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,6 +82,10 @@ public class PlcItemImpl implements PlcItem {
private Date lastWriteDate;
private Date lastErrorDate;
+ private AlarmSeverity alrmSeverity;
+ private AlarmStatus alrmStatus;
+ private String alrmMsg;
+
private RingBuffer<PlcDeviceWriteEvent> writeRingBuffer = null;
@@ -355,12 +362,24 @@ public class PlcItemImpl implements PlcItem {
writeEvent.setBitOffset(bitOffset);
writeRingBuffer.publish(sequenceId);
}
+
+ @Override
+ public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus,
String alrmMsg) {
+ this.alrmSeverity = alrmSeverity;
+ this.alrmStatus = alrmStatus;
+ this.alrmMsg = alrmMsg;
+ itemClients.forEach(c -> c.setStaus(alrmSeverity, alrmStatus,
alrmMsg));
+ }
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder(100);
sb.append("Name: ").append(itemName).append("\r\n").
append("Description: ").append(itemDescription).append("\r\n").
+ append("Alarm Severity:
").append(alrmSeverity.toString()).append("\r\n").
+ append("Alarm Status:
").append(alrmStatus.toString()).append("\r\n").
+ append("Alarm Message: ").append(alrmMsg).append("\r\n").
append("Id: ").append(itemId).append("\r\n").
append("UID: ").append(itemUid).append("\r\n").
append("Is enable: ").append(itemEnable).append("\r\n").
@@ -377,7 +396,8 @@ public class PlcItemImpl implements PlcItem {
append(ByteBufUtil.prettyHexDump(itemBuffer)).append("\r\n");
return sb.toString();
}
-
+
+
public static class PlcItemBuilder {
private final String itemName;
private UUID itemUid;
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
index d6ff50f..553d2bf 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/pom.xml
@@ -125,12 +125,6 @@
<artifactId>org.osgi.core</artifactId>
<version>6.0.0</version>
</dependency>
- <dependency>
- <groupId>org.apache.plc4x.merlot.das.base</groupId>
- <artifactId>org.apache.plc4x.merlot.das.base</artifactId>
- <version>0.13.0-SNAPSHOT</version>
- <type>jar</type>
- </dependency>
<dependency>
<groupId>org.apache.plc4x.merlot.api</groupId>
<artifactId>org.apache.plc4x.merlot.api</artifactId>
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
index b4e2fa5..61e510a 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
@@ -25,11 +25,16 @@ import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
+import org.epics.pvdata.pv.PVInt;
+import org.epics.pvdata.pv.PVString;
import org.epics.pvdata.pv.PVStructure;
import org.epics.pvdatabase.PVRecord;
-
-public class DBRecord extends PVRecord {
+@SuppressWarnings("nls")
+public class DBRecord extends PVRecord implements PlcItemListener {
protected static final String MONITOR_FIELDS = "field(write_value,"+
"id,"+
"offset,"+
@@ -102,8 +107,34 @@ public class DBRecord extends PVRecord {
bitOffset = (byte) Integer.parseInt(matcher.group(BIT_OFFSET ));
}
}
-
-
-
+
+
+ @Override
+ public void atach(PlcItem plcItem) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void detach() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void update() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setStaus(AlarmSeverity alrmSeverity, AlarmStatus alrmStatus,
String alrmMsg) {
+ PVStructure structAlarm = getPVStructure().getStructureField("alarm");
+ PVInt pvSeverity = (PVInt) structAlarm.getIntField("severity");
+ PVInt pvStatus = (PVInt) structAlarm.getIntField("status");
+ PVString pvMsg = (PVString) structAlarm.getStringField("message");
+
+ pvSeverity.put(alrmSeverity.ordinal());
+ pvStatus.put(alrmStatus.ordinal());
+ pvMsg.put(alrmMsg);
+ }
+
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
index 8db87f6..993f87d 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
@@ -28,9 +28,13 @@ import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
import org.epics.nt.NTScalarBuilder;
import org.epics.pvdata.factory.FieldFactory;
+import org.epics.pvdata.property.AlarmSeverity;
+import org.epics.pvdata.property.AlarmStatus;
import org.epics.pvdata.pv.FieldCreate;
import org.epics.pvdata.pv.PVBoolean;
import org.epics.pvdata.pv.PVBooleanArray;
+import org.epics.pvdata.pv.PVInt;
+import org.epics.pvdata.pv.PVString;
import org.epics.pvdata.pv.PVStructure;
import org.epics.pvdata.pv.ScalarType;
@@ -87,7 +91,7 @@ public class DBBooleanFactory extends DBBaseFactory {
return dbRecord;
}
- class DBBooleanRecord extends DBRecord implements PlcItemListener {
+ class DBBooleanRecord extends DBRecord {
private PVBoolean value;
private PVBoolean write_value;
@@ -125,7 +129,7 @@ public class DBBooleanFactory extends DBBaseFactory {
//offset = this.getPVStructure().getIntField("offset").get() *
Byte.BYTES;
getOffset(
this.getPVStructure().getStringField("offset").get());
innerBuffer = plcItem.getItemByteBuf().slice(byteOffset,
Byte.BYTES);
- innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
+ innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
} catch (Exception ex) {
LOGGER.error(this.getClass().getName() + " : " +
ex.getMessage());
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBCollectorImpl.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBCollectorImpl.java
deleted file mode 100644
index d24fa33..0000000
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBCollectorImpl.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.merlot.db.impl;
-
-import org.apache.plc4x.merlot.api.DriverEvent;
-import org.apache.plc4x.merlot.api.core.Merlot;
-import org.apache.plc4x.merlot.das.base.api.BaseDriver;
-import org.apache.plc4x.merlot.db.api.DBCollector;
-import org.apache.plc4x.merlot.scheduler.api.JobContext;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.epics.pvdata.copy.CreateRequest;
-import org.epics.pvdata.copy.PVCopy;
-import org.epics.pvdata.copy.PVCopyFactory;
-import org.epics.pvdata.property.PVTimeStamp;
-import org.epics.pvdata.property.PVTimeStampFactory;
-import org.epics.pvdata.property.TimeStamp;
-import org.epics.pvdata.property.TimeStampFactory;
-import org.epics.pvdata.pv.BooleanArrayData;
-import org.epics.pvdata.pv.ByteArrayData;
-import org.epics.pvdata.pv.DoubleArrayData;
-import org.epics.pvdata.pv.FloatArrayData;
-import org.epics.pvdata.pv.IntArrayData;
-import org.epics.pvdata.pv.LongArrayData;
-import org.epics.pvdata.pv.PVBoolean;
-import org.epics.pvdata.pv.PVBooleanArray;
-import org.epics.pvdata.pv.PVByte;
-import org.epics.pvdata.pv.PVByteArray;
-import org.epics.pvdata.pv.PVDouble;
-import org.epics.pvdata.pv.PVDoubleArray;
-import org.epics.pvdata.pv.PVField;
-import org.epics.pvdata.pv.PVFloat;
-import org.epics.pvdata.pv.PVFloatArray;
-import org.epics.pvdata.pv.PVInt;
-import org.epics.pvdata.pv.PVIntArray;
-import org.epics.pvdata.pv.PVLong;
-import org.epics.pvdata.pv.PVLongArray;
-import org.epics.pvdata.pv.PVScalar;
-import org.epics.pvdata.pv.PVScalarArray;
-import org.epics.pvdata.pv.PVShort;
-import org.epics.pvdata.pv.PVShortArray;
-import org.epics.pvdata.pv.PVString;
-import org.epics.pvdata.pv.PVStringArray;
-import org.epics.pvdata.pv.PVStructure;
-import org.epics.pvdata.pv.PVUByte;
-import org.epics.pvdata.pv.PVUInt;
-import org.epics.pvdata.pv.PVULong;
-import org.epics.pvdata.pv.PVUShort;
-import org.epics.pvdata.pv.ShortArrayData;
-import org.epics.pvdata.pv.StringArrayData;
-import org.epics.pvdata.util.pvDataHelper.GetHelper;
-import org.epics.pvdatabase.PVListener;
-import org.epics.pvdatabase.PVRecord;
-import org.epics.pvdatabase.PVRecordField;
-import org.epics.pvdatabase.PVRecordStructure;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.device.Driver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-//TODO: add the logger system, the write is INFO, the read maybe DEBUG
-//TODO: Read/Write information for every tag for statical use.
-public class DBCollectorImpl implements DBCollector, PVListener {
-
- private static final Logger LOGGER =
LoggerFactory.getLogger(DBCollectorImpl.class);
-
- private final BundleContext bundleContext;
- private final String device;
- private final BaseDriver devDriver;
- private final PlcConnection plcConn;
- private PlcReadRequest.Builder readRequestBuilder = null;
- private PlcWriteRequest.Builder writeRequestBuilder = null;
- private PlcReadRequest readRequest = null;
- private PlcWriteRequest writeRequest = null;
-
- private final PVTimeStamp pvTimeStamp = PVTimeStampFactory.create();
- private final TimeStamp timeStamp = TimeStampFactory.create();
- private CreateRequest createRequest = CreateRequest.create();
- private String request = "field(timeStamp,value)";
- private PVStructure pvRequest = createRequest.createRequest(request);
-
- boolean run = false;
- private ConcurrentHashMap<String, PVRecord> items = new
ConcurrentHashMap<String, PVRecord>();
-
- public DBCollectorImpl(BundleContext bundleContext, String device) {
- this.bundleContext = bundleContext;
- this.device = device;
- this.devDriver = getDriver(device);
- this.plcConn = devDriver.getPlcConnection();
- if (plcConn == null){LOGGER.info("DBCollectorImpl. Connection is
null");}
- }
-
- @Override
- public void execute(JobContext ctx) {
- if (run) {
- DriverEvent event = devDriver.getEvent();
- event.setFunctionCode(Merlot.FUNCTION.FC_READ_MEMORY_BYTES);
- event.setPlcReadRequest(readRequest);
- event.setCallback(this);
- devDriver.putEvent(event);
- };
- }
-
- //TODO: Manejo por función solicitada
- //TODO: Replace item with Master database instance
- @Override
- public void execute(DriverEvent cb) {
- PVRecord pvRecord = null;
- PVField value = null;
- PVBoolean enable = null;
- boolean disable = false;
- if (cb.getPlcReadResponse() != null) {
- PlcReadResponse drvResponse = cb.getPlcReadResponse();
- PlcReadRequest drvRequest = drvResponse.getRequest();
-
- Set<String> strFields = drvRequest.getTagNames();
-
- for(String strField:strFields) {
-
- pvRecord = items.get(strField);
- value = pvRecord.getPVStructure().getSubField("value");
-
- enable =
pvRecord.getPVStructure().getBooleanField("scan_enable");
-
- disable = false;
- if (enable == null){
- LOGGER.info("There is no \"enable\" field in the PVRecord.
Could not process.");
- disable = true;
- } else if (!enable.get()){
- LOGGER.info("PVRecord[" + pvRecord.getRecordName()+"] is
disabled.");
- disable = true;
- }
-
- if (!disable) {
- switch(value.getField().getType()) {
- case scalar:
- readScalar(drvResponse, pvRecord);
- break;
- case scalarArray:
- readScalarArray(drvResponse, pvRecord);
- break;
- case structure:
- executeStructure(drvResponse, pvRecord);
- break;
- case structureArray:
- executeStructureArray(drvResponse, pvRecord);
- break;
- case union:
- executeUnion(drvResponse, pvRecord);
- break;
- case unionArray:
- executeUnionArray(drvResponse, pvRecord);
- break;
- }
- }
- }
- } else if (cb.getPlcWriteResponse() != null){
- LOGGER.info("Write ready...");
- }
- }
-
- @Override
- public void attach(Collection<PVRecord> pvRecords) {
- run = false;
-
- if (plcConn == null){LOGGER.info("Conexion null");}
- if (plcConn.isConnected()){
- readRequestBuilder = this.plcConn.readRequestBuilder();
- for (PVRecord pvRecord:pvRecords){
- items.put(pvRecord.getRecordName(), pvRecord);
- readRequestBuilder.addTagAddress(pvRecord.getRecordName(),
pvRecord.getPVStructure().getStringField("id").get());
- PVCopy pvCopy =
PVCopyFactory.create(pvRecord.getPVRecordStructure().getPVStructure(),
pvRequest, "");
- pvRecord.addListener(this, pvCopy);
- }
- readRequest = readRequestBuilder.build();
- } else {
- LOGGER.info("Driver not connected...");
- }
- run = true;
- }
-
-
- @Override
- public void detach(Collection<PVRecord> pvRecords) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- private BaseDriver getDriver(String device){
- try{
- String filterdriver = "(DRIVER_ID=" + device + ")";
- ServiceReference[] refdrvs =
bundleContext.getAllServiceReferences(Driver.class.getName(), filterdriver);
- BaseDriver refdrv = (BaseDriver)
bundleContext.getService(refdrvs[0]);
- return refdrv;
- } catch (Exception ex){
- LOGGER.info(ex.toString());
- }
- return null;
- }
-
-
- @Override
- public void dataPut(PVRecordField pvRecordField) {
- }
-
- @Override
- public void dataPut(PVRecordStructure pvStructure, PVRecordField
pvRecordField) {
- }
-
- @Override
- public void beginGroupPut(PVRecord pvRecord) {
- }
-
- //TODO: Manejo de diferentes tipos
- @Override
- public void endGroupPut(PVRecord pvRecord) {
- PVField pvField = pvRecord.getPVStructure().getSubField("value");
- switch(pvField.getField().getType()){
- case scalar:
- writeScalar(pvRecord);
- break;
- case scalarArray:
- writeScalarArray(pvRecord);
- break;
- case structure:
-;
- break;
- case structureArray:
-
- break;
- case union:
-
- break;
- case unionArray:
-
- break;
- }
- }
-
- @Override
- public void unlisten(PVRecord arg0) {
- LOGGER.info("Unlisten: ");
- }
-
- private void readScalar(PlcReadResponse response, PVRecord pvRecord){
- PVScalar value = (PVScalar)
pvRecord.getPVStructure().getSubField("value");
- pvRecord.lock();
- try{
- switch(value.getScalar().getScalarType()){
- case pvBoolean:
- ((PVBoolean)
value).put(response.getBoolean(pvRecord.getRecordName()));
- break;
- case pvByte:
- ((PVByte)
value).put(response.getByte(pvRecord.getRecordName()));
- break;
- case pvShort:
- ((PVShort)
value).put(response.getShort(pvRecord.getRecordName()));
- break;
- case pvInt:
- ((PVInt)
value).put(response.getInteger(pvRecord.getRecordName()));
- break;
- case pvLong:
- ((PVLong)
value).put(response.getInteger(pvRecord.getRecordName()));
- break;
- case pvUByte:
- ((PVUByte)
value).put(response.getByte(pvRecord.getRecordName()));
- break;
- case pvUShort:
- ((PVUShort)
value).put(response.getShort(pvRecord.getRecordName()));
- break;
- case pvUInt:
- ((PVUInt)
value).put(response.getInteger(pvRecord.getRecordName()));
- break;
- case pvULong:
- ((PVULong)
value).put(response.getLong(pvRecord.getRecordName()));
- break;
- case pvFloat:
- ((PVFloat)
value).put(response.getFloat(pvRecord.getRecordName()));
- break;
- case pvDouble:
- ((PVDouble)
value).put(response.getDouble(pvRecord.getRecordName()));
- break;
- case pvString:
- ((PVString)
value).put(response.getString(pvRecord.getRecordName()));
- break;
- default:
- LOGGER.info("Unsupported type.");
- break;
- }
- pvRecord.process();
- } catch(Exception ex){
- LOGGER.info("executeScalar: " + ex.getMessage());
- } finally{
- pvRecord.unlock();
- }
- }
-
- private void readScalarArray(PlcReadResponse response, PVRecord pvRecord){
- PVScalarArray value = (PVScalarArray)
pvRecord.getPVStructure().getSubField("value");
- pvRecord.lock();
- try{
- switch(value.getScalarArray().getElementType()){
- case pvBoolean:{
- Collection<Boolean> resObjects =
response.getAllBooleans(pvRecord.getRecordName());
- boolean[] arrBooleans = new boolean[resObjects.size()];
- Iterator<Boolean> itr = resObjects.iterator();
- Boolean objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrBooleans[i] = objValue;
- i++;
- }
- ((PVBooleanArray)
value).put(0,resObjects.size(),arrBooleans,0);
- }
- break;
-
- case pvByte:
- case pvUByte:
- {
- Collection<Byte> resObjects =
response.getAllBytes(pvRecord.getRecordName());
- byte[] arrBytes = new byte[resObjects.size()];
- Iterator<Byte> itr = resObjects.iterator();
- Byte objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrBytes[i] = objValue;
- i++;
- }
- ((PVByteArray) value).put(0,resObjects.size(),arrBytes,0);
- }
- break;
- case pvShort:
- case pvUShort:
- {
- Collection<Short> resObjects =
response.getAllShorts(pvRecord.getRecordName());
- short[] arrShorts = new short[resObjects.size()];
- Iterator<Short> itr = resObjects.iterator();
- Short objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrShorts[i] = objValue;
- i++;
- }
- int capacity = ((PVShortArray) value).getCapacity();
- ((PVShortArray) value).put(0,capacity,arrShorts,0);
- }
- break;
- case pvInt:
- case pvUInt:
- {
- Collection<Integer> resObjects =
response.getAllIntegers(pvRecord.getRecordName());
- int[] arrIntegers = new int[resObjects.size()];
- Iterator<Integer> itr = resObjects.iterator();
- Integer objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrIntegers[i] = objValue;
- i++;
- }
- int capacity = ((PVIntArray) value).getCapacity();
- ((PVIntArray) value).put(0,capacity,arrIntegers,0);
- }
- break;
- case pvLong:
- case pvULong:
- {
- Collection<Long> resObjects =
response.getAllLongs(pvRecord.getRecordName());
- long[] arrLongs = new long[resObjects.size()];
- Iterator<Long> itr = resObjects.iterator();
- Long objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrLongs[i] = objValue;
- i++;
- }
- int capacity = ((PVLongArray) value).getCapacity();
- ((PVLongArray) value).put(0,capacity,arrLongs,0);
- }
- break;
- case pvFloat:
- {
- Collection<Float> resObjects =
response.getAllFloats(pvRecord.getRecordName());
- float[] arrFloats = new float[resObjects.size()];
- Iterator<Float> itr = resObjects.iterator();
- Float objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrFloats[i] = objValue;
- i++;
- }
- int capacity = ((PVFloatArray) value).getCapacity();
- ((PVFloatArray) value).put(0,capacity,arrFloats,0);
- }
- break;
- case pvDouble:
- {
- Collection<Double> resObjects =
response.getAllDoubles(pvRecord.getRecordName());
- double[] arrDoubles = new double[resObjects.size()];
- Iterator<Double> itr = resObjects.iterator();
- Double objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrDoubles[i] = objValue;
- i++;
- }
- int capacity = ((PVDoubleArray) value).getCapacity();
- ((PVDoubleArray)
value).put(0,resObjects.size(),arrDoubles,0);
- }
- break;
- case pvString:
- {
- Collection<String> resObjects =
response.getAllStrings(pvRecord.getRecordName());
- String[] arrStrings = new String[resObjects.size()];
- Iterator<String> itr = resObjects.iterator();
- String objValue;
- int i = 0;
- while(itr.hasNext()){
- objValue = itr.next();
- if (objValue == null) break;
- arrStrings[i] = objValue;
- i++;
- }
- int capacity = ((PVStringArray) value).getCapacity();
- ((PVStringArray)
value).put(0,resObjects.size(),arrStrings,0);
- }
- break;
- default:
- LOGGER.info("Unsupported type.");
- break;
- }
- pvRecord.process();
- } catch (Exception ex){
- ex.printStackTrace();
- LOGGER.info(ex.getMessage());
- } finally{
- pvRecord.unlock();
- }
- }
-
- private void executeStructure(PlcReadResponse response, PVRecord pvRecord){
-
- }
-
- private void executeStructureArray(PlcReadResponse response, PVRecord
pvRecord){
-
- }
-
- private void executeUnion(PlcReadResponse response, PVRecord pvRecord){
-
- }
-
- private void executeUnionArray(PlcReadResponse response, PVRecord
pvRecord){
-
- }
-
- private void writeScalar(PVRecord pvRecord){
- try {
- pvRecord.lock();
- PVScalar valueScalar = (PVScalar)
pvRecord.getPVStructure().getSubField("value");
- Object value = null;
- switch(valueScalar.getScalar().getScalarType()){
- case pvBoolean:
- value =
pvRecord.getPVStructure().getBooleanField("value").get();
- break;
- case pvByte:
- case pvUByte:
- value =
pvRecord.getPVStructure().getByteField("value").get();
- break;
- case pvShort:
- case pvUShort:
- value =
pvRecord.getPVStructure().getShortField("value").get();
- break;
- case pvInt:
- case pvUInt:
- value =
pvRecord.getPVStructure().getIntField("value").get();
- break;
- case pvLong:
- case pvULong:
- value =
pvRecord.getPVStructure().getLongField("value").get();
- break;
- case pvFloat:
- value =
pvRecord.getPVStructure().getFloatField("value").get();
- break;
- case pvDouble:
- value =
pvRecord.getPVStructure().getDoubleField("value").get();
- break;
- case pvString:
- value =
pvRecord.getPVStructure().getStringField("value").get();
- break;
- default:
- LOGGER.info("Unsupported type.");
- break;
- }
-
- writeRequestBuilder = plcConn.writeRequestBuilder();
- writeRequestBuilder.addTagAddress(pvRecord.getRecordName(),
- pvRecord.getPVStructure().getStringField("id").get(),
- value);
- writeRequest = writeRequestBuilder.build();
-
- DriverEvent event = devDriver.getEvent();
- event.setFunctionCode(Merlot.FUNCTION.FC_WRITE_DATA_BYTES);
- event.setPlcWriteRequest(writeRequest);
- event.setCallback(this);
- devDriver.putEvent(event);
- } catch (Exception ex){
- LOGGER.info("Exception ex: " + ex);
- } finally{
- pvRecord.unlock();
- }
-
- }
-
- private void writeScalarArray(PVRecord pvRecord){
- try{
- pvRecord.lock();
- PVScalarArray valueScalarArray = (PVScalarArray)
pvRecord.getPVStructure().getSubField("value");
- Object value = null;
- switch(valueScalarArray.getScalarArray().getElementType()){
- case pvBoolean:
- value = getBooleanVector((PVBooleanArray)
valueScalarArray);
- break;
- case pvByte:
- case pvUByte:
- value = getByteVector((PVByteArray) valueScalarArray);
- break;
- case pvShort:
- case pvUShort:
- value = getShortVector((PVShortArray) valueScalarArray);
- break;
- case pvInt:
- case pvUInt:
- value = getIntVector((PVIntArray) valueScalarArray);
- break;
- case pvLong:
- case pvULong:
- value = getLongVector((PVLongArray) valueScalarArray);
- break;
- case pvFloat:
- value = getFloatVector((PVFloatArray) valueScalarArray);
- break;
- case pvDouble:
- value = getDoubleVector((PVDoubleArray) valueScalarArray);
- break;
- case pvString:
- value = GetHelper.getStringVector((PVStringArray)
valueScalarArray);
- break;
- default:
- LOGGER.info("Unsupported type.");
- break;
- }
-
- writeRequestBuilder = plcConn.writeRequestBuilder();
- writeRequestBuilder.addTagAddress(pvRecord.getRecordName(),
- pvRecord.getPVStructure().getStringField("id").get(),
- ((Vector)value).toArray());
- writeRequest = writeRequestBuilder.build();
-
- DriverEvent event = devDriver.getEvent();
- event.setFunctionCode(Merlot.FUNCTION.FC_WRITE_DATA_BYTES);
- event.setPlcWriteRequest(writeRequest);
- event.setCallback(this);
- devDriver.putEvent(event);
- } catch (Exception ex){
- LOGGER.info("writeScalarArray: " + ex.toString());
- } finally {
- pvRecord.unlock();
- }
- }
-
- public static Vector<Boolean> getBooleanVector( PVBooleanArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Boolean> ret = new Vector<>();
- BooleanArrayData data = new BooleanArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
- public static Vector<Byte> getByteVector( PVByteArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Byte> ret = new Vector<>();
- ByteArrayData data = new ByteArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
- public static Vector<Short> getShortVector( PVShortArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Short> ret = new Vector<>();
- ShortArrayData data = new ShortArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
- public static Vector<Integer> getIntVector( PVIntArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Integer> ret = new Vector<>();
- IntArrayData data = new IntArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
- public static Vector<Long> getLongVector( PVLongArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Long> ret = new Vector<>();
- LongArrayData data = new LongArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
-
- public static Vector<Float> getFloatVector( PVFloatArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Float> ret = new Vector<>();
- FloatArrayData data = new FloatArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
- public static Vector<Double> getDoubleVector( PVDoubleArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<Double> ret = new Vector<>();
- DoubleArrayData data = new DoubleArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
- public static Vector<String> getStringVector( PVStringArray pv )
- {
- int len = pv.getLength();
- // double[] storage = new double[len];
- Vector<String> ret = new Vector<>();
- StringArrayData data = new StringArrayData();
- int offset = 0;
- while(offset < len) {
- int num = pv.get(offset,(len-offset),data);
- for (int i=0; i<num; i++) ret.add(data.data[offset+i]);
- // System.arraycopy(data.data,data.offset,storage,offset,num);
- offset += num;
- }
- return ret;
- }
-
-}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBControlImpl.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBControlImpl.java
deleted file mode 100644
index 24921d7..0000000
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBControlImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.merlot.db.impl;
-
-import org.apache.plc4x.merlot.db.api.DBCollector;
-import org.apache.plc4x.merlot.db.api.DBControl;
-import org.apache.plc4x.merlot.scheduler.api.Job;
-import org.apache.plc4x.merlot.scheduler.api.JobContext;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.epics.pvdatabase.PVRecord;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-
-
-public class DBControlImpl implements DBControl {
-
-
- BundleContext bundleContext;
-
-
- @Override
- public void attach(String device, Collection<PVRecord> pvRecords) {
-
- List<PVRecord> pvTemp = null;
- PVRecord pvRecord = null;
-
- Map<String, List<PVRecord>> byScanRate = pvRecords.stream()
- .collect(Collectors.groupingBy(record ->
record.getPVStructure().getStringField("scan_rate").get()));
-
- for (String key:byScanRate.keySet()){
- DBCollector collector = registerCollector(device,key);
- collector.attach(byScanRate.get(key));
- }
-
- }
-
- @Override
- public void detach(PVRecord pvRecord) {
- System.out.println("detach PVRecord: "+
pvRecord.getPVStructure().getShortField("id"));
- }
-
- @Override
- public void execute(JobContext ctx) {
-
- }
-
- @Override
- public void setBundleContext(BundleContext bundleContext) {
- this.bundleContext = bundleContext;
- }
-
- private DBCollector registerCollector(String device, String scanrate){
- Hashtable properties = new Hashtable();
- properties.put("collector.das.device", device);
- properties.put("scheduler.name", device+":"+scanrate);
- properties.put("scheduler.period", scanrate);
- properties.put("scheduler.immediate", true);
- properties.put("scheduler.concurrent", false);
-
- DBCollector collector = new DBCollectorImpl(bundleContext, device);
-
- bundleContext.registerService(new
String[]{DBCollector.class.getName(), Job.class.getName()}, collector,
properties);
-
- return collector;
- }
-
- private DBCollector getCollector(String driver, String device, String
scanrate){
- try
- {
- String filter = "(&(" + Constants.OBJECTCLASS + "=" +
DBCollector.class.getName() + ")" +
- "(&(scheduler.name=" + device+":"+scanrate +
")(scheduler.period=" + scanrate + ")))";
-
- ServiceReference[] references =
bundleContext.getServiceReferences((String) null, filter);
- if (references != null){
- ServiceReference reference = references[0];
- return (DBCollector) reference.getBundle();
- }
- } catch(Exception ex) {
-
- };
- return null;
- }
-
-
-}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
index ef12847..7eec795 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
@@ -50,11 +50,11 @@
factory-method="getChannelProviderLocal"
scope="singleton"/>
- <bean id="DBControl"
+<!-- <bean id="DBControl"
class="org.apache.plc4x.merlot.db.impl.DBControlImpl"
scope="singleton">
<property name="bundleContext" ref="blueprintBundleContext"/>
- </bean>
+ </bean>-->
<bean id="DBWriterHandlerImpl"
class="org.apache.plc4x.merlot.db.impl.DBWriterHandlerImpl"/>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
index 94a1867..8c282ad 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
@@ -79,5 +79,10 @@
<version>2.0.13</version>
<type>jar</type>
</dependency>
+ <dependency>
+ <groupId>org.apache.plc4x.merlot.db</groupId>
+ <artifactId>org.apache.plc4x.merlot.db</artifactId>
+ <version>0.13.0-SNAPSHOT</version>
+ </dependency>
</dependencies>
</project>
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
similarity index 57%
copy from
plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
copy to
plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
index 8db87f6..ddaa03f 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/DBS7CounterFactory.java
@@ -16,88 +16,93 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.merlot.db.core;
-
+package org.apache.plc4x.merlot.drv.s7.core;
import io.netty.buffer.Unpooled;
import org.apache.plc4x.merlot.api.PlcItem;
import org.apache.plc4x.merlot.api.PlcItemListener;
import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.apache.plc4x.merlot.db.core.DBBaseFactory;
import org.epics.nt.NTScalar;
import org.epics.nt.NTScalarArray;
import org.epics.nt.NTScalarArrayBuilder;
import org.epics.nt.NTScalarBuilder;
import org.epics.pvdata.factory.FieldFactory;
+import org.epics.pvdata.pv.FieldBuilder;
import org.epics.pvdata.pv.FieldCreate;
import org.epics.pvdata.pv.PVBoolean;
-import org.epics.pvdata.pv.PVBooleanArray;
+import org.epics.pvdata.pv.PVShort;
+import org.epics.pvdata.pv.PVShortArray;
+import org.epics.pvdata.pv.PVString;
import org.epics.pvdata.pv.PVStructure;
import org.epics.pvdata.pv.ScalarType;
+import org.epics.pvdatabase.PVRecord;
-public class DBBooleanFactory extends DBBaseFactory {
-
- private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
-
- public DBBooleanFactory() {};
+public class DBS7CounterFactory extends DBBaseFactory {
+ private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
+
@Override
public DBRecord create(String recordName) {
NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
+ FieldBuilder fb = fieldCreate.createFieldBuilder();
+
PVStructure pvStructure = ntScalarBuilder.
- value(ScalarType.pvBoolean).
- addDescriptor().
- add("id", fieldCreate.createScalar(ScalarType.pvString)).
+ value(ScalarType.pvShort).
+ addDescriptor().
+ add("id", fieldCreate.createScalar(ScalarType.pvString)).
add("offset", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_time", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_enable",
fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_value",
fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_enable",
fieldCreate.createScalar(ScalarType.pvBoolean)).
+ add("write_value", fieldCreate.createScalar(ScalarType.pvShort)).
addAlarm().
addTimeStamp().
addDisplay().
addControl().
- createPVStructure();
- DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+ createPVStructure();
+ DBRecord dbRecord = new DBS7CounterRecord(recordName,pvStructure);
return dbRecord;
}
@Override
- public DBRecord createArray(String recordName, int length) {
- NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
+ public DBRecord createArray(String recordName,int length) {
+ NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
NTScalarArrayBuilder ntScalarArrayBuilder =
NTScalarArray.createBuilder();
+
PVStructure pvStructure = ntScalarArrayBuilder.
- value(ScalarType.pvBoolean).
+ value(ScalarType.pvShort).
addDescriptor().
add("id", fieldCreate.createScalar(ScalarType.pvString)).
add("offset", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_time", fieldCreate.createScalar(ScalarType.pvString)).
add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
add("write_enable",
fieldCreate.createScalar(ScalarType.pvBoolean)).
- add("write_value",
fieldCreate.createFixedScalarArray(ScalarType.pvBoolean, length)).
+ add("write_value",
fieldCreate.createFixedScalarArray(ScalarType.pvShort, length)).
addAlarm().
addTimeStamp().
addDisplay().
addControl().
createPVStructure();
- PVBooleanArray pvValue = (PVBooleanArray)
pvStructure.getScalarArrayField("value", ScalarType.pvBoolean);
+ PVShortArray pvValue = (PVShortArray)
pvStructure.getScalarArrayField("value", ScalarType.pvShort);
pvValue.setCapacity(length);
- pvValue.setLength(length);
- DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+ pvValue.setLength(length);
+ DBRecord dbRecord = new DBS7CounterRecord(recordName,pvStructure);
return dbRecord;
}
+
+ class DBS7CounterRecord extends DBRecord implements PlcItemListener {
- class DBBooleanRecord extends DBRecord implements PlcItemListener {
-
- private PVBoolean value;
- private PVBoolean write_value;
- private PVBoolean write_enable;
- private boolean blnValue = false;
-
- public DBBooleanRecord(String recordName,PVStructure pvStructure) {
+ private PVShort value;
+ private PVShort write_value;
+ private PVBoolean write_enable;
+ short b, c, d, bcd;
+
+ public DBS7CounterRecord(String recordName,PVStructure pvStructure) {
super(recordName, pvStructure);
- value = pvStructure.getBooleanField("value");
- write_value = pvStructure.getBooleanField("write_value");
+ value = pvStructure.getShortField("value");
+ write_value = pvStructure.getShortField("write_value");
write_enable = pvStructure.getBooleanField("write_enable");
}
@@ -107,28 +112,23 @@ public class DBBooleanFactory extends DBBaseFactory {
*/
public void process()
{
- if (null != plcItem) {
- if (write_enable.get()) {
+ if (null != plcItem) {
+ if (write_enable.get()) {
write_value.put(value.get());
innerWriteBuffer.clear();
- innerWriteBuffer.writeBoolean(write_value.get());
+ innerWriteBuffer.writeShort(write_value.get());
super.process();
}
-
- }
- }
+ }
+ }
@Override
- public void atach(PlcItem plcItem) {
- try {
- this.plcItem = plcItem;
- //offset = this.getPVStructure().getIntField("offset").get() *
Byte.BYTES;
- getOffset(
this.getPVStructure().getStringField("offset").get());
- innerBuffer = plcItem.getItemByteBuf().slice(byteOffset,
Byte.BYTES);
- innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
- } catch (Exception ex) {
- LOGGER.error(this.getClass().getName() + " : " +
ex.getMessage());
- }
+ public void atach(final PlcItem plcItem) {
+ this.plcItem = plcItem;
+ //offset = this.getPVStructure().getIntField("offset").get() *
Short.BYTES;
+ getOffset( this.getPVStructure().getStringField("offset").get());
+ innerBuffer = plcItem.getItemByteBuf().slice(byteOffset,
Short.BYTES);
+ innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
}
@Override
@@ -136,32 +136,22 @@ public class DBBooleanFactory extends DBBaseFactory {
this.plcItem = null;
}
- /*
- *
***************************************************************************
- * Modbus : Return a array of bytes, where every byte is a boolean.
- * S7 : Return a array of bytes, where every byte, packet 8
booleans.
- * Ethernet/IP : TODO:
- *
***************************************************************************
- */
@Override
- public void update() {
- if (null != plcItem) {
- if (bitOffset == -1) {
- if (value.get() != innerBuffer.getBoolean(0))
- value.put(innerBuffer.getBoolean(0));
- } else {
- blnValue = ((innerBuffer.getByte(0) >> bitOffset & 1) ==
1);
- value.put(blnValue);
- }
+ public void update() {
+ if (null != plcItem) {
+ b = (short)(innerBuffer.getByte(0) & 0x0F);
+ c = (short)((innerBuffer.getByte(1) & 0xF0) >> 4);
+ d = (short)(innerBuffer.getByte(1) & 0x0F);
+ bcd = (short)(b*100 + c*10 + d);
+ if (value.get() != bcd)
+ value.put(bcd);
}
}
-
+
@Override
public String getFieldsToMonitor() {
return MONITOR_FIELDS;
- }
-
+ }
}
-
-
+
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
index ae2e02b..c923728 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-drv-service.xml
@@ -31,6 +31,9 @@
<bean id="S7PlcEventConnectionFunctionBean"
class="org.apache.plc4x.merlot.drv.s7.impl.S7PlcEventConnectionFunctionImpl"
scope="singleton">
</bean>
+
+ <bean id="DBS7CounterFactoryBean"
class="org.apache.plc4x.merlot.drv.s7.core.DBS7CounterFactory"
scope="singleton">
+ </bean>
<service ranking="0" ref="S7PlcTagFunctionBean" auto-export="interfaces">
@@ -51,6 +54,14 @@
<entry key="dal.function.version"
value="org.apache.plc4x.s7"/>
<entry key="dal.function.type" value="wrapper"/>
</service-properties>
- </service>
+ </service>
+
+ <service id="DBS7CounterFactory"
+ ref="DBS7CounterFactoryBean"
+ interface="org.apache.plc4x.merlot.db.api.DBRecordFactory">
+ <service-properties>
+ <entry key="db.record.type" value="s7counter"/>
+ </service-properties>
+ </service>
</blueprint>
\ No newline at end of file