Unable to deploy "Control for Linux SL 4.18.0.0"
CODESYS Forge
talk
(Thread)
Unable to deploy "Control for Linux SL 4.18.0.0"
Last updated: 2026-02-23
How to use MQTT in CODESYS Control Win V3
CODESYS Forge
talk
(Thread)
How to use MQTT in CODESYS Control Win V3
Last updated: 2026-02-25
How to register own component - CMAddComponent() or CMAddComponent2()
CODESYS Forge
talk
(Thread)
How to register own component - CMAddComponent() or CMAddComponent2()
Last updated: 2026-03-13
Unable to compare projects containing alarm manager 4.5.0.0
CODESYS Forge
talk
(Thread)
Unable to compare projects containing alarm manager 4.5.0.0
Last updated: 2026-03-15
Codeys Installation freezes while attempting to install packages
CODESYS Forge
talk
(Thread)
Codeys Installation freezes while attempting to install packages
Last updated: 2026-03-19
Virtual Api to vieuw what im sending
CODESYS Forge
talk
(Thread)
Virtual Api to vieuw what im sending
Last updated: 2026-04-05
Virtual Api to vieuw what im sending
CODESYS Forge
talk
(Thread)
Virtual Api to vieuw what im sending
Last updated: 2026-04-05
Post by struccc on Inheritence of struct,
CODESYS Forge
talk
(Post)
Strangely reminds me to my struggles... Want to do something "Elegant", reusable, universal, practical... In CODESYS??? 🙃 First of all, before you get too deep into this: If you could find a way, to make a "universal" log entry object, containing the variable length data itself, you wouldn't be able to store them in an array, or access them like an array, or pass them by value as a type. (please correct me, if I'm wrong, incorrect, or not precise). Because... Basically you can't declare a type with variable memory footprint. This is a very deeply embedded characteristic of CODESYS, and all IEC 61131-3 systems, and it has many reasons behind. And yes, it is a very common trap / mistake, to forget about. So, with a log entry - I guess - it's pretty much the purpose: store data and metadata together, and then handle it in a uniform way. There are ways to handle this, really depends on what is the purpose. For example: 1. Entries with fixed length (Maybe it is not as evil as it looks for the first time. Depends on the situation, but definitely the fastest and easiest code) You can have your base object, with an internal, fixed length string or byte array variable. I would go with a string, and call it _Data.; And then you can make properties, like As_Bool, As_Int, As_Real... In the 'set' accessors, you can do like: pReal := ADR(_Data); // POINTER TO REAL As_Real := pReal^; In the 'get' accessors, evidently: pReal := ADR(_Data); // POINTER TO REAL pReal^ := AS_Real; Or, can use ANY type, if you are not obsessed with variable / property like access: 2. Fixed length, but nicer First, some disadvantage to any values: - You can only assign values with write access. No literals, constants, etc... - Can only be used as input variable of function or function_block - Therefore, stg you could reach: LogEntry.Initialize (stVariable|rVariable|iVariable|xVariable); Just a quick example (it's funny to play with ANY): Be careful it was not tested. I'm sure can be done better, please feel free to comment FUNCTION_BLOCK FB_LogEntry VAR_INPUT MsgClass : UDINT; // Like DEBUG, WARN, ERR... MsgCode : UDINT; // Like Errors.ERR_FAILED MsgTS : DT; // The timestamp END_VAR VAR _Data : STRING(80); // Our data container... _Descr : __SYSTEM.AnyType; // A standard descriptor for our data, containing TYPE_CLASS, address and size END_VAR METHOD SET_Value : BOOL VAR_INPUT anyValue : ANY; END_VAR VAR I : DINT; diSize : DINT; pStr : POINTER TO STRING; END_VAR // Check what did we receive in anyValue. diSize := anyValue.diSize; // We use constant __SYSTEM.TYPE_CLASS to identify the received data type CASE anyValue.TypeClass OF // Maybe we don't want to store references, pointers... and who knows what else... __SYSTEM.TYPE_CLASS.TYPE_REFERENCE, __SYSTEM.TYPE_CLASS.TYPE_POINTER : SET_Value := FALSE; // For the planned types we will be just fine. TYPE_CLASS.TYPE_BOOL, TYPE_CLASS.TYPE_INT, TYPE_CLASS.TYPE_REAL : SET_Value := TRUE; // Optionally string can be handled separately, maybe we have received STRING(255), but practically it is shorter than 80 bytes... TYPE_CLASS.TYPE_STRING : pStr := anyValue.pValue; diSize := MIN(anyValue.diSize, LEN(pStr^) + 1); // Get the actual size, and rewrite the received structure member diSize := MIN(SIZEOF(_Data), diSize); // Can chop down the received string to our length... SET_Value := TRUE; // Maybe want to play a little bit more here, to narrow down or convert datatypes, etc... // Or just reject any other datatype ELSE SET_Value := FALSE; RETURN; END_CASE // Fail, if the received value is still larger than our container... IF diSize > SIZEOF(_Data) THEN SET_Value := FALSE; END_IF // Here we should be ok, just set up the _DataType structure, and copy store the data IF SET_Value THEN THIS^._Descr.TypeClass := anyValue.TypeClass; // The typeclass is already filtered THIS^._Descr.diSize := diSize; // Set the (adjusted) size THIS^._Descr.pValue := ADR(_Data); // This will not change, just to be sure {IF defined (pou:SysMem.SysMemCpy)} SysMem.SysMemCpy(_DataType.pValue, anyValue.pValue, TO_UDINT(anyValue.diSize)); {ELSE} // An ugly replacement MemCpy FOR I:=0 TO diSize - 1 DO _Descr.pValue[I] := anyValue.pValue[i]; END_FOR {END_IF} // Otherwise, in case of failure maybe better set an empty value (overwrite the former data descriptor) ELSE THIS^._Descr.TypeClass := TYPE_CLASS.TYPE_NONE; THIS^._Descr.pValue := ADR(_Data); THIS^._Descr.diSize := 0; END_IF METHOD GET_Value : BOOL VAR_INPUT anyValue : ANY; END_VAR VAR I : DINT; END_VAR // We just have to serve the data, using the __System.AnyType structure received // Roughly we can say: IF anyValue.TypeClass = _Descr.TypeClass AND anyValue.pValue <> 0 // This should not be possible, already taken care of by Codesys (?) THEN {IF defined (pou:SysMem.SysMemCpy)} SysMem.SysMemCpy(anyValue.pValue, _DataType.pValue, TO_UDINT(MIN(anyValue.diSize, _Descr.diSize))); {ELSE} // An ugly replacement MemCpy FOR I:=0 TO MIN(anyValue.diSize -1, _Descr.diSize - 1) DO anyValue.pValue[I] := _Descr.pValue[I]; END_FOR {END_IF} // Just to make sure, that our string is terminated... IF anyValue.TypeClass = TYPE_CLASS.TYPE_STRING THEN anyValue.pValue[anyValue.diSize -1] := 0; END_IF GET_Value := TRUE; RETURN; END_IF // ... But can play more CASE anyValue.TypeClass OF TYPE_CLASS.TYPE_WSTRING : ; // Could do conversion TYPE_CLASS.TYPE_XSTRING : ; // Wow, I have to figure this out TYPE_CLASS.TYPE_PARAMS : ; // BTW, what is this, how to use? TYPE_CLASS.TYPE_ANYNUM : ; // ... END_CASE Be careful it was not tested. I'm sure can be done better, please feel free to comment 3. If you really want to do entries with variable size In a standard environment, it would be similar to the previous, except you dont have the container variable _Data, just use a pointer, practically _Descr.pValue At Initialize (SET_Value), you have to allocate the memory, would be easy with SysMem.SysMemAlloc - nowadays with SysMem.SysMemAllocData -, and you make sure to release it after use with SysMem.SysMemFreeData... SysMemAlloc was already hidden. The problem with this, that sooner or later your application will totally fragment the dynamic memory, and fail... So should look for some form of dynMaybe MemUtils.MemoryManager (I am not sure what is the status and the future of it). 4. You will end up by a LogEntry Factory ... 5. You could still have a look at this IEC Snippets BTW, Standard Codesys Logger is not a bad choice either. If you are really interested, I share some more code / library.
Last updated: 2025-03-09
Post by rshabsh on Using Latch Variable in Alarm as input from text list
CODESYS Forge
talk
(Post)
I am currently utilizing Alarm Manager’s Latch Variable 1 to display additional information related to alarms. However, instead of mapping this latch variable to a fixed PLC variable, I would like to dynamically update its text content based on the selected language in the system. To achieve this, I am considering using a text list that corresponds to different languages rather than directly linking Latch Variable 1 to a PLC variable. This approach would allow the displayed alarm information to be automatically translated according to the active language setting. Could you please confirm if this method is feasible within the Alarm Manager configuration? Additionally, if there are specific steps or best practices to follow when implementing this functionality, I would appreciate any guidance you can provide. Looking forward to your insights.
Last updated: 2025-02-26
Post by mondinmr on Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
CODESYS Forge
talk
(Post)
Using SDO, I can read the EtherCAT mappings and offsets from various registers like 0x1c12, 0x1c13, etc. When I obtain registers mapped in the PDOs and various offsets, I could technically access directly to the statusword, controlword, etc., if they are mapped. I have noticed that on IoDrvEthercatLib.ETCSlave_Diag I can find pointers to the input and output buffers. However, although the input buffer can be easily read by referring to what has been obtained from the SDOs, it is not possible to write to the output buffer, as it is overwritten in each cycle by the data from the IOMapping task. Is there a way, knowing an instance of IoDrvEthercatLib.ETCSlave_Diag, to obtain the pointer to the first data in the IOMapping? The offsets are identical to those of the PDOs, but obviously the data is a copy. For me, the cleanest thing would be to access the pointers on IOMapping, for DS402a devices to retrieve the key data and point them to internal references. I need to know this as, having developed our own motion library, I would like to simplify the initial setup by eliminating unnecessary and nonsensical mappings that can lead users to unnecessary errors. In the current version that we have been using for years, we have to map everything manually. I would like to pass only the slave reference to the FB_init constructors and eliminate the mapping.
Last updated: 2024-02-12
Post by pmolke on Datenkonvertierung für ein SPS-AO-Modul
CODESYS Forge
talk
(Post)
Hallo, du solltest dir angewöhnen Präfixe für die Datentypen zu nutzen. Dann ist das auch lesbarer. Aus value wird rValue für ein REAL oder wValue für ein WORD. Daher ist jetzt nicht ersichtlich mit welchen Datentypen du dort arbeitest und was die Bausteine an den EIN- und Ausgängen erwarten. Du kannst aber explizit eine Typkonvertierung durchführen indem du am Ausgang noch einen Baustein "TO_WORD" setzt.
Last updated: 2024-06-21
Upgrading CODESYS runtime from v4.7 to v4.9 using a bash script leads to lose the licences stored in the soft container
CODESYS Forge
talk
(Thread)
Upgrading CODESYS runtime from v4.7 to v4.9 using a bash script leads to lose the licences stored in the soft container
Last updated: 2023-09-19
Post by nathant on Saving variable values on power cycle (RevPi Connect)
CODESYS Forge
talk
(Post)
Hello, this seems to be a known issue, but persistent/retain variables don't seem to work properly on RevPi devices. Is there a workaround to this? All I need is for a few configuration variables to be remembered through power cycle.
Last updated: 2023-12-03
Post by mos89p on is it possible to connect to a newer runtime from HMI runtime 3.5.16
CODESYS Forge
talk
(Post)
is it possible to connect to a newer runtime from HMI runtime 3.5.16 via Datasource manager for example a 3.5.20 ?
Last updated: 2024-07-02
Post by trycyclepower on How to set unit in Axis
CODESYS Forge
talk
(Post)
I am very new to Motion in Codesys. I have linear axis and would like to setup as mm, I want to move axis and control axis in mm, mm/s. How do I do that? I know my electronic gearing is 200000.
Last updated: 2024-08-29
Post by damian177 on OPC UA Client
CODESYS Forge
talk
(Post)
The OPC UA Client Example with webvisu is working. Now I would like to use Datasource to connect to OPC UA Server but some is wrong because nothing to do when I try list tags from server - please find in attachement
Last updated: 2024-09-03
Post by timvh on Help with DynamicTextGetTextW
CODESYS Forge
talk
(Post)
First of all you need to enable "Use unicodestrings" in the Visualization Manager. This function returns a pointer to a WSTRING (not STRING). To get this wstring value, do something like this: VAR myWstringVariable : WSTRING(255); END_VAR myWstringVariable := myResult^; // this is dereferencing the pointer to the WSTRING.
Last updated: 2024-09-03
Post by timvh on CoDeSys 3.5 SP20 "No Offline Help installed"
CODESYS Forge
talk
(Post)
Open the CODESYS Installer (from the menu Tools). Go to Browse. Search for: help ... Select the CODESYS Offline Help which you would like to install. (probably you have to close CODESYS to install it and reopen it after installation).
Last updated: 2024-10-01
Trying to pull Logged In user details and certain other variable values and in turn log to a database
CODESYS Forge
talk
(Thread)
Trying to pull Logged In user details and certain other variable values and in turn log to a database
Last updated: 2024-11-07
Post by rckalex on Changing Trace Variable at Runtime
CODESYS Forge
talk
(Post)
Is it possible to change the variable being traced during runtime? I would like to use the CURRENTCLIENTID in combination with an array of real numbers to alter the traced variable in a display window, without needing to create separate visualizations for each variable.
Last updated: 2025-01-22
Post by xlfll on How to use libdoc to implement libraries in multiple languages
CODESYS Forge
talk
(Post)
po file to generate translation file mo, how to mo file into lmd file into the compilation library? This is not clearly described in the codesys help. Does anyone know? codesys help:https://content.helpme-codesys.com/en/LibDevSummary/localization.html#deployment-of-translated-documents
Last updated: 2025-03-13
Post by peterkcontrols on Codesys Network driver install for Codesys Control RTE x64
CODESYS Forge
talk
(Post)
Resolved this. There is a config file called CodesysControl_User that I had to edit to set the driver to component 5. I deleted the semi colon next to Component.5=CmpEt1000Drv
Last updated: 2025-03-19
Post by dat422 on OPC UA Method - How to wait for result?
CODESYS Forge
talk
(Post)
Hi, I am also interested to know on how to use the Codesys OPCUA Client to call methods from e.g. a python opcua server.
Last updated: 2025-03-28
Post by altus22 on Type SM3_Drive is not equal to type SM3_Drive
CODESYS Forge
talk
(Post)
Another way to resolve this is to set Codesys to use a specific version of the offending library under Placeholders in the Library Manager.
Last updated: 2025-04-17
Post by keith on Ethernet Adapter issues
CODESYS Forge
talk
(Post)
I uploaded this project and it was running. After upload I had to re-download to get the system to sync up. I now have this fault and am not sure how to resolve it.
Last updated: 2025-08-14
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.