Post by fredsta on Unable to load dynamic modules (Download failed: Application=Application)
CODESYS Forge
talk
(Post)
Hey there, I am currently trying to find a good solution for the communication between CODESYS Control on Raspberry Pi and "the rest of the world", i. e. the things apart from CODESYS on my linux. My first approach was to use the c-integration. So I created a lib, defined extern fbs, compiled the code on my Pi using the SDK and put the .so into my lib project. When I try to log into the Pi and load the program, I get the error message which you can see in the attached picture. "Die dynamischen Module der C-Integration konnten nicht auf das Laufzeitsystem geladen werden" is german and means roughly "the modules from the c-integration could not be loaded onto the runtime system." Is this normal? Am I doing something wrong? I will have a look at the unix domain socket thing next, as I am still in the process of finding the best solution for the communication.
Last updated: 2024-02-15
Post by manuknecht on High Cycle Times for SoftMotion_PlanningTask when using AxisGroup
CODESYS Forge
talk
(Post)
Hello all I am using an AxisGroup with the Gantry2 Kinematics to move a 2D-Gantry system. When creating the AxisGroup, the SoftMotion_PlanningTask is created automatically with a cycle time of 2 ms in my case. I realized that the maximum cycle time of this task can spike to very high values (up to 60 ms) at lower speeds of the motion, leading to synchronization issues and errors on the axes. The same behaviour - though not as drastic - can be observed with virtual axes too. Is this behaviour intended or to be expected? Can the cycle time or type of the SoftMotion_PlanningTask be changed to prevent these errors? Or is there another fix for this issue? I tried changing the cycle type to Freewheeling, which solved the synchronization issues, but caused an error on the AxisGroup after a while, reading SMC_CP_QUEUE_UNDERRUN. Thanks in advance and best regards Manuel
Last updated: 2024-03-07
Post by thewizard8 on Raspberry PI4 Serial Port
CODESYS Forge
talk
(Post)
Hi Dear All, I'm using my raspberry PI4 as a CoDeSyS PLC (Build from scratch with custom electronics). I was able to implement all fieldbuses with the exception of Modbus Serial. I'm using the internal Port (GPIO) and I configured it in /etc/Codesyscontrol_user.cfg the following away: [SysCom] Linux.Devicefile.1=/dev/ttyUSB0 Linux.Devicefile.2=/dev/ttyS0 I'm using COM2 on Master configuration. I'm using a interface board from TTL/RS485 (bidirectional board), and it's works perfectly with other devices but not in CoDeSyS. I'm able to send data with python script and read it on my pc using putty, but when I use a modbus slave simulator to interface with codesys I always get red icons on master and slave. (Please find image attached). I'm pretty shure that this might be a bad parameter on my CoDeSyS runtime configurstion file. Can someone help me? I'm stuck and this is for my master degree certification.
Last updated: 2024-03-18
Post by fontrap on cmDongle Raspberry Pi issue
CODESYS Forge
talk
(Post)
Hello mates, I'm working with CODESYS V3.5 SP20 on a Raspberry Pi and I use "Raspberry Pi MC SL" as device on the project. I've installed the Control Standard L (multicore) license on a Wibu System usb-Dongle (cmStick/4.50) that already had another license from another vendor. I follow the online activation procedure from CODESYS documentation. Raspberry Pi has already CodeMeter installed for the other license. When I plugin the dongle on Raspberry and start the Runtime from Raspberry Pi Update in CODESYS I receive the message that I'm on Demo mode because the license is missing. I double checked that the license is activated in the dongle, through the WebAdmin of CodeMeter and the second license runs properly without any issue. I have already try to change the dongle from HID to MSD device and backward but the the Runtime cannot recognize the Dongle. I have also try to stop and start the Runtime through CODESYS without success. Is there anything else I can do to fix this issue?
Last updated: 2024-04-22
Post by phoward131 on Alarm State Icon
CODESYS Forge
talk
(Post)
I am trying to create an icon on an overview screen that depicts if an alarm group has active alarms, active acknowledged alarms, or inactive unacknowledged alarms (waiting for confirmation). I've attempted to set up Notification Actions in the Alarm Class to set variables based on state changes but have been unable to find a clean and effective way to do this. Because an action on any alarm will trigger the variable to be set as instructed, I'm struggling to find a way to configure it for what I need (ie if two alarms activate, then one deactivates, the variable for indicating an alarm is active would be cleared after the single deactivation). I've been pointed toward the Alarm Manager example project but I'm finding it too complicated to understand how to implement it in my own project. Has anyone come up with another good way to indicate the states of alarms or a simpler usage of the Alarm Manager functions?
Last updated: 2024-04-23
Post by timvh on License problem gateway
CODESYS Forge
talk
(Post)
What we are trying to explain is that, yes CODESYS creates the software, but Epis decides how they implement it on their hardware, which runtime version they use and they decide which functionality they support. So it is always a combination of the two. What CODESYS provides is a runtime with options for e.g. visualization or softmotion. Epis could add this softmotion license as default to their controller, but if they don't then CODESYS provides another option with a single license in a "Wibu CodeMeter" container. Eventhough the feature exists, Epis has to add this "CodeMeter" software on their controller to be able to access the licenses in the container. We don't know if they did this. Then finally it depends on what type of runtime is on this controller and which license Epis is using. So if they have an OEM license (not an application based license), then most likely you will need the Softmotion license (not a number of axis). See https://store.codesys.com/en/codesys-softmotion-sl-bundle.html. But to be sure if this is supported by the Epis controller, you must ask Epis.
Last updated: 2024-04-30
Post by tama00 on GPIOs not running with Raspberry Pi 4 (and SPI connection)
CODESYS Forge
talk
(Post)
Hello everyone, I have a working SPI connection (with transferExt) between a Raspberry master with Codesys and an ESP32 slave. I would also like to use a few GPIO pins. Is there a problem with using SPI AND GPIOs? Environment: Raspberry Pi 4+ with Raspian from Oct 23 Codesys V3.4 SP19 Patch 5 with Runtime Version 4.10.0.0 Device: GPIOs B+/Pi2 My problem: The status is displayed as “GPIOs : not running”. And also during mapping the message “The bus is not running. The values shown are perhaps not actual”. However, the variable changes that I make in my program are displayed under “Current Value”. In the Logic Analyzer, the pin toggles during transmission with small intervals of +-4us (seems to be a cyclical disorder, but I don't know where exactly it could be coming from). This applies to pins that I actually use (output) but also to the other GPIOs (not used). With GPIO 4, the line remains permanently high. Attached is a screenshot from the Logic Analyzer. Channel 1,3,5 were GPIO pin 26, 22, 17 Would be very grateful for help. Best regards
Last updated: 2024-05-06
Post by wpawago on Message view - Column "Action"
CODESYS Forge
talk
(Post)
Hello everyone, I am with Codesys SP21 Patch5, there is an "Action" column in the Messages view, located between "Description" and "Project". Does anyone know how this column is supposed to work? I could not find any information about it in the CODESYS documentation: https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_cmd_messages.html I tried using it with Static Analysis Light, for example with the unused variables check, but the Action field remains empty. I initially thought it might provide a quick fix, such as automatically deleting the unused variable, but that does not seem to be the case. I am also developing some IronPython scripts and was wondering whether it is possible to populate this column with a custom action, allowing users to trigger a predefined command directly from the Messages view. Has anyone worked with this feature before or knows if it is exposed through the scripting API?
Last updated: 2026-08-26
Post by bmatlove on Re-create CoE online window in Visu
CODESYS Forge
talk
(Post)
Hello, I am trying to re-create the CoE online window within a Visu for purposes of checking and interacting with device parameters occasionally for maintenance purposes. To minimize reliance on using the IDE for misc interactions. Ideally, I would like to exactly mimic the CoE online window within the IDE. I assume that it uses a few tricks to minimize overhead, such as only polling registers which are within the visual scope, for example. I'm afraid it might be too much to ask for a pre-built drop-in Visu module to exist for this task. Do I have any options aside from manually re-creating all the logic to do this, relying heavily on SdoInfo function blocks? Is there a way for me to reference the device ESI file to shortcut the process of determining how many registers there are and getting the address for each?
Last updated: 2025-12-27
Post by mrkm-dic on CODESYS: Combining Master Redundancy with EtherCAT Ring Topology – Is it Supported?
CODESYS Forge
talk
(Post)
Hello, I would like to ask whether it is technically supported (and practically achievable) to combine CODESYS Master Redundancy with EtherCAT ring (loop) redundancy in the same system. System setup CODESYS version: CODESYS 3.5.21.40 CODESYS Control SL for Weidmuller u-OS-4.12.2.0 Controllers (Masters): Weidmuller UC20-M4000 ×2, configured as Active / Standby using CODESYS redundancy EtherCAT Slaves: Weidmuller UR20-FBC-EC ×3, supporting EtherCAT ring / line break detection Topology: EtherCAT ring (loop) Main question Is it officially supported to use: ・CODESYS PLC/Master redundancy (Active/Standby) and ・EtherCAT ring topology (for cable redundancy) at the same time? Expected behavior Our expectation is: ・When the Active PLC fails, the Standby PLC becomes Active ・The Standby PLC then takes over the role of EtherCAT Master ・EtherCAT communication is re-established ・I/O control continues after reinitialization (a short interruption is acceptable; no strict bumpless requirement) We do not expect completely seamless / zero-cycle switchover, but we want to understand: ・Whether this combination is supported by design ・Or whether there are known limitations or restrictions when EtherCAT ring mode is used together with Master redundancy Clarification At this stage, the question is mainly about feasibility and support, not about a specific error message yet. Any official guidance, limitations, or real-world experience would be greatly appreciated. Thank you in advance.
Last updated: 2026-02-05
Post by konstantin on Lenze i950 Servo and WAGO PFC200
CODESYS Forge
talk
(Post)
Hello, In our workshop we have a Lenze i950 servo drive that has an EtherCAT bus and CiA402 compatibility. The WAGO is PFC200 750-8212 and as per documentation it has built-in license for SoftMotion Light functionality. It is not capable of supporting the full SoftMotion functionality like gearing and synchronizing. I added the EtherCAT esi files from Lenze and the EtherCAT master does see the drive, then I added a SoftMotion Light Axis object. The problem is that I can only energize the axis, I cannot execute any other commands. I set the positive and negative torque limits from the PDOs to 200% and when I try to move the axis by force it does not move back to its original position. I use the SML function blocks from the PLCOpen library and the error from the function blocks is that the op mode cannot be changed. Then I tried using a standard SoftMotion axis object and everything works fine, except the MC_Home function block. The axis moves back to its position when forced out of it. I follow this guide from Lenze - Lenze i950 CODESYS V3 What could cause this issue with the SoftMotion Light axis object? Best Regards Konstantin Kolev
Last updated: 2026-02-11
Post by pernockham on Gateway in China - "Gateway not connected"
CODESYS Forge
talk
(Post)
Some new test. Now I cannot connect from Automation server to my gateway in any way also from my office setup with my unit directly connected to my router by dhcp. I can use the IDE and the tool "Connect Edge Gateway" and successfully connect to my server/link to my Automation server account. However no PLC will respond from Automation server "Network scan". I guess the traffic should be initiated by the gateway towards automation server? Any tips on how I can diagnose my problem? Ports to be opened etc? Thing is that this has been working previously but not now (base system has been updated from debian 12 to debian 13, but I dont know at which point it has stopped working). Setup as before. A "Codesys Control for Linux SL" running on a debian 13 installation. Any help/tips appreciated! Per Update. Found the error. Had a wrong gateway-setting. Which meant the PLC could not reach internet. Checked by "ping google.com" from the PLC.
Last updated: 2026-02-12
Post by anthony-p on Codesys Installation problem
CODESYS Forge
talk
(Post)
Hello, I'm trying to install Codesys SP21p6 (but the error occurs in SP22 too for eg.) but it fails to install ApplicationComposer. Trying to install myself (version 4.4.0.0 or 4.5.0.0) by clicking 'changing the installation' from the Codesys Installer isn't better. The only message I get is "An error occured during the installation: The file [..]/ApplicationComposer.plugin.dll isn't a valid plugin" How is that? The installation went good the last time before a reinstallation... However, installing the version 4.3.0.0 seems to be successful without knowing what's the difference. I already tried to : - Restart my computer - Delete all temporary files in C:\ProgramData\CODESYS\Temporary Files - Download the package from the store - Compare the ApplicationComposer.plugin.dll from another computer (where the installation is OK) and it's exatly the same For your information, I can install other packages, such as Codesys CFC Can you help me? Do you have any idea of what could be the problem?
Last updated: 2026-06-16
Post by hhermsen on Codesys v3.5.22.10 - Internal error:System.AggregateException...Value cannot be null...Parameter name: expLValue
CODESYS Forge
talk
(Post)
I pinpointed down 4 possible causes for this compiler error: Bare/empty statements (;) standing alone inside an IF/CASE branch — just removed two instances. The optimizer that tries to inline/replace expression statements may choke when a statement has no actual assignment to extract. A VAR_IN_OUT parameter used directly as a FOR loop's own control variable (FOR X := X TO Y DO) General deep-nesting complexity — every one of my decode routines has the same shape (IF busy THEN ... FOR loop containing nested CASE/IF chains ... END_IF), and the crash trace consistently shows for loop → sequence → ifst → sequence → ifst → sequence regardless of the code change. This raises the possibility that it's not one specific statement but a structural depth/complexity limit in SP22.x's compiler optimizer — which would mean no small code change fixes the issue. Only restructuring to reduce nesting depth, or downgrading the compiler will. Something entirely outside my library files — which cannot not ruled out since the exact stack trace was triggered by a Visualization object, in a totally different codebase. This means the same crash signature can come from unrelated causes. IMHO cause 3 seems the most probable one..
Last updated: 2026-07-11
Post by thejesh on WebVisu: switch-frame destroys and rebuilds referenced visualization - is retention configurable?
CODESYS Forge
talk
(Post)
Hi, HTML5 Conrtrol elements on CODESYS V3.5 SP22 Patch 2, WebVisu only (no TargetVisu). The client is Chromium 147 in kiosk mode on a Raspberry Pi CM5 panel; the runtime is CODESYS Control Win V3 x64/CODESYS Control RTE V3 x64 on a separate IPC. I have measured that changing a Frame element's switch-frame variable destroys the currently referenced visualization and fully rebuilds it on return, including all embedded HTML5 controls. We would like to know whether this lifecycle is configurable. Measurement 1: Curently, our production page contains a good number of custom HTML5 controls and will only increase , each of which the WebVisu client instantiates as a separate about:srcdoc iframe. I counted live targets via the Chromium remote debugging endpoint (curl http://localhost:9222/json/list) before and after switching. Production displayed (index 0) 108 iframes Switched to a light page (index 1) 46 iframes Switched back to Production 108 iframes 62 controls are destroyed on leaving the page and re-instantiated on return. Observed latency was approximately 2.5 -5s away from the heavy page and approximately 4.0 -5 s back to it. This was measured with the panel otherwise idle: 2.8% system CPU, 97.1% idle, 2 h 56 min uptime, no remote-desktop session running, hardware acceleration confirmed active in chrome://gpu. I had previously measured the same behaviour under a much higher CPU load and have since resolved that load separately (VISU_TASK cycle period), so I am confident the rebuild is the frame lifecycle itself and not CPU starvation. Measurement 2 — frame offset instead of switch index I then displayed the same overlay page by a different mechanism. Instead of using a switch-frame index, I placed the page in a fixed Frame parked off-screen below the visible canvas, and drive its Y offset from an INT in Structured Text to move it into view. With this approach the overlay appears immediately, the production page underneath is never torn down and keeps updating, and no visualization is destroyed or rebuilt in either direction. The iframe count does not change at any point. This is the same visualization, containing the same HTML5 controls, as in Measurement 1 — the only difference is how it is brought on screen. So the rebuild appears to be a property of the switch-frame mechanism specifically, not of the page or its control count. Questions: Is the destroy-and-rebuild behavior on switch-frame the intended and documented lifecycle for WebVisu? Is there any setting, property or client option that causes a referenced visualization to remain instantiated when it is not the active index — the equivalent of keeping it mounted but not displayed? Does the runtime or client offer any form of caching or pre-instantiation for referenced visualizations, so that a return switch does not pay the full construction cost? Is the cost specific to HTML5 controls, or would the same rebuild occur with an equivalent number of native visualization elements? We ask because it would inform whether reducing our HTML5 control count is a viable solution. Is there a recommended pattern for showing a full-screen page over a live production screen without tearing the production screen down? My current workaround is to keep every page permanently instantiated and move it on and off screen by driving a frame offset variable, which avoids the rebuild entirely but means every page stays live and consumes client resources for the life of the session. This works, but I would prefer to use the supported mechanism if one exists. Any help on this is greatly appreciated. Thank you!
Last updated: 2026-08-07
Post by mondinmr on Frustration-Fueled Feedback on Project File Management and Git Integration
CODESYS Forge
talk
(Post)
Good day, I’m writing this message out of frustration regarding the current way project files are saved as encrypted XML and single-file format in CODESYS. I find this approach to be quite tedious for several reasons: Limited Access to Structured Text: Not being able to access Structured Text (ST) externally makes it impossible to work with alternative editors like VSCode. Tools like VSCode are incredibly responsive and feature advanced systems such as GitHub Copilot, which would be a real game-changer when working with ST IEC. While CODESYS works well for small code snippets or debugging, when the codebase grows, switching to VSCode to boost productivity becomes essential, and copy-pasting between environments is a cumbersome workaround. Poor Integration with Git: This file format also makes it very difficult to integrate effectively with Git. I have tested the internal demo, but for advanced merges, it is unusable. Without properly formatted plain text, it’s impossible to leverage the vast ecosystem of external tools around Git that allow smooth merges in heterogeneous teams. File Corruption on Network Drives: I often work from multiple locations with shared network drives. When the development environment saves a file and something goes wrong midway (which can occasionally happen when using VPNs and network drives), the entire project becomes irrecoverable. There’s no way to cancel the save process, and the development environment freezes. This has happened to me at least four times over the past two weeks, and one of those incidents cost me an entire day of work. All of this is particularly disappointing because I truly believe that the libraries, runtime, and overall work done by CODESYS are exceptional. I find it fantastic that there is a platform allowing development of PLCs and control systems using OOP, which is a huge advantage in modern control engineering. I apologize for the rant, but this issue has been extremely frustrating. Best regards.
Last updated: 2024-10-15
Post by madskaizer on Task Priority Documentation?
CODESYS Forge
talk
(Post)
Hi All I was watching the Wago PFC300 webinar ( https://www.wago.com/global/lp-thank-you-onlineseminar-pfc-300 ), and the presenters comment about priority 1 being way above the Ethernet task priority, so that a priority 1 PLC program can actually loose SCADA connection, made me try to round up some hard evidence on Codesys Priorities. I find there is very little information on "correct" task priority configuration. There is a lot of different hardware manufacturers, using Codesys Runtime, that has different descriptions in their manuals on how to set up priority. https://doku.amk-motion.com/en/Subsystems/PDK_202975_A-Serie_en/Content/Projekt/AMKAMAC/PDK_202975_A4-A5_Produktbeschreibung/Funktionalitaet/PLC-Programming/PLC%20Tasks.htm?TocPath=PLC-Programming%7C_____7 https://product-help.schneider-electric.com/Machine%20Expert/V1.1/en/SoMProg/index.htm?#t=SoMProg%2FTask_Editor%2FTask_Editor-7.htm&rhsearch=priority&rhhlterm=priority&rhsyns=%20&SUBSTRSRCH=1 https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_f_task_configuration.html So my questions :) 1) If there is only 1 PLC_PRG task, does priority matter? 2) What is the priority of Ethernet / communication, if nothing is entered? 3) What is the priority of Codesys OPC UA server? 4) Some users here on forge mentions that Wago PLC programs should run as priority 11, but where does this recommendation origin from? 5) What are you recommendations for a relatively slow process, like building automation? It uses OPC UA for communication to SCADA, maybe some MODBUS-RTU and MODBUS-TCP, usually around 100 I/O, been running with everything in a single task at priority 1, 50-100ms cycle time. Some controllers have separate MODBUS tasks, but doesn't seem like a big difference. How would you recommend splitting up communication, IO fieldbus and programs into differently prioritized tasks? I know its a complex matter and all about my application, but I really miss there was just some kind of guidance in the documentations and with all new standard Codesys programs having priority 1 as default, makes it seem less important, than it really is.
Last updated: 2025-08-11
Post by rkohser on Scripted Git clone / checkout being blocked by "Project Environment" popup
CODESYS Forge
talk
(Post)
Hi, I am trying to build a CI/CD pipeline around our codesys projects. The only entry point if the git url and branch, as we do not put our project file under source control, so we needed to find a way to git clone from the python scripting engine. This is currently how we do this : system.commands["Git", "Clone"].execute( "ProjectLocation=" + project_dir, "ProjectName=" + project_file_name, "RemoteUrl=" + project_git_remote_url, "GitProjectStoragePath=" + project_git_local_dir, ) system.commands["Git", "Checkout", "Branch"].execute( "PrimaryProjectHandle=0", "BranchName=origin/" + project_git_branch ) This works fine, except that, depending on the environment and the project, the "Project Environment" popup gets displayed to suggest for some updates, and waits for a user interaction, even with the "--noUI" flag injected as parameter. I investigated the VersionUpdateFlags, but the problem is that the git clone is an atomic operation that clones and directly opens the generated project without the possibility to inject any updateFlags argument (only used in the ScripProjects.open() function. I also tried to simulate some keyboard events acknowledge the window from script but I did not find the right location for the SendKeys statement, I think before the git clone call is too early and after is too late. So I am wondering if there would be some other way to do that. Is there some more proper scripting api for the git add on ? Is there a global configuration of the VersionUpdateFlags that would allow the popup to be disabled outside from any project context ? Is there some way to automatically acknowledge this kind of messages in a "--noUI" mode ? What do you suggest ? Thanks for your help, Roland Edit : I managed to solve my problem by following these steps in my pipeline : - create a template of a project and opt file preconfigured not to open the popup - open this project - initialize an empty git repo - add the remote, fetch and checkout the needed branch -> no popup is displayed, hourra Edit2 : The initial question was raised on a CODESYS V3.5 SP18 Patch 2 profile. Since CODESYS 3.5.19.30 a scripting API is available for Codesys Git that allows cloning a project with the support of VersionUpdateFlags https://content.helpme-codesys.com/en/CODESYS%20Git/_git_using_scripting.html
Last updated: 2024-01-19
Post by alessandro on SysMemCmp SysMemCpy
CODESYS Forge
talk
(Post)
VAR Data1:ARRAY[1..10] OF SINT ; Data2:ARRAY[1..10] OF SINT ; Data3:ARRAY[1..10] OF SINT ; Data4:ARRAY[1..10] OF SINT ; ex_1 : BOOL ; ex_2 : BOOL ; enable : BOOL :=0 ; END_VAR // PROGRAM // The scope of this example is compare and copy the values of two ARRAY only if some value is different using SysMemCmp and SysMemCpy. // In this 2 example we don't use a FOR cicle for do this, and pBuffer1 and pBuffer2 is just a pointer to ARRAY. See details in Library util.SysMem of Codesys // The compare funcion util.SysMem.SysMemCmp is bidirectional if Data1 chanege respect Data2 ex_1 go to 1 and if Data2 change respect Data1 also // but the copy function util.SysMem.SysMemCpy work only from source ARRAY pSrc:=ADR(Data1) to destination ARRAY pDest:=ADR(Data2) // Example 1 Full ARRAY compare and copy // This compare 2 different equal ARRAY and if there is some difference ex_1 go to 1 and if you give enable he copy Data1 in Data2 ex_1 := TO_BOOL(util.SysMem.SysMemCmp(pBuffer1:=ADR(Data1), pBuffer2:=ADR(Data2), udiCount:=SIZEOF(Data1))); IF ex_1 AND enable THEN util.SysMem.SysMemCpy(pDest:=ADR(Data2), pSrc:=ADR(Data1), udiCount:=SIZEOF(Data1)); END_IF // Example 2 Only selected area of the ARRAY compare and copy // This compare 2 different equal ARRAY starting from position number [3] for 4 byte in this case start at position [3] and finish at position number [6] // and if there is some difference only in area [3..6] of the ARRAY ex_2 go to 1 if you give enalbe he copy Data3[3..6] in Data4[3..6] // if something change in other array position[0..2] or [7..10] are ingnored ex_2 := TO_BOOL(util.SysMem.SysMemCmp(pBuffer1:=ADR(Data3[3]), pBuffer2:=ADR(Data4[3]), udiCount:=4)); IF ex_2 AND enable THEN util.SysMem.SysMemCpy(pDest:=ADR(Data4[3]), pSrc:=ADR(Data3[3]), udiCount:=4); END_IF // Attention udiCount input is intended in <byte> in the example 1 I pass to udiCount:=SIZEOF(Data1) for compare and copy the intere ARRAY and // SIZEOF pass the size of intere ARRAY in byte to the function input, in this 2 examples I used variable type SINT each one occupie 1 byte and one position in the ARRAY // and in the example 2 I pass udiCount:=4 for compare and copy only 4 position of Data3/4[3..6] if you want to extend this example and use it for an ARRAY OF WORD // remember that each WORD will occupe 2 byte (16 bit) and you will have to pass udiCount:=SIZEOF(Data1) if you need to compare intere ARRAY example 1 // but need udiCount:=(42) for the example 2 because need to compare and copy 4 word each occupie 2 byte (16 bit). // For REAL (32 bit) need udiCount:=SIZEOF(44) for LREAL or (64 bit) need udiCount:=SIZEOF(416) // a good rule is calculate the dimension of the ARRAY in byte without empty space at the end, multiple of data type number for variable bigger then 8 bit // Example : If you want to create an ARRAY for 5 REAL (32 bit) each occupie 4 byte the correct size is ARRAY[0..19] OF REAL 54=20 position. // NOTE : In the example the position of compare function util.SysMem.SysMemCmp is first and the copy function util.SysMem.SysMemCpy inside the IF is after // in one cycle of the program the two array is compared and if there is some difference and enable are copied. // If you move util.SysMem.SysMemCmp after the IF cycle he will copare the ARRAY in the current cycle but the copy of the value will do in the next cycle.</byte>
Last updated: 2025-10-24
Post by ofey on Codesys Soft PLC OPC UA server
CODESYS Forge
talk
(Post)
Hi! I'm sorry if this has been asked before. I have tried looking up previous topics regaring this, but even though I'm following tutorials and other posts I cant seem to get this to work consistently. I actually got the connection established on a test project after some trial and error. I only got it to work with the "Anonymous login". But after i deleted the test project and tried to get the same thing to work on another project I cant get it to work anymore. What I'm trying to do: Set up and OPC UA Server using CODESYS with the free soft PLC. I then try to connect to the OPC UA Server with the program "UaExpert". What happens: I get the error Error "'BadUserAccessDenied' was returned during ActivateSession". What I have done in CODESYS: - Added the object "Symbol configuration" and checked some test variables - Checked "Support OPC UA features - In "Communication settings -> device -> Change runtime security policy" I have checked "Allow anonymous login" What I have done in UAExpert: - Found the OPC UA server under "local". (It is showing two servers though, I do not know why. It showed the same when it worked yesterday). Se attachment - Checked "Anonymous" under "Authentication settings in the OPC UA server. I'm new to CODESYS, so it could be something elementary wrong in my settings. Maybe something in the user settings in CODESYS regarding user rights or something?
Last updated: 2023-09-14
Post by riccardo on VisuElems.CurrentUserGroupId is not stable
CODESYS Forge
talk
(Post)
GoodMorning everyone. I have a system that, in case of alarm, have to block. When the operator logs in must have to acknoledge the alarm and should operate in the system freely. To perform this I detect the logged User by (VisuElems.CurrentUserGroupID <> 0) with a similar code to the the following: PROGRAM AlarmMngt VAR alarm : BOOL:= FALSE; Ack : BOOL:= TRUE; PushBottonOpening : BOOL:= FALSE; Valve : BOOL := FALSE; Flag: BOOL := FALSE; END_VAR IF alarm AND Ack AND (NOT Flag) THEN valve := FALSE; PushBottonOpening := FALSE; Ack := FALSE flag := TRUE; ELSIF (NOT alarm) AND Ack THEN flag := FALSE; END_IF (* if the system is in alarm but there is a logged operator that acknowledge the alarm the system allows the valve opening.*) IF (VisuElems.CurrentUserGroupID <> 0) AND Ack AND Alarm AND PushBottonOpening THEN Valve := TRUE; ELSIF (VisuElems.CurrentUserGroupID = 0) AND Alarm THEN valve := FALSE; END_IF The problem I have is in the last 5 lines of the code: Even if there is a logged in user, the GroupID variable is subjected to a refresh that cyclically set for an instant it to 0 and this close the valve making difficult to the user to work Now I solved it creating a time hysteresys cycle but it is not a good solution. Someone is able to explane me why the GroupID variable is sobjected to this refresh and how to stabilize to avoiding it? Thank you in advance, Riccardo
Last updated: 2023-11-10
Post by duvanmoreno24 on Modbus writing on value change
CODESYS Forge
talk
(Post)
Yes, I tried to do what you put in the first code. However, I have a problem with that and that is that the inputs must be declared with the type. I have many data types running in my code (real, int, uint, bool) and I can't put them in the same function, another thing is that I need to instantiate that function for everything I want to write to the slave. You put a for to 200 but it means that it has to be the same data type and inside the array, but I want to get them individually. I'm struggling to do it in a good and efficient way like wago's E-cockpit does. in the first screenshot you can see, you simply type in value, change the package of things you want to write in value change and it does everything by itself automatically, without comparing any old and new values and even less having the need to activate a bool. , it is perfect.
Last updated: 2024-04-03
Post by rmaas on Strange Behavior on Raspberry Pi
CODESYS Forge
talk
(Post)
Hello, what you are seeing is not strange behavior. The problem is that everyting is happening in the same program cycle. After the variable Stepnumber is changed from 10 to 20 for example then you want the program to wait with the next EQ until the next program cycle. Else every EQ will be be true because in every line the variable Stepnumber is increased. When the program arrives (still in the same cycle) at the line with the timer, the Stepnumber has been increased to 30 in the meantime and the timer will allway be ON because even though the variable is written to 10 in this line in the next cycle it starts with 10 and will be 30 again before reaching the timer in line 8. Not very good at explaining stuff but i hope you get the problem. See screenshot below for an example of one way you could solve this...
Last updated: 2024-06-18
Post by alex-at-xana on EThercat Dynamic configuration
CODESYS Forge
talk
(Post)
Hi Everyone, For a fast monitoring system I am using Ethercat oversampling and timestamping inputs. As the customers has a lot of different configurations out in the field, we went for a dynamic Ethercat configuration. Already got the whole detection chain working but now I am stuck since two days in debugging the configuration. Here are my quesitons: I extended the dynamic config example for the EL3632 16#0E303052: //EL3632 pSlave^.SetDCSettings(TRUE,TRUE,80,80,TRUE,4000,0,0); pSlave^.AddSyncManager(16#1000,128,16#26,TRUE,3); pSlave^.AddSyncManager(16#1080,128,16#22,TRUE,2); pSlave^.AddSyncManager(16#1100,0,16#4,TRUE,1); pSlave^.AddSyncManager(16#1110,214,16#20,TRUE,0); pSlave^.AddFMMU(0,214,0,7,16#1110,0,1,1); pSlave^.AddFMMU(0,1,0,0,16#80D,0,1,1); xKnown := TRUE; This leads to a PLL Error for these devices. I double and triple checked the configuraton, but cannot find the issue. There seems to be one difference: the config dialog creates a startup parameter: 16#10F3:16#05, Name: Command_0, Value:0. Bitlen: 16, Stop on fault: false, jumpt at fault: false: next line: 0 a) I do not find information on how to set this in my code. Can you help me there? b) Without trying to set the value, I get a PLL error for these devices in the master log. Is the config wrong? c) Do I need to set the Master to Autoconfigure or Manual? I used autoconfigure for my tests. The stack creates input data addresses for the slaves input data range (pSlaves[i].InputData) which are different from those created when I use the Engineering tools dialogs to configure Ethercat. Specifically, the addresses seem to be aligned at 16 byte boundaries when they are created using the engineering tool, but may appear at uneven addresses when I use the script in dynamic config. I did not try to access ULINT at uneven addresses yet, but I am suspecting this may be a problem. Do I need to manually align the addresses ? Any help is appreciated...
Last updated: 2024-09-10
Post by solidlogicguy on Little endian to Float from Modbus RTU
CODESYS Forge
talk
(Post)
Hello, I got a device from which I require to read values from I am using a WAGO PLC 750-8212 and I am communicating through Modbus Master FUNCTION BLOCK from library WagoAppPLCModbus in Codesys 3.5 to this device. I already receive data from the device that is a CVM to monitor voltage from a fuel cell. The technical support of the company that makes these devices says that the data is sent in little endian form. And I want to convert it to a float value. The tech support sent me the next instructions of how to do it but I am new using codesys, so any advice or help I will really appreciate so much. Message from tech support: The process is complicated, better to do it with already implemented library in the language/program you use. Basically the process should be next: To convert the two Modbus registers containing parts of a 32-bit float in little-endian byte order to a floating-point number using mathematical operations, you first need to combine the two 16-bit integers (assuming reg1 is the lower word and reg2 is the higher word) and then interpret the result according to the IEEE 754 standard. Given: - Register 192 (reg1) = 4096 - Register 193 (reg2) = 14884 Step 1: Combine the two registers. Since we are dealing with little-endian byte order, reg2 is the high word, and reg1 is the low word: combined = reg2 * 2^16 + reg1 combined = 14884 * 65536 + 4096 combined = 975175680 + 4096 combined = 975179776 Step 2: Convert the combined value to binary: combined_binary = '1110101101011100000000000000000' Step 3: Split the binary into IEEE 754 components: Sign bit (1 bit): 0 Exponent (8 bits): 11101011 Mantissa (23 bits): 01011100000000000000000 Step 4: Convert the binary exponent to decimal and subtract the bias (127 for 32-bit floats): exponent = int('11101011', 2) - 127 exponent = 235 - 127 exponent = 108 Step 5: Calculate the mantissa as a fraction: The mantissa in IEEE 754 format is the fractional part after the leading 1 (which is implicit). Therefore, we need to convert the binary mantissa to decimal and add the implicit leading 1: mantissa_fractional = 1 + int('01011100000000000000000', 2) / 2^23 mantissa_fractional = 1 + 18688 / 8388608 mantissa_fractional = 1 + 0.002227783203125 mantissa_fractional ≈ 1.002227783203125 Step 6: Combine the sign, exponent, and mantissa to get the float value: float_value = (-1)^0 * mantissa_fractional * 2^exponent float_value = 1 * 1.002227783203125 * 2^108 Because the exponent is quite large, the resulting float value is a very large number.
Last updated: 2023-12-15
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.