Post by zdenekkrejci on Issues with Modbus Slave with Raspberry Pi
CODESYS Forge
talk
(Post)
Did you find out what was wrong? I have the same issue
Last updated: 2025-03-09
Post by nz-dave on Ethernet/IP Scanner Exception
CODESYS Forge
talk
(Post)
Any ideas?. Still stopping on this exception randomly every couple of weeks. very frustrating.
Last updated: 2025-03-09
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 Problem Reading Registers via Modbus from non Codesys device
CODESYS Forge
talk
(Post)
Hi, Might be a good idea first to try out the connection and the device with some handy software, like Modbus Poll. There you can see better, what's really going on... - Is it really connected? - What error code does it return? - Can it read from the register address? - Maybe try Input registers and Holding Registers - can make a difference - Sometimes register addresses are messed up: shifted +-1 (mixing of 2 standards) - Sometimes register addresses start with offset 30000, 40000 ... - Are you using the right protocol? - Is it RTU or TCP? Maybe ASCII? - Can even have a look at the data packets, etc... All this is easier to figure out first with some modbus utility... and then to set it up in CODESYS should not be an issue. P.
Last updated: 2025-03-09
Problem Reading Registers via Modbus from non Codesys device
CODESYS Forge
talk
(Thread)
Problem Reading Registers via Modbus from non Codesys device
Last updated: 2025-03-09
Post by ramesh on DELTA PLC AS228T
CODESYS Forge
talk
(Post)
Thanks for your reply. Let me try with DIADesigner
Last updated: 2025-03-09
DELTA PLC AS228T
CODESYS Forge
talk
(Thread)
DELTA PLC AS228T
Last updated: 2025-03-09
Post by nz-dave on ethercat softmotion axis error
CODESYS Forge
talk
(Post)
Hi all I'm having a little trouble get my axis to work. i can turn them off and on. i can run each servo manually inputting directly to the mapping address. as soon as i try to use any FB's like jog etc my servos wont move and error out. so far I've had error "SMC_ERROR.SMC_DI-POSITIONLAGERROR" and another one about not calling a fb. cheers. in the attachment I have just jogged X_Axis with the MC_JOG FB
Last updated: 2025-03-10
Post by liai on an not create Symbol Configuration in Codesys V3.5 SP20 Patch 4
CODESYS Forge
talk
(Post)
Thanks a lot, help me understood more of the concept of sodesys software. May you Have a good day!
Last updated: 2025-03-10
an not create Symbol Configuration in Codesys V3.5 SP20 Patch 4
CODESYS Forge
talk
(Thread)
an not create Symbol Configuration in Codesys V3.5 SP20 Patch 4
Last updated: 2025-03-10
ethercat softmotion axis error
CODESYS Forge
talk
(Thread)
ethercat softmotion axis error
Last updated: 2025-03-10
Post by nz-dave on ethercat softmotion axis error
CODESYS Forge
talk
(Post)
even tho the drivers are on. it doesn't seem like any online feedback is happening?
Last updated: 2025-03-10
Post by jkopicz on How can you get the active frame index from a frame
CODESYS Forge
talk
(Post)
In my project, I have frames that I would like to read the current active index. I change the frame index using the onclick properties of a button, then change frame index. I need to do some logic based on which frame index is selected. Is there a way to read the current active index of a frame?
Last updated: 2025-03-11
Post by juki01 on HMI über Webbrowser
CODESYS Forge
talk
(Post)
Auf meiner Kendrion SPS läuft eine WebVisu. Über einem touchpanel-IPC mit Win10 greife ich über den Webbrowser auf die SPS zu alles o.k. Nun möchte ich den IPC mit einem Visu-Element runterfahren da der Webbrowser im Kiosk-Mode läuft. Das gelingt mir irgendwie nicht. Kann mir da bitte jemand helfen ? Gruß juki
Last updated: 2025-03-11
Post by pikebuster on Help for a newbie
CODESYS Forge
talk
(Post)
Can somebody help me with this? I have problem with the button! This task must be solved using Sequential Function Chart (SFC), IEC 61131-3. TASK Create an SFC program to control a traffic light at an intersection. Description: You will program a traffic light that has three phases: Green, Yellow, and Red. The traffic light must follow these rules: Green light is on for 10 seconds. Yellow light is on for 3 seconds. Red light is on for 10 seconds. If the pedestrian button is pressed, the system must keep the red light on for 20 seconds during the next cycle. After the pedestrian has “crossed,” the system should return to its normal cycle. Basic Steps: Initialization: Start by setting the traffic light to Red. Green Phase: After 10 seconds, switch to Green. Yellow Phase: After 10 seconds in the Green phase, switch to Yellow. Red Phase: After 3 seconds in the Yellow phase, switch back to Red. Loop: Repeat the cycle. Use, for example, lamp symbols in the visualization module to simulate the traffic light. You may also add a simple pedestrian light if desired.
Last updated: 2025-03-11
Post by konstantinoskr on AXIS Rollover
CODESYS Forge
talk
(Post)
Hello, I have an application with 2 axis. The master axis will be configured as Modulo. During motion i want to be able to change the rollover position if required. How is it possible to do this?
Last updated: 2025-03-11
Post by trusty-squire on How can you get the active frame index from a frame
CODESYS Forge
talk
(Post)
If you are switching a frame based on the "Switch Frame Variable", then just use a variable that is accessible to your program to set your active frame. If you're trying to see which is the active visualization, then use the "CurrentVisu" variable. Note you'll need to enable this by checking it on in the Visualization Manager settings. If it's neither of those, you'll need to be more clear on how you're project is set up.
Last updated: 2025-03-11
Post by trusty-squire on Help for a newbie
CODESYS Forge
talk
(Post)
Try watching this video in it's entirety, looks like it should have what you need to get running. https://www.youtube.com/watch?v=kyj36oRpA04
Last updated: 2025-03-11
Help for a newbie
CODESYS Forge
talk
(Thread)
Help for a newbie
Last updated: 2025-03-11
Post by trusty-squire on AXIS Rollover
CODESYS Forge
talk
(Post)
If you mean you want to shift the Origin or Zero position of your axis, you can try MC_SetPosition and set the position to 0 (if you want to take the current active position and make it the new 0. Adjust this number accordingly if/as needed). This means the servo drive keeps it's current origin position, and Codesys applies an offset to the servo drive position in the logic. You can also use the homing function of your servo drive using MC_Home and have your drive configured to set the current position as origin when it receives a homing command.
Last updated: 2025-03-11
Post by konstantinoskr on AXIS Rollover
CODESYS Forge
talk
(Post)
The MC_Home or MC_SetPosition requires a programm cycle to be completed. In my application the speed is approximately 120m/min and the programm cycle is 2ms. That means that i will have a 4mm loss on each Trigger of either MC_Home or MC_SetPosition. The best option is to change the value defined in the axis configuration. I tried the SMC_SetMovementType but it only works with the axis standstill or powered off. I need to be able to change it while the axis is moving.
Last updated: 2025-03-12
Post by malie on 3.5.19.7 Alarme importieren in Gruppe funktioniert nicht
CODESYS Forge
talk
(Post)
Hallo, hat niemand das Problem die Alarme nicht mehr importieren zu können? Neu Installation und Reparatur haben bis jetzt nichts gebracht.
Last updated: 2025-03-12
3.5.19.7 Alarme importieren in Gruppe funktioniert nicht
CODESYS Forge
talk
(Thread)
3.5.19.7 Alarme importieren in Gruppe funktioniert nicht
Last updated: 2025-03-12
Post by julian123 on CodeSysControlWinV3x64
CODESYS Forge
talk
(Post)
Hello mos89p, I had the same problem. There is a lot of threads about this, but not one up to date. Your solution worked and I was finally able to use my software again. Thank you!
Last updated: 2025-03-12
HMI über Webbrowser
CODESYS Forge
talk
(Thread)
HMI über Webbrowser
Last updated: 2025-03-12
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.