From 35b56eed4ac3fc1117fd8fae567ec62096f554f8 Mon Sep 17 00:00:00 2001 From: Lerb123 Date: Tue, 7 Jul 2026 17:40:18 -0400 Subject: [PATCH 1/2] fix: Moved DBWriterHandler to the API and removed the call to the DBRecord superclass. feat: New method to find the write handler in PlcGeneralFunction, used in the class that creates DBRecords --- .../command/MerlotLogRecorderCommand.java | 22 ++ .../plc4x/merlot}/api/DBWriterHandler.java | 6 +- .../plc4x/merlot/api/PlcGeneralFunction.java | 2 +- .../api/impl/PlcGeneralFunctionImpl.java | 22 ++ .../db/core/DBRecordsManagedService.java | 2 +- .../plc4x/merlot/db/impl/DBPersistImpl.java | 63 +-- .../merlot/db/impl/DBWriterHandlerImpl.java | 7 +- .../OSGI-INF/blueprint/db-service.xml | 4 +- .../merlot/drv/s7/core/S7DBAiFactory.java | 2 +- .../merlot/drv/s7/core/S7DBAoFactory.java | 2 +- .../merlot/drv/s7/core/S7DBDiFactory.java | 2 +- .../merlot/drv/s7/core/S7DBDoFactory.java | 2 +- .../merlot/drv/s7/core/S7DBMotorFactory.java | 358 +++++++++--------- .../drv/s7/core/S7DBValveAnalogFactory.java | 2 +- .../drv/s7/core/S7DBValveSolenoidFactory.java | 2 +- .../drv/s7/impl/S7DBWriterHandlerImpl.java | 16 +- .../OSGI-INF/blueprint/s7-drv-service.xml | 4 +- 17 files changed, 285 insertions(+), 233 deletions(-) create mode 100644 plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/command/MerlotLogRecorderCommand.java rename plc4j/tools/merlot/{org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db => org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot}/api/DBWriterHandler.java (86%) diff --git a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/command/MerlotLogRecorderCommand.java b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/command/MerlotLogRecorderCommand.java new file mode 100644 index 000000000..a208af27a --- /dev/null +++ b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/command/MerlotLogRecorderCommand.java @@ -0,0 +1,22 @@ +/* + * 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 + * + * http://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.logrecorder.core.command; + + +public class MerlotLogRecorderCommand{ + //TODO: Class for viewing log entries stored in the database using the Tamboui shell +} diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/DBWriterHandler.java similarity index 86% rename from plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java rename to plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/DBWriterHandler.java index 0cdb7d323..9f74c54b8 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/DBWriterHandler.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.plc4x.merlot.db.api; +package org.apache.plc4x.merlot.api; import org.epics.pvdata.monitor.MonitorRequester; @@ -24,8 +24,8 @@ public interface DBWriterHandler extends MonitorRequester{ - public void putDBRecord(DBRecord dbRecord); + public void putDBRecord(Object dbRecord); - public void removeDBRecord(DBRecord dbRecord); + public void removeDBRecord(Object dbRecord); } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcGeneralFunction.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcGeneralFunction.java index f8d60d419..b0b6b0cbf 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcGeneralFunction.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcGeneralFunction.java @@ -319,5 +319,5 @@ public Optional createItem(String ItemUuid, String GroupUuId, */ public void write(UUID uuid, String tag, String value); - + public Optional getWriterHandler(String uid); } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGeneralFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGeneralFunctionImpl.java index ee992e2c2..a6ff51a21 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGeneralFunctionImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGeneralFunctionImpl.java @@ -30,6 +30,7 @@ import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.merlot.api.DBWriterHandler; import org.apache.plc4x.merlot.api.PlcDevice; import org.apache.plc4x.merlot.api.PlcDeviceFactory; import org.apache.plc4x.merlot.api.PlcFunction; @@ -91,6 +92,9 @@ public class PlcGeneralFunctionImpl implements PlcGeneralFunction { private static String FILTER_ITEM_UID = "(&(" + Constants.OBJECTCLASS + "=" + PlcItem.class.getName() + ")" + "(" + PlcItem.ITEM_UID + "=*))"; + + private static String FILTER_WRITE_HANDLER = "(&(" + Constants.OBJECTCLASS + "=" + DBWriterHandler.class.getName() + ")" + + "(db.record.writehandler.category=*))"; private static final String[] operations = {"getPlcDrivers", @@ -1017,5 +1021,23 @@ public PlcValue read(UUID uuid, String tag) { public void write(UUID uuid, String tag, String value) { // } + + @Override + public Optional getWriterHandler(String uid) { + try { + String strFilter = FILTER_WRITE_HANDLER.replace("*", uid); + ServiceReference[] references = bc.getServiceReferences((String) null, strFilter); + if (references != null) { + return Optional.of((DBWriterHandler) bc.getService(references[0])); + } else { + LOGGER.info("DBWriterHandler type: '" + uid + "' don't exist."); + return null; + } + } catch (Exception ex) { + LOGGER.error("getWriterHandler: " + ex.toString()); + } + return Optional.empty(); + + } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java index 9f3ab63dd..b1877e3bc 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java @@ -42,7 +42,7 @@ 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.api.DBWriterHandler; +import org.apache.plc4x.merlot.api.DBWriterHandler; import org.epics.pvdata.pv.PVBoolean; import org.epics.pvdata.pv.PVStructure; import org.epics.pvdatabase.PVDatabase; diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBPersistImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBPersistImpl.java index 46f709890..34579e14f 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBPersistImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBPersistImpl.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.plc4x.merlot.db.impl; import java.sql.Connection; @@ -27,13 +26,14 @@ import java.util.Properties; import java.util.UUID; import javax.sql.DataSource; +import org.apache.plc4x.merlot.api.DBWriterHandler; import org.apache.plc4x.merlot.api.PlcGeneralFunction; import org.apache.plc4x.merlot.api.PlcItem; import org.apache.plc4x.merlot.api.PlcItemListener; import org.apache.plc4x.merlot.api.PlcSecureBoot; import org.apache.plc4x.merlot.db.api.DBRecord; import org.apache.plc4x.merlot.db.api.DBRecordFactory; -import org.apache.plc4x.merlot.db.api.DBWriterHandler; +import org.apache.plc4x.merlot.api.PlcDevice; import org.epics.pvdata.pv.PVBoolean; import org.epics.pvdata.pv.PVDouble; import org.epics.pvdata.pv.PVInt; @@ -49,12 +49,13 @@ import org.osgi.service.jdbc.DataSourceFactory; import org.slf4j.LoggerFactory; -public class DBPersistImpl implements EventHandler{ +public class DBPersistImpl implements EventHandler { + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DBPersistImpl.class); private static final String DB_URL = "jdbc:sqlite:data/boot.db"; - private static final String SQL_CREATE_TABLE_PVRECORDS = - "CREATE TABLE IF NOT EXISTS PvRecords(" + private static final String SQL_CREATE_TABLE_PVRECORDS + = "CREATE TABLE IF NOT EXISTS PvRecords(" + "PvUuId TEXT NOT NULL PRIMARY KEY," + "PvName TEXT," + "PvType TEXT," @@ -74,11 +75,11 @@ public class DBPersistImpl implements EventHandler{ + "PvControlMinStep TEXT," + "Md5 TEXT)"; - private static final String SQL_SELECT_PVRECORDS = - "SELECT * FROM PvRecords"; + private static final String SQL_SELECT_PVRECORDS + = "SELECT * FROM PvRecords"; - private static final String SQL_INSERT_PVRECORDS = - "INSERT INTO PvRecords(PvUuId, PvName, PvType, PvId, PvOffset, PvDescriptor, PvScanTime, pvScanEnable," + private static final String SQL_INSERT_PVRECORDS + = "INSERT INTO PvRecords(PvUuId, PvName, PvType, PvId, PvOffset, PvDescriptor, PvScanTime, pvScanEnable," + "PvWriteEnable, PvDisplayLimitLow, PvDisplayLimitHigh, PvDisplayDescription, PvDisplayFormat," + "PvDisplayUnits, PvControlLimitLow, PvControlLimitHigh, PvControlMinStep, Md5)" + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " @@ -106,18 +107,18 @@ public class DBPersistImpl implements EventHandler{ private final BundleContext bc; private final PVDatabase master; private final PlcGeneralFunction plcGeneralFunction; - private final DBWriterHandler writerHandler; +// private final DBWriterHandler writerHandler; DataSourceFactory dsFactory = null; Connection dbConnection = null; public DBPersistImpl(BundleContext bc, - PVDatabase master, - PlcGeneralFunction plcGeneralFunction, - DBWriterHandler writerHandler) { + PVDatabase master, + PlcGeneralFunction plcGeneralFunction + ) {//DBWriterHandler writerHandler this.bc = bc; this.master = master; this.plcGeneralFunction = plcGeneralFunction; - this.writerHandler = writerHandler; +// this.writerHandler = writerHandler; } public void init() { @@ -134,8 +135,8 @@ public void init() { LOGGER.info("Boot driver name is {}.", databaseMetaData.getDriverName()); createTables(); //Catalog,Schema, Table pattern,types of tables - try(ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"TABLE"})){ - while(resultSet.next()) { + try (ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[]{"TABLE"})) { + while (resultSet.next()) { String tableName = resultSet.getString("TABLE_NAME"); String remarks = resultSet.getString("REMARKS"); } @@ -149,12 +150,10 @@ public void init() { } } - public void destroy() { LOGGER.info("DESTROY"); } - public void bindDataSourceFactory(DataSourceFactory dsFactory) { this.dsFactory = dsFactory; init(); @@ -165,13 +164,13 @@ public void handleEvent(Event event) { if (event.getTopic().equals(PlcSecureBoot.EVENT_STORE)) { try { store(); - } catch (Exception ex){ + } catch (Exception ex) { LOGGER.error(ex.getMessage()); } } else if (event.getTopic().equals(PlcSecureBoot.EVENT_RESTORE)) { try { restore(); - } catch (Exception ex){ + } catch (Exception ex) { LOGGER.error(ex.getMessage()); } } @@ -185,7 +184,7 @@ private void createTables() throws SQLException { public void store() throws SQLException { String[] pvNames = master.getRecordNames(); - for (String pvName:pvNames){ + for (String pvName : pvNames) { final PVRecord pvRecord = master.findRecord(pvName); insertPvRecord(pvRecord); } @@ -200,7 +199,7 @@ public void restore() throws SQLException, InvalidSyntaxException { while (rs.next()) { - filter = "(db.record.type="+rs.getString("pvType")+")"; + filter = "(db.record.type=" + rs.getString("pvType") + ")"; ServiceReference[] refs = bc.getServiceReferences(DBRecordFactory.class.getName(), filter); @@ -225,14 +224,21 @@ public void restore() throws SQLException, InvalidSyntaxException { pvRecord.getPVStructure().getDoubleField("control.minStep").put(Double.parseDouble(rs.getString("PvControlMinStep"))); //Talk to PLC4X - Optional plcItem = plcGeneralFunction.getPlcItem(rs.getString("PvId")); if (plcItem.isPresent()) { if (null == master.findRecord(pvRecord.getRecordName())) { plcItem.get().addItemListener((PlcItemListener) pvRecord); master.addRecord(pvRecord); - writerHandler.putDBRecord((DBRecord) pvRecord); + + //Each record is registered as a service under the name of the writer, which must be used for that record. + String dbRecordDriver = (String) refs[0].getProperty("db.record.driver"); + + Optional writer = plcGeneralFunction.getWriterHandler(dbRecordDriver); + if (writer.isPresent()) { + writer.get().putDBRecord((DBRecord) pvRecord); + } + } else { LOGGER.info("DBRecord [?] already exist.", rs.getString("PvId")); } @@ -245,11 +251,13 @@ public void restore() throws SQLException, InvalidSyntaxException { } } - private void insertPvRecord(PVRecord pvRecord) throws SQLException{ + private void insertPvRecord(PVRecord pvRecord) throws SQLException { if (null != dbConnection) { var query = dbConnection.prepareStatement(SQL_INSERT_PVRECORDS); - if (pvRecord.getRecordName().contains("_")) return; + if (pvRecord.getRecordName().contains("_")) { + return; + } PVScalar value = (PVScalar) pvRecord.getPVStructure().getSubField("value"); @@ -276,7 +284,4 @@ private void insertPvRecord(PVRecord pvRecord) throws SQLException{ } } - - - } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java index 7466d7fb0..b74c684eb 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java @@ -28,7 +28,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.plc4x.merlot.api.PlcItem; import org.apache.plc4x.merlot.db.api.DBRecord; -import org.apache.plc4x.merlot.db.api.DBWriterHandler; +import org.apache.plc4x.merlot.api.DBWriterHandler; import org.epics.pvdata.copy.CreateRequest; import org.epics.pvdata.misc.BitSet; import org.epics.pvdata.monitor.Monitor; @@ -227,7 +227,8 @@ public void message(String message, MessageType messageType) { } @Override - public void putDBRecord(DBRecord dbRecord) { + public void putDBRecord(Object db) { + DBRecord dbRecord = (DBRecord) db; LOGGER.info("Monitor with fields = {}", dbRecord.getFieldsToMonitor()); PVStructure request = createRequest.createRequest(dbRecord.getFieldsToMonitor()); Monitor monitor = MonitorFactory.create(dbRecord, this, request); @@ -240,7 +241,7 @@ public void putDBRecord(DBRecord dbRecord) { } @Override - public void removeDBRecord(DBRecord dbRecord) { + public void removeDBRecord(Object db) { throw new UnsupportedOperationException("Not supported yet."); } 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 2df4e067a..ba3b70627 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 @@ -92,7 +92,7 @@ - + - + diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java index 2d4e4d4f5..962813c2e 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java @@ -219,7 +219,7 @@ public void process() { if (null != plcItem) { if (write_enable.get()) { - super.process(); +// super.process(); } } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java index af0db1a6e..ec7b3f3f4 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java @@ -191,7 +191,7 @@ public void process() { if (null != plcItem) { if (write_enable.get()) { - super.process(); +// super.process(); } } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java index cde102a76..aca74ecbe 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java @@ -138,7 +138,7 @@ public void process() { if (null != plcItem) { if (write_enable.get()) { - super.process(); +// super.process(); } } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java index c5ae54fe3..2813d47ab 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java @@ -138,7 +138,7 @@ public void process() { if (bPB_Off.get() != out_bPB_Off.get()) { out_bPB_Off.put(bPB_Off.get()); } - super.process(); +// super.process(); } } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java index d9cf26ab1..c4a549bc3 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java @@ -39,98 +39,93 @@ import org.epics.pvdata.pv.PVStructure; import org.epics.pvdata.pv.ScalarType; - public class S7DBMotorFactory extends DBBaseFactory { - + private static FieldCreate fieldCreate = FieldFactory.getFieldCreate(); - + @Override public DBRecord create(String recordName) { NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder(); FieldBuilder fb = fieldCreate.createFieldBuilder(); - + Field fCmd = fb.setId("cmd"). add("iMode", fieldCreate.createScalar(ScalarType.pvShort)). - add("iErrorCode", fieldCreate.createScalar(ScalarType.pvShort)). - add("iStatus", fieldCreate.createScalar(ScalarType.pvShort)). - add("bPB_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPB_Forward", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPB_Reverse", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPB_Stop", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPBEN_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPBEN_Forward", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPBEN_Reverse", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bPBEN_Stop", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bForwardOn", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bReverseOn", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bSignalForward", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bSignalReverse", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bError", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("iErrorCode", fieldCreate.createScalar(ScalarType.pvShort)). + add("iStatus", fieldCreate.createScalar(ScalarType.pvShort)). + add("bPB_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPB_Forward", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPB_Reverse", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPB_Stop", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPBEN_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPBEN_Forward", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPBEN_Reverse", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bPBEN_Stop", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bForwardOn", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bReverseOn", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bSignalForward", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bSignalReverse", fieldCreate.createScalar(ScalarType.pvBoolean)). + add("bError", fieldCreate.createScalar(ScalarType.pvBoolean)). add("bInterlock", fieldCreate.createScalar(ScalarType.pvBoolean)). createStructure(); - - - Field fSts = fb.setId("sts"). + + Field fSts = fb.setId("sts"). add("bMotorProtectorTripped", fieldCreate.createScalar(ScalarType.pvBoolean)). add("bLocalDisconnectOff", fieldCreate.createScalar(ScalarType.pvBoolean)). add("bClutchTripped", fieldCreate.createScalar(ScalarType.pvBoolean)). add("bNoSignalForward", fieldCreate.createScalar(ScalarType.pvBoolean)). add("bNoSignalReverse", fieldCreate.createScalar(ScalarType.pvBoolean)). - add("bMotorNotStopped", fieldCreate.createScalar(ScalarType.pvBoolean)). - createStructure(); - + add("bMotorNotStopped", fieldCreate.createScalar(ScalarType.pvBoolean)). + createStructure(); + Field fPar = fb.setId("par"). add("tInTimeout", fieldCreate.createScalar(ScalarType.pvInt)). - add("strTimeout", fieldCreate.createScalar(ScalarType.pvString)). - createStructure(); - - + add("strTimeout", fieldCreate.createScalar(ScalarType.pvString)). + createStructure(); + PVStructure pvStructure = ntScalarBuilder. - 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("cmd", fCmd). - add("sts", fSts). - add("par", fPar). - addAlarm(). - addTimeStamp(). - addDisplay(). - addControl(). - createPVStructure(); - - DBRecord dbRecord = new DBS7MotorRecord(recordName,pvStructure); - + 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("cmd", fCmd). + add("sts", fSts). + add("par", fPar). + addAlarm(). + addTimeStamp(). + addDisplay(). + addControl(). + createPVStructure(); + + DBRecord dbRecord = new DBS7MotorRecord(recordName, pvStructure); + return dbRecord; } - - class DBS7MotorRecord extends DBRecord implements PlcItemListener { - + class DBS7MotorRecord extends DBRecord implements PlcItemListener { + private int BUFFER_SIZE = 14; private static final String MONITOR_TF_FIELDS = "field(write_enable, " + "cmd{iMode, bPB_ResetError, bPB_Forward, bPB_Reverse," + "bPB_Stop, bPBEN_ResetError, bPBEN_Forward, bPBEN_Reverse," + "bPBEN_Stop}," + "par{tInTimeout})"; - - - private PVShort value; + + private PVShort value; private PVShort write_value; - private PVBoolean write_enable; - + private PVBoolean write_enable; + //pvCmd - private PVShort iMode; - private PVShort iErrorCode; - private PVShort iStatus; - private PVBoolean bPB_ResetError; - private PVBoolean bPB_Forward; - private PVBoolean bPB_Reverse; - private PVBoolean bPB_Stop; - private PVBoolean bPBEN_ResetError; + private PVShort iMode; + private PVShort iErrorCode; + private PVShort iStatus; + private PVBoolean bPB_ResetError; + private PVBoolean bPB_Forward; + private PVBoolean bPB_Reverse; + private PVBoolean bPB_Stop; + private PVBoolean bPBEN_ResetError; private PVBoolean bPBEN_Forward; private PVBoolean bPBEN_Reverse; private PVBoolean bPBEN_Stop; @@ -138,111 +133,115 @@ class DBS7MotorRecord extends DBRecord implements PlcItemListener { private PVBoolean bReverseOn; private PVBoolean bSignalForward; private PVBoolean bSignalReverse; - private PVBoolean bError; - private PVBoolean bInterlock; + private PVBoolean bError; + private PVBoolean bInterlock; //pvSts - private PVBoolean bMotorProtectorTripped; - private PVBoolean bLocalDisconnectOff; - private PVBoolean bClutchTripped; - private PVBoolean bNoSignalForward; + private PVBoolean bMotorProtectorTripped; + private PVBoolean bLocalDisconnectOff; + private PVBoolean bClutchTripped; + private PVBoolean bNoSignalForward; private PVBoolean bNoSignalReverse; - private PVBoolean bMotorNotStopped; - + private PVBoolean bMotorNotStopped; + //pvPar - private PVInt tInTimeout; - private PVString strTimeout; - - private Duration lastDuration; + private PVInt tInTimeout; + private PVString strTimeout; + + private Duration lastDuration; byte byTemp; - - public DBS7MotorRecord(String recordName,PVStructure pvStructure) { + + public DBS7MotorRecord(String recordName, PVStructure pvStructure) { super(recordName, pvStructure); - + bFirtsRun = true; - + value = pvStructure.getShortField("value"); write_enable = pvStructure.getBooleanField("write_enable"); write_enable.put(false); - + //Read command values - PVStructure pvCmd = pvStructure.getStructureField("cmd"); - iMode = pvCmd.getShortField("iMode"); - iErrorCode = pvCmd.getShortField("iErrorCode"); - iStatus = pvCmd.getShortField("iStatus"); - bPB_ResetError = pvCmd.getBooleanField("bPB_ResetError"); - bPB_Forward = pvCmd.getBooleanField("bPB_Forward"); - bPB_Reverse = pvCmd.getBooleanField("bPB_Reverse"); - bPB_Stop = pvCmd.getBooleanField("bPB_Stop"); - bPBEN_ResetError = pvCmd.getBooleanField("bPBEN_ResetError"); - bPBEN_Forward = pvCmd.getBooleanField("bPBEN_Forward"); - bPBEN_Reverse = pvCmd.getBooleanField("bPBEN_Reverse"); - bPBEN_Stop = pvCmd.getBooleanField("bPBEN_Stop"); - bForwardOn = pvCmd.getBooleanField("bForwardOn"); - bReverseOn = pvCmd.getBooleanField("bReverseOn"); - bSignalForward = pvCmd.getBooleanField("bSignalForward"); - bSignalReverse = pvCmd.getBooleanField("bSignalReverse"); - bError = pvCmd.getBooleanField("bError"); - bInterlock = pvCmd.getBooleanField("bInterlock"); - + PVStructure pvCmd = pvStructure.getStructureField("cmd"); + iMode = pvCmd.getShortField("iMode"); + iErrorCode = pvCmd.getShortField("iErrorCode"); + iStatus = pvCmd.getShortField("iStatus"); + bPB_ResetError = pvCmd.getBooleanField("bPB_ResetError"); + bPB_Forward = pvCmd.getBooleanField("bPB_Forward"); + bPB_Reverse = pvCmd.getBooleanField("bPB_Reverse"); + bPB_Stop = pvCmd.getBooleanField("bPB_Stop"); + bPBEN_ResetError = pvCmd.getBooleanField("bPBEN_ResetError"); + bPBEN_Forward = pvCmd.getBooleanField("bPBEN_Forward"); + bPBEN_Reverse = pvCmd.getBooleanField("bPBEN_Reverse"); + bPBEN_Stop = pvCmd.getBooleanField("bPBEN_Stop"); + bForwardOn = pvCmd.getBooleanField("bForwardOn"); + bReverseOn = pvCmd.getBooleanField("bReverseOn"); + bSignalForward = pvCmd.getBooleanField("bSignalForward"); + bSignalReverse = pvCmd.getBooleanField("bSignalReverse"); + bError = pvCmd.getBooleanField("bError"); + bInterlock = pvCmd.getBooleanField("bInterlock"); + //Read status values - PVStructure pvSts = pvStructure.getStructureField("sts"); + PVStructure pvSts = pvStructure.getStructureField("sts"); bMotorProtectorTripped = pvSts.getBooleanField("bMotorProtectorTripped"); - bLocalDisconnectOff = pvSts.getBooleanField("bLocalDisconnectOff"); - bClutchTripped = pvSts.getBooleanField("bClutchTripped"); - bNoSignalForward = pvSts.getBooleanField("bNoSignalForward"); - bNoSignalReverse = pvSts.getBooleanField("bNoSignalReverse"); - bMotorNotStopped = pvSts.getBooleanField("bMotorNotStopped"); - + bLocalDisconnectOff = pvSts.getBooleanField("bLocalDisconnectOff"); + bClutchTripped = pvSts.getBooleanField("bClutchTripped"); + bNoSignalForward = pvSts.getBooleanField("bNoSignalForward"); + bNoSignalReverse = pvSts.getBooleanField("bNoSignalReverse"); + bMotorNotStopped = pvSts.getBooleanField("bMotorNotStopped"); + //Parameters values - PVStructure pvPar = pvStructure.getStructureField("par"); - tInTimeout = pvPar.getIntField("tInTimeout"); - strTimeout = pvPar.getStringField("strTimeout"); - + PVStructure pvPar = pvStructure.getStructureField("par"); + tInTimeout = pvPar.getIntField("tInTimeout"); + strTimeout = pvPar.getStringField("strTimeout"); + fieldOffsets.clear(); - fieldOffsets.add(0, null); - fieldOffsets.add(1, null); - fieldOffsets.add(2, null); - fieldOffsets.add(3, new ImmutablePair(0,-1)); - fieldOffsets.add(4, new ImmutablePair(6,0)); - fieldOffsets.add(5, new ImmutablePair(6,1)); - fieldOffsets.add(6, new ImmutablePair(6,2)); - fieldOffsets.add(7, new ImmutablePair(6,3)); - fieldOffsets.add(8, new ImmutablePair(6,4)); - fieldOffsets.add(9, new ImmutablePair(6,5)); - fieldOffsets.add(10, new ImmutablePair(6,6)); - fieldOffsets.add(11, new ImmutablePair(6,7)); - fieldOffsets.add(12, new ImmutablePair(7,0)); - fieldOffsets.add(13, new ImmutablePair(7,1)); - fieldOffsets.add(14, new ImmutablePair(7,2)); - fieldOffsets.add(15, new ImmutablePair(7,3)); - fieldOffsets.add(16, new ImmutablePair(7,4)); - fieldOffsets.add(17, new ImmutablePair(7,5)); - fieldOffsets.add(18, null); - fieldOffsets.add(19, new ImmutablePair(10,-1)); - } + fieldOffsets.add(0, null); + fieldOffsets.add(1, null); + fieldOffsets.add(2, null); + fieldOffsets.add(3, new ImmutablePair(0, -1)); + fieldOffsets.add(4, new ImmutablePair(6, 0)); + fieldOffsets.add(5, new ImmutablePair(6, 1)); + fieldOffsets.add(6, new ImmutablePair(6, 2)); + fieldOffsets.add(7, new ImmutablePair(6, 3)); + fieldOffsets.add(8, new ImmutablePair(6, 4)); + fieldOffsets.add(9, new ImmutablePair(6, 5)); + fieldOffsets.add(10, new ImmutablePair(6, 6)); + fieldOffsets.add(11, new ImmutablePair(6, 7)); + fieldOffsets.add(12, new ImmutablePair(7, 0)); + fieldOffsets.add(13, new ImmutablePair(7, 1)); + fieldOffsets.add(14, new ImmutablePair(7, 2)); + fieldOffsets.add(15, new ImmutablePair(7, 3)); + fieldOffsets.add(16, new ImmutablePair(7, 4)); + fieldOffsets.add(17, new ImmutablePair(7, 5)); + fieldOffsets.add(18, null); + fieldOffsets.add(19, new ImmutablePair(10, -1)); + } /** - * For other special types of data, adaptation must be made here - * to write to the PLC. - * - * 1. In the first write all fields are written - * 2. In the second one only the changes are written. - * + * For other special types of data, adaptation must be made here to + * write to the PLC. + * + * 1. In the first write all fields are written 2. In the second one + * only the changes are written. + * */ public void process() { - if (null != plcItem) { - if (write_enable.get()) { + if (null != plcItem) { + if (write_enable.get()) { try { + System.out.println("Strtimeout: "+strTimeout.get()); Duration userTime = Duration.parse(strTimeout.get()); + System.out.println("UserTime: " + userTime); if (!lastDuration.equals(userTime)) { + System.out.println("Antes"); int writeValue = S7DBStaticHelper.durationToS7Time(userTime); - tInTimeout.put(writeValue); + System.out.println("Despues"); + tInTimeout.put(writeValue); } } catch (Exception ex) { LOGGER.info("S7 TIME mal formed."); - } - super.process(); + } + } } } @@ -251,57 +250,58 @@ public void process() { @Override public void atach(final PlcItem plcItem) { this.plcItem = plcItem; - ParseOffset( this.getPVStructure().getStringField("offset").get()); + ParseOffset(this.getPVStructure().getStringField("offset").get()); innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE); } @Override - public void update() { + public void update() { if (null != plcItem) { innerBuffer.resetReaderIndex(); - + //Update pvCmd + if (innerBuffer.getShort(0) != iMode.get()) { iMode.put(innerBuffer.getShort(0)); } - - iErrorCode.put(innerBuffer.getShort(2)); + + iErrorCode.put(innerBuffer.getShort(2)); iStatus.put(innerBuffer.getShort(4)); - - byTemp = innerBuffer.getByte(6); - if (isBitSet(byTemp, 0) != bPB_ResetError.get()) { + + byTemp = innerBuffer.getByte(6); + if (isBitSet(byTemp, 0) != bPB_ResetError.get()) { bPB_ResetError.put(isBitSet(byTemp, 0)); } - if (isBitSet(byTemp, 1) != bPB_Forward.get()) { - bPB_Forward.put(isBitSet(byTemp, 1)); - } - if (isBitSet(byTemp, 2) != bPB_Reverse.get()) { - bPB_Reverse.put(isBitSet(byTemp, 2)); - } - if (isBitSet(byTemp, 3) != bPB_Stop.get()) { - bPB_Stop.put(isBitSet(byTemp, 3)); + if (isBitSet(byTemp, 1) != bPB_Forward.get()) { + bPB_Forward.put(isBitSet(byTemp, 1)); + } + if (isBitSet(byTemp, 2) != bPB_Reverse.get()) { + bPB_Reverse.put(isBitSet(byTemp, 2)); + } + if (isBitSet(byTemp, 3) != bPB_Stop.get()) { + bPB_Stop.put(isBitSet(byTemp, 3)); } if (isBitSet(byTemp, 4) != bPBEN_ResetError.get()) { - bPBEN_ResetError.put(isBitSet(byTemp, 4)); - } + bPBEN_ResetError.put(isBitSet(byTemp, 4)); + } if (isBitSet(byTemp, 5) != bPBEN_Forward.get()) { - bPBEN_Forward.put(isBitSet(byTemp, 5)); - } + bPBEN_Forward.put(isBitSet(byTemp, 5)); + } if (isBitSet(byTemp, 6) != bPBEN_Reverse.get()) { - bPBEN_Reverse.put(isBitSet(byTemp, 6)); - } + bPBEN_Reverse.put(isBitSet(byTemp, 6)); + } if (isBitSet(byTemp, 7) != bPBEN_Stop.get()) { - bPBEN_Stop.put(isBitSet(byTemp, 7)); - } + bPBEN_Stop.put(isBitSet(byTemp, 7)); + } - byTemp = innerBuffer.getByte(7); - bForwardOn.put(isBitSet(byTemp, 0)); + byTemp = innerBuffer.getByte(7); + bForwardOn.put(isBitSet(byTemp, 0)); bReverseOn.put(isBitSet(byTemp, 1)); bSignalForward.put(isBitSet(byTemp, 2)); bSignalReverse.put(isBitSet(byTemp, 3)); - bError.put(isBitSet(byTemp, 4)); - bInterlock.put(isBitSet(byTemp, 5)); - + bError.put(isBitSet(byTemp, 4)); + bInterlock.put(isBitSet(byTemp, 5)); + //Update pvSts byTemp = innerBuffer.getByte(8); bMotorProtectorTripped.put(isBitSet(byTemp, 0)); @@ -309,29 +309,27 @@ public void update() { bClutchTripped.put(isBitSet(byTemp, 2)); bNoSignalForward.put(isBitSet(byTemp, 3)); bNoSignalReverse.put(isBitSet(byTemp, 4)); - bMotorNotStopped .put(isBitSet(byTemp, 5)); - + bMotorNotStopped.put(isBitSet(byTemp, 5)); + //Update pvPar if (innerBuffer.getInt(10) != tInTimeout.get()) { tInTimeout.put(innerBuffer.getInt(10)); lastDuration = S7DBStaticHelper.s7TimeToDuration(tInTimeout.get()); - strTimeout.put(lastDuration.toString()); + strTimeout.put(lastDuration.toString()); } - if (bFirtsRun) { bFirtsRun = false; write_enable.put(true); - } + } } } - + @Override public String getFieldsToMonitor() { return MONITOR_TF_FIELDS; } - - + } - + } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveAnalogFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveAnalogFactory.java index aeae98b8b..b077e74f7 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveAnalogFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveAnalogFactory.java @@ -201,7 +201,7 @@ public void process() { } catch (Exception ex) { LOGGER.info("S7 TIME mal formed."); } - super.process(); +// super.process(); } } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveSolenoidFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveSolenoidFactory.java index 8d0762c7f..d99547aec 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveSolenoidFactory.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveSolenoidFactory.java @@ -201,7 +201,7 @@ public void process() { } catch (Exception ex) { LOGGER.info("S7 TIME mal formed."); } - super.process(); + } } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java index e2e6309d1..b4fa6f001 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java @@ -19,16 +19,15 @@ package org.apache.plc4x.merlot.drv.s7.impl; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Optional; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.plc4x.merlot.api.DBWriterHandler; import org.apache.plc4x.merlot.api.PlcItem; import org.apache.plc4x.merlot.db.api.DBRecord; -import org.apache.plc4x.merlot.db.api.DBWriterHandler; import org.epics.pvdata.copy.CreateRequest; import org.epics.pvdata.misc.BitSet; import org.epics.pvdata.monitor.Monitor; @@ -120,7 +119,7 @@ public void monitorEvent(Monitor monitor) { } i++; } -// LOGGER.info("PASO3..."); + LOGGER.info("Usando el s7 writer"); // LOGGER.info(structure.toString()); // LOGGER.info(changedBitSet.toString()); // LOGGER.info("Car: {}",changedBitSet.cardinality()); @@ -186,8 +185,12 @@ public void monitorEvent(Monitor monitor) { if (fieldOffsets.get(index) != null) { byteOffset = byteOffset + fieldOffsets.get(2).left; } - bitOffset = ((fieldOffsets.get(index) != null)?fieldOffsets.get(index).right.byteValue():(byte) -1); + bitOffset = ((fieldOffsets.get(index) != null)?((Number)(Object)fieldOffsets.get(index).right).byteValue():(byte) -1); + //bitOffset = (fieldOffsets.get(index) != null) ? ((Number)(Object)fieldOffsets.get(index).right).byteValue() : (byte) -1; + System.out.println("Buffer: "+byteBuf); + System.out.println("Byte: "+byteOffset); + System.out.println("Bit: "+bitOffset); if (optPlcItem.isPresent()) { optPlcItem.get().itemWrite(byteBuf, byteOffset, bitOffset); } @@ -222,7 +225,8 @@ public void message(String message, MessageType messageType) { } @Override - public void putDBRecord(DBRecord dbRecord) { + public void putDBRecord(Object db) { + DBRecord dbRecord = (DBRecord) db; LOGGER.info("Monitor with fields = {}", dbRecord.getFieldsToMonitor()); try { PVStructure request = createRequest.createRequest(dbRecord.getFieldsToMonitor()); @@ -239,7 +243,7 @@ public void putDBRecord(DBRecord dbRecord) { } @Override - public void removeDBRecord(DBRecord dbRecord) { + public void removeDBRecord(Object dbRecord) { throw new UnsupportedOperationException("Not supported yet."); } 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 43e40a5ad..272ff3cd2 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 @@ -227,13 +227,13 @@ - + - + From 7bea4f2cdb08ac04da46b4a936766161e9dd99ef Mon Sep 17 00:00:00 2001 From: Lerb123 Date: Mon, 24 Aug 2026 16:54:06 -0400 Subject: [PATCH 2/2] fix: Code changes to add an environment variable to the resource storage path (images and files) for the LogRecorder module --- .../org.apache.plc4x.logrecorder/pom.xml | 7 +- .../MerlotLogRecorderJDBCAppender.java | 7 +- .../core/MerlotLogRecorderFileExplorer.java | 15 +- .../MerlotLogRecorderLogMultipart.java | 6 +- .../servlets/MerlotLogRecorderSearch.java | 5 +- .../MerlotDataBrowserIoTDBGetDataPVImpl.java | 76 +-- .../archiver/impl/MerlotHtcIoTDBImpl.java | 52 +- .../OSGI-INF/blueprint/archiver-service.xml | 540 +++++++++--------- .../drv/s7/impl/S7DBWriterHandlerImpl.java | 8 - .../src/main/feature/feature.xml | 2 +- .../merlot/org.apache.plc4x.merlot/pom.xml | 6 +- plc4j/tools/merlot/pom.xml | 408 +++++++------ 12 files changed, 572 insertions(+), 560 deletions(-) diff --git a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/pom.xml index e1e8ae56c..2f6972457 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/pom.xml +++ b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/pom.xml @@ -199,10 +199,13 @@ - src/main/cfg/org.apache.plc4x.merlot.logrecorder.cfg + src/main/cfg/org.apache.plc4x.merlot.logrecorder.cfg cfg + + src/main/cfg/org.apache.plc4x.merlot.logrecorder.connection.database.cfg + cfg2 + diff --git a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/appender/MerlotLogRecorderJDBCAppender.java b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/appender/MerlotLogRecorderJDBCAppender.java index 1af14387a..75e95ea00 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/appender/MerlotLogRecorderJDBCAppender.java +++ b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/appender/MerlotLogRecorderJDBCAppender.java @@ -50,12 +50,11 @@ public class MerlotLogRecorderJDBCAppender implements EventHandler, ManagedServi private Map connectionProperties = new HashMap(); - //OPS4J support: Derby, H2, MariaDB, MySQL, PostgreSQL, SQLite +// //OPS4J support: Derby, H2, MariaDB, MySQL, PostgreSQL, SQLite private final static String createTableQueryGenericTemplate = "CREATE TABLE IF NOT EXISTS TABLENAME(id BIGINT NOT NULL PRIMARY KEY, owner VARCHAR(255)," + " level VARCHAR(100), description VARCHAR(4000), title VARCHAR(255), createdDate BIGINT, tags VARCHAR(255), logbooks VARCHAR(255), attachments_path VARCHAR(1500))"; - - //OPS4J support: Oracle +//OPS4J support: Oracle private final static String createTableQueryOracleTemplate = "CREATE TABLE IF NOT EXISTS TABLENAME(id NUMBER(19) NOT NULL PRIMARY KEY, owner VARCHAR2(255)," + " level VARCHAR2(100), description VARCHAR2(4000), title VARCHAR2(255), createdDate NUMBER(19), tags VARCHAR2(255), logbooks VARCHAR2(255), attachments_path VARCHAR(1500))"; @@ -96,6 +95,7 @@ public void handleEvent(Event event) { try (Connection connection = dataSource.getConnection()) { String insertQuery = insertQueryTemplate.replaceAll("TABLENAME", this.connectionProperties.get(TABLE_NAME_PROPERTY)); + try (PreparedStatement insertStatement = connection.prepareStatement(insertQuery)) { insertStatement.setLong(1, id); insertStatement.setString(2, owner); @@ -183,6 +183,7 @@ private void createTable(Connection connection) { String createTableQuery = createTemplate.replaceAll("TABLENAME", this.connectionProperties.get(TABLE_NAME_PROPERTY)); + try (Statement createStatement = connection.createStatement()) { createStatement.executeUpdate(createTableQuery); LOGGER.info("Table {} has been created", this.connectionProperties.get(TABLE_NAME_PROPERTY)); diff --git a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/MerlotLogRecorderFileExplorer.java b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/MerlotLogRecorderFileExplorer.java index 4d1a16213..50f93947e 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/MerlotLogRecorderFileExplorer.java +++ b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/core/MerlotLogRecorderFileExplorer.java @@ -27,20 +27,25 @@ public class MerlotLogRecorderFileExplorer { - private final static String MERLOT_DATA_DIRECTORY = "karaf.data"; - private MerlotLogRecorderFileExplorer() { + } public static File findFileByFilename(String searchTerm, BundleContext ctx) { + + String fullDirPath = System.getenv("MERLOT_OLOG_ATTACHMENT"); + + if (fullDirPath == null || fullDirPath.trim().isEmpty()) { + return null; + } + - String karafDataDir = ctx.getProperty(MERLOT_DATA_DIRECTORY); - //Search the data/tmp directory in Karaf - Path fileTarget = Paths.get(karafDataDir, "tmp", searchTerm); + Path fileTarget = Paths.get(fullDirPath, searchTerm); if (Files.exists(fileTarget) && Files.isRegularFile(fileTarget)) { return fileTarget.toFile(); } + return null; } diff --git a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderLogMultipart.java b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderLogMultipart.java index cba9618c0..b233f3cc7 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderLogMultipart.java +++ b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderLogMultipart.java @@ -22,6 +22,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Map; import java.util.Random; import javax.security.auth.login.LoginException; import javax.servlet.ServletException; @@ -75,11 +76,10 @@ private void processMultipart(HttpServletRequest req, HttpServletResponse resp //Getting the application sections for (Part part : req.getParts()) { - String directoryPath = "data/tmp"; + String directoryPath = System.getenv("MERLOT_OLOG_ATTACHMENT"); String fileName = part.getSubmittedFileName(); if (part.getContentType().equals("application/json")) { -// String json = new String(part.getInputStream().readAllBytes()); try (InputStream is = part.getInputStream()) { JsonNode node = mapper.readTree(is); @@ -220,4 +220,6 @@ public String extractJSONData(JsonNode n, String nodeName) { return dataResult; } + + } diff --git a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderSearch.java b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderSearch.java index 51af03294..28d5cb449 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderSearch.java +++ b/plc4j/tools/merlot/org.apache.plc4x.logrecorder/src/main/java/org/apache/plc4x/merlot/logrecorder/servlets/MerlotLogRecorderSearch.java @@ -83,7 +83,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se JSONObject log = new JSONObject(); log.put("id", dataLog.getId()); log.put("owner", dataLog.getOwner()); - log.put("source", "source");//TODO: This is where the machine's parameters should be listed—the machine that generated the log—but Phoebus doesn't send them. + log.put("source", dataLog.getDescription()); log.put("level", dataLog.getLevel()); log.put("title", dataLog.getTitle()); log.put("createdDate", dataLog.getCreatedDate()); @@ -330,8 +330,7 @@ private void addBetweenFilter(StringBuilder sql, List params, } } - - public String mappingTypeToMIMEHTTP(String paramType) { + public String mappingTypeToMIMEHTTP(String paramType) { String extension = paramType.substring(paramType.lastIndexOf(".") + 1); String extensionFinal = null; diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotDataBrowserIoTDBGetDataPVImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotDataBrowserIoTDBGetDataPVImpl.java index 6b061d6ba..36eb9c483 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotDataBrowserIoTDBGetDataPVImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotDataBrowserIoTDBGetDataPVImpl.java @@ -16,12 +16,10 @@ */ package org.apache.plc4x.merlot.archiver.impl; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufUtil; -import io.netty.buffer.Unpooled; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -39,9 +37,11 @@ public class MerlotDataBrowserIoTDBGetDataPVImpl extends HttpServlet { private static final Logger LOGGER = LoggerFactory.getLogger(MerlotDataBrowserRTGetDataPVImpl.class); - private final Pattern opti_pattern = Pattern.compile("optimized_11520\\(([^)]+)\\)"); + private final Pattern opti_pattern = Pattern.compile("optimized_\\w+\\(([^)]+)\\)"); + private final Pattern ncount_pattern = Pattern.compile("ncount\\(([^)]+)\\)"); - private final Pattern count_pattern = Pattern.compile("count_3600\\(([^)]+)\\)"); + + private final Pattern count_pattern = Pattern.compile("count_\\w+\\(([^)]+)\\)"); private Matcher opti_matcher = null; private Matcher ncount_matcher = null; @@ -55,58 +55,70 @@ public MerlotDataBrowserIoTDBGetDataPVImpl(MerlotHtc mhtc) { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - - String from = req.getParameter("from"); String to = req.getParameter("to"); String[] pvs = req.getParameterValues("pv"); - - - + LOGGER.info("Inicio Servlet."); - if ((null == from) || (null == to)) { + if (from == null || to == null) { + resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing 'from' or 'to'"); return; } - if ((null == pvs) || (pvs.length == 0)) { + if (pvs == null || pvs.length == 0) { + resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing 'pv' parameter"); return; } - resp.setContentType("application/octet-stream"); - for (String pv : pvs) { - opti_matcher = opti_pattern.matcher(pv); - ncount_matcher = ncount_pattern.matcher(pv); - count_matcher = count_pattern.matcher(pv); + if (pvs.length > 1) { + resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Multiple PVs not supported"); + return; + } + + String pv = pvs[0]; + + opti_matcher = opti_pattern.matcher(pv); + ncount_matcher = ncount_pattern.matcher(pv); + count_matcher = count_pattern.matcher(pv); + resp.setContentType("application/octet-stream"); + try (OutputStream out = resp.getOutputStream()) { if (opti_matcher.matches()) { - LOGGER.info("optimized_11520(pv) not supported."); + resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, "optimized_* not supported"); + return; } else if (ncount_matcher.matches()) { String strpv = ncount_matcher.group(1); int countpv = mhtc.countPVs(strpv, from, to); - LOGGER.info("Number of events: " + countpv); - resp.getWriter().print(countpv); - resp.getWriter().close(); + byte[] bytes = Integer.toString(countpv).getBytes(StandardCharsets.UTF_8); + resp.setContentType("text/plain; charset=utf-8"); + resp.setContentLength(bytes.length); + out.write(bytes); + out.flush(); + return; } else if (count_matcher.matches()) { - LOGGER.info("count_3600(pv) not supported."); - resp.getWriter().close(); + resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, "count_* not supported"); + return; } else { - createRawResponse(pv, from, to, resp.getOutputStream(), resp); - resp.getOutputStream().close(); + boolean ok = createRawResponse(pv, from, to, out, resp); + if (!ok) { + return; + } + out.flush(); } } - } - private void createRawResponse(String pv, String from, String to, OutputStream out, HttpServletResponse resp) throws IOException { - + private boolean createRawResponse(String pv, String from, String to, OutputStream out, HttpServletResponse resp) throws IOException { List values = mhtc.getPVs(pv, from, to); if (values == null) { - out.close(); + resp.sendError(HttpServletResponse.SC_NOT_FOUND, "No values for pv: " + pv); + return false; } ByteArrayOutputStream bout = new ByteArrayOutputStream(); MerlotPBRawSerializer.serializeIoTDBToPBRaw(values, pv, bout); - ByteBuf buf = Unpooled.wrappedBuffer(bout.toByteArray()); -// System.out.println(ByteBufUtil.prettyHexDump(buf)); - out.write(bout.toByteArray()); + byte[] payload = bout.toByteArray(); + resp.setContentType("application/octet-stream"); + out.write(payload); + return true; } } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotHtcIoTDBImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotHtcIoTDBImpl.java index 70b0e95d2..88f979eb6 100755 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotHtcIoTDBImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/java/org/apache/plc4x/merlot/archiver/impl/MerlotHtcIoTDBImpl.java @@ -22,8 +22,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.iotdb.isession.pool.SessionDataSetWrapper; import org.apache.iotdb.pipe.api.type.Type; import org.apache.iotdb.rpc.IoTDBConnectionException; @@ -46,10 +44,6 @@ import org.osgi.service.cm.ManagedService; import org.slf4j.LoggerFactory; -/** - * - * @author cgarcia - */ public class MerlotHtcIoTDBImpl implements MerlotHtc, ManagedService { private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(MerlotHtcIoTDBImpl.class); @@ -77,15 +71,15 @@ public synchronized SessionPool getIoTDBConnection() throws IoTDBConnectionExcep } else { try { sp = new SessionPool.Builder() - .nodeUrls((new ArrayList<>(this.urls))) - .user(this.username) - .password(this.password) - .maxSize(this.maxThreadPool) - .enableAutoFetch(this.enableAutoFetch) - .build(); + .nodeUrls((new ArrayList<>(this.urls))) + .user(this.username) + .password(this.password) + .maxSize(this.maxThreadPool) + .enableAutoFetch(this.enableAutoFetch) + .build(); } catch (Exception e) { - System.out.println("Error: " + e.getMessage()); + LOGGER.info("Error: {}", e.getMessage()); } } return null; @@ -124,8 +118,7 @@ public Set getPVs() { while (ds.hasNext()) { String fullPath = ds.next().getFields().get(0).getStringValue(); - - pvs.add(fullPath.replaceFirst("^[^.]+\\.(.*)", "$1")); + pvs.add(String.format("pva://%s", fullPath.replaceFirst("^[^.]+\\.(.*)", "$1").replaceAll("\\.(?![^.]*$)", "/"))); } } catch (Exception ex) { LOGGER.error("Error retrieving PVs from IoTDB: {}", ex.getMessage()); @@ -137,15 +130,21 @@ public Set getPVs() { @Override public List getPVs(String strPV, String init, String end) { List listResult = new ArrayList<>(5000); + try { - String device = getBasePath(strPV); - String measurement = getTimeserieNameSimple(strPV); + String adjusmentVariable = strPV.replaceFirst("^pva://", "").replaceAll("/", "."); + String device = getBasePath(adjusmentVariable); + String measurement = getTimeserieNameSimple(adjusmentVariable); long startT = Instant.parse(init).toEpochMilli(); long endT = Instant.parse(end).toEpochMilli(); + if (startT == endT) { + startT = endT - (60 * 1000); + } + String sql = String.format("SELECT %s FROM root.%s WHERE time >= %d AND time <= %d", - measurement, device, startT, endT); + measurement, device, startT, endT); SessionPool pool = getIoTDBConnection(); if (pool == null) { @@ -166,7 +165,7 @@ public List getPVs(String strPV, String init, String end) { Instant inst = Instant.ofEpochMilli(timestamp); MerlotIoTDBMapping.EpicsMetadata meta - = new MerlotIoTDBMapping.EpicsMetadata((int) inst.getEpochSecond(), inst.getNano(), 0, 0); + = new MerlotIoTDBMapping.EpicsMetadata((int) inst.getEpochSecond(), inst.getNano(), 0, 0); Object epicsEvent = mapper.convert(field.getObjectValue(field.getDataType()), meta); translateToScalarType(inst, epicsEvent, listResult); @@ -180,6 +179,7 @@ public List getPVs(String strPV, String init, String end) { return listResult; } + //TODO: Mover esto a MerlotIoTDBMapping.java private static List translateToScalarType(Instant inst, Object epicsEvent, List listEvents) { // --- CONVERSION BASED STRICTLY ON MerlotIoTDBMapping --- @@ -211,7 +211,7 @@ private static List translateToScalarType(Instant inst, Object epicsEvent @Override public int countPVs(String strPV, String init, - String end + String end ) { return 0; @@ -221,14 +221,10 @@ public int countPVs(String strPV, String init, Returns the variable stored in the IoTDB device (pvName) */ private static String getTimeserieNameSimple(String pvName) { - Pattern pattern = Pattern.compile("[^.]+$"); - Matcher matcher = pattern.matcher(pvName); - - if (matcher.find()) { - return matcher.group(); + if (pvName == null || pvName.isEmpty()) { + return ""; } - - return ""; + return pvName.replaceFirst("^.*\\.", ""); } /* @@ -238,7 +234,7 @@ public static String getBasePath(String pvName) { if (pvName == null || pvName.isEmpty()) { return ""; } - return pvName.replaceFirst("^(?:root\\.)?(.*)\\.[^.]+$", "$1"); + return pvName.replaceFirst("\\.[^.]*$", ""); } public void updated(Dictionary properties) throws ConfigurationException { diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/resources/OSGI-INF/blueprint/archiver-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/resources/OSGI-INF/blueprint/archiver-service.xml index 8114b74dd..50c76a92f 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/resources/OSGI-INF/blueprint/archiver-service.xml +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/src/main/resources/OSGI-INF/blueprint/archiver-service.xml @@ -19,278 +19,282 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd" - xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" + xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" default-activation="eager"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + merlot/* + phoebus/* + iotdb/* + decanter/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - merlot/* - phoebus/* - iotdb/* - decanter/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java index b4fa6f001..75528404a 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7DBWriterHandlerImpl.java @@ -120,9 +120,6 @@ public void monitorEvent(Monitor monitor) { i++; } LOGGER.info("Usando el s7 writer"); -// LOGGER.info(structure.toString()); -// LOGGER.info(changedBitSet.toString()); -// LOGGER.info("Car: {}",changedBitSet.cardinality()); int index = changedBitSet.nextSetBit(0); //Bypass control variables. @@ -131,7 +128,6 @@ public void monitorEvent(Monitor monitor) { ByteBuf byteBuf = null; if (fields[index] instanceof PVScalar){ - //Capturo la informacion en un ByteBuf final PVField f = fields[index]; final PVScalar pvScalar = (PVScalar) fields[index]; byteBuf = Unpooled.buffer(Double.BYTES); @@ -187,10 +183,6 @@ public void monitorEvent(Monitor monitor) { } bitOffset = ((fieldOffsets.get(index) != null)?((Number)(Object)fieldOffsets.get(index).right).byteValue():(byte) -1); - //bitOffset = (fieldOffsets.get(index) != null) ? ((Number)(Object)fieldOffsets.get(index).right).byteValue() : (byte) -1; - System.out.println("Buffer: "+byteBuf); - System.out.println("Byte: "+byteOffset); - System.out.println("Bit: "+bitOffset); if (optPlcItem.isPresent()) { optPlcItem.get().itemWrite(byteBuf, byteOffset, bitOffset); } diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml index 0bf6fce88..91927c8d4 100755 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml @@ -1249,7 +1249,7 @@ mvn:com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.12.3 mvn:org.apache.plc4x/org.apache.plc4x.logrecorder/${project.version} mvn:org.apache.plc4x/org.apache.plc4x.logrecorder/${project.version}/cfg - mvn:org.apache.plc4x/org.apache.plc4x.logrecorder/${project.version}/cfg + mvn:org.apache.plc4x/org.apache.plc4x.logrecorder/${project.version}/cfg2 \ No newline at end of file diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot/pom.xml index 0822177ea..54e8e224c 100644 --- a/plc4j/tools/merlot/org.apache.plc4x.merlot/pom.xml +++ b/plc4j/tools/merlot/org.apache.plc4x.merlot/pom.xml @@ -224,9 +224,11 @@ decanter-common decanter-collector-log jdbc + pax-jdbc + pax-jdbc-spec pax-jdbc-h2 - pax-jdbc-pool-hikaricp - + pax-jdbc-postgresql + pax-jdbc-pool-hikaricp --> 11 diff --git a/plc4j/tools/merlot/pom.xml b/plc4j/tools/merlot/pom.xml index 348c071d9..f4ead640d 100644 --- a/plc4j/tools/merlot/pom.xml +++ b/plc4j/tools/merlot/pom.xml @@ -18,264 +18,260 @@ specific language governing permissions and limitations under the License. --> - 4.0.0 - - - - - - - org.apache.plc4x - merlot - 0.13.0-SNAPSHOT - pom - PLC4J: Integrations: Apache Karaf - Integration module for integrating PLC4X into Apache Karaf. - - - - gitlab-maven-antlr4 - http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven - - - - - - - gitlab-maven-antlr4 - http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven - - - - - - - UTF-8 - 21 - 5.1.9 - 3.11.0 - 3.5.2 - 3.4.0 - 3.3.1 - 3.1.3 - 3.1.3 - 3.1.3 - - - 0.13.1 - 2.20.0 - 1.4.3 - 0.9.5.5 - 1.19.0 - 4.5.0 - 3.12.0 - 3.20.0 - 2.21.0 - 2.7.9 - 4.1.104.Final - 2.3.2 - 2.0.17 - 1.3.6 - 2.19.0 - 2.3.3 - 0.1.8 - 0.10.4 - 1.5.3 - 1.3.7 - 9.6 - 2.38.0 - 3.1.6 - - 1.11 - 1.22 - 1.2.5 - 4.0.1 - - - 10.14.2.0 - 2.3.232 - 3.46.1.0 - - - 3.0.3 - - - 4.4.11 - 2.10.0 - 6.0.0 - 8.0.0 - 7.0.0 - 5.0.0 - 8.1.0 - 1.1.0 - 1.0.2 - 1.6.1 - 1.4.1 - 4.0.0 - 3.5.3 - - - 20251224 - 1.18.46 - 2.21.1 - 2.1.3 - - - - 4.13.2 - 6.0.3 - 6.0.3 - 7.34.3 - 7.34.3 - 5.23.0 - 5.2.0 - 5.23.0 - 3.13.2 - 1.1.0 - 1.3.0 - - - 3.2.5 - 3.9.2 - - - 3.9.2 - - 7.0.9 - 1.0.8 - 1.0.7 - 2.9.0 - 1.0.7 - 0.3.8 - 2.4.8 - - 5.1.9 - 4.3.2 - - 6.1.9 - 4.3.1 - - 1.0.8 - - 1.0.8 - - 1.0.8 - - 1.0.8 - - 1.0.8 - - 1.0.8 + 4.0.0 + + + + + + + org.apache.plc4x + merlot + 0.13.0-SNAPSHOT + pom + PLC4J: Integrations: Apache Karaf + Integration module for integrating PLC4X into Apache Karaf. + + + + gitlab-maven-antlr4 + http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven + + + + + + gitlab-maven-antlr4 + http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven + + + + + + + UTF-8 + 21 + 5.1.9 + 3.11.0 + 3.5.2 + 3.4.0 + 3.3.1 + 3.1.3 + 3.1.3 + 3.1.3 + + + 0.13.1 + 2.20.0 + 1.4.3 + 0.9.5.5 + 1.19.0 + 4.5.0 + 3.12.0 + 3.20.0 + 2.21.0 + 2.7.9 + 4.1.104.Final + 2.3.2 + 2.0.17 + 1.3.6 + 2.19.0 + 2.3.3 + 0.1.8 + 0.10.4 + 1.5.3 + 1.3.7 + 9.6 + 2.38.0 + 3.1.6 + 1.11 + 1.22 + 1.2.5 + 4.0.1 + + + 10.14.2.0 + 2.3.232 + 3.46.1.0 + + + 3.0.3 + + + 4.4.11 + 2.10.0 + 6.0.0 + 8.0.0 + 7.0.0 + 5.0.0 + 8.1.0 + 1.1.0 + 1.0.2 + 1.6.1 + 1.4.1 + 4.0.0 + 3.5.3 + + + 20251224 + 1.18.46 + 2.21.1 + 2.1.3 + + + + 4.13.2 + 6.0.3 + 6.0.3 + 7.34.3 + 7.34.3 + 5.23.0 + 5.2.0 + 5.23.0 + 3.13.2 + 1.1.0 + 1.3.0 + + + 3.2.5 + 3.9.2 + + + 3.9.2 + + 7.0.9 + 1.0.8 + 1.0.7 + 2.9.0 + 1.0.7 + 0.3.8 + 2.4.8 + + 5.1.11-SNAPSHOT + 4.3.2 + + 6.1.11-SNAPSHOT + 4.3.1 + + 1.0.10-SNAPSHOT + + 1.0.9 + + 1.0.10-SNAPSHOT + + 1.0.10-SNAPSHOT + + 1.0.10-SNAPSHOT + + 1.0.10-SNAPSHOT - - 4.31.1 - 3.1.0 - 2.58.0 - 1.62.2 - 32.1.3-android - 2.23.0 - 6.0.53 - 1.0.1 - 2.8 - 3.0.2 - 3.9.0 - 6.0.53 - 13.0 - 1.9.21 + + 4.31.1 + 3.1.0 + 2.58.0 + 1.62.2 + 32.1.3-android + 2.23.0 + 6.0.53 + 1.0.1 + 2.8 + 3.0.2 + 3.9.0 + 6.0.53 + 13.0 + 1.9.21 - - 2.0.7 - 2.2.1 - 1.3.0 - 0.13.0 - + + 2.0.7 + 2.2.1 + 1.3.0 + 0.13.0 + - + - org.apache.plc4x.merlot.modbus.dev + org.apache.plc4x.merlot.modbus.dev - org.apache.plc4x.merlot.modbus.svr + org.apache.plc4x.merlot.modbus.svr - org.apache.plc4x.merlot.scheduler + org.apache.plc4x.merlot.scheduler - org.apache.plc4x.merlot.branding + org.apache.plc4x.merlot.branding - org.apache.plc4x.merlot.uns + org.apache.plc4x.merlot.uns - org.apache.plc4x.merlot.features + org.apache.plc4x.merlot.features - org.apache.plc4x.merlot.das + org.apache.plc4x.merlot.das - org.apache.plc4x.logrecorder - org.apache.plc4x.merlot.modbus.sim + org.apache.plc4x.logrecorder + org.apache.plc4x.merlot.modbus.sim - org.apache.plc4x.merlot.db + org.apache.plc4x.merlot.db - org.apache.plc4x.merlot.das.api + org.apache.plc4x.merlot.das.api - org.apache.plc4x.merlot.derby + org.apache.plc4x.merlot.derby - org.apache.plc4x.merlot.h2 + org.apache.plc4x.merlot.h2 - org.apache.plc4x.merlot.drv.simulated + org.apache.plc4x.merlot.drv.simulated - org.apache.plc4x.merlot.das.ref + org.apache.plc4x.merlot.das.ref - org.apache.plc4x.merlot.grpc + org.apache.plc4x.merlot.grpc - + - org.apache.plc4x.merlot.drv.s7 + org.apache.plc4x.merlot.drv.s7 - org.apache.plc4x.merlot.drv.mb + org.apache.plc4x.merlot.drv.mb - org.apache.plc4x.merlot.archiver + org.apache.plc4x.merlot.archiver - org.apache.plc4x.merlot.kafka - org.apache.plc4x.merlot + org.apache.plc4x.merlot.kafka + org.apache.plc4x.merlot - + +