Search talk: Change resolution axis

 
<< < 1 .. 28 29 30 (Page 30 of 30)

Post by mubeta on Strange problem with the ā€˜MC_SetPosition’ function CODESYS Forge talk (Post)
How are the servo drives controlled? EtherCAT, step/dir pulses, other? CANOpen, 1 Mb/s, bus load 35%, cycle time 2ms. Another thought is that - if it's step/dir pulse based control - the pulses from the PLC to the drive are getting missed/lost at high frequencies? If that's the case then there would be multiple troubleshooting steps/corrections that could be investigated. Here, it seems to me that we are getting completely off track with the observed problem. You could try to create a simplified program I had already written this elsewhere. The program before being brought into machines was exhaustively tested in SW emulation and the problem did not occur. However, in emulation I was interested in checking other aspects of the process, not this specific one which is for real a correction made necessary after the fact. The part of the program that does this correction with the function mentioned in the topic, came up from its origins, but I didn't know or didn't think it was really useful. A scruple that later turned out to be necessary. However, for now I do not think I will spend any more time on this verification, already lacking any to do my normal. I remain amazed, however, that a function intended to correct the axis position with the motor in motion and that it should not interfere with this, in fact instead changes behavior as the motor speed changes. Mah! When you manually control the motor directly from the servo drive software at the speeds you are calling for, does it move precisely to the target position? The drive and motor have been working fine for about 10 years. In replacing the machine control system, I opted for CoDeSys where before there was something else. But this is not the subject of the problem. What I need to resolve is the fact that a clutch specially placed at a certain point can slip and, therefore, I have the undeniable need to phase the 'prime mover' to the mechanical position of the machine, detected by a cam for each turn, in order to properly stop at its optimum point. Which for now I have ruled out doing. In fact, if I really have to say, since we have now gone brutally OT, I originally thought that this clutch should only come into action in cases of extreme necessity, as happens in most trials. But this one, the way it is made, slips more easily than I could estimate and the servo-controlled 'prime mover,' and the machine, get out of phase, maybe by a little, but frequently, and when the machine work at it's high speed, (in fact all of the time), I can't adjust properly the 'prime mover' position at fly.
Last updated: 2025-01-18

Post by lsislsis on SIGABRT Error CODESYS Forge talk (Post)
Please help us. Why we take this errors. We try different versions like 4.12.0 and 4.13.0 with same results. ;*********;<loggername>codesyscontrol.log</loggername>;<logoptions>; <enable>1</enable>; <type>normal</type>; <timestamp>rtc high resolution</timestamp>; <deactivatable>0</deactivatable>; <dump>always</dump>; <filter>0x0000000f<filter>; <maxentries>100000</maxentries>; <maxfiles>1</maxfiles>; <maxfilesize>1000000</maxfilesize>;</filter></filter></logoptions>;<entries>;Timestamp, CmpId, ClassId, ErrorId, InfoId, InfoText;ClassId: LOG_INFO =1;ClassId: LOG_WARNING =2;ClassId: LOG_ERROR =4;ClassId: LOG_EXCEPTION =8;ClassId: LOG_DEBUG =16;ClassId: LOG_PRINTF =32;ClassId: LOG_COM =64;</entries>;*********2024-11-05T08:23:59.728Z, 0x0000100c, 1, 0, 0, VisuFctCheckForUnusedClients: Removing Client with IEC-ID: 1 Time delta: T#33s1ms Locks: Paintbuffer: TRUE 2024-11-05T08:23:59.728Z, 0x0000100c, 1, 0, 0, VisuFctCheckForUnusedClients: Successfully Removed Client at Address: 547195449944, IEC-ID was: 1, EXT-ID: 431000373 2024-11-05T08:28:57.913Z, 0x0000100c, 1, 0, 0, Visu_PRG: Creating Client for Extern-ID: 347055752 2024-11-05T08:28:57.926Z, 0x0000100c, 1, 0, 0, Visu_PRG: Creating Client successful for Extern-ID: 347055752 Returned IEC-ID: 1 2024-11-05T08:30:51.103Z, 0x0000100c, 1, 0, 0, Visu_PRG: Successfully Removed Client with IEC-ID: 1, Extern-ID: 347055752 2024-11-05T08:37:36.517Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state* We recommend a reboot of the controller now! 2024-11-05T08:37:36.517Z, 0x00000111, 8, 260, 3, #### Exception: HANDLED EXCPT <excpt>NonContinuable</excpt> in CH_COMM_CYCLE 2024-11-05T08:47:42.117Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T08:47:42.117Z, 0x00000111, 8, 260, 3, #### Exception: HANDLED EXCPT <excpt>NonContinuable</excpt> in CH_COMM_CYCLE 2024-11-05T09:14:41.316Z, 0x00000071, 1, 0, 13, Webserver stopped 2024-11-05T09:14:44.485Z, 0x0000013d, 1, 0, 4, Number of licensed cores for IEC-tasks: 1 from 4 2024-11-05T09:14:44.487Z, 0x0000013d, 1, 0, 4, Number of licensed cores for IEC-tasks: 4 from 4 2024-11-05T09:14:44.540Z, 0x00000002, 1, 0, 2, Application [<app>Application</app>] loaded via [Download] 2024-11-05T09:14:55.894Z, 0x00001012, 1, 0, 0, Opened alarm storage file, version: 6 2024-11-05T09:14:55.951Z, 0x0000100c, 1, 0, 0, Visuinitialization starting. 2024-11-05T09:14:55.983Z, 0x0000100c, 1, 0, 0, Visuinitialization done. 2024-11-05T09:14:55.995Z, 0x00000071, 1, 0, 12, Webserver started 2024-11-05T09:15:01.753Z, 0x0000100c, 1, 0, 0, Visu_PRG: Creating Client for Extern-ID: 2279884529 2024-11-05T09:15:01.753Z, 0x0000100c, 1, 0, 0, Visu_PRG: Creating Client successful for Extern-ID: 2279884529 Returned IEC-ID: 0 2024-11-05T09:34:44.667Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T09:34:44.667Z, 0x00000111, 8, 260, 3, #### Exception: More than 2 exceptions in CH_COMM_CYCLE: Stop logging 2024-11-05T10:13:26.867Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T10:15:21.966Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T10:19:12.167Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T10:26:02.566Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T10:31:42.866Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T11:01:54.468Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T11:09:29.868Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! 2024-11-05T11:14:44.540Z, 0x0000100d, 1, 0, 0, Demo mode expired. 2024-11-05T11:27:20.868Z, 0x00000103, 65544, 1, 0, runtime received SIGABRT - system may be in an inconsistent state We recommend a reboot of the controller now! * Regards
Last updated: 2024-11-05

Post by martinlithlith on Device User Logon and No device is responding.. Pi4b codesys 3.5 SP19 2 + (64-bit) CODESYS Forge talk (Post)
Hi! Im slowly starting to loose it and i need som help! After a few night of reading up and testing i“m still stuck as a rock and you guys and girls are my last resort for this project. Basic facts; Win 11 Codesys 3.5 SP19 2 + (64-bit) Raspberry pi 4 model b 2 gb Raspian release 11 aarch64 What keeps me up late at night; Username and Password when trying to connect to device and device only beeing connectable for a few seconds. Some of the things I have tried; Username and passord; Credientials from the raspberry Administrator Administrator admin admin Admin Admin administrator administrator Usernames and passwords that I sometimes use (this was a longshot i know, but i was running out of ideas and energy). :) Epand filesystem, activating i2c, spi, 1-wire I can start the gateway and start the runtime. I cant install the edgearm64, arm64 runtime package eventhough I guess i should, i get code [ERROR] Error output: dpkg: error processing archive /tmp/codesysedge_edgearm64_4.8.0.0_arm64.deb (--install): [ERROR] Error output: package architecture (arm64) does not match system (armhf) [ERROR] Error output: Errors were encountered while processing: [ERROR] Error output: /tmp/codesysedge_edgearm64_4.8.0.0_arm64.deb code as a respons. I have tried to Reset Origin Device - no change. I have tried to remove the /etc/CODESYSControl_User.cfg [CmpUserMgr] but i could not find it and i was not sure if i should add it instead but i did not want to mess somthing up. I have tried to create a second gateway with the specific ip if the pi, that did not help. Could it be that i“m currently connected to the pi through WIFI? I can ping the pi and I can connect and control it through VNC. When i scan to select gateway target (scan edge gateway) i find 17-21 devices but can find the pi throug the mac adress. I started of trying to use the "CODESYS Control for Raspberry Pi SL" (I have a license sience earlier) as i read somewhere that this could be used on a Pi4 as well but now i“m trying with the MC SL, no changes, same problem. Right now - gateway version 4.8.0.0 (edgearmHF, armhf), Runtime Package 4.5.0.0 (raspberry, armhf). Any sugestions are very welcome! As mentioned above, theese are some of the things that i have tried/done - but i have been going at this for a while. Best, Martin
Last updated: 2023-09-10

Post by patrik on Wish: CODESYSControl.cfg - again CODESYS Forge talk (Post)
Really good post. I hope that it gets seen by CoDeSys staff. I often find the documentation lacking when it comes to using CoDeSys in more complex ways. If using standard "basic PLC functionality", then it's fine and functions are documented in a sufficient way. Once you go outside of that bubble then I find the documentation not enough. CODESYSControl.cfg is a good example of this. And why isn't more of this integrated in the IDE. like changing port of the webserver. Why is it hidden in this file and not accessible through the IDE. It feels like a layer of complexity purposely left in so you don't change it if you don't know what you are doing. Like the argument is if you have the know-how to find the file you have the know-how to edit it. I find the documentation lacking when it comes to more complex libraries too. Like the element collections library. there is parameters I still don't quite know what they do. I can't find any documentation about them. There is an example project to download from CoDeSys so you can see how you are supposed to set your factories up. I leave some parameters like it is in the example. Should I? I don't know. Does it work. Yes. But I could perhaps create memory leaks if I get something wrong and I don't see that until way later. In the create method of your element factory you have a function called __vfinit and you just have to accept that it works. Why can't I get insight in what it does through documentation? Don't CoDeSys want us to know how these work so we can't use them to accidentally break something? I find the error logging lacking too. I've had the CoDeSys service crash but it doesn't say why. I've seen windows noticing the crash but no error code was sent or error message. Also in my current issue where the application fails to start after power outage. I can see in the log that it fails to load retain in the application as one log entry and application failing to start as another. But why? Why does loading the retain fail? give me more information! Is it just a skill issue with me? I don't know. If it is then I'd still want CoDeSys to step up their game when it comes to documentation. I'm sorry if a lot of frustration comes though in this post. I really like the product and what I can do with it compared to other PLC brands.
Last updated: 2024-11-21

Post by mariusz997 on Visualisation - internal error CODESYS Forge talk (Post)
Hi everyone. I try to reach Codesys but I have problem on the beginning. I use Codesys 3.5.18.60 and 3.5.18.30 . On both version I have this same problem - when I create new standard project with controller Control Win v3 x64, empty PLC program - I compile it and everything is ok. But when I add visualisation without any elements and compile it - I get: ~~~ ------ Build started: Application: Device.Application ------- Typify code... Generate code... Generate global initializations... [WARNING] SortingStation: HMI Device: PLC Logic: Application: Missing element configuration. Element may not be usable. [WARNING] SortingStation: fbOutletConveyour Device: PLC Logic: Application: C0196: Implicit conversion from unsigned Type 'WORD' to signed Type 'INT' : Possible change of sign [ERROR] Internal error:System.NullReferenceException: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu (in english: Object reference not set to an instance of an object.). w _3S.CoDeSys.Codex86_64.V351500.CPUx86_64.CodeStore(TypeClass tc, Register RegBase, Register RegIndex, Int32 nOffset, Register RegSrc, Int32 nScale) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.GenerateVarAbsolut(IVariableExpression varexp, Int32 iArea, Int32 nAddress, IIndexInfo indexinfo, ICompiledType ctype, Int32 nTypeSize, IAccessMode am) w ..(_IVariableExpression ) w ..(IExprement ) w ..(IExprement ) w ..(_ICompoAccessExpression ) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(IAssignmentExpression assign) w ..(_IAssignmentExpression ) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(IExpressionStatement expstat) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ISequenceStatement seq) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ISequenceStatement seq) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ISequenceStatement seq) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ISequenceStatement seq) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ISequenceStatement seq) w ..(IExprement ) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ICompiledPOU cpou, ISequenceStatement mainRoutine, Boolean bKeepCompileInformation, IEnumerable`1 subroutines) w _3S.CoDeSys.Codex86_64.V351500.Codex86_64_V351500.Generate(ICompiledPOU cpou, Boolean bKeepCompileInformation) w ..(_ICompiledPOU ) w _3S.CoDeSys.Compiler35180.Phase5_Codegeneration.Codegeneration.(_ICompiledPOU , _ISignature ) w ..(_ICompiledPOU , Boolean , Boolean , _ICompileContext , _ICompileContext , Boolean , Codegeneration , Boolean& , Boolean , Boolean ) w ..(Boolean , Boolean , _ICompileContext , _ICompileContext , InitExitSignatureInfo , Boolean , Codegeneration , _ISignature , Boolean& , Boolean , Boolean ) w _3S.CoDeSys.Compiler35180.CompilerPhases.CompilerPhase5_Codegenerator.(Codegeneration , _ISignature , InitExitSignatureInfo& , Boolean& ) w _3S.CoDeSys.Compiler35180.CompilerPhases.CompilerPhase5_Codegenerator.(Codegeneration , _ISignature ) w _3S.CoDeSys.Compiler35180.CompilerPhases.CompilerPhase5_Codegenerator.(ICodegenerator ) w ..() w ..() Build complete -- 1 errors, 2 warnings : No download possible ~~~ Could someone help me with this problem? Thank you in advance Mariusz
Last updated: 2025-11-11

Post by drbuzz on Communication Error (#0) for IFM controller CODESYS Forge talk (Post)
Hi Folks, Every time I use an IFM controller I always seem to run into a problem connecting to it. I get the Communications Error (#0). So I thought I would share some tips and tricks. Once the CANfox Cable (EC2112) cable driver is installed, you can use the yellow app in the sys tray to blink the lights on the cable. Confirm the cable works in the IFM maintenance software by connecting to the controller and reading the information on it. Make sure to download an OS into the controller (the light will go from a fast blink to solid green). In Codesys V2.3, the communication settings for the CR0401 is 250kBaud by default and Node ID 127. What got me, was I needed to reboot the computer after the cable driver install. Also if your application has canbus settings in it which are changed from default, after the controller is power cycled, the new Node ID and Baud will be in effect. I made a handy guide because too much time has been wasted on this. Programming IFM CR0401 Serial/Can Programming Cable • Connect IFM EC2112 CanFox programming cable with connector adapter. • Make sure cable is linked to VM (if using VM). • Install drivers for cable if not installed. o Download from IFM EC2112 site. https://www.ifm.com/ca/en/product/EC2112 • Once Installed, reboot computer. • In system tray, there should be a yellow icon that you can open and check on programming cable. Select the cable in the list and flash the lights to confirm it is working. Maintenance Software • Install IFM Maintenance Tool Software. o Download from IFM Site. https://www.ifm.com/ca/en/download/eco100_MaintenanceTool • Open IFM Maintenance software • Select Basic System • Select CAN cable • It will tell you if you don’t have a cable connected. • Use Wizard if needed. • Read Channel Parameter on the Settings page, or get Identity in the System Information > Identity. • Default Node is 127 on a new unit. Baud is 250kBaud (bits/sec) • Controller information should populate. • Controller green light should be blinking at 5hz (meaning OK but no OS, just bootloader). • Click Software > Load. • Open the OS file. Should match Codesys version selection (for CR0401 this is version 3). o Download OS file from IFM Website. https://www.ifm.com/ca/en/product/CR0401 o It is located at the top of the download under ā€œsoftware for CR0401ā€. o Select the file and load it… this will take a minute. • Once completed the unit should now have a solid green light o Solid green means the controller has an OS but no application is running. Codesys V2.3 Application • Codesys needs to be downloaded and installed from the IFM website as it has the IFM libraries and license to use the software. o Download from the IFM CR0401 page. o https://www.ifm.com/ca/en/product/CR0401 • Create new application with the correct IFM controller or Open Codesys application. • Keep in mind that the PLC Configuration on the Resources tab can be changed for the CAN communication interface… so changes to node and baud will take effect after the first download and reboot of the controller. • Go to ā€œOnlineā€ in the top menu and change ā€œCommunication Parametersā€ o The Local dropdown shows the last configuration used. All other interfaces will show below it and need to be updated when changed or used. o Confirm Node ID is 127 for the first download. ļ‚§ The NodeID will change to whatever the program has after (in my case 125). ļ‚§ Node Send Offset should be default at 1536 ļ‚§ Node Recv Offset should be default at 1408 ļ‚§ Can bus Baudrate should be 250 kbaud. ļ‚§ Yes to Motorola Byte Order ļ‚§ Block Transfer should be false and note used (60 is default setting). ļ‚§ Can Card Driver should match the systray item which is Sie_USB. • If the system populated the other one, just update and relay the communication parameters. The software will usually bring up the available cable and driver. • Go to ā€œOnlineā€ and Login to download. o Press Yes to Download Application. I hope this helps!
Last updated: 2025-03-21

Post by cfam on Codesys Control for PLCnext (PLC - AXL F 2152) CODESYS Forge talk (Post)
Good day All I would like to share some information on this site for the Codesys team as well for the future members using Codesys Control for PLCnext if it is allowed. I hope that i Post it in the correct spot. Subject: Codesys, Codesys Control for PLCnext Objective: Using the following Phoenix components to built a PLC Rack and run it on Codesys: Hardware and Software used 1. 2404267, AXC F 2152 - Controller 2. 1088136, AXL F BP SE6 - Module carrier 3. 1088129, AXL SE DO16/1 - Digital module 4. 1337224, AXL SE PD16 GND - Potential distributors 5. 1088127, AXL SE DI16/1 - Digital module 6. 1337223, AXL SE PD16 24V - Potential distributors 7. 1088123, AXL SE AO4 I 4-20 - Analog module 8. 1088134, AXL SE SC-A - Cover 9. Codesys v3.5 SP19 Patch 4 10. Codesys Control for PLCnext V4.10.0.0 Process: Firstly I built the Rack according to the Phoenix Project+ Software tool. Where I rebuilt it onto my test bench . I used the PLCnext Engineer IDE from Phoenix and all Communications where up and running and my PLC program executed successfully. THEN I tried the same PLC Layout with Codesys and Codesys Control for PLCnext. It was not successful and gave me the "Error: Local Bus not Running". I searched the web for answers but was unsuccessful in finding a solution. So I tried to change my configuration and found that the following Modules COULD NOT be recognized by Codesys Control. The result was that the Local Bus Failed to run. 1337224, AXL SE PD16 GND - Potential distributors 1337223, AXL SE PD16 24V - Potential distributors Example 1, Resulted in "Error: Local Bus Not Running": Module carrier slot 1: 1088129, AXL SE DO16/1 - Digital module Module carrier slot 2: 1337224, AXL SE PD16 GND - Potential distributors Module carrier slot 3: 1088127, AXL SE DI16/1 - Digital module Module carrier slot 4: 1337223, AXL SE PD16 24V - Potential distributors Module carrier slot 5: 1088123, AXL SE AO4 I 4-20 - Analog module Module carrier slot 6: 1088134, AXL SE SC-A - Cover Example 2, Result "Successful": Module carrier slot 1: 1088129, AXL SE DO16/1 - Digital module Module carrier slot 2: 1088127, AXL SE DI16/1 - Digital module Module carrier slot 3: 1088123, AXL SE AO4 I 4-20 - Analog module Module carrier slot 4: 1088134, AXL SE SC-A - Cover Module carrier slot 5: 1088134, AXL SE SC-A - Cover Module carrier slot 6: 1088134, AXL SE SC-A - Cover Result: Codesys or Codesys Control for PLCnext, has a PROBLEM to identify the following Modules. 1. AXL SE PD16 24V - Potential distributors 2. AXL SE PD16 GND - Potential distributors Hope that this information could be useful in future. Best regards Jaco Pretorius
Last updated: 2023-12-06

Post by mondinmr on COL.IMap2 and HashTableFactory cause frequent Access Violation CODESYS Forge talk (Post)
Good morning, I’ve been using the Collection library for a long time, mostly with Stack, LinkedList, and List. From your examples I was able to manage the different factories, even for custom elements. Now I need a hashtable, but with this object I’m running into a lot of random access violations. If I append something inside FB_Init after constructing the hashtable, it crashes, even though the list was already created. If I only create the hashtable in FB_Init and append afterwards, it usually works. I don’t understand the meaning of the dispose call in this code: pSlave := ADR(slave); uSlave := TO_ULINT(pSlave); iKey := fKey.Create(uSlave); IF hash.CountKeys() = 0 THEN Service.logger.appendLog('Filling hashtable', 'HashManager', AdvLogType.AdvDebugMsg); ok := FALSE; ELSE eError := hash.ContainsKey(iKey, xResult => ok); END_IF IF NOT ok THEN pI := __NEW(UINT); iVal := fKey.Create(TO_ULINT(pI)); Service.logger.appendLog(CONCAT('New slave', TO_STRING(uSlave)), 'HashManager', AdvLogType.AdvDebugMsg); hash.AddKeyValuePair(iKey, iVal); appendNewSlave := pI; ELSE eError := hash.GetElementByKey(iKey, itfValue => iElem); xResult := __QUERYINTERFACE(iKey, itfIInstance); IF xResult THEN itfIInstance.Dispose(); END_IF IF eError <> COL.COLLECTION_ERROR.NO_ERROR THEN Service.logger.appendLog(CONCAT('ERROR ', TO_STRING(eError)), 'HashManager', AdvLogType.AdvCriticalMsg); appendNewSlave := nullptr; RETURN; END_IF __QUERYINTERFACE(iElem, iVal); {warning disable C0033} pI := TO___UXINT(iVal.UlintValue); {warning restore C0033} appendNewSlave := pI; END_IF Without the dispose call, every second cold reset crashes immediately when I try to access iVal, even if eError doesn’t report any error. With the dispose call, the cold reset issue disappears, but I get other problems: a) If I start the runtime using systemctl start codesyscontrol, it crashes at IF hash.CountKeys() = 0 THEN b) If I delete the files in PlcLogic and download again, it works and survives multiple cold resets. But as soon as I run systemctl restart codesyscontrol, everything gets corrupted again and it starts crashing at that point. FUNCTION_BLOCK SlaveMapCounter VAR hash : COL.IMap2; eError : COL.COLLECTION_ERROR; END_VAR In its FB_Init I create it: METHOD FB_Init: BOOL VAR_INPUT bInitRetains: BOOL; // TRUE: retain variables are initialized (reset warm / reset cold) bInCopyCode: BOOL; // TRUE: the instance will be copied to the copy code afterward (online change) END_VAR VAR hF : COL.HashTableFactory; END_VAR hash := hF.Create(256); In another FB I instantiate it statically: FUNCTION_BLOCK ABSTRACT AbstractServoEthercatController EXTENDS AbstractServoController VAR_STAT hashSlaves : SlaveMapCounter; END_VAR VAR field : REFERENCE TO ADVAbstractFieldUnitEthercatCia402; initCnt : REFERENCE TO UINT; END_VAR The append method is the one shown above, and I call it after the runtime has started. The accesses are performed by a single task, and in any case I’m working on an isolated single core. I’ve tried everything, moving the create, the instances, and all the rest several times, but nothing seems to work. I’d like to point out that these FBs are part of our own library, which is used in many applications.
Last updated: 2025-09-11

Post by kevinrn on Github Actions CI/CD tasks - development topic CODESYS Forge talk (Post)
Hello community, I just want to inform you about our plans and the current status of automating the build process for CODESYS libraries. So it might be helpful for some people who are in the same situation. Background story: I am a software engineer at powerIO GmbH, normally I use high level languages for the products we develop and offer. Sometimes I work with my team on CODESYS libraries, which can also be found in the CODESYS store. Most of the time I spend with them on architecture tasks and tasks that are not directly related to our products. Every time I see the manual processes for releasing a library etc., I am very surprised about this time intensive process. Current situation: I know there has been a scripting interface for years. CODESYS Git was released a few years ago, but the scripting interface was only released a few months (weeks?) ago. We developed a pseudo-automated solution a few months ago, but it was all very hacky. So now there is a better Git implementation and also more modularization and installation options. For example, the CODESYS installer has a full CLI, which makes it very convenient to install CODESYS installations headless. Plans: I think it's the right time to develop a better automation solution. Most of our software projects are hosted on Github and we use Github actions very intensively for other software projects. Therefore, we have decided to use Github for our CODESYS library projects as well. Following tasks should be implemented in automation for CI/CD tasks: - Automated setup of CODESYS installation (Already released: https://github.com/marketplace/actions/setup-codesys-installation) - Checkout CODESYS libraries - Execute tests scripts - Sign CODESYS libraries - Extract Library documentation - Create CODESYS package - Sign CODESYS package Side Note: - This is mainly a side project, and we do not provide support for the CI/CD part. - This topic is here to help and also to get help from other software engineers. - This project and idea is not prioritized as I am currently the only one working on it and I hope it will help us and also others and increase productivity. - We are putting this out there as an organization, but priorities can change quickly and the CI/CD tasks I am developing are mostly done in my spare time. So please don't expect this to happen in a short time or even be fully completed. I would be very happy if some ppl will join the development process and might be open to discuss some technical details for this. I hope this topic is not to off-topic, but I think the CI/CD part is very important today and it can increase a lot of quality and push productivity. Thanks :)
Last updated: 2024-03-28

Post by svenkaro on Codesyscontrol.service stoppt nach 30s CODESYS Forge talk (Post)
Hallo nano, anbei das Logfile ;********* ;<loggername>codesyscontrol.log</loggername> ;<logoptions> ; <enable>1</enable> ; <type>normal</type> ; <timestamp>rtc high resolution</timestamp> ; <deactivatable>0</deactivatable> ; <dump>always</dump> ; <filter>0x0000000f<filter> ; <maxentries>100000</maxentries> ; <maxfiles>1</maxfiles> ; <maxfilesize>1000000</maxfilesize> ;</filter></filter></logoptions> ;<entries> ;Timestamp, CmpId, ClassId, ErrorId, InfoId, InfoText ;ClassId: LOG_INFO =1 ;ClassId: LOG_WARNING =2 ;ClassId: LOG_ERROR =4 ;ClassId: LOG_EXCEPTION =8 ;ClassId: LOG_DEBUG =16 ;ClassId: LOG_PRINTF =32 ;ClassId: LOG_COM =64 ;</entries> ;********* 2024-06-20T06:07:12.085Z, 0x0000013d, 16, 0, 0, OpenCpusetCpusEffective: using core(s) "0-3" from /sys/fs/cgroup/cpuset.cpus.effective 2024-06-20T06:07:12.085Z, 0x00000109, 16, 0, 0, SysModuleLoad: libCmpBACnet.so: 0x92ae530 2024-06-20T06:07:12.085Z, 0x00000109, 16, 0, 0, SysModuleLoad: libCmpBACnet2.so: 0x92af008 2024-06-20T06:07:12.085Z, 0x00000109, 16, 0, 0, SysModuleLoad: libCmpPLCHandler.so: 0x92afb08 2024-06-20T06:07:12.085Z, 0x00000109, 16, 0, 0, SysModuleLoad: libCmpGwClient.so: 0x92affe8 2024-06-20T06:07:12.085Z, 0x00000109, 16, 0, 0, SysModuleLoad: libCmpXMLParser.so: 0x92b04c0 2024-06-20T06:07:12.085Z, 0x00000109, 16, 0, 0, SysModuleLoad: libCmpGwClientCommDrvTcp.so: 0x92b09a0 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <logoptions> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <benable>1</benable> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <type>normal</type> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <timestamp>rtc high resolution</timestamp> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <disableable>0</disableable> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <filter>0x0000000f</filter> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <maxentries>100000</maxentries> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <maxfiles>1</maxfiles> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, <maxfilesize>1000000</maxfilesize> 2024-06-20T06:07:12.086Z, 0x00000013, 1, 0, 0, </logoptions> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>CM</cmp>, <id>0x00000001</id> <ver>3.5.19.61</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>CmpMemPool</cmp>, <id>0x0000001e</id> <ver>3.5.19.60</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>CmpLog</cmp>, <id>0x00000013</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>CmpSettings</cmp>, <id>0x0000001a</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysFile</cmp>, <id>0x00000104</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>CmpMemGC</cmp>, <id>0x0000001f</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysCom</cmp>, <id>0x00000100</id> <ver>3.5.19.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysCpuHandling</cmp>, <id>0x00000101</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysCpuMultiCore</cmp>, <id>0x0000013d</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysCrypto</cmp>, <id>0x00000141</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysDir</cmp>, <id>0x0000011b</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysEthernet</cmp>, <id>0x0000011c</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysEvent</cmp>, <id>0x00000102</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysExcept</cmp>, <id>0x00000103</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysInternalLib</cmp>, <id>0x00000107</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysMem</cmp>, <id>0x00000108</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysModule</cmp>, <id>0x00000109</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysMsgQ</cmp>, <id>0x0000010a</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysMutex</cmp>, <id>0x0000013a</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysOut</cmp>, <id>0x0000010b</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysProcess</cmp>, <id>0x0000010e</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysSem</cmp>, <id>0x0000010f</id> <ver>3.5.19.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysSemCount</cmp>, <id>0x00000139</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysSemProcess</cmp>, <id>0x00000119</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysShm</cmp>, <id>0x00000110</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysSocket</cmp>, <id>0x00000111</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysTarget</cmp>, <id>0x00000112</id> <ver>3.5.19.61</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysTask</cmp>, <id>0x00000114</id> <ver>3.5.19.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysTime</cmp>, <id>0x00000115</id> <ver>3.5.19.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysTimeRtc</cmp>, <id>0x00000127</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, System: <cmp>SysTimer</cmp>, <id>0x00000116</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpAlarmManager</cmp>, <id>0x0000007c</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpApp</cmp>, <id>0x00000002</id> <ver>3.5.19.60</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpAppBP</cmp>, <id>0x00000073</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpAppForce</cmp>, <id>0x00000074</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpAsyncMgr</cmp>, <id>0x0000005f</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpAuditLog</cmp>, <id>0x000000a1</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpBinTagUtil</cmp>, <id>0x00000004</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpBinTagUtilIec</cmp>, <id>0x0000005c</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpBitmapPool</cmp>, <id>0x00000050</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpBlkDrvTcp</cmp>, <id>0x00000030</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpBlkDrvUdp</cmp>, <id>0x00000007</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAAAsyncMan</cmp>, <id>0x00004007</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAABehaviourModel</cmp>, <id>0x00004015</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAACallback</cmp>, <id>0x00004001</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAACanL2</cmp>, <id>0x00004004</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAADTUtil</cmp>, <id>0x00004013</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAAFile</cmp>, <id>0x00004008</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAAMemBlockMan</cmp>, <id>0x00004003</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAANetBaseServices</cmp>, <id>0x00004018</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAARealTimeClock</cmp>, <id>0x00004014</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAASdoClient</cmp>, <id>0x00004011</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAASdoServer</cmp>, <id>0x00004017</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAASegBufferMan</cmp>, <id>0x00004019</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAASerialCom</cmp>, <id>0x00004012</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAAStorage</cmp>, <id>0x0000007e</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAATick</cmp>, <id>0x00004009</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAATickUtil</cmp>, <id>0x00004010</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAATimer</cmp>, <id>0x00004016</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCAATypes</cmp>, <id>0x00004006</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpChannelClient</cmp>, <id>0x00000008</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpChannelClientIec</cmp>, <id>0x0000005d</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpChannelMgr</cmp>, <id>0x00000009</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpChannelServer</cmp>, <id>0x0000000a</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCharDevice</cmp>, <id>0x00000300</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpChecksum</cmp>, <id>0x0000000b</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCodeMeter</cmp>, <id>0x0000007a</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCommunicationLib</cmp>, <id>0x0000000c</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCoreDump</cmp>, <id>0x00000083</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpCryptMD5</cmp>, <id>0x0000006a</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpDevice</cmp>, <id>0x0000000e</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpDynamicText</cmp>, <id>0x00000051</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpEL6751CanDrv</cmp>, <id>0x00005f0b</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpEventMgr</cmp>, <id>0x0000005b</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpEventMgrUnixBackend</cmp>, <id>0x000000a4</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpFileTransfer</cmp>, <id>0x0000005e</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpIecStringUtils</cmp>, <id>0x0000007f</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpIecTask</cmp>, <id>0x00000011</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpIecVarAccess</cmp>, <id>0x00000060</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpIoDrvIec</cmp>, <id>0x0000005a</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpIoMgr</cmp>, <id>0x00000012</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpKnxStack</cmp>, <id>0x0000004d</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpLinuxInterrupt</cmp>, <id>0x000000a2</id> <ver>3.5.17.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpLinuxRTDiag</cmp>, <id>0x000000a7</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpMonitor2</cmp>, <id>0x00000032</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpNameServiceClient</cmp>, <id>0x00000015</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpNameServiceClientIec</cmp>, <id>0x0000011d</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpNameServiceServer</cmp>, <id>0x00000016</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpOPCUAClient</cmp>, <id>0x00000096</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpOPCUAProviderIecVarAccess</cmp>, <id>0x00000126</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpOPCUAServer</cmp>, <id>0x00000124</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpOPCUAStack</cmp>, <id>0x0000008d</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpOpenSSL</cmp>, <id>0x00000033</id> <ver>3.5.19.61</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpPlcShellLinux</cmp>, <id>0x00000128</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpPlcShellLinuxBackend</cmp>, <id>0x000000a5</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpRasPi</cmp>, <id>0x00000089</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpRedundancy</cmp>, <id>0x00000129</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpRedundancyConnectionIP</cmp>, <id>0x0000ff03</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpRetain</cmp>, <id>0x00000017</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpRouter</cmp>, <id>0x00000018</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpRunStopSwitch</cmp>, <id>0x000000a6</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSchedule</cmp>, <id>0x00000019</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSecureChannel</cmp>, <id>0x00000090</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSecurityManager</cmp>, <id>0x0000008e</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSessionInformation</cmp>, <id>0x00000097</id> <ver>3.5.19.20</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSocketCanDrv</cmp>, <id>0x00005f0d</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSocketUnix</cmp>, <id>0x000000a3</id> <ver>4.11.0.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpSrv</cmp>, <id>0x0000001c</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpTraceMgr</cmp>, <id>0x00000070</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpUserDBFile</cmp>, <id>0x00000098</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpUserGroupsDBFile</cmp>, <id>0x00000099</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpUserMgr</cmp>, <id>0x00000061</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpUserObjectsDBFile</cmp>, <id>0x0000009c</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpVisuHandler</cmp>, <id>0x00000054</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpVisuServer</cmp>, <id>0x00000057</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpWebServer</cmp>, <id>0x00000071</id> <ver>3.5.19.30</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, <cmp>CmpWebServerHandlerV3</cmp>, <id>0x00000072</id> <ver>3.5.19.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, Dynamic: <cmp>CmpBACnet</cmp>, <id>0x00000400</id> <ver>3.5.19.50</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, Dynamic: <cmp>CmpBACnet2</cmp>, <id>0x00000401</id> <ver>3.5.19.10</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, Dynamic: <cmp>CmpPLCHandler</cmp>, <id>0x0000002a</id> <ver>3.5.19.61</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, Dynamic: <cmp>CmpGwClient</cmp>, <id>0x00000021</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, Dynamic: <cmp>CmpXMLParser</cmp>, <id>0x00000058</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.086Z, 0x00000001, 1, 0, 10, Dynamic: <cmp>CmpGwClientCommDrvTcp</cmp>, <id>0x00000022</id> <ver>3.5.19.0</ver> 2024-06-20T06:07:12.125Z, 0x0000013d, 1, 0, 4, MultiCore support: [activated], all cores are used 2024-06-20T06:07:12.125Z, 0x0000013d, 1, 0, 4, Number of available cores: 4 2024-06-20T06:07:12.134Z, 0x00000401, 2, 0, 0, !!!! Warning: component CmpBACnet loaded already 2024-06-20T06:07:12.184Z, 0x00000007, 1, 0, 6, Network interface: <ipaddress>10.94.25.39</ipaddress>, subnetmask <subnetmask>255.255.255.0</subnetmask> 2024-06-20T06:07:12.184Z, 0x00000018, 1, 0, 4, Network interface <interface>ether 2</interface> at router <instance>0</instance> registered 2024-06-20T06:07:12.185Z, 0x00000009, 1, 0, 2, Running as network server 2024-06-20T06:07:12.185Z, 0x00000009, 1, 0, 1, Running as network client 2024-06-20T06:07:12.186Z, 0x0000000a, 1, 0, 0, <numofchannels>4</numofchannels> channels available, each of the size <buffersize>100000</buffersize> Bytes 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, CmpBACnet 1024 BACstack information 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, version = 15.0.1.1 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, __BYTE_ORDER = 1234 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, TARGET_IEEE_FP_FORMAT = 1 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, TARGET_FP_BIG_ENDIAN = 0 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, TARGET_DP_BIG_ENDIAN = 0 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, TARGET_INTEGRAL_BIG_ENDIAN = 0 2024-06-20T06:07:12.254Z, 0x00000400, 1, 0, 0, TARGET_USED_ALIGNMENT = 4 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, CmpBACnet2 1025 BACstack information 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, version = 25.1.5.1 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, __BYTE_ORDER = 1234 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, TARGET_IEEE_FP_FORMAT = 1 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, TARGET_FP_BIG_ENDIAN = 0 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, TARGET_DP_BIG_ENDIAN = 0 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, TARGET_INTEGRAL_BIG_ENDIAN = 0 2024-06-20T06:07:12.254Z, 0x00000401, 1, 0, 0, TARGET_MCU_USED_ALIGNMENT = 4 2024-06-20T06:07:12.261Z, 0x00000129, 1, 0, 0, Debug Messages not activated 2024-06-20T06:07:12.262Z, 0x0000ff03, 1, 0, 0, Read connection settings... 2024-06-20T06:07:12.266Z, 0x00000030, 1, 0, 6, Local network address: <ipaddress>10.94.25.39</ipaddress> 2024-06-20T06:07:12.266Z, 0x00000018, 1, 0, 4, Network interface <interface>BlkDrvTcp</interface> at router <instance>1</instance> registered 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, No certificate for the OPC UA server available. 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, Security policy allows plain text communication. Secure communication is deactivated. 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, ********** 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, OPC UA Server Started: 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, Hostname: raspberrypi, Port: 4840 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, URL: opc.tcp://raspberrypi:4840 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, Loopbackadapter activated. 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, All available networkadapters are used. 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, Multithreading activated. 3 workers used. 2024-06-20T06:07:12.272Z, 0x00000124, 1, 0, 0, ************ 2024-06-20T06:07:12.286Z, 0x00000124, 1, 0, 0, Provider 'CODESYS_DefaultProvider' (version 0x305131e) registered at the OPC UA server. 2024-06-20T06:07:12.287Z, 0x000000a6, 1, 0, 0, Not able to read file of Run/Stop switch. Functionality of component disabled 2024-06-20T06:07:12.306Z, 0x00000001, 1, 0, 0, ========================================================================= 2024-06-20T06:07:12.306Z, 0x00000001, 1, 0, 4, CODESYS Control for Raspberry Pi MC SL 2024-06-20T06:07:12.306Z, 0x00000001, 1, 0, 4, OS=Linux, CPU=ARM, Arch=32Bit, Coding=C 2024-06-20T06:07:12.306Z, 0x00000001, 1, 0, 6, <version>3.5.19.61</version> <builddate>Feb 22 2024</builddate> 2024-06-20T06:07:12.306Z, 0x00000001, 1, 0, 5, Copyright CODESYS Development GmbH 2024-06-20T06:07:12.306Z, 0x00000001, 1, 0, 0, ========================================================================= 2024-06-20T06:07:12.308Z, 0x00000124, 1, 0, 0, Provider 'AddressSpaceFragment Provider' (version 0x3051332) registered at the OPC UA server. 2024-06-20T06:07:12.309Z, 0x00000124, 1, 0, 0, Provider 'OPC UA for IEC-61131-3' (version 0x3051332) registered at the OPC UA server. 2024-06-20T06:07:12.309Z, 0x00000124, 1, 0, 0, Provider 'AlarmManager' (version 0x3051332) registered at the OPC UA server. 2024-06-20T06:07:12.321Z, 0x00000018, 1, 0, 1, Setting router <instance>0</instance> address to (0027) 2024-06-20T06:07:12.321Z, 0x00000018, 1, 0, 1, Setting router <instance>1</instance> address to (2ddc:0a5e:1927) 2024-06-20T06:07:12.332Z, 0x00000001, 1, 0, 34, CODESYS Control ready 2024-06-20T06:07:12.333Z, 0x00000001, 2, 0, 0, !!!! Warning: no runtime license - running in demo mode(~2 hours) WƤre der Zeitraum nicht nur 30s kƶnnte ich das beenden auf Grund der letzten Zeile nachvollziehen. Hoffe Du hast eine Idee, vielen Dank.
Last updated: 2024-06-20

Post by ihatemaryfisher on Sorting array of any-sized structure CODESYS Forge talk (Post)
In my machine's operation, I need to display multiples tables containing arrays of structured variables. The arrays change during operation, and my supervisor has advised me to write a new bubble-sort for each array. I think I can make a function to sort an array of any data type. This was my own project, and I'm a relatively new coder. I want to know the weaknesses in my approach, and a better method, if one exists. As far as I can test, the function accepts an array of a structured variable of any size, and sort it by any VAR in that structure. But it relies heavily on pointers, which I've heard are bad practice? Function call: // SORT BY BYTE-SIZED VAR IF xDoIt[6] THEN FUNBubbleSortSansBuffer( IN_pbySourcePointer := ADR(astArray[1]), // address of first byte in first element of array IN_pbyComparePointer:= ADR(astArray[1].byCompByte), // points to first byte of the comparing variable (variable you sort by) IN_uiStructureSize := SIZEOF(TYPE_STRUCTURE), // size, in bytes, of the structured variable IN_uiCompareSize := SIZEOF(astArray[1].byCompByte), // size, in bytes, of the comparing variable (variable you sort by) diArrayElements := UPPER_BOUND(astArray,1), // number of elements in array IN_xSmallToLarge := xSortOrder // whether to sort by small2large or large2small ); END_IF Function: FUNCTION FUNBubbleSortSansBuffer : BOOL VAR_INPUT IN_pbySourcePointer : POINTER TO BYTE; // points to beginning of array (first byte of first element) IN_pbyComparePointer: POINTER TO BYTE; // points to first byte of the comparing variable (variable you sort by) IN_uiStructureSize : UINT; // size, in bytes, of the structured variable IN_uiCompareSize : UINT; // size, in bytes, of the comparing variable (variable you sort by) diArrayElements : DINT; // number of elements in array IN_xSmallToLarge : BOOL; // whether to sort by small2large or large2small END_VAR VAR j : DINT; // repeat iteration over array until array ends i : DINT; // iterarte over array, swapping when necesary k : DINT; // iterator from 1 to size of structure (stepping 'through' a single element in array) dwSize : DWORD; // internal var for use in MEMUtils.MemCpy(<size>) // FOR SORTING BY BYTE VAR pbySourcePointer : POINTER TO BYTE; pbySourcePointer2 : POINTER TO BYTE; pbyComparePointer : POINTER TO BYTE; pbyComparePointer2 : POINTER TO BYTE; pbyPointerToBuffer : POINTER TO BYTE; // pointer to single byte buffer byBufferByte : BYTE; // single byte buffer END_VAR dwSize := UINT_TO_DWORD(IN_uiStructureSize); // get structure size (number of bytes) pbyPointerToBuffer := ADR(byBufferByte); // assign pointer to address of buffer byte (because MEMUtils.MemCpy requires a pointer input) CASE IN_uiCompareSize OF // depending on the size of the VAR to sort by (current functionality for BYTE and WORD/INT 1: // BYTE (8 BIT) FOR j := 1 TO diArrayElements DO // for number of elements in array FOR i := 1 TO (diArrayElements-1) DO // same thing, but row[i+1] row is included in swap logic pbySourcePointer := IN_pbySourcePointer + dwSize*(i-1); // point at #1 byte in array element[i] pbySourcePointer2 := pbySourcePointer + dwSize; // point at #1 byte in array element[i+1] // NOTE: because of memory locations, each array element is offset from one another by a number of bytes equal to the size of the structure // We can "walk" from array[i] to array[i+1] via steps equal to the size of the structure // e.g., ADR(array[i+1]) == ADR(array[i]) + SIZEOF([array datatype]) pbyComparePointer := IN_pbyComparePointer + dwSize*(i-1); // point to sorting variable in array element[i] pbyComparePointer2 := pbyComparePointer + dwSize; // point to sorting variable in array element[i+1] // using sort order (small -> large/large -> small) IF SEL(IN_xSmallToLarge, (pbyComparePointer2^ > pbyComparePointer^),(pbyComparePointer2^ < pbyComparePointer^)) THEN // This is where it gets tricky. We've identified pointers for the starting bytes of aArray[i] and aArray[i+1] // and we know the size of aArray[i]. We are going to swap individual bytes, one at a time, from aArray[i] and aArray[i+1] // this allows us to use only a single byte var as a buffer or temporary data storage // e.g., consider a structure consisting of a word, a byte, and a string. it is stored like this // |------WORD-------| |--BYTE-| |STRING------...| // astArray[1] == 1000 0100 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 0001 0010 0100 1000 0011 1100 0101 0101.... etc // performing a single swap (copy into a buffer, etc.) of the first byte of each array element creates this // astArray[1] == 0001 0100 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 1000 0010 0100 1000 0011 1100 0101 0101.... etc // incrementing the pointer adresses for the swap by 1 and swapping again swaps the next byte in each array element // astArray[1] == 0001 0010 0010 0001 1100 0011 1010 1010.... etc // astArray[2] == 1000 0100 0100 1000 0011 1100 0101 0101.... etc // continuing this from k to SIZEOF(TYPE_STRUCTURE) results in a toally swapped row FOR k := 1 TO IN_uiStructureSize DO // copy single byte[k] of array element 1 to buffer MEMUtils.MemCpy(pbyDest := (pbyPointerToBuffer), pbySrc := (pbySourcePointer+k-1), dwSize := 1); // copy single byte[k] of array element 2 to 1 MEMUtils.MemCpy(pbyDest := pbySourcePointer+k-1, pbySrc := (pbySourcePointer2+k-1), dwSize := 1); // copy buffer to byte[k] array element 2 MEMUtils.MemCpy(pbyDest := (pbySourcePointer2+k-1), pbySrc := pbyPointerToBuffer, dwSize := 1); END_FOR END_IF END_FOR END_FOR
Last updated: 2023-08-17

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 kamalsingh on Temu Coupon Code [acu577459 & acq615756] first time customers CODESYS Forge talk (Post)
Are you looking to save big while shopping online? With the Temu coupon code $100 off, you can unlock amazing discounts on a wide range of products. The acu577459 & acq615756 Temu coupon code is designed to provide maximum benefits for shoppers in the USA, acu577459 & acq615756, and European nations. Whether youre a new user or a returning customer, this code has something special for everyone. Dont miss out on incredible savings with the Temu coupon $100 off and the Temu 100 off coupon code. Its your chance to enjoy quality products at unbeatable prices! What Is The Coupon Code For Temu $100 Off? Both new and existing customers can enjoy fantastic benefits when they use our $100 off Temu coupon on the Temu app and website. Heres what you can expect with the acu577459 & acq615756 code: Flat $100 Off: Enjoy a straightforward discount on your purchases, making high-quality products more affordable. $100 Coupon Pack for Multiple Uses: This code allows you to use the discount multiple times, ensuring ongoing savings. $100 Flat Discount for New Customers: New users can take advantage of this generous offer to kickstart their shopping experience. Extra $100 Promo Code for Existing Customers: Loyal users can also benefit, making it a win-win for everyone. $100 Coupon for USA/acu577459 & acq615756 Users: Tailored specifically for users in these regions, maximizing your savings potential. Temu Coupon Code $100 Off For New Users In 2024 New users have the highest potential to save when they apply our coupon code on the Temu app. With the Temu coupon $100 off and Temu coupon code $100 off, new customers can unlock fantastic offers. Using the acu577459 & acq615756 code, heres what new users can enjoy: Flat $100 Discount for New Users: Instantly save big on your first purchase with a generous discount. $100 Coupon Bundle for New Customers: This bundle allows for multiple uses, maximizing your initial savings. Up to $100 Coupon Bundle for Multiple Uses: Enjoy the flexibility of using your discount multiple times for various purchases. Free Shipping to 68 Countries: New users can take advantage of shipping benefits that expand their shopping reach. Extra 30% Off on Any Purchase for First-Time Users: Get additional savings on your first order to make shopping even more rewarding. How To Redeem The Temu Coupon $100 Off For New Customers? To use the Temu $100 coupon and the Temu $100 off coupon code for new users, follow these simple steps: Download the Temu App: Get the app from your preferred app store or visit the Temu website. Create Your Account: Sign up as a new user and enter your details. Browse Products: Shop for items you love and add them to your cart. Apply the Coupon Code: In the checkout section, enter the acu577459 & acq615756 code in the designated field. Complete Your Purchase: Enjoy your savings and wait for your products to arrive! Temu Coupon $100 Off For Existing Customers Existing users can also reap substantial rewards by using our coupon code on the Temu app. The Temu $100 coupon codes for existing users and Temu coupon $100 off for existing customers free shipping ensure that loyalty pays off. Heres how acu577459 & acq615756 benefits existing users: $100 Extra Discount for Existing Temu Users: Enjoy an additional discount that makes your shopping experience even better. $100 Coupon Bundle for Multiple Purchases: This allows you to apply the discount across various orders, enhancing savings. Free Gift with Express Shipping All Over the USA/acu577459 & acq615756: As a reward for loyalty, enjoy a free gift and speedy shipping. Extra 30% Off on Top of the Existing Discount: Stack savings to maximize your benefits on each purchase. Free Shipping to 68 Countries: Maintain global accessibility with this fantastic shipping option. How To Use The Temu Coupon Code $100 Off For Existing Customers? Using the Temu coupon code $100 off and the Temu coupon $100 off code is simple for existing customers: Log into Your Account: Access your Temu account using your credentials. Select Products: Choose your desired items and add them to your cart. Proceed to Checkout: Go to your cart and review your selections. Enter the Coupon Code: Apply the acu577459 & acq615756 code in the coupon field at checkout. Finalize Your Order: Confirm your purchase and enjoy your savings! Latest Temu Coupon $100 Off First Order If youre placing your first order, using our coupon code can lead to exceptional benefits. With the Temu coupon code $100 off first order, the Temu coupon code first order, and Temu coupon code $100 off first time user, youll be well-equipped to save. Heres what you can enjoy with acu577459 & acq615756: Flat $100 Discount for the First Order: Your first purchase can be significantly cheaper with this incredible offer. $100 Temu Coupon Code for the First Order: This exclusive code is specifically for new customers, enhancing their initial shopping experience. Up to $100 Coupon for Multiple Uses: Utilize your coupon across various first-time purchases to maximize savings. Free Shipping to 68 Countries: Enjoy seamless international shipping on your initial order. Extra 30% Off on Any Purchase for the First Order: Take advantage of additional discounts to make your first purchase truly rewarding. How To Find The Temu Coupon Code $100 Off? To discover the latest Temu coupon $100 off and Temu coupon $100 off Reddit, follow these helpful tips: You can sign up for the Temu newsletter to receive verified and tested coupons straight to your inbox. Additionally, visit Temus social media pages for real-time updates on the latest coupons and promotions. For further savings, trusted coupon sites can also guide you to the most recent and effective Temu coupon codes. Happy hunting! Is Temu $100 Off Coupon Legit? Wondering if the Temu $100 Off Coupon Legit or if the Temu 100 off coupon legit? Rest assured, our Temu coupon code acu577459 & acq615756 is absolutely legit. Customers can safely use our code to enjoy a $100 discount on their first order, as well as on recurring purchases. Our code is regularly tested and verified, ensuring you a hassle-free shopping experience. Moreover, our Temu coupon code is valid worldwide and does not have an expiration date, allowing you to use it whenever you like! How Does Temu $100 Off Coupon Work? The Temu coupon code $100 off first-time user and Temu coupon codes 100 off provide an instant discount on your purchases. When you apply the acu577459 & acq615756 code during checkout, the discount is deducted from your total amount. Simply enter the code in the designated field, and the savings will be reflected in your cart. This straightforward process makes shopping more enjoyable while keeping your budget in check. How To Earn Temu $100 Coupons As A New Customer? You can earn the Temu coupon code $100 off and the 100 off Temu coupon code through various promotions available for new customers. By signing up on the Temu app or website, youll unlock exclusive discounts tailored just for you. Keep an eye on special promotions and bonuses offered by Temu to enhance your shopping experience. Take advantage of these opportunities to maximize your savings! What Are The Advantages Of Using The Temu Coupon $100 Off? The Temu coupon code 100 off and Temu coupon code $100 off come with numerous advantages: $100 discount on the first order $100 coupon bundle for multiple uses 70% discount on popular items Extra 30% off for existing Temu customers Up to 90% off on selected items Free gift for new users Free delivery to 68 countries Temu $100 Discount Code And Free Gift For New And Existing Customers Using our Temu $100 off coupon code and $100 off Temu coupon code provides multiple benefits for shoppers. With acu577459 & acq615756, heres what you can enjoy: $100 Discount for the First Order: A significant reduction on your initial purchase. Extra 30% Off on Any Item: Additional savings to maximize your budget. Free Gift for New Temu Users: Enjoy surprises as you start your shopping journey. Up to 70% Discount on Any Item on the Temu App: Access to incredible deals on popular products. Free Gift with Free Shipping in 68 Countries Including the USA and UK: A great way to enjoy international shopping without extra costs. Pros And Cons Of Using The Temu Coupon Code $100 Off This Month Here are the Temu coupon $100 off code and Temu 100 off coupon pros and cons: Pros: Significant savings on your first purchase. Available for both new and existing customers. Free shipping options to multiple countries. Regularly updated and verified coupon codes. Additional discounts for loyal customers. Cons: Limited-time promotions may affect availability. Users may need to sign up for newsletters to access some deals. Terms And Conditions Of Using The Temu Coupon $100 Off In 2024 The Temu coupon code $100 off free shipping and latest Temu coupon code $100 off come with specific terms and conditions: No expiration date for the coupon code. Valid for both new and existing users across 68 countries worldwide. No minimum purchase requirement to utilize the acu577459 & acq615756 code. Users can apply the coupon multiple times on eligible purchases. Offers subject to change based on promotions. Final Note: Use The Latest Temu Coupon Code $100 Off In conclusion, the Temu coupon code $100 off is a golden opportunity for anyone looking to save while shopping online. Whether youre a new or existing customer, the savings are just a code away! Dont miss out on the incredible offers available with the Temu coupon $100 off start shopping today! FAQs Of Temu $100 Off Coupon 1. How do I use the Temu $100 off coupon? To use the coupon, enter the code acu577459 & acq615756 at checkout to receive your discount. Is the Temu $100 coupon valid for existing customers? Yes, existing customers can use the acu577459 & acq615756 code to enjoy exclusive discounts. Does the Temu coupon code expire? No, the acu577459 & acq615756 coupon code does not have an expiration date and can be used anytime. Can I use the coupon in multiple countries? Yes, the acu577459 & acq615756 coupon is valid in 68 countries, including the USA and acu577459 & acq615756. Are there any minimum purchase requirements? No, you can use the acu577459 & acq615756 coupon without any minimum purchase requirement.
Last updated: 2024-10-26

Post by kamalsingh on $100 Off Temu Coupon Code [acu577459 & acq615756] CODESYS Forge talk (Post)
Are you looking to save big while shopping online? With the Temu coupon code $100 off, you can unlock amazing discounts on a wide range of products. The acu577459 & acq615756 Temu coupon code is designed to provide maximum benefits for shoppers in the USA, acu577459 & acq615756, and European nations. Whether youre a new user or a returning customer, this code has something special for everyone. Dont miss out on incredible savings with the Temu coupon $100 off and the Temu 100 off coupon code. Its your chance to enjoy quality products at unbeatable prices! What Is The Coupon Code For Temu $100 Off? Both new and existing customers can enjoy fantastic benefits when they use our $100 off Temu coupon on the Temu app and website. Heres what you can expect with the acu577459 & acq615756 code: Flat $100 Off: Enjoy a straightforward discount on your purchases, making high-quality products more affordable. $100 Coupon Pack for Multiple Uses: This code allows you to use the discount multiple times, ensuring ongoing savings. $100 Flat Discount for New Customers: New users can take advantage of this generous offer to kickstart their shopping experience. Extra $100 Promo Code for Existing Customers: Loyal users can also benefit, making it a win-win for everyone. $100 Coupon for USA/acu577459 & acq615756 Users: Tailored specifically for users in these regions, maximizing your savings potential. Temu Coupon Code $100 Off For New Users In 2024 New users have the highest potential to save when they apply our coupon code on the Temu app. With the Temu coupon $100 off and Temu coupon code $100 off, new customers can unlock fantastic offers. Using the acu577459 & acq615756 code, heres what new users can enjoy: Flat $100 Discount for New Users: Instantly save big on your first purchase with a generous discount. $100 Coupon Bundle for New Customers: This bundle allows for multiple uses, maximizing your initial savings. Up to $100 Coupon Bundle for Multiple Uses: Enjoy the flexibility of using your discount multiple times for various purchases. Free Shipping to 68 Countries: New users can take advantage of shipping benefits that expand their shopping reach. Extra 30% Off on Any Purchase for First-Time Users: Get additional savings on your first order to make shopping even more rewarding. How To Redeem The Temu Coupon $100 Off For New Customers? To use the Temu $100 coupon and the Temu $100 off coupon code for new users, follow these simple steps: Download the Temu App: Get the app from your preferred app store or visit the Temu website. Create Your Account: Sign up as a new user and enter your details. Browse Products: Shop for items you love and add them to your cart. Apply the Coupon Code: In the checkout section, enter the acu577459 & acq615756 code in the designated field. Complete Your Purchase: Enjoy your savings and wait for your products to arrive! Temu Coupon $100 Off For Existing Customers Existing users can also reap substantial rewards by using our coupon code on the Temu app. The Temu $100 coupon codes for existing users and Temu coupon $100 off for existing customers free shipping ensure that loyalty pays off. Heres how acu577459 & acq615756 benefits existing users: $100 Extra Discount for Existing Temu Users: Enjoy an additional discount that makes your shopping experience even better. $100 Coupon Bundle for Multiple Purchases: This allows you to apply the discount across various orders, enhancing savings. Free Gift with Express Shipping All Over the USA/acu577459 & acq615756: As a reward for loyalty, enjoy a free gift and speedy shipping. Extra 30% Off on Top of the Existing Discount: Stack savings to maximize your benefits on each purchase. Free Shipping to 68 Countries: Maintain global accessibility with this fantastic shipping option. How To Use The Temu Coupon Code $100 Off For Existing Customers? Using the Temu coupon code $100 off and the Temu coupon $100 off code is simple for existing customers: Log into Your Account: Access your Temu account using your credentials. Select Products: Choose your desired items and add them to your cart. Proceed to Checkout: Go to your cart and review your selections. Enter the Coupon Code: Apply the acu577459 & acq615756 code in the coupon field at checkout. Finalize Your Order: Confirm your purchase and enjoy your savings! Latest Temu Coupon $100 Off First Order If youre placing your first order, using our coupon code can lead to exceptional benefits. With the Temu coupon code $100 off first order, the Temu coupon code first order, and Temu coupon code $100 off first time user, youll be well-equipped to save. Heres what you can enjoy with acu577459 & acq615756: Flat $100 Discount for the First Order: Your first purchase can be significantly cheaper with this incredible offer. $100 Temu Coupon Code for the First Order: This exclusive code is specifically for new customers, enhancing their initial shopping experience. Up to $100 Coupon for Multiple Uses: Utilize your coupon across various first-time purchases to maximize savings. Free Shipping to 68 Countries: Enjoy seamless international shipping on your initial order. Extra 30% Off on Any Purchase for the First Order: Take advantage of additional discounts to make your first purchase truly rewarding. How To Find The Temu Coupon Code $100 Off? To discover the latest Temu coupon $100 off and Temu coupon $100 off Reddit, follow these helpful tips: You can sign up for the Temu newsletter to receive verified and tested coupons straight to your inbox. Additionally, visit Temus social media pages for real-time updates on the latest coupons and promotions. For further savings, trusted coupon sites can also guide you to the most recent and effective Temu coupon codes. Happy hunting! Is Temu $100 Off Coupon Legit? Wondering if the Temu $100 Off Coupon Legit or if the Temu 100 off coupon legit? Rest assured, our Temu coupon code acu577459 & acq615756 is absolutely legit. Customers can safely use our code to enjoy a $100 discount on their first order, as well as on recurring purchases. Our code is regularly tested and verified, ensuring you a hassle-free shopping experience. Moreover, our Temu coupon code is valid worldwide and does not have an expiration date, allowing you to use it whenever you like! How Does Temu $100 Off Coupon Work? The Temu coupon code $100 off first-time user and Temu coupon codes 100 off provide an instant discount on your purchases. When you apply the acu577459 & acq615756 code during checkout, the discount is deducted from your total amount. Simply enter the code in the designated field, and the savings will be reflected in your cart. This straightforward process makes shopping more enjoyable while keeping your budget in check. How To Earn Temu $100 Coupons As A New Customer? You can earn the Temu coupon code $100 off and the 100 off Temu coupon code through various promotions available for new customers. By signing up on the Temu app or website, youll unlock exclusive discounts tailored just for you. Keep an eye on special promotions and bonuses offered by Temu to enhance your shopping experience. Take advantage of these opportunities to maximize your savings! What Are The Advantages Of Using The Temu Coupon $100 Off? The Temu coupon code 100 off and Temu coupon code $100 off come with numerous advantages: $100 discount on the first order $100 coupon bundle for multiple uses 70% discount on popular items Extra 30% off for existing Temu customers Up to 90% off on selected items Free gift for new users Free delivery to 68 countries Temu $100 Discount Code And Free Gift For New And Existing Customers Using our Temu $100 off coupon code and $100 off Temu coupon code provides multiple benefits for shoppers. With acu577459 & acq615756, heres what you can enjoy: $100 Discount for the First Order: A significant reduction on your initial purchase. Extra 30% Off on Any Item: Additional savings to maximize your budget. Free Gift for New Temu Users: Enjoy surprises as you start your shopping journey. Up to 70% Discount on Any Item on the Temu App: Access to incredible deals on popular products. Free Gift with Free Shipping in 68 Countries Including the USA and UK: A great way to enjoy international shopping without extra costs. Pros And Cons Of Using The Temu Coupon Code $100 Off This Month Here are the Temu coupon $100 off code and Temu 100 off coupon pros and cons: Pros: Significant savings on your first purchase. Available for both new and existing customers. Free shipping options to multiple countries. Regularly updated and verified coupon codes. Additional discounts for loyal customers. Cons: Limited-time promotions may affect availability. Users may need to sign up for newsletters to access some deals. Terms And Conditions Of Using The Temu Coupon $100 Off In 2024 The Temu coupon code $100 off free shipping and latest Temu coupon code $100 off come with specific terms and conditions: No expiration date for the coupon code. Valid for both new and existing users across 68 countries worldwide. No minimum purchase requirement to utilize the acu577459 & acq615756 code. Users can apply the coupon multiple times on eligible purchases. Offers subject to change based on promotions. Final Note: Use The Latest Temu Coupon Code $100 Off In conclusion, the Temu coupon code $100 off is a golden opportunity for anyone looking to save while shopping online. Whether youre a new or existing customer, the savings are just a code away! Dont miss out on the incredible offers available with the Temu coupon $100 off start shopping today! FAQs Of Temu $100 Off Coupon 1. How do I use the Temu $100 off coupon? To use the coupon, enter the code acu577459 & acq615756 at checkout to receive your discount. Is the Temu $100 coupon valid for existing customers? Yes, existing customers can use the acu577459 & acq615756 code to enjoy exclusive discounts. Does the Temu coupon code expire? No, the acu577459 & acq615756 coupon code does not have an expiration date and can be used anytime. Can I use the coupon in multiple countries? Yes, the acu577459 & acq615756 coupon is valid in 68 countries, including the USA and acu577459 & acq615756. Are there any minimum purchase requirements? No, you can use the acu577459 & acq615756 coupon without any minimum purchase requirement.
Last updated: 2024-10-26

<< < 1 .. 28 29 30 (Page 30 of 30)

Showing results of 739

Sort by relevance or date