Skip to content

Commit

Permalink
fix(plc4j/profinet): Fixed issue with endianess - still need to speci…
Browse files Browse the repository at this point in the history
…fy the rest
  • Loading branch information
hutcheb committed Feb 7, 2023
1 parent b364514 commit 0900b34
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 48 deletions.
Expand Up @@ -63,15 +63,24 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
writeBuffer.pushContext("PnIoCm_ModuleDiffBlockApi");

// Const Field (api)
writeConstField("api", API, writeUnsignedLong(writeBuffer, 32));
writeConstField(
"api",
API,
writeUnsignedLong(writeBuffer, 32),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Implicit Field (numModules) (Used for parsing, but its value is not stored as it's implicitly
// given by the objects content)
int numModules = (int) (COUNT(getModules()));
writeImplicitField("numModules", numModules, writeUnsignedInt(writeBuffer, 16));
writeImplicitField(
"numModules",
numModules,
writeUnsignedInt(writeBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Array Field (modules)
writeComplexTypeArrayField("modules", modules, writeBuffer);
writeComplexTypeArrayField(
"modules", modules, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

writeBuffer.popContext("PnIoCm_ModuleDiffBlockApi");
}
Expand Down Expand Up @@ -119,16 +128,25 @@ public static PnIoCm_ModuleDiffBlockApi staticParse(ReadBuffer readBuffer) throw
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();

long api =
readConstField("api", readUnsignedLong(readBuffer, 32), PnIoCm_ModuleDiffBlockApi.API);

int numModules = readImplicitField("numModules", readUnsignedInt(readBuffer, 16));
readConstField(
"api",
readUnsignedLong(readBuffer, 32),
PnIoCm_ModuleDiffBlockApi.API,
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

int numModules =
readImplicitField(
"numModules",
readUnsignedInt(readBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

List<PnIoCm_ModuleDiffBlockApi_Module> modules =
readCountArrayField(
"modules",
new DataReaderComplexDefault<>(
() -> PnIoCm_ModuleDiffBlockApi_Module.staticParse(readBuffer), readBuffer),
numModules);
numModules,
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

readBuffer.closeContext("PnIoCm_ModuleDiffBlockApi");
// Create the instance
Expand Down
Expand Up @@ -78,10 +78,18 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
writeBuffer.pushContext("PnIoCm_ModuleDiffBlockApi_Module");

// Simple Field (slotNumber)
writeSimpleField("slotNumber", slotNumber, writeUnsignedInt(writeBuffer, 16));
writeSimpleField(
"slotNumber",
slotNumber,
writeUnsignedInt(writeBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (moduleIdentNumber)
writeSimpleField("moduleIdentNumber", moduleIdentNumber, writeUnsignedLong(writeBuffer, 32));
writeSimpleField(
"moduleIdentNumber",
moduleIdentNumber,
writeUnsignedLong(writeBuffer, 32),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (moduleState)
writeSimpleEnumField(
Expand All @@ -91,15 +99,21 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
new DataWriterEnumDefault<>(
PnIoCm_ModuleState::getValue,
PnIoCm_ModuleState::name,
writeUnsignedInt(writeBuffer, 16)));
writeUnsignedInt(writeBuffer, 16)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Implicit Field (numSubmodules) (Used for parsing, but its value is not stored as it's
// implicitly given by the objects content)
int numSubmodules = (int) (COUNT(getSubmodules()));
writeImplicitField("numSubmodules", numSubmodules, writeUnsignedInt(writeBuffer, 16));
writeImplicitField(
"numSubmodules",
numSubmodules,
writeUnsignedInt(writeBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Array Field (submodules)
writeComplexTypeArrayField("submodules", submodules, writeBuffer);
writeComplexTypeArrayField(
"submodules", submodules, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

writeBuffer.popContext("PnIoCm_ModuleDiffBlockApi_Module");
}
Expand Down Expand Up @@ -153,25 +167,39 @@ public static PnIoCm_ModuleDiffBlockApi_Module staticParse(ReadBuffer readBuffer
int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();

int slotNumber = readSimpleField("slotNumber", readUnsignedInt(readBuffer, 16));
int slotNumber =
readSimpleField(
"slotNumber",
readUnsignedInt(readBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

long moduleIdentNumber = readSimpleField("moduleIdentNumber", readUnsignedLong(readBuffer, 32));
long moduleIdentNumber =
readSimpleField(
"moduleIdentNumber",
readUnsignedLong(readBuffer, 32),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

PnIoCm_ModuleState moduleState =
readEnumField(
"moduleState",
"PnIoCm_ModuleState",
new DataReaderEnumDefault<>(
PnIoCm_ModuleState::enumForValue, readUnsignedInt(readBuffer, 16)));
PnIoCm_ModuleState::enumForValue, readUnsignedInt(readBuffer, 16)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

int numSubmodules = readImplicitField("numSubmodules", readUnsignedInt(readBuffer, 16));
int numSubmodules =
readImplicitField(
"numSubmodules",
readUnsignedInt(readBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

List<PnIoCm_ModuleDiffBlockApi_Submodule> submodules =
readCountArrayField(
"submodules",
new DataReaderComplexDefault<>(
() -> PnIoCm_ModuleDiffBlockApi_Submodule.staticParse(readBuffer), readBuffer),
numSubmodules);
numSubmodules,
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

readBuffer.closeContext("PnIoCm_ModuleDiffBlockApi_Module");
// Create the instance
Expand Down
Expand Up @@ -120,50 +120,80 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
writeBuffer.pushContext("PnIoCm_ModuleDiffBlockApi_Submodule");

// Simple Field (subslotNumber)
writeSimpleField("subslotNumber", subslotNumber, writeUnsignedInt(writeBuffer, 16));
writeSimpleField(
"subslotNumber",
subslotNumber,
writeUnsignedInt(writeBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (submoduleIdentNumber)
writeSimpleField(
"submoduleIdentNumber", submoduleIdentNumber, writeUnsignedLong(writeBuffer, 32));
"submoduleIdentNumber",
submoduleIdentNumber,
writeUnsignedLong(writeBuffer, 32),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (codingUsesIdentInfo)
writeSimpleField("codingUsesIdentInfo", codingUsesIdentInfo, writeBoolean(writeBuffer));
writeSimpleField(
"codingUsesIdentInfo",
codingUsesIdentInfo,
writeBoolean(writeBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (identInfo)
writeSimpleEnumField(
"identInfo",
"PnIoCm_IdentInfo",
identInfo,
new DataWriterEnumDefault<>(
PnIoCm_IdentInfo::getValue, PnIoCm_IdentInfo::name, writeUnsignedByte(writeBuffer, 4)));
PnIoCm_IdentInfo::getValue, PnIoCm_IdentInfo::name, writeUnsignedByte(writeBuffer, 4)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (arInfo)
writeSimpleEnumField(
"arInfo",
"PnIoCm_ArInfo",
arInfo,
new DataWriterEnumDefault<>(
PnIoCm_ArInfo::getValue, PnIoCm_ArInfo::name, writeUnsignedByte(writeBuffer, 4)));
PnIoCm_ArInfo::getValue, PnIoCm_ArInfo::name, writeUnsignedByte(writeBuffer, 4)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (diagInfoAvailable)
writeSimpleField("diagInfoAvailable", diagInfoAvailable, writeBoolean(writeBuffer));
writeSimpleField(
"diagInfoAvailable",
diagInfoAvailable,
writeBoolean(writeBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (maintenanceDemanded)
writeSimpleField("maintenanceDemanded", maintenanceDemanded, writeBoolean(writeBuffer));
writeSimpleField(
"maintenanceDemanded",
maintenanceDemanded,
writeBoolean(writeBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (maintenanceRequired)
writeSimpleField("maintenanceRequired", maintenanceRequired, writeBoolean(writeBuffer));
writeSimpleField(
"maintenanceRequired",
maintenanceRequired,
writeBoolean(writeBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (qualifiedInfo)
writeSimpleField("qualifiedInfo", qualifiedInfo, writeBoolean(writeBuffer));
writeSimpleField(
"qualifiedInfo",
qualifiedInfo,
writeBoolean(writeBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

// Simple Field (addInfo)
writeSimpleEnumField(
"addInfo",
"PnIoCm_AddInfo",
addInfo,
new DataWriterEnumDefault<>(
PnIoCm_AddInfo::getValue, PnIoCm_AddInfo::name, writeUnsignedByte(writeBuffer, 3)));
PnIoCm_AddInfo::getValue, PnIoCm_AddInfo::name, writeUnsignedByte(writeBuffer, 3)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

writeBuffer.popContext("PnIoCm_ModuleDiffBlockApi_Submodule");
}
Expand Down Expand Up @@ -226,41 +256,71 @@ public static PnIoCm_ModuleDiffBlockApi_Submodule staticParse(ReadBuffer readBuf
int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();

int subslotNumber = readSimpleField("subslotNumber", readUnsignedInt(readBuffer, 16));
int subslotNumber =
readSimpleField(
"subslotNumber",
readUnsignedInt(readBuffer, 16),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

long submoduleIdentNumber =
readSimpleField("submoduleIdentNumber", readUnsignedLong(readBuffer, 32));
readSimpleField(
"submoduleIdentNumber",
readUnsignedLong(readBuffer, 32),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

boolean codingUsesIdentInfo = readSimpleField("codingUsesIdentInfo", readBoolean(readBuffer));
boolean codingUsesIdentInfo =
readSimpleField(
"codingUsesIdentInfo",
readBoolean(readBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

PnIoCm_IdentInfo identInfo =
readEnumField(
"identInfo",
"PnIoCm_IdentInfo",
new DataReaderEnumDefault<>(
PnIoCm_IdentInfo::enumForValue, readUnsignedByte(readBuffer, 4)));
PnIoCm_IdentInfo::enumForValue, readUnsignedByte(readBuffer, 4)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

PnIoCm_ArInfo arInfo =
readEnumField(
"arInfo",
"PnIoCm_ArInfo",
new DataReaderEnumDefault<>(
PnIoCm_ArInfo::enumForValue, readUnsignedByte(readBuffer, 4)));

boolean diagInfoAvailable = readSimpleField("diagInfoAvailable", readBoolean(readBuffer));

boolean maintenanceDemanded = readSimpleField("maintenanceDemanded", readBoolean(readBuffer));

boolean maintenanceRequired = readSimpleField("maintenanceRequired", readBoolean(readBuffer));

boolean qualifiedInfo = readSimpleField("qualifiedInfo", readBoolean(readBuffer));
PnIoCm_ArInfo::enumForValue, readUnsignedByte(readBuffer, 4)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

boolean diagInfoAvailable =
readSimpleField(
"diagInfoAvailable",
readBoolean(readBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

boolean maintenanceDemanded =
readSimpleField(
"maintenanceDemanded",
readBoolean(readBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

boolean maintenanceRequired =
readSimpleField(
"maintenanceRequired",
readBoolean(readBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

boolean qualifiedInfo =
readSimpleField(
"qualifiedInfo",
readBoolean(readBuffer),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

PnIoCm_AddInfo addInfo =
readEnumField(
"addInfo",
"PnIoCm_AddInfo",
new DataReaderEnumDefault<>(
PnIoCm_AddInfo::enumForValue, readUnsignedByte(readBuffer, 3)));
PnIoCm_AddInfo::enumForValue, readUnsignedByte(readBuffer, 3)),
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));

readBuffer.closeContext("PnIoCm_ModuleDiffBlockApi_Submodule");
// Create the instance
Expand Down
Expand Up @@ -349,6 +349,9 @@ public void handleRealTimeResponse(PnDcp_Pdu_RealTimeCyclic cyclicPdu) {
ReadBuffer buffer = new ReadBufferByteBased(cyclicPdu.getDataUnit().getData());

try {
if (deviceContext.getModules() == null) {
logger.error("HH");
}
for (ProfinetModule module : deviceContext.getModules()) {
module.parseTags(tags, deviceContext.getDeviceName(), buffer);
}
Expand Down
Expand Up @@ -275,8 +275,8 @@ public List<PlcBrowseItem> browseTags(List<PlcBrowseItem> browseItems, String ad
for (ProfinetIoDataInput input : virtual.getIoData().getInput()) {
for (ProfinetDataItem item : input.getDataItemList()) {
if (item.isUseAsBits()) {
for (ProfinetBitDataItem bitItem : item.getBitDataItem()) {
String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + bitItem.getBitOffset();
for (int i = 0; i < ProfinetDataType.firstEnumForFieldConversion(item.getDataType().toUpperCase()).getDataTypeSize() * 8; i++) {
String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + i;
browseItems.add(new DefaultPlcBrowseItem(ProfinetTag.of(tagName + ":BOOL"), tagName, false, false, true, new HashMap<>(), options));
}
} else {
Expand Down Expand Up @@ -318,8 +318,8 @@ public Map<String, ResponseItem<PlcValue>> parseTags(Map<String, ResponseItem<Pl
for (ProfinetIoDataInput input : virtual.getIoData().getInput()) {
for (ProfinetDataItem item : input.getDataItemList()) {
if (item.isUseAsBits()) {
for (ProfinetBitDataItem bitItem : item.getBitDataItem()) {
String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + bitItem.getBitOffset();
for (int i = 0; i < ProfinetDataType.firstEnumForFieldConversion(item.getDataType().toUpperCase()).getDataTypeSize() * 8; i++) {
String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + i;
tags.put(tagName, new ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer, ProfinetDataType.BOOL, 1)));
}
} else {
Expand Down
Expand Up @@ -1122,21 +1122,21 @@
[array PnIoCm_Submodule submodules count 'numSubmodules']
]
[type PnIoCm_ModuleDiffBlockApi
[type PnIoCm_ModuleDiffBlockApi byteOrder='BIG_ENDIAN'
[const uint 32 api 0x00000000 ]
[implicit uint 16 numModules 'COUNT(modules)' ]
[array PnIoCm_ModuleDiffBlockApi_Module modules count 'numModules']
]
[type PnIoCm_ModuleDiffBlockApi_Module
[type PnIoCm_ModuleDiffBlockApi_Module byteOrder='BIG_ENDIAN'
[simple uint 16 slotNumber ]
[simple uint 32 moduleIdentNumber ]
[simple PnIoCm_ModuleState moduleState ]
[implicit uint 16 numSubmodules 'COUNT(submodules)' ]
[array PnIoCm_ModuleDiffBlockApi_Submodule submodules count 'numSubmodules']
]
[type PnIoCm_ModuleDiffBlockApi_Submodule
[type PnIoCm_ModuleDiffBlockApi_Submodule byteOrder='BIG_ENDIAN'
[simple uint 16 subslotNumber ]
[simple uint 32 submoduleIdentNumber]
[simple bit codingUsesIdentInfo ]
Expand Down

0 comments on commit 0900b34

Please sign in to comment.