Post by tk096 on Some 'pathetic' errors in SoftMotion program
CODESYS Forge
talk
(Post)
Meanwhile, I would like to understand why the motion FB instances must still be called even after the Execute is set to FALSE, especially in view of the fact that the next instruction is programmed to abort the previous one, with BufferMode set to 'Aborting'. All these unnecessary FB calls are an unnecessary overhead on the CPU anyway. Is there any precise rule about when to cease calling the various instances? (It should precisely be the 'done' status that says this one has finished its work). In general: - Motion function blocks have to be called until they report 'Done', 'Error', 'CommandAborted' or a subsequent motion FB with BufferMode=Aborting is started in the current cycle. - Setting the Execute input to FALSE will not abort any ongoing motion of the motion function block. For example, one case that is often problematic is the execution of the Axis Halt instruction. When, after a MoveAbosulte instruction this returns the event as 'done' and indeed the axis is in standstill, the state machine first sets the move instruction to FALSE, and the next cycle sets the Halt request to TRUE. Some of the time everything works out fine. Occasionally, however, in this exchange, the axis goes into fault, also losing the OPERATIONAL state. I think the error SMC_FB_WASNT_CALLED_DURING_MOTION is only a follow-up (and misleading) error that results from the axis not being in operational state anymore (bus problems). 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'? Which error does the respective function block (Halt.ErrorId) report?
Last updated: 2024-07-22
Post by anlebr on Alarm group template - Is it not possible with several instances?
CODESYS Forge
talk
(Post)
Hi In the POU section of my project I have created a Fan function block and defined an alarm group template for this FB with one alarm (Motor fault). In the PLC program I define two instances of the fan function block. When going to the alarm configuration and pressing "Create or update alarm instances", I get two alarms listed. So far so good. However, when I start my program and check the alarm table in the visualization I only see one alarm, even if both are active. Am I doing something wrong, or is it not possible to define alarms on a function block level and get one set of alarms per instance of the function block?
Last updated: 2025-04-01
Post by rafael on Wbm/runtime and visualization login
CODESYS Forge
talk
(Post)
Hello everyone, Iβm trying to understand if it is this way or I can change it. Iβm making a PLC code and visualization screens, the ideia is to operate via webvisu some controls. So i made a code, made some screens and when i try it in my web browser, first it asks me to insert te user and password of the wbm/runtime of the plc (user: admin, password: wago by default), then i can acess my screens but I have to login again with the user and password that i created in the visualization user managment. My question is: is there a way to disable this first login to the visualization screens (webvisu)? Or create another user/password for this first screen? I have a PFC200 and a Edge Controller, both are working the same way. Thanks in advance Thanks
Last updated: 2024-06-25
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 simone on Collapse all
CODESYS Forge
talk
(Post)
Hi, I'm wondering if it exist a button or a keyboard shortcut (much much better) for "collapse all" the open folder on a codesys project. It would really be nice to have. Also: Are there some options or configuration for set a default zoom for the different editor (or even one global), for example I would like to have 100% on ST, LD editor and have 80% on Visualization Editor; and also have a button to set all the zooms to default, now it seems that every file mantain the one previously set. I'm working with the 3.5.20.10 right now Thanks!
Last updated: 2024-11-21
Post by mp9876 on Device User Logon
CODESYS Forge
talk
(Post)
Following up on the invalid user authentication on the target Not 100% sure what the problem was but following my post I managed to create an administrator level user. Then my next issue was that I could not connect to the device. I might have flipped the device from a 64 bit version to a 32 bit version so I did UPDATE DEVICE back to the 64 bit version; still could not connect somehow. Then I did two things at the same time that fixed my problem: Wiped the Codesys Control Win 64 bit version and installed the 32 bit version Installed latest Codesys Control Win V3.5 SP20 (released today) I wish I knew which one of these actions fixed the problem but at least the problem is solved. Hoping this post may help someone one day
Last updated: 2024-03-19
Post by kazuhiro on Problems using MySql Library and SysProcessExecuteCommand2 together
CODESYS Forge
talk
(Post)
I use fbMsSQL_compact(FUN) of the MySQL Library to write data to the database. There is no problem when writing data using only fbMsSQL_compact(FUN). However, when I try to write data obtained using SysProcessExecuteCommand2 to the database using fbMsSQL_compact(FUN), an error message "Dest server on ip address:xxx.xxx.xxx.xxx and port:1433 is unreachable" appears and writing is not possible. From what I have researched, it seems that writing is not completed in one cycle of fbMsSQL_compact(FUN), and when SysProcessExecuteCommand2 is executed first in the second cycle, the work done in one cycle of fbMsSQL_compact(FUN) is reset. Could you please give me some advice?
Last updated: 2024-06-18
Post by kazuhiro on Problems using MySql Library and SysProcessExecuteCommand2 together
CODESYS Forge
talk
(Post)
I use fbMsSQL_compact(FUN) of the MySQL Library to write data to the database. There is no problem when writing data using only fbMsSQL_compact(FUN). However, when I try to write data obtained using SysProcessExecuteCommand2 to the database using fbMsSQL_compact(FUN), an error message "Dest server on ip address:xxx.xxx.xxx.xxx and port:1433 is unreachable" appears and writing is not possible. From what I have researched, it seems that writing is not completed in one cycle of fbMsSQL_compact(FUN), and when SysProcessExecuteCommand2 is executed first in the second cycle, the work done in one cycle of fbMsSQL_compact(FUN) is reset. Could you please give me some advice?
Last updated: 2024-06-18
how to add module to raspberry pi
CODESYS Forge
talk
(Thread)
how to add module to raspberry pi
Last updated: 2020-11-24
how to set custom from/to timestamp in Trend
CODESYS Forge
talk
(Thread)
how to set custom from/to timestamp in Trend
Last updated: 2020-03-31
Unable to connect to git remotes through Codesys.
CODESYS Forge
talk
(Thread)
Unable to connect to git remotes through Codesys.
Last updated: 2023-11-10
How to adapt Codesys Control SL to custom board
CODESYS Forge
talk
(Thread)
How to adapt Codesys Control SL to custom board
Last updated: 2024-08-09
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-08-26
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-08-26
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-08-26
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-08-26
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-08-26
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-08-26
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-09-03
Unable to Connect to Modbus RTU Device
CODESYS Forge
talk
(Thread)
Unable to Connect to Modbus RTU Device
Last updated: 2024-09-04
How to revert to previous version library
CODESYS Forge
talk
(Thread)
How to revert to previous version library
Last updated: 2024-09-06
Unable to add alarm configuration object to project
CODESYS Forge
talk
(Thread)
Unable to add alarm configuration object to project
Last updated: 2024-09-27
Trying to connect Codesys OPC server to Ignition
CODESYS Forge
talk
(Thread)
Trying to connect Codesys OPC server to Ignition
Last updated: 2025-01-22
How to use libdoc to implement libraries in multiple languages
CODESYS Forge
talk
(Thread)
How to use libdoc to implement libraries in multiple languages
Last updated: 2025-03-13
Is it possible to add regions to ST-code?
CODESYS Forge
talk
(Thread)
Is it possible to add regions to ST-code?
Last updated: 2025-07-10
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.