Post by rohan on Child Application Alarm
CODESYS Forge
talk
(Post)
Hi All, I'm trying to develop a multi-application project that allows me to switch between applications. I currently have a parent application and several child applications, as this is the only way for them to share CAN/Ethernet communication. I've noticed that I am only able to create an Alarm Configuration for the parent application. But the children application do not seem to be displaying alarms on the Alarm Table in the visualisation for when an alarm is raised. Does anyone know of a fix, solution or a way around this? I am utilising Codesys v3.5 SP16 Patch 5 64Bit
Last updated: 2024-06-21
Post by ron-rp on Errors with VisuUserManagement library
CODESYS Forge
talk
(Post)
Hi all, I've played a bit with the VisuUserManagement library, and some other security option in my project, and I started getting this error when logging in - see attached pic. something to do with a specific screen in the library - VUM_Login. Also, Codesys started to ask me to log in to the library when logging in, asking to log in as user of the groups Maintainer or Owner, which I dont know either users (attached pic). when I close the login screen and try to log in to the PLC again, everything works again until I close and open Codesys. I do use user and password to login to the PLC, and this login screen is fine I know the user and pass I setup. anyone know what did I do wrong here and how to fix it?
Last updated: 2024-06-25
Post by tayhim on WAGO HMI Device not found
CODESYS Forge
talk
(Post)
Hello, I'm trying to connect with a Wago TP600 HMI but without success. I'm using codysis 3.5 SP19 patch 7 (SP20 block all the time) and the official wago package is installed. However, when I scan and select my device, I get a message saying that the device doesn't match the project's device object with the possibility to update the device (as shown in the attached picture). however, after choosing to update i got a message that the device is not found. I've tried with a new empty project but the same results. do you have any ideas? Thanks.
Last updated: 2024-06-25
Post by artem1223 on Synaxis of library declarations in the ST
CODESYS Forge
talk
(Post)
Codesys 3.5 17.30, plc - crevis GN-9373. I need to use RTC of pls for write in registers (need to check difference of writen 100 and 200 registers). For this i try to use SysTimeRtc (SysTimeRtc.SysTimeRtcGet) but its not working. After it i tryed to use SysTimeGetMs and something like this but still not working. Library? Mb but check project, SysTime with SysTimeRtc already, all what i know - already is here. Its my first try to learn ST (early used fbd and ladder, yeah), pls help with it. Mb problem with a syntaxis, but im not sure.
Last updated: 2025-11-26
Post by jbcregen on Accessing parameters from a structure or function block with the web interface
CODESYS Forge
talk
(Post)
I have a project with hundreds of OPC-UA variables available on the network. A lot of these variables are used actively in various scripts that run in background in the OS (Linux). I'm experimenting with Automation Server and I have a hard time understanding how the web interface populates its parameters list for a given PLC (<plc details="" parameters="" for="" plc="" 'xyz'="">).</plc> In this page, it looks like the only variables available are the ones that are of a "base" type : bool, TIME, String, INT, etc. All the variables that are nested into function blocks or structures are not available in the web interface, even if they are available to any OPC-UA client. Is this a limitation of the Automation Server or is there something that can be done in Codesys?
Last updated: 2025-12-01
Post by ranadheer on Assistance for MQTT configure with external broker (Mosquitto)
CODESYS Forge
talk
(Post)
Hi everyone Am trying to make establish MQTT connection , where am using IIOT example for this as a demo mode. where i had given IP-address of of local Linux application as a 172.31.239.67 and port number as 1883 in the PLC_PRG itself, and preparing the publish message by manually as " this is from published message", and this should receive at the subscriber side. Aim: To make communicate external publisher to the CODESYS by using MQTT protocol. By any chance having reference documents about this implementation please share here. and suggest the process to make it possible. I had uploaded reference project file after updating address in th PLG_PRG, kindly assist to configure with the broker
Last updated: 2025-12-03
Post by timvh on Codesys complains about matching versions
CODESYS Forge
talk
(Post)
Open the CODESYS Installer. Create an export file from your current PC from your current version. Then on the other PC Open the installer and install a new version based on the same essentials version, but additionally select the export file which you have created on the first PC. Or just install (import) it within the already existing version. For the installer, you can install it from: https://store.codesys.com/en/codesys-installer.html For help see: https://content.helpme-codesys.com/en/CODESYS%20Installer/_inst_install_setups_and_addons.html On PC 1, save the project as projectarchive (which will then include all the libraries and devices). Then extract this projectarchive on PC 2.
Last updated: 2025-12-15
Post by jroddball79 on PM556-TP-ETH — How to change IP address without overwriting the PLC program?
CODESYS Forge
talk
(Post)
Still looking for a solution. I have gathered more information that might help: Device: ABB AC500 PM556-TP-ETH Firmware version: 2.4.2.14993 (dated 2014) Open ports confirmed: 502 (Modbus TCP), 1200 and 1201 (CODESYS runtime). SSH (22) and HTTP (80) are not reachable. No SD card in the PLC. I can connect via Automation Builder using the current IP and Online Login works, but I have no original source project available. Automation Builder requires a full PLC download to apply IP changes, which we want to avoid as it would overwrite the running program. Any guidance on how to change the IP without a full download would be greatly appreciated. I am also open to solutions using third party tools, DCP protocol, or scripts. Thank you
Last updated: 2026-05-22
Post by arwie on Frustration-Fueled Feedback on Project File Management and Git Integration
CODESYS Forge
talk
(Post)
An other approach is to split the application into a hard real-time part running in CODESYS and the business logic running in Python asyncio. The business logic part is usually bigger and changes more often. As Python code is pure text, vscode and git are your friends. A performance example on YouTube (CODESYS SoftMotion + Python): https://www.youtube.com/watch?v=BT-L0H_4Aic Docs and code on GitHub: https://github.com/arwie/controlOS_demo/blob/main/docs/codesys_python_link.md Real-time variable exchange between a CODESYS application and a Python application running in parallel, using POSIX shared memory.
Last updated: 2026-06-21
Post by yannickasselin on Question about Demo License limitations for Modbus TCP communication and Fieldbus Instances
CODESYS Forge
talk
(Post)
As far as I know, there is no other limitations than the 2 hours limit. The demo mode should be plenty enough for testing purposes. Regarding instances. In the device tree, 1 master = 1 instance, no matter how many slaves the master is communicating with. But it is also possible that your Codesys runtime act as a slave. In this case, each slave in the device tree is one instance. You can also use the license metric tool in the IDE. This will tell you exactly how many instances you have in your project. https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_edt_device_licensed_software_metrics.html
Last updated: 2026-02-28
Post by dat422 on CODESYS crashes when adding standard OPC UA Information Model to Communication Manager
CODESYS Forge
talk
(Post)
Hi all, I am experiencing a problem when trying to add a standard OPC UA Information Model to the Communication Manager. When I try to add the following standard information models to a new or existing project http://opcfoundation.org/UA (15.07.2020) http://opcfoundation.org/UA/DI (02.06.2020) CODESYS crashes every time during the process. Adding an OPC UA Server itself works without any problem. The crash only happens when adding the standard OPC UA Information Model. CODESYS version: CODESYS V3.5 SP20 Patch 4 (64 bit) Has anyone experienced the same issue or knows a possible workaround? Thank you in advance.
Last updated: 2026-03-19
Post by timvh on Codesys v3.5.22.10 - Fail to create a project Archive
CODESYS Forge
talk
(Post)
There is an issue with adding the visu styles to the archive with Visu add-on 4.9.0.0 and 4.9.1.0. When you create the projectarchive disable the option to add the style(s) to the archive. CODESYS support informed me it will be fixed with visu add-on 4.10.0.0 (May 26th 2026). An alternative is to start CODESYS as Administrator. Then it will work with styles as well. You could start CODESYS as Administrator by first opening the CODESYS Installer. At the bottom you can select to start the Installer as Administrator. If you do this and then start the CODESYS version from this installer, it will work.
Last updated: 2026-04-25
Post by timvh on library inside library
CODESYS Forge
talk
(Post)
1) it should be possible to access the type SysTime in the project as A_Lib.SysTime. 2) you could add the SysTimeCore library to the library manager of your library (POU Pool). This might seem as a double library, but because of the placeholder resolution only one will be used. Then, in your library manager of your library, select the SysTimeCore library, right-click, select "Properties" and enable the option "Publish all IEC symbols ...." For more information about library development, you could follow our advanced training course in Ridderkerk. The next is scheduled for 24 and 25 June 2026 https://www.extendsmartcoding.nl/codesys-training/
Last updated: 2026-04-25
Post by steven-schalm on Frustration-Fueled Feedback on Project File Management and Git Integration
CODESYS Forge
talk
(Post)
Yes, it's very tedious, especially since Codesys 4 is a custom web development... At Rex Automatisierungstechnik GmbH, we've invested a lot of time in the Python interface to enable something like CI/CD, but also to export the code and re-import it after making clean modifications. Also, the fact that a class/function block is just a single file containing all the methods, props, etc. Yes, and right now I’m building my own VS Code extension with a clean LSP (Language Server Protocol) for ST, as well as an st-validator, st-formatter, st-linter, codesysPackage.json, and codesys_modules folder... Best regards, Steven Schalm / Sharok6130
Last updated: 2026-06-11
Post by mubeta on Some 'pathetic' errors in SoftMotion program
CODESYS Forge
talk
(Post)
Thank you for your interest. Your answers are in line with what I knew, so at least it comforts me that I did not misinterpret the situation. However, I don't have an exact match as, for this project over the past few days I have: 1) I have gone back to leaving the various FBs of the motion always called, all of them, and in the state machine I use a boolean to activate the various useful Execute. (But in the future I want to go back and try the programming technique with which I wanted to develop this project); 2) For the occasional error: SMC_FB_WASNT_CALLED_DURING_MOTION perhaps it was due to the fact that I had set the Ethercat bus synchronism only at the CAN master level, but not at the level of individual drives. I have now also activated it for the individual drives and it does indeed seem to have been resolved, but having also adopted the programming technique mentioned in point 1), I cannot say whether this was the solution to the problem, or instead the previous point. Is there an error ‘regulator or start not set’ in the device log before the error ‘motion generating FB wasn't called for at least one cycle’? I can't answer that right now. By now the machine is running and I am no longer there, at this one. Also, I seem to remember that the 'fbeFBerror' drive structure (5-element array), does not cycle, BUT ONCE THE 5 EVENTS AFTER SWITCHING ON, IT DOES NOT UPDATE ANYMORE (but that's another issue), so diagnostics were not easy.
Last updated: 2024-07-24
Post by edson-bueno on SysProcess Execute Command unable to run commands with special characters
CODESYS Forge
talk
(Post)
Hi, I found the same issue, and I fixed with this steps: 1st go to codesys .cfg file. sudo nano CODESYSControl.cfg Then insert this: [SysProcess] BasePriority=Realtime Command=AllowAll Now we need to grant codesys root rights on Linux. Step 1: Create or edit the systemd override configuration: sudo systemctl edit codesyscontrol In the editor that opens, insert: [Service] User=root Save and exit: Press Ctrl+O to save Press Ctrl+X to exit Step 2: Reload systemd and reboot To apply the override: sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo reboot Step 3: Confirm CODESYS is running as root After reboot, open the terminal and run: ps aux | grep codesyscontrol You should see something like: root 1234 ... /opt/codesys/bin/codesyscontrol.bin ... If instead it shows admin or another user, the override was not applied correctly. Step 4: (Optional) Confirm from within CODESYS In your CODESYS project, insert this test code to run the Linux command whoami: Make sure the lib SysProcessImplementation, SysTypes, and CmpErrors is on the project. VAR sCommand : STRING := '/usr/bin/whoami'; sOutput : STRING(255); refCommand : REFERENCE TO STRING; refOutput : REFERENCE TO STRING; resultCmd : UDINT; END_VAR refCommand REF= sCommand; refOutput REF= sOutput; SysProcessExecuteCommand2( pszCommand := refCommand, pszStdOut := refOutput, udiStdOutLen := SIZEOF(sOutput), pResult := ADR(resultCmd) ); Notes & Warnings This method gives full system access to the CODESYS runtime — do not expose this system to the public network without protection. Do not use sudo in commands inside CODESYS when the runtime is already running as root. @tomas111, in case you want to read the temperatur, use this command: sCommand:STRING:='/usr/bin/vcgencmd measure_temp';
Last updated: 2025-05-20
Post by mp9876 on Device logon problem following fresh install
CODESYS Forge
talk
(Post)
All screenshots are enclosed in MS Word document. NOTE; 4 questions features at the end. Any assistance would be greatly appreciated! Hi everyone, I am still having device logon problem following a fresh install Here are the STEPS I went through following a FRESH CODESYS Win 64 3.5.19.60 install on a different computer. ‘Gateway not configured properly’ when attempting to REFRESH from the Users and Groups. Then did Gateway manage and confirmed it was ok: This message popped out as it was a fresh install: YES then: Initially went with Administrator twice (user & password) but it did not like it. No device is responding to …: Continued by setting a new user Pressed OK and obtained the following message: Stopped and Restarted PLC at that point: Obtained the following: Attempted to login a 2nd time without success. Then I scanned the network to see if matching device can be detected: Only way to get it detected was to remove the tick in the ‘Hide non-matching devices…’ Attempted a WINK but got a return like this one: REFRESH either @ Users and Groups or @ Access Rights returns: Then created user ‘mp’ at Project level ang logged in: Understandably device user mp9876 was not valid for the Project. Device information A few questions comes to my mind following these connection attempts: 1- Gateway not configured properly message pops out because of a non-compatible device ? 2- Why would the device not be compatible ? 3- Any way to make the device compatible ? 4- Any ideas on how to get this connectivity problem to the device solved ?
Last updated: 2024-03-17
Post by vstrom on Codesys v3.5.22.10 - Internal error:System.AggregateException...Value cannot be null...Parameter name: expLValue
CODESYS Forge
talk
(Post)
Hi to all, I receive an error when I try to compile a project that in v.3.5.21.50 have no problem. The error seems to comes out when I add the Visualization part into the project. The complete error is: [ERROR] Internal error:System.AggregateException: One or more errors occurred. ---> System.Exception: Internal error in Code ---> System.ArgumentNullException: Value cannot be null. Parameter name: expLValue at _3S.CoDeSys.LanguageModelManager.LanguageModelBuilder.CreateAssignmentExpression(IExprementPosition pos, IExpression expLValue, IExpression expRValue, Operator kindof) at _3S.CoDeSys.LanguageModelManager.LanguageModelBuilder.CreateAssignmentStatement(IExprementPosition pos, IExpression expLeft, IExpression expRight) at ..(IExpression , IExpression ) at ..(_IAssignmentExpression , ) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.AssignmentStatementReplacer.ReplaceExpressionStatement(_IExpressionStatement expressionStatement, _ICompiledPOU cpou) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_IIfStatement ifst) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_IIfStatement ifst) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_IForStatement forloop) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at ..(_ICompiledPOU ) at ..(_ICompiledPOU ) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Codegeneration.(_ICompiledPOU , _ISignature ) at ..(_ICompiledPOU ) at ..(_ICompiledPOU& ) at ..() --- End of inner exception stack trace --- --- End of inner exception stack trace --- at _3S.CoDeSys.Compiler35220.CompilerPhases.CompilerPhase5_Codegenerator.(IList1 ) at _3S.CoDeSys.Compiler35220.CompilerPhases.CompilerPhase5_Codegenerator.(IScope5 , IList1 ) at _3S.CoDeSys.Compiler35220.CompilerPhases.CompilerPhase5_Codegenerator.(ICodegenerator ) at _3S.CoDeSys.Compiler35220.CompilerPhases.CompilerPhaseControllerGenerateCode.() at _3S.CoDeSys.Compiler35220.CompilerPhases.CompilerPhaseControllerGenerateCode.() ---> (Inner Exception #0) System.Exception: Internal error in Code ---> System.ArgumentNullException: Value cannot be null. Parameter name: expLValue at _3S.CoDeSys.LanguageModelManager.LanguageModelBuilder.CreateAssignmentExpression(IExprementPosition pos, IExpression expLValue, IExpression expRValue, Operator kindof) at _3S.CoDeSys.LanguageModelManager.LanguageModelBuilder.CreateAssignmentStatement(IExprementPosition pos, IExpression expLeft, IExpression expRight) at ..(IExpression , IExpression ) at ..(_IAssignmentExpression , ) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.AssignmentStatementReplacer.ReplaceExpressionStatement(_IExpressionStatement expressionStatement, _ICompiledPOU cpou) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_IIfStatement ifst) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_IIfStatement ifst) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_IForStatement forloop) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Optimization.ExpressionStatementReplacerVisitor.visit(_ISequenceStatement sequenceStatement) at ..(_ICompiledPOU ) at ..(_ICompiledPOU ) at _3S.CoDeSys.Compiler35220.Phase5_Codegeneration.Codegeneration.(_ICompiledPOU , _ISignature ) at ..(_ICompiledPOU ) at ..(_ICompiledPOU& ) at ..() --- End of inner exception stack trace ---<---
Last updated: 2026-04-22
Post by mondinmr on Frustration-Fueled Feedback on Project File Management and Git Integration
CODESYS Forge
talk
(Post)
In reality, other vendors are already moving towards integration with VS Code. B&R, for example, is likely the only one that could truly challenge Codesys in the market: they’ve overhauled their once-archaic environment (previously lacking ST OOP) and are now catching up significantly with Automation Studio Code, offering modern programming capabilities and native support for tools like Git and GitHub Copilot. The other big names in the market, frankly, are still light years behind. For smaller projects, typically handled by “wire strippers” (with all due respect!), a classic environment might be just fine. But once you’re dealing with thousands or even millions of lines of code—possibly organized in an OOP paradigm, spanning large teams, integrating third-party libraries, requiring version control, and performing comprehensive tests—a lightweight, responsive editor supercharged with AI-based features becomes essential. The real strength of something like VS Code lies in its vast ecosystem of extensions and integrations: from advanced Git support to automated build/test pipelines, and even AI-assisted autocompletion that already makes software development much more agile and productive. I understand that a PLC project involves more than just ST code (task setup, fieldbus configuration, libraries, etc.). However, there’s no technical reason not to at least provide ST files in a pure text format, making version control and collaboration far easier. B&R has clearly adopted this approach; I hope Codesys will accelerate its own efforts to offer a native, text-based integration and modern development tooling. Once you go beyond a certain level of complexity—dozens of configurations, OOP hierarchies, and distributed teams—you really do need “engineer-level” software tools, not just solutions targeting “wire strippers.” For large-scale automation projects, a more open and flexible approach is the only way to avoid chronic frustration. Let me emphasize that I truly love Codesys and consider the work done so far to be brilliant—I’d be sorry to see it overshadowed by others moving faster in this direction.
Last updated: 2025-02-18
Post by eoahe on Problem Reading Registers via Modbus from non Codesys device
CODESYS Forge
talk
(Post)
Hey Guys :) I have the following Problem using Modbus via Codesys: I'm trying to implement a Modbus Device into my codesys project. The device is a Router from Teltonika (RUT956) and it can communicate via Modbus. Currently I'm trying to implement it into my codesys prject as a slave and I'm using my windows computer as master. As it is not a codesys device (the codesys application is not uploaded to device as it has its own software) I'm having problems requesting and reading registers from the router. I've set up my windows computer as Master and implemented the router as slave. When I go online on my master device it sais that it has established a connection to the slave (router)(So I'm thinking this could work as there is a connection?). The goal is to read the GPS (latitude and longitude) data and on the homepage of teltonika you can find the register address and number of registers (adress 143 for latitude and 145 for longitude; both have a number of two registers). I've found tutorials how to read specific registers via their register address with other modbus programs (like modbus-cli), but as my entire project is established in codesys I was hoping to read these specific registers via codesys so that I can show the GPS data on my dashboard. I've tried establishing slave channels but that hasn't been working. I tried read input register channels of the length 4 but it's not possible to define specific register addresses to read via codesys so that didn't work (I jsut get a slaves device failure) and I've also tried establishing 516 (total number of registers the router sends I think?) read inputregister channels but that has the samle failure... So i guess the problem I'm having is establishing slave channels to read these specific registers. Does anyone know how to tackle this problem and has maybe had the same problem? Or maybe someone knows a workaround? I'm quite new to codesys so maybe I'm also lacking expertise...
Last updated: 2025-03-01
Post by ofey on EtherCAT fieldbus
CODESYS Forge
talk
(Post)
Hi, everyone! I'm trying to set up a PLC controller and a connection to an EtherCAT slave device in Codesys. I want to create a flexible program that I can upload to multiple controllers with different remote IO connected (same program). On one plant i may have 5 AI-cards and 3 DO-cards, and on another I may have 4 AI-cards and 2 DO-cards. For not needing to maintain several different programs wih different devices defined in the program (one for each set up) I thought that using a remote IO would make it easier having a single program. That way I could refer to different memory addresses instead of predefined slots/channels and IO's, that would give me errors if there was a different IO on the plant than what the program expected. When I tried setting up the etherCAT master, I saw that I had to define the etherCAT slave devices with the different IO'cards for me to be able to refer to the memory addresses in a PRG. Exactly what I was trying to avoid. My setup is something like a program that can handle 16 separate pump controls. In a year maybe 6 plans get deployed, and depending on how large the project is, the number of pumps can vary between 4 and 16. And the managers dont want to have IO's for all 16 pumps on every cabinet, and I dont want to maintain 16 separate projects files in case of updates etc. I thought the best way to tackle this was having a single project that read/write data to the different pump IO's by remote IO (fieldbus ethercat) addresses. And the number of pump controls are activated by an external GUI. If pump 1-6 is activated by the GUI, then the PLC-program tries to read/write input/outputs from predefined addresses for the expected IO's. My test setup is a PFC200 WAGO controller and a EtherCAT fieldbus coupler (750-354) with some IO. I hope I didn't explain this too horrible, and if there is a more easy and elegant solution for this challenge I appreciate a feedback on this.
Last updated: 2024-04-08
Post by paulg on RasPi CAA Serial example - unexpected behavior during debug
CODESYS Forge
talk
(Post)
I've trimmed down the CAA Serial Codesys example to only listen on one port but, when stepping through the Case structure in debug mode, it jumps out of the structure during a specific point in every scan (I'll point it out below after describing the setup and listing the code). I'm using a Pi 4 Model B, and I have an Arduino Nano Every plugged in via USB which is streaming the following serial message at 1 Hz: Time since opening connection: 1 s Time since opening connection: 2 s ...and so on. The Pi shows the Nano at /dev/ttyACM0 so I edited CODESYSControl_User.cfg to read: Linux.Devicefile=/dev/ttyACM The code in my PLC_PRG is (ignore some of the comments, I hadn't deleted them out from the original example): PROGRAM PLC_PRG VAR xStartTest : BOOL:= TRUE; iState : INT; xTestDone : BOOL;(* True, when the test was done succesfully *) (* Settings to communicate with the COM Port *) aCom1Params : ARRAY [1..7] OF COM.PARAMETER; como1 : COM.Open; comc1 : COM.Close; comw1 : COM.Write; comr1 : COM.Read; //sWrite : STRING := 'Test String!'; sRead : STRING(25); szRead : CAA.SIZE; xCom1OpenError : BOOL; xCom1CloseError : BOOL; xCom1WriteError : BOOL; xCom1ReadError : BOOL; END_VAR //This example shows the communication of two COM Ports with each other. //The first one writes a string of characters, which is read by the second one. //After successful execution, the two COM Ports are closed and the test is done. IF xStartTest THEN CASE iState OF 0: //The parameters are set for the COM Port aCom1Params[1].udiParameterId := COM.CAA_Parameter_Constants.udiPort; aCom1Params[1].udiValue := 1; // the correct Port should be adapted aCom1Params[2].udiParameterId := COM.CAA_Parameter_Constants.udiBaudrate; aCom1Params[2].udiValue := 115200; aCom1Params[3].udiParameterId := COM.CAA_Parameter_Constants.udiParity; aCom1Params[3].udiValue := INT_TO_UDINT(COM.PARITY.NONE); aCom1Params[4].udiParameterId := COM.CAA_Parameter_Constants.udiStopBits; aCom1Params[4].udiValue := INT_TO_UDINT(COM.STOPBIT.ONESTOPBIT); aCom1Params[5].udiParameterId := COM.CAA_Parameter_Constants.udiTimeout; aCom1Params[5].udiValue := 0; aCom1Params[6].udiParameterId := COM.CAA_Parameter_Constants.udiByteSize; aCom1Params[6].udiValue := 8; aCom1Params[7].udiParameterId := COM.CAA_Parameter_Constants.udiBinary; aCom1Params[7].udiValue := 0; //The first Port is opened with the given parameters como1(xExecute := TRUE, usiListLength:=SIZEOF(aCom1Params)/SIZEOF(COM.PARAMETER),pParameterList:= ADR(aCom1Params)); IF como1.xError THEN xCom1OpenError := TRUE; iState := 1000; END_IF //After a successful opening, the next state is reached IF como1.xDone THEN iState := 15; END_IF 15: // the reading process is started comr1(xExecute := TRUE,hCom:= como1.hCom, pBuffer:= ADR(sRead), szBuffer:= SIZEOF(sRead)); IF comr1.xError THEN xCom1ReadError := TRUE; END_IF //After completion the size of the written bytes are saved IF comr1.xDone OR comr1.xError THEN szRead := comr1.szSize; iState := 20; END_IF 20: // If everything was successful the ports are closed and the handles are released comc1(xExecute := TRUE,hCom:= como1.hCom); IF comc1.xError THEN xCom1CloseError := TRUE; END_IF IF comc1.xDone OR comc1.xError THEN iState := 25; END_IF 25: // The first port is closed and the used handle released xTestDone := TRUE; xStartTest := FALSE; iState := 0; como1(xExecute := FALSE); comw1(xExecute := FALSE); comc1(xExecute := FALSE); ELSE iState := 0; END_CASE END_IF I realize as I write this that the .udiPort should be 0 and not 1, but that shouldn't be causing the issue I'm seeing. I'm forcing xStartTest:=TRUE every scan so that I can step into each line and observe what's happening. What I see is that the port parameters are set and the port is opened with no errors, but the code jumps out of the case structure to the last line every time it reaches (and I step into) the iState:=15 line (at the end of the iState:=0 block). So every scan cycle it goes through the block for iState=0 and jumps out at the same spot. I'm a little new to PLC programming so I may be misunderstanding the flow, but shouldn't this case structure keep moving down in the same scan? If it only handles one case per scan, why doesn't the value of iState persist? Thanks! Update: I restarted the Codesys control today and I was then able to see an error for como1.eError of "WRONG_PARAMETER". I tried doing some digging and another post made me think I should add another line to CODESYSControl_User.cfg, so I now have: [SysCom] Linux.Devicefile=/dev/ttyACM portnum := COM.SysCom.SYS_COMPORT1 So now when I set .udiPort to 1, I get "NO_ERROR" but I also don't read anything from the port (i.e. szRead = 0 always). If I try setting the port to 0 (which I'm confused about, because I added a COMPORT1 line but the device shows on the Pi as ACM0), I get the "WRONG_PARAMETER" error again. Is there an easier way to troubleshoot the Pi and view what ports the Codesys runtime is actually able to see while the Pi is running?
Last updated: 2024-06-06
Post by garyl on Comments in arrays and assigning RST coil's to 600 outputs
CODESYS Forge
talk
(Post)
Hello all, im working on a project that requires me to convert an old automation direct DirectSoft PLC d2-250-1. One of the problems im encountering is that all of the comments are attached to members of the different addresses. When i convert the addresses (1777 "C" registers, 777 X registers, and 20,0000 V registers) im running into difficulties keeping the inputs/outputs correct since they are missing documentation. Is there a good way to retain the comments of the indexes in the array? Secondly, initially i was declaring the "C" and "V" addresses individually and this worked to retain the comments as to which register did what, however i ran into a problem when one rung reset (or set to 0) approximately 600 C Addresses. Since each tag is separately declared this proved to be nearly impossible without a literal wall of code that attempted to crash the program. So i converted all of the registers (C,X,Y,V) into separate structs, declared them as arrays and pointed all of the original call outs in the program to the newly defined structs. However i have now lost comments and the program is very hard to follow. Thanks for any help with this issue.
Last updated: 2023-08-31
Post by moksan on Unconnected_Send Explicit message with Route Path
CODESYS Forge
talk
(Post)
I have been trying out Unconnected_Send Explicit Message with route path.(The Unconnected_Send service shall use the Connection Manager object in each router to forward the message and to remember the return path. Vol 1.3 / 3-5.6.7) However, I could not see the correct path on Wireshark. I want to see the Unconnected_Send Message Service Code as 0x52 and also the last of the message should have the route path. I want to ask some questions about this topic. The IIoDrvEIPAcylicServices Interface has the IoDrvSendUnconnectedMessage Method. And there is a struct (EIP_SendUnconnectedMessage) for this service. But there is no information about how to implement to project, and if it is successful, does it send a message with 0x52 Unconnected_Send Service Code or not? If that is not a solution, how can I set the Unconnected_Send Explicit Message struct on Codesys? Also how can I send explicit message with route path?
Last updated: 2023-10-17
Post by timvh on VisuElems.CurrentUserGroupId is not stable
CODESYS Forge
talk
(Post)
I'm not sure what you are trying to do, but getting the CurrentUserGroupID like this will not work, because there could be multiple Visualization Clients and each can have a different user that is logged in. Also when you go online with CODESYS and open an Visualization, this is counted as a client. Probably this is the reason you see it changing. What you can to is "iterate" over all clients and then see which user is logged in on which visualization Client. For this you need to add the Visu Utils library to the project and call the FbIterateClients. See https://content.helpme-codesys.com/en/libs/Visu%20Utils/4.4.0.0/VisuUtils/VisuActionUtilities/Function-Blocks/FbIterateClients.html fbClientIteration( xExecute := x_Execute, itfClientFilter := VU.Globals.AllClients, itfIterationCallback := fbIterator, xDone => x_Done, xBusy => x_Busy, xError => x_Error, eError => e_Error); The fbIterator, in the example above, should be an instance of an FB which you have created yourself and this must implement VU.IVisualizationClientIteration. For example: FUNCTION_BLOCK FB_ITERATOR IMPLEMENTS VU.IVisualizationClientIteration Then automatically the corresponding methods will be called. In the HandleClient Method, you will get an interface to the client(s) and then you can get the current user through this interface: itfClient.UserGroupId You can also get the UserName: itfClient.UserName
Last updated: 2023-11-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.