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 ihatemaryfisher on Sorting array of any-sized structure
CODESYS Forge
talk
(Post)
With that I could make an array of varying size, but would still have to define the array type in the function's declaration VAR_IN_OUT stArray: array [*..*] of <pre-defined data type> END_VAR I wanted a function that could take an array of any type (e.g., a structured VAR) as an input. That way I could call it in multiple POUs to handle different arrays structures.
Last updated: 2023-08-18
Post by dasch on eCockpit - unable to start simulation
CODESYS Forge
talk
(Post)
This is a known bug in e!Cockpit. See Release notes of V 1.11: 1 e!Cockpit Release Version 1.11 (2022-07) ATTENTION: If a library that uses asynchronous tasks (e.g. WagoAppConfigTool, WagoAppCloud or function modules such as Dali-Master) is dragged into the project, the simulation cannot be started. It is already sufficient to add the library to the project (an FB does not even have to be instantiated). I guess you are using one of these libraries/modules in your project. We e.G. often use PWM modules, these are also affected.
Last updated: 2023-09-05
Post by ggarcia94 on IMAGE DISPLAY ACCORDING TO INPUT VARIABLE
CODESYS Forge
talk
(Post)
Reopening this thread as I need to make a few images visible depending on the value of a variable. However, in the properties of the image I do not have the option to make the image visible (see attached image). I´m using Codesys V3.5 SP19. However, when I use V3.5 SP17 I have the option to make the images visible. Can someone help me achieve this with V3.5 SP19? EDIT: Fixed. Just had to uncheck Support client animations in the Visualization manger settings
Last updated: 2023-09-12
Post by martinlithlith on Raspberry Pi: List of available drivers / libraries
CODESYS Forge
talk
(Post)
As most of the posts are moved here around 2015, what would be the right version of codesys to run? Would it be better to install a older version of codesys or should i keep on downgrading libraries? Is there any work done to update theses libraries? It´s been a few years since the last update in this post, are there new libraries/devices for raspberry being added/posted somewhere else? Thanks, Martin
Last updated: 2023-10-17
Post by simotion on Online view : code is scanned
CODESYS Forge
talk
(Post)
If I do online monitoring of code in f.i. a function block, I cannot see if the function block is called or not. In software from other vendors you normally have an indication if the online code you are looking on is scanned at that moment or not. Is there a way in Codesys to determine in the online view if (parts) of the code are scanned or not? Thanks
Last updated: 2023-10-23
Post by john-martin on Send file from codesys to...... ftp, cloud, etc
CODESYS Forge
talk
(Post)
Hi everybody, I am looking for a solution to send files, for example, to an ftp or a cloud. I can't use oscat library because 64 bit controller are not supported. Therefore, I see that the IIoT library has some functions that might help me to implement this sending process in codesys. Does anyone have any examples of how to do this? I have spent some days with this issue without success. Best regards.
Last updated: 2023-11-02
Post by ekristoffe on Beispieldateien finden / Inhalt der Packages
CODESYS Forge
talk
(Post)
Hello @eschwellinger, Why not using one of those 2 folders: C:\ProgramData\CODESYS C:\Users\Public\Documents\CODESYS The main reason is depending on the company and the user right, the end user may not have the access to use those folders. Also having a non version dependent folder may help if the end user uninstall a previous version and forgot all its sample project where in this previous version installation. Thanks.
Last updated: 2023-11-24
Post by macros8 on Alarm Management - Import and Export of AlarmGroup
CODESYS Forge
talk
(Post)
Hi, I struggle with exporting my Alarm Messages and following importing back to my project. Because filling in one by one is very time consuming I want to use export function and edit .csv file in Excel. As soon as I modify the file the import back to project does not work at all and function returns errors. Would you pls give me a hint how to properly use this functionality? Thanks a lot for help. Regards, M.
Last updated: 2023-12-02
Post by andre-luis on Check if Codesys runtime is on 'Running' or 'Stopped' state?
CODESYS Forge
talk
(Post)
Just to share, for those who as me are seeking for this and had found no information anywhere in this World: Every time I stop/start the PLC runtime ( turning into 'Stopped' or 'Running' state ) the 'CODESYSControlService' appears at the Taskmanager list, which could suggest a straight correlation. I was expecting a clever solution, but this one solves for while.
Last updated: 2024-07-02
Post by andre-luis on Check if Codesys runtime is on 'Running' or 'Stopped' state?
CODESYS Forge
talk
(Post)
It's already there, the service get started as default. I missed to say that sometimes it happens w/o even the system get restarted. Anyway, the main issue here is to know the state of the runtime. We collect a lot of informations about the whole system, and it would be nice to have a way to detect the runtime state.
Last updated: 2024-07-02
Post by installwhat on What is the solution for "Application stopped on recovery switch request"?
CODESYS Forge
talk
(Post)
<Entry severity="information" component="<10>" user="nobody" timestamp="2024-07-04 ?? 5:10:47" infoId="1">Axis#=121 , Error=30014 , Emergency 2 <Entry severity="information" component="<10>" user="nobody" timestamp="2024-07-04 ?? 5:10:23" infoId="1">TCP Server : WaitClient <Entry severity="information" component="<10>" user="nobody" timestamp="2024-07-04 ?? 5:10:23" infoId="1">TCP Server : Init What is "component="<10>"? Is this system a vanilla CODESYS RTE or is it a modified installation. I think more details are required.
Last updated: 2024-07-08
Post by konradkmiller on Variable assignments
CODESYS Forge
talk
(Post)
I have a snippet of code that I was given as a reference in ST. ** ModbusMasterRTU( xConnect:= TRUE, IPort:= IoConfigGlobals.COM1, // IoConfigGlobals.RS232485Interface, // COM1=Front Port / Serial module = Name of module in Devices structure I/O list udiBaudrate:= 19200, usiDataBits:= 8 , eParity:= WagoTypesCom.eTTYParity.None , eStopBits:= WagoTypesCom.eTTYStopBits.One , eHandshake:= WagoTypesCom.eTTYHandshake.None , ePhysical:= WagoTypesCom.eTTYPhysicalLayer.RS485HalfDuplex, xIsConnected=> xIsConnected , xError=> , oStatus=> , eFrameType:= WagoAppPlcModbus.eMbFrameType.RTU , tTimeOut:= T#1S, utQuery:= utQuery , xTrigger:= SEND, utResponse:= utResponse)** What is the meaning of => in this context?
Last updated: 2024-07-20
Post by installwhat on Initialization of POUs (FB_Init)
CODESYS Forge
talk
(Post)
Hi I was wondering if there's a pattern I can employ to acheive what you're doing but with a "reference to" and also allowing for online changes? Someone told me that the new beckhoff keeps references safe during online changes but all the documentation I've found suggests that's not the case. The easiest thing is to use fb_init for normal vars and pointers and references can be added in the function body every cycle and this allows for method calls after so far as I can tell.
Last updated: 2024-07-29
Post by kleeswi on Visualization scaling problem with B&R T30 panel
CODESYS Forge
talk
(Post)
I have found a work around. I have written a python scripts that runs on user login (entry in .bashrc) which overwrites the webvisu.htm and webvisu.cfg.json file with the configuration for the B&R T30 panel (resolution and disable scaling). First I tried to add this setting to the the CODESYSControl.cfg, but that does not work following the big CODESYS Control V3 Manual. [CmpTargetVisu] Application.WindowPositionX=0 Application.WindowPositionY=0 Application.WindowSizeWidth=800 Application.WindowSizeHeight=480
Last updated: 2024-07-30
Post by stuartjr on POU Private variables
CODESYS Forge
talk
(Post)
Pretty sure I know the answer, but thought I would ask just in case. Is there a way to set variables declared in a POU to private so that they can not be accessed from other POUs. I tried using the library pragma, but that just stops the variables being displayed in the selection tree. My compiler version is 2.3.9.62 if that's relevant, and I'm using an ABB AC500 V2 PLC. Cheers
Last updated: 2024-07-31
Post by micik on ERR_OK not recognized
CODESYS Forge
talk
(Post)
Hello, if I try to use ERR_Ok in my code to check whether the file is open correctly or not, I get an error "Identifier ERR_OK not recognized", I can use plain 0 (zero) instead. But in general, is this a proper way to check for success of file operation since the 4th parameter is a poinmter to RTS_IEC_RESULT, and normally I would expect this to be used somehow. _hFile := SysFileOpen(_sFileName, am:=SysFile.ACCESS_MODE.AM_WRITE, ADR(_result)); IF _result <> 0 THEN udDiag := 100; RETURN;
Last updated: 2024-08-17
Post by docker on Webvisu client connection monitoring
CODESYS Forge
talk
(Post)
Thanks for the reply, i am using codesys SP16 patch 5 as this is the version that is compatible with my IFM controller. i am accessing the lastusage variable from the VisuStructClientData structure through a pointer. when i log in it lists the time since last log in but does not continually count, it remains a static value which isnt useful. hopefully you can help. Thankyou
Last updated: 2024-08-26
Post by joep on overruling kinematic limits of [-90°, 90°] in bipod_rotary
CODESYS Forge
talk
(Post)
Hi All, for my robotics application we are building a 2-axis parallel scara using the kin_bipod_rotary kinematics. Codesys implemented limits of [-90°, 90°] according to the documentation: https://content.helpme-codesys.com/en/libs/SM3_Transformation/Current/SM3_Transformation/Function-Blocks/Positioning-Kinematics/Parallel-Systems/Kin_Bipod_Rotary.html Would it be possible to overrule these limits somehow, our mechanical limits are more in the range of [-110°, 135°] In this range we also don't encounter point where singularity is an issue. Hopeful someone knows a solution, Best regards, Joep
Last updated: 2024-09-04
Post by alex-at-xana on EThercat Dynamic configuration
CODESYS Forge
talk
(Post)
Hi Everyone, For a fast monitoring system I am using Ethercat oversampling and timestamping inputs. As the customers has a lot of different configurations out in the field, we went for a dynamic Ethercat configuration. Already got the whole detection chain working but now I am stuck since two days in debugging the configuration. Here are my quesitons: I extended the dynamic config example for the EL3632 16#0E303052: //EL3632 pSlave^.SetDCSettings(TRUE,TRUE,80,80,TRUE,4000,0,0); pSlave^.AddSyncManager(16#1000,128,16#26,TRUE,3); pSlave^.AddSyncManager(16#1080,128,16#22,TRUE,2); pSlave^.AddSyncManager(16#1100,0,16#4,TRUE,1); pSlave^.AddSyncManager(16#1110,214,16#20,TRUE,0); pSlave^.AddFMMU(0,214,0,7,16#1110,0,1,1); pSlave^.AddFMMU(0,1,0,0,16#80D,0,1,1); xKnown := TRUE; This leads to a PLL Error for these devices. I double and triple checked the configuraton, but cannot find the issue. There seems to be one difference: the config dialog creates a startup parameter: 16#10F3:16#05, Name: Command_0, Value:0. Bitlen: 16, Stop on fault: false, jumpt at fault: false: next line: 0 a) I do not find information on how to set this in my code. Can you help me there? b) Without trying to set the value, I get a PLL error for these devices in the master log. Is the config wrong? c) Do I need to set the Master to Autoconfigure or Manual? I used autoconfigure for my tests. The stack creates input data addresses for the slaves input data range (pSlaves[i].InputData) which are different from those created when I use the Engineering tools dialogs to configure Ethercat. Specifically, the addresses seem to be aligned at 16 byte boundaries when they are created using the engineering tool, but may appear at uneven addresses when I use the script in dynamic config. I did not try to access ULINT at uneven addresses yet, but I am suspecting this may be a problem. Do I need to manually align the addresses ? Any help is appreciated...
Last updated: 2024-09-10
Post by jinlee on Camera RTSP Feed
CODESYS Forge
talk
(Post)
Hi, I followed your guidance and used go2rtc. There is a link generated from go2rtc I can copy into the web browser element in the visualisation. It somehow only appear within the software when it is running, but not on the webvisu. I want to display the camera feed onto the webvisu. My camera is reolink 810a which supports IP protocol. My project is pretty simple, just a web browser element with assigned URL.
Last updated: 2024-09-17
Post by mani-i4point0 on Codesys (Ethernet IP Scanner ) and Python (Ethernet IP Adapter)
CODESYS Forge
talk
(Post)
Hi, I am currently developing the software to establish the communication and data transfer between Python Module as a Ethernet IP - Adapter coding is running my laptop and Codesys as a Ethernet IP scanner in the resperry PI hardware. I am trying to look for some available recourses online, Can anyone suggest me to develop this function in Codesys and Python ? Best Regards, Mani
Last updated: 2024-09-24
Post by andrebrandt on FB string and naming
CODESYS Forge
talk
(Post)
Hi all. I have a FB written in ST. FUNCTION_BLOCK NTC10k VAR_INPUT Syst:STRING; In:REAL; END_VAR VAR_OUTPUT Out:REAL; OTag:STRING; Out_St:Struct_NTC10K; END_VAR VAR Tag:STRING; InstanceName: STRING; Structure:Struct_NTC10K; END_VAR What i'm trying to do, is to pass data to structure. In structure i want to add a tag with systemnumber and sensorname. '320.001-RT401' In pou i use this RT401: NTC10k;, and tried this RT401: NTC10k(Tag:='RT401'); Anyone done this?
Last updated: 2024-09-26
Post by vstrom on Recipe definition, how to have the Name string in current language?
CODESYS Forge
talk
(Post)
I'd like to know if it is possible to have the "Name" field, in the recipe definition, language dependent. Something like to have the possibility to put there a string ID that will be add to the GlobalTextList. In this way it can be translated and when showed in a Visualization screen its value depend on the current language. Thanks.
Last updated: 2024-10-04
Post by athuum on Error 'Library not found' and 'Unkown type'
CODESYS Forge
talk
(Post)
Hello, I am getting the following error and warning when trying to download a project into a PLC: - Library CmpTargetVisu has not been added to the Library manager, or no valid license could be found - Unkown type: 'CmpEventMgr.EventParam' As far as I can see, both are included, and licensed, in the library manager (see image). What could the problem be, and how would I resolve this?
Last updated: 2024-10-08
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.