Post by rh-pk on v3.5 SP19 - Modbus TCP Devices - Channel Limit?
CODESYS Forge
talk
(Post)
Hello Vincent, I don't have 75 channels but it works for me as described above without any problems. There is also a parameter MAX_MODBUS_CHANNELS in the library parameters for the IoDrvModbusTCP module. The default value there is 100. Perhaps you are reaching the limit there? The value can be adjusted accordingly. I assume that this value is not accepted in the input dialogue and therefore the 'fixed' limit value 10 is used.
Last updated: 2024-04-10
Post by oscardelmagno on Codesys v3.5.22.10 - Internal error:System.AggregateException...Value cannot be null...Parameter name: expLValue
CODESYS Forge
talk
(Post)
Last updated: 2026-08-25
Post by alexgooi on Modbus writing on value change
CODESYS Forge
talk
(Post)
Hi Duvan, You could make this in 1 single object (FB), Indeed don't use a function for this beacuse you need some memory to keep the old value. For i := 0 TO 200 BY 1 DO //Check if the value has been changed IF Old_Value[i] <> Value[i] THEN //Set the trigger to TRUE Trigger[i] := TRUE; Old_Value[i] := Value[i]; END_IF END_FOR If you define the Value array as an In_Out and the Trigger as an In_Out you arn't claiming any aditional memory to your system. You ofcourse then need to add some code arround it that does something with the trigger and writes it back to FALSE again. If you want more flexability you also could use pointers instead of using the IN_OUT FOR i := 0 TO 200 BY 1 DO address := address_Input + i * SIZEOF(*Put type here); IF Address^ <> Old_Value[i] THEN Trigger[i] := TRUE; Old_Value[i] := Address^; END_IF END_FOR
Last updated: 2024-04-02
Post by imdatatas on Problem of assigning physical addresses to variables of type ARRAY OF ARRAY as MW and QW
CODESYS Forge
talk
(Post)
Hello, I am encountering an interesting problem as below in SP20patch5 variable definition area. I think this is a bug. As can be seen in the attached screenshot, it assigns the same %MW or %QW address to all elements of the array. I hope Codesys team can solve this problem in the next version. Best regards, Imdat
Last updated: 2025-03-17
Post by noahpiskor on Configuration dialog screen with a Frame
CODESYS Forge
talk
(Post)
Hello, I'm trying to configurate a frame. My goal is to have a frame with the symbol of a component. When I press the symbol a dialog screen of my choosing comes up. What variable should be used in the frame configuration, that I can put in the input configuration of my symbol. so that I can chose which dialog screen comes up on my multiply instances of this frame. Kind regards. Noah Piskor CODESYS V3.5 SP19 Patch 6
Last updated: 2024-04-02
Post by phoward131 on Text List Fallback Value
CODESYS Forge
talk
(Post)
I am relatively new to Codesys and I'm trying to develop an HMI that displays what mode a particular device is in based on an integer value. I am currently using dynamic texts with a text list which works fine but I am looking for a way to display a particular string (ie 'Unknown') when the index doesn't match any of of the indices in the text list. I can enter 'Unknown' in the text property of the text field element which works as expected but it displays the single quotes on the visualization. How can I escape these quotes to simply display the word Unknown? Thanks!
Last updated: 2024-03-22
Post by toffeebonbon on EL7041-0052 - does it run with EL7041 SoftMotion?
CODESYS Forge
talk
(Post)
Good morning everyone. In my setup I am trying to use a couple of EL7041-0052 (the EL7041 variant without terminals for an encoder) to run stepper motors without feedback. When using the softmotion drivers for the EL7041 (Rev22 and Rev24, even selecting external feedback type doesn't work) the device log shows warnings for the corresponding hardware: "SDO write error 0x1 -> 0x8012:0x08 eError 0x1 AbortCode 0x6090011". 0x8012:0x08 is the register for the Feedback Type. My best guess was setting the the register value in the start parameters to zero, but the result is the same. What else can I try to get the hardware to work? I have screenshots attatched showing the running fieldbus and the log messages. EDIT: One clarification: the "device log" that shows the error is the PLC, not the ethercat terminal. The log of the terminal itself shows neither errors nor warnings. BR Robert
Last updated: 2023-11-29
Post by tomast on Codesys and Siemens SINAMICS 20 modbus RTU "Response CRC Fail"
CODESYS Forge
talk
(Post)
Hi everyone, I'm currently working on a project involving the control of 5 VFDs via Modbus RTU, this time using the WAGO 750-8212 CPU. So far, I've managed to make progress, but I've encountered an issue. While I can successfully read and write to all the registers I need, I consistently encounter a "Response CRC Fail" error when attempting to write the value 1151 to the STW register at address 40100. I'm able to set the frequency via register 40101 and adjust all other parameters using different registers. Setting STW to 1150 results in the drive ready boolean from the ZSW-bit being received instantly. However, the moment I attempt to send 1151 to register 40100, I immediately receive the "Response CRC Fail" error for all channels. I've also attempted to use combined control, employing Modbus for frequency control and starting from a digital input. Everything seems to function properly until I send the start command to the VFD. Interestingly, I consistently encounter the same error the moment I send the start command, regardless of whether I use register 40006 (high) or 40100 (1151). Could someone please assist me in resolving this issue?
Last updated: 2024-03-21
Post by dogulas on OPC UA C# client connecting to OPC UA CODESYS server
CODESYS Forge
talk
(Post)
Ok, for the sake of completeness in case anyone else has this problem. I can tell you that what finally worked for me was to change the line: // create an ExtensionObject to wrap the value to be written ExtensionObject extensionObject = new ExtensionObject( new ExpandedNodeId("GVL_StructA", 5), structAData ); to: // create an ExtensionObject to wrap the value to be written ExtensionObject extensionObject = new ExtensionObject( new ExpandedNodeId("GVL_StructA|defaultbinary", 5), structAData ); I'm sure there are many other problems that could cause this very generic error, but this was my problem.
Last updated: 2024-12-30
Post by phryniszak on RPI CANFD
CODESYS Forge
talk
(Post)
Hi, I have rpi with CANFD MCP2518FD. Classic can communication is working OK but when I try open in CANFD hDriver := CL2.FdDriverOpenH(usiNetId := 0, uiNominalBaudrate := 500, uiDataBaudrate := 0, xSupport29Bits := FALSE, ctMessages := 100, peError := ADR(eError) error is returned with value 10226 which is not documented (https://content.helpme-codesys.com/en/libs/CAA%20Can%20Low%20Level%20Extern/Current/CAN-Low-Level/Enums/ERROR.html#error) CAA CanL2 is 3.5.21 version. Question is: 1. Is anyone get CANFD working? 2. What is meaning of this value (10226)? Regards, Pawel
Last updated: 2025-08-09
Post by phryniszak on RPI CANFD
CODESYS Forge
talk
(Post)
Hi, I have rpi with CANFD MCP2518FD. Classic can communication is working OK but when I try open in CANFD hDriver := CL2.FdDriverOpenH(usiNetId := 0, uiNominalBaudrate := 500, uiDataBaudrate := 0, xSupport29Bits := FALSE, ctMessages := 100, peError := ADR(eError) error is returned with value 10226 which is not documented (https://content.helpme-codesys.com/en/libs/CAA%20Can%20Low%20Level%20Extern/Current/CAN-Low-Level/Enums/ERROR.html#error) CAA CanL2 is 3.5.21 version. Question is: 1. Is anyone get CANFD working? 2. What is meaning of this value (10226)? Regards, Pawel
Last updated: 2025-08-09
Post by ryusoup on 'keep last value' option in CODESYS EtherCAT
CODESYS Forge
talk
(Post)
Hello, Iβm using CODESYS EtherCAT Master on a Raspberry Pi controller with several remote I/O modules. Iβm facing an issue where the input values from the remote I/Os drop to 0 when a connection error occurs. Is there a way to configure a βkeep last valueβ behavior (i.e., hold the last valid input) instead of defaulting to 0 on communication loss? Best regards,
Last updated: 2025-11-18
Post by fless on Warning C0564 when compiling CNC project with variables program
CODESYS Forge
talk
(Post)
Hello, we are porting a CNC project from codesys 3.5.16 to codesys 3.5.19. The project has lots of CNC programs with variables. now we get hundreds of messages like this. [WARNING] CNC Test SP19: TestCNC SPS: PLC Logic: Application: C0564: A reference to uninitialized variable varCNC is used for initialization of TestCNC_D. Accessing the uninitialized variable may result in unexpected behavior. The objects program_name_D are implicit generated by codesys. I see no way to generated them after the variables. Is there a way to correct the initialization order? We know how to suppress this warning. But we need a clean solution as the warning already saved us in a other nonCNC project. Attached a small demo of the problem.
Last updated: 2024-03-21
Post by sigurdrb on How to change OPC NodeId IdentifierType
CODESYS Forge
talk
(Post)
Did you find a solution for this? Experiencing the same when I'm setting up the server using "Communicartion manager"
Last updated: 2025-01-20
Post by eschwellinger on Two OneWireMaster on one Raspberry PI 5
CODESYS Forge
talk
(Post)
check if the second onwire master is accessible in the configfile path setting. /etc/codesyscontrol/
Last updated: 2025-06-12
Post by fabiodasilveira on Dynamic Setting IP Address from IEC code
CODESYS Forge
talk
(Post)
It is a shame that it does not work with Eaton XC303 PLCs :(
Last updated: 2026-06-23
Post by tk096 on Fieldbus has lost synchronicity
CODESYS Forge
talk
(Post)
Hi, a few suggestions on how to tackle the problem: - it might help to increase the cycle time of the ethercat task - increase the value of the ethercat parameter DCInSyncWindow (https://content.helpme-codesys.com/en/libs/IODrvEtherCATDriver/Current/pou-IoDrvEtherCAT/DCInSyncWindow.html) (see attached image) - enable FrameAtTaskStart (https://content.helpme-codesys.com/en/libs/IODrvEtherCATDriver/Current/pou-IoDrvEtherCAT/FrameAtTaskStart.html) in the ethercat master (see attached image) - if the drives can handle the synchronization problems, checking of the synchronization can be deactivated using SMC_Set_ETC_DCSyncSupervision (https://content.helpme-codesys.com/en/libs/SM3_Drive_ETC/Current/SMC_Set_ETC_DCSyncSupervision.html).
Last updated: 2024-04-11
Post by arnog on Two drives on one axis, Gantry Robot
CODESYS Forge
talk
(Post)
Hi TK_Jenssen did you found a solution I am setting up the samelike gantry only with two z-axes which are mounted on fix position with an X axes between the two z-axes. The movement and position of both z-axes must be very well aligned and calibrated. Maybe also to be adjusted by programming. Can you sent an example of your solution?
Last updated: 2023-08-25
Post by dkugler on TargetVisu Freezing
CODESYS Forge
talk
(Post)
The only weird situation i remeber with particular or complete frozen target visu was after the rtc clock was fallen or set back to the past. It looked like after running a while the alarm history database crashed during writing entries at a date lot of years in the past. After setting the rtc clock to actual date/time and deleting the alarm db every thing worked fine. I don't know, if this is/was a problem of our PLC hardware/firmware? Maybe check date/time at your system?
Last updated: 2024-09-13
Post by corriibme on Setting array values with JSON Utilities SL
CODESYS Forge
talk
(Post)
It turns out that you can build JSON structures without ever calling the JSONBuilder function block directly. Instead, create a pointer to JSON.JSONData and invoke the necessary methods on its dereference. The parent object has a parent index of -1 (and an index of 0). EVERY other item (including keys, values, empty arrays and sub-objects) created by the setX methods needs the index to increase by 1. Then use the JSONByteArrayWriter FB to generate your JSON string
Last updated: 2024-05-23
Post by eaglealex on Length of string and Array of bytes
CODESYS Forge
talk
(Post)
Hello! I have tried read a file to the string variable. But I faced a problem - there is about 2800 bytes of information in file, but string have a limit 2393 bytes. I made two variables with same address (for automatic convertion) - string[3000] and array of bytes[1..3000]. And I noticed that array of bytes contains all information from file, but string shows only first 2393 bytes. So I have lost information. Is there really such a limitation? Or I have an error in my program and Codesys 2.3 have no limit for such kind of conversation between string and array of bytes? Thank you very much!
Last updated: 2025-04-01
Post by snhatton on Alarm Management - latched variable represented as Text list
CODESYS Forge
talk
(Post)
Hi There, For my understanding: are you trying to display the contents of a text list in an alarm message based on the id? For example, you could maintain a text list of common alarm messages, and then display based on which message is true?
Last updated: 2023-09-18
Post by gatto on variables between two applications
CODESYS Forge
talk
(Post)
No. As you can see in the uploaded image, in my test project, I have a variable list GVL_1 which is located in appication_1. But if I write in POU_2, which is instead found in application 2, I cannot find the variables of GVL_1. it seems that the GVLs are children of each app
Last updated: 2024-06-24
Post by alexgooi on Network variable stops sending
CODESYS Forge
talk
(Post)
Are you making use of structs in the NVL? In the past I had similar behavior (NVL stops sending) when I added something in the struct. if you are making use of structs makes sure that the structs are identical in both projects. If this is not the case, have you tried changing the port number to something different than 1202?
Last updated: 2026-04-29
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
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.