Post by brouwyka on JSONByteArrayWriter string result incorrect order
CODESYS Forge
talk
(Post)
Hello everybody! We are currently working on implementing a call to an API that tracks data sent to it through a JSON body. Versions: CODESYS V3.5 SP19 Patch 7 using IIOT Libraries SL license, specifically JSON Utilities SL version 1.13.0.0. For simplicity, let's say we want to construct the following JSON body for our request (simplified to just 1 key-value pair in each of the array objects to keep things shorter, but we'd have multiple fields in each in reality): { "id": "machine_1", "readings": [ { "temp_mid": 153.8 }, { "temp_mid": 98.3 } ], "status": "RUNNING" } However, our "readings" data is added over time, not in creation, so calls to the builder would be somewhat out of order. In a simplified manner, our calls would look like this: jsonBuilder(pJsonData := JsonData, diRootObj => rootJsonIndex); // rootJsonIndex = 0. // Set "id" at root JSON object. wsValue := "machine_1"; jsonBuilder.SetKeyWithValue("id", wsValue, diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 0 & diIndex = 1, VALUE: diParentIndex = 1 & diIndex = 2. // ... Time passes, we get our first reading to add ... // The "readings" array does not exist yet, so we make it first at root JSON object before adding our first reading. readingsJsonArrayIndex := jsonBuilder.SetKeyWithArray("readings", diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 0 & diIndex = 3, VALUE: diParentIndex = 3 & diIndex = 4. // Then add the first reading, for which we first have to make an object. readingsJsonArrayObjectIndex := jsonBuilder.SetObject(diParentIndex := readingsJsonArrayIndex); // JSONData OBJECT: diParentIndex = 4 & diIndex = 5. // And then we add the field(s) in the object for the first reading. // NOTE the use of `readingsJsonArrayObjectIndex` so we set the field(s) in the first object in the array. rValue := 153.8; jsonBuilder.SetKeyWithValue("temp_mid", wsValue, diParentIndex := readingsJsonArrayObjectIndex); // JSONData KEY: diParentIndex = 5 & diIndex = 6, VALUE: diParentIndex = 6 & diIndex = 7. // ... Time passes, we want to add another root-JSON-level field ... // Set "status" at root JSON object. wsValue := "RUNNING"; jsonBuilder.SetKeyWithValue("status", wsValue, diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 0 & diIndex = 8, VALUE: diParentIndex = 8 & diIndex = 9. // ... Time passes, we want to add a second reading ... // "readings" array exists, so add the second reading, but first we have to make another object. // NOTE the re-use of the earlier stored `readingsJsonArrayIndex`, so we add the new object to that previously created array. readingsJsonArrayObjectIndex := jsonBuilder.SetObject(diParentIndex := readingsJsonArrayIndex); // JSONData OBJECT: diParentIndex = 4 & diIndex = 10. // And then we add the field(s) in the object for the first reading. // NOTE the use of `readingsJsonArrayObjectIndex` so we set the field(s) in the SECOND(, new) object in the array. rValue := 98.3; jsonBuilder.SetKeyWithValue("temp_mid", wsValue, diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 10 & diIndex = 11, VALUE: diParentIndex = 11 & diIndex = 12. // ... Finally, we want to send to the API, so we must convert the builder to data the client accepts as a body ... xTestWriteToJsonArray := TRUE; jsonArrayWriter( xExecute := xTestWriteToJsonArray, pwData := ADR(jsonDataString), udiSize := SIZEOF(jsonDataString), jsonData := JsonData^ ); IF jsonArrayWriter.xDone THEN // The writer was successful, the `jsonDataString` VAR should now contain a WString copy of the JSON object from the builder. xTestWriteToJsonArray := FALSE; END_IF We see that the JsonData STRUCT is correctly organised (in terms of the diParentIndex & diIndex set by it for each JsonElement) as we expect, as outlined in my comments in the simplified code above. However, as soon as we pass it to the jsonArrayWriter (which is a JSON.JSONByteArrayWriter), the resulting jsonDataString does not match our expectations, instead coming out like this: { "id": "machine_1", "readings": [ { "temp_mid": 153.8 } ] } { "temp_mid": 98.3 } "status": "RUNNING" The behaviour of the JSONByteArrayWriter thus seems to be the problem here. It does not seem to correctly process the children of JsonElements that are ARRAYs when additions to them are done broken up by additions to the lower level JSON OBJECT they are a part of. We have confirmed this by changing the order of the calls in our example to add both readings before adding the "status", in which case we get our expected outcome. However, in reality this is not possible for us - additions to any of the JSON's objects, arrays or array objects may happen at any time after other fields elsewhere in the JSON have been added. Does anyone know a way around this, a fix, or knows a solution we simply have not found? This same phenomenon was also noted on this forum by user @ryusoup at the end of 2023 (https://forge.codesys.com/forge/talk/Engineering/thread/c45929e2f1/#e27f) and user @mtho in early 2024 (https://forge.codesys.com/forge/talk/Engineering/thread/cd1bb450db/#1292) but both topics received no activity beyond both users' opening posts. Looking through the release notes of all the versions of the JSON Utilities SL library, I also did not see any remarks on resolutions of bugs in this vain. Thanks in advance for the assistance!
Last updated: 2026-06-10
Post by brandonje on [Error] IoDrvEtherNetIP Library with Weintek
CODESYS Forge
talk
(Post)
I'm using weintek and Codesys V3.5 SP22 when I try to charge an ethernetIP device show me this error: ------ Build started: Application: Device.Application ------- Typify code... [ERROR] cip object, 4.9.0.0 (codesys): TCPIP_Interface: C0231: Expression of type 'BOOL' expected in this place [ERROR] cip object, 4.9.0.0 (codesys): TCPIP_Interface: C0077: Unknown type: '(_pPhysicalLink^._xLinkState <> CmpSysEthernet.OperStatus.SYSETH_OPERSTAT_Up)' [ERROR] cip object, 4.9.0.0 (codesys): TCPIP_Interface: C0077: Unknown type: 'CmpSysEthernet.OperStatus.SYSETH_OPERSTAT_Up' [ERROR] cip object, 4.9.0.0 (codesys): TCPIP_Interface: C0062: 'CmpSysEthernet.OperStatus' is no structured variable [ERROR] cip object, 4.9.0.0 (codesys): TCPIP_Interface: C0063: 'CMPSYSETHERNET, 3.4.3.0 (3S - SMART SOFTWARE SOLUTIONS GMBH)' contains no definition for 'OperStatus' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0046: Identifier '_diAdapterNumber' not defined [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: '_diAdapterNumber'' to type 'DINT' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: 'ADR(ethFrame.ethData)'' to type 'POINTER TO StructEthernetframe' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0077: Unknown type: 'ethFrame.ethData' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: 'ethFrame.udFrameLen'' to type 'ANY' [ERROR] cip object, 4.9.0.0 (codesys): SendEthFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): _OpenEthAdapter [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: '((driverInstance * 2) + 1)'' to type 'ANY' [ERROR] cip object, 4.9.0.0 (codesys): _OpenEthAdapter [TCPIP_Interface]: C0077: Unknown type: '(driverInstance * 2)' [ERROR] cip object, 4.9.0.0 (codesys): _OpenEthAdapter [TCPIP_Interface]: C0077: Unknown type: 'driverInstance' [ERROR] cip object, 4.9.0.0 (codesys): _OpenEthAdapter [TCPIP_Interface]: C0046: Identifier 'driverInstance' not defined [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0231: Expression of type 'BOOL' expected in this place [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'SIZEOF(ethFrame.ethData)' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'ethFrame.ethData' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0018: 'ethFrame.udFrameLen' is no valid assignment target [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: 'ADR(ethFrame.ethData)'' to type 'POINTER TO BYTE' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'ethFrame.ethData' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [TCPIP_Interface]: C0201: Type 'SysEthernetFrame' is not equal to type 'SysEthernetFrame' of VAR_IN_OUT respectively REFERENCE 'ethFrame' [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0046: Identifier 'ethClose' not defined [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0018: 'ethClose' is no valid assignment target [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0046: Identifier '_diAdapterNumber' not defined [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: '_diAdapterNumber'' to type 'DINT' [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0046: Identifier '_diAdapterNumber' not defined [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0018: '_diAdapterNumber' is no valid assignment target [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0046: Identifier '_stName' not defined [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0018: '_stName' is no valid assignment target [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0046: Identifier '_stDescription' not defined [ERROR] cip object, 4.9.0.0 (codesys): _CloseEthAdapter [TCPIP_Interface]: C0018: '_stDescription' is no valid assignment target [ERROR] cip object, 4.9.0.0 (codesys): AddressConflictDetection [TCPIP_Interface]: C0231: Expression of type 'BOOL' expected in this place [ERROR] cip object, 4.9.0.0 (codesys): AddressConflictDetection [TCPIP_Interface]: C0077: Unknown type: '(_pPhysicalLink^._xLinkState = CmpSysEthernet.OperStatus.SYSETH_OPERSTAT_Up)' [ERROR] cip object, 4.9.0.0 (codesys): AddressConflictDetection [TCPIP_Interface]: C0077: Unknown type: 'CmpSysEthernet.OperStatus.SYSETH_OPERSTAT_Up' [ERROR] cip object, 4.9.0.0 (codesys): AddressConflictDetection [TCPIP_Interface]: C0062: 'CmpSysEthernet.OperStatus' is no structured variable [ERROR] cip object, 4.9.0.0 (codesys): AddressConflictDetection [TCPIP_Interface]: C0063: 'CMPSYSETHERNET, 3.4.3.0 (3S - SMART SOFTWARE SOLUTIONS GMBH)' contains no definition for 'OperStatus' [ERROR] cip object, 4.9.0.0 (codesys): Recv [TCPIP_Interface]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): Recv [TCPIP_Interface]: C0046: Identifier '_diAdapterNumber' not defined [ERROR] cip object, 4.9.0.0 (codesys): Recv [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: '_diAdapterNumber'' to type 'DINT' [ERROR] cip object, 4.9.0.0 (codesys): Recv [TCPIP_Interface]: C0046: Identifier '_diAdapterNumber' not defined [ERROR] cip object, 4.9.0.0 (codesys): Recv [TCPIP_Interface]: C0032: Cannot convert type 'Unknown type: '_diAdapterNumber'' to type 'DINT' [ERROR] memory block manager, 3.5.21.30 (codesys): ObjectRetain [Disposable]: C0448: Operator '__XADD' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] memory block manager, 3.5.21.30 (codesys): ObjectRelease [Disposable]: C0448: Operator '__XADD' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [LLDP_Management]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [LLDP_Management]: C0201: Type 'SysEthernetFrame' is not equal to type 'SysEthernetFrame' of VAR_IN_OUT respectively REFERENCE 'frame' [ERROR] cip object, 4.9.0.0 (codesys): SendFrame [LLDP_Management]: C0201: Type 'SysEthernetFrame' is not equal to type 'SysEthernetFrame' of VAR_IN_OUT respectively REFERENCE 'ethFrame' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0032: Cannot convert type 'Unknown type: 'ADR(frame.ethData[0])'' to type 'POINTER TO BYTE' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0077: Unknown type: 'frame.ethData[0]' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0032: Cannot convert type 'Unknown type: 'SIZEOF(frame.ethData)'' to type 'UDINT' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0077: Unknown type: 'frame.ethData' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0018: 'frame.udFrameLen' is no valid assignment target [ERROR] cip object, 4.9.0.0 (codesys): CreateFrame [LLDP_Management]: C0077: Unknown type: 'SysEthernetFrame' [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Receive [UcmmReceiver]: C0448: Operator '__COMPARE_AND_SWAP' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Send [UcmmReceiver]: C0448: Operator '__COMPARE_AND_SWAP' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Enqueue [UcmmQueue]: C0448: Operator '__COMPARE_AND_SWAP' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Enqueue [UcmmQueue]: C0448: Operator '__XADD' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Enqueue [UcmmQueue]: C0448: Operator '__XADD' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Dequeue [UcmmQueue]: C0448: Operator '__XADD' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Dequeue [UcmmQueue]: C0448: Operator '__COMPARE_AND_SWAP' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] iodrvethernetip, 4.9.0.0 (codesys): Dequeue [UcmmQueue]: C0448: Operator '__XADD' is not supported by your current target. At least runtime system version 3.5.14.0 is required. [ERROR] asynchronous job manager, 5.0.0.0 (codesys): ExtendAsync [FactoryBase]: C0448: Operator '__COMPARE_AND_SWAP' is not supported by your current target. At least runtime system version 3.5.14.0 is required. Compile complete -- 71 errors, 0 warnings Build complete -- 71 errors, 0 warnings : No download possible
Last updated: 2026-08-20
To search for an exact phrase, put it in quotes. Example: "getting started docs"
To exclude a word or phrase, put a dash in front of it. Example: docs -help
To search on specific fields, use these field names instead of a general text search. You can group with AND or OR.