Post by gustavocsw on MQTT memory leak problem
CODESYS Forge
talk
(Post)
Hello everyone, I'm using the IoT Library to implement the MQTT communication with my local broker server in order to publish and subscribe at specifics topics to share and consume information about my application. But, it seems that are occurring some memory leak problem in a "high" frequency (more than 10 Hz) subscribe process. I follow the same method as in IoT Lib exemples, and at first looks perfect but my PLC was rebooting frequently and when I check its memory usage that was increasing as fast as the subscribe massage was sent. I'm using a WEG PLC410 and a WEG PLC500, and this error occurred in both of them (including in CODESYS Control Win x64). The application sends to the system a message JSON with the float payload Ex. {"data" : 0.8500}, but this happens with a INT, or BOL as well. I use the follow code in my application to find the value: //FindFirstValueByKey VARs PROGRAM JSON_VELO VAR //------Setting the JSON Subscriber to Set the Relay Value jsonDataVelo : JSON.JSONData; jsonByteArrayReaderVelo : JSON.JSONByteArrayReader; xST1okVelo : BOOL; FindFirstValueByKeyVelo : JSON.FindFirstValueByKey; jsonElementVelo : JSON.JSONElement; xDoneReaderVelo : BOOL; xDoneFindVelo : BOOL; //STRING and WSTRING for Subscribe the massage sPayloadJsonVelo : STRING := 'opa'; psPayloadJsonVelo : POINTER TO BYTE := ADR(sPayloadJsonVelo); //wsPayloadJsonRelaySet : WSTRING := "opa"; wsPayloadJsonVelo : WSTRING := STRING_TO_WSTRING('opa'); pwsPayloadJsonVelo : POINTER TO WORD := ADR(wsPayloadJsonVelo); lrVelo : LREAL; xKeepAliveVelo : BOOL; xSetVelo : BOOL; RSSet : RS; LIMPAR : STRING; //Find the msg end sFindVelo : STRING := '}'; psFindVelo : POINTER TO STRING := ADR(sFindVelo); iLenVelo : INT; iSizeVelo : INT := 12; udiContMsg : UDINT; END_VAR // FindFirstValueByKey CODE // Relay Set configuration xSetVelo := MQTT_SUBSCRIBER.RSVelo.Q1; IF xSetVelo THEN xKeepAliveVelo := TRUE; END_IF IF xKeepAliveVelo THEN udiContMsg := udiContMsg + 1; iLenVelo := TO_INT(StrLenA(psPayloadJsonVelo)); iSizeVelo := iLenVelo - TO_INT(MQTT_SUBSCRIBER.udiPayloadSizeVelo); StrDeleteA(psPayloadJsonVelo,iSizeVelo,iLenVelo); wsPayloadJsonVelo := STRING_TO_WSTRING(sPayloadJsonVelo); pwsPayloadJsonVelo := ADR(wsPayloadJsonVelo); //MQTT.ConvertUTF8toUTF16(sourceStart:= ADR(sPayloadJsonVelo), targetStart:= ADR(wsPayloadJsonVelo), dwTargetBufferSize:= TAM, bStrictConversion:= 1); //Reset jsonByteArrayReader jsonByteArrayReaderVelo ( xExecute := TRUE, pwData := pwsPayloadJsonVelo, jsonData := jsonDataVelo, xDone => xDoneReaderVelo ); FindFirstValueByKeyVelo( xExecute := xDoneReaderVelo, wsKey := "data", diStartIndex:= 0, jsonData := jsonDataVelo, jsonElement => jsonElementVelo, xDone => xDoneFindVelo ); IF xDoneFindVelo THEN lrVelo := jsonElementVelo.value.lrValue; //Reset jsonByteArrayReader jsonByteArrayReaderVelo ( xExecute := FALSE, pwData := pwsPayloadJsonVelo, jsonData := jsonDataVelo, xDone => xDoneReaderVelo ); FindFirstValueByKeyVelo( xExecute := FALSE, wsKey := "data", diStartIndex:= 1, jsonData := jsonDataVelo, jsonElement => jsonElementVelo, xDone => xDoneFindVelo ); xKeepAliveVelo := FALSE; GVL.xSetVeloRead := TRUE; END_IF END_IF And this to subscribe at the topic: //SUBSCRIBE VAR: //----------------- Subscribe Velocity ----------------------- MQTTSubscribeVelo : MQTT.MQTTSubscribe;//Variable MQTTSubscriber block -X - function-X wsTopicSubscribeVelo : WSTRING(1024) := "CORE/odometry/GET/data/simp"; // Topic to publish a message sSubscribeMassageVelo : STRING; udiPayloadSizeVelo : UDINT; xSDoneVelo : BOOL; xSErrorVelo : BOOL; xReceiveVelo : BOOL; eSTypeVelo : MQTT.MQTT_ERROR; eSMQTTErrorVelo : MQTT.MQTT_ERROR; RSVelo : RS; udiCont : UDINT; //SUBSCRIBE CODE: MQTTSubscribeVelo( xEnable:= MQTT_CLIENT.xConnection_Broker AND NOT xSErrorVelo AND NOT JSON_VELO.xKeepAliveVelo, pbPayload:= JSON_VELO.psPayloadJsonVelo, udiMaxPayloadSize:= SIZEOF(JSON_VELO.sPayloadJsonVelo), udiPayloadSize => udiPayloadSizeVelo, mqttClient:= MQTT_CLIENT.ClientMQTT, wsTopicFilter:=wsTopicSubscribeVelo, xDone => xSDoneVelo, xError=> xSErrorVelo, xReceived => xReceiveVelo, eMQTTError=> eSMQTTErrorVelo ); RSVelo(SET := xReceiveVelo, RESET1 := JSON_VELO.xKeepAliveVelo);
Last updated: 2024-09-09
Connection to device closed
CODESYS Forge
talk
(Thread)
Connection to device closed
Last updated: 2023-08-25
Sysmac Studio to Codesys
CODESYS Forge
talk
(Thread)
Sysmac Studio to Codesys
Last updated: 2023-09-20
OPC UA Client unable to connect to CeDeSys OPC UA Server but able to connect to other OPC UA Server
CODESYS Forge
talk
(Thread)
OPC UA Client unable to connect to CeDeSys OPC UA Server but able to connect to other OPC UA Server
Last updated: 2018-10-30
Sysfile copy to server
CODESYS Forge
talk
(Thread)
Sysfile copy to server
Last updated: 2012-01-13
GVL to SHMem
CODESYS Forge
talk
(Thread)
GVL to SHMem
Last updated: 2024-07-09
Array to String
CODESYS Forge
talk
(Thread)
Array to String
Last updated: 2024-07-18
Array to String
CODESYS Forge
talk
(Thread)
Array to String
Last updated: 2024-07-24
Send data to USB
CODESYS Forge
talk
(Thread)
Send data to USB
Last updated: 2024-08-05
Password to POU
CODESYS Forge
talk
(Thread)
Password to POU
Last updated: 2024-08-14
STRING conversions to DWORD
CODESYS Forge
talk
(Thread)
STRING conversions to DWORD
Last updated: 2025-02-02
Which database to use?
CODESYS Forge
talk
(Thread)
Which database to use?
Last updated: 2025-03-04
how to add TextList
CODESYS Forge
talk
(Thread)
how to add TextList
Last updated: 2025-05-20
Login to Visu optional
CODESYS Forge
talk
(Thread)
Login to Visu optional
Last updated: 2025-07-16
What happened to Python?
CODESYS Forge
talk
(Thread)
What happened to Python?
Last updated: 2025-10-01
CoDeSys to access
CODESYS Forge
talk
(Thread)
CoDeSys to access
Last updated: 2007-01-15
How to remove user ?
CODESYS Forge
talk
(Thread)
How to remove user ?
Last updated: 2018-07-03
string to time
CODESYS Forge
talk
(Thread)
string to time
Last updated: 2010-03-08
Button to close browser
CODESYS Forge
talk
(Thread)
Button to close browser
Last updated: 2022-09-22
Connect to MCP 3008
CODESYS Forge
talk
(Thread)
Connect to MCP 3008
Last updated: 2018-09-16
How to implement IVisuStreamReader
CODESYS Forge
talk
(Thread)
How to implement IVisuStreamReader
Last updated: 2023-03-02
REAL to BOOL
CODESYS Forge
talk
(Thread)
REAL to BOOL
Last updated: 2007-06-11
Convertion Dint to Word
CODESYS Forge
talk
(Thread)
Convertion Dint to Word
Last updated: 2023-08-07
Variable name to string
CODESYS Forge
talk
(Thread)
Variable name to string
Last updated: 2015-03-19
STRUCT to BYTE ARRAY
CODESYS Forge
talk
(Thread)
STRUCT to BYTE ARRAY
Last updated: 2023-07-10
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.