Post by shamcke on Array with generic constant as persistent variable
CODESYS Forge
talk
(Post)
Hello, I have written a function block that uses a generic constant for the upper bound of an array. I wanted to have this array in the persistent memory area, thus I constructed my FB as follows: FUNCTION_BLOCK FbWithGenericArrayLength VAR_GENERIC CONSTANT uiArrayLength : UINT := 10; END_VAR VAR PERSISTENT arr : ARRAY[1..uiArrayLength] OF INT; END_VAR In my PLC_PRG I declare an instance of said FB PROGRAM PLC_PRG VAR myFb : FbWithGenericArrayLength<10>; END_VAR This compiles just fine. When I let CODESYS fill my persistent list, it adds duplicate entries {attribute 'qualified_only'} VAR_GLOBAL PERSISTENT RETAIN // Generated instance path of persistent variable PLC_PRG.myFb.arr: ARRAY [1..uiArrayLength] OF INT; // Generated instance path of persistent variable PLC_PRG.myFb.arr: ARRAY [1..uiArrayLength] OF INT; END_VAR so I manually delete the duplicate. When i now compile, I get errors ------ Build started: Application: Device.Sim.Device.Application ------- Typify code... [ERROR] Sandbox_FW31: PersistentVars [Device: PLC Logic: Application](Line 4): C0161: Border 'uiArrayLength' of array is no constant value [ERROR] Sandbox_FW31: PersistentVars [Device: PLC Logic: Application](Line 4): Type of mapped variable is not equal to original type Compile complete -- 2 errors, 0 warnings Build complete -- 2 errors, 0 warnings : No download possible Is is simply not possible to use a generic constant for the persistent array? Thanks in advance. Edit: It seems I can manually replace the uiArrayLength in the persisten list by the value 10 I used as the generic constant for this particular instance.
Last updated: 2026-05-29
Post by lzml on HTML5 visualization controls disabled on CODESYS Control for Linux SL - overlay not supported?
CODESYS Forge
talk
(Post)
Hello, I'm developing a custom HTML5 visualization control (via the HTML5 Control Editor / Tools > Visualization Element Repository) and I'm running into what looks like a target-device limitation when trying to deploy it to CODESYS Control for Linux SL. I'd like to understand whether this is a known/expected limitation or something in my setup. Environment - CODESYS Development System: V3.5.22.0 - Target runtime: CODESYS Control for Linux SL, package version 4.15.0.0 (installed together with CODESYS Edge Gateway for Linux 4.15.0.0) - Visu system libraries (VisuElems, VisuElemsAlarm, VisuInputs, VisuNativeControl, etc.): version 4.7.0.0 - Host OS: Debian RT (minimal/base installation) - We only use WebVisu, not TargetVisu. What I did 1. Built a custom HTML5 control following the official HTML5-API-Examples pattern (.html5control.xml manifest + ElementWrapper.js + CSS), installed it successfully via the HTML5 Control Editor ("Save and Install") into the Visualization Element Repository. 2. In the Visualization Manager, enabled "Support client animations and overlay of native elements" (documented as required for HTML5 controls to work at all). 3. With the project's Device set to CODESYS Control for Linux SL, compiling/downloading fails with: "Overlay is not supported for your target visualization device." (Visualization Manager) Build stops with 1 error, download not possible. Isolating the cause - The Visualization Element Repository confirms the control is correctly installed. - With the project Device set to a Windows-based device, the HTML5 control appears and is enabled in the Toolbox as expected. - With the project Device set to CODESYS Control for Linux SL, the HTML5 control is disabled/missing from the Toolbox entirely, even though it's installed in the repository. This points to the Linux SL device description simply not declaring overlay/HTML5 support, rather than a missing package or Debian-side dependency (WebVisu itself already works fine for standard/native visualization elements on this same target). Questions 1. Does CODESYS Control for Linux SL currently support WebVisu overlay (and therefore custom HTML5 controls)? I found documentation stating overlay support for target visualizations (Windows and Linux) was added starting with CODESYS Development System V3.5.17.0, but that seems to refer to TargetVisu, and our case is WebVisu-only on a Linux runtime. 2. If not currently supported, is this on a roadmap, or is there a different Linux runtime package/edition that does support WebVisu overlay for HTML5 controls? 3. Is there any Linux-side configuration or package needed to enable this (given the check appears to happen against a static device capability declaration rather than a live server check), or is this purely a matter of the device description bundled with the current Control for Linux SL package? Thanks in advance for any pointers.
Last updated: 2026-08-05
Post by struccc on Application failing to boot after system reboot
CODESYS Forge
talk
(Post)
I started to experience the same issue, after upgrading to 3.5.19 , and still persists with 3.5.20.3 , using CodesysControlWinV3 x64 on Windows. Unfortunately, this is a live application, normally it is running for months without interruption - so it was a surprise at the last cold start... It was not possible to go online with the original version, so I couldn't see the application, or system status, just the log message. First time I manually clean the Application from the PlcLogic directory (there was no coredump file in there), then I could start the runtime service, and do a fresh download, and set the bootproject. I could not try a cold system reboot - it's in a 24/7 production environment, and I was under heavy pressure to start... What I did, I have created a backup from the * complete * runtime directory, from the failed, and fixed version - before and after download. This directory in my case C:\ProgramData\CODESYS\CODESYSControlWinV3x64\55096128 - At the next shutdown, it was sufficient to copy back this backup completely, and could start the runtime service afterwards. Ugly, but local staff with some skills can do it without programming tool... I don't store any live data, configuration, log files, persistent data in this directory - the only reason I need this is to edit the CodesysControl... .cfg file.... And to see the logfiles in emergencies like this. The application concerned doesn't use any retain area. - exactly for these reasons - Maybe that is causing the problem with the newer runtime versions As far as I see, this problem occurs only if the power of the Windows PLC is interrupted without a proper shutdown. Unfortunately, this can happen sometimes. The newer versions, seems tp modify CodesysControl.cfg on the fly, and register the applications, and bootproject information after download. (I don't really see CodesysControl.cfg a proper location for this... but that's just my feeling) So now I had a look at CodesysCotrol.cfg on my laptop and I found: [CmpRetain] ;Retain.SRAM.Size=0x200200 ;Retain.SRAM.Address=0xFA3C5776 ;SimulateSRAM=1 [CmpApp] ;Bootproject.CreateOnDownload=0 ;Bootproject.StoreOnlyOnDownload=0 ;Bootproject.InvalidateByRename=1 ;Bootproject.InvalidateBySetting=1 ;Bootproject.InvalidateNever=0 ;PersistentForce=0 ;RetainType.Applications=InSRAM ;RetainType.Applications=OnPowerfail ;RetainType.Applications=None ;Exception.Hardware.GlobalStop=1 Application.1=MyTestAppNoRetain The last line appeared after download and boot project creation. Maybe... Should set RetainType.Applications=None? I wonder about all these settings, but... Will write separately about it. I hope this helps a little...
Last updated: 2024-11-21
Post by critcho on WebVisu Numpad dialog - Dialogtitle not accepting string variable
CODESYS Forge
talk
(Post)
I have a WebVisu page which is re-used for multiple types of gas; it displays the alarm thresholds etc. for one gas at a time. I have an array of structures holding the set-points for each of the gasses. I'm trying to change the dialog title for the value input pop-up (VisuDialogs.Numpad). The Dialogtitle is set to Gas_Alarms.HighAlarmActivationLevelDialog, which is a string(50): When the gas type is changed (page first loaded, or prev/next buttons), METHOD Gas_Alarms.Update_Display_Variables is called, to update the strings used for the dialog titles so it shows GasName High Alarm Activation Level (EngineeringUnits), e.g. CO2 High Alarm Activation Level (PPM): HighAlarmActivationLevelDialog := Insert(' High Alarm Activation Level ()', EngineeringUnits, 30); HighAlarmActivationLevelDialog := Insert(HighAlarmActivationLevelDialog, GasName, 0); (That's not where the problem is, I'm just explaining why I'm using a variable dialogue title.) The variables used are definitely strings, but i'm always getting the error: "The type of the dialog title must be either STRING or WSTRING". I've tried moving HighAlarmActivationLevelDialog etc. to the GVL and also changing them to WSTRING, I even tried adding them to the structure array, but I always get the same error. Clearing the dialog title for that element removes the error - so I'm confident it's not a phantom error caused by something else. But I should be able to add these titles, can't just nuke them all to make it work. The MinVal and MaxVal for the Numpad are called from the array, e.g. GVL.Gas_Alarm_Configs[0].ScaledValueMIN, they are not getting an error. I am using array indexes 1 - 5 for the gasses, when I load the form or change gas, I copy the selected index to index 0 of the array, and values from Gas_Alarm_Configs[0].[ALL] are displayed on the page. When they hit save, I copy Gas_Alarm_Configs[0].[ALL] to Gas_Alarm_Configs[CurrentGasIndex].[ALL]. (ALL just means every element, I can't figure out how to display an asterix in this question... :) ) I've searched online for variable title dialog, but not found anything to help. Thanks for your help!
Last updated: 2025-05-29
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 alexgooi on Modbus TCP interface get stuck
CODESYS Forge
talk
(Post)
Dear Forum, I'm currently experimenting with Modbus interfaces in combination with a virtual controller. I have the following setup (Modbus_Setup.png): I have an IPC with Debian installed on it (Debian 13). On this Debian machine I have installed a docker server and on this docker server a Codesys runtime container is deployed (Codesys_image.png). The Modbus scanner makes connection with and IO coupler and this works well. But when I physically disconnect the ethernet connection between the IPC and the IO coupler the Modbus interface gets stuck in a state where it gets stuck in the busy state (Modbus_Stuck.png). When I plug the cable back in, the IO coupler isn't communicating until the xBusy variable is manually set to False, after this action is performed the communication goes back to normal. I have tried to set the container network to host and bridge (Network.png), but both version gives the same result (stuck scanner). I would expect that the Modbus interface is generating a timeout after 1 sec, because this is how it is setup (Modbus_settings.png), but this is not what happens. I have thought to write a piece of code that writes xBusy to false when it is stuck but because it is an output I'm not able to write to it. I have tried this with another PC (different CPU/motherboard) but this gives the same outcome. I tried updating to the latest version of Virtual control (4.20) but this gives the same result. I also tried to do the same thing with an ethernet IP scanner, and this gives an error after the timeout is expired (so this works well). I have tried to connect to the IO coupler using the Modbus_FB lib (Modbus_FB.png) the FB's are giving the correct errors and behaving as expected. At last I have tried to use a Scanner on a Codesys controller (no IPC) and here the scanner behaves as expected (an alarm is triggered after the timeout has been expired). The version of the Codesys components are listed in the picture Versions.png Is there anyone that can give me a push in the right direction? Kind regards Alex
Last updated: 2026-04-14
Post by pra83 on CODESYS SoftRedundancy — Both PLCs stay standalone after network interruption — Auto recovery not working
CODESYS Forge
talk
(Post)
Hello, We are facing a critical issue with CODESYS SoftRedundancy that we have been unable to resolve despite extensive troubleshooting. HARDWARE: 2× HP EliteDesk 800 G9 SFF Intel Core i7-14700 (20 cores) 16GB RAM, 512GB NVMe SSD Windows 11 IoT Enterprise LTSC 2024 NIC1: Built-in Intel GbE NIC2: Intel I210-T1 PCIe (NIC team) SOFTWARE: CODESYS Control Win V3 - x64 Version 3.5.22.10 CODESYS SoftRedundancy SL Server 1 IP: 172.10.10.101 (PLC1 — Active) Server 2 IP: 172.10.10.102 (PLC2 — Standby) CURRENT CODESYSControl.cfg: [CmpRedundancy] BootupWaitTime=120000 StandbyWaitTime=12100 SynchronousTimeout=12100 [CmpSchedule] ProcessorLoad.Maximum=80 WatchdogTime=12000 WatchdogTimeoutAction=0 CONFIRMED WORKING: PLC1/PLC2 identification configured via IDE Connection IP configured via IDE AutoSync enabled and written via IDE Normal Active/Standby operation working Server 2 auto-promotes when Server 1 completely fails PROBLEM DESCRIPTION: When NIC1 cable is removed from Server 1 — both servers go to standalone mode. When NIC1 cable is reconnected — both servers remain in standalone indefinitely. Neither server auto-recovers to Active/Standby without manual CODESYS service restart. AutoSync fires (!!! Autosync !!! visible in log) but recovery does not complete. Tested with direct cable (no NIC team) — same result. Confirmed not a hardware or NIC teaming issue. KEY LOG MESSAGES: "Timeout: No sync message RMSG_StartCycle (5) from master: Standalone" "Socket on other side closed gracefully 0" "Standby PLC: Open acyclic work socket failed" "Connection broke after 11806ms. Check BootupWaitTime." Autosync(fires but does not complete recovery) PCAP ANALYSIS (Wireshark): CODESYS sync stops completely at T+3s Server 1 sends TCP FIN on ports 1206 and 1208 at T+5s No CODESYS redundancy traffic for remaining 24 seconds Both servers stay standalone indefinitely WHAT WE HAVE TRIED: StandbyWaitTime = 12100ms SynchronousTimeout = 12100ms WatchdogTime = 12000ms (less than StandbyWaitTime) AutoSync enabled NIC2 set as Standby adapter Disabled Windows Network Discovery Direct cable test — rules out NIC hardware QUESTION: Per official CODESYS documentation: "No automatic Reconnect is included in the functional scope of the redundancy components. You can program the triggering of a reconnect." Is RDCY.Synchronize() the correct function to add to our application for automatic recovery after both PLCs go standalone? What is preventing auto-recovery when AutoSync is enabled and PlcIdent is correctly set? Thank you for your support.
Last updated: 2026-05-02
Post by alexschooneveld on OPC UA PubSub SL 1.3 — UADP WriterGroup with assigned PSS.SecurityGroup still publishes plaintext
CODESYS Forge
talk
(Post)
I am currently investigating an OPC UA PubSub connection over UDP. When I don't use encryption, the publish and subscribe are working correctly. But with encryption it does not. Environment OPC UA PubSub SL 1.3.0.0 (namespace UADP) OPC UA PubSub Security 1.3.0.0 (namespace PSS) OPC UA PubSub Base 1.3.0.0 (namespace PSB, incl. PSS.SecurityGroup / PSS.CONFIG) Programmatic PubSub in a CFC: UADP.Configuration → UADP.Connection → UADP.writerGroup → UADP.writer → writerDataSet, plus a CyclicCall gated by xEnable. Goal: publish secured UADP, SignAndEncrypt, policy PubSub-Aes256-CTR. What I do (one-shot, before xEnable := TRUE): fbSecurityGroup.SetInitialValue( 'http://opcfoundation.org/UA/SecurityPolicy#PubSub-Aes256-CTR', PSB.SECURITY.SIGNING_AND_ENCRYPTION); stSecurityCfg := fbSecurityGroup.GetConfig(eErrorID => eError); // eError=NO_ERROR, udiEncryptionKeySize=32 eError := fbSecurityGroup.SetSecurityKeys(udiTokenId, ADR(abyKey), SIZEOF(abyKey), 2436001000); // eError=NO_ERROR, SIZEOF=68 // writerGroup.itfSecurityGroup := fbSecurityGroup -- set in the WriterGroup block's Parameters (a per-scan code write got overwritten) What I verified eError = NO_ERROR after both GetConfig and SetSecurityKeys; udiEncryptionKeySize = 32. Key length = 68 bytes (signing 32 ‖ encrypt 32 ‖ nonce 4). itfSecurityGroup is set via the WriterGroup's Parameters (so it isn't clobbered each scan). Init runs before xEnable (the writer doesn't run with xEnable=FALSE). The UADP.writerGroup FB exposes only itfSecurityGroup for security — no SecurityMode/MessageSecurityMode property. Result: the published datagrams are still plaintext — ExtendedFlags1 = 0x01 (security bit 0x10 clear), no security header: b1 01 29 00 0f 16 00 … (PublisherId 41, WriterGroupId 22, RawData, no security) Questions With UADP.writerGroup, is assigning a configured + keyed PSS.SecurityGroup to itfSecurityGroup sufficient to enable message security, or is there an additional step/property/method to switch the WriterGroup to SignAndEncrypt? At what point in the WriterGroup lifecycle is itfSecurityGroup read? Must it be assigned/keyed before xActive, and does the group need a stop→start to pick it up? Is there a required call order, and does SetSecurityKeys need to be called once or repeatedly? Should security be configured on the Connection/Configuration level rather than (or in addition to) the WriterGroup? Is there a working example of secured (SignAndEncrypt) programmatic UADP publishing with this library, or a known limitation in 1.3? How can I read back at runtime whether security is actually active (via itfDiagnostics or similar)? Additional information I can confirm that the consumer side works — i.e. a standard subscriber decrypts the same keys fine — so the keys/profile aren't the issue. The Wireshark capture of the published message is: 0000 b1 01 29 00 0f 16 00 df 0d bb 25 01 00 0e 00 1b ..).......%..... 0010 0e 00 00 00 00 00 00 00 ........
Last updated: 2026-06-22
Post by alexschooneveld on OPC UA PubSub SL 1.3 — UADP WriterGroup with assigned PSS.SecurityGroup still publishes plaintext
CODESYS Forge
talk
(Post)
I am currently investigating an OPC UA PubSub connection over UDP. When I don't use encryption, the publish and subscribe are working correctly. But with encryption it does not. Environment OPC UA PubSub SL 1.3.0.0 (namespace UADP) OPC UA PubSub Security 1.3.0.0 (namespace PSS) OPC UA PubSub Base 1.3.0.0 (namespace PSB, incl. PSS.SecurityGroup / PSS.CONFIG) Programmatic PubSub in a CFC: UADP.Configuration → UADP.Connection → UADP.writerGroup → UADP.writer → writerDataSet, plus a CyclicCall gated by xEnable. Goal: publish secured UADP, SignAndEncrypt, policy PubSub-Aes256-CTR. What I do (one-shot, before xEnable := TRUE): fbSecurityGroup.SetInitialValue( 'http://opcfoundation.org/UA/SecurityPolicy#PubSub-Aes256-CTR', PSB.SECURITY.SIGNING_AND_ENCRYPTION); stSecurityCfg := fbSecurityGroup.GetConfig(eErrorID => eError); // eError=NO_ERROR, udiEncryptionKeySize=32 eError := fbSecurityGroup.SetSecurityKeys(udiTokenId, ADR(abyKey), SIZEOF(abyKey), 2436001000); // eError=NO_ERROR, SIZEOF=68 // writerGroup.itfSecurityGroup := fbSecurityGroup -- set in the WriterGroup block's Parameters (a per-scan code write got overwritten) What I verified eError = NO_ERROR after both GetConfig and SetSecurityKeys; udiEncryptionKeySize = 32. Key length = 68 bytes (signing 32 ‖ encrypt 32 ‖ nonce 4). itfSecurityGroup is set via the WriterGroup's Parameters (so it isn't clobbered each scan). Init runs before xEnable (the writer doesn't run with xEnable=FALSE). The UADP.writerGroup FB exposes only itfSecurityGroup for security — no SecurityMode/MessageSecurityMode property. Result: the published datagrams are still plaintext — ExtendedFlags1 = 0x01 (security bit 0x10 clear), no security header: b1 01 29 00 0f 16 00 … (PublisherId 41, WriterGroupId 22, RawData, no security) Questions With UADP.writerGroup, is assigning a configured + keyed PSS.SecurityGroup to itfSecurityGroup sufficient to enable message security, or is there an additional step/property/method to switch the WriterGroup to SignAndEncrypt? At what point in the WriterGroup lifecycle is itfSecurityGroup read? Must it be assigned/keyed before xActive, and does the group need a stop→start to pick it up? Is there a required call order, and does SetSecurityKeys need to be called once or repeatedly? Should security be configured on the Connection/Configuration level rather than (or in addition to) the WriterGroup? Is there a working example of secured (SignAndEncrypt) programmatic UADP publishing with this library, or a known limitation in 1.3? How can I read back at runtime whether security is actually active (via itfDiagnostics or similar)? Additional information I can confirm that the consumer side works — i.e. a standard subscriber decrypts the same keys fine — so the keys/profile aren't the issue. The Wireshark capture of the published message is: 0000 b1 01 29 00 0f 16 00 df 0d bb 25 01 00 0e 00 1b ..).......%..... 0010 0e 00 00 00 00 00 00 00 ........
Last updated: 2026-06-22
Post by ryandmg on Web Client (HMI) Disconnects from Webvisu (Weidmuller u-OS)
CODESYS Forge
talk
(Post)
Thanks So Much for the reply! Were using the Weidmuller UV66-ADV-10-CAP-W The HMI is pointed to the URL which is assigned through u-OS. Basically when you log into the controller's webserver via browser you can view the installed apps. One of which is the Codesys runtime. When you click on that it takes you to the visualization. That corresponding url is what the HMI is looking for. I apologize I don't have that on hand as I'm in the office right now. I don't think I tried connecting using the port you mentioned and https in lieu of the u_OS URL. I can certainly try. Out of the box the u-OS is set for HTTP. Since we're isolated I havent changed that yet. When this has happened while logged on via chrome on my laptop, simply refreshing brings the visualization right back. In the case of the HMI in kiosk mode, we power cycle the HMI to force a reconnect, log back in u-OS and the visualization is back.
Last updated: 2023-09-06
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 captaincookie on increase default string length in queue
CODESYS Forge
talk
(Post)
Hello, I'm using Codesys V3.5 SP18 Patch 4. In the ElementCollectionExample Project from Codesys, I test the SimpleQueueExample in a Control Win V3 x64 environment. I try to add a string of 95 characters length to a queue. The default length of strings is defined as 80 characters. In the initialization of a string variable, it is possible to increase the length by the definition of e.g. STRING(1000). But when I write the string defined like this to the queue, only 80 characters are written to it and the rest is missing. I think the default length is still set in the queue definition, so it is necessary to change this, isn't it? Is there any option to increase the default length of strings in the queue? Attached you can find the used project. Thanks in advance. If any information are missing or my description unclear please let me know.
Last updated: 2023-10-05
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 solve-it on SysFileOpenAsync
CODESYS Forge
talk
(Post)
Just realized that it is the /dev/input/js0 file. Don't think this is a prob either. Found the ConfigFile. Where and how to add /dev/input/js0? raspberry [SysFile] FilePath.1=/etc/, 3S.dat PlcLogicPrefix=1 [SysTarget] TargetVersionMask=0 TargetVersionCompatibilityMask=0xFFFF0000 [CmpLog] Logger.0.Name=/tmp/codesyscontrol.log Logger.0.Filter=0x0000000F Logger.0.Enable=1 Logger.0.MaxEntries=1000 Logger.0.MaxFileSize=1000000 Logger.0.MaxFiles=1 Logger.0.Backend.0.ClassId=0x00000104 ;writes logger messages in a file Logger.0.Type=0x314 ;Set the timestamp to RTC [CmpSettings] FileReference.0=SysFileMap.cfg, SysFileMap FileReference.1=/etc/CODESYSControl_User.cfg [SysExcept] Linux.DisableFpuOverflowException=1 Linux.DisableFpuUnderflowException=1 Linux.DisableFpuInvalidOperationException=1 [CmpWebServer] ConnectionType=0 [CmpOpenSSL] WebServer.Cert=server.cer WebServer.PrivateKey=server.key WebServer.CipherList=HIGH [SysMem] Linux.Memlock=0 [CmpCodeMeter] InitLicenseFile.0=3SLicense.wbb [SysEthernet] Linux.ProtocolFilter=3 [CmpSchedule] ProcessorLoad.Enable=1 ProcessorLoad.Maximum=95 ProcessorLoad.Interval=5000 DisableOmittedCycleWatchdog=1 [CmpUserMgr] AsymmetricAuthKey=6873d655ac1f166f3743feea42d2f3dd1b39ae40 [CmpSecureChannel] CertificateHash=09fd8d52be4ddd45a709bc9c95e2aa093b3f5695 [SysSocket] Adapter.0.Name="eth0" Adapter.0.EnableSetIpMask=1 ;raspberry [ComponentManager] ;Component.1=CmpGateway ;Component.2=CmpGwCommDrvTcp ;Component.3=CmpGwCommDrvShm [SysCom] ;Linux.Devicefile=/dev/ttyS [CmpBlkDrvCom] ;Com.0.Name=MyCom ;Com.0.Baudrate=115200 ;Com.0.Port=3 ;Com.0.EnableAutoAddressing=1 [SysProcess] Command.0=shutdown [CmpApp] Bootproject.RetainMismatch.Init=1 ;Application.1=Application ;Application.1=Application ;Application.1=Application Application.1=Application [CmpRasPi] Architecture=armv6l [CmpRedundancyConnectionIP] [CmpRedundancy] [CmpSrv] [IoDrvEtherCAT]
Last updated: 2024-07-16
Post by programmierer on Implementing UDP Communication
CODESYS Forge
talk
(Post)
Hello everyone, I hope you can help me with my problem. I am new to programming and am currently working with a WAGO controller in our lab, which controls a heat pump. My goal is to send the electrical power of the heat pump (Pel_WP) via a UDP connection to a specific IP address. I am using Codesys version 2.3 and following the guide I found here: https://forge.codesys.com/forum/de/396/genmed-Konfiguration%20der%20UDP%20Kommunikation%20Cosesys%20S7.pdf. I have adapted the guide to suit my needs. The data sending works since I can force the reception value Pel_WP and the data is sent accordingly. However, I am having trouble with the receiving part. The reception value is not being correctly received, and the diSocket variable shows -1. The connection between the heat pump and the WAGO controller seems to be set up correctly, as the heat pump is listed under the communication parameters with the correct IP address. I have also attached images to provide a better view of the setup. I would greatly appreciate any support or suggestions for a solution. Thank you in advance!
Last updated: 2024-08-02
Post by mubeta on parker servo and position
CODESYS Forge
talk
(Post)
In general, drives have parameter sets to adjust behaviour in such cases: position recovery, adaptation with resistant torque, out-of-position window failure, etc. (Much depends on the type of configuration set for the axis: positioner, speed controller, torque controller, etc.). I have used that type of drive very little, in only two cases and a long time ago. To tell you what is normal is impossible. I know by reputation they are very simple objects, without too many pretensions and adjustments possible. Try running traces by monitoring actual position, motor current, torque and following error. These are the most sensible curves to understand what is going on. Maybe by fine tuning the motor tuning, the current controller or the speed controller you will get something closer to what you want. For example, from DS, the motor has a standstill torque of 3 Nm. Observe with traces whether this is effective: motor current trend. And afterwards, when you have your own accurate picture of the situation, you can also hear from the product's local support to see if you can steal a few more things from it performance-wise.
Last updated: 2024-08-05
Post by dogulas on OPC UA C# client connecting to OPC UA CODESYS server
CODESYS Forge
talk
(Post)
Noob alert! I’m just getting my feet wet with CODESYS. I have a “Hello World” project in the CODESYS IDE. I’m using the Win SoftPLC on the same computer. I’ve added a Communication Manager under the Application node. Under that is “OPC UA Server -> IEC Symbol Publishing 01”. I also added “OPC_UA_Symbols -> Information Model”. I’m not sure I need the second thing. I was grasping at straws. I also set up several dummy symbols in the IEC Symbol Publishing 01 node. In my C# application, I am trying to get an instance of EndpointDescription from CoreClientUtils.SelectEndpoint(“opc.tcp://localhost:1217/Gateway-1”, useSecurity: false, 15000). I wasn’t sure about the “Gateway-1”. I found that in the CODESYS IDE under the project -> Communication Settings. When I execute the previous method call in C#, I get: “BadSecureChannelClosed”. I have no idea what that means. Any pointers to documentation are welcome.
Last updated: 2024-08-16
Post by c3po on Von SNMP auf IIoT wechseln
CODESYS Forge
talk
(Post)
Hallo, 1. ich bin komplett NEU was Codesys angeht 2. ich muss direkt ein Retrofit machen von V2 auf V3 3. Neue Steuerung: WAGO 750-8211 PFC200. 4. das Projekt in V2 hat über SNMP daten im Netzwerk zur Verfügung gestellt, oder diese gelesen 5. das Projekt in V3 kann SNMP nur noch eingeschränkt nutzen, deswegen wurde mir vom WAGO Support nahegelegt die IIoT Lib zu verwenden. Frage: Wie mach ich das? Konkret: Ich habe die WagoAppSNMP Bibliothek installiert, damit kann ich schon mal Set und Get nutzen (hoffentlich, hab es ja noch nicht getestet, sondern nur programmiert). Ist das ein schlauer Weg, das über diese Lib zu machen? Denn: was macht der SNMP_SET_PLCDATA_WRITEAREA ? Den kann ich über die Wago Lib nicht nutzen und weiß auch nicht, was dieser Baustein konkret tut (Bild im Anhang). Es scheint mir, hier werden Daten auf ein Word im Netzwerk geschrieben? Aber geht das nicht auch einfacher? Es ist ja keine Adresse hinterlegt, wo das hin gehen soll oder? Also, ich verstehe den Baustein nicht so ganz und konnte bisher auch keine Erklärung dazu finden. Vielen Dank schon mal für eure Unterstützung, K.
Last updated: 2024-08-19
Post by karel-bas on Loosing connection to emulation running on Linux
CODESYS Forge
talk
(Post)
Hello, I am trying to emulate my code but for some reason my Codesys IDE keeps loosing connection to the emulator. I am constantly pinging virtual machine on which its running and its running fine, but codesys refuses to reconect to it, and is not able to rediscover it. Codesys 3.5 SP20 Patch 1 I have linux installed like image in attachment.(using version 4.12) Linux VM is set up to use up to 4 cores and 8gb of ram, with nothing else runing on it. I dont have a license so I am aware that the emulation shouldnt run for more then 120 minutes I am able to, login, get sysinfo, reboot etc from codesys IDE for certain period of time (5minutes) then my connection gets lost, sometimes I can login again, but sometimes i have to reboot the VM. Any suggestions what might be the issue ?
Last updated: 2024-09-19
Post by z870623 on About CPU Loading
CODESYS Forge
talk
(Post)
I am running a runtime environment on an ARM A35 dual-core processor (1.5GHz) and have encountered some issues. The CPU load (both CPU0 and CPU1) occasionally spikes above 50% before returning to normal, and this happens around 2-3 times per minute. At the same time, I’ve noticed that the Max Cycle Time in the Codesys monitoring screen shows much worse performance compared to the A53 (1.2GHz), with nearly double the cycle time. The optimizations I have made so far are as follows: Set the CPU to performance mode. Isolated CPUs: CPU0 is dedicated to running Linux services and the runtime itself, while CPU1 runs the EtherCAT task and the MainTask. Despite CPU1 only running these two tasks, the utilization still increases above 50%, which I find unreasonable. Additionally, I performed tests using cyclictest both without and with the runtime running. The performance is shown in the following image: From the results, I believe the CPU performance should be fine, but I am unsure why the monitoring results are not as expected. The testing outcomes should ideally be as close as possible to the cyclictest results. Does anyone have related solutions to this issue?
Last updated: 2024-10-14
Post by atcprojectteam on Modbus Function Code 15, writing multiple coils
CODESYS Forge
talk
(Post)
Hi all, I am using an RSTI-EP I/O card along with the EPXMBE101 Modbus/TCP network adapter. I have a Control Standard L license. I successfully connected to the I/O card via Modbus and can read inputs without any issues. However, when I try to write to the digital output modules using function code 15, I am unable to make any changes. Here’s what I have done so far: I created a small project using Structured Text. I set up Modbus channels (as shown in the attached image) and mapped the pins. When I use cyclic mode, the connection results in an error. However, when I use the rising edge, the connection works, but I don’t see any changes on the I/O card. For the output module, I assigned one bit to high. After that, I ran CODESYS Control Win V3. (Should I be running the PLC as well?) I built the program, but I am not receiving any response from the I/O card. Could you please advise on what might be causing this issue?
Last updated: 2025-02-26
Post by atcprojectteam on Modbus Function Code 15, writing multiple coils
CODESYS Forge
talk
(Post)
Hi all, I am using an RSTI-EP I/O card along with the EPXMBE101 Modbus/TCP network adapter. I have a Control Standard L license. I successfully connected to the I/O card via Modbus and can read inputs without any issues. However, when I try to write to the digital output modules using function code 15, I am unable to make any changes. Here’s what I have done so far: I created a small project using Structured Text. I set up Modbus channels (as shown in the attached image) and mapped the pins. When I use cyclic mode, the connection results in an error. However, when I use the rising edge, the connection works, but I don’t see any changes on the I/O card. For the output module, I assigned one bit to high. After that, I ran CODESYS Control Win V3. (Should I be running the PLC as well?) I built the program, but I am not receiving any response from the I/O card. Could you please advise on what might be causing this issue?
Last updated: 2025-02-26
Post by struccc on Inheritence of struct,
CODESYS Forge
talk
(Post)
Strangely reminds me to my struggles... Want to do something "Elegant", reusable, universal, practical... In CODESYS??? 🙃 First of all, before you get too deep into this: If you could find a way, to make a "universal" log entry object, containing the variable length data itself, you wouldn't be able to store them in an array, or access them like an array, or pass them by value as a type. (please correct me, if I'm wrong, incorrect, or not precise). Because... Basically you can't declare a type with variable memory footprint. This is a very deeply embedded characteristic of CODESYS, and all IEC 61131-3 systems, and it has many reasons behind. And yes, it is a very common trap / mistake, to forget about. So, with a log entry - I guess - it's pretty much the purpose: store data and metadata together, and then handle it in a uniform way. There are ways to handle this, really depends on what is the purpose. For example: 1. Entries with fixed length (Maybe it is not as evil as it looks for the first time. Depends on the situation, but definitely the fastest and easiest code) You can have your base object, with an internal, fixed length string or byte array variable. I would go with a string, and call it _Data.; And then you can make properties, like As_Bool, As_Int, As_Real... In the 'set' accessors, you can do like: pReal := ADR(_Data); // POINTER TO REAL As_Real := pReal^; In the 'get' accessors, evidently: pReal := ADR(_Data); // POINTER TO REAL pReal^ := AS_Real; Or, can use ANY type, if you are not obsessed with variable / property like access: 2. Fixed length, but nicer First, some disadvantage to any values: - You can only assign values with write access. No literals, constants, etc... - Can only be used as input variable of function or function_block - Therefore, stg you could reach: LogEntry.Initialize (stVariable|rVariable|iVariable|xVariable); Just a quick example (it's funny to play with ANY): Be careful it was not tested. I'm sure can be done better, please feel free to comment FUNCTION_BLOCK FB_LogEntry VAR_INPUT MsgClass : UDINT; // Like DEBUG, WARN, ERR... MsgCode : UDINT; // Like Errors.ERR_FAILED MsgTS : DT; // The timestamp END_VAR VAR _Data : STRING(80); // Our data container... _Descr : __SYSTEM.AnyType; // A standard descriptor for our data, containing TYPE_CLASS, address and size END_VAR METHOD SET_Value : BOOL VAR_INPUT anyValue : ANY; END_VAR VAR I : DINT; diSize : DINT; pStr : POINTER TO STRING; END_VAR // Check what did we receive in anyValue. diSize := anyValue.diSize; // We use constant __SYSTEM.TYPE_CLASS to identify the received data type CASE anyValue.TypeClass OF // Maybe we don't want to store references, pointers... and who knows what else... __SYSTEM.TYPE_CLASS.TYPE_REFERENCE, __SYSTEM.TYPE_CLASS.TYPE_POINTER : SET_Value := FALSE; // For the planned types we will be just fine. TYPE_CLASS.TYPE_BOOL, TYPE_CLASS.TYPE_INT, TYPE_CLASS.TYPE_REAL : SET_Value := TRUE; // Optionally string can be handled separately, maybe we have received STRING(255), but practically it is shorter than 80 bytes... TYPE_CLASS.TYPE_STRING : pStr := anyValue.pValue; diSize := MIN(anyValue.diSize, LEN(pStr^) + 1); // Get the actual size, and rewrite the received structure member diSize := MIN(SIZEOF(_Data), diSize); // Can chop down the received string to our length... SET_Value := TRUE; // Maybe want to play a little bit more here, to narrow down or convert datatypes, etc... // Or just reject any other datatype ELSE SET_Value := FALSE; RETURN; END_CASE // Fail, if the received value is still larger than our container... IF diSize > SIZEOF(_Data) THEN SET_Value := FALSE; END_IF // Here we should be ok, just set up the _DataType structure, and copy store the data IF SET_Value THEN THIS^._Descr.TypeClass := anyValue.TypeClass; // The typeclass is already filtered THIS^._Descr.diSize := diSize; // Set the (adjusted) size THIS^._Descr.pValue := ADR(_Data); // This will not change, just to be sure {IF defined (pou:SysMem.SysMemCpy)} SysMem.SysMemCpy(_DataType.pValue, anyValue.pValue, TO_UDINT(anyValue.diSize)); {ELSE} // An ugly replacement MemCpy FOR I:=0 TO diSize - 1 DO _Descr.pValue[I] := anyValue.pValue[i]; END_FOR {END_IF} // Otherwise, in case of failure maybe better set an empty value (overwrite the former data descriptor) ELSE THIS^._Descr.TypeClass := TYPE_CLASS.TYPE_NONE; THIS^._Descr.pValue := ADR(_Data); THIS^._Descr.diSize := 0; END_IF METHOD GET_Value : BOOL VAR_INPUT anyValue : ANY; END_VAR VAR I : DINT; END_VAR // We just have to serve the data, using the __System.AnyType structure received // Roughly we can say: IF anyValue.TypeClass = _Descr.TypeClass AND anyValue.pValue <> 0 // This should not be possible, already taken care of by Codesys (?) THEN {IF defined (pou:SysMem.SysMemCpy)} SysMem.SysMemCpy(anyValue.pValue, _DataType.pValue, TO_UDINT(MIN(anyValue.diSize, _Descr.diSize))); {ELSE} // An ugly replacement MemCpy FOR I:=0 TO MIN(anyValue.diSize -1, _Descr.diSize - 1) DO anyValue.pValue[I] := _Descr.pValue[I]; END_FOR {END_IF} // Just to make sure, that our string is terminated... IF anyValue.TypeClass = TYPE_CLASS.TYPE_STRING THEN anyValue.pValue[anyValue.diSize -1] := 0; END_IF GET_Value := TRUE; RETURN; END_IF // ... But can play more CASE anyValue.TypeClass OF TYPE_CLASS.TYPE_WSTRING : ; // Could do conversion TYPE_CLASS.TYPE_XSTRING : ; // Wow, I have to figure this out TYPE_CLASS.TYPE_PARAMS : ; // BTW, what is this, how to use? TYPE_CLASS.TYPE_ANYNUM : ; // ... END_CASE Be careful it was not tested. I'm sure can be done better, please feel free to comment 3. If you really want to do entries with variable size In a standard environment, it would be similar to the previous, except you dont have the container variable _Data, just use a pointer, practically _Descr.pValue At Initialize (SET_Value), you have to allocate the memory, would be easy with SysMem.SysMemAlloc - nowadays with SysMem.SysMemAllocData -, and you make sure to release it after use with SysMem.SysMemFreeData... SysMemAlloc was already hidden. The problem with this, that sooner or later your application will totally fragment the dynamic memory, and fail... So should look for some form of dynMaybe MemUtils.MemoryManager (I am not sure what is the status and the future of it). 4. You will end up by a LogEntry Factory ... 5. You could still have a look at this IEC Snippets BTW, Standard Codesys Logger is not a bad choice either. If you are really interested, I share some more code / library.
Last updated: 2025-03-09
Post by struccc on The future and proper use of CAA.BOLT, CAA.SEMA,..
CODESYS Forge
talk
(Post)
Dear All, Dear CODESYS, I'm curiously following CODESYS transitioning away from the CAA libraries, and I'm mostly in favor of these major changes. Naturally, I'd like to align my current (not end-user) developments accordingly. I'm tracking , reading release notes, ... And want to figure out the future :) Is it possible to hear / read more about the reasons, objectives and scope of these changes? One important element is CAA Types - CAA Types Extern. What is the plan with that? What's the future of CAA.SEMA, CAA.BOLT ? I have never used them (always relied on SysLib*), but they are tempting... Would be useful to have a platform independent "Macro" for this functionality... Is there something in existing or planned ? Are they suitable to be used in low level libraries... For Example IO-Drivers, Components, "to-become system libraries"? CAA.TaskLock, CAA.TaskUnlock ? Well, they don't claim platform independency, so I can't rely on those.... Any up-to-date advise, standard, pattern to follow in new libraries for task and resource locking? Practical set of conditional defines to be used? If this information is not publicly available, can you please send a private message about the proper way to achieve this? I have support agreement, just couldn't get trough with these questions... P.
Last updated: 2025-03-14
Post by jeroenaero on Problem with CodeSys Control SL Deploy Tool 4.15.0.0
CODESYS Forge
talk
(Post)
Hello, We just installed the new version of CodeSys Control SL Deploy Tool 4.15.0.0 but we get the following error when we try to add a VPLC. Can someone of the CodeSys team fix this issue? the object reference is not set to an instance of the object Zie het einde van dit bericht voor meer informatie over het aanroepen van JIT-foutopsporing (Just In Time) in plaats van dit dialoogvenster. ** Tekst van uitzondering ** System.NullReferenceException: De objectverwijzing is niet op een exemplaar van een object ingesteld. bij _3S.CoDeSys.RuntimeDeployTool.Views.AddNewInstanceForm.ShowAllImages() bij _3S.CoDeSys.RuntimeDeployTool.Views.AddNewInstanceForm..ctor(List1 virtualControls, List1 existingNames) bij _3S.CoDeSys.RuntimeDeployTool.Views.MainEditorTab_Operation.OnAddInstanceClick() bij _3S.CoDeSys.RuntimeDeployTool.Views.MainEditorTab_Operation.bt_add_Click(Object sender, EventArgs e) bij System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e) bij System.Windows.Forms.ToolStripButton.OnClick(EventArgs e) bij System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) bij System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e) bij System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met) bij System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) bij System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) bij System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) bij System.Windows.Forms.Control.WndProc(Message& m) bij System.Windows.Forms.ScrollableControl.WndProc(Message& m) bij System.Windows.Forms.ToolStrip.WndProc(Message& m) bij System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) bij System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) bij System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ** Geladen assembly's ** mscorlib Assembly-versie: 4.0.0.0 Win32-versie: 4.8.9300.0 built by: NET481REL1LAST_C
Last updated: 2025-04-24
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.