Seeking a Code-Based Solution for EtherCAT Slave Dropout or Master Errors in Production (Beyond Software Hot Reset)
CODESYS Forge
talk
(Thread)
Seeking a Code-Based Solution for EtherCAT Slave Dropout or Master Errors in Production (Beyond Software Hot Reset)
Last updated: 2026-02-14
Post by lzml on HTML5 visualization controls disabled on CODESYS Control for Linux SL - overlay not supported?
CODESYS Forge
talk
(Post)
Thanks for the suggestion - I updated everything via the CODESYS Installer and restarted, but I'm still hitting the same error. What I did - Updated via Tools > CODESYS Installer - Visualization system libraries (VisuElems, VisuElemsAlarm, VisuInputs, VisuNativeControl, etc.): 4.7.0.0 -> 4.10.0.0 - CODESYS Control for Linux SL: 4.15.0.0 -> 4.21.0.0 (based on CODESYS SDK 3.5.22.20) - Restarted CODESYS Development System Checked project environment (Project > Project Environment) after restart - Compiler version: 3.5.22.0 - Library versions: all up to date - Visualization Profile: CODESYS Visualization 4.10.0.0 - SoftMotion version: 4.20.2.0 Result: compiling with Device = CODESYS Control for Linux SL still fails with the same error: "Overlay is not supported for your target visualization device." The custom HTML5 control is still disabled/missing from the Toolbox with this Device selected (same as before), and still appears normally when I switch the Device to a Windows target. Is there anything else specific I should check (e.g. a setting on the Device description itself, a different SL package/edition, or is WebVisu overlay for custom HTML5 controls simply not implemented yet for CODESYS Control for Linux SL regardless of package version)? Any pointer appreciated.
Last updated: 2026-08-05
Post by eschwellinger on CODESYS Control for Raspberry Pi 5 - "Hardware version or firmware version not supported" on Rev 1.1, persists across multiple runtime versions and OS images
CODESYS Forge
talk
(Post)
you need to wait for the 4.22.0.0 release which will fix this problem
Last updated: 2026-08-10
CAN TX regression in Control for Raspberry Pi 4.21.0.0 with CAN API library (RX works, TX silently fails)
CODESYS Forge
talk
(Thread)
CAN TX regression in Control for Raspberry Pi 4.21.0.0 with CAN API library (RX works, TX silently fails)
Last updated: 2026-08-17
Post by ihatemaryfisher on Sorting array of any-sized structure
CODESYS Forge
talk
(Post)
In my machine's operation, I need to display multiples tables containing arrays of structured variables. The arrays change during operation, and my supervisor has advised me to write a new bubble-sort for each array. I think I can make a function to sort an array of any data type. This was my own project, and I'm a relatively new coder. I want to know the weaknesses in my approach, and a better method, if one exists. As far as I can test, the function accepts an array of a structured variable of any size, and sort it by any VAR in that structure. But it relies heavily on pointers, which I've heard are bad practice? Function call: // SORT BY BYTE-SIZED VAR IF xDoIt[6] THEN FUNBubbleSortSansBuffer( IN_pbySourcePointer := ADR(astArray[1]), // address of first byte in first element of array IN_pbyComparePointer:= ADR(astArray[1].byCompByte), // points to first byte of the comparing variable (variable you sort by) IN_uiStructureSize := SIZEOF(TYPE_STRUCTURE), // size, in bytes, of the structured variable IN_uiCompareSize := SIZEOF(astArray[1].byCompByte), // size, in bytes, of the comparing variable (variable you sort by) diArrayElements := UPPER_BOUND(astArray,1), // number of elements in array IN_xSmallToLarge := xSortOrder // whether to sort by small2large or large2small ); END_IF Function: FUNCTION FUNBubbleSortSansBuffer : BOOL VAR_INPUT IN_pbySourcePointer : POINTER TO BYTE; // points to beginning of array (first byte of first element) IN_pbyComparePointer: POINTER TO BYTE; // points to first byte of the comparing variable (variable you sort by) IN_uiStructureSize : UINT; // size, in bytes, of the structured variable IN_uiCompareSize : UINT; // size, in bytes, of the comparing variable (variable you sort by) diArrayElements : DINT; // number of elements in array IN_xSmallToLarge : BOOL; // whether to sort by small2large or large2small END_VAR VAR j : DINT; // repeat iteration over array until array ends i : DINT; // iterarte over array, swapping when necesary k : DINT; // iterator from 1 to size of structure (stepping 'through' a single element in array) dwSize : DWORD; // internal var for use in MEMUtils.MemCpy(<size>) // FOR SORTING BY BYTE VAR pbySourcePointer : POINTER TO BYTE; pbySourcePointer2 : POINTER TO BYTE; pbyComparePointer : POINTER TO BYTE; pbyComparePointer2 : POINTER TO BYTE; pbyPointerToBuffer : POINTER TO BYTE; // pointer to single byte buffer byBufferByte : BYTE; // single byte buffer END_VAR dwSize := UINT_TO_DWORD(IN_uiStructureSize); // get structure size (number of bytes) pbyPointerToBuffer := ADR(byBufferByte); // assign pointer to address of buffer byte (because MEMUtils.MemCpy requires a pointer input) CASE IN_uiCompareSize OF // depending on the size of the VAR to sort by (current functionality for BYTE and WORD/INT 1: // BYTE (8 BIT) FOR j := 1 TO diArrayElements DO // for number of elements in array FOR i := 1 TO (diArrayElements-1) DO // same thing, but row[i+1] row is included in swap logic pbySourcePointer := IN_pbySourcePointer + dwSize*(i-1); // point at #1 byte in array element[i] pbySourcePointer2 := pbySourcePointer + dwSize; // point at #1 byte in array element[i+1] // NOTE: because of memory locations, each array element is offset from one another by a number of bytes equal to the size of the structure // We can "walk" from array[i] to array[i+1] via steps equal to the size of the structure // e.g., ADR(array[i+1]) == ADR(array[i]) + SIZEOF([array datatype]) pbyComparePointer := IN_pbyComparePointer + dwSize*(i-1); // point to sorting variable in array element[i] pbyComparePointer2 := pbyComparePointer + dwSize; // point to sorting variable in array element[i+1] // using sort order (small -> large/large -> small) IF SEL(IN_xSmallToLarge, (pbyComparePointer2^ > pbyComparePointer^),(pbyComparePointer2^ < pbyComparePointer^)) THEN // This is where it gets tricky. We've identified pointers for the starting bytes of aArray[i] and aArray[i+1] // and we know the size of aArray[i]. We are going to swap individual bytes, one at a time, from aArray[i] and aArray[i+1] // this allows us to use only a single byte var as a buffer or temporary data storage // e.g., consider a structure consisting of a word, a byte, and a string. it is stored like this // |------WORD-------| |--BYTE-| |STRING------...| // astArray[1] == 1000 0100 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 0001 0010 0100 1000 0011 1100 0101 0101.... etc // performing a single swap (copy into a buffer, etc.) of the first byte of each array element creates this // astArray[1] == 0001 0100 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 1000 0010 0100 1000 0011 1100 0101 0101.... etc // incrementing the pointer adresses for the swap by 1 and swapping again swaps the next byte in each array element // astArray[1] == 0001 0010 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 1000 0100 0100 1000 0011 1100 0101 0101.... etc // continuing this from k to SIZEOF(TYPE_STRUCTURE) results in a toally swapped row FOR k := 1 TO IN_uiStructureSize DO // copy single byte[k] of array element 1 to buffer MEMUtils.MemCpy(pbyDest := (pbyPointerToBuffer), pbySrc := (pbySourcePointer+k-1), dwSize := 1); // copy single byte[k] of array element 2 to 1 MEMUtils.MemCpy(pbyDest := pbySourcePointer+k-1, pbySrc := (pbySourcePointer2+k-1), dwSize := 1); // copy buffer to byte[k] array element 2 MEMUtils.MemCpy(pbyDest := (pbySourcePointer2+k-1), pbySrc := pbyPointerToBuffer, dwSize := 1); END_FOR END_IF END_FOR END_FOR
Last updated: 2023-08-17
Post by mondinmr on Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
CODESYS Forge
talk
(Post)
I have found a very interesting solution using: IoConfigTaskMap IoConfigConnectorMap IoConfigChannelMap The first is the list of IO tasks. The second is the connector for each IO module in the IOMap. The third is the individual input or output on the IOMap. One of the properties of the connector is another pointer to a connector, which corresponds with the connector of the EtherCAT slave. Through this information, it is possible to understand to which EtherCAT slave an IO connectormap corresponds. I am attaching an FB that allows for the construction of an IO map and finding the pointer to the actual IOs in the IOMap based on the bitoffset. FUNCTION_BLOCK IOExplorer VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR inputChannels: COL.LinkedList; outputChannels: COL.LinkedList; ulintFactory: COL.UlintElementFactory; END_VAR METHOD inputAtBitOffsetOfConnector : POINTER TO BYTE VAR_INPUT conn: POINTER TO IoConfigConnectorMap; bitOffset: UDINT; END_VAR VAR it: COL.LinkedListIterator; itf: COL.IElement; elem: COL.iUlintElement; channelInfo: POINTER TO ADVChannelInfo; bitOffsetR: UDINT; END_VAR inputChannels.ElementIterator(it); WHILE it.HasNext() DO it.Next(itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} channelInfo := TO___UXINT(elem.UlintValue); {warning restire C0033} IF channelInfo^.connectorField = conn THEN IF bitOffsetR = bitOffset THEN inputAtBitOffsetOfConnector := channelInfo^.addr; RETURN; END_IF bitOffsetR := bitOffsetR + channelInfo^.size; ELSE bitOffsetR := 0; END_IF END_WHILE inputAtBitOffsetOfConnector := 0; END_METHOD METHOD outputAtBitOffsetOfConnector : POINTER TO BYTE VAR_INPUT conn: POINTER TO IoConfigConnectorMap; bitOffset: UDINT; END_VAR VAR it: COL.LinkedListIterator; itf: COL.IElement; elem: COL.iUlintElement; channelInfo: POINTER TO ADVChannelInfo; bitOffsetR: UDINT; END_VAR outputChannels.ElementIterator(it); WHILE it.HasNext() DO it.Next(itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} channelInfo := TO___UXINT(elem.UlintValue); {warning restire C0033} IF channelInfo^.connectorField = conn THEN IF bitOffsetR = bitOffset THEN outputAtBitOffsetOfConnector := channelInfo^.addr; RETURN; END_IF bitOffsetR := bitOffsetR + channelInfo^.size; ELSE bitOffsetR := 0; END_IF END_WHILE outputAtBitOffsetOfConnector := 0; END_METHOD METHOD scanIO VAR_INPUT END_VAR VAR numTasks: DINT := IoConfig_Globals.nIoConfigTaskMapCount; tType: WORD; ioTask: POINTER TO IoConfigTaskMap; numCon: WORD; connector: POINTER TO IoConfigConnectorMap; numCh: DWORD; channelInfo: POINTER TO ADVChannelInfo; iTsk: DINT; iCon: WORD; iCh: DWORD; i: DINT; _tmpConnList: COL.IList; elem: COL.IUlintElement; itf: COL.IElement; tmpCh: POINTER TO ADVChannelInfo; lastE: DINT; e: COL.COLLECTION_ERROR; e1: Error; END_VAR VAR_INST lF: COL.ListFactory; END_VAR IF outputChannels.CountElements() > 0 OR inputChannels.CountElements() > 0 THEN RETURN; END_IF _tmpConnList := lF.CreateDynamicList(16, 16); //Iterate through all IO tasks FOR iTsk := 0 TO numTasks - 1 DO ioTask := ADR(IoConfig_Globals.pIoConfigTaskMap[iTsk]); //Store the type of the task (Input or Output) tType := ioTask^.wType; numCon := ioTask^.wNumOfConnectorMap; //Iterate through all connectors of the task FOR iCon := 0 TO numCon - 1 DO connector := ADR(ioTask^.pConnectorMapList[iCon]); numCh := connector^.dwNumOfChannels; //Iterate through all channels of the connector FOR iCh := 0 TO numCh - 1 DO //Create a new channel info object and fill it with the address, connector and size of the channel //Connectors is address of field connector in this case like EtherCAT slave //Address is the address of the IOMap //Size is the size of channel data in bits in IOMap channelInfo := __NEW(ADVChannelInfo); channelInfo^.addr := connector^.pChannelMapList[iCh].pbyIecAddress; channelInfo^.connectorField := connector^.pConnector; channelInfo^.size := connector^.pChannelMapList[iCh].wSize; //We put the channel info a temporary ordered list //Order is based on the address of IOMap lastE := TO_DINT(_tmpConnList.CountElements()) - 1; FOR i := 0 TO lastE DO _tmpConnList.GetElementAt(udiPosition := TO_UDINT(i), itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} tmpCh := TO___UXINT(elem.UlintValue); {warning restire C0033} //If the address of the channel is smaller than the address of the channel in the list IF tmpCh^.addr > channelInfo^.addr THEN //Insert the channel in the list at the current position _tmpConnList.InsertElementAt(TO_UDINT(i), ulintFactory.Create(TO_ULINT(channelInfo))); //Clear the channel info pointer channelInfo := 0; //Exit the loop i := lastE + 1; END_IF END_FOR //If the channel info is not 0, it means that the channel was not inserted in the list IF channelInfo <> 0 THEN //Add the channel to the end of the list elem := ulintFactory.Create(TO_ULINT(channelInfo)); _tmpConnList.AddElement(elem); END_IF END_FOR //Iterate temporary list and add the channels to the input or output list lastE := TO_DINT(_tmpConnList.CountElements()) - 1; FOR i := 0 TO lastE DO _tmpConnList.GetElementAt(udiPosition := TO_UDINT(i), itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} tmpCh := TO___UXINT(elem.UlintValue); {warning restire C0033} //If type is input, add the channel to the input list IF tType = TaskMapTypes.TMT_INPUTS THEN e := inputChannels.AddElement(ulintFactory.Create(TO_ULINT(tmpCh))); //If type is output, add the channel to the output list ELSIF tType = TaskMapTypes.TMT_OUTPUTS THEN e := outputChannels.AddElement(ulintFactory.Create(TO_ULINT(tmpCh))); ELSE __DELETE(tmpCh); END_IF END_FOR //Clear the temporary list _tmpConnList.RemoveAllElements(); END_FOR END_FOR END_METHOD
Last updated: 2024-02-13
Post by dawidr on Best practices for querying multiple MODBUS devices
CODESYS Forge
talk
(Post)
Hi! What are the best practices for querying multiple Modbus devices? Single PRG or maybe multiple PRG (so basically multiple thread) per each Modbus device. In my current implementation I'm using single PRG and I'm utilizing FbMbMasterMultiQuerySerial and WagoAppPlcModbus.FbDigitalTwinMbSlaveDevice in eCockpit with PFC200. I've the timer with 2 seconds delay there and it was working fine for single device. But now I have three Modbus devices and for two of them I need to run 2/3 queries to get data from all registers. I noticed that the delays for getting the data from the Modbus devices is much bigger right now.
Last updated: 2024-07-31
Post by mazino on How to download dependencies packages for CODESYS Control for Raspberry Pi SL ?
CODESYS Forge
talk
(Post)
Hi starmaxou, Iβm facing the same issue you mentioned with the dependencies for the CODESYS Control for Linux SL installation. I was able to find the manual downloads for the CODESYS Edge Gateway and CodeMeter, but Iβm still stuck on the other two dependencies: CODESYS Control SL Extension v4.0.0.0 CODESYS Control SL Deploy Tool v4.10.0.0 Since youβve encountered the same problem, Iβd really appreciate any help or insights you can share on how you were able to resolve it. Any tips or suggestions would be greatly appreciated! Thanks in advance!
Last updated: 2025-03-07
Post by aleksahin6824 on SysEthernet error
CODESYS Forge
talk
(Post)
Good afternoon Please help with localizing the error. Periodically, but on the same time grid, the error SysEthernet: packet could not be sent occurs. PLC and motors from XINJE. PLC β XSA-330L, rev. 1.2, drivers β DC5C2 (rev.5) In the task configurator, all tasks are set to simple numbers (11, 13, 41 ms) for convenience. The jitter for EtherCat and SoftMotion tasks is less than the task cycle (2 ms jitter for a 6 ms task). The power supply is sufficient for both the PLC and the motors. The cables are in good condition. Please suggest where to look for the problem. P.S. The PLC uses proprietary Linux and there is no SSH access.
Last updated: 2026-08-30
Post by aleksahin6824 on SysEthernet error
CODESYS Forge
talk
(Post)
Good afternoon Please help with localizing the error. Periodically, but on the same time grid, the error SysEthernet: packet could not be sent occurs. PLC and motors from XINJE. PLC β XSA-330L, rev. 1.2, drivers β DC5C2 (rev.5) In the task configurator, all tasks are set to simple numbers (11, 13, 41 ms) for convenience. The jitter for EtherCat and SoftMotion tasks is less than the task cycle (2 ms jitter for a 6 ms task). The power supply is sufficient for both the PLC and the motors. The cables are in good condition. Please suggest where to look for the problem. P.S. The PLC uses proprietary Linux and there is no SSH access.
Last updated: 2026-08-30
Post by pernockham on Unable to deploy "Control for Linux SL 4.18.0.0"
CODESYS Forge
talk
(Post)
And the strange thing for me is that if i connect with an older IDE version (where I only have 4.17.0.0 installed) I can see both "CODESYS Control for Linux SL" and "CODESYS Edge Gateway for linux". And that I loose (both presence and possibility to update) the first option (Control SL) if i let the updater install "Control for linux SL" vers. 4.18.0.0 or later. (Note that runtime 4.17.0.0 is installed and it is running and I can login to that system, but no apparent option available to update it to 4.19.0.0). Attached print screen where I connected the "deploy sl tool" to the same system, where the upper (IDE) one has 4.19.0.0 installed, while the lower one has 4.17.0.0 installed..
Last updated: 2026-02-17
Post by erictur on CODESYS Control for Linux ARM SL (32 bit) on Moxa UC-3100 IPC
CODESYS Forge
talk
(Post)
UC3100 comes with Arm Cortex-A8 1 GHz and belongs to Moxa Industrial Linux 1 (Debian 9) for Arm-based Computers. I tried to install the CODESYS Control for Linux ARM SL (32 bit) on Moxa UC-3100 IPC. Unfortunately, the Third-party requirements: - libc >= 2.27 (required by CodeMeter Runtime) of the CODESYS Control for Linux ARM SL cannot be met on the Debian 9, which comes with glibc 2.24. I read the post by @johnlee (Getting Start with Codesys Control for Linux SL) (https://forge.codesys.com/forge/talk/Runtime/thread/0a515ced3f/). Where he discusses installation of CODESYS Control for Linux ARM SL on Debian 9. There was CODESYS Linux runtime v3.5.14 availble and it was successfully intalled on the Debian 9. However, the CODESYS Store has the oldest version V4.1.0.0 32 bit available. There is no way to find the CODESYS Linux runtime v3.5.14. So is there any work around for this? Or I cannot install the CODESYS Runtime on any of the Moxa IPCs based on the Moxa Industrial Linux 1 (Debian 9)?
Last updated: 2025-07-10
Post by russells on Codesys ControlWinV3x64 with EtherCat Slave
CODESYS Forge
talk
(Post)
Hi there I am running Codesys ControlWinV3x64 (Patch 4) on my laptop for demonstration purposes but I am unable to get connection to the EtherCAT master and slave device. This is the process that I have followed: * Installed NPCap. * Added the xml file for the SMC slave device to the Device Repository. * Activated Control Win SysTray x64 and selected Start PLC. * Scanned the network for the local device (my laptop). * Added an EtherCAT master to the project and scanned the EtherCAT master for the Network and then selected the correct network. * Selected "Scan for devices" to identify the connected I/O. * Add the SMC EtherCAT slave manually because I was unable to scan it in. * Selected "Scan for devices". I have followed the steps described above but I can't scan in the EtherCAT slave or connect to it. I thought this situation was unique to the EtherCAT slave but I have also tried the same for an EtherNet/IP slave using the Ethernet Adaptor and EtherNet/IP scanner and I am also unable to scan in the device or activate the EtherNet/IP network. Any assistance will be appreciated.
Last updated: 2026-02-04
Post by rossanoparis on After un upgrade of "CODESYS Control for Raspberry Pi MC SL" from v4.7 to v4.9 SysFileOpen function stopped working
CODESYS Forge
talk
(Post)
For those who will step on this thread. Everything is fine, I had only to increase by 1 my place holders number. For sure the system is occupying the number 1 without being declared ... Below the modification I made to get my code working. [SysFile] PlaceholderFilePath.2=/home/pi/hpca/bin, $hpcabin$ PlaceholderFilePath.3=/home/pi/hpca/cfg, $hpcacfg$ PlaceholderFilePath.4=/home/pi/hpca/logs, $hpcalogs$ PlaceholderFilePath.5=/home/pi/hpca/resources, $hpcares$
Last updated: 2023-08-22
Post by vformanek on No source code available for profinet library
CODESYS Forge
talk
(Post)
Hello, I have been using CODESYS for a while and after updating to version 3.5.18.50 the code randomly stops with this fault. Why is that ? I have tried to locate the fault in the Call Stack but I dont know what to do now... I have updated the projects properly for the version I am using. This fault started happening after like 14 days of using the new version of CODESYS.
Last updated: 2023-08-23
Post by janderson on Ethercat scan for devices not picking up EL7041 as a softmotion axis
CODESYS Forge
talk
(Post)
it appears that the different revisions have different PDOs. I am currently trying to use the rev25. I have tried to use the rev24 (the device repository entry not from 'scan for devices') and i keep getting 'invalid output mapping' or 'invalid input mapping' in the ethercat log. I cant even get the bus to run from the device description that comes from 'scan for devices'...
Last updated: 2023-09-18
Post by janderson on Ethercat scan for devices not picking up EL7041 as a softmotion axis
CODESYS Forge
talk
(Post)
it appears that the different revisions have different PDOs. I am currently trying to use the rev25. I have tried to use the rev24 (the device repository entry not from 'scan for devices') and i keep getting 'invalid output mapping' or 'invalid input mapping' in the ethercat log. I cant even get the bus to run from the device description that comes from 'scan for devices'...
Last updated: 2023-09-18
Post by sukrit on What licenses are required for runtime on raspberry pi cm4
CODESYS Forge
talk
(Post)
We have developed a project for 2 servo motors using raspberry pi computemodule 4 on ethercat master. we are using web visualization for display different screens. project is running well in demo. we want to implement it in production envoirment. being new still wondering which licences i need. Can We get this information in codesys devlopment software. code size is approx 5 mb, 1 instance of etharcat master and aproox 100 variables in visaualization.
Last updated: 2023-10-17
Post by davidbo on How to allow a user to handle certificates without access to sourcecode?
CODESYS Forge
talk
(Post)
With CODESYS V3.5 it is possible for a user to do the following things among many others. 1) Handling certificates especially move a certificate to the trusted folder. 2) Change password and create new users for OPC UA access However it requires access to the whole projects and its source code. Something you might not want to hand over to an end user for a stand alone product. Is there a way out of this problem?
Last updated: 2023-11-06
Post by andre-luis on Check if Codesys runtime is on 'Running' or 'Stopped' state?
CODESYS Forge
talk
(Post)
Just to share, for those who as me are seeking for this and had found no information anywhere in this World: Every time I stop/start the PLC runtime ( turning into 'Stopped' or 'Running' state ) the 'CODESYSControlService' appears at the Taskmanager list, which could suggest a straight correlation. I was expecting a clever solution, but this one solves for while.
Last updated: 2024-07-02
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.